siliconcompiler 0.33.2__py3-none-any.whl → 0.34.1__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 (104) hide show
  1. siliconcompiler/__init__.py +2 -0
  2. siliconcompiler/_metadata.py +1 -1
  3. siliconcompiler/apps/_common.py +1 -1
  4. siliconcompiler/apps/sc.py +1 -1
  5. siliconcompiler/apps/sc_issue.py +6 -4
  6. siliconcompiler/apps/sc_remote.py +3 -20
  7. siliconcompiler/apps/sc_show.py +2 -2
  8. siliconcompiler/apps/utils/replay.py +4 -4
  9. siliconcompiler/checklist.py +202 -1
  10. siliconcompiler/core.py +62 -293
  11. siliconcompiler/data/templates/email/general.j2 +3 -3
  12. siliconcompiler/data/templates/email/summary.j2 +1 -1
  13. siliconcompiler/data/templates/issue/README.txt +1 -1
  14. siliconcompiler/data/templates/report/sc_report.j2 +7 -7
  15. siliconcompiler/dependencyschema.py +392 -0
  16. siliconcompiler/design.py +758 -0
  17. siliconcompiler/flowgraph.py +79 -13
  18. siliconcompiler/optimizer/vizier.py +2 -2
  19. siliconcompiler/package/__init__.py +383 -223
  20. siliconcompiler/package/git.py +75 -77
  21. siliconcompiler/package/github.py +70 -97
  22. siliconcompiler/package/https.py +77 -93
  23. siliconcompiler/packageschema.py +260 -0
  24. siliconcompiler/pdk.py +5 -5
  25. siliconcompiler/remote/client.py +33 -15
  26. siliconcompiler/remote/server.py +2 -2
  27. siliconcompiler/report/dashboard/cli/__init__.py +6 -6
  28. siliconcompiler/report/dashboard/cli/board.py +4 -4
  29. siliconcompiler/report/dashboard/web/components/__init__.py +5 -5
  30. siliconcompiler/report/dashboard/web/components/flowgraph.py +4 -4
  31. siliconcompiler/report/dashboard/web/components/graph.py +2 -2
  32. siliconcompiler/report/dashboard/web/state.py +1 -1
  33. siliconcompiler/report/dashboard/web/utils/__init__.py +5 -5
  34. siliconcompiler/report/html_report.py +1 -1
  35. siliconcompiler/report/report.py +4 -4
  36. siliconcompiler/report/summary_table.py +2 -2
  37. siliconcompiler/report/utils.py +5 -5
  38. siliconcompiler/scheduler/__init__.py +3 -1382
  39. siliconcompiler/scheduler/docker.py +263 -0
  40. siliconcompiler/scheduler/run_node.py +10 -21
  41. siliconcompiler/scheduler/scheduler.py +311 -0
  42. siliconcompiler/scheduler/schedulernode.py +944 -0
  43. siliconcompiler/scheduler/send_messages.py +3 -3
  44. siliconcompiler/scheduler/slurm.py +149 -163
  45. siliconcompiler/scheduler/taskscheduler.py +45 -57
  46. siliconcompiler/schema/__init__.py +3 -3
  47. siliconcompiler/schema/baseschema.py +234 -11
  48. siliconcompiler/schema/editableschema.py +4 -0
  49. siliconcompiler/schema/journal.py +210 -0
  50. siliconcompiler/schema/namedschema.py +55 -2
  51. siliconcompiler/schema/parameter.py +14 -1
  52. siliconcompiler/schema/parametervalue.py +1 -34
  53. siliconcompiler/schema/schema_cfg.py +210 -349
  54. siliconcompiler/tool.py +412 -148
  55. siliconcompiler/tools/__init__.py +2 -0
  56. siliconcompiler/tools/builtin/_common.py +5 -5
  57. siliconcompiler/tools/builtin/concatenate.py +7 -7
  58. siliconcompiler/tools/builtin/minimum.py +4 -4
  59. siliconcompiler/tools/builtin/mux.py +4 -4
  60. siliconcompiler/tools/builtin/nop.py +4 -4
  61. siliconcompiler/tools/builtin/verify.py +8 -9
  62. siliconcompiler/tools/execute/exec_input.py +1 -1
  63. siliconcompiler/tools/genfasm/genfasm.py +1 -6
  64. siliconcompiler/tools/openroad/_apr.py +5 -1
  65. siliconcompiler/tools/openroad/antenna_repair.py +1 -1
  66. siliconcompiler/tools/openroad/macro_placement.py +1 -1
  67. siliconcompiler/tools/openroad/power_grid.py +1 -1
  68. siliconcompiler/tools/openroad/scripts/common/procs.tcl +32 -25
  69. siliconcompiler/tools/opensta/timing.py +26 -3
  70. siliconcompiler/tools/slang/__init__.py +2 -2
  71. siliconcompiler/tools/surfer/__init__.py +0 -0
  72. siliconcompiler/tools/surfer/show.py +53 -0
  73. siliconcompiler/tools/surfer/surfer.py +30 -0
  74. siliconcompiler/tools/vpr/route.py +82 -0
  75. siliconcompiler/tools/vpr/vpr.py +23 -6
  76. siliconcompiler/tools/yosys/__init__.py +1 -1
  77. siliconcompiler/tools/yosys/scripts/procs.tcl +143 -0
  78. siliconcompiler/tools/yosys/{sc_synth_asic.tcl → scripts/sc_synth_asic.tcl} +4 -0
  79. siliconcompiler/tools/yosys/{sc_synth_fpga.tcl → scripts/sc_synth_fpga.tcl} +24 -77
  80. siliconcompiler/tools/yosys/syn_fpga.py +14 -0
  81. siliconcompiler/toolscripts/_tools.json +9 -13
  82. siliconcompiler/toolscripts/rhel9/install-vpr.sh +0 -2
  83. siliconcompiler/toolscripts/ubuntu22/install-surfer.sh +33 -0
  84. siliconcompiler/toolscripts/ubuntu24/install-surfer.sh +33 -0
  85. siliconcompiler/utils/__init__.py +4 -24
  86. siliconcompiler/utils/flowgraph.py +29 -28
  87. siliconcompiler/utils/issue.py +23 -29
  88. siliconcompiler/utils/logging.py +37 -7
  89. siliconcompiler/utils/showtools.py +6 -1
  90. {siliconcompiler-0.33.2.dist-info → siliconcompiler-0.34.1.dist-info}/METADATA +16 -25
  91. {siliconcompiler-0.33.2.dist-info → siliconcompiler-0.34.1.dist-info}/RECORD +98 -91
  92. siliconcompiler/scheduler/docker_runner.py +0 -254
  93. siliconcompiler/schema/journalingschema.py +0 -242
  94. siliconcompiler/tools/yosys/procs.tcl +0 -71
  95. siliconcompiler/toolscripts/rhel9/install-yosys-parmys.sh +0 -68
  96. siliconcompiler/toolscripts/ubuntu22/install-yosys-parmys.sh +0 -68
  97. siliconcompiler/toolscripts/ubuntu24/install-yosys-parmys.sh +0 -68
  98. /siliconcompiler/tools/yosys/{sc_lec.tcl → scripts/sc_lec.tcl} +0 -0
  99. /siliconcompiler/tools/yosys/{sc_screenshot.tcl → scripts/sc_screenshot.tcl} +0 -0
  100. /siliconcompiler/tools/yosys/{syn_strategies.tcl → scripts/syn_strategies.tcl} +0 -0
  101. {siliconcompiler-0.33.2.dist-info → siliconcompiler-0.34.1.dist-info}/WHEEL +0 -0
  102. {siliconcompiler-0.33.2.dist-info → siliconcompiler-0.34.1.dist-info}/entry_points.txt +0 -0
  103. {siliconcompiler-0.33.2.dist-info → siliconcompiler-0.34.1.dist-info}/licenses/LICENSE +0 -0
  104. {siliconcompiler-0.33.2.dist-info → siliconcompiler-0.34.1.dist-info}/top_level.txt +0 -0
