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.
- siliconcompiler/__init__.py +2 -0
- siliconcompiler/_metadata.py +1 -1
- siliconcompiler/apps/_common.py +1 -1
- siliconcompiler/apps/sc.py +1 -1
- siliconcompiler/apps/sc_issue.py +6 -4
- siliconcompiler/apps/sc_remote.py +3 -20
- siliconcompiler/apps/sc_show.py +2 -2
- siliconcompiler/apps/utils/replay.py +4 -4
- siliconcompiler/checklist.py +202 -1
- siliconcompiler/core.py +62 -293
- siliconcompiler/data/templates/email/general.j2 +3 -3
- siliconcompiler/data/templates/email/summary.j2 +1 -1
- siliconcompiler/data/templates/issue/README.txt +1 -1
- siliconcompiler/data/templates/report/sc_report.j2 +7 -7
- siliconcompiler/dependencyschema.py +392 -0
- siliconcompiler/design.py +758 -0
- siliconcompiler/flowgraph.py +79 -13
- siliconcompiler/optimizer/vizier.py +2 -2
- siliconcompiler/package/__init__.py +383 -223
- siliconcompiler/package/git.py +75 -77
- siliconcompiler/package/github.py +70 -97
- siliconcompiler/package/https.py +77 -93
- siliconcompiler/packageschema.py +260 -0
- siliconcompiler/pdk.py +5 -5
- siliconcompiler/remote/client.py +33 -15
- siliconcompiler/remote/server.py +2 -2
- siliconcompiler/report/dashboard/cli/__init__.py +6 -6
- siliconcompiler/report/dashboard/cli/board.py +4 -4
- siliconcompiler/report/dashboard/web/components/__init__.py +5 -5
- siliconcompiler/report/dashboard/web/components/flowgraph.py +4 -4
- siliconcompiler/report/dashboard/web/components/graph.py +2 -2
- siliconcompiler/report/dashboard/web/state.py +1 -1
- siliconcompiler/report/dashboard/web/utils/__init__.py +5 -5
- siliconcompiler/report/html_report.py +1 -1
- siliconcompiler/report/report.py +4 -4
- siliconcompiler/report/summary_table.py +2 -2
- siliconcompiler/report/utils.py +5 -5
- siliconcompiler/scheduler/__init__.py +3 -1382
- siliconcompiler/scheduler/docker.py +263 -0
- siliconcompiler/scheduler/run_node.py +10 -21
- siliconcompiler/scheduler/scheduler.py +311 -0
- siliconcompiler/scheduler/schedulernode.py +944 -0
- siliconcompiler/scheduler/send_messages.py +3 -3
- siliconcompiler/scheduler/slurm.py +149 -163
- siliconcompiler/scheduler/taskscheduler.py +45 -57
- siliconcompiler/schema/__init__.py +3 -3
- siliconcompiler/schema/baseschema.py +234 -11
- siliconcompiler/schema/editableschema.py +4 -0
- siliconcompiler/schema/journal.py +210 -0
- siliconcompiler/schema/namedschema.py +55 -2
- siliconcompiler/schema/parameter.py +14 -1
- siliconcompiler/schema/parametervalue.py +1 -34
- siliconcompiler/schema/schema_cfg.py +210 -349
- siliconcompiler/tool.py +412 -148
- siliconcompiler/tools/__init__.py +2 -0
- siliconcompiler/tools/builtin/_common.py +5 -5
- siliconcompiler/tools/builtin/concatenate.py +7 -7
- siliconcompiler/tools/builtin/minimum.py +4 -4
- siliconcompiler/tools/builtin/mux.py +4 -4
- siliconcompiler/tools/builtin/nop.py +4 -4
- siliconcompiler/tools/builtin/verify.py +8 -9
- siliconcompiler/tools/execute/exec_input.py +1 -1
- siliconcompiler/tools/genfasm/genfasm.py +1 -6
- siliconcompiler/tools/openroad/_apr.py +5 -1
- siliconcompiler/tools/openroad/antenna_repair.py +1 -1
- siliconcompiler/tools/openroad/macro_placement.py +1 -1
- siliconcompiler/tools/openroad/power_grid.py +1 -1
- siliconcompiler/tools/openroad/scripts/common/procs.tcl +32 -25
- siliconcompiler/tools/opensta/timing.py +26 -3
- siliconcompiler/tools/slang/__init__.py +2 -2
- siliconcompiler/tools/surfer/__init__.py +0 -0
- siliconcompiler/tools/surfer/show.py +53 -0
- siliconcompiler/tools/surfer/surfer.py +30 -0
- siliconcompiler/tools/vpr/route.py +82 -0
- siliconcompiler/tools/vpr/vpr.py +23 -6
- siliconcompiler/tools/yosys/__init__.py +1 -1
- siliconcompiler/tools/yosys/scripts/procs.tcl +143 -0
- siliconcompiler/tools/yosys/{sc_synth_asic.tcl → scripts/sc_synth_asic.tcl} +4 -0
- siliconcompiler/tools/yosys/{sc_synth_fpga.tcl → scripts/sc_synth_fpga.tcl} +24 -77
- siliconcompiler/tools/yosys/syn_fpga.py +14 -0
- siliconcompiler/toolscripts/_tools.json +9 -13
- siliconcompiler/toolscripts/rhel9/install-vpr.sh +0 -2
- siliconcompiler/toolscripts/ubuntu22/install-surfer.sh +33 -0
- siliconcompiler/toolscripts/ubuntu24/install-surfer.sh +33 -0
- siliconcompiler/utils/__init__.py +4 -24
- siliconcompiler/utils/flowgraph.py +29 -28
- siliconcompiler/utils/issue.py +23 -29
- siliconcompiler/utils/logging.py +37 -7
- siliconcompiler/utils/showtools.py +6 -1
- {siliconcompiler-0.33.2.dist-info → siliconcompiler-0.34.1.dist-info}/METADATA +16 -25
- {siliconcompiler-0.33.2.dist-info → siliconcompiler-0.34.1.dist-info}/RECORD +98 -91
- siliconcompiler/scheduler/docker_runner.py +0 -254
- siliconcompiler/schema/journalingschema.py +0 -242
- siliconcompiler/tools/yosys/procs.tcl +0 -71
- siliconcompiler/toolscripts/rhel9/install-yosys-parmys.sh +0 -68
- siliconcompiler/toolscripts/ubuntu22/install-yosys-parmys.sh +0 -68
- siliconcompiler/toolscripts/ubuntu24/install-yosys-parmys.sh +0 -68
- /siliconcompiler/tools/yosys/{sc_lec.tcl → scripts/sc_lec.tcl} +0 -0
- /siliconcompiler/tools/yosys/{sc_screenshot.tcl → scripts/sc_screenshot.tcl} +0 -0
- /siliconcompiler/tools/yosys/{syn_strategies.tcl → scripts/syn_strategies.tcl} +0 -0
- {siliconcompiler-0.33.2.dist-info → siliconcompiler-0.34.1.dist-info}/WHEEL +0 -0
- {siliconcompiler-0.33.2.dist-info → siliconcompiler-0.34.1.dist-info}/entry_points.txt +0 -0
- {siliconcompiler-0.33.2.dist-info → siliconcompiler-0.34.1.dist-info}/licenses/LICENSE +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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,
|
|
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
|
-
|
|
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.
|
|
98
|
+
node_exec_order = chip.get("flowgraph", flow, field="schema").get_execution_order()
|
|
99
99
|
if io:
|
|
100
|
-
|
|
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
|
-
|
|
104
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
142
|
-
record = chip.
|
|
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
|
-
|
|
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
|
|
siliconcompiler/utils/issue.py
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
-
|
|
182
|
-
|
|
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
|
siliconcompiler/utils/logging.py
CHANGED
|
@@ -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.
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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.
|
|
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.
|
|
24
|
+
Requires-Python: >=3.9
|
|
26
25
|
Description-Content-Type: text/markdown
|
|
27
26
|
License-File: LICENSE
|
|
28
|
-
Requires-Dist: aiohttp
|
|
29
|
-
Requires-Dist:
|
|
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.
|
|
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==
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
61
|
-
Requires-Dist: pytest-xdist==3.
|
|
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.
|
|
65
|
-
Requires-Dist: pytest-
|
|
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.
|
|
73
|
-
Requires-Dist: tclint==0.
|
|
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.
|
|
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
|