xref: /aosp_15_r20/external/executorch/exir/verification/dev_html.py (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker# Copyright (c) Meta Platforms, Inc. and affiliates.
2*523fa7a6SAndroid Build Coastguard Worker# All rights reserved.
3*523fa7a6SAndroid Build Coastguard Worker#
4*523fa7a6SAndroid Build Coastguard Worker# This source code is licensed under the BSD-style license found in the
5*523fa7a6SAndroid Build Coastguard Worker# LICENSE file in the root directory of this source tree.
6*523fa7a6SAndroid Build Coastguard Worker
7*523fa7a6SAndroid Build Coastguard Workerfrom xml.etree import ElementTree as ET
8*523fa7a6SAndroid Build Coastguard Worker
9*523fa7a6SAndroid Build Coastguard Workerfrom executorch.exir.verification.interpreter import Interpreter
10*523fa7a6SAndroid Build Coastguard Worker
11*523fa7a6SAndroid Build Coastguard Worker
12*523fa7a6SAndroid Build Coastguard Workerdef get_header(name):
13*523fa7a6SAndroid Build Coastguard Worker    h2 = ET.Element("h2")
14*523fa7a6SAndroid Build Coastguard Worker    span = ET.Element("span")
15*523fa7a6SAndroid Build Coastguard Worker    span.text = name
16*523fa7a6SAndroid Build Coastguard Worker    h2.append(span)
17*523fa7a6SAndroid Build Coastguard Worker
18*523fa7a6SAndroid Build Coastguard Worker    return h2
19*523fa7a6SAndroid Build Coastguard Worker
20*523fa7a6SAndroid Build Coastguard Worker
21*523fa7a6SAndroid Build Coastguard Workerdef iterable_to_html(s):
22*523fa7a6SAndroid Build Coastguard Worker    res = ET.Element("span")
23*523fa7a6SAndroid Build Coastguard Worker    val_node = ET.SubElement(res, "p")
24*523fa7a6SAndroid Build Coastguard Worker
25*523fa7a6SAndroid Build Coastguard Worker    for e in s:
26*523fa7a6SAndroid Build Coastguard Worker        br = ET.SubElement(val_node, "br")
27*523fa7a6SAndroid Build Coastguard Worker        br.text = str(e)
28*523fa7a6SAndroid Build Coastguard Worker    return res
29*523fa7a6SAndroid Build Coastguard Worker
30*523fa7a6SAndroid Build Coastguard Worker
31*523fa7a6SAndroid Build Coastguard Workerdef gen_html(program):
32*523fa7a6SAndroid Build Coastguard Worker    test = Interpreter(program)
33*523fa7a6SAndroid Build Coastguard Worker    prog_opset = set(test.get_operators_list())
34*523fa7a6SAndroid Build Coastguard Worker
35*523fa7a6SAndroid Build Coastguard Worker    prog_vals = test.get_constant_tensors()
36*523fa7a6SAndroid Build Coastguard Worker    html = ET.Element("html")
37*523fa7a6SAndroid Build Coastguard Worker
38*523fa7a6SAndroid Build Coastguard Worker    head = ET.Element("head")
39*523fa7a6SAndroid Build Coastguard Worker    html.append(head)
40*523fa7a6SAndroid Build Coastguard Worker
41*523fa7a6SAndroid Build Coastguard Worker    title = ET.Element("title")
42*523fa7a6SAndroid Build Coastguard Worker    head.append(title)
43*523fa7a6SAndroid Build Coastguard Worker    title.text = "Model"
44*523fa7a6SAndroid Build Coastguard Worker
45*523fa7a6SAndroid Build Coastguard Worker    body = ET.Element("body")
46*523fa7a6SAndroid Build Coastguard Worker    html.append(body)
47*523fa7a6SAndroid Build Coastguard Worker    div = ET.Element(
48*523fa7a6SAndroid Build Coastguard Worker        "div",
49*523fa7a6SAndroid Build Coastguard Worker        attrib={
50*523fa7a6SAndroid Build Coastguard Worker            "id": "main_content",
51*523fa7a6SAndroid Build Coastguard Worker            "style": "position: absolute; width: 99%; height: 100%; overflow: scroll;",
52*523fa7a6SAndroid Build Coastguard Worker        },
53*523fa7a6SAndroid Build Coastguard Worker    )
54*523fa7a6SAndroid Build Coastguard Worker    body.append(div)
55*523fa7a6SAndroid Build Coastguard Worker
56*523fa7a6SAndroid Build Coastguard Worker    # Header: Operator List
57*523fa7a6SAndroid Build Coastguard Worker    div.append(get_header("Operator List"))
58*523fa7a6SAndroid Build Coastguard Worker
59*523fa7a6SAndroid Build Coastguard Worker    # Burn in data
60*523fa7a6SAndroid Build Coastguard Worker    div.append(iterable_to_html(prog_opset))
61*523fa7a6SAndroid Build Coastguard Worker
62*523fa7a6SAndroid Build Coastguard Worker    # Header: Constant Tensor List
63*523fa7a6SAndroid Build Coastguard Worker    div.append(get_header("Constant Tensor List"))
64*523fa7a6SAndroid Build Coastguard Worker
65*523fa7a6SAndroid Build Coastguard Worker    # Burn in data
66*523fa7a6SAndroid Build Coastguard Worker    div.append(iterable_to_html(prog_vals))
67*523fa7a6SAndroid Build Coastguard Worker
68*523fa7a6SAndroid Build Coastguard Worker    return ET.tostring(html)
69