@@ -4,6 +4,7 @@ from siliconcompiler import NodeStatus
4
4
  from siliconcompiler.tools._common import input_file_node_name, get_tool_task
5
5
 
6
6
  from siliconcompiler.flowgraph import RuntimeFlowgraph
7
+ from siliconcompiler.scheduler.schedulernode import SchedulerNode
7
8
 
8
9
 
9
10
  ###########################################################################
@@ -15,16 +16,16 @@ def _check_flowgraph_io(chip, nodes=None):
15
16
  flow = chip.get('option', 'flow')
16
17
 
17
18
  runtime_full = RuntimeFlowgraph(
18
- chip.schema.get("flowgraph", flow, field='schema'),
19
+ chip.get("flowgraph", flow, field='schema'),
19
20
  to_steps=chip.get('option', 'to'),
20
21
  prune_nodes=chip.get('option', 'prune'))
21
22
  runtime_flow = RuntimeFlowgraph(
22
- chip.schema.get("flowgraph", flow, field='schema'),
23
+ chip.get("flowgraph", flow, field='schema'),
23
24
  args=(chip.get('arg', 'step'), chip.get('arg', 'index')),
24
25
  from_steps=chip.get('option', 'from'),
25
26
  to_steps=chip.get('option', 'to'),
26
27
  prune_nodes=chip.get('option', 'prune'))
