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.
Files changed (114) hide show
  1. siliconcompiler/__init__.py +14 -2
  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 +1 -1
  6. siliconcompiler/apps/sc_remote.py +3 -3
  7. siliconcompiler/apps/sc_show.py +3 -3
  8. siliconcompiler/apps/utils/replay.py +4 -4
  9. siliconcompiler/checklist.py +203 -2
  10. siliconcompiler/constraints/__init__.py +17 -0
  11. siliconcompiler/constraints/asic_component.py +378 -0
  12. siliconcompiler/constraints/asic_floorplan.py +449 -0
  13. siliconcompiler/constraints/asic_pins.py +489 -0
  14. siliconcompiler/constraints/asic_timing.py +517 -0
  15. siliconcompiler/core.py +31 -249
  16. siliconcompiler/data/templates/email/general.j2 +3 -3
  17. siliconcompiler/data/templates/email/summary.j2 +1 -1
  18. siliconcompiler/data/templates/issue/README.txt +1 -1
  19. siliconcompiler/data/templates/report/sc_report.j2 +7 -7
  20. siliconcompiler/dependencyschema.py +10 -174
  21. siliconcompiler/design.py +325 -114
  22. siliconcompiler/flowgraph.py +63 -15
  23. siliconcompiler/library.py +133 -0
  24. siliconcompiler/metric.py +94 -72
  25. siliconcompiler/metrics/__init__.py +7 -0
  26. siliconcompiler/metrics/asic.py +245 -0
  27. siliconcompiler/metrics/fpga.py +220 -0
  28. siliconcompiler/optimizer/vizier.py +2 -2
  29. siliconcompiler/package/__init__.py +138 -35
  30. siliconcompiler/package/github.py +6 -10
  31. siliconcompiler/packageschema.py +256 -12
  32. siliconcompiler/pathschema.py +226 -0
  33. siliconcompiler/pdk.py +5 -5
  34. siliconcompiler/project.py +459 -0
  35. siliconcompiler/remote/client.py +18 -12
  36. siliconcompiler/remote/server.py +2 -2
  37. siliconcompiler/report/dashboard/cli/__init__.py +6 -6
  38. siliconcompiler/report/dashboard/cli/board.py +3 -3
  39. siliconcompiler/report/dashboard/web/components/__init__.py +5 -5
  40. siliconcompiler/report/dashboard/web/components/flowgraph.py +4 -4
  41. siliconcompiler/report/dashboard/web/components/graph.py +2 -2
  42. siliconcompiler/report/dashboard/web/state.py +1 -1
  43. siliconcompiler/report/dashboard/web/utils/__init__.py +5 -5
  44. siliconcompiler/report/html_report.py +1 -1
  45. siliconcompiler/report/report.py +4 -4
  46. siliconcompiler/report/summary_table.py +2 -2
  47. siliconcompiler/report/utils.py +5 -5
  48. siliconcompiler/scheduler/docker.py +4 -10
  49. siliconcompiler/scheduler/run_node.py +4 -8
  50. siliconcompiler/scheduler/scheduler.py +18 -24
  51. siliconcompiler/scheduler/schedulernode.py +161 -143
  52. siliconcompiler/scheduler/send_messages.py +3 -3
  53. siliconcompiler/scheduler/slurm.py +5 -3
  54. siliconcompiler/scheduler/taskscheduler.py +10 -8
  55. siliconcompiler/schema/__init__.py +0 -2
  56. siliconcompiler/schema/baseschema.py +148 -26
  57. siliconcompiler/schema/editableschema.py +14 -6
  58. siliconcompiler/schema/journal.py +23 -15
  59. siliconcompiler/schema/namedschema.py +30 -4
  60. siliconcompiler/schema/parameter.py +34 -19
  61. siliconcompiler/schema/parametertype.py +2 -0
  62. siliconcompiler/schema/parametervalue.py +198 -15
  63. siliconcompiler/schema/schema_cfg.py +18 -14
  64. siliconcompiler/schema_obj.py +5 -3
  65. siliconcompiler/tool.py +591 -179
  66. siliconcompiler/tools/__init__.py +2 -0
  67. siliconcompiler/tools/builtin/_common.py +5 -5
  68. siliconcompiler/tools/builtin/concatenate.py +5 -5
  69. siliconcompiler/tools/builtin/minimum.py +4 -4
  70. siliconcompiler/tools/builtin/mux.py +4 -4
  71. siliconcompiler/tools/builtin/nop.py +4 -4
  72. siliconcompiler/tools/builtin/verify.py +7 -7
  73. siliconcompiler/tools/execute/exec_input.py +1 -1
  74. siliconcompiler/tools/genfasm/genfasm.py +1 -6
  75. siliconcompiler/tools/openroad/_apr.py +5 -1
  76. siliconcompiler/tools/openroad/antenna_repair.py +1 -1
  77. siliconcompiler/tools/openroad/macro_placement.py +1 -1
  78. siliconcompiler/tools/openroad/power_grid.py +1 -1
  79. siliconcompiler/tools/openroad/scripts/common/procs.tcl +5 -0
  80. siliconcompiler/tools/opensta/timing.py +26 -3
  81. siliconcompiler/tools/slang/__init__.py +2 -2
  82. siliconcompiler/tools/surfer/__init__.py +0 -0
  83. siliconcompiler/tools/surfer/show.py +53 -0
  84. siliconcompiler/tools/surfer/surfer.py +30 -0
  85. siliconcompiler/tools/vpr/route.py +27 -14
  86. siliconcompiler/tools/vpr/vpr.py +23 -6
  87. siliconcompiler/tools/yosys/__init__.py +1 -1
  88. siliconcompiler/tools/yosys/scripts/procs.tcl +143 -0
  89. siliconcompiler/tools/yosys/{sc_synth_asic.tcl → scripts/sc_synth_asic.tcl} +4 -0
  90. siliconcompiler/tools/yosys/{sc_synth_fpga.tcl → scripts/sc_synth_fpga.tcl} +24 -77
  91. siliconcompiler/tools/yosys/syn_fpga.py +14 -0
  92. siliconcompiler/toolscripts/_tools.json +9 -13
  93. siliconcompiler/toolscripts/rhel9/install-vpr.sh +0 -2
  94. siliconcompiler/toolscripts/ubuntu22/install-surfer.sh +33 -0
  95. siliconcompiler/toolscripts/ubuntu24/install-surfer.sh +33 -0
  96. siliconcompiler/utils/__init__.py +2 -1
  97. siliconcompiler/utils/flowgraph.py +24 -23
  98. siliconcompiler/utils/issue.py +23 -29
  99. siliconcompiler/utils/logging.py +35 -6
  100. siliconcompiler/utils/showtools.py +6 -1
  101. {siliconcompiler-0.34.0.dist-info → siliconcompiler-0.34.2.dist-info}/METADATA +15 -25
  102. {siliconcompiler-0.34.0.dist-info → siliconcompiler-0.34.2.dist-info}/RECORD +109 -97
  103. siliconcompiler/schema/packageschema.py +0 -101
  104. siliconcompiler/tools/yosys/procs.tcl +0 -71
  105. siliconcompiler/toolscripts/rhel9/install-yosys-parmys.sh +0 -68
  106. siliconcompiler/toolscripts/ubuntu22/install-yosys-parmys.sh +0 -68
  107. siliconcompiler/toolscripts/ubuntu24/install-yosys-parmys.sh +0 -68
  108. /siliconcompiler/tools/yosys/{sc_lec.tcl → scripts/sc_lec.tcl} +0 -0
  109. /siliconcompiler/tools/yosys/{sc_screenshot.tcl → scripts/sc_screenshot.tcl} +0 -0
  110. /siliconcompiler/tools/yosys/{syn_strategies.tcl → scripts/syn_strategies.tcl} +0 -0
  111. {siliconcompiler-0.34.0.dist-info → siliconcompiler-0.34.2.dist-info}/WHEEL +0 -0
  112. {siliconcompiler-0.34.0.dist-info → siliconcompiler-0.34.2.dist-info}/entry_points.txt +0 -0
  113. {siliconcompiler-0.34.0.dist-info → siliconcompiler-0.34.2.dist-info}/licenses/LICENSE +0 -0
  114. {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.schema.get("flowgraph", org_flow, field="schema").get_nodes()
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.schema.get(*key, field=None).getvalues():
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: