siliconcompiler 0.32.3__py3-none-any.whl → 0.33.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- siliconcompiler/__init__.py +19 -2
- siliconcompiler/_metadata.py +1 -1
- siliconcompiler/apps/sc.py +2 -2
- siliconcompiler/apps/sc_install.py +3 -3
- siliconcompiler/apps/sc_issue.py +1 -1
- siliconcompiler/apps/sc_remote.py +4 -4
- siliconcompiler/apps/sc_show.py +2 -2
- siliconcompiler/apps/utils/replay.py +5 -3
- siliconcompiler/asic.py +120 -0
- siliconcompiler/checklist.py +150 -0
- siliconcompiler/core.py +267 -289
- siliconcompiler/flowgraph.py +803 -515
- siliconcompiler/fpga.py +84 -0
- siliconcompiler/metric.py +420 -0
- siliconcompiler/optimizer/vizier.py +2 -3
- siliconcompiler/package/__init__.py +29 -6
- siliconcompiler/pdk.py +415 -0
- siliconcompiler/record.py +449 -0
- siliconcompiler/remote/client.py +6 -3
- siliconcompiler/remote/schema.py +116 -112
- siliconcompiler/remote/server.py +3 -5
- siliconcompiler/report/dashboard/cli/__init__.py +13 -722
- siliconcompiler/report/dashboard/cli/board.py +895 -0
- siliconcompiler/report/dashboard/web/__init__.py +10 -10
- siliconcompiler/report/dashboard/web/components/__init__.py +5 -4
- siliconcompiler/report/dashboard/web/components/flowgraph.py +3 -3
- siliconcompiler/report/dashboard/web/components/graph.py +6 -3
- siliconcompiler/report/dashboard/web/state.py +1 -1
- siliconcompiler/report/dashboard/web/utils/__init__.py +4 -3
- siliconcompiler/report/html_report.py +2 -3
- siliconcompiler/report/report.py +13 -7
- siliconcompiler/report/summary_image.py +1 -1
- siliconcompiler/report/summary_table.py +3 -3
- siliconcompiler/report/utils.py +11 -10
- siliconcompiler/scheduler/__init__.py +145 -280
- siliconcompiler/scheduler/run_node.py +2 -1
- siliconcompiler/scheduler/send_messages.py +4 -4
- siliconcompiler/scheduler/slurm.py +2 -2
- siliconcompiler/schema/__init__.py +19 -2
- siliconcompiler/schema/baseschema.py +493 -0
- siliconcompiler/schema/cmdlineschema.py +250 -0
- siliconcompiler/{sphinx_ext → schema/docs}/__init__.py +3 -1
- siliconcompiler/{sphinx_ext → schema/docs}/dynamicgen.py +63 -81
- siliconcompiler/{sphinx_ext → schema/docs}/schemagen.py +73 -85
- siliconcompiler/{sphinx_ext → schema/docs}/utils.py +12 -13
- siliconcompiler/schema/editableschema.py +136 -0
- siliconcompiler/schema/journalingschema.py +238 -0
- siliconcompiler/schema/namedschema.py +41 -0
- siliconcompiler/schema/packageschema.py +101 -0
- siliconcompiler/schema/parameter.py +791 -0
- siliconcompiler/schema/parametertype.py +323 -0
- siliconcompiler/schema/parametervalue.py +736 -0
- siliconcompiler/schema/safeschema.py +37 -0
- siliconcompiler/schema/schema_cfg.py +109 -1789
- siliconcompiler/schema/utils.py +5 -68
- siliconcompiler/schema_obj.py +119 -0
- siliconcompiler/tool.py +1308 -0
- siliconcompiler/tools/_common/__init__.py +6 -10
- siliconcompiler/tools/_common/sdc/sc_constraints.sdc +1 -1
- siliconcompiler/tools/bluespec/convert.py +7 -7
- siliconcompiler/tools/builtin/_common.py +1 -1
- siliconcompiler/tools/builtin/concatenate.py +2 -2
- siliconcompiler/tools/builtin/minimum.py +1 -1
- siliconcompiler/tools/builtin/mux.py +2 -1
- siliconcompiler/tools/builtin/nop.py +1 -1
- siliconcompiler/tools/builtin/verify.py +6 -4
- siliconcompiler/tools/chisel/convert.py +4 -4
- siliconcompiler/tools/genfasm/bitstream.py +3 -3
- siliconcompiler/tools/ghdl/convert.py +1 -1
- siliconcompiler/tools/icarus/compile.py +4 -4
- siliconcompiler/tools/icepack/bitstream.py +6 -1
- siliconcompiler/tools/klayout/convert_drc_db.py +5 -0
- siliconcompiler/tools/klayout/klayout_export.py +0 -1
- siliconcompiler/tools/klayout/klayout_utils.py +3 -10
- siliconcompiler/tools/nextpnr/apr.py +6 -1
- siliconcompiler/tools/nextpnr/nextpnr.py +4 -4
- siliconcompiler/tools/openroad/_apr.py +13 -0
- siliconcompiler/tools/openroad/rdlroute.py +3 -3
- siliconcompiler/tools/openroad/scripts/apr/postamble.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/apr/preamble.tcl +5 -5
- siliconcompiler/tools/openroad/scripts/apr/sc_antenna_repair.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_clock_tree_synthesis.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_detailed_placement.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_detailed_route.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_endcap_tapcell_insertion.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_fillercell_insertion.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_fillmetal_insertion.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_global_placement.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_global_route.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_init_floorplan.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_macro_placement.tcl +3 -3
- siliconcompiler/tools/openroad/scripts/apr/sc_metrics.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_pin_placement.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_power_grid.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_repair_design.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_repair_timing.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_write_data.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/common/procs.tcl +57 -1
- siliconcompiler/tools/openroad/scripts/common/screenshot.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/common/write_images.tcl +28 -3
- siliconcompiler/tools/openroad/scripts/sc_rcx.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/sc_rdlroute.tcl +3 -3
- siliconcompiler/tools/openroad/scripts/sc_show.tcl +6 -6
- siliconcompiler/tools/slang/__init__.py +10 -10
- siliconcompiler/tools/surelog/parse.py +4 -4
- siliconcompiler/tools/sv2v/convert.py +20 -3
- siliconcompiler/tools/verilator/compile.py +2 -2
- siliconcompiler/tools/verilator/verilator.py +3 -3
- siliconcompiler/tools/vpr/place.py +1 -1
- siliconcompiler/tools/vpr/route.py +4 -4
- siliconcompiler/tools/vpr/screenshot.py +1 -1
- siliconcompiler/tools/vpr/show.py +5 -5
- siliconcompiler/tools/vpr/vpr.py +24 -24
- siliconcompiler/tools/xdm/convert.py +2 -2
- siliconcompiler/tools/xyce/simulate.py +1 -1
- siliconcompiler/tools/yosys/sc_synth_asic.tcl +74 -68
- siliconcompiler/tools/yosys/syn_asic.py +2 -2
- siliconcompiler/toolscripts/_tools.json +7 -7
- siliconcompiler/toolscripts/ubuntu22/install-vpr.sh +0 -2
- siliconcompiler/toolscripts/ubuntu24/install-vpr.sh +0 -2
- siliconcompiler/utils/__init__.py +8 -112
- siliconcompiler/utils/flowgraph.py +339 -0
- siliconcompiler/{issue.py → utils/issue.py} +4 -3
- siliconcompiler/utils/logging.py +1 -2
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/METADATA +9 -8
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/RECORD +151 -134
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/WHEEL +1 -1
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/entry_points.txt +8 -8
- siliconcompiler/schema/schema_obj.py +0 -1936
- siliconcompiler/toolscripts/ubuntu20/install-vpr.sh +0 -29
- siliconcompiler/toolscripts/ubuntu20/install-yosys-parmys.sh +0 -61
- /siliconcompiler/{templates → data/templates}/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/email/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/email/general.j2 +0 -0
- /siliconcompiler/{templates → data/templates}/email/summary.j2 +0 -0
- /siliconcompiler/{templates → data/templates}/issue/README.txt +0 -0
- /siliconcompiler/{templates → data/templates}/issue/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/issue/run.sh +0 -0
- /siliconcompiler/{templates → data/templates}/replay/replay.py.j2 +0 -0
- /siliconcompiler/{templates → data/templates}/replay/replay.sh.j2 +0 -0
- /siliconcompiler/{templates → data/templates}/replay/requirements.txt +0 -0
- /siliconcompiler/{templates → data/templates}/replay/setup.sh +0 -0
- /siliconcompiler/{templates → data/templates}/report/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/report/bootstrap.min.css +0 -0
- /siliconcompiler/{templates → data/templates}/report/bootstrap.min.js +0 -0
- /siliconcompiler/{templates → data/templates}/report/bootstrap_LICENSE.md +0 -0
- /siliconcompiler/{templates → data/templates}/report/sc_report.j2 +0 -0
- /siliconcompiler/{templates → data/templates}/slurm/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/slurm/run.sh +0 -0
- /siliconcompiler/{templates → data/templates}/tcl/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/tcl/manifest.tcl.j2 +0 -0
- /siliconcompiler/{units.py → utils/units.py} +0 -0
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/licenses/LICENSE +0 -0
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/top_level.txt +0 -0
|
@@ -14,13 +14,6 @@ import socketserver
|
|
|
14
14
|
from siliconcompiler.report.dashboard import AbstractDashboard
|
|
15
15
|
from siliconcompiler.report.dashboard.web import utils
|
|
16
16
|
|
|
17
|
-
try:
|
|
18
|
-
from streamlit.web import bootstrap
|
|
19
|
-
from streamlit import config as _config
|
|
20
|
-
except ModuleNotFoundError:
|
|
21
|
-
bootstrap = None
|
|
22
|
-
_config = None
|
|
23
|
-
|
|
24
17
|
|
|
25
18
|
class WebDashboard(AbstractDashboard):
|
|
26
19
|
__port = 8501
|
|
@@ -31,11 +24,13 @@ class WebDashboard(AbstractDashboard):
|
|
|
31
24
|
pass
|
|
32
25
|
|
|
33
26
|
def __init__(self, chip, port=None, graph_chips=None):
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
27
|
+
try:
|
|
28
|
+
from streamlit.web import bootstrap # noqa: F401
|
|
29
|
+
except ModuleNotFoundError:
|
|
37
30
|
raise NotImplementedError('streamlit is not available')
|
|
38
31
|
|
|
32
|
+
super().__init__(chip)
|
|
33
|
+
|
|
39
34
|
if not port:
|
|
40
35
|
port = WebDashboard.get_next_port()
|
|
41
36
|
if not port:
|
|
@@ -59,6 +54,8 @@ class WebDashboard(AbstractDashboard):
|
|
|
59
54
|
("server.port", self.__port),
|
|
60
55
|
("client.toolbarMode", "viewer")
|
|
61
56
|
]
|
|
57
|
+
if "PYTEST_CURRENT_TEST" in os.environ:
|
|
58
|
+
self.__streamlit_args.append(("server.headless", True))
|
|
62
59
|
|
|
63
60
|
# pass in a json object called __graph_chips
|
|
64
61
|
# the key is the chip_name and value is the filepath
|
|
@@ -166,6 +163,9 @@ class WebDashboard(AbstractDashboard):
|
|
|
166
163
|
time.sleep(self.__sleep_time)
|
|
167
164
|
|
|
168
165
|
def _run_streamlit_bootstrap(self):
|
|
166
|
+
from streamlit.web import bootstrap
|
|
167
|
+
from streamlit import config as _config
|
|
168
|
+
|
|
169
169
|
for config, val in self.__streamlit_args:
|
|
170
170
|
_config.set_option(config, val)
|
|
171
171
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import base64
|
|
2
2
|
import json
|
|
3
3
|
import os
|
|
4
|
-
import pandas
|
|
5
4
|
|
|
6
5
|
import streamlit
|
|
7
6
|
from streamlit_agraph import agraph
|
|
@@ -302,7 +301,7 @@ def manifest_viewer(
|
|
|
302
301
|
if streamlit.checkbox(
|
|
303
302
|
'Raw manifest',
|
|
304
303
|
help='Click here to see the manifest before it was made more readable'):
|
|
305
|
-
manifest_to_show = chip.schema.
|
|
304
|
+
manifest_to_show = chip.schema.getdict()
|
|
306
305
|
else:
|
|
307
306
|
manifest_to_show = report.make_manifest(chip)
|
|
308
307
|
|
|
@@ -327,7 +326,7 @@ def manifest_viewer(
|
|
|
327
326
|
streamlit.download_button(
|
|
328
327
|
label='Download',
|
|
329
328
|
file_name='manifest.json',
|
|
330
|
-
data=json.dumps(chip.schema.
|
|
329
|
+
data=json.dumps(chip.schema.getdict(), indent=2),
|
|
331
330
|
mime="application/json",
|
|
332
331
|
use_container_width=True)
|
|
333
332
|
|
|
@@ -491,6 +490,8 @@ def node_file_tree_viewer(chip, step, index):
|
|
|
491
490
|
|
|
492
491
|
|
|
493
492
|
def node_viewer(chip, step, index, metric_dataframe, height=None):
|
|
493
|
+
from pandas import DataFrame
|
|
494
|
+
|
|
494
495
|
metrics_col, records_col, logs_and_reports_col = streamlit.columns(3, gap='small')
|
|
495
496
|
|
|
496
497
|
node_name = f'{step}{index}'
|
|
@@ -507,7 +508,7 @@ def node_viewer(chip, step, index, metric_dataframe, height=None):
|
|
|
507
508
|
nodes = {}
|
|
508
509
|
nodes[step + index] = report.get_flowgraph_nodes(chip, step, index)
|
|
509
510
|
streamlit.dataframe(
|
|
510
|
-
|
|
511
|
+
DataFrame.from_dict(nodes),
|
|
511
512
|
use_container_width=True,
|
|
512
513
|
height=height)
|
|
513
514
|
with logs_and_reports_col:
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
from siliconcompiler.report import report
|
|
2
|
-
from siliconcompiler.flowgraph import _get_flowgraph_exit_nodes, _get_flowgraph_entry_nodes
|
|
3
2
|
from siliconcompiler.tools._common import get_tool_task
|
|
4
3
|
from siliconcompiler import NodeStatus
|
|
5
4
|
|
|
@@ -45,8 +44,9 @@ def get_nodes_and_edges(chip):
|
|
|
45
44
|
node_dependencies = report.get_flowgraph_edges(chip)
|
|
46
45
|
successful_path = report.get_flowgraph_path(chip)
|
|
47
46
|
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
flow = chip.get('option', 'flow')
|
|
48
|
+
entry_exit_nodes = chip.schema.get("flowgraph", flow, field="schema").get_entry_nodes() + \
|
|
49
|
+
chip.schema.get("flowgraph", flow, field="schema").get_exit_nodes()
|
|
50
50
|
|
|
51
51
|
for step, index in node_dependencies:
|
|
52
52
|
# Build node
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import altair
|
|
2
2
|
import math
|
|
3
|
-
import pandas
|
|
4
3
|
import streamlit
|
|
5
4
|
|
|
6
5
|
from siliconcompiler.report import report
|
|
@@ -20,9 +19,11 @@ def job_selector():
|
|
|
20
19
|
Displays a dataframe that can be edited to select specific jobs to include
|
|
21
20
|
in the analysis.
|
|
22
21
|
"""
|
|
22
|
+
from pandas import DataFrame
|
|
23
|
+
|
|
23
24
|
jobs = state.get_chips()
|
|
24
25
|
|
|
25
|
-
all_jobs =
|
|
26
|
+
all_jobs = DataFrame({
|
|
26
27
|
'job names': jobs,
|
|
27
28
|
'selected jobs': [True] * len(jobs)
|
|
28
29
|
})
|
|
@@ -114,6 +115,8 @@ def settings(metrics, nodes, graph_number):
|
|
|
114
115
|
|
|
115
116
|
|
|
116
117
|
def graph(metrics, nodes, node_to_step_index_map, graph_number):
|
|
118
|
+
from pandas import DataFrame
|
|
119
|
+
|
|
117
120
|
metric, selected_nodes, log_scale, transpose, chart_type = \
|
|
118
121
|
settings(metrics, nodes, graph_number)
|
|
119
122
|
|
|
@@ -167,7 +170,7 @@ def graph(metrics, nodes, node_to_step_index_map, graph_number):
|
|
|
167
170
|
|
|
168
171
|
color = color_label
|
|
169
172
|
|
|
170
|
-
alt_chart = altair.Chart(
|
|
173
|
+
alt_chart = altair.Chart(DataFrame(filtered_data).dropna(), height=500)
|
|
171
174
|
|
|
172
175
|
if chart_type == 'line':
|
|
173
176
|
chart_mark = alt_chart.mark_line(point=True)
|
|
@@ -58,7 +58,7 @@ def update_manifest():
|
|
|
58
58
|
|
|
59
59
|
for history in chip.getkeys('history'):
|
|
60
60
|
history_chip = Chip(design='')
|
|
61
|
-
history_chip.schema
|
|
61
|
+
history_chip.schema = chip.schema.history(history).copy()
|
|
62
62
|
history_chip.set('design', chip.design)
|
|
63
63
|
add_chip(history, history_chip)
|
|
64
64
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
from siliconcompiler import NodeStatus
|
|
2
|
-
from siliconcompiler.flowgraph import _get_flowgraph_nodes
|
|
3
2
|
|
|
4
3
|
from pathlib import Path
|
|
5
4
|
|
|
@@ -25,7 +24,8 @@ def make_node_to_step_index_map(chip, metric_dataframe):
|
|
|
25
24
|
'''
|
|
26
25
|
node_to_step_index_map = {}
|
|
27
26
|
if chip.get('option', 'flow'):
|
|
28
|
-
for step, index in
|
|
27
|
+
for step, index in chip.schema.get("flowgraph", chip.get('option', 'flow'),
|
|
28
|
+
field="schema").get_nodes():
|
|
29
29
|
node_to_step_index_map[f'{step}{index}'] = (step, index)
|
|
30
30
|
|
|
31
31
|
# concatenate step and index
|
|
@@ -57,7 +57,8 @@ def make_metric_to_metric_unit_map(metric_dataframe):
|
|
|
57
57
|
def is_running(chip):
|
|
58
58
|
if not chip.get('option', 'flow'):
|
|
59
59
|
return False
|
|
60
|
-
for step, index in
|
|
60
|
+
for step, index in chip.schema.get("flowgraph", chip.get('option', 'flow'),
|
|
61
|
+
field="schema").get_nodes():
|
|
61
62
|
state = chip.get('record', 'status', step=step, index=index)
|
|
62
63
|
if not NodeStatus.is_done(state):
|
|
63
64
|
return True
|
|
@@ -21,8 +21,7 @@ def _generate_html_report(chip, flow, flowgraph_nodes, results_html):
|
|
|
21
21
|
del flowgraph_nodes[index]
|
|
22
22
|
|
|
23
23
|
schema = chip.schema.copy()
|
|
24
|
-
schema.
|
|
25
|
-
pruned_cfg = schema.cfg
|
|
24
|
+
pruned_cfg = schema.getdict()
|
|
26
25
|
if 'history' in pruned_cfg:
|
|
27
26
|
del pruned_cfg['history']
|
|
28
27
|
if 'library' in pruned_cfg:
|
|
@@ -51,7 +50,7 @@ def _generate_html_report(chip, flow, flowgraph_nodes, results_html):
|
|
|
51
50
|
metrics=metrics,
|
|
52
51
|
metrics_unit=metrics_unit,
|
|
53
52
|
reports=reports,
|
|
54
|
-
manifest=chip.schema.
|
|
53
|
+
manifest=chip.schema.getdict(),
|
|
55
54
|
pruned_cfg=pruned_cfg,
|
|
56
55
|
metric_keys=metrics_to_show,
|
|
57
56
|
img_data=img_data,
|
siliconcompiler/report/report.py
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import fnmatch
|
|
2
|
-
import pandas
|
|
3
2
|
import os
|
|
4
3
|
from siliconcompiler import Schema
|
|
5
|
-
from siliconcompiler.schema
|
|
4
|
+
from siliconcompiler.schema import PerNode
|
|
6
5
|
from siliconcompiler.report import utils
|
|
7
|
-
from siliconcompiler.flowgraph import nodes_to_execute
|
|
6
|
+
from siliconcompiler.utils.flowgraph import nodes_to_execute
|
|
8
7
|
from siliconcompiler.tools._common import get_tool_task
|
|
9
8
|
|
|
10
9
|
|
|
@@ -22,10 +21,12 @@ def make_metric_dataframe(chip):
|
|
|
22
21
|
>>> make_metric_dataframe(chip)
|
|
23
22
|
Returns pandas dataframe of tracked metrics.
|
|
24
23
|
'''
|
|
24
|
+
from pandas import DataFrame
|
|
25
|
+
|
|
25
26
|
nodes, errors, metrics, metrics_unit, metrics_to_show, reports = utils._collect_data(chip)
|
|
26
27
|
# converts from 2d dictionary to pandas DataFrame, transposes so
|
|
27
28
|
# orientation is correct, and filters based on the metrics we track
|
|
28
|
-
data = (
|
|
29
|
+
data = (DataFrame.from_dict(metrics, orient='index').transpose())
|
|
29
30
|
data = data.loc[metrics_to_show]
|
|
30
31
|
# include metrics_unit
|
|
31
32
|
data.index = data.index.map(lambda x: (x, metrics_unit[x]))
|
|
@@ -106,6 +107,11 @@ def make_manifest_helper(manifest_subsect, modified_manifest_subsect):
|
|
|
106
107
|
'default' nodes.
|
|
107
108
|
'''
|
|
108
109
|
|
|
110
|
+
def _is_leaf(cfg):
|
|
111
|
+
# 'shorthelp' chosen arbitrarily: any mandatory field with a consistent
|
|
112
|
+
# type would work.
|
|
113
|
+
return 'shorthelp' in cfg and isinstance(cfg['shorthelp'], str)
|
|
114
|
+
|
|
109
115
|
def build_leaf(manifest_subsect):
|
|
110
116
|
if PerNode(manifest_subsect['pernode']) == PerNode.NEVER:
|
|
111
117
|
if Schema.GLOBAL_KEY in manifest_subsect['node'] and \
|
|
@@ -132,7 +138,7 @@ def make_manifest_helper(manifest_subsect, modified_manifest_subsect):
|
|
|
132
138
|
node_values[step + index] = value
|
|
133
139
|
return node_values
|
|
134
140
|
|
|
135
|
-
if
|
|
141
|
+
if _is_leaf(manifest_subsect):
|
|
136
142
|
if PerNode(manifest_subsect['pernode']) == PerNode.NEVER:
|
|
137
143
|
if Schema.GLOBAL_KEY in manifest_subsect['node']:
|
|
138
144
|
value = manifest_subsect['node'][Schema.GLOBAL_KEY][Schema.GLOBAL_KEY]['value']
|
|
@@ -157,7 +163,7 @@ def make_manifest_helper(manifest_subsect, modified_manifest_subsect):
|
|
|
157
163
|
|
|
158
164
|
for key, key_dict in manifest_subsect.items():
|
|
159
165
|
if key != 'default':
|
|
160
|
-
if
|
|
166
|
+
if _is_leaf(key_dict):
|
|
161
167
|
modified_manifest_subsect[key] = build_leaf(key_dict)
|
|
162
168
|
else:
|
|
163
169
|
modified_manifest_subsect[key] = {}
|
|
@@ -175,7 +181,7 @@ def make_manifest(chip):
|
|
|
175
181
|
>>> make_manifest(chip)
|
|
176
182
|
Returns tree/json of manifest.
|
|
177
183
|
'''
|
|
178
|
-
manifest = chip.schema.
|
|
184
|
+
manifest = chip.schema.getdict()
|
|
179
185
|
modified_manifest = {}
|
|
180
186
|
make_manifest_helper(manifest, modified_manifest)
|
|
181
187
|
return modified_manifest
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import pandas
|
|
2
1
|
import shutil
|
|
3
2
|
|
|
4
3
|
from siliconcompiler.report.utils import _collect_data, _get_flowgraph_path
|
|
@@ -10,6 +9,7 @@ def _show_summary_table(chip, flow, flowgraph_nodes, show_all_indices):
|
|
|
10
9
|
'''
|
|
11
10
|
Prints the end of run summary table
|
|
12
11
|
'''
|
|
12
|
+
from pandas import DataFrame
|
|
13
13
|
|
|
14
14
|
# Display data
|
|
15
15
|
column_width = 15
|
|
@@ -85,7 +85,7 @@ def _show_summary_table(chip, flow, flowgraph_nodes, show_all_indices):
|
|
|
85
85
|
info_list.append(f"partname : {fpga_partname}")
|
|
86
86
|
|
|
87
87
|
libraries = set()
|
|
88
|
-
for val, step, index in chip.schema.
|
|
88
|
+
for val, step, index in chip.schema.get('asic', 'logiclib', field=None).getvalues():
|
|
89
89
|
if not step or (step, index) in flowgraph_nodes:
|
|
90
90
|
libraries.update(val)
|
|
91
91
|
if libraries:
|
|
@@ -96,7 +96,7 @@ def _show_summary_table(chip, flow, flowgraph_nodes, show_all_indices):
|
|
|
96
96
|
print("-" * max_line_width)
|
|
97
97
|
print(info, "\n")
|
|
98
98
|
|
|
99
|
-
df =
|
|
99
|
+
df = DataFrame(data, row_labels, column_labels)
|
|
100
100
|
if not df.empty:
|
|
101
101
|
print(df.to_string(line_width=max_line_width, col_space=2))
|
|
102
102
|
else:
|
siliconcompiler/report/utils.py
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
from siliconcompiler import NodeStatus
|
|
2
|
-
from siliconcompiler import units
|
|
3
|
-
from siliconcompiler.flowgraph import _get_flowgraph_execution_order,
|
|
2
|
+
from siliconcompiler.utils import units
|
|
3
|
+
from siliconcompiler.utils.flowgraph import _get_flowgraph_execution_order, \
|
|
4
4
|
nodes_to_execute
|
|
5
5
|
from siliconcompiler.tools._common import get_tool_task
|
|
6
6
|
|
|
7
|
+
from siliconcompiler.flowgraph import RuntimeFlowgraph
|
|
8
|
+
|
|
7
9
|
|
|
8
10
|
def _find_summary_image(chip, ext='png'):
|
|
9
11
|
for nodes in reversed(_get_flowgraph_execution_order(chip, chip.get('option', 'flow'))):
|
|
@@ -26,9 +28,7 @@ def _find_summary_metrics(chip, metrics_map):
|
|
|
26
28
|
|
|
27
29
|
data = chip.get('metric', metric, step=step, index=index)
|
|
28
30
|
if data is not None:
|
|
29
|
-
unit =
|
|
30
|
-
if chip.schema.has_field('metric', metric, 'unit'):
|
|
31
|
-
unit = chip.get('metric', metric, field='unit')
|
|
31
|
+
unit = chip.get('metric', metric, field='unit')
|
|
32
32
|
if formatter:
|
|
33
33
|
metrics[name] = formatter(data, unit)
|
|
34
34
|
else:
|
|
@@ -44,7 +44,7 @@ def _collect_data(chip, flow=None, flowgraph_nodes=None, format_as_string=True):
|
|
|
44
44
|
return [], {}, {}, {}, [], {}
|
|
45
45
|
|
|
46
46
|
if not flowgraph_nodes:
|
|
47
|
-
flowgraph_nodes = nodes_to_execute(chip)
|
|
47
|
+
flowgraph_nodes = list(nodes_to_execute(chip))
|
|
48
48
|
# only report tool based steps functions
|
|
49
49
|
for (step, index) in list(flowgraph_nodes):
|
|
50
50
|
tool, task = get_tool_task(chip, step, '0', flow=flow)
|
|
@@ -79,9 +79,7 @@ def _collect_data(chip, flow=None, flowgraph_nodes=None, format_as_string=True):
|
|
|
79
79
|
for metric in chip.getkeys('metric'):
|
|
80
80
|
|
|
81
81
|
# Get the unit associated with the metric
|
|
82
|
-
metric_unit =
|
|
83
|
-
if chip.schema.has_field('metric', metric, 'unit'):
|
|
84
|
-
metric_unit = chip.get('metric', metric, field='unit')
|
|
82
|
+
metric_unit = chip.get('metric', metric, field='unit')
|
|
85
83
|
metric_type = chip.get('metric', metric, field='type')
|
|
86
84
|
|
|
87
85
|
show_metric = False
|
|
@@ -143,7 +141,10 @@ def _get_flowgraph_path(chip, flow, nodes_to_execute, only_include_successful=Fa
|
|
|
143
141
|
to_search = []
|
|
144
142
|
# Start search with any successful leaf nodes.
|
|
145
143
|
flowgraph_steps = list(map(lambda node: node[0], nodes_to_execute))
|
|
146
|
-
|
|
144
|
+
runtime = RuntimeFlowgraph(chip.schema.get("flowgraph", flow, field='schema'),
|
|
145
|
+
from_steps=flowgraph_steps,
|
|
146
|
+
to_steps=flowgraph_steps)
|
|
147
|
+
end_nodes = runtime.get_exit_nodes()
|
|
147
148
|
for node in end_nodes:
|
|
148
149
|
if only_include_successful:
|
|
149
150
|
if NodeStatus.is_success(chip.get('record', 'status', step=node[0], index=node[1])):
|