27
- record = chip.schema.get("record", field='schema')
28
+ record = chip.get("record", field='schema')
28
29
 
29
30
  if not nodes:
30
31
  nodes = runtime_flow.get_nodes()
@@ -61,25 +62,25 @@ def _check_flowgraph_io(chip, nodes=None):
61
62
  manifest = f'{design}.pkg.json'
62
63
  inputs = [inp for inp in os.listdir(in_step_out_dir) if inp != manifest]
63
64
  else:
64
- in_tool, _ = get_tool_task(chip, in_step, in_index, flow=flow)
65
- task_class = chip.get("tool", in_tool, field="schema")
66
- task_class.set_runtime(chip, step=in_step, index=in_index)
65
+ in_tool, in_task = get_tool_task(chip, in_step, in_index, flow=flow)
66
+ task_class = chip.get("tool", in_tool, "task", in_task, field="schema")
67
67
 
68
- inputs = task_class.get_output_files()
68
+ with task_class.runtime(chip, step=in_step, index=in_index) as task:
69
+ inputs = task.get_output_files()
69
70
 
70
71
  for inp in inputs:
71
72
  node_inp = input_file_node_name(inp, in_step, in_index)
72
73
  if node_inp in requirements:
73
74
  inp = node_inp
74
75
  if inp in all_inputs:
