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.
Files changed (154) hide show
  1. siliconcompiler/__init__.py +19 -2
  2. siliconcompiler/_metadata.py +1 -1
  3. siliconcompiler/apps/sc.py +2 -2
  4. siliconcompiler/apps/sc_install.py +3 -3
  5. siliconcompiler/apps/sc_issue.py +1 -1
  6. siliconcompiler/apps/sc_remote.py +4 -4
  7. siliconcompiler/apps/sc_show.py +2 -2
  8. siliconcompiler/apps/utils/replay.py +5 -3
  9. siliconcompiler/asic.py +120 -0
  10. siliconcompiler/checklist.py +150 -0
  11. siliconcompiler/core.py +267 -289
  12. siliconcompiler/flowgraph.py +803 -515
  13. siliconcompiler/fpga.py +84 -0
  14. siliconcompiler/metric.py +420 -0
  15. siliconcompiler/optimizer/vizier.py +2 -3
  16. siliconcompiler/package/__init__.py +29 -6
  17. siliconcompiler/pdk.py +415 -0
  18. siliconcompiler/record.py +449 -0
  19. siliconcompiler/remote/client.py +6 -3
  20. siliconcompiler/remote/schema.py +116 -112
  21. siliconcompiler/remote/server.py +3 -5
  22. siliconcompiler/report/dashboard/cli/__init__.py +13 -722
  23. siliconcompiler/report/dashboard/cli/board.py +895 -0
  24. siliconcompiler/report/dashboard/web/__init__.py +10 -10
  25. siliconcompiler/report/dashboard/web/components/__init__.py +5 -4
  26. siliconcompiler/report/dashboard/web/components/flowgraph.py +3 -3
  27. siliconcompiler/report/dashboard/web/components/graph.py +6 -3
  28. siliconcompiler/report/dashboard/web/state.py +1 -1
  29. siliconcompiler/report/dashboard/web/utils/__init__.py +4 -3
  30. siliconcompiler/report/html_report.py +2 -3
  31. siliconcompiler/report/report.py +13 -7
  32. siliconcompiler/report/summary_image.py +1 -1
  33. siliconcompiler/report/summary_table.py +3 -3
  34. siliconcompiler/report/utils.py +11 -10
  35. siliconcompiler/scheduler/__init__.py +145 -280
  36. siliconcompiler/scheduler/run_node.py +2 -1
  37. siliconcompiler/scheduler/send_messages.py +4 -4
  38. siliconcompiler/scheduler/slurm.py +2 -2
  39. siliconcompiler/schema/__init__.py +19 -2
  40. siliconcompiler/schema/baseschema.py +493 -0
  41. siliconcompiler/schema/cmdlineschema.py +250 -0
  42. siliconcompiler/{sphinx_ext → schema/docs}/__init__.py +3 -1
  43. siliconcompiler/{sphinx_ext → schema/docs}/dynamicgen.py +63 -81
  44. siliconcompiler/{sphinx_ext → schema/docs}/schemagen.py +73 -85
  45. siliconcompiler/{sphinx_ext → schema/docs}/utils.py +12 -13
  46. siliconcompiler/schema/editableschema.py +136 -0
  47. siliconcompiler/schema/journalingschema.py +238 -0
  48. siliconcompiler/schema/namedschema.py +41 -0
  49. siliconcompiler/schema/packageschema.py +101 -0
  50. siliconcompiler/schema/parameter.py +791 -0
  51. siliconcompiler/schema/parametertype.py +323 -0
  52. siliconcompiler/schema/parametervalue.py +736 -0
  53. siliconcompiler/schema/safeschema.py +37 -0
  54. siliconcompiler/schema/schema_cfg.py +109 -1789
  55. siliconcompiler/schema/utils.py +5 -68
  56. siliconcompiler/schema_obj.py +119 -0
  57. siliconcompiler/tool.py +1308 -0
  58. siliconcompiler/tools/_common/__init__.py +6 -10
  59. siliconcompiler/tools/_common/sdc/sc_constraints.sdc +1 -1
  60. siliconcompiler/tools/bluespec/convert.py +7 -7
  61. siliconcompiler/tools/builtin/_common.py +1 -1
  62. siliconcompiler/tools/builtin/concatenate.py +2 -2
  63. siliconcompiler/tools/builtin/minimum.py +1 -1
  64. siliconcompiler/tools/builtin/mux.py +2 -1
  65. siliconcompiler/tools/builtin/nop.py +1 -1
  66. siliconcompiler/tools/builtin/verify.py +6 -4
  67. siliconcompiler/tools/chisel/convert.py +4 -4
  68. siliconcompiler/tools/genfasm/bitstream.py +3 -3
  69. siliconcompiler/tools/ghdl/convert.py +1 -1
  70. siliconcompiler/tools/icarus/compile.py +4 -4
  71. siliconcompiler/tools/icepack/bitstream.py +6 -1
  72. siliconcompiler/tools/klayout/convert_drc_db.py +5 -0
  73. siliconcompiler/tools/klayout/klayout_export.py +0 -1
  74. siliconcompiler/tools/klayout/klayout_utils.py +3 -10
  75. siliconcompiler/tools/nextpnr/apr.py +6 -1
  76. siliconcompiler/tools/nextpnr/nextpnr.py +4 -4
  77. siliconcompiler/tools/openroad/_apr.py +13 -0
  78. siliconcompiler/tools/openroad/rdlroute.py +3 -3
  79. siliconcompiler/tools/openroad/scripts/apr/postamble.tcl +1 -1
  80. siliconcompiler/tools/openroad/scripts/apr/preamble.tcl +5 -5
  81. siliconcompiler/tools/openroad/scripts/apr/sc_antenna_repair.tcl +2 -2
  82. siliconcompiler/tools/openroad/scripts/apr/sc_clock_tree_synthesis.tcl +2 -2
  83. siliconcompiler/tools/openroad/scripts/apr/sc_detailed_placement.tcl +2 -2
  84. siliconcompiler/tools/openroad/scripts/apr/sc_detailed_route.tcl +2 -2
  85. siliconcompiler/tools/openroad/scripts/apr/sc_endcap_tapcell_insertion.tcl +2 -2
  86. siliconcompiler/tools/openroad/scripts/apr/sc_fillercell_insertion.tcl +2 -2
  87. siliconcompiler/tools/openroad/scripts/apr/sc_fillmetal_insertion.tcl +2 -2
  88. siliconcompiler/tools/openroad/scripts/apr/sc_global_placement.tcl +2 -2
  89. siliconcompiler/tools/openroad/scripts/apr/sc_global_route.tcl +2 -2
  90. siliconcompiler/tools/openroad/scripts/apr/sc_init_floorplan.tcl +2 -2
  91. siliconcompiler/tools/openroad/scripts/apr/sc_macro_placement.tcl +3 -3
  92. siliconcompiler/tools/openroad/scripts/apr/sc_metrics.tcl +2 -2
  93. siliconcompiler/tools/openroad/scripts/apr/sc_pin_placement.tcl +2 -2
  94. siliconcompiler/tools/openroad/scripts/apr/sc_power_grid.tcl +2 -2
  95. siliconcompiler/tools/openroad/scripts/apr/sc_repair_design.tcl +2 -2
  96. siliconcompiler/tools/openroad/scripts/apr/sc_repair_timing.tcl +2 -2
  97. siliconcompiler/tools/openroad/scripts/apr/sc_write_data.tcl +2 -2
  98. siliconcompiler/tools/openroad/scripts/common/procs.tcl +57 -1
  99. siliconcompiler/tools/openroad/scripts/common/screenshot.tcl +2 -2
  100. siliconcompiler/tools/openroad/scripts/common/write_images.tcl +28 -3
  101. siliconcompiler/tools/openroad/scripts/sc_rcx.tcl +1 -1
  102. siliconcompiler/tools/openroad/scripts/sc_rdlroute.tcl +3 -3
  103. siliconcompiler/tools/openroad/scripts/sc_show.tcl +6 -6
  104. siliconcompiler/tools/slang/__init__.py +10 -10
  105. siliconcompiler/tools/surelog/parse.py +4 -4
  106. siliconcompiler/tools/sv2v/convert.py +20 -3
  107. siliconcompiler/tools/verilator/compile.py +2 -2
  108. siliconcompiler/tools/verilator/verilator.py +3 -3
  109. siliconcompiler/tools/vpr/place.py +1 -1
  110. siliconcompiler/tools/vpr/route.py +4 -4
  111. siliconcompiler/tools/vpr/screenshot.py +1 -1
  112. siliconcompiler/tools/vpr/show.py +5 -5
  113. siliconcompiler/tools/vpr/vpr.py +24 -24
  114. siliconcompiler/tools/xdm/convert.py +2 -2
  115. siliconcompiler/tools/xyce/simulate.py +1 -1
  116. siliconcompiler/tools/yosys/sc_synth_asic.tcl +74 -68
  117. siliconcompiler/tools/yosys/syn_asic.py +2 -2
  118. siliconcompiler/toolscripts/_tools.json +7 -7
  119. siliconcompiler/toolscripts/ubuntu22/install-vpr.sh +0 -2
  120. siliconcompiler/toolscripts/ubuntu24/install-vpr.sh +0 -2
  121. siliconcompiler/utils/__init__.py +8 -112
  122. siliconcompiler/utils/flowgraph.py +339 -0
  123. siliconcompiler/{issue.py → utils/issue.py} +4 -3
  124. siliconcompiler/utils/logging.py +1 -2
  125. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/METADATA +9 -8
  126. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/RECORD +151 -134
  127. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/WHEEL +1 -1
  128. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/entry_points.txt +8 -8
  129. siliconcompiler/schema/schema_obj.py +0 -1936
  130. siliconcompiler/toolscripts/ubuntu20/install-vpr.sh +0 -29
  131. siliconcompiler/toolscripts/ubuntu20/install-yosys-parmys.sh +0 -61
  132. /siliconcompiler/{templates → data/templates}/__init__.py +0 -0
  133. /siliconcompiler/{templates → data/templates}/email/__init__.py +0 -0
  134. /siliconcompiler/{templates → data/templates}/email/general.j2 +0 -0
  135. /siliconcompiler/{templates → data/templates}/email/summary.j2 +0 -0
  136. /siliconcompiler/{templates → data/templates}/issue/README.txt +0 -0
  137. /siliconcompiler/{templates → data/templates}/issue/__init__.py +0 -0
  138. /siliconcompiler/{templates → data/templates}/issue/run.sh +0 -0
  139. /siliconcompiler/{templates → data/templates}/replay/replay.py.j2 +0 -0
  140. /siliconcompiler/{templates → data/templates}/replay/replay.sh.j2 +0 -0
  141. /siliconcompiler/{templates → data/templates}/replay/requirements.txt +0 -0
  142. /siliconcompiler/{templates → data/templates}/replay/setup.sh +0 -0
  143. /siliconcompiler/{templates → data/templates}/report/__init__.py +0 -0
  144. /siliconcompiler/{templates → data/templates}/report/bootstrap.min.css +0 -0
  145. /siliconcompiler/{templates → data/templates}/report/bootstrap.min.js +0 -0
  146. /siliconcompiler/{templates → data/templates}/report/bootstrap_LICENSE.md +0 -0
  147. /siliconcompiler/{templates → data/templates}/report/sc_report.j2 +0 -0
  148. /siliconcompiler/{templates → data/templates}/slurm/__init__.py +0 -0
  149. /siliconcompiler/{templates → data/templates}/slurm/run.sh +0 -0
  150. /siliconcompiler/{templates → data/templates}/tcl/__init__.py +0 -0
  151. /siliconcompiler/{templates → data/templates}/tcl/manifest.tcl.j2 +0 -0
  152. /siliconcompiler/{units.py → utils/units.py} +0 -0
  153. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/licenses/LICENSE +0 -0
  154. {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
- super().__init__(chip)
35
-
36
- if not bootstrap:
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.cfg
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.cfg, indent=2),
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
- pandas.DataFrame.from_dict(nodes),
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
- entry_exit_nodes = _get_flowgraph_entry_nodes(chip, chip.get('option', 'flow')) + \
49
- _get_flowgraph_exit_nodes(chip, chip.get('option', 'flow'))
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 = pandas.DataFrame({
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(pandas.DataFrame(filtered_data).dropna(), height=500)
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.cfg = chip.getdict('history', history)
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 _get_flowgraph_nodes(chip, chip.get('option', 'flow')):
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 _get_flowgraph_nodes(chip, chip.get('option', 'flow')):
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.prune()
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.cfg,
53
+ manifest=chip.schema.getdict(),
55
54
  pruned_cfg=pruned_cfg,
56
55
  metric_keys=metrics_to_show,
57
56
  img_data=img_data,
@@ -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.utils import PerNode
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 = (pandas.DataFrame.from_dict(metrics, orient='index').transpose())
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 Schema._is_leaf(manifest_subsect):
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 Schema._is_leaf(key_dict):
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.cfg
184
+ manifest = chip.schema.getdict()
179
185
  modified_manifest = {}
180
186
  make_manifest_helper(manifest, modified_manifest)
181
187
  return modified_manifest
@@ -2,7 +2,7 @@ import os
2
2
  import string
3
3
  from PIL import Image, ImageFont, ImageDraw
4
4
 
5
- from siliconcompiler import units
5
+ from siliconcompiler.utils import units
6
6
  from siliconcompiler.report.utils import _find_summary_image, _find_summary_metrics
7
7
 
8
8
 
@@ -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._getvals('asic', 'logiclib'):
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 = pandas.DataFrame(data, row_labels, column_labels)
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:
@@ -1,9 +1,11 @@
1
1
  from siliconcompiler import NodeStatus
2
- from siliconcompiler import units
3
- from siliconcompiler.flowgraph import _get_flowgraph_execution_order, _get_flowgraph_exit_nodes, \
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 = None
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 = None
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
- end_nodes = _get_flowgraph_exit_nodes(chip, flow, steps=flowgraph_steps)
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])):