siliconcompiler 0.34.0__py3-none-any.whl → 0.34.2__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 +14 -2
- siliconcompiler/_metadata.py +1 -1
- siliconcompiler/apps/_common.py +1 -1
- siliconcompiler/apps/sc.py +1 -1
- siliconcompiler/apps/sc_issue.py +1 -1
- siliconcompiler/apps/sc_remote.py +3 -3
- siliconcompiler/apps/sc_show.py +3 -3
- siliconcompiler/apps/utils/replay.py +4 -4
- siliconcompiler/checklist.py +203 -2
- siliconcompiler/constraints/__init__.py +17 -0
- siliconcompiler/constraints/asic_component.py +378 -0
- siliconcompiler/constraints/asic_floorplan.py +449 -0
- siliconcompiler/constraints/asic_pins.py +489 -0
- siliconcompiler/constraints/asic_timing.py +517 -0
- siliconcompiler/core.py +31 -249
- 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 +10 -174
- siliconcompiler/design.py +325 -114
- siliconcompiler/flowgraph.py +63 -15
- siliconcompiler/library.py +133 -0
- siliconcompiler/metric.py +94 -72
- siliconcompiler/metrics/__init__.py +7 -0
- siliconcompiler/metrics/asic.py +245 -0
- siliconcompiler/metrics/fpga.py +220 -0
- siliconcompiler/optimizer/vizier.py +2 -2
- siliconcompiler/package/__init__.py +138 -35
- siliconcompiler/package/github.py +6 -10
- siliconcompiler/packageschema.py +256 -12
- siliconcompiler/pathschema.py +226 -0
- siliconcompiler/pdk.py +5 -5
- siliconcompiler/project.py +459 -0
- siliconcompiler/remote/client.py +18 -12
- siliconcompiler/remote/server.py +2 -2
- siliconcompiler/report/dashboard/cli/__init__.py +6 -6
- siliconcompiler/report/dashboard/cli/board.py +3 -3
- 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/docker.py +4 -10
- siliconcompiler/scheduler/run_node.py +4 -8
- siliconcompiler/scheduler/scheduler.py +18 -24
- siliconcompiler/scheduler/schedulernode.py +161 -143
- siliconcompiler/scheduler/send_messages.py +3 -3
- siliconcompiler/scheduler/slurm.py +5 -3
- siliconcompiler/scheduler/taskscheduler.py +10 -8
- siliconcompiler/schema/__init__.py +0 -2
- siliconcompiler/schema/baseschema.py +148 -26
- siliconcompiler/schema/editableschema.py +14 -6
- siliconcompiler/schema/journal.py +23 -15
- siliconcompiler/schema/namedschema.py +30 -4
- siliconcompiler/schema/parameter.py +34 -19
- siliconcompiler/schema/parametertype.py +2 -0
- siliconcompiler/schema/parametervalue.py +198 -15
- siliconcompiler/schema/schema_cfg.py +18 -14
- siliconcompiler/schema_obj.py +5 -3
- siliconcompiler/tool.py +591 -179
- siliconcompiler/tools/__init__.py +2 -0
- siliconcompiler/tools/builtin/_common.py +5 -5
- siliconcompiler/tools/builtin/concatenate.py +5 -5
- 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 +7 -7
- 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 +5 -0
- 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 +27 -14
- 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 +2 -1
- siliconcompiler/utils/flowgraph.py +24 -23
- siliconcompiler/utils/issue.py +23 -29
- siliconcompiler/utils/logging.py +35 -6
- siliconcompiler/utils/showtools.py +6 -1
- {siliconcompiler-0.34.0.dist-info → siliconcompiler-0.34.2.dist-info}/METADATA +15 -25
- {siliconcompiler-0.34.0.dist-info → siliconcompiler-0.34.2.dist-info}/RECORD +109 -97
- siliconcompiler/schema/packageschema.py +0 -101
- 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.34.0.dist-info → siliconcompiler-0.34.2.dist-info}/WHEEL +0 -0
- {siliconcompiler-0.34.0.dist-info → siliconcompiler-0.34.2.dist-info}/entry_points.txt +0 -0
- {siliconcompiler-0.34.0.dist-info → siliconcompiler-0.34.2.dist-info}/licenses/LICENSE +0 -0
- {siliconcompiler-0.34.0.dist-info → siliconcompiler-0.34.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
from siliconcompiler import MetricSchema
|
|
2
|
+
|
|
3
|
+
from siliconcompiler.schema import EditableSchema, Parameter, Scope, PerNode
|
|
4
|
+
from siliconcompiler.schema.utils import trim
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ASICMetricsSchema(MetricSchema):
|
|
8
|
+
def __init__(self):
|
|
9
|
+
super().__init__()
|
|
10
|
+
|
|
11
|
+
schema = EditableSchema(self)
|
|
12
|
+
|
|
13
|
+
for item, description in [
|
|
14
|
+
('drvs', 'design rule violations'),
|
|
15
|
+
('drcs', 'physical design rule violations'),
|
|
16
|
+
('unconstrained', 'unconstrained timing paths')]:
|
|
17
|
+
schema.insert(
|
|
18
|
+
item,
|
|
19
|
+
Parameter(
|
|
20
|
+
'int',
|
|
21
|
+
scope=Scope.JOB,
|
|
22
|
+
shorthelp=f"Metric: total {item}",
|
|
23
|
+
switch=f"-metric_{item} 'step index <int>'",
|
|
24
|
+
example=[
|
|
25
|
+
f"cli: -metric_{item} 'dfm 0 0'",
|
|
26
|
+
f"api: chip.set('metric', '{item}', 0, step='dfm', index=0)"],
|
|
27
|
+
pernode=PerNode.REQUIRED,
|
|
28
|
+
help=trim(f"""Metric tracking the total number of {description} on a
|
|
29
|
+
per step and index basis.""")))
|
|
30
|
+
|
|
31
|
+
for item, description in [
|
|
32
|
+
('cellarea', 'cell area (ignoring fillers)'),
|
|
33
|
+
('totalarea', 'physical die area'),
|
|
34
|
+
('macroarea', 'macro cell area'),
|
|
35
|
+
('padcellarea', 'io pad cell area'),
|
|
36
|
+
('stdcellarea', 'standard cell area')]:
|
|
37
|
+
schema.insert(
|
|
38
|
+
item,
|
|
39
|
+
Parameter(
|
|
40
|
+
'float',
|
|
41
|
+
unit='um^2',
|
|
42
|
+
scope=Scope.JOB,
|
|
43
|
+
shorthelp=f"Metric: {item}",
|
|
44
|
+
switch=f"-metric_{item} 'step index <float>'",
|
|
45
|
+
example=[
|
|
46
|
+
f"cli: -metric_{item} 'place 0 100.00'",
|
|
47
|
+
f"api: chip.set('metric', '{item}', 100.00, step='place', index=0)"],
|
|
48
|
+
pernode=PerNode.REQUIRED,
|
|
49
|
+
help=trim(f"""
|
|
50
|
+
Metric tracking the total {description} occupied by the design.""")))
|
|
51
|
+
|
|
52
|
+
schema.insert(
|
|
53
|
+
'utilization',
|
|
54
|
+
Parameter(
|
|
55
|
+
'float',
|
|
56
|
+
unit='%',
|
|
57
|
+
scope=Scope.JOB,
|
|
58
|
+
shorthelp="Metric: area utilization",
|
|
59
|
+
switch="-metric_utilization 'step index <float>'",
|
|
60
|
+
example=[
|
|
61
|
+
"cli: -metric_utilization 'place 0 50.00'",
|
|
62
|
+
"api: chip.set('metric', 'utilization', 50.00, step='place', index=0)"],
|
|
63
|
+
pernode=PerNode.REQUIRED,
|
|
64
|
+
help=trim("""
|
|
65
|
+
Metric tracking the area utilization of the design calculated as
|
|
66
|
+
100 * (cellarea/totalarea).""")))
|
|
67
|
+
|
|
68
|
+
schema.insert(
|
|
69
|
+
'logicdepth',
|
|
70
|
+
Parameter(
|
|
71
|
+
'int',
|
|
72
|
+
scope=Scope.JOB,
|
|
73
|
+
shorthelp="Metric: logic depth",
|
|
74
|
+
switch="-metric_logicdepth 'step index <int>'",
|
|
75
|
+
example=[
|
|
76
|
+
"cli: -metric_logicdepth 'place 0 8'",
|
|
77
|
+
"api: chip.set('metric', 'logicdepth', 8, step='place', index=0)"],
|
|
78
|
+
pernode=PerNode.REQUIRED,
|
|
79
|
+
help=trim("""
|
|
80
|
+
Metric tracking the logic depth of the design. This is determined
|
|
81
|
+
by the number of logic gates between the start of the critital timing
|
|
82
|
+
path to the end of the path.""")))
|
|
83
|
+
|
|
84
|
+
for item, description in [
|
|
85
|
+
('peakpower', 'worst case total peak power'),
|
|
86
|
+
('averagepower', 'average workload power'),
|
|
87
|
+
('leakagepower', 'leakage power with rails active but without any dynamic '
|
|
88
|
+
'switching activity')]:
|
|
89
|
+
schema.insert(
|
|
90
|
+
item,
|
|
91
|
+
Parameter(
|
|
92
|
+
'float',
|
|
93
|
+
unit='mw',
|
|
94
|
+
scope=Scope.JOB,
|
|
95
|
+
shorthelp=f"Metric: {item}",
|
|
96
|
+
switch=f"-metric_{item} 'step index <float>'",
|
|
97
|
+
example=[
|
|
98
|
+
f"cli: -metric_{item} 'place 0 0.01'",
|
|
99
|
+
f"api: chip.set('metric', '{item}', 0.01, step='place', index=0)"],
|
|
100
|
+
pernode=PerNode.REQUIRED,
|
|
101
|
+
help=trim(f"""
|
|
102
|
+
Metric tracking the {description} of the design specified on a per step
|
|
103
|
+
and index basis. Power metric depend heavily on the method
|
|
104
|
+
being used for extraction: dynamic vs static, workload
|
|
105
|
+
specification (vcd vs saif), power models, process/voltage/temperature.
|
|
106
|
+
The power {item} metric tries to capture the data that would
|
|
107
|
+
usually be reflected inside a datasheet given the appropriate
|
|
108
|
+
footnote conditions.""")))
|
|
109
|
+
|
|
110
|
+
schema.insert(
|
|
111
|
+
'irdrop',
|
|
112
|
+
Parameter(
|
|
113
|
+
'float',
|
|
114
|
+
unit='mv',
|
|
115
|
+
scope=Scope.JOB,
|
|
116
|
+
shorthelp="Metric: peak IR drop",
|
|
117
|
+
switch="-metric_irdrop 'step index <float>'",
|
|
118
|
+
example=[
|
|
119
|
+
"cli: -metric_irdrop 'place 0 0.05'",
|
|
120
|
+
"api: chip.set('metric', 'irdrop', 0.05, step='place', index=0)"],
|
|
121
|
+
pernode=PerNode.REQUIRED,
|
|
122
|
+
help=trim("""
|
|
123
|
+
Metric tracking the peak IR drop in the design based on extracted
|
|
124
|
+
power and ground rail parasitics, library power models, and
|
|
125
|
+
switching activity. The switching activity calculated on a per
|
|
126
|
+
node basis is taken from one of three possible sources, in order
|
|
127
|
+
of priority: VCD file, SAIF file, 'activityfactor' parameter.""")))
|
|
128
|
+
|
|
129
|
+
for item, description in [
|
|
130
|
+
('holdpaths', 'hold'),
|
|
131
|
+
('setuppaths', 'setup')]:
|
|
132
|
+
schema.insert(
|
|
133
|
+
item,
|
|
134
|
+
Parameter(
|
|
135
|
+
'int',
|
|
136
|
+
scope=Scope.JOB,
|
|
137
|
+
shorthelp=f"Metric: {item}",
|
|
138
|
+
switch=f"-metric_{item} 'step index <int>'",
|
|
139
|
+
example=[
|
|
140
|
+
f"cli: -metric_{item} 'place 0 10'",
|
|
141
|
+
f"api: chip.set('metric', '{item}', 10, step='place', index=0)"],
|
|
142
|
+
pernode=PerNode.REQUIRED,
|
|
143
|
+
help=trim(f"""
|
|
144
|
+
Metric tracking the total number of timing paths violating {description}
|
|
145
|
+
constraints.""")))
|
|
146
|
+
|
|
147
|
+
for item, description in [
|
|
148
|
+
('holdslack', 'worst hold slack (positive or negative)'),
|
|
149
|
+
('holdwns', 'worst negative hold slack (positive values truncated to zero)'),
|
|
150
|
+
('holdtns', 'total negative hold slack (TNS)'),
|
|
151
|
+
('holdskew', 'hold clock skew'),
|
|
152
|
+
('setupslack', 'worst setup slack (positive or negative)'),
|
|
153
|
+
('setupwns', 'worst negative setup slack (positive values truncated to zero)'),
|
|
154
|
+
('setuptns', 'total negative setup slack (TNS)'),
|
|
155
|
+
('setupskew', 'setup clock skew')]:
|
|
156
|
+
schema.insert(
|
|
157
|
+
item,
|
|
158
|
+
Parameter(
|
|
159
|
+
'float',
|
|
160
|
+
unit='ns',
|
|
161
|
+
scope=Scope.JOB,
|
|
162
|
+
shorthelp=f"Metric: {item}",
|
|
163
|
+
switch=f"-metric_{item} 'step index <float>'",
|
|
164
|
+
example=[
|
|
165
|
+
f"cli: -metric_{item} 'place 0 0.01'",
|
|
166
|
+
f"api: chip.set('metric', '{item}', 0.01, step='place', index=0)"],
|
|
167
|
+
pernode=PerNode.REQUIRED,
|
|
168
|
+
help=trim(f"""
|
|
169
|
+
Metric tracking the {description} on a per step and index basis.""")))
|
|
170
|
+
|
|
171
|
+
for item, description in [
|
|
172
|
+
('fmax', 'maximum clock frequency')]:
|
|
173
|
+
schema.insert(
|
|
174
|
+
item,
|
|
175
|
+
Parameter(
|
|
176
|
+
'float',
|
|
177
|
+
unit='Hz',
|
|
178
|
+
scope=Scope.JOB,
|
|
179
|
+
shorthelp=f"Metric: {item}",
|
|
180
|
+
switch=f"-metric_{item} 'step index <float>'",
|
|
181
|
+
example=[
|
|
182
|
+
f"cli: -metric_{item} 'place 0 100e6'",
|
|
183
|
+
f"api: chip.set('metric', '{item}', 100e6, step='place', index=0)"],
|
|
184
|
+
pernode=PerNode.REQUIRED,
|
|
185
|
+
help=trim(f"""
|
|
186
|
+
Metric tracking the {description} on a per step and index basis.""")))
|
|
187
|
+
|
|
188
|
+
for item, description in [
|
|
189
|
+
('macros', 'macros'),
|
|
190
|
+
('cells', 'cell instances'),
|
|
191
|
+
('registers', 'register instances'),
|
|
192
|
+
('buffers', 'buffer instances'),
|
|
193
|
+
('inverters', 'inverter instances'),
|
|
194
|
+
('transistors', 'transistors'),
|
|
195
|
+
('pins', 'pins'),
|
|
196
|
+
('nets', 'nets'),
|
|
197
|
+
('vias', 'vias')]:
|
|
198
|
+
schema.insert(
|
|
199
|
+
item,
|
|
200
|
+
Parameter(
|
|
201
|
+
'int',
|
|
202
|
+
scope=Scope.JOB,
|
|
203
|
+
shorthelp=f"Metric: {item}",
|
|
204
|
+
switch=f"-metric_{item} 'step index <int>'",
|
|
205
|
+
example=[
|
|
206
|
+
f"cli: -metric_{item} 'place 0 100'",
|
|
207
|
+
f"api: chip.set('metric', '{item}', 50, step='place', index=0)"],
|
|
208
|
+
pernode=PerNode.REQUIRED,
|
|
209
|
+
help=trim(f"""
|
|
210
|
+
Metric tracking the total number of {description} in the design
|
|
211
|
+
on a per step and index basis.""")))
|
|
212
|
+
|
|
213
|
+
schema.insert(
|
|
214
|
+
'wirelength',
|
|
215
|
+
Parameter(
|
|
216
|
+
'float',
|
|
217
|
+
unit='um',
|
|
218
|
+
scope=Scope.JOB,
|
|
219
|
+
shorthelp="Metric: wirelength",
|
|
220
|
+
switch="-metric_wirelength 'step index <float>'",
|
|
221
|
+
example=[
|
|
222
|
+
"cli: -metric_wirelength 'place 0 100.0'",
|
|
223
|
+
"api: chip.set('metric', 'wirelength', 50.0, step='place', index=0)"],
|
|
224
|
+
pernode=PerNode.REQUIRED,
|
|
225
|
+
help=trim("""
|
|
226
|
+
Metric tracking the total wirelength of the design on a per step
|
|
227
|
+
and index basis.""")))
|
|
228
|
+
|
|
229
|
+
schema.insert(
|
|
230
|
+
'overflow',
|
|
231
|
+
Parameter(
|
|
232
|
+
'int',
|
|
233
|
+
scope=Scope.JOB,
|
|
234
|
+
shorthelp="Metric: overflow",
|
|
235
|
+
switch="-metric_overflow 'step index <int>'",
|
|
236
|
+
example=[
|
|
237
|
+
"cli: -metric_overflow 'place 0 0'",
|
|
238
|
+
"api: chip.set('metric', 'overflow', 50, step='place', index=0)"],
|
|
239
|
+
pernode=PerNode.REQUIRED,
|
|
240
|
+
help=trim("""
|
|
241
|
+
Metric tracking the total number of overflow tracks for the routing
|
|
242
|
+
on per step and index basis. Any non-zero number suggests an over
|
|
243
|
+
congested design. To analyze where the congestion is occurring
|
|
244
|
+
inspect the router log files for detailed per metal overflow
|
|
245
|
+
reporting and open up the design to find routing hotspots.""")))
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
from siliconcompiler import MetricSchema
|
|
2
|
+
|
|
3
|
+
from siliconcompiler.schema import EditableSchema, Parameter, Scope, PerNode
|
|
4
|
+
from siliconcompiler.schema.utils import trim
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class FPGAMetricsSchema(MetricSchema):
|
|
8
|
+
def __init__(self):
|
|
9
|
+
super().__init__()
|
|
10
|
+
|
|
11
|
+
schema = EditableSchema(self)
|
|
12
|
+
|
|
13
|
+
for item, description in [
|
|
14
|
+
('unconstrained', 'unconstrained timing paths')]:
|
|
15
|
+
schema.insert(
|
|
16
|
+
item,
|
|
17
|
+
Parameter(
|
|
18
|
+
'int',
|
|
19
|
+
scope=Scope.JOB,
|
|
20
|
+
shorthelp=f"Metric: total {item}",
|
|
21
|
+
switch=f"-metric_{item} 'step index <int>'",
|
|
22
|
+
example=[
|
|
23
|
+
f"cli: -metric_{item} 'dfm 0 0'",
|
|
24
|
+
f"api: chip.set('metric', '{item}', 0, step='dfm', index=0)"],
|
|
25
|
+
pernode=PerNode.REQUIRED,
|
|
26
|
+
help=trim(f"""Metric tracking the total number of {description} on a
|
|
27
|
+
per step and index basis.""")))
|
|
28
|
+
|
|
29
|
+
for item, description in [
|
|
30
|
+
('luts', 'FPGA LUTs used'),
|
|
31
|
+
('dsps', 'FPGA DSP slices used'),
|
|
32
|
+
('brams', 'FPGA BRAM tiles used')]:
|
|
33
|
+
schema.insert(
|
|
34
|
+
item,
|
|
35
|
+
Parameter(
|
|
36
|
+
'int',
|
|
37
|
+
scope=Scope.JOB,
|
|
38
|
+
shorthelp=f"Metric: {description}",
|
|
39
|
+
switch=f"-metric_{item} 'step index <int>'",
|
|
40
|
+
example=[
|
|
41
|
+
f"cli: -metric_{item} 'place 0 100'",
|
|
42
|
+
f"api: chip.set('metric', '{item}', 100, step='place', index=0)"],
|
|
43
|
+
pernode=PerNode.REQUIRED,
|
|
44
|
+
help=trim(f"""
|
|
45
|
+
Metric tracking the total {description} used by the design as reported
|
|
46
|
+
by the implementation tool. There is no standardized definition
|
|
47
|
+
for this metric across vendors, so metric comparisons can
|
|
48
|
+
generally only be done between runs on identical tools and
|
|
49
|
+
device families.""")))
|
|
50
|
+
|
|
51
|
+
schema.insert(
|
|
52
|
+
'utilization',
|
|
53
|
+
Parameter(
|
|
54
|
+
'float',
|
|
55
|
+
unit='%',
|
|
56
|
+
scope=Scope.JOB,
|
|
57
|
+
shorthelp="Metric: area utilization",
|
|
58
|
+
switch="-metric_utilization 'step index <float>'",
|
|
59
|
+
example=[
|
|
60
|
+
"cli: -metric_utilization 'place 0 50.00'",
|
|
61
|
+
"api: chip.set('metric', 'utilization', 50.00, step='place', index=0)"],
|
|
62
|
+
pernode=PerNode.REQUIRED,
|
|
63
|
+
help=trim("""
|
|
64
|
+
Metric tracking the area utilization of the design calculated as
|
|
65
|
+
100 * (cellarea/totalarea).""")))
|
|
66
|
+
|
|
67
|
+
schema.insert(
|
|
68
|
+
'logicdepth',
|
|
69
|
+
Parameter(
|
|
70
|
+
'int',
|
|
71
|
+
scope=Scope.JOB,
|
|
72
|
+
shorthelp="Metric: logic depth",
|
|
73
|
+
switch="-metric_logicdepth 'step index <int>'",
|
|
74
|
+
example=[
|
|
75
|
+
"cli: -metric_logicdepth 'place 0 8'",
|
|
76
|
+
"api: chip.set('metric', 'logicdepth', 8, step='place', index=0)"],
|
|
77
|
+
pernode=PerNode.REQUIRED,
|
|
78
|
+
help=trim("""
|
|
79
|
+
Metric tracking the logic depth of the design. This is determined
|
|
80
|
+
by the number of logic gates between the start of the critital timing
|
|
81
|
+
path to the end of the path.""")))
|
|
82
|
+
|
|
83
|
+
for item, description in [
|
|
84
|
+
('peakpower', 'worst case total peak power'),
|
|
85
|
+
('averagepower', 'average workload power'),
|
|
86
|
+
('leakagepower', 'leakage power with rails active but without any dynamic '
|
|
87
|
+
'switching activity')]:
|
|
88
|
+
schema.insert(
|
|
89
|
+
item,
|
|
90
|
+
Parameter(
|
|
91
|
+
'float',
|
|
92
|
+
unit='mw',
|
|
93
|
+
scope=Scope.JOB,
|
|
94
|
+
shorthelp=f"Metric: {item}",
|
|
95
|
+
switch=f"-metric_{item} 'step index <float>'",
|
|
96
|
+
example=[
|
|
97
|
+
f"cli: -metric_{item} 'place 0 0.01'",
|
|
98
|
+
f"api: chip.set('metric', '{item}', 0.01, step='place', index=0)"],
|
|
99
|
+
pernode=PerNode.REQUIRED,
|
|
100
|
+
help=trim(f"""
|
|
101
|
+
Metric tracking the {description} of the design specified on a per step
|
|
102
|
+
and index basis. Power metric depend heavily on the method
|
|
103
|
+
being used for extraction: dynamic vs static, workload
|
|
104
|
+
specification (vcd vs saif), power models, process/voltage/temperature.
|
|
105
|
+
The power {item} metric tries to capture the data that would
|
|
106
|
+
usually be reflected inside a datasheet given the appropriate
|
|
107
|
+
footnote conditions.""")))
|
|
108
|
+
|
|
109
|
+
for item, description in [
|
|
110
|
+
('holdpaths', 'hold'),
|
|
111
|
+
('setuppaths', 'setup')]:
|
|
112
|
+
schema.insert(
|
|
113
|
+
item,
|
|
114
|
+
Parameter(
|
|
115
|
+
'int',
|
|
116
|
+
scope=Scope.JOB,
|
|
117
|
+
shorthelp=f"Metric: {item}",
|
|
118
|
+
switch=f"-metric_{item} 'step index <int>'",
|
|
119
|
+
example=[
|
|
120
|
+
f"cli: -metric_{item} 'place 0 10'",
|
|
121
|
+
f"api: chip.set('metric', '{item}', 10, step='place', index=0)"],
|
|
122
|
+
pernode=PerNode.REQUIRED,
|
|
123
|
+
help=trim(f"""
|
|
124
|
+
Metric tracking the total number of timing paths violating {description}
|
|
125
|
+
constraints.""")))
|
|
126
|
+
|
|
127
|
+
for item, description in [
|
|
128
|
+
('holdslack', 'worst hold slack (positive or negative)'),
|
|
129
|
+
('holdwns', 'worst negative hold slack (positive values truncated to zero)'),
|
|
130
|
+
('holdtns', 'total negative hold slack (TNS)'),
|
|
131
|
+
('holdskew', 'hold clock skew'),
|
|
132
|
+
('setupslack', 'worst setup slack (positive or negative)'),
|
|
133
|
+
('setupwns', 'worst negative setup slack (positive values truncated to zero)'),
|
|
134
|
+
('setuptns', 'total negative setup slack (TNS)'),
|
|
135
|
+
('setupskew', 'setup clock skew')]:
|
|
136
|
+
schema.insert(
|
|
137
|
+
item,
|
|
138
|
+
Parameter(
|
|
139
|
+
'float',
|
|
140
|
+
unit='ns',
|
|
141
|
+
scope=Scope.JOB,
|
|
142
|
+
shorthelp=f"Metric: {item}",
|
|
143
|
+
switch=f"-metric_{item} 'step index <float>'",
|
|
144
|
+
example=[
|
|
145
|
+
f"cli: -metric_{item} 'place 0 0.01'",
|
|
146
|
+
f"api: chip.set('metric', '{item}', 0.01, step='place', index=0)"],
|
|
147
|
+
pernode=PerNode.REQUIRED,
|
|
148
|
+
help=trim(f"""
|
|
149
|
+
Metric tracking the {description} on a per step and index basis.""")))
|
|
150
|
+
|
|
151
|
+
for item, description in [
|
|
152
|
+
('fmax', 'maximum clock frequency')]:
|
|
153
|
+
schema.insert(
|
|
154
|
+
item,
|
|
155
|
+
Parameter(
|
|
156
|
+
'float',
|
|
157
|
+
unit='Hz',
|
|
158
|
+
scope=Scope.JOB,
|
|
159
|
+
shorthelp=f"Metric: {item}",
|
|
160
|
+
switch=f"-metric_{item} 'step index <float>'",
|
|
161
|
+
example=[
|
|
162
|
+
f"cli: -metric_{item} 'place 0 100e6'",
|
|
163
|
+
f"api: chip.set('metric', '{item}', 100e6, step='place', index=0)"],
|
|
164
|
+
pernode=PerNode.REQUIRED,
|
|
165
|
+
help=trim(f"""
|
|
166
|
+
Metric tracking the {description} on a per step and index basis.""")))
|
|
167
|
+
|
|
168
|
+
for item, description in [
|
|
169
|
+
('macros', 'macros'),
|
|
170
|
+
('cells', 'cell instances'),
|
|
171
|
+
('registers', 'register instances'),
|
|
172
|
+
('pins', 'pins'),
|
|
173
|
+
('nets', 'nets')]:
|
|
174
|
+
schema.insert(
|
|
175
|
+
item,
|
|
176
|
+
Parameter(
|
|
177
|
+
'int',
|
|
178
|
+
scope=Scope.JOB,
|
|
179
|
+
shorthelp=f"Metric: {item}",
|
|
180
|
+
switch=f"-metric_{item} 'step index <int>'",
|
|
181
|
+
example=[
|
|
182
|
+
f"cli: -metric_{item} 'place 0 100'",
|
|
183
|
+
f"api: chip.set('metric', '{item}', 50, step='place', index=0)"],
|
|
184
|
+
pernode=PerNode.REQUIRED,
|
|
185
|
+
help=trim(f"""
|
|
186
|
+
Metric tracking the total number of {description} in the design
|
|
187
|
+
on a per step and index basis.""")))
|
|
188
|
+
|
|
189
|
+
schema.insert(
|
|
190
|
+
'wirelength',
|
|
191
|
+
Parameter(
|
|
192
|
+
'float',
|
|
193
|
+
scope=Scope.JOB,
|
|
194
|
+
shorthelp="Metric: wirelength",
|
|
195
|
+
switch="-metric_wirelength 'step index <float>'",
|
|
196
|
+
example=[
|
|
197
|
+
"cli: -metric_wirelength 'place 0 100.0'",
|
|
198
|
+
"api: chip.set('metric', 'wirelength', 50.0, step='place', index=0)"],
|
|
199
|
+
pernode=PerNode.REQUIRED,
|
|
200
|
+
help=trim("""
|
|
201
|
+
Metric tracking the total wirelength of the design on a per step
|
|
202
|
+
and index basis.""")))
|
|
203
|
+
|
|
204
|
+
schema.insert(
|
|
205
|
+
'overflow',
|
|
206
|
+
Parameter(
|
|
207
|
+
'int',
|
|
208
|
+
scope=Scope.JOB,
|
|
209
|
+
shorthelp="Metric: overflow",
|
|
210
|
+
switch="-metric_overflow 'step index <int>'",
|
|
211
|
+
example=[
|
|
212
|
+
"cli: -metric_overflow 'place 0 0'",
|
|
213
|
+
"api: chip.set('metric', 'overflow', 50, step='place', index=0)"],
|
|
214
|
+
pernode=PerNode.REQUIRED,
|
|
215
|
+
help=trim("""
|
|
216
|
+
Metric tracking the total number of overflow tracks for the routing
|
|
217
|
+
on per step and index basis. Any non-zero number suggests an over
|
|
218
|
+
congested design. To analyze where the congestion is occurring
|
|
219
|
+
inspect the router log files for detailed per metal overflow
|
|
220
|
+
reporting and open up the design to find routing hotspots.""")))
|
|
@@ -157,7 +157,7 @@ class VizierOptimizier(Optimizer):
|
|
|
157
157
|
chip.graph(flow, org_flow, name=graph_name)
|
|
158
158
|
|
|
159
159
|
# Complete nodes
|
|
160
|
-
nodes = chip.
|
|
160
|
+
nodes = chip.get("flowgraph", org_flow, field="schema").get_nodes()
|
|
161
161
|
for step, _ in list(nodes):
|
|
162
162
|
nodes.append((step, None))
|
|
163
163
|
nodes = set(nodes)
|
|
@@ -167,7 +167,7 @@ class VizierOptimizier(Optimizer):
|
|
|
167
167
|
if key[0] == 'history':
|
|
168
168
|
continue
|
|
169
169
|
|
|
170
|
-
for value, step, index in chip.
|
|
170
|
+
for value, step, index in chip.get(*key, field=None).getvalues():
|
|
171
171
|
node = (step, index)
|
|
172
172
|
|
|
173
173
|
if node in nodes:
|