75
- chip.logger.error(f'Invalid flow: {step}{index} '
76
+ chip.logger.error(f'Invalid flow: {step}/{index} '
76
77
  f'receives {inp} from multiple input tasks')
77
78
  return False
78
79
  all_inputs.add(inp)
79
80
 
80
81
  for requirement in requirements:
81
82
  if requirement not in all_inputs:
82
- chip.logger.error(f'Invalid flow: {step}{index} will '
83
+ chip.logger.error(f'Invalid flow: {step}/{index} will '
83
84
  f'not receive required input {requirement}.')
84
85
  return False
85
86
 
@@ -87,7 +88,6 @@ def _check_flowgraph_io(chip, nodes=None):
87
88
 
88
89
 
89
90
  def _get_flowgraph_information(chip, flow, io=True):
90
- from siliconcompiler.scheduler import _setup_node
91
91
  from siliconcompiler.tools._common import input_provides, input_file_node_name
92
92
 
93
93
  # Save schema to avoid making permanent changes
@@ -95,24 +95,24 @@ def _get_flowgraph_information(chip, flow, io=True):
95
95
  chip.schema = chip.schema.copy()
96
96
 
97
97
  # Setup nodes
98
- node_exec_order = chip.schema.get("flowgraph", flow, field="schema").get_execution_order()
98
+ node_exec_order = chip.get("flowgraph", flow, field="schema").get_execution_order()
99
99
  if io:
100
- # try:
100
+ prev_flow = chip.get("option", "flow")
101
+ chip.set("option", "flow", flow)
101
102
  for layer_nodes in node_exec_order:
102
103
  for step, index in layer_nodes:
103
- _setup_node(chip, step, index, flow=flow)
104
- # except: # noqa E722
105
- # io = False
104
+ SchedulerNode(chip, step, index).setup()
105
+ chip.set("option", "flow", prev_flow)
106
106
 
107
107
  node_rank = {}
108
108
  for rank, rank_nodes in enumerate(node_exec_order):
109
109
  for step, index in rank_nodes:
110
- node_rank[f'{step}{index}'] = rank
110
+ node_rank[f'{step}/{index}'] = rank
111
111
 
112
112
  graph_inputs = {}
113
113
  all_graph_inputs = set()
114
114
  if io:
115
- for step, index in chip.schema.get("flowgraph", flow, field="schema").get_nodes():
115
+ for step, index in chip.get("flowgraph", flow, field="schema").get_nodes():
116
116
  tool, task = get_tool_task(chip, step, index, flow=flow)
117
117
  for keypath in chip.get('tool', tool, 'task', task, 'require', step=step, index=index):
118
118
  key = tuple(keypath.split(','))
@@ -122,7 +122,7 @@ def _get_flowgraph_information(chip, flow, io=True):
122
122
  for inputs in graph_inputs.values():
123
123
  all_graph_inputs.update(inputs)
124
124
 
125
- exit_nodes = [f'{step}{index}' for step, index in chip.schema.get(
125
+ exit_nodes = [f'{step}/{index}' for step, index in chip.get(
126
126
  "flowgraph", flow, field="schema").get_exit_nodes()]
127
127
 
128
128
  nodes = {}
@@ -135,11 +135,11 @@ def _get_flowgraph_information(chip, flow, io=True):
135
135
  return label.replace("<", r"\<").replace(">", r"\>")
136
136
 
137
137
  all_nodes = [(step, index) for step, index in sorted(
138
- chip.schema.get("flowgraph", flow, field="schema").get_nodes())
138
+ chip.get("flowgraph", flow, field="schema").get_nodes())
139
139
  if chip.get('record', 'status', step=step, index=index) != NodeStatus.SKIPPED]
140
140
 
141
- runtime_flow = RuntimeFlowgraph(chip.schema.get("flowgraph", flow, field='schema'))
142
- record = chip.schema.get("record", field='schema')
141
+ runtime_flow = RuntimeFlowgraph(chip.get("flowgraph", flow, field='schema'))
142
+ record = chip.get("record", field='schema')
143
143
 
144
144
  for step, index in all_nodes:
145
145
  tool, task = get_tool_task(chip, step, index, flow=flow)
@@ -153,7 +153,7 @@ def _get_flowgraph_information(chip, flow, io=True):
153
153
  inputs = []
154
154
  outputs = []
155
155
 
156
- node = f'{step}{index}'
156
+ node = f'{step}/{index}'
157
157
  if io and (step, index) in graph_inputs:
158
158
  inputs.extend(graph_inputs[(step, index)])
159
159
 
@@ -173,11 +173,12 @@ def _get_flowgraph_information(chip, flow, io=True):
173
173
 
174
174
  rank_diff = {}
175
175
  for in_step, in_index in runtime_flow.get_node_inputs(step, index, record=record):
176
- rank_diff[f'{in_step}{in_index}'] = node_rank[node] - node_rank[f'{in_step}{in_index}']
176
+ in_node_name = f'{in_step}/{in_index}'
177
+ rank_diff[in_node_name] = node_rank[node] - node_rank[in_node_name]
177
178
  nodes[node]["rank_diff"] = rank_diff
178
179
 
179
180
  for step, index in all_nodes:
180
- node = f'{step}{index}'
181
+ node = f'{step}/{index}'
181
182
  if io:
182
183
  # get inputs
183
184
  edge_stats = {}
@@ -189,9 +190,9 @@ def _get_flowgraph_information(chip, flow, io=True):
189
190
  infile = input_file_node_name(infile, in_step, in_index)
190
191
  if infile not in nodes[node]["file_inputs"]:
191
192
  continue
192
- in_node_name = f"{in_step}{in_index}"
193
+ in_node_name = f"{in_step}/{in_index}"
193
194
  outlabel = f"{in_node_name}:output-{clean_label(outfile)}"
194
- inlabel = f"{step}{index}:input-{clean_label(infile)}"
195
+ inlabel = f"{step}/{index}:input-{clean_label(infile)}"
195
196
 
196
197
  if in_node_name not in edge_stats:
197
198
  edge_stats[in_node_name] = {
@@ -229,12 +230,12 @@ def _get_flowgraph_information(chip, flow, io=True):
229
230
 
230
231
  if (step, index) in graph_inputs:
231
232
  for key in graph_inputs[(step, index)]:
232
- inlabel = f"{step}{index}:input-{clean_label(key)}"
233
+ inlabel = f"{step}/{index}:input-{clean_label(key)}"
233
234
  edges.append((key, inlabel, 1))
234
235
  else:
235
236
  all_inputs = []
236
237
  for in_step, in_index in chip.get('flowgraph', flow, step, index, 'input'):
237
- all_inputs.append(f'{in_step}{in_index}')
238
+ all_inputs.append(f'{in_step}/{in_index}')
238
239
  for item in all_inputs:
239
240
  edges.append((item, node, 1 if node in exit_nodes else 2))
240
241
 
@@ -41,7 +41,7 @@ def generate_testcase(chip,
41
41
  sc_type = chip.get(*key, field='type')
42
42
  if 'file' not in sc_type and 'dir' not in sc_type:
43
43
  continue
44
- for _, key_step, key_index in chip.schema.get(*key, field=None).getvalues():
44
+ for _, key_step, key_index in chip.get(*key, field=None).getvalues():
45
45
  chip.hash_files(*key,
46
46
  check=False,
47
47
  allow_cache=True,
@@ -145,7 +145,6 @@ def generate_testcase(chip,
145
145
  chip.collect(directory=collection_dir, verbose=verbose_collect)
146
146
 
147
147
  # Set relative path to generate runnable files
148
- chip._relative_path = new_work_dir
149
148
  chip.cwd = issue_dir.name
150
149
 
151
150
  current_work_dir = os.getcwd()
@@ -153,33 +152,28 @@ def generate_testcase(chip,
153
152
 
154
153
  flow = chip.get('option', 'flow')
155
154
 
156
- task_class = chip.get("tool", tool, field="schema")
155
+ task_class = chip.get("tool", tool, "task", task, field="schema")
157
156
 
158
- task_class.set_runtime(chip, step=step, index=index)
157
+ with task_class.runtime(chip, step=step, index=index, relpath=new_work_dir) as task:
158
+ # Rewrite replay.sh
159
+ prev_quiet = chip.get('option', 'quiet', step=step, index=index)
160
+ chip.set('option', 'quiet', True, step=step, index=index)
161
+ try:
162
+ # Rerun pre_process
163
+ task.pre_process()
164
+ except Exception:
165
+ pass
166
+ chip.set('option', 'quiet', prev_quiet, step=step, index=index)
159
167
 
160
- # Rewrite replay.sh
161
- prev_quiet = chip.get('option', 'quiet', step=step, index=index)
162
- chip.set('option', 'quiet', True, step=step, index=index)
163
- try:
164
- # Rerun pre_process
165
- task_class.pre_process()
166
- except Exception:
167
- pass
168
- chip.set('option', 'quiet', prev_quiet, step=step, index=index)
169
-
170
- is_python_tool = task_class.get_exe() is None
171
-
172
- if not is_python_tool:
173
- task_class.generate_replay_script(
174
- f'{chip.getworkdir(step=step, index=index)}/replay.sh',
175
- '.',
176
- include_path=False)
177
-
178
- # Rewrite tool manifest
179
- task_class.write_task_manifest('.')
168
+ is_python_tool = task.get_exe() is None
169
+ if not is_python_tool:
170
+ task.generate_replay_script(
171
+ f'{chip.getworkdir(step=step, index=index)}/replay.sh',
172
+ '.',
173
+ include_path=False)
180
174
 
181
- # Restore normal path behavior
182
- chip._relative_path = None
175
+ # Rewrite tool manifest
176
+ task.write_task_manifest('.')
183
177
 
184
178
  # Restore current directory
185
179
  chip.cwd = original_cwd
@@ -234,7 +228,7 @@ def generate_testcase(chip,
234
228
  design = chip.design
235
229
  job = chip.get('option', 'jobname')
236
230
  file_time = datetime.fromtimestamp(issue_time).strftime('%Y%m%d-%H%M%S')
237
- archive_name = f'sc_issue_{design}_{job}_{step}{index}_{file_time}.tar.gz'
231
+ archive_name = f'sc_issue_{design}_{job}_{step}_{index}_{file_time}.tar.gz'
238
232
 
239
233
  # Make support files
240
234
  issue_path = os.path.join(issue_dir.name, 'issue.json')
@@ -254,7 +248,7 @@ def generate_testcase(chip,
254
248
  with open(run_path, 'w') as f:
255
249
  replay_dir = os.path.relpath(chip.getworkdir(step=step, index=index),
256
250
  chip.cwd)
257
- issue_title = f'{chip.design} for {step}{index} using {tool}/{task}'
251
+ issue_title = f'{chip.design} for {step}/{index} using {tool}/{task}'
258
252
  f.write(get_file_template('issue/run.sh').render(
259
253
  title=issue_title,
260
254
  exec_dir=replay_dir
@@ -288,7 +282,7 @@ def generate_testcase(chip,
288
282
 
289
283
  issue_dir.cleanup()
290
284
 
291
- chip.logger.info(f'Generated testcase for {step}{index} in: '
285
+ chip.logger.info(f'Generated testcase for {step}/{index} in: '
292
286
  f'{full_archive_path}')
293
287
 
294
288
  # Restore original schema
@@ -1,6 +1,5 @@
1
1
  import logging
2
2
  import sys
3
- from siliconcompiler.remote import client
4
3
  from siliconcompiler import utils
5
4
 
6
5
 
@@ -38,11 +37,13 @@ class SCInRunLoggerFormatter(logging.Formatter):
38
37
 
39
38
  @staticmethod
40
39
  def configure_format(fmt, chip, step, index):
40
+ from siliconcompiler.remote import client
41
+
41
42
  max_width = 20
42
43
 
43
44
  flow = chip.get('option', 'flow')
44
45
  if flow:
45
- nodes_to_run = list(chip.schema.get("flowgraph", flow, field="schema").get_nodes())
46
+ nodes_to_run = list(chip.get("flowgraph", flow, field="schema").get_nodes())
46
47
  else:
47
48
  nodes_to_run = []
48
49
 
@@ -107,14 +108,43 @@ class SCColorLoggerFormatter(logging.Formatter):
107
108
  return log_fmt.format(record)
108
109
 
109
110
  @staticmethod
110
- def supports_color(handler):
111
- if type(handler) is not logging.StreamHandler:
112
- return False
113
-
111
+ def supports_color(stream):
114
112
  supported_platform = sys.platform != 'win32'
115
113
  try:
116
- is_a_tty = hasattr(handler.stream, 'isatty') and handler.stream.isatty()
114
+ is_a_tty = hasattr(stream, 'isatty') and stream.isatty()
117
115
  except: # noqa E722
118
116
  is_a_tty = False
119
117
 
120
118
  return supported_platform and is_a_tty
119
+
120
+
121
+ def get_console_formatter(chip, in_run, step, index):
122
+ if not hasattr(chip, "schema"):
123
+ return SCLoggerFormatter()
124
+
125
+ loglevel = chip.schema.get('option', 'loglevel',
126
+ step=step, index=index)
127
+
128
+ if loglevel == 'quiet':
129
+ base_format = SCBlankLoggerFormatter()
130
+ elif in_run:
131
+ if loglevel == 'debug':
132
+ base_format = SCDebugInRunLoggerFormatter(
133
+ chip,
134
+ chip.get('option', 'jobname'),
135
+ step, index)
136
+ else:
137
+ base_format = SCInRunLoggerFormatter(
138
+ chip,
139
+ chip.get('option', 'jobname'),
140
+ step, index)
141
+ else:
142
+ if loglevel == 'debug':
143
+ base_format = SCDebugLoggerFormatter()
144
+ else:
145
+ base_format = SCLoggerFormatter()
146
+
147
+ support_color = SCColorLoggerFormatter.supports_color(sys.stdout)
148
+ if support_color:
149
+ return SCColorLoggerFormatter(base_format)
150
+ return base_format
@@ -6,8 +6,10 @@ from siliconcompiler.tools.vpr import show as vpr_show
6
6
  from siliconcompiler.tools.vpr import screenshot as vpr_screenshot
7
7
  from siliconcompiler.tools.yosys import screenshot as yosys_screenshot
8
8
  from siliconcompiler.tools.gtkwave import show as gtkwave_show
9
+ from siliconcompiler.tools.surfer import show as surfer_show
9
10
  from siliconcompiler.tools.graphviz import show as graphviz_show
10
11
  from siliconcompiler.tools.graphviz import screenshot as graphviz_screenshot
12
+ from shutil import which
11
13
 
12
14
 
13
15
  def setup(chip):
@@ -33,7 +35,10 @@ def setup(chip):
33
35
  chip.register_showtool('v', yosys_screenshot)
34
36
  chip.register_showtool('vg', yosys_screenshot)
35
37
 
36
- chip.register_showtool('vcd', gtkwave_show)
38
+ if which('surfer') is not None:
39
+ chip.register_showtool('vcd', surfer_show)
40
+ else:
41
+ chip.register_showtool('vcd', gtkwave_show)
37
42
 
38
43
  chip.register_showtool('dot', graphviz_show)
39
44
  chip.register_showtool('dot', graphviz_screenshot)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: siliconcompiler
3
- Version: 0.33.2
3
+ Version: 0.34.1
4
4
  Summary: A compiler framework that automates translation from source code to silicon.
5
5
  Author-email: Andreas Olofsson <andreas.d.olofsson@gmail.com>
6
6
  License: Apache License 2.0
@@ -11,7 +11,6 @@ Project-URL: Issues, https://github.com/siliconcompiler/siliconcompiler/issues
11
11
  Project-URL: Discussion, https://github.com/siliconcompiler/siliconcompiler/discussions
12
12
  Classifier: Environment :: Console
13
13
  Classifier: License :: OSI Approved :: Apache Software License
14
- Classifier: Programming Language :: Python :: 3.8
15
14
  Classifier: Programming Language :: Python :: 3.9
16
15
  Classifier: Programming Language :: Python :: 3.10
17
16
  Classifier: Programming Language :: Python :: 3.11
@@ -22,21 +21,19 @@ Classifier: Operating System :: MacOS
22
21
  Classifier: Operating System :: Microsoft :: Windows
23
22
  Classifier: Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)
24
23
  Classifier: Topic :: Software Development :: Build Tools
25
- Requires-Python: >=3.8
24
+ Requires-Python: >=3.9
26
25
  Description-Content-Type: text/markdown
27
26
  License-File: LICENSE
28
- Requires-Dist: aiohttp==3.10.11; python_version <= "3.8"
29
- Requires-Dist: aiohttp<3.13.0,>=3.10.11; python_version >= "3.9"
30
- Requires-Dist: requests==2.32.3
27
+ Requires-Dist: aiohttp<3.13.0,>=3.10.11
28
+ Requires-Dist: requests==2.32.4
31
29
  Requires-Dist: PyYAML==6.0.2
32
30
  Requires-Dist: pandas>=1.1.5
33
31
  Requires-Dist: Jinja2>=2.11.3
34
- Requires-Dist: graphviz==0.20.3
32
+ Requires-Dist: graphviz==0.21
35
33
  Requires-Dist: distro==1.9.0
36
34
  Requires-Dist: packaging<25,>=21.3
37
35
  Requires-Dist: psutil>=5.8.0
38
- Requires-Dist: Pillow==10.4.0; python_version <= "3.8"
39
- Requires-Dist: Pillow==11.2.1; python_version >= "3.9"
36
+ Requires-Dist: Pillow==11.3.0
40
37
  Requires-Dist: GitPython==3.1.44
41
38
  Requires-Dist: lambdapdk>=0.1.47
42
39
  Requires-Dist: PyGithub==2.6.1
@@ -45,32 +42,26 @@ Requires-Dist: fasteners==0.19
45
42
  Requires-Dist: fastjsonschema==2.21.1
46
43
  Requires-Dist: docker==7.1.0
47
44
  Requires-Dist: importlib_metadata; python_version < "3.10"
48
- Requires-Dist: orjson==3.10.15; python_version <= "3.8"
49
- Requires-Dist: orjson==3.10.18; python_version >= "3.9"
45
+ Requires-Dist: orjson==3.10.18
50
46
  Requires-Dist: pyslang==8.1.0
51
- Requires-Dist: streamlit==1.40.1; python_version <= "3.8"
52
- Requires-Dist: streamlit==1.45.1; python_version >= "3.9" and python_full_version != "3.9.7"
47
+ Requires-Dist: streamlit==1.46.1; python_full_version != "3.9.7"
53
48
  Requires-Dist: streamlit_agraph==0.0.45; python_full_version != "3.9.7"
54
49
  Requires-Dist: streamlit-antd-components==0.3.2; python_full_version != "3.9.7"
55
50
  Requires-Dist: streamlit_javascript==0.1.5; python_full_version != "3.9.7"
56
51
  Requires-Dist: streamlit-autorefresh==1.0.1; python_full_version != "3.9.7"
57
- Requires-Dist: rich==13.9.4; python_version <= "3.8"
58
- Requires-Dist: rich<15.0.0,>=14.0.0; python_version >= "3.9"
52
+ Requires-Dist: rich<15.0.0,>=14.0.0
59
53
  Provides-Extra: test
60
- Requires-Dist: pytest==8.3.5; extra == "test"
61
- Requires-Dist: pytest-xdist==3.6.1; python_version <= "3.8" and extra == "test"
62
- Requires-Dist: pytest-xdist==3.7.0; python_version >= "3.9" and extra == "test"
54
+ Requires-Dist: pytest==8.4.1; extra == "test"
55
+ Requires-Dist: pytest-xdist==3.8.0; extra == "test"
63
56
  Requires-Dist: pytest-timeout==2.4.0; extra == "test"
64
- Requires-Dist: pytest-asyncio==0.24.0; python_version <= "3.8" and extra == "test"
65
- Requires-Dist: pytest-asyncio==0.26.0; python_version >= "3.9" and extra == "test"
66
- Requires-Dist: pytest-cov==5.0.0; python_version <= "3.8" and extra == "test"
67
- Requires-Dist: pytest-cov==6.1.1; python_version >= "3.9" and extra == "test"
57
+ Requires-Dist: pytest-asyncio==1.0.0; extra == "test"
58
+ Requires-Dist: pytest-cov==6.2.1; extra == "test"
68
59
  Requires-Dist: responses==0.25.7; extra == "test"
69
60
  Requires-Dist: PyVirtualDisplay==3.0; extra == "test"
70
61
  Requires-Dist: logiklib==0.1.0; extra == "test"
71
62
  Provides-Extra: lint
72
- Requires-Dist: flake8==7.2.0; extra == "lint"
73
- Requires-Dist: tclint==0.5.4; extra == "lint"
63
+ Requires-Dist: flake8==7.3.0; extra == "lint"
64
+ Requires-Dist: tclint==0.6.0; extra == "lint"
74
65
  Requires-Dist: codespell==2.4.1; extra == "lint"
75
66
  Provides-Extra: docs
76
67
  Requires-Dist: Sphinx==8.2.3; extra == "docs"
@@ -114,7 +105,7 @@ SiliconCompiler is a modular hardware build system ("make for silicon"). The pro
114
105
  # Getting Started
115
106
 
116
107
  SiliconCompiler is available as wheel packages on PyPI for macOS, Windows and
117
- Linux platforms. For working Python 3.8-3.13 environment, just use pip.
108
+ Linux platforms. For working Python 3.9-3.13 environment, just use pip.
118
109
 
119
110
  ```sh
120
111
  python3 -m pip install --upgrade siliconcompiler