siliconcompiler 0.32.3__py3-none-any.whl → 0.33.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- siliconcompiler/__init__.py +19 -2
- siliconcompiler/_metadata.py +1 -1
- siliconcompiler/apps/sc.py +2 -2
- siliconcompiler/apps/sc_install.py +3 -3
- siliconcompiler/apps/sc_issue.py +1 -1
- siliconcompiler/apps/sc_remote.py +4 -4
- siliconcompiler/apps/sc_show.py +2 -2
- siliconcompiler/apps/utils/replay.py +5 -3
- siliconcompiler/asic.py +120 -0
- siliconcompiler/checklist.py +150 -0
- siliconcompiler/core.py +267 -289
- siliconcompiler/flowgraph.py +803 -515
- siliconcompiler/fpga.py +84 -0
- siliconcompiler/metric.py +420 -0
- siliconcompiler/optimizer/vizier.py +2 -3
- siliconcompiler/package/__init__.py +29 -6
- siliconcompiler/pdk.py +415 -0
- siliconcompiler/record.py +449 -0
- siliconcompiler/remote/client.py +6 -3
- siliconcompiler/remote/schema.py +116 -112
- siliconcompiler/remote/server.py +3 -5
- siliconcompiler/report/dashboard/cli/__init__.py +13 -722
- siliconcompiler/report/dashboard/cli/board.py +895 -0
- siliconcompiler/report/dashboard/web/__init__.py +10 -10
- siliconcompiler/report/dashboard/web/components/__init__.py +5 -4
- siliconcompiler/report/dashboard/web/components/flowgraph.py +3 -3
- siliconcompiler/report/dashboard/web/components/graph.py +6 -3
- siliconcompiler/report/dashboard/web/state.py +1 -1
- siliconcompiler/report/dashboard/web/utils/__init__.py +4 -3
- siliconcompiler/report/html_report.py +2 -3
- siliconcompiler/report/report.py +13 -7
- siliconcompiler/report/summary_image.py +1 -1
- siliconcompiler/report/summary_table.py +3 -3
- siliconcompiler/report/utils.py +11 -10
- siliconcompiler/scheduler/__init__.py +145 -280
- siliconcompiler/scheduler/run_node.py +2 -1
- siliconcompiler/scheduler/send_messages.py +4 -4
- siliconcompiler/scheduler/slurm.py +2 -2
- siliconcompiler/schema/__init__.py +19 -2
- siliconcompiler/schema/baseschema.py +493 -0
- siliconcompiler/schema/cmdlineschema.py +250 -0
- siliconcompiler/{sphinx_ext → schema/docs}/__init__.py +3 -1
- siliconcompiler/{sphinx_ext → schema/docs}/dynamicgen.py +63 -81
- siliconcompiler/{sphinx_ext → schema/docs}/schemagen.py +73 -85
- siliconcompiler/{sphinx_ext → schema/docs}/utils.py +12 -13
- siliconcompiler/schema/editableschema.py +136 -0
- siliconcompiler/schema/journalingschema.py +238 -0
- siliconcompiler/schema/namedschema.py +41 -0
- siliconcompiler/schema/packageschema.py +101 -0
- siliconcompiler/schema/parameter.py +791 -0
- siliconcompiler/schema/parametertype.py +323 -0
- siliconcompiler/schema/parametervalue.py +736 -0
- siliconcompiler/schema/safeschema.py +37 -0
- siliconcompiler/schema/schema_cfg.py +109 -1789
- siliconcompiler/schema/utils.py +5 -68
- siliconcompiler/schema_obj.py +119 -0
- siliconcompiler/tool.py +1308 -0
- siliconcompiler/tools/_common/__init__.py +6 -10
- siliconcompiler/tools/_common/sdc/sc_constraints.sdc +1 -1
- siliconcompiler/tools/bluespec/convert.py +7 -7
- siliconcompiler/tools/builtin/_common.py +1 -1
- siliconcompiler/tools/builtin/concatenate.py +2 -2
- siliconcompiler/tools/builtin/minimum.py +1 -1
- siliconcompiler/tools/builtin/mux.py +2 -1
- siliconcompiler/tools/builtin/nop.py +1 -1
- siliconcompiler/tools/builtin/verify.py +6 -4
- siliconcompiler/tools/chisel/convert.py +4 -4
- siliconcompiler/tools/genfasm/bitstream.py +3 -3
- siliconcompiler/tools/ghdl/convert.py +1 -1
- siliconcompiler/tools/icarus/compile.py +4 -4
- siliconcompiler/tools/icepack/bitstream.py +6 -1
- siliconcompiler/tools/klayout/convert_drc_db.py +5 -0
- siliconcompiler/tools/klayout/klayout_export.py +0 -1
- siliconcompiler/tools/klayout/klayout_utils.py +3 -10
- siliconcompiler/tools/nextpnr/apr.py +6 -1
- siliconcompiler/tools/nextpnr/nextpnr.py +4 -4
- siliconcompiler/tools/openroad/_apr.py +13 -0
- siliconcompiler/tools/openroad/rdlroute.py +3 -3
- siliconcompiler/tools/openroad/scripts/apr/postamble.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/apr/preamble.tcl +5 -5
- siliconcompiler/tools/openroad/scripts/apr/sc_antenna_repair.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_clock_tree_synthesis.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_detailed_placement.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_detailed_route.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_endcap_tapcell_insertion.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_fillercell_insertion.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_fillmetal_insertion.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_global_placement.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_global_route.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_init_floorplan.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_macro_placement.tcl +3 -3
- siliconcompiler/tools/openroad/scripts/apr/sc_metrics.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_pin_placement.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_power_grid.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_repair_design.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_repair_timing.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_write_data.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/common/procs.tcl +57 -1
- siliconcompiler/tools/openroad/scripts/common/screenshot.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/common/write_images.tcl +28 -3
- siliconcompiler/tools/openroad/scripts/sc_rcx.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/sc_rdlroute.tcl +3 -3
- siliconcompiler/tools/openroad/scripts/sc_show.tcl +6 -6
- siliconcompiler/tools/slang/__init__.py +10 -10
- siliconcompiler/tools/surelog/parse.py +4 -4
- siliconcompiler/tools/sv2v/convert.py +20 -3
- siliconcompiler/tools/verilator/compile.py +2 -2
- siliconcompiler/tools/verilator/verilator.py +3 -3
- siliconcompiler/tools/vpr/place.py +1 -1
- siliconcompiler/tools/vpr/route.py +4 -4
- siliconcompiler/tools/vpr/screenshot.py +1 -1
- siliconcompiler/tools/vpr/show.py +5 -5
- siliconcompiler/tools/vpr/vpr.py +24 -24
- siliconcompiler/tools/xdm/convert.py +2 -2
- siliconcompiler/tools/xyce/simulate.py +1 -1
- siliconcompiler/tools/yosys/sc_synth_asic.tcl +74 -68
- siliconcompiler/tools/yosys/syn_asic.py +2 -2
- siliconcompiler/toolscripts/_tools.json +7 -7
- siliconcompiler/toolscripts/ubuntu22/install-vpr.sh +0 -2
- siliconcompiler/toolscripts/ubuntu24/install-vpr.sh +0 -2
- siliconcompiler/utils/__init__.py +8 -112
- siliconcompiler/utils/flowgraph.py +339 -0
- siliconcompiler/{issue.py → utils/issue.py} +4 -3
- siliconcompiler/utils/logging.py +1 -2
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/METADATA +9 -8
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/RECORD +151 -134
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/WHEEL +1 -1
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/entry_points.txt +8 -8
- siliconcompiler/schema/schema_obj.py +0 -1936
- siliconcompiler/toolscripts/ubuntu20/install-vpr.sh +0 -29
- siliconcompiler/toolscripts/ubuntu20/install-yosys-parmys.sh +0 -61
- /siliconcompiler/{templates → data/templates}/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/email/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/email/general.j2 +0 -0
- /siliconcompiler/{templates → data/templates}/email/summary.j2 +0 -0
- /siliconcompiler/{templates → data/templates}/issue/README.txt +0 -0
- /siliconcompiler/{templates → data/templates}/issue/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/issue/run.sh +0 -0
- /siliconcompiler/{templates → data/templates}/replay/replay.py.j2 +0 -0
- /siliconcompiler/{templates → data/templates}/replay/replay.sh.j2 +0 -0
- /siliconcompiler/{templates → data/templates}/replay/requirements.txt +0 -0
- /siliconcompiler/{templates → data/templates}/replay/setup.sh +0 -0
- /siliconcompiler/{templates → data/templates}/report/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/report/bootstrap.min.css +0 -0
- /siliconcompiler/{templates → data/templates}/report/bootstrap.min.js +0 -0
- /siliconcompiler/{templates → data/templates}/report/bootstrap_LICENSE.md +0 -0
- /siliconcompiler/{templates → data/templates}/report/sc_report.j2 +0 -0
- /siliconcompiler/{templates → data/templates}/slurm/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/slurm/run.sh +0 -0
- /siliconcompiler/{templates → data/templates}/tcl/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/tcl/manifest.tcl.j2 +0 -0
- /siliconcompiler/{units.py → utils/units.py} +0 -0
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/licenses/LICENSE +0 -0
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/top_level.txt +0 -0
|
@@ -1,16 +1,9 @@
|
|
|
1
1
|
# Copyright 2022 Silicon Compiler Authors. All Rights Reserved.
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
from . import EditableSchema, Parameter, Scope, PerNode
|
|
4
|
+
from .utils import trim
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
# (such as KLayout) directly importing the schema package. However, the fallback
|
|
7
|
-
# allows running this script directly to generate defaults.json.
|
|
8
|
-
try:
|
|
9
|
-
from .utils import trim, Scope, PerNode
|
|
10
|
-
except ImportError:
|
|
11
|
-
from siliconcompiler.schema.utils import trim, Scope, PerNode
|
|
12
|
-
|
|
13
|
-
SCHEMA_VERSION = '0.50.0'
|
|
6
|
+
SCHEMA_VERSION = '0.51.3'
|
|
14
7
|
|
|
15
8
|
|
|
16
9
|
#############################################################################
|
|
@@ -32,94 +25,29 @@ def scparam(cfg,
|
|
|
32
25
|
switch=None,
|
|
33
26
|
example=None,
|
|
34
27
|
schelp=None,
|
|
35
|
-
enum=None,
|
|
36
28
|
pernode=PerNode.NEVER):
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
lock=lock,
|
|
54
|
-
hashalgo=hashalgo,
|
|
55
|
-
signature=signature,
|
|
56
|
-
notes=notes,
|
|
57
|
-
unit=unit,
|
|
58
|
-
shorthelp=shorthelp,
|
|
59
|
-
switch=switch,
|
|
60
|
-
example=example,
|
|
61
|
-
schelp=schelp,
|
|
62
|
-
enum=enum,
|
|
63
|
-
pernode=pernode)
|
|
64
|
-
else:
|
|
65
|
-
|
|
66
|
-
# removing leading spaces as if schelp were a docstring
|
|
67
|
-
schelp = trim(schelp)
|
|
68
|
-
|
|
69
|
-
# setting values based on types
|
|
70
|
-
# note (bools are never lists)
|
|
71
|
-
if sctype == 'bool':
|
|
72
|
-
if defvalue is None:
|
|
73
|
-
defvalue = False
|
|
74
|
-
if '[' in sctype:
|
|
75
|
-
if signature is None:
|
|
76
|
-
signature = []
|
|
77
|
-
if defvalue is None:
|
|
78
|
-
defvalue = []
|
|
79
|
-
|
|
80
|
-
# mandatory for all
|
|
81
|
-
cfg['type'] = str(sctype)
|
|
82
|
-
cfg['scope'] = Scope(scope).value
|
|
83
|
-
cfg['require'] = bool(require)
|
|
84
|
-
cfg['lock'] = bool(lock)
|
|
85
|
-
if switch and not isinstance(switch, list):
|
|
86
|
-
switch = [switch]
|
|
87
|
-
cfg['switch'] = [str(s) for s in switch] if switch else None
|
|
88
|
-
cfg['shorthelp'] = str(shorthelp) if shorthelp else None
|
|
89
|
-
cfg['example'] = [str(e) for e in example] if example else None
|
|
90
|
-
cfg['help'] = str(schelp) if schelp else None
|
|
91
|
-
cfg['notes'] = str(notes) if notes else None
|
|
92
|
-
# never, optional, required
|
|
93
|
-
cfg['pernode'] = PerNode(pernode).value
|
|
94
|
-
cfg['node'] = {}
|
|
95
|
-
cfg['node']['default'] = {}
|
|
96
|
-
cfg['node']['default']['default'] = {}
|
|
97
|
-
cfg['node']['default']['default']['value'] = defvalue
|
|
98
|
-
cfg['node']['default']['default']['signature'] = signature
|
|
99
|
-
|
|
100
|
-
if enum is not None:
|
|
101
|
-
cfg['enum'] = [str(e) for e in enum]
|
|
102
|
-
|
|
103
|
-
# unit for floats/ints
|
|
104
|
-
if unit is not None:
|
|
105
|
-
cfg['unit'] = str(unit)
|
|
106
|
-
|
|
107
|
-
if 'dir' in sctype or 'file' in sctype:
|
|
108
|
-
cfg['hashalgo'] = str(hashalgo)
|
|
109
|
-
cfg['copy'] = bool(copy)
|
|
110
|
-
cfg['node']['default']['default']['filehash'] = []
|
|
111
|
-
cfg['node']['default']['default']['package'] = []
|
|
112
|
-
|
|
113
|
-
# file only values
|
|
114
|
-
if 'file' in sctype:
|
|
115
|
-
cfg['node']['default']['default']['date'] = []
|
|
116
|
-
cfg['node']['default']['default']['author'] = []
|
|
29
|
+
cfg.insert(*keypath, Parameter(
|
|
30
|
+
sctype,
|
|
31
|
+
require=require,
|
|
32
|
+
defvalue=defvalue,
|
|
33
|
+
scope=scope,
|
|
34
|
+
copy=copy,
|
|
35
|
+
lock=lock,
|
|
36
|
+
hashalgo=hashalgo,
|
|
37
|
+
notes=notes,
|
|
38
|
+
unit=unit,
|
|
39
|
+
shorthelp=shorthelp,
|
|
40
|
+
switch=switch,
|
|
41
|
+
example=example,
|
|
42
|
+
help=trim(schelp),
|
|
43
|
+
pernode=pernode
|
|
44
|
+
))
|
|
117
45
|
|
|
118
46
|
|
|
119
47
|
#############################################################################
|
|
120
48
|
# CHIP CONFIGURATION
|
|
121
49
|
#############################################################################
|
|
122
|
-
def schema_cfg():
|
|
50
|
+
def schema_cfg(schema):
|
|
123
51
|
'''Method for defining Chip configuration schema
|
|
124
52
|
All the keys defined in this dictionary are reserved words.
|
|
125
53
|
'''
|
|
@@ -129,11 +57,7 @@ def schema_cfg():
|
|
|
129
57
|
# Software version syncs with SC releases (from _metadata)
|
|
130
58
|
|
|
131
59
|
# Basic schema setup
|
|
132
|
-
cfg =
|
|
133
|
-
|
|
134
|
-
# Place holder dictionaries updated by core methods()
|
|
135
|
-
cfg['history'] = {}
|
|
136
|
-
cfg['library'] = {}
|
|
60
|
+
cfg = EditableSchema(schema)
|
|
137
61
|
|
|
138
62
|
scparam(cfg, ['schemaversion'],
|
|
139
63
|
sctype='str',
|
|
@@ -196,7 +120,6 @@ def schema_cfg():
|
|
|
196
120
|
|
|
197
121
|
# Tool flows
|
|
198
122
|
cfg = schema_tool(cfg)
|
|
199
|
-
cfg = schema_task(cfg)
|
|
200
123
|
cfg = schema_flowgraph(cfg)
|
|
201
124
|
|
|
202
125
|
# Metrics
|
|
@@ -213,16 +136,14 @@ def schema_cfg():
|
|
|
213
136
|
# Packaging
|
|
214
137
|
cfg = schema_schematic(cfg)
|
|
215
138
|
|
|
216
|
-
return cfg
|
|
217
|
-
|
|
218
139
|
|
|
219
140
|
###############################################################################
|
|
220
141
|
# SCHEMATIC
|
|
221
142
|
###############################################################################
|
|
222
|
-
def schema_schematic(cfg
|
|
143
|
+
def schema_schematic(cfg):
|
|
223
144
|
''' Schematic
|
|
224
145
|
'''
|
|
225
|
-
|
|
146
|
+
name = 'default'
|
|
226
147
|
scparam(cfg, ['schematic', 'component', name, 'partname'],
|
|
227
148
|
sctype='str',
|
|
228
149
|
shorthelp="Schematic: component model",
|
|
@@ -232,8 +153,7 @@ def schema_schematic(cfg, name='default'):
|
|
|
232
153
|
schelp="""Component part-name ("aka cell-name") specified on a per instance basis.""")
|
|
233
154
|
|
|
234
155
|
scparam(cfg, ['schematic', 'pin', name, 'dir'],
|
|
235
|
-
sctype='
|
|
236
|
-
enum=['input', 'output', 'inout'],
|
|
156
|
+
sctype='<input,output,inout>',
|
|
237
157
|
shorthelp="Schematic: pin direction",
|
|
238
158
|
switch="-schematic_pin_dir 'name <str>'",
|
|
239
159
|
example=["cli: -schematic_pin_dir 'A input'",
|
|
@@ -282,444 +202,38 @@ def schema_schematic(cfg, name='default'):
|
|
|
282
202
|
# FPGA
|
|
283
203
|
###############################################################################
|
|
284
204
|
def schema_fpga(cfg):
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
partname = 'default'
|
|
289
|
-
key = 'default'
|
|
290
|
-
|
|
291
|
-
scparam(cfg, ['fpga', 'partname'],
|
|
292
|
-
sctype='str',
|
|
293
|
-
shorthelp="FPGA: part name",
|
|
294
|
-
switch="-fpga_partname <str>",
|
|
295
|
-
example=["cli: -fpga_partname fpga64k",
|
|
296
|
-
"api: chip.set('fpga', 'partname', 'fpga64k')"],
|
|
297
|
-
schelp="""
|
|
298
|
-
Complete part name used as a device target by the FPGA compilation
|
|
299
|
-
tool. The part name must be an exact string match to the partname
|
|
300
|
-
hard coded within the FPGA EDA tool.""")
|
|
301
|
-
|
|
302
|
-
scparam(cfg, ['fpga', partname, 'vendor'],
|
|
303
|
-
sctype='str',
|
|
304
|
-
shorthelp="FPGA: vendor name",
|
|
305
|
-
switch="-fpga_vendor 'partname <str>'",
|
|
306
|
-
example=["cli: -fpga_vendor 'fpga64k acme'",
|
|
307
|
-
"api: chip.set('fpga', 'fpga64k', 'vendor', 'acme')"],
|
|
308
|
-
schelp="""
|
|
309
|
-
Name of the FPGA vendor for the FPGA partname.""")
|
|
310
|
-
|
|
311
|
-
scparam(cfg, ['fpga', partname, 'lutsize'],
|
|
312
|
-
sctype='int',
|
|
313
|
-
shorthelp="FPGA: lutsize",
|
|
314
|
-
switch="-fpga_lutsize 'partname <int>'",
|
|
315
|
-
example=["cli: -fpga_lutsize 'fpga64k 4'",
|
|
316
|
-
"api: chip.set('fpga', 'fpga64k', 'lutsize', '4')"],
|
|
317
|
-
schelp="""
|
|
318
|
-
Specify the number of inputs in each lookup table (LUT) for the
|
|
319
|
-
FPGA partname. For architectures with fracturable LUTs, this is
|
|
320
|
-
the number of inputs of the unfractured LUT.""")
|
|
321
|
-
|
|
322
|
-
scparam(cfg, ['fpga', partname, 'file', key],
|
|
323
|
-
sctype='[file]',
|
|
324
|
-
scope=Scope.GLOBAL,
|
|
325
|
-
shorthelp="FPGA: file",
|
|
326
|
-
switch="-fpga_file 'partname key <file>'",
|
|
327
|
-
example=["cli: -fpga_file 'fpga64k file archfile my_arch.xml'",
|
|
328
|
-
"api: chip.set('fpga', 'fpga64k', 'file', 'archfile', 'my_arch.xml')"],
|
|
329
|
-
schelp="""
|
|
330
|
-
Specify a file for the FPGA partname.""")
|
|
331
|
-
|
|
332
|
-
scparam(cfg, ['fpga', partname, 'var', key],
|
|
333
|
-
sctype='[str]',
|
|
334
|
-
shorthelp="FPGA: var",
|
|
335
|
-
switch="-fpga_var 'partname key <str>'",
|
|
336
|
-
example=["cli: -fpga_var 'fpga64k channelwidth 100'",
|
|
337
|
-
"api: chip.set('fpga', 'fpga64k', 'var', 'channelwidth', '100')"],
|
|
338
|
-
schelp="""
|
|
339
|
-
Specify a variable value for the FPGA partname.""")
|
|
340
|
-
|
|
205
|
+
from siliconcompiler.fpga import FPGASchema
|
|
206
|
+
cfg.insert("fpga", FPGASchema())
|
|
341
207
|
return cfg
|
|
342
208
|
|
|
343
209
|
|
|
344
210
|
###############################################################################
|
|
345
211
|
# PDK
|
|
346
212
|
###############################################################################
|
|
347
|
-
def schema_pdk(cfg
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
tool = 'default'
|
|
352
|
-
filetype = 'default'
|
|
353
|
-
pdkname = 'default'
|
|
354
|
-
|
|
355
|
-
scparam(cfg, ['pdk', pdkname, 'foundry'],
|
|
356
|
-
sctype='str',
|
|
357
|
-
scope=Scope.GLOBAL,
|
|
358
|
-
shorthelp="PDK: foundry name",
|
|
359
|
-
switch="-pdk_foundry 'pdkname <str>'",
|
|
360
|
-
example=["cli: -pdk_foundry 'asap7 virtual'",
|
|
361
|
-
"api: chip.set('pdk', 'asap7', 'foundry', 'virtual')"],
|
|
362
|
-
schelp="""
|
|
363
|
-
Name of foundry corporation. Examples include intel, gf, tsmc,
|
|
364
|
-
samsung, skywater, virtual. The \'virtual\' keyword is reserved for
|
|
365
|
-
simulated non-manufacturable processes.""")
|
|
366
|
-
|
|
367
|
-
scparam(cfg, ['pdk', pdkname, 'node'],
|
|
368
|
-
sctype='float',
|
|
369
|
-
scope=Scope.GLOBAL,
|
|
370
|
-
unit='nm',
|
|
371
|
-
shorthelp="PDK: process node",
|
|
372
|
-
switch="-pdk_node 'pdkname <float>'",
|
|
373
|
-
example=["cli: -pdk_node 'asap7 130'",
|
|
374
|
-
"api: chip.set('pdk', 'asap7', 'node', 130)"],
|
|
375
|
-
schelp="""
|
|
376
|
-
Approximate relative minimum dimension of the process target specified
|
|
377
|
-
in nanometers. The parameter is required for flows and tools that
|
|
378
|
-
leverage the value to drive technology dependent synthesis and APR
|
|
379
|
-
optimization. Node examples include 180, 130, 90, 65, 45, 32, 22 14,
|
|
380
|
-
10, 7, 5, 3.""")
|
|
381
|
-
|
|
382
|
-
scparam(cfg, ['pdk', pdkname, 'version'],
|
|
383
|
-
sctype='str',
|
|
384
|
-
scope=Scope.GLOBAL,
|
|
385
|
-
shorthelp="PDK: version",
|
|
386
|
-
switch="-pdk_version 'pdkname <str>'",
|
|
387
|
-
example=["cli: -pdk_version 'asap7 1.0'",
|
|
388
|
-
"api: chip.set('pdk', 'asap7', 'version', '1.0')"],
|
|
389
|
-
schelp="""
|
|
390
|
-
Alphanumeric string specifying the version of the PDK. Verification of
|
|
391
|
-
correct PDK and IP versions is a hard ASIC tapeout require in all
|
|
392
|
-
commercial foundries. The version number can be used for design manifest
|
|
393
|
-
tracking and tapeout checklists.""")
|
|
394
|
-
|
|
395
|
-
scparam(cfg, ['pdk', pdkname, 'stackup'],
|
|
396
|
-
sctype='[str]',
|
|
397
|
-
scope=Scope.GLOBAL,
|
|
398
|
-
shorthelp="PDK: metal stackups",
|
|
399
|
-
switch="-pdk_stackup 'pdkname <str>'",
|
|
400
|
-
example=["cli: -pdk_stackup 'asap7 2MA4MB2MC'",
|
|
401
|
-
"api: chip.add('pdk', 'asap7', 'stackup', '2MA4MB2MC')"],
|
|
402
|
-
schelp="""
|
|
403
|
-
List of all metal stackups offered in the process node. Older process
|
|
404
|
-
nodes may only offer a single metal stackup, while advanced nodes
|
|
405
|
-
offer a large but finite list of metal stacks with varying combinations
|
|
406
|
-
of metal line pitches and thicknesses. Stackup naming is unique to a
|
|
407
|
-
foundry, but is generally a long string or code. For example, a 10
|
|
408
|
-
metal stackup with two 1x wide, four 2x wide, and 4x wide metals,
|
|
409
|
-
might be identified as 2MA4MB2MC, where MA, MB, and MC denote wiring
|
|
410
|
-
layers with different properties (thickness, width, space). Each
|
|
411
|
-
stackup will come with its own set of routing technology files and
|
|
412
|
-
parasitic models specified in the pdk_pexmodel and pdk_aprtech
|
|
413
|
-
parameters.""")
|
|
414
|
-
|
|
415
|
-
scparam(cfg, ['pdk', pdkname, 'minlayer', stackup],
|
|
416
|
-
sctype='str',
|
|
417
|
-
scope=Scope.GLOBAL,
|
|
418
|
-
shorthelp="PDK: minimum routing layer",
|
|
419
|
-
switch="-pdk_minlayer 'pdk stackup <str>'",
|
|
420
|
-
example=[
|
|
421
|
-
"cli: -pdk_minlayer 'asap7 2MA4MB2MC M2'",
|
|
422
|
-
"api: chip.set('pdk', 'asap7', 'minlayer', '2MA4MB2MC', 'M2')"],
|
|
423
|
-
schelp="""
|
|
424
|
-
Minimum metal layer to be used for automated place and route
|
|
425
|
-
specified on a per stackup basis.""")
|
|
426
|
-
|
|
427
|
-
scparam(cfg, ['pdk', pdkname, 'maxlayer', stackup],
|
|
428
|
-
sctype='str',
|
|
429
|
-
scope=Scope.GLOBAL,
|
|
430
|
-
shorthelp="PDK: maximum routing layer",
|
|
431
|
-
switch="-pdk_maxlayer 'pdk stackup <str>'",
|
|
432
|
-
example=[
|
|
433
|
-
"cli: -pdk_maxlayer 'asap7 2MA4MB2MC M8'",
|
|
434
|
-
"api: chip.set('pdk', 'asap7', 'maxlayer', 'MA4MB2MC', 'M8')"],
|
|
435
|
-
schelp="""
|
|
436
|
-
Maximum metal layer to be used for automated place and route
|
|
437
|
-
specified on a per stackup basis.""")
|
|
438
|
-
|
|
439
|
-
scparam(cfg, ['pdk', pdkname, 'wafersize'],
|
|
440
|
-
sctype='float',
|
|
441
|
-
scope=Scope.GLOBAL,
|
|
442
|
-
unit='mm',
|
|
443
|
-
shorthelp="PDK: wafer size",
|
|
444
|
-
switch="-pdk_wafersize 'pdkname <float>'",
|
|
445
|
-
example=["cli: -pdk_wafersize 'asap7 300'",
|
|
446
|
-
"api: chip.set('pdk', 'asap7', 'wafersize', 300)"],
|
|
447
|
-
schelp="""
|
|
448
|
-
Wafer diameter used in wafer based manufacturing process.
|
|
449
|
-
The standard diameter for leading edge manufacturing is 300mm. For
|
|
450
|
-
older process technologies and specialty fabs, smaller diameters
|
|
451
|
-
such as 200, 150, 125, and 100 are common. The value is used to
|
|
452
|
-
calculate dies per wafer and full factory chip costs.""")
|
|
453
|
-
|
|
454
|
-
scparam(cfg, ['pdk', pdkname, 'panelsize'],
|
|
455
|
-
sctype='[(float,float)]',
|
|
456
|
-
scope=Scope.GLOBAL,
|
|
457
|
-
unit='mm',
|
|
458
|
-
shorthelp="PDK: panel size",
|
|
459
|
-
switch="-pdk_panelsize 'pdkname <(float,float)>'",
|
|
460
|
-
example=[
|
|
461
|
-
"cli: -pdk_panelsize 'asap7 (45.72,60.96)'",
|
|
462
|
-
"api: chip.set('pdk', 'asap7', 'panelsize', (45.72, 60.96))"],
|
|
463
|
-
schelp="""
|
|
464
|
-
List of panel sizes supported in the manufacturing process.
|
|
465
|
-
""")
|
|
466
|
-
|
|
467
|
-
scparam(cfg, ['pdk', pdkname, 'unitcost'],
|
|
468
|
-
sctype='float',
|
|
469
|
-
scope=Scope.GLOBAL,
|
|
470
|
-
unit='USD',
|
|
471
|
-
shorthelp="PDK: unit cost",
|
|
472
|
-
switch="-pdk_unitcost 'pdkname <float>'",
|
|
473
|
-
example=["cli: -pdk_unitcost 'asap7 10000'",
|
|
474
|
-
"api: chip.set('pdk', 'asap7', 'unitcost', 10000)"],
|
|
475
|
-
schelp="""
|
|
476
|
-
Raw cost per unit shipped by the factory, not accounting for yield
|
|
477
|
-
loss.""")
|
|
478
|
-
|
|
479
|
-
scparam(cfg, ['pdk', pdkname, 'd0'],
|
|
480
|
-
sctype='float',
|
|
481
|
-
scope=Scope.GLOBAL,
|
|
482
|
-
shorthelp="PDK: process defect density",
|
|
483
|
-
switch="-pdk_d0 'pdkname <float>'",
|
|
484
|
-
example=["cli: -pdk_d0 'asap7 0.1'",
|
|
485
|
-
"api: chip.set('pdk', 'asap7', 'd0', 0.1)"],
|
|
486
|
-
schelp="""
|
|
487
|
-
Process defect density (d0) expressed as random defects per cm^2. The
|
|
488
|
-
value is used to calculate yield losses as a function of area, which in
|
|
489
|
-
turn affects the chip full factory costs. Two yield models are
|
|
490
|
-
supported: Poisson (default), and Murphy. The Poisson based yield is
|
|
491
|
-
calculated as dy = exp(-area * d0/100). The Murphy based yield is
|
|
492
|
-
calculated as dy = ((1-exp(-area * d0/100))/(area * d0/100))^2.""")
|
|
493
|
-
|
|
494
|
-
scparam(cfg, ['pdk', pdkname, 'scribe'],
|
|
495
|
-
sctype='(float,float)',
|
|
496
|
-
scope=Scope.GLOBAL,
|
|
497
|
-
unit='mm',
|
|
498
|
-
shorthelp="PDK: horizontal scribe line width",
|
|
499
|
-
switch="-pdk_scribe 'pdkname <(float,float)>'",
|
|
500
|
-
example=["cli: -pdk_scribe 'asap7 (0.1,0.1)'",
|
|
501
|
-
"api: chip.set('pdk', 'asap7', 'scribe', (0.1, 0.1))"],
|
|
502
|
-
schelp="""
|
|
503
|
-
Width of the horizontal and vertical scribe line used during die separation.
|
|
504
|
-
The process is generally completed using a mechanical saw, but can be
|
|
505
|
-
done through combinations of mechanical saws, lasers, wafer thinning,
|
|
506
|
-
and chemical etching in more advanced technologies. The value is used
|
|
507
|
-
to calculate effective dies per wafer and full factory cost.""")
|
|
508
|
-
|
|
509
|
-
scparam(cfg, ['pdk', pdkname, 'edgemargin'],
|
|
510
|
-
sctype='float',
|
|
511
|
-
scope=Scope.GLOBAL,
|
|
512
|
-
unit='mm',
|
|
513
|
-
shorthelp="PDK: wafer edge keep-out margin",
|
|
514
|
-
switch="-pdk_edgemargin 'pdkname <float>'",
|
|
515
|
-
example=[
|
|
516
|
-
"cli: -pdk_edgemargin 'asap7 1'",
|
|
517
|
-
"api: chip.set('pdk', 'asap7', 'edgemargin', 1)"],
|
|
518
|
-
schelp="""
|
|
519
|
-
Keep-out distance/margin from the edge inwards. The edge
|
|
520
|
-
is prone to chipping and need special treatment that preclude
|
|
521
|
-
placement of designs in this area. The edge value is used to
|
|
522
|
-
calculate effective units per wafer/panel and full factory cost.""")
|
|
523
|
-
|
|
524
|
-
simtype = 'default'
|
|
525
|
-
scparam(cfg, ['pdk', pdkname, 'devmodel', tool, simtype, stackup],
|
|
526
|
-
sctype='[file]',
|
|
527
|
-
scope=Scope.GLOBAL,
|
|
528
|
-
shorthelp="PDK: device models",
|
|
529
|
-
switch="-pdk_devmodel 'pdkname tool simtype stackup <file>'",
|
|
530
|
-
example=[
|
|
531
|
-
"cli: -pdk_devmodel 'asap7 xyce spice M10 asap7.sp'",
|
|
532
|
-
"api: chip.set('pdk', 'asap7', 'devmodel', 'xyce', 'spice', 'M10', 'asap7.sp')"],
|
|
533
|
-
schelp="""
|
|
534
|
-
List of filepaths to PDK device models for different simulation
|
|
535
|
-
purposes and for different tools. Examples of device model types
|
|
536
|
-
include spice, aging, electromigration, radiation. An example of a
|
|
537
|
-
'spice' tool is xyce. Device models are specified on a per metal stack
|
|
538
|
-
basis. Process nodes with a single device model across all stacks will
|
|
539
|
-
have a unique parameter record per metal stack pointing to the same
|
|
540
|
-
device model file. Device types and tools are dynamic entries
|
|
541
|
-
that depend on the tool setup and device technology. Pseudo-standardized
|
|
542
|
-
device types include spice, em (electromigration), and aging.""")
|
|
543
|
-
|
|
544
|
-
corner = 'default'
|
|
545
|
-
scparam(cfg, ['pdk', pdkname, 'pexmodel', tool, stackup, corner],
|
|
546
|
-
sctype='[file]',
|
|
547
|
-
scope=Scope.GLOBAL,
|
|
548
|
-
shorthelp="PDK: parasitic TCAD models",
|
|
549
|
-
switch="-pdk_pexmodel 'pdkname tool stackup corner <file>'",
|
|
550
|
-
example=[
|
|
551
|
-
"cli: -pdk_pexmodel 'asap7 fastcap M10 max wire.mod'",
|
|
552
|
-
"api: chip.set('pdk', 'asap7', 'pexmodel', 'fastcap', 'M10', 'max', 'wire.mod')"],
|
|
553
|
-
schelp="""
|
|
554
|
-
List of filepaths to PDK wire TCAD models used during automated
|
|
555
|
-
synthesis, APR, and signoff verification. Pexmodels are specified on
|
|
556
|
-
a per metal stack basis. Corner values depend on the process being
|
|
557
|
-
used, but typically include nomenclature such as min, max, nominal.
|
|
558
|
-
For exact names, refer to the DRM. Pexmodels are generally not
|
|
559
|
-
standardized and specified on a per tool basis. An example of pexmodel
|
|
560
|
-
type is 'fastcap'.""")
|
|
561
|
-
|
|
562
|
-
src = 'default'
|
|
563
|
-
dst = 'default'
|
|
564
|
-
scparam(cfg, ['pdk', pdkname, 'layermap', tool, src, dst, stackup],
|
|
565
|
-
sctype='[file]',
|
|
566
|
-
scope=Scope.GLOBAL,
|
|
567
|
-
shorthelp="PDK: layer map file",
|
|
568
|
-
switch="-pdk_layermap 'pdkname tool src dst stackup <file>'",
|
|
569
|
-
example=[
|
|
570
|
-
"cli: -pdk_layermap 'asap7 klayout db gds M10 asap7.map'",
|
|
571
|
-
"api: chip.set('pdk', 'asap7', 'layermap', 'klayout', 'db', 'gds', 'M10', "
|
|
572
|
-
"'asap7.map')"],
|
|
573
|
-
schelp="""
|
|
574
|
-
Files describing input/output mapping for streaming layout data from
|
|
575
|
-
one format to another. A foundry PDK will include an official layer
|
|
576
|
-
list for all user entered and generated layers supported in the GDS
|
|
577
|
-
accepted by the foundry for processing, but there is no standardized
|
|
578
|
-
layer definition format that can be read and written by all EDA tools.
|
|
579
|
-
To ensure mask layer matching, key/value type mapping files are needed
|
|
580
|
-
to convert EDA databases to/from GDS and to convert between different
|
|
581
|
-
types of EDA databases. Layer maps are specified on a per metal
|
|
582
|
-
stackup basis. The 'src' and 'dst' can be names of SC supported tools
|
|
583
|
-
or file formats (like 'gds').""")
|
|
584
|
-
|
|
585
|
-
scparam(cfg, ['pdk', pdkname, 'display', tool, stackup],
|
|
586
|
-
sctype='[file]',
|
|
587
|
-
scope=Scope.GLOBAL,
|
|
588
|
-
shorthelp="PDK: display file",
|
|
589
|
-
switch="-pdk_display 'pdkname tool stackup <file>'",
|
|
590
|
-
example=[
|
|
591
|
-
"cli: -pdk_display 'asap7 klayout M10 display.lyt'",
|
|
592
|
-
"api: chip.set('pdk', 'asap7', 'display', 'klayout', 'M10', 'display.cfg')"],
|
|
593
|
-
schelp="""
|
|
594
|
-
Display configuration files describing colors and pattern schemes for
|
|
595
|
-
all layers in the PDK. The display configuration file is entered on a
|
|
596
|
-
stackup and tool basis.""")
|
|
597
|
-
|
|
598
|
-
# TODO: create firm list of accepted files
|
|
599
|
-
libarch = 'default'
|
|
600
|
-
scparam(cfg, ['pdk', pdkname, 'aprtech', tool, stackup, libarch, filetype],
|
|
601
|
-
sctype='[file]',
|
|
602
|
-
scope=Scope.GLOBAL,
|
|
603
|
-
shorthelp="PDK: APR technology files",
|
|
604
|
-
switch="-pdk_aprtech 'pdkname tool stackup libarch filetype <file>'",
|
|
605
|
-
example=[
|
|
606
|
-
"cli: -pdk_aprtech 'asap7 openroad M10 12t lef tech.lef'",
|
|
607
|
-
"api: chip.set('pdk', 'asap7', 'aprtech', 'openroad', 'M10', '12t', 'lef', "
|
|
608
|
-
"'tech.lef')"],
|
|
609
|
-
schelp="""
|
|
610
|
-
Technology file containing setup information needed to enable DRC clean APR
|
|
611
|
-
for the specified stackup, libarch, and format. The 'libarch' specifies the
|
|
612
|
-
library architecture (e.g. library height). For example a PDK with support
|
|
613
|
-
for 9 and 12 track libraries might have 'libarchs' called 9t and 12t.
|
|
614
|
-
The standard filetype for specifying place and route design rules for a
|
|
615
|
-
process node is through a 'lef' format technology file. The
|
|
616
|
-
'filetype' used in the aprtech is used by the tool specific APR TCL scripts
|
|
617
|
-
to set up the technology parameters. Some tools may require additional
|
|
618
|
-
files beyond the tech.lef file. Examples of extra file types include
|
|
619
|
-
antenna, tracks, tapcell, viarules, and em.""")
|
|
620
|
-
|
|
621
|
-
checks = ['lvs', 'drc', 'erc', 'fill']
|
|
622
|
-
name = 'default'
|
|
623
|
-
for item in checks:
|
|
624
|
-
scparam(cfg, ['pdk', pdkname, item, 'runset', tool, stackup, name],
|
|
625
|
-
sctype='[file]',
|
|
626
|
-
scope=Scope.GLOBAL,
|
|
627
|
-
shorthelp=f"PDK: {item.upper()} runset files",
|
|
628
|
-
switch=f"-pdk_{item}_runset 'pdkname tool stackup name <file>'",
|
|
629
|
-
example=[
|
|
630
|
-
f"cli: -pdk_{item}_runset 'asap7 magic M10 basic $PDK/{item}.rs'",
|
|
631
|
-
f"api: chip.set('pdk', 'asap7', '{item}', 'runset', 'magic', 'M10', 'basic', "
|
|
632
|
-
f"'$PDK/{item}.rs')"],
|
|
633
|
-
schelp=f"""Runset files for {item.upper()} task.""")
|
|
634
|
-
|
|
635
|
-
scparam(cfg, ['pdk', pdkname, item, 'waiver', tool, stackup, name],
|
|
636
|
-
sctype='[file]',
|
|
637
|
-
scope=Scope.GLOBAL,
|
|
638
|
-
shorthelp=f"PDK: {item.upper()} waiver files",
|
|
639
|
-
switch=f"-pdk_{item}_waiver 'pdkname tool stackup name <file>'",
|
|
640
|
-
example=[
|
|
641
|
-
f"cli: -pdk_{item}_waiver 'asap7 magic M10 basic $PDK/{item}.txt'",
|
|
642
|
-
f"api: chip.set('pdk', 'asap7', '{item}', 'waiver', 'magic', 'M10', 'basic', "
|
|
643
|
-
f"'$PDK/{item}.txt')"],
|
|
644
|
-
schelp=f"""Waiver files for {item.upper()} task.""")
|
|
645
|
-
|
|
646
|
-
###############
|
|
647
|
-
# EDA vars
|
|
648
|
-
###############
|
|
649
|
-
|
|
650
|
-
key = 'default'
|
|
651
|
-
scparam(cfg, ['pdk', pdkname, 'file', tool, key, stackup],
|
|
652
|
-
sctype='[file]',
|
|
653
|
-
scope=Scope.GLOBAL,
|
|
654
|
-
shorthelp="PDK: custom file",
|
|
655
|
-
switch="-pdk_file 'pdkname tool key stackup <file>'",
|
|
656
|
-
example=[
|
|
657
|
-
"cli: -pdk_file 'asap7 xyce spice M10 asap7.sp'",
|
|
658
|
-
"api: chip.set('pdk', 'asap7', 'file', 'xyce', 'spice', 'M10', 'asap7.sp')"],
|
|
659
|
-
schelp="""
|
|
660
|
-
List of named files specified on a per tool and per stackup basis.
|
|
661
|
-
The parameter should only be used for specifying files that are
|
|
662
|
-
not directly supported by the SiliconCompiler PDK schema.""")
|
|
663
|
-
|
|
664
|
-
scparam(cfg, ['pdk', pdkname, 'dir', tool, key, stackup],
|
|
665
|
-
sctype='[dir]',
|
|
666
|
-
scope=Scope.GLOBAL,
|
|
667
|
-
shorthelp="PDK: custom directory",
|
|
668
|
-
switch="-pdk_dir 'pdkname tool key stackup <dir>'",
|
|
669
|
-
example=[
|
|
670
|
-
"cli: -pdk_dir 'asap7 xyce rfmodel M10 rftechdir'",
|
|
671
|
-
"api: chip.set('pdk', 'asap7', 'dir', 'xyce', 'rfmodel', 'M10', "
|
|
672
|
-
"'rftechdir')"],
|
|
673
|
-
schelp="""
|
|
674
|
-
List of named directories specified on a per tool and per stackup basis.
|
|
675
|
-
The parameter should only be used for specifying files that are
|
|
676
|
-
not directly supported by the SiliconCompiler PDK schema.""")
|
|
677
|
-
|
|
678
|
-
scparam(cfg, ['pdk', pdkname, 'var', tool, key, stackup],
|
|
679
|
-
sctype='[str]',
|
|
680
|
-
scope=Scope.GLOBAL,
|
|
681
|
-
shorthelp="PDK: custom, variable",
|
|
682
|
-
switch="-pdk_var 'pdkname tool stackup key <str>'",
|
|
683
|
-
example=[
|
|
684
|
-
"cli: -pdk_var 'asap7 xyce modeltype M10 bsim4'",
|
|
685
|
-
"api: chip.set('pdk', 'asap7', 'var', 'xyce', 'modeltype', 'M10', 'bsim4')"],
|
|
686
|
-
schelp="""
|
|
687
|
-
List of key/value strings specified on a per tool and per stackup basis.
|
|
688
|
-
The parameter should only be used for specifying variables that are
|
|
689
|
-
not directly supported by the SiliconCompiler PDK schema.""")
|
|
690
|
-
|
|
691
|
-
###############
|
|
692
|
-
# Docs
|
|
693
|
-
###############
|
|
694
|
-
|
|
695
|
-
doctype = 'default'
|
|
696
|
-
scparam(cfg, ['pdk', pdkname, 'doc', doctype],
|
|
697
|
-
sctype='[file]',
|
|
698
|
-
scope=Scope.GLOBAL,
|
|
699
|
-
shorthelp="PDK: documentation",
|
|
700
|
-
switch="-pdk_doc 'pdkname doctype <file>'",
|
|
701
|
-
example=["cli: -pdk_doc 'asap7 reference reference.pdf'",
|
|
702
|
-
"api: chip.set('pdk', 'asap7', 'doc', 'reference', 'reference.pdf')"],
|
|
703
|
-
schelp="""Filepath to pdk documentation.""")
|
|
704
|
-
|
|
213
|
+
def schema_pdk(cfg):
|
|
214
|
+
from siliconcompiler.pdk import PDKSchema
|
|
215
|
+
cfg.insert("pdk", "default", PDKSchema())
|
|
705
216
|
return cfg
|
|
706
217
|
|
|
707
218
|
|
|
708
219
|
###############################################################################
|
|
709
220
|
# Datasheet ("specification/contract")
|
|
710
221
|
###############################################################################
|
|
711
|
-
def schema_datasheet(cfg
|
|
222
|
+
def schema_datasheet(cfg):
|
|
712
223
|
|
|
224
|
+
partname = 'default'
|
|
225
|
+
mode = 'default'
|
|
226
|
+
|
|
227
|
+
ds_type = ['digital', 'analog', 'ams', 'passive',
|
|
228
|
+
'soc', 'fpga',
|
|
229
|
+
'adc', 'dac',
|
|
230
|
+
'pmic', 'buck', 'boost', 'ldo',
|
|
231
|
+
'sram', 'dram', 'flash', 'rom',
|
|
232
|
+
'interface', 'clock', 'amplifier',
|
|
233
|
+
'filter', 'mixer', 'modulator', 'lna']
|
|
713
234
|
# Part type
|
|
714
235
|
scparam(cfg, ['datasheet', 'type'],
|
|
715
|
-
sctype='
|
|
716
|
-
enum=['digital', 'analog', 'ams', 'passive',
|
|
717
|
-
'soc', 'fpga',
|
|
718
|
-
'adc', 'dac',
|
|
719
|
-
'pmic', 'buck', 'boost', 'ldo',
|
|
720
|
-
'sram', 'dram', 'flash', 'rom',
|
|
721
|
-
'interface', 'clock', 'amplifier',
|
|
722
|
-
'filter', 'mixer', 'modulator', 'lna'],
|
|
236
|
+
sctype=f'<{",".join(ds_type)}>',
|
|
723
237
|
shorthelp="Datasheet: type",
|
|
724
238
|
switch="-datasheet_type '<str>'",
|
|
725
239
|
example=[
|
|
@@ -781,10 +295,7 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
781
295
|
|
|
782
296
|
# Grade
|
|
783
297
|
scparam(cfg, ['datasheet', 'grade'],
|
|
784
|
-
sctype='
|
|
785
|
-
enum=['consumer', 'industrial',
|
|
786
|
-
'medical', 'automotive',
|
|
787
|
-
'military', 'space'],
|
|
298
|
+
sctype='<consumer,industrial,menidal,automotive,military,space>',
|
|
788
299
|
shorthelp="Datasheet: manufacturing grade",
|
|
789
300
|
switch="-datasheet_grade '<str>'",
|
|
790
301
|
example=[
|
|
@@ -816,9 +327,7 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
816
327
|
|
|
817
328
|
# Status
|
|
818
329
|
scparam(cfg, ['datasheet', 'status'],
|
|
819
|
-
sctype='
|
|
820
|
-
enum=['preview', 'active', 'deprecated',
|
|
821
|
-
'last time buy', 'obsolete'],
|
|
330
|
+
sctype='<preview,active,deprecated,last time buy,obsolete>',
|
|
822
331
|
shorthelp="Datasheet: product status",
|
|
823
332
|
switch="-datasheet_status '<str>'",
|
|
824
333
|
example=[
|
|
@@ -896,23 +405,23 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
896
405
|
# IO
|
|
897
406
|
######################
|
|
898
407
|
|
|
408
|
+
io_arch = ['spi', 'uart', 'i2c', 'pwm', 'qspi', 'sdio', 'can', 'jtag',
|
|
409
|
+
'spdif', 'i2s',
|
|
410
|
+
'gpio', 'lvds', 'serdes', 'pio',
|
|
411
|
+
'ddr3', 'ddr4', 'ddr5',
|
|
412
|
+
'lpddr4', 'lpddr5',
|
|
413
|
+
'hbm2', 'hbm3', 'hbm4',
|
|
414
|
+
'onfi', 'sram',
|
|
415
|
+
'hdmi', 'mipi-csi', 'mipi-dsi', 'slvs',
|
|
416
|
+
'sata',
|
|
417
|
+
'usb1', 'usb2', 'usb3',
|
|
418
|
+
'pcie3', 'pcie4', 'pcie5', 'pcie6',
|
|
419
|
+
'cxl',
|
|
420
|
+
'ethernet', 'rmii', 'rgmii', 'sgmii', 'xaui',
|
|
421
|
+
'10gbase-kr', '25gbase-kr', 'xfi', 'cei28g',
|
|
422
|
+
'jesd204', 'cpri']
|
|
899
423
|
scparam(cfg, ['datasheet', 'io', partname, 'arch'],
|
|
900
|
-
sctype='
|
|
901
|
-
enum=['spi', 'uart', 'i2c', 'pwm', 'qspi', 'sdio', 'can', 'jtag',
|
|
902
|
-
'spdif', 'i2s',
|
|
903
|
-
'gpio', 'lvds', 'serdes', 'pio',
|
|
904
|
-
'ddr3', 'ddr4', 'ddr5',
|
|
905
|
-
'lpddr4', 'lpddr5',
|
|
906
|
-
'hbm2', 'hbm3', 'hbm4',
|
|
907
|
-
'onfi', 'sram',
|
|
908
|
-
'hdmi', 'mipi-csi', 'mipi-dsi', 'slvs',
|
|
909
|
-
'sata',
|
|
910
|
-
'usb1', 'usb2', 'usb3',
|
|
911
|
-
'pcie3', 'pcie4', 'pcie5', 'pcie6',
|
|
912
|
-
'cxl',
|
|
913
|
-
'ethernet', 'rmii', 'rgmii', 'sgmii', 'xaui',
|
|
914
|
-
'10gbase-kr', '25gbase-kr', 'xfi', 'cei28g',
|
|
915
|
-
'jesd204', 'cpri'],
|
|
424
|
+
sctype=f'<{",".join(io_arch)}>',
|
|
916
425
|
shorthelp="Datasheet: io standard",
|
|
917
426
|
switch="-datasheet_io_arch 'partname <str>'",
|
|
918
427
|
example=[
|
|
@@ -960,11 +469,11 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
960
469
|
"api: chip.set('datasheet','proc','cpu','features', 'SIMD')"],
|
|
961
470
|
schelp="""List of maker specified processor features specified on a per core basis.""")
|
|
962
471
|
|
|
472
|
+
proc_datatypes = ['int4', 'int8', 'int16', 'int32', 'int64', 'int128',
|
|
473
|
+
'uint4', 'uint8', 'uint16', 'uint32', 'uint64', 'uint128',
|
|
474
|
+
'bfloat16', 'fp16', 'fp32', 'fp64', 'fp128']
|
|
963
475
|
scparam(cfg, ['datasheet', 'proc', partname, 'datatypes'],
|
|
964
|
-
sctype='[
|
|
965
|
-
enum=['int4', 'int8', 'int16', 'int32', 'int64', 'int128',
|
|
966
|
-
'uint4', 'uint8', 'uint16', 'uint32', 'uint64', 'uint128',
|
|
967
|
-
'bfloat16', 'fp16', 'fp32', 'fp64', 'fp128'],
|
|
476
|
+
sctype=f'[<{",".join(proc_datatypes)}>]',
|
|
968
477
|
shorthelp="Datasheet: processor datatypes",
|
|
969
478
|
switch="-datasheet_proc_datatypes 'partname <str>'",
|
|
970
479
|
example=[
|
|
@@ -1057,7 +566,8 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
1057
566
|
shorthelp=f"Datasheet: memory {v[0]}",
|
|
1058
567
|
switch=f"-datasheet_memory_{i} 'partname <(float,float,float)>'",
|
|
1059
568
|
example=[
|
|
1060
|
-
f"cli: -datasheet_memory_{i}
|
|
569
|
+
f"cli: -datasheet_memory_{i} "
|
|
570
|
+
f"'partname ({','.join([str(val) for val in v[1]])})'",
|
|
1061
571
|
f"api: chip.set('datasheet', 'memory', partname, '{i}', {v[1]})"],
|
|
1062
572
|
schelp=f"""Memory {v[1]} specified on a per memory basis.""")
|
|
1063
573
|
|
|
@@ -1075,7 +585,8 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
1075
585
|
shorthelp=f"Datasheet: memory {v[0]}",
|
|
1076
586
|
switch=f"-datasheet_memory_{i} 'partname <(int,int,int)>'",
|
|
1077
587
|
example=[
|
|
1078
|
-
f"cli: -datasheet_memory_{i}
|
|
588
|
+
f"cli: -datasheet_memory_{i} "
|
|
589
|
+
f"'partname ({','.join([str(val) for val in v[1]])})'",
|
|
1079
590
|
f"api: chip.set('datasheet', 'memory', partname, '{i}', {v[1]})"],
|
|
1080
591
|
schelp=f"""Memory {v[1]} specified on a per memory basis.""")
|
|
1081
592
|
|
|
@@ -1130,7 +641,7 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
1130
641
|
shorthelp="Datasheet: analog features",
|
|
1131
642
|
switch="-datasheet_analog_features 'partname <str>'",
|
|
1132
643
|
example=[
|
|
1133
|
-
"cli: -datasheet_analog_features '0 differential input'",
|
|
644
|
+
"cli: -datasheet_analog_features '0 \"differential input\"'",
|
|
1134
645
|
"api: chip.set('datasheet','analog','adc0','features', 'differential input')"],
|
|
1135
646
|
schelp="""List of maker specified analog features.""")
|
|
1136
647
|
|
|
@@ -1186,7 +697,7 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
1186
697
|
shorthelp=f"Datasheet: analog {v[0]}",
|
|
1187
698
|
switch=f"-datasheet_analog_{i} 'partname <(float,float,float)>'",
|
|
1188
699
|
example=[
|
|
1189
|
-
f"cli: -datasheet_analog_{i} 'i0 {v[1]}'",
|
|
700
|
+
f"cli: -datasheet_analog_{i} 'i0 ({','.join([str(val) for val in v[1]])})'",
|
|
1190
701
|
f"api: chip.set('datasheet', 'analog', 'abc123', '{i}', {v[1]})"],
|
|
1191
702
|
schelp=f"""Analog {v[1]}.""")
|
|
1192
703
|
|
|
@@ -1216,7 +727,7 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
1216
727
|
shorthelp=f"Datasheet: limit {v[0]}",
|
|
1217
728
|
switch=f"-datasheet_limit_{i} '<(float,float)>'",
|
|
1218
729
|
example=[
|
|
1219
|
-
f"cli: -datasheet_limit_{i} '
|
|
730
|
+
f"cli: -datasheet_limit_{i} ({','.join([str(val) for val in v[1]])})",
|
|
1220
731
|
f"api: chip.set('datasheet', 'limit', '{i}', {v[1]}"],
|
|
1221
732
|
schelp=f"""Limit {v[0]}. Values are tuples of (min, max).
|
|
1222
733
|
""")
|
|
@@ -1248,8 +759,7 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
1248
759
|
#########################
|
|
1249
760
|
|
|
1250
761
|
scparam(cfg, ['datasheet', 'package', partname, 'type'],
|
|
1251
|
-
sctype='
|
|
1252
|
-
enum=['bga', 'lga', 'csp', 'qfn', 'qfp', 'sop', 'die', 'wafer'],
|
|
762
|
+
sctype='<bga,lga,csp,qfn,qfp,sop,die,wafer>',
|
|
1253
763
|
shorthelp="Datasheet: package type",
|
|
1254
764
|
switch="-datasheet_package_type 'partname <str>'",
|
|
1255
765
|
example=[
|
|
@@ -1309,7 +819,7 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
1309
819
|
shorthelp=f"Datasheet: package {v[0]}",
|
|
1310
820
|
switch=f"-datasheet_package_{i} 'partname <(float,float,float)>'",
|
|
1311
821
|
example=[
|
|
1312
|
-
f"cli: -datasheet_package_{i} 'abcd {v[1]}'",
|
|
822
|
+
f"cli: -datasheet_package_{i} 'abcd ({','.join([str(val) for val in v[1]])})'",
|
|
1313
823
|
f"api: chip.set('datasheet', 'package', 'abcd', '{i}', {v[1]}"],
|
|
1314
824
|
schelp=f"""Package {v[0]}. Values are tuples of
|
|
1315
825
|
(min, nominal, max).""")
|
|
@@ -1344,7 +854,7 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
1344
854
|
shorthelp="Datasheet: package anchor",
|
|
1345
855
|
switch="-datasheet_package_anchor 'partname <(float,float)>'",
|
|
1346
856
|
example=[
|
|
1347
|
-
"cli: -datasheet_package_anchor 'i0 (3.0,
|
|
857
|
+
"cli: -datasheet_package_anchor 'i0 (3.0,3.0)'",
|
|
1348
858
|
"api: chip.set('datasheet', 'package', 'i0', 'anchor', (3.0, 3.0))"],
|
|
1349
859
|
schelp="""
|
|
1350
860
|
Package anchor point with respect to the lower left corner of the package.
|
|
@@ -1358,8 +868,7 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
1358
868
|
|
|
1359
869
|
# Pin type
|
|
1360
870
|
scparam(cfg, ['datasheet', 'pin', partname, 'type', mode],
|
|
1361
|
-
sctype='
|
|
1362
|
-
enum=['digital', 'analog', 'clock', 'supply', 'ground'],
|
|
871
|
+
sctype='<digital,analog,clock,supply,ground>',
|
|
1363
872
|
shorthelp="Datasheet: pin type",
|
|
1364
873
|
switch="-datasheet_pin_type 'partname mode <str>'",
|
|
1365
874
|
example=[
|
|
@@ -1369,8 +878,7 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
1369
878
|
|
|
1370
879
|
# Pin direction
|
|
1371
880
|
scparam(cfg, ['datasheet', 'pin', partname, 'dir', mode],
|
|
1372
|
-
sctype='
|
|
1373
|
-
enum=['input', 'output', 'inout'],
|
|
881
|
+
sctype='<input,output,inout>',
|
|
1374
882
|
shorthelp="Datasheet: pin direction",
|
|
1375
883
|
switch="-datasheet_pin_dir 'partname mode <str>'",
|
|
1376
884
|
example=[
|
|
@@ -1411,8 +919,7 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
1411
919
|
|
|
1412
920
|
# Pin reset value
|
|
1413
921
|
scparam(cfg, ['datasheet', 'pin', partname, 'resetvalue', mode],
|
|
1414
|
-
sctype='
|
|
1415
|
-
enum=['weak1', 'weak0', 'strong0', 'strong1', 'highz'],
|
|
922
|
+
sctype='<weak1,weak0,strong0,strong1,highz>',
|
|
1416
923
|
shorthelp="Datasheet: pin reset value",
|
|
1417
924
|
switch="-datasheet_pin_resetvalue 'partname mode <str>'",
|
|
1418
925
|
example=[
|
|
@@ -1471,7 +978,8 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
1471
978
|
shorthelp=f"Datasheet: pin {val[0]}",
|
|
1472
979
|
switch=f"-datasheet_pin_{item} 'pin mode <(float,float,float)>'",
|
|
1473
980
|
example=[
|
|
1474
|
-
f"cli: -datasheet_pin_{item} 'sclk global
|
|
981
|
+
f"cli: -datasheet_pin_{item} 'sclk global "
|
|
982
|
+
f"({','.join([str(v) for v in val[1]])})'",
|
|
1475
983
|
f"api: chip.set('datasheet', 'pin', 'sclk', '{item}', "
|
|
1476
984
|
f"'global', {val[1]}"],
|
|
1477
985
|
schelp=f"""Pin {val[0]}. Values are tuples of (min, typical, max).""")
|
|
@@ -1494,7 +1002,8 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
1494
1002
|
shorthelp=f"Datasheet: pin {v[0]}",
|
|
1495
1003
|
switch=f"-datasheet_pin_{i} 'pin mode relpin <(float,float,float)>'",
|
|
1496
1004
|
example=[
|
|
1497
|
-
f"cli: -datasheet_pin_{i}
|
|
1005
|
+
f"cli: -datasheet_pin_{i} "
|
|
1006
|
+
f"'a glob clock ({','.join([str(val) for val in v[1]])})'",
|
|
1498
1007
|
f"api: chip.set('datasheet', 'pin', 'a', '{i}', 'glob', 'ck', {v[1]}"],
|
|
1499
1008
|
schelp=f"""Pin {v[0]} specified on a per pin, mode, and relpin basis.
|
|
1500
1009
|
Values are tuples of (min, typical, max).""")
|
|
@@ -1505,526 +1014,18 @@ def schema_datasheet(cfg, partname='default', mode='default'):
|
|
|
1505
1014
|
###############################################################################
|
|
1506
1015
|
# Flow Configuration
|
|
1507
1016
|
###############################################################################
|
|
1508
|
-
def schema_flowgraph(cfg
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
scparam(cfg, ['flowgraph', flow, step, index, 'input'],
|
|
1512
|
-
sctype='[(str,str)]',
|
|
1513
|
-
shorthelp="Flowgraph: step input",
|
|
1514
|
-
switch="-flowgraph_input 'flow step index <(str,str)>'",
|
|
1515
|
-
example=[
|
|
1516
|
-
"cli: -flowgraph_input 'asicflow cts 0 (place,0)'",
|
|
1517
|
-
"api: chip.set('flowgraph', 'asicflow', 'cts', '0', 'input', ('place', '0'))"],
|
|
1518
|
-
schelp="""A list of inputs for the current step and index, specified as a
|
|
1519
|
-
(step, index) tuple.""")
|
|
1520
|
-
|
|
1521
|
-
# flowgraph metric weights
|
|
1522
|
-
metric = 'default'
|
|
1523
|
-
scparam(cfg, ['flowgraph', flow, step, index, 'weight', metric],
|
|
1524
|
-
sctype='float',
|
|
1525
|
-
shorthelp="Flowgraph: metric weights",
|
|
1526
|
-
switch="-flowgraph_weight 'flow step index metric <float>'",
|
|
1527
|
-
example=[
|
|
1528
|
-
"cli: -flowgraph_weight 'asicflow cts 0 area_cells 1.0'",
|
|
1529
|
-
"api: chip.set('flowgraph', 'asicflow', 'cts', '0', 'weight', 'area_cells', 1.0)"],
|
|
1530
|
-
schelp="""Weights specified on a per step and per metric basis used to give
|
|
1531
|
-
effective "goodness" score for a step by calculating the sum all step
|
|
1532
|
-
real metrics results by the corresponding per step weights.""")
|
|
1533
|
-
|
|
1534
|
-
scparam(cfg, ['flowgraph', flow, step, index, 'goal', metric],
|
|
1535
|
-
sctype='float',
|
|
1536
|
-
shorthelp="Flowgraph: metric goals",
|
|
1537
|
-
switch="-flowgraph_goal 'flow step index metric <float>'",
|
|
1538
|
-
example=[
|
|
1539
|
-
"cli: -flowgraph_goal 'asicflow cts 0 area_cells 1.0'",
|
|
1540
|
-
"api: chip.set('flowgraph', 'asicflow', 'cts', '0', 'goal', 'errors', 0)"],
|
|
1541
|
-
schelp="""Goals specified on a per step and per metric basis used to
|
|
1542
|
-
determine whether a certain task can be considered when merging
|
|
1543
|
-
multiple tasks at a minimum or maximum node. A task is considered
|
|
1544
|
-
failing if the absolute value of any of its metrics are larger than
|
|
1545
|
-
the goal for that metric, if set.""")
|
|
1546
|
-
|
|
1547
|
-
# flowgraph tool
|
|
1548
|
-
scparam(cfg, ['flowgraph', flow, step, index, 'tool'],
|
|
1549
|
-
sctype='str',
|
|
1550
|
-
shorthelp="Flowgraph: tool selection",
|
|
1551
|
-
switch="-flowgraph_tool 'flow step index <str>'",
|
|
1552
|
-
example=[
|
|
1553
|
-
"cli: -flowgraph_tool 'asicflow place 0 openroad'",
|
|
1554
|
-
"api: chip.set('flowgraph', 'asicflow', 'place', '0', 'tool', 'openroad')"],
|
|
1555
|
-
schelp="""Name of the tool name used for task execution.""")
|
|
1556
|
-
|
|
1557
|
-
# task (belonging to tool)
|
|
1558
|
-
scparam(cfg, ['flowgraph', flow, step, index, 'task'],
|
|
1559
|
-
sctype='str',
|
|
1560
|
-
shorthelp="Flowgraph: task selection",
|
|
1561
|
-
switch="-flowgraph_task 'flow step index <str>'",
|
|
1562
|
-
example=[
|
|
1563
|
-
"cli: -flowgraph_task 'asicflow myplace 0 place'",
|
|
1564
|
-
"api: chip.set('flowgraph', 'asicflow', 'myplace', '0', 'task', 'place')"],
|
|
1565
|
-
schelp="""Name of the tool associated task used for step execution.""")
|
|
1566
|
-
|
|
1567
|
-
scparam(cfg, ['flowgraph', flow, step, index, 'taskmodule'],
|
|
1568
|
-
sctype='str',
|
|
1569
|
-
shorthelp="Flowgraph: task module",
|
|
1570
|
-
switch="-flowgraph_taskmodule 'flow step index <str>'",
|
|
1571
|
-
example=[
|
|
1572
|
-
"cli: -flowgraph_taskmodule 'asicflow place 0 "
|
|
1573
|
-
"siliconcompiler.tools.openroad.place'",
|
|
1574
|
-
"api: chip.set('flowgraph', 'asicflow', 'place', '0', 'taskmodule', "
|
|
1575
|
-
"'siliconcompiler.tools.openroad.place')"],
|
|
1576
|
-
schelp="""
|
|
1577
|
-
Full python module name of the task module used for task setup and execution.
|
|
1578
|
-
""")
|
|
1579
|
-
|
|
1580
|
-
# flowgraph arguments
|
|
1581
|
-
scparam(cfg, ['flowgraph', flow, step, index, 'args'],
|
|
1582
|
-
sctype='[str]',
|
|
1583
|
-
shorthelp="Flowgraph: setup arguments",
|
|
1584
|
-
switch="-flowgraph_args 'flow step index <str>'",
|
|
1585
|
-
example=[
|
|
1586
|
-
"cli: -flowgraph_args 'asicflow cts 0 0'",
|
|
1587
|
-
"api: chip.add('flowgraph', 'asicflow', 'cts', '0', 'args', '0')"],
|
|
1588
|
-
schelp="""User specified flowgraph string arguments specified on a per
|
|
1589
|
-
step and per index basis.""")
|
|
1590
|
-
|
|
1017
|
+
def schema_flowgraph(cfg):
|
|
1018
|
+
from siliconcompiler.flowgraph import FlowgraphSchema
|
|
1019
|
+
cfg.insert("flowgraph", "default", FlowgraphSchema())
|
|
1591
1020
|
return cfg
|
|
1592
1021
|
|
|
1593
1022
|
|
|
1594
1023
|
###########################################################################
|
|
1595
1024
|
# Tool Setup
|
|
1596
1025
|
###########################################################################
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
version = 'default'
|
|
1601
|
-
|
|
1602
|
-
scparam(cfg, ['tool', tool, 'exe'],
|
|
1603
|
-
sctype='str',
|
|
1604
|
-
shorthelp="Tool: executable name",
|
|
1605
|
-
switch="-tool_exe 'tool <str>'",
|
|
1606
|
-
example=["cli: -tool_exe 'openroad openroad'",
|
|
1607
|
-
"api: chip.set('tool', 'openroad', 'exe', 'openroad')"],
|
|
1608
|
-
schelp="""Tool executable name.""")
|
|
1609
|
-
|
|
1610
|
-
scparam(cfg, ['tool', tool, 'sbom', version],
|
|
1611
|
-
sctype='[file]',
|
|
1612
|
-
pernode=PerNode.OPTIONAL,
|
|
1613
|
-
shorthelp="Tool: software BOM",
|
|
1614
|
-
switch="-tool_sbom 'tool version <file>'",
|
|
1615
|
-
example=[
|
|
1616
|
-
"cli: -tool_sbom 'yosys 1.0.1 ys_sbom.json'",
|
|
1617
|
-
"api: chip.set('tool', 'yosys', 'sbom', '1.0', 'ys_sbom.json')"],
|
|
1618
|
-
schelp="""
|
|
1619
|
-
Paths to software bill of material (SBOM) document file of the tool
|
|
1620
|
-
specified on a per version basis. The SBOM includes critical
|
|
1621
|
-
package information about the tool including the list of included
|
|
1622
|
-
components, licenses, and copyright. The SBOM file is generally
|
|
1623
|
-
provided as in a a standardized open data format such as SPDX.""")
|
|
1624
|
-
|
|
1625
|
-
scparam(cfg, ['tool', tool, 'path'],
|
|
1626
|
-
sctype='dir',
|
|
1627
|
-
pernode=PerNode.OPTIONAL,
|
|
1628
|
-
shorthelp="Tool: executable path",
|
|
1629
|
-
switch="-tool_path 'tool <dir>'",
|
|
1630
|
-
example=[
|
|
1631
|
-
"cli: -tool_path 'openroad /usr/local/bin'",
|
|
1632
|
-
"api: chip.set('tool', 'openroad', 'path', '/usr/local/bin')"],
|
|
1633
|
-
schelp="""
|
|
1634
|
-
File system path to tool executable. The path is prepended to the
|
|
1635
|
-
system PATH environment variable for batch and interactive runs. The
|
|
1636
|
-
path parameter can be left blank if the :keypath:`tool,<tool>,exe` is already in the
|
|
1637
|
-
environment search path.""")
|
|
1638
|
-
|
|
1639
|
-
scparam(cfg, ['tool', tool, 'vswitch'],
|
|
1640
|
-
sctype='[str]',
|
|
1641
|
-
shorthelp="Tool: executable version switch",
|
|
1642
|
-
switch="-tool_vswitch 'tool <str>'",
|
|
1643
|
-
example=["cli: -tool_vswitch 'openroad -version'",
|
|
1644
|
-
"api: chip.set('tool', 'openroad', 'vswitch', '-version')"],
|
|
1645
|
-
schelp="""
|
|
1646
|
-
Command line switch to use with executable used to print out
|
|
1647
|
-
the version number. Common switches include ``-v``, ``-version``,
|
|
1648
|
-
``--version``. Some tools may require extra flags to run in batch mode.""")
|
|
1649
|
-
|
|
1650
|
-
scparam(cfg, ['tool', tool, 'vendor'],
|
|
1651
|
-
sctype='str',
|
|
1652
|
-
shorthelp="Tool: vendor",
|
|
1653
|
-
switch="-tool_vendor 'tool <str>'",
|
|
1654
|
-
example=["cli: -tool_vendor 'yosys yosys'",
|
|
1655
|
-
"api: chip.set('tool', 'yosys', 'vendor', 'yosys')"],
|
|
1656
|
-
schelp="""
|
|
1657
|
-
Name of the tool vendor. Parameter can be used to set vendor
|
|
1658
|
-
specific technology variables in the PDK and libraries. For
|
|
1659
|
-
open source projects, the project name should be used in
|
|
1660
|
-
place of vendor.""")
|
|
1661
|
-
|
|
1662
|
-
scparam(cfg, ['tool', tool, 'version'],
|
|
1663
|
-
sctype='[str]',
|
|
1664
|
-
pernode=PerNode.OPTIONAL,
|
|
1665
|
-
shorthelp="Tool: version",
|
|
1666
|
-
switch="-tool_version 'tool <str>'",
|
|
1667
|
-
example=["cli: -tool_version 'openroad >=v2.0'",
|
|
1668
|
-
"api: chip.set('tool', 'openroad', 'version', '>=v2.0')"],
|
|
1669
|
-
schelp="""
|
|
1670
|
-
List of acceptable versions of the tool executable to be used. Each
|
|
1671
|
-
entry in this list must be a version specifier as described by Python
|
|
1672
|
-
`PEP-440 <https://peps.python.org/pep-0440/#version-specifiers>`_.
|
|
1673
|
-
During task execution, the tool is called with the 'vswitch' to
|
|
1674
|
-
check the runtime executable version. If the version of the system
|
|
1675
|
-
executable is not allowed by any of the specifiers in 'version',
|
|
1676
|
-
then the job is halted pre-execution. For backwards compatibility,
|
|
1677
|
-
entries that do not conform to the standard will be interpreted as a
|
|
1678
|
-
version with an '==' specifier. This check can be disabled by
|
|
1679
|
-
setting :keypath:`option,novercheck` to True.""")
|
|
1680
|
-
|
|
1681
|
-
scparam(cfg, ['tool', tool, 'format'],
|
|
1682
|
-
sctype='enum',
|
|
1683
|
-
enum=["json", "tcl", "yaml"],
|
|
1684
|
-
shorthelp="Tool: file format",
|
|
1685
|
-
switch="-tool_format 'tool <str>'",
|
|
1686
|
-
example=["cli: -tool_format 'yosys tcl'",
|
|
1687
|
-
"api: chip.set('tool', 'yosys', 'format', 'tcl')"],
|
|
1688
|
-
schelp="""
|
|
1689
|
-
File format for tool manifest handoff.""")
|
|
1690
|
-
|
|
1691
|
-
key = 'default'
|
|
1692
|
-
scparam(cfg, ['tool', tool, 'licenseserver', key],
|
|
1693
|
-
sctype='[str]',
|
|
1694
|
-
pernode=PerNode.OPTIONAL,
|
|
1695
|
-
shorthelp="Tool: license servers",
|
|
1696
|
-
switch="-tool_licenseserver 'name key <str>'",
|
|
1697
|
-
example=[
|
|
1698
|
-
"cli: -tool_licenseserver 'atask ACME_LICENSE 1700@server'",
|
|
1699
|
-
"api: chip.set('tool', 'acme', 'licenseserver', 'ACME_LICENSE', '1700@server')"],
|
|
1700
|
-
schelp="""
|
|
1701
|
-
Defines a set of tool specific environment variables used by the executable
|
|
1702
|
-
that depend on license key servers to control access. For multiple servers,
|
|
1703
|
-
separate each server by a 'colon'. The named license variable are read at
|
|
1704
|
-
runtime (:meth:`.run()`) and the environment variables are set.
|
|
1705
|
-
""")
|
|
1706
|
-
|
|
1707
|
-
return cfg
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
def schema_task(cfg, tool='default', task='default', step='default', index='default'):
|
|
1711
|
-
|
|
1712
|
-
key = 'default'
|
|
1713
|
-
suffix = 'default'
|
|
1714
|
-
|
|
1715
|
-
scparam(cfg, ['tool', tool, 'task', task, 'warningoff'],
|
|
1716
|
-
sctype='[str]',
|
|
1717
|
-
pernode=PerNode.OPTIONAL,
|
|
1718
|
-
shorthelp="Task: warning filter",
|
|
1719
|
-
switch="-tool_task_warningoff 'tool task <str>'",
|
|
1720
|
-
example=[
|
|
1721
|
-
"cli: -tool_task_warningoff 'verilator lint COMBDLY'",
|
|
1722
|
-
"api: chip.set('tool', 'verilator', 'task', 'lint', 'warningoff', 'COMBDLY')"],
|
|
1723
|
-
schelp="""
|
|
1724
|
-
A list of tool warnings for which printing should be suppressed.
|
|
1725
|
-
Generally this is done on a per design basis after review has
|
|
1726
|
-
determined that warning can be safely ignored The code for turning
|
|
1727
|
-
off warnings can be found in the specific task reference manual.
|
|
1728
|
-
""")
|
|
1729
|
-
|
|
1730
|
-
scparam(cfg, ['tool', tool, 'task', task, 'regex', suffix],
|
|
1731
|
-
sctype='[str]',
|
|
1732
|
-
pernode=PerNode.OPTIONAL,
|
|
1733
|
-
shorthelp="Task: regex filter",
|
|
1734
|
-
switch="-tool_task_regex 'tool task suffix <str>'",
|
|
1735
|
-
example=[
|
|
1736
|
-
"cli: -tool_task_regex 'openroad place errors \"-v ERROR\"'",
|
|
1737
|
-
"api: chip.set('tool', 'openroad', 'task', 'place', 'regex', 'errors', "
|
|
1738
|
-
"'-v ERROR')"],
|
|
1739
|
-
schelp="""
|
|
1740
|
-
A list of piped together grep commands. Each entry represents a set
|
|
1741
|
-
of command line arguments for grep including the regex pattern to
|
|
1742
|
-
match. Starting with the first list entry, each grep output is piped
|
|
1743
|
-
into the following grep command in the list. Supported grep options
|
|
1744
|
-
include ``-v`` and ``-e``. Patterns starting with "-" should be
|
|
1745
|
-
directly preceded by the ``-e`` option. The following example
|
|
1746
|
-
illustrates the concept.
|
|
1747
|
-
|
|
1748
|
-
UNIX grep:
|
|
1749
|
-
|
|
1750
|
-
.. code-block:: bash
|
|
1751
|
-
|
|
1752
|
-
$ grep WARNING place.log | grep -v "bbox" > place.warnings
|
|
1753
|
-
|
|
1754
|
-
SiliconCompiler::
|
|
1755
|
-
|
|
1756
|
-
chip.set('task', 'openroad', 'regex', 'place', '0', 'warnings',
|
|
1757
|
-
["WARNING", "-v bbox"])
|
|
1758
|
-
|
|
1759
|
-
The "errors" and "warnings" suffixes are special cases. When set,
|
|
1760
|
-
the number of matches found for these regexes will be added to the
|
|
1761
|
-
errors and warnings metrics for the task, respectively. This will
|
|
1762
|
-
also cause the logfile to be added to the :keypath:`tool, <tool>,
|
|
1763
|
-
task, <task>, report` parameter for those metrics, if not already present.""")
|
|
1764
|
-
|
|
1765
|
-
# Configuration: cli-option, tcl var, env var, file
|
|
1766
|
-
scparam(cfg, ['tool', tool, 'task', task, 'option'],
|
|
1767
|
-
sctype='[str]',
|
|
1768
|
-
pernode=PerNode.OPTIONAL,
|
|
1769
|
-
shorthelp="Task: executable options",
|
|
1770
|
-
switch="-tool_task_option 'tool task <str>'",
|
|
1771
|
-
example=[
|
|
1772
|
-
"cli: -tool_task_option 'openroad cts -no_init'",
|
|
1773
|
-
"api: chip.set('tool', 'openroad', 'task', 'cts', 'option', '-no_init')"],
|
|
1774
|
-
schelp="""
|
|
1775
|
-
List of command line options for the task executable, specified on
|
|
1776
|
-
a per task and per step basis. Options must not include spaces.
|
|
1777
|
-
For multiple argument options, each option is a separate list element.
|
|
1778
|
-
""")
|
|
1779
|
-
|
|
1780
|
-
scparam(cfg, ['tool', tool, 'task', task, 'var', key],
|
|
1781
|
-
sctype='[str]',
|
|
1782
|
-
pernode=PerNode.OPTIONAL,
|
|
1783
|
-
shorthelp="Task: script variables",
|
|
1784
|
-
switch="-tool_task_var 'tool task key <str>'",
|
|
1785
|
-
example=[
|
|
1786
|
-
"cli: -tool_task_var 'openroad cts myvar 42'",
|
|
1787
|
-
"api: chip.set('tool', 'openroad', 'task', 'cts', 'var', 'myvar', '42')"],
|
|
1788
|
-
schelp="""
|
|
1789
|
-
Task script variables specified as key value pairs. Variable
|
|
1790
|
-
names and value types must match the name and type of task and reference
|
|
1791
|
-
script consuming the variable.""")
|
|
1792
|
-
|
|
1793
|
-
scparam(cfg, ['tool', tool, 'task', task, 'env', key],
|
|
1794
|
-
sctype='str',
|
|
1795
|
-
pernode=PerNode.OPTIONAL,
|
|
1796
|
-
shorthelp="Task: environment variables",
|
|
1797
|
-
switch="-tool_task_env 'tool task env <str>'",
|
|
1798
|
-
example=[
|
|
1799
|
-
"cli: -tool_task_env 'openroad cts MYVAR 42'",
|
|
1800
|
-
"api: chip.set('tool', 'openroad', 'task', 'cts', 'env', 'MYVAR', '42')"],
|
|
1801
|
-
schelp="""
|
|
1802
|
-
Environment variables to set for individual tasks. Keys and values
|
|
1803
|
-
should be set in accordance with the task's documentation. Most
|
|
1804
|
-
tasks do not require extra environment variables to function.""")
|
|
1805
|
-
|
|
1806
|
-
scparam(cfg, ['tool', tool, 'task', task, 'file', key],
|
|
1807
|
-
sctype='[file]',
|
|
1808
|
-
pernode=PerNode.OPTIONAL,
|
|
1809
|
-
copy=True,
|
|
1810
|
-
shorthelp="Task: custom setup files",
|
|
1811
|
-
switch="-tool_task_file 'tool task key <file>'",
|
|
1812
|
-
example=[
|
|
1813
|
-
"cli: -tool_task_file 'openroad floorplan macroplace macroplace.tcl'",
|
|
1814
|
-
"api: chip.set('tool', 'openroad', 'task', 'floorplan', 'file', 'macroplace', "
|
|
1815
|
-
"'macroplace.tcl')"],
|
|
1816
|
-
schelp="""
|
|
1817
|
-
Paths to user supplied files mapped to keys. Keys and filetypes must
|
|
1818
|
-
match what's expected by the task/reference script consuming the
|
|
1819
|
-
file.
|
|
1820
|
-
""")
|
|
1821
|
-
|
|
1822
|
-
scparam(cfg, ['tool', tool, 'task', task, 'dir', key],
|
|
1823
|
-
sctype='[dir]',
|
|
1824
|
-
pernode=PerNode.OPTIONAL,
|
|
1825
|
-
copy=True,
|
|
1826
|
-
shorthelp="Task: custom setup directories",
|
|
1827
|
-
switch="-tool_task_dir 'tool task key <dir>'",
|
|
1828
|
-
example=[
|
|
1829
|
-
"cli: -tool_task_dir 'verilator compile cincludes include'",
|
|
1830
|
-
"api: chip.set('tool', 'verilator', 'task', 'compile', 'dir', 'cincludes', "
|
|
1831
|
-
"'include')"],
|
|
1832
|
-
schelp="""
|
|
1833
|
-
Paths to user supplied directories mapped to keys. Keys must match
|
|
1834
|
-
what's expected by the task/reference script consuming the
|
|
1835
|
-
directory.
|
|
1836
|
-
""")
|
|
1837
|
-
|
|
1838
|
-
# Definitions of inputs, outputs, requirements
|
|
1839
|
-
scparam(cfg, ['tool', tool, 'task', task, 'input'],
|
|
1840
|
-
sctype='[file]',
|
|
1841
|
-
pernode=PerNode.REQUIRED,
|
|
1842
|
-
shorthelp="Task: input files",
|
|
1843
|
-
switch="-tool_task_input 'tool task <file>'",
|
|
1844
|
-
example=[
|
|
1845
|
-
"cli: -tool_task_input 'openroad place place 0 oh_add.def'",
|
|
1846
|
-
"api: chip.set('tool', 'openroad', 'task', 'place', 'input', 'oh_add.def', "
|
|
1847
|
-
"step='place', index='0')"],
|
|
1848
|
-
schelp="""
|
|
1849
|
-
List of data files to be copied from previous flowgraph steps 'output'
|
|
1850
|
-
directory. The list of steps to copy files from is defined by the
|
|
1851
|
-
list defined by the dictionary key :keypath:`flowgraph,<step>,<index>',input`.
|
|
1852
|
-
All files must be available for flow to continue. If a file
|
|
1853
|
-
is missing, the program exists on an error.""")
|
|
1854
|
-
|
|
1855
|
-
scparam(cfg, ['tool', tool, 'task', task, 'output'],
|
|
1856
|
-
sctype='[file]',
|
|
1857
|
-
pernode=PerNode.REQUIRED,
|
|
1858
|
-
shorthelp="Task: output files",
|
|
1859
|
-
switch="-tool_task_output 'tool task <file>'",
|
|
1860
|
-
example=[
|
|
1861
|
-
"cli: -tool_task_output 'openroad place place 0 oh_add.def'",
|
|
1862
|
-
"api: chip.set('tool', 'openroad', 'task', 'place', 'output', 'oh_add.def', "
|
|
1863
|
-
"step='place', index='0')"],
|
|
1864
|
-
schelp="""
|
|
1865
|
-
List of data files written to the 'output' directory of the
|
|
1866
|
-
tool/task/step/index used in the keypath. All files must be available
|
|
1867
|
-
for flow to continue. If a file is missing, the program exists on an error.""")
|
|
1868
|
-
|
|
1869
|
-
dest_enum = ['log', 'output', 'none']
|
|
1870
|
-
scparam(cfg, ['tool', tool, 'task', task, 'stdout', 'destination'],
|
|
1871
|
-
sctype='enum',
|
|
1872
|
-
enum=dest_enum,
|
|
1873
|
-
defvalue='log',
|
|
1874
|
-
scope=Scope.JOB,
|
|
1875
|
-
pernode=PerNode.OPTIONAL,
|
|
1876
|
-
shorthelp="Task: destination for stdout",
|
|
1877
|
-
switch="-tool_task_stdout_destination 'tool task <str>'",
|
|
1878
|
-
example=["cli: -tool_task_stdout_destination 'ghdl import log'",
|
|
1879
|
-
"api: chip.set('tool', 'ghdl', 'task', 'import', 'stdout', 'destination', "
|
|
1880
|
-
"'log')"],
|
|
1881
|
-
schelp="""
|
|
1882
|
-
Defines where to direct the output generated over stdout.
|
|
1883
|
-
Supported options are:
|
|
1884
|
-
none: the stream generated to STDOUT is ignored.
|
|
1885
|
-
log: the generated stream is stored in <step>.<suffix>; if not in quiet mode,
|
|
1886
|
-
it is additionally dumped to the display.
|
|
1887
|
-
output: the generated stream is stored in outputs/<design>.<suffix>.""")
|
|
1888
|
-
|
|
1889
|
-
scparam(cfg, ['tool', tool, 'task', task, 'stdout', 'suffix'],
|
|
1890
|
-
sctype='str',
|
|
1891
|
-
defvalue='log',
|
|
1892
|
-
scope=Scope.JOB,
|
|
1893
|
-
pernode=PerNode.OPTIONAL,
|
|
1894
|
-
shorthelp="Task: file suffix for redirected stdout",
|
|
1895
|
-
switch="-tool_task_stdout_suffix 'tool task <str>'",
|
|
1896
|
-
example=["cli: -tool_task_stdout_suffix 'ghdl import log'",
|
|
1897
|
-
"api: chip.set('tool', ghdl', 'task', 'import', 'stdout', 'suffix', 'log')"],
|
|
1898
|
-
schelp="""
|
|
1899
|
-
Specifies the file extension for the content redirected from stdout.""")
|
|
1900
|
-
|
|
1901
|
-
scparam(cfg, ['tool', tool, 'task', task, 'stderr', 'destination'],
|
|
1902
|
-
sctype='enum',
|
|
1903
|
-
enum=dest_enum,
|
|
1904
|
-
defvalue='log',
|
|
1905
|
-
scope=Scope.JOB,
|
|
1906
|
-
pernode=PerNode.OPTIONAL,
|
|
1907
|
-
shorthelp="Task: destination for stderr",
|
|
1908
|
-
switch="-tool_task_stderr_destination 'tool task <str>'",
|
|
1909
|
-
example=["cli: -tool_task_stderr_destination 'ghdl import log'",
|
|
1910
|
-
"api: chip.set('tool', ghdl', 'task', 'import', 'stderr', 'destination', "
|
|
1911
|
-
"'log')"],
|
|
1912
|
-
schelp="""
|
|
1913
|
-
Defines where to direct the output generated over stderr.
|
|
1914
|
-
Supported options are:
|
|
1915
|
-
none: the stream generated to STDERR is ignored
|
|
1916
|
-
log: the generated stream is stored in <step>.<suffix>; if not in quiet mode,
|
|
1917
|
-
it is additionally dumped to the display.
|
|
1918
|
-
output: the generated stream is stored in outputs/<design>.<suffix>""")
|
|
1919
|
-
|
|
1920
|
-
scparam(cfg, ['tool', tool, 'task', task, 'stderr', 'suffix'],
|
|
1921
|
-
sctype='str',
|
|
1922
|
-
defvalue='log',
|
|
1923
|
-
scope=Scope.JOB,
|
|
1924
|
-
pernode=PerNode.OPTIONAL,
|
|
1925
|
-
shorthelp="Task: file suffix for redirected stderr",
|
|
1926
|
-
switch="-tool_task_stderr_suffix 'tool task <str>'",
|
|
1927
|
-
example=["cli: -tool_task_stderr_suffix 'ghdl import log'",
|
|
1928
|
-
"api: chip.set('tool', 'ghdl', 'task', 'import', 'stderr', 'suffix', 'log')"],
|
|
1929
|
-
schelp="""
|
|
1930
|
-
Specifies the file extension for the content redirected from stderr.""")
|
|
1931
|
-
|
|
1932
|
-
scparam(cfg, ['tool', tool, 'task', task, 'require'],
|
|
1933
|
-
sctype='[str]',
|
|
1934
|
-
pernode=PerNode.OPTIONAL,
|
|
1935
|
-
shorthelp="Task: parameter requirements",
|
|
1936
|
-
switch="-tool_task_require 'tool task <str>'",
|
|
1937
|
-
example=[
|
|
1938
|
-
"cli: -tool_task_require 'openroad cts design'",
|
|
1939
|
-
"api: chip.set('tool', 'openroad', 'task', 'cts', 'require', 'design')"],
|
|
1940
|
-
schelp="""
|
|
1941
|
-
List of keypaths to required task parameters. The list is used
|
|
1942
|
-
by :meth:`.check_manifest()` to verify that all parameters have been set up before
|
|
1943
|
-
step execution begins.""")
|
|
1944
|
-
|
|
1945
|
-
metric = 'default'
|
|
1946
|
-
scparam(cfg, ['tool', tool, 'task', task, 'report', metric],
|
|
1947
|
-
sctype='[file]',
|
|
1948
|
-
pernode=PerNode.REQUIRED,
|
|
1949
|
-
shorthelp="Task: metric report files",
|
|
1950
|
-
switch="-tool_task_report 'tool task metric <file>'",
|
|
1951
|
-
example=[
|
|
1952
|
-
"cli: -tool_task_report 'openroad place holdtns place 0 place.log'",
|
|
1953
|
-
"api: chip.set('tool', 'openroad', 'task', 'place', 'report', 'holdtns', "
|
|
1954
|
-
"'place.log', step='place', index='0')"],
|
|
1955
|
-
schelp="""
|
|
1956
|
-
List of report files associated with a specific 'metric'. The file path
|
|
1957
|
-
specified is relative to the run directory of the current task.""")
|
|
1958
|
-
|
|
1959
|
-
scparam(cfg, ['tool', tool, 'task', task, 'refdir'],
|
|
1960
|
-
sctype='[dir]',
|
|
1961
|
-
pernode=PerNode.OPTIONAL,
|
|
1962
|
-
shorthelp="Task: script directory",
|
|
1963
|
-
switch="-tool_task_refdir 'tool task <dir>'",
|
|
1964
|
-
example=[
|
|
1965
|
-
"cli: -tool_task_refdir 'yosys syn ./myref'",
|
|
1966
|
-
"api: chip.set('tool', 'yosys', 'task', 'syn_asic', 'refdir', './myref')"],
|
|
1967
|
-
schelp="""
|
|
1968
|
-
Path to directories containing reference flow scripts, specified
|
|
1969
|
-
on a per step and index basis.""")
|
|
1970
|
-
|
|
1971
|
-
scparam(cfg, ['tool', tool, 'task', task, 'script'],
|
|
1972
|
-
sctype='[file]',
|
|
1973
|
-
pernode=PerNode.OPTIONAL,
|
|
1974
|
-
shorthelp="Task: entry script",
|
|
1975
|
-
switch="-tool_task_script 'tool task <file>'",
|
|
1976
|
-
example=[
|
|
1977
|
-
"cli: -tool_task_script 'yosys syn syn.tcl'",
|
|
1978
|
-
"api: chip.set('tool', 'yosys', 'task', 'syn_asic', 'script', 'syn.tcl')"],
|
|
1979
|
-
schelp="""
|
|
1980
|
-
Path to the entry script called by the executable specified
|
|
1981
|
-
on a per task and per step basis.""")
|
|
1982
|
-
|
|
1983
|
-
scparam(cfg, ['tool', tool, 'task', task, 'prescript'],
|
|
1984
|
-
sctype='[file]',
|
|
1985
|
-
pernode=PerNode.OPTIONAL,
|
|
1986
|
-
copy=True,
|
|
1987
|
-
shorthelp="Task: pre-step script",
|
|
1988
|
-
switch="-tool_task_prescript 'tool task <file>'",
|
|
1989
|
-
example=[
|
|
1990
|
-
"cli: -tool_task_prescript 'yosys syn syn_pre.tcl'",
|
|
1991
|
-
"api: chip.set('tool', 'yosys', 'task', 'syn_asic', 'prescript', 'syn_pre.tcl')"],
|
|
1992
|
-
schelp="""
|
|
1993
|
-
Path to a user supplied script to execute after reading in the design
|
|
1994
|
-
but before the main execution stage of the step. Exact entry point
|
|
1995
|
-
depends on the step and main script being executed. An example
|
|
1996
|
-
of a prescript entry point would be immediately before global
|
|
1997
|
-
placement.""")
|
|
1998
|
-
|
|
1999
|
-
scparam(cfg, ['tool', tool, 'task', task, 'postscript'],
|
|
2000
|
-
sctype='[file]',
|
|
2001
|
-
pernode=PerNode.OPTIONAL,
|
|
2002
|
-
copy=True,
|
|
2003
|
-
shorthelp="Task: post-step script",
|
|
2004
|
-
switch="-tool_task_postscript 'tool task <file>'",
|
|
2005
|
-
example=[
|
|
2006
|
-
"cli: -tool_task_postscript 'yosys syn syn_post.tcl'",
|
|
2007
|
-
"api: chip.set('tool', 'yosys', 'task', 'syn_asic', 'postscript', 'syn_post.tcl')"],
|
|
2008
|
-
schelp="""
|
|
2009
|
-
Path to a user supplied script to execute after the main execution
|
|
2010
|
-
stage of the step but before the design is saved.
|
|
2011
|
-
Exact entry point depends on the step and main script being
|
|
2012
|
-
executed. An example of a postscript entry point would be immediately
|
|
2013
|
-
after global placement.""")
|
|
2014
|
-
|
|
2015
|
-
scparam(cfg, ['tool', tool, 'task', task, 'threads'],
|
|
2016
|
-
sctype='int',
|
|
2017
|
-
pernode=PerNode.OPTIONAL,
|
|
2018
|
-
shorthelp="Task: thread parallelism",
|
|
2019
|
-
switch="-tool_task_threads 'tool task <int>'",
|
|
2020
|
-
example=["cli: -tool_task_threads 'magic drc 64'",
|
|
2021
|
-
"api: chip.set('tool', 'magic', 'task', 'drc', 'threads', '64')"],
|
|
2022
|
-
schelp="""
|
|
2023
|
-
Thread parallelism to use for execution specified on a per task and per
|
|
2024
|
-
step basis. If not specified, SC queries the operating system and sets
|
|
2025
|
-
the threads based on the maximum thread count supported by the
|
|
2026
|
-
hardware.""")
|
|
2027
|
-
|
|
1026
|
+
def schema_tool(cfg):
|
|
1027
|
+
from siliconcompiler.tool import ToolSchema
|
|
1028
|
+
cfg.insert("tool", "default", ToolSchema())
|
|
2028
1029
|
return cfg
|
|
2029
1030
|
|
|
2030
1031
|
|
|
@@ -2067,480 +1068,18 @@ def schema_arg(cfg):
|
|
|
2067
1068
|
###########################################################################
|
|
2068
1069
|
# Metrics to Track
|
|
2069
1070
|
###########################################################################
|
|
2070
|
-
def schema_metric(cfg
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
'warnings': 'warnings',
|
|
2074
|
-
'drvs': 'design rule violations',
|
|
2075
|
-
'drcs': 'physical design rule violations',
|
|
2076
|
-
'unconstrained': 'unconstrained timing paths'}
|
|
2077
|
-
|
|
2078
|
-
for item, val in metrics.items():
|
|
2079
|
-
scparam(cfg, ['metric', item],
|
|
2080
|
-
sctype='int',
|
|
2081
|
-
shorthelp=f"Metric: total {item}",
|
|
2082
|
-
switch=f"-metric_{item} 'step index <int>'",
|
|
2083
|
-
example=[
|
|
2084
|
-
f"cli: -metric_{item} 'dfm 0 0'",
|
|
2085
|
-
f"api: chip.set('metric', '{item}', 0, step='dfm', index=0)"],
|
|
2086
|
-
pernode=PerNode.REQUIRED,
|
|
2087
|
-
schelp=f"""Metric tracking the total number of {val} on a
|
|
2088
|
-
per step and index basis.""")
|
|
2089
|
-
|
|
2090
|
-
scparam(cfg, ['metric', 'coverage'],
|
|
2091
|
-
sctype='float',
|
|
2092
|
-
unit='%',
|
|
2093
|
-
shorthelp="Metric: coverage",
|
|
2094
|
-
switch="-metric_coverage 'step index <float>'",
|
|
2095
|
-
example=[
|
|
2096
|
-
"cli: -metric_coverage 'place 0 99.9'",
|
|
2097
|
-
"api: chip.set('metric', 'coverage', 99.9, step='place', index=0)"],
|
|
2098
|
-
pernode=PerNode.REQUIRED,
|
|
2099
|
-
schelp="""
|
|
2100
|
-
Metric tracking the test coverage in the design expressed as a percentage
|
|
2101
|
-
with 100 meaning full coverage. The meaning of the metric depends on the
|
|
2102
|
-
task being executed. It can refer to code coverage, feature coverage,
|
|
2103
|
-
stuck at fault coverage.""")
|
|
2104
|
-
|
|
2105
|
-
scparam(cfg, ['metric', 'security'],
|
|
2106
|
-
sctype='float',
|
|
2107
|
-
unit='%',
|
|
2108
|
-
shorthelp="Metric: security",
|
|
2109
|
-
switch="-metric_security 'step index <float>'",
|
|
2110
|
-
example=[
|
|
2111
|
-
"cli: -metric_security 'place 0 100'",
|
|
2112
|
-
"api: chip.set('metric', 'security', 100, step='place', index=0)"],
|
|
2113
|
-
pernode=PerNode.REQUIRED,
|
|
2114
|
-
schelp="""
|
|
2115
|
-
Metric tracking the level of security (1/vulnerability) of the design.
|
|
2116
|
-
A completely secure design would have a score of 100. There is no
|
|
2117
|
-
absolute scale for the security metrics (like with power, area, etc)
|
|
2118
|
-
so the metric will be task and tool dependent.""")
|
|
2119
|
-
|
|
2120
|
-
metrics = {'luts': 'FPGA LUTs used',
|
|
2121
|
-
'dsps': 'FPGA DSP slices used',
|
|
2122
|
-
'brams': 'FPGA BRAM tiles used'}
|
|
2123
|
-
|
|
2124
|
-
for item, val in metrics.items():
|
|
2125
|
-
scparam(cfg, ['metric', item],
|
|
2126
|
-
sctype='int',
|
|
2127
|
-
|
|
2128
|
-
shorthelp=f"Metric: {val}",
|
|
2129
|
-
switch=f"-metric_{item} 'step index <int>'",
|
|
2130
|
-
example=[
|
|
2131
|
-
f"cli: -metric_{item} 'place 0 100'",
|
|
2132
|
-
f"api: chip.set('metric', '{item}', 100, step='place', index=0)"],
|
|
2133
|
-
pernode=PerNode.REQUIRED,
|
|
2134
|
-
schelp=f"""
|
|
2135
|
-
Metric tracking the total {val} used by the design as reported
|
|
2136
|
-
by the implementation tool. There is no standardized definition
|
|
2137
|
-
for this metric across vendors, so metric comparisons can
|
|
2138
|
-
generally only be done between runs on identical tools and
|
|
2139
|
-
device families.""")
|
|
2140
|
-
|
|
2141
|
-
metrics = {'cellarea': 'cell area (ignoring fillers)',
|
|
2142
|
-
'totalarea': 'physical die area',
|
|
2143
|
-
'macroarea': 'macro cell area',
|
|
2144
|
-
'padcellarea': 'io pad cell area',
|
|
2145
|
-
'stdcellarea': 'standard cell area'}
|
|
2146
|
-
|
|
2147
|
-
for item, val in metrics.items():
|
|
2148
|
-
scparam(cfg, ['metric', item],
|
|
2149
|
-
sctype='float',
|
|
2150
|
-
unit='um^2',
|
|
2151
|
-
shorthelp=f"Metric: {item}",
|
|
2152
|
-
switch=f"-metric_{item} 'step index <float>'",
|
|
2153
|
-
example=[
|
|
2154
|
-
f"cli: -metric_{item} 'place 0 100.00'",
|
|
2155
|
-
f"api: chip.set('metric', '{item}', 100.00, step='place', index=0)"],
|
|
2156
|
-
pernode=PerNode.REQUIRED,
|
|
2157
|
-
schelp=f"""
|
|
2158
|
-
Metric tracking the total {val} occupied by the design.""")
|
|
2159
|
-
|
|
2160
|
-
scparam(cfg, ['metric', 'utilization'],
|
|
2161
|
-
sctype='float',
|
|
2162
|
-
unit='%',
|
|
2163
|
-
shorthelp="Metric: area utilization",
|
|
2164
|
-
switch="-metric_utilization step index <float>",
|
|
2165
|
-
example=[
|
|
2166
|
-
"cli: -metric_utilization 'place 0 50.00'",
|
|
2167
|
-
"api: chip.set('metric', 'utilization', 50.00, step='place', index=0)"],
|
|
2168
|
-
pernode=PerNode.REQUIRED,
|
|
2169
|
-
schelp="""
|
|
2170
|
-
Metric tracking the area utilization of the design calculated as
|
|
2171
|
-
100 * (cellarea/totalarea).""")
|
|
2172
|
-
|
|
2173
|
-
scparam(cfg, ['metric', 'logicdepth'],
|
|
2174
|
-
sctype='int',
|
|
2175
|
-
shorthelp="Metric: logic depth",
|
|
2176
|
-
switch="-metric_logicdepth step index <int>",
|
|
2177
|
-
example=[
|
|
2178
|
-
"cli: -metric_logicdepth 'place 0 8'",
|
|
2179
|
-
"api: chip.set('metric', 'logicdepth', 8, step='place', index=0)"],
|
|
2180
|
-
pernode=PerNode.REQUIRED,
|
|
2181
|
-
schelp="""
|
|
2182
|
-
Metric tracking the logic depth of the design. This is determined
|
|
2183
|
-
by the number of logic gates between the start of the critital timing
|
|
2184
|
-
path to the end of the path.""")
|
|
2185
|
-
|
|
2186
|
-
metrics = {'peakpower': 'worst case total peak power',
|
|
2187
|
-
'averagepower': 'average workload power',
|
|
2188
|
-
'leakagepower': 'leakage power with rails active but without any dynamic '
|
|
2189
|
-
'switching activity'}
|
|
2190
|
-
|
|
2191
|
-
for item, val in metrics.items():
|
|
2192
|
-
scparam(cfg, ['metric', item],
|
|
2193
|
-
sctype='float',
|
|
2194
|
-
unit='mw',
|
|
2195
|
-
shorthelp=f"Metric: {item}",
|
|
2196
|
-
switch=f"-metric_{item} 'step index <float>'",
|
|
2197
|
-
example=[
|
|
2198
|
-
f"cli: -metric_{item} 'place 0 0.01'",
|
|
2199
|
-
f"api: chip.set('metric', '{item}', 0.01, step='place', index=0)"],
|
|
2200
|
-
pernode=PerNode.REQUIRED,
|
|
2201
|
-
schelp=f"""
|
|
2202
|
-
Metric tracking the {val} of the design specified on a per step
|
|
2203
|
-
and index basis. Power metric depend heavily on the method
|
|
2204
|
-
being used for extraction: dynamic vs static, workload
|
|
2205
|
-
specification (vcd vs saif), power models, process/voltage/temperature.
|
|
2206
|
-
The power {item} metric tries to capture the data that would
|
|
2207
|
-
usually be reflected inside a datasheet given the appropriate
|
|
2208
|
-
footnote conditions.""")
|
|
2209
|
-
|
|
2210
|
-
scparam(cfg, ['metric', 'irdrop'],
|
|
2211
|
-
sctype='float',
|
|
2212
|
-
unit='mv',
|
|
2213
|
-
shorthelp="Metric: peak IR drop",
|
|
2214
|
-
switch="-metric_irdrop 'step index <float>'",
|
|
2215
|
-
example=[
|
|
2216
|
-
"cli: -metric_irdrop 'place 0 0.05'",
|
|
2217
|
-
"api: chip.set('metric', 'irdrop', 0.05, step='place', index=0)"],
|
|
2218
|
-
pernode=PerNode.REQUIRED,
|
|
2219
|
-
schelp="""
|
|
2220
|
-
Metric tracking the peak IR drop in the design based on extracted
|
|
2221
|
-
power and ground rail parasitics, library power models, and
|
|
2222
|
-
switching activity. The switching activity calculated on a per
|
|
2223
|
-
node basis is taken from one of three possible sources, in order
|
|
2224
|
-
of priority: VCD file, SAIF file, 'activityfactor' parameter.""")
|
|
2225
|
-
|
|
2226
|
-
metrics = {'holdpaths': 'hold',
|
|
2227
|
-
'setuppaths': 'setup'}
|
|
2228
|
-
|
|
2229
|
-
for item, val in metrics.items():
|
|
2230
|
-
scparam(cfg, ['metric', item],
|
|
2231
|
-
sctype='int',
|
|
2232
|
-
shorthelp=f"Metric: {item}",
|
|
2233
|
-
switch=f"-metric_{item} 'step index <int>'",
|
|
2234
|
-
example=[
|
|
2235
|
-
f"cli: -metric_{item} 'place 0 10'",
|
|
2236
|
-
f"api: chip.set('metric', '{item}', 10, step='place', index=0)"],
|
|
2237
|
-
pernode=PerNode.REQUIRED,
|
|
2238
|
-
schelp=f"""
|
|
2239
|
-
Metric tracking the total number of timing paths violating {val}
|
|
2240
|
-
constraints.""")
|
|
2241
|
-
|
|
2242
|
-
metrics = {'holdslack': 'worst hold slack (positive or negative)',
|
|
2243
|
-
'holdwns': 'worst negative hold slack (positive values truncated to zero)',
|
|
2244
|
-
'holdtns': 'total negative hold slack (TNS)',
|
|
2245
|
-
'holdskew': 'hold clock skew',
|
|
2246
|
-
'setupslack': 'worst setup slack (positive or negative)',
|
|
2247
|
-
'setupwns': 'worst negative setup slack (positive values truncated to zero)',
|
|
2248
|
-
'setuptns': 'total negative setup slack (TNS)',
|
|
2249
|
-
'setupskew': 'setup clock skew'}
|
|
2250
|
-
|
|
2251
|
-
for item, val in metrics.items():
|
|
2252
|
-
scparam(cfg, ['metric', item],
|
|
2253
|
-
sctype='float',
|
|
2254
|
-
unit='ns',
|
|
2255
|
-
shorthelp=f"Metric: {item}",
|
|
2256
|
-
switch=f"-metric_{item} 'step index <float>'",
|
|
2257
|
-
example=[
|
|
2258
|
-
f"cli: -metric_{item} 'place 0 0.01'",
|
|
2259
|
-
f"api: chip.set('metric', '{item}', 0.01, step='place', index=0)"],
|
|
2260
|
-
pernode=PerNode.REQUIRED,
|
|
2261
|
-
schelp=f"""
|
|
2262
|
-
Metric tracking the {val} on a per step and index basis.""")
|
|
2263
|
-
|
|
2264
|
-
metrics = {'fmax': 'maximum clock frequency'}
|
|
2265
|
-
|
|
2266
|
-
for item, val in metrics.items():
|
|
2267
|
-
scparam(cfg, ['metric', item],
|
|
2268
|
-
sctype='float',
|
|
2269
|
-
unit='Hz',
|
|
2270
|
-
shorthelp=f"Metric: {item}",
|
|
2271
|
-
switch=f"-metric_{item} 'step index <float>'",
|
|
2272
|
-
example=[
|
|
2273
|
-
f"cli: -metric_{item} 'place 0 100e6'",
|
|
2274
|
-
f"api: chip.set('metric', '{item}', 100e6, step='place', index=0)"],
|
|
2275
|
-
pernode=PerNode.REQUIRED,
|
|
2276
|
-
schelp=f"""
|
|
2277
|
-
Metric tracking the {val} on a per step and index basis.""")
|
|
2278
|
-
|
|
2279
|
-
metrics = {'macros': 'macros',
|
|
2280
|
-
'cells': 'cell instances',
|
|
2281
|
-
'registers': 'register instances',
|
|
2282
|
-
'buffers': 'buffer instances',
|
|
2283
|
-
'inverters': 'inverter instances',
|
|
2284
|
-
'transistors': 'transistors',
|
|
2285
|
-
'pins': 'pins',
|
|
2286
|
-
'nets': 'nets',
|
|
2287
|
-
'vias': 'vias'}
|
|
2288
|
-
|
|
2289
|
-
for item, val in metrics.items():
|
|
2290
|
-
scparam(cfg, ['metric', item],
|
|
2291
|
-
sctype='int',
|
|
2292
|
-
shorthelp=f"Metric: {item}",
|
|
2293
|
-
switch=f"-metric_{item} 'step index <int>'",
|
|
2294
|
-
example=[
|
|
2295
|
-
f"cli: -metric_{item} 'place 0 100'",
|
|
2296
|
-
f"api: chip.set('metric', '{item}', 50, step='place', index=0)"],
|
|
2297
|
-
pernode=PerNode.REQUIRED,
|
|
2298
|
-
schelp=f"""
|
|
2299
|
-
Metric tracking the total number of {val} in the design
|
|
2300
|
-
on a per step and index basis.""")
|
|
2301
|
-
|
|
2302
|
-
item = 'wirelength'
|
|
2303
|
-
scparam(cfg, ['metric', item],
|
|
2304
|
-
sctype='float',
|
|
2305
|
-
unit='um',
|
|
2306
|
-
shorthelp=f"Metric: {item}",
|
|
2307
|
-
switch=f"-metric_{item} 'step index <float>'",
|
|
2308
|
-
example=[
|
|
2309
|
-
f"cli: -metric_{item} 'place 0 100.0'",
|
|
2310
|
-
f"api: chip.set('metric', '{item}', 50.0, step='place', index=0)"],
|
|
2311
|
-
pernode=PerNode.REQUIRED,
|
|
2312
|
-
schelp=f"""
|
|
2313
|
-
Metric tracking the total {item} of the design on a per step
|
|
2314
|
-
and index basis.""")
|
|
2315
|
-
|
|
2316
|
-
item = 'overflow'
|
|
2317
|
-
scparam(cfg, ['metric', item],
|
|
2318
|
-
sctype='int',
|
|
2319
|
-
shorthelp=f"Metric: {item}",
|
|
2320
|
-
switch=f"-metric_{item} 'step index <int>'",
|
|
2321
|
-
example=[
|
|
2322
|
-
f"cli: -metric_{item} 'place 0 0'",
|
|
2323
|
-
f"api: chip.set('metric', '{item}', 50, step='place', index=0)"],
|
|
2324
|
-
pernode=PerNode.REQUIRED,
|
|
2325
|
-
schelp="""
|
|
2326
|
-
Metric tracking the total number of overflow tracks for the routing
|
|
2327
|
-
on per step and index basis. Any non-zero number suggests an over
|
|
2328
|
-
congested design. To analyze where the congestion is occurring
|
|
2329
|
-
inspect the router log files for detailed per metal overflow
|
|
2330
|
-
reporting and open up the design to find routing hotspots.""")
|
|
2331
|
-
|
|
2332
|
-
item = 'memory'
|
|
2333
|
-
scparam(cfg, ['metric', item],
|
|
2334
|
-
sctype='float',
|
|
2335
|
-
unit='B',
|
|
2336
|
-
scope=Scope.JOB,
|
|
2337
|
-
shorthelp=f"Metric: {item}",
|
|
2338
|
-
switch=f"-metric_{item} 'step index <float>'",
|
|
2339
|
-
example=[
|
|
2340
|
-
f"cli: -metric_{item} 'dfm 0 10e9'",
|
|
2341
|
-
f"api: chip.set('metric', '{item}', 10e9, step='dfm', index=0)"],
|
|
2342
|
-
pernode=PerNode.REQUIRED,
|
|
2343
|
-
schelp="""
|
|
2344
|
-
Metric tracking total peak program memory footprint on a per
|
|
2345
|
-
step and index basis.""")
|
|
2346
|
-
|
|
2347
|
-
item = 'exetime'
|
|
2348
|
-
scparam(cfg, ['metric', item],
|
|
2349
|
-
sctype='float',
|
|
2350
|
-
unit='s',
|
|
2351
|
-
shorthelp=f"Metric: {item}",
|
|
2352
|
-
switch=f"-metric_{item} 'step index <float>'",
|
|
2353
|
-
example=[
|
|
2354
|
-
f"cli: -metric_{item} 'dfm 0 10.0'",
|
|
2355
|
-
f"api: chip.set('metric', '{item}', 10.0, step='dfm', index=0)"],
|
|
2356
|
-
pernode=PerNode.REQUIRED,
|
|
2357
|
-
schelp="""
|
|
2358
|
-
Metric tracking time spent by the EDA executable :keypath:`tool,<tool>,exe` on a
|
|
2359
|
-
per step and index basis. It does not include the SiliconCompiler
|
|
2360
|
-
runtime overhead or time waiting for I/O operations and
|
|
2361
|
-
inter-processor communication to complete.""")
|
|
2362
|
-
|
|
2363
|
-
item = 'tasktime'
|
|
2364
|
-
scparam(cfg, ['metric', item],
|
|
2365
|
-
sctype='float',
|
|
2366
|
-
unit='s',
|
|
2367
|
-
shorthelp=f"Metric: {item}",
|
|
2368
|
-
switch=f"-metric_{item} 'step index <float>'",
|
|
2369
|
-
example=[
|
|
2370
|
-
f"cli: -metric_{item} 'dfm 0 10.0'",
|
|
2371
|
-
f"api: chip.set('metric', '{item}', 10.0, step='dfm', index=0)"],
|
|
2372
|
-
pernode=PerNode.REQUIRED,
|
|
2373
|
-
schelp="""
|
|
2374
|
-
Metric tracking the total amount of time spent on a task from
|
|
2375
|
-
beginning to end, including data transfers and pre/post
|
|
2376
|
-
processing.""")
|
|
2377
|
-
|
|
2378
|
-
item = 'totaltime'
|
|
2379
|
-
scparam(cfg, ['metric', item],
|
|
2380
|
-
sctype='float',
|
|
2381
|
-
unit='s',
|
|
2382
|
-
shorthelp=f"Metric: {item}",
|
|
2383
|
-
switch=f"-metric_{item} 'step index <float>'",
|
|
2384
|
-
example=[
|
|
2385
|
-
f"cli: -metric_{item} 'dfm 0 10.0'",
|
|
2386
|
-
f"api: chip.set('metric', '{item}', 10.0, step='dfm', index=0)"],
|
|
2387
|
-
pernode=PerNode.REQUIRED,
|
|
2388
|
-
schelp="""
|
|
2389
|
-
Metric tracking the total amount of time spent from the beginning
|
|
2390
|
-
of the run up to and including the current step and index.""")
|
|
2391
|
-
|
|
1071
|
+
def schema_metric(cfg):
|
|
1072
|
+
from siliconcompiler.metric import MetricSchema
|
|
1073
|
+
cfg.insert("metric", MetricSchema())
|
|
2392
1074
|
return cfg
|
|
2393
1075
|
|
|
2394
1076
|
|
|
2395
1077
|
###########################################################################
|
|
2396
1078
|
# Design Tracking
|
|
2397
1079
|
###########################################################################
|
|
2398
|
-
def schema_record(cfg
|
|
2399
|
-
|
|
2400
|
-
|
|
2401
|
-
# <key> : ['short help', 'example' 'extended help']
|
|
2402
|
-
|
|
2403
|
-
records = {'userid': ['userid',
|
|
2404
|
-
'wiley',
|
|
2405
|
-
''],
|
|
2406
|
-
'publickey': ['public key',
|
|
2407
|
-
'<key>',
|
|
2408
|
-
''],
|
|
2409
|
-
'machine': ['machine name',
|
|
2410
|
-
'carbon',
|
|
2411
|
-
'(myhost, localhost, ...'],
|
|
2412
|
-
'macaddr': ['MAC address',
|
|
2413
|
-
'<addr>',
|
|
2414
|
-
''],
|
|
2415
|
-
'ipaddr': ['IP address',
|
|
2416
|
-
'<addr>',
|
|
2417
|
-
''],
|
|
2418
|
-
'platform': ['platform name',
|
|
2419
|
-
'linux',
|
|
2420
|
-
'(linux, windows, freebsd)'],
|
|
2421
|
-
'distro': ['distro name',
|
|
2422
|
-
'ubuntu',
|
|
2423
|
-
'(ubuntu, redhat, centos)'],
|
|
2424
|
-
'arch': ['hardware architecture',
|
|
2425
|
-
'x86_64',
|
|
2426
|
-
'(x86_64, rv64imafdc)'],
|
|
2427
|
-
'starttime': ['start time',
|
|
2428
|
-
'2021-09-06 12:20:20',
|
|
2429
|
-
'Time is reported in the ISO 8601 format YYYY-MM-DD HR:MIN:SEC'],
|
|
2430
|
-
'endtime': ['end time',
|
|
2431
|
-
'2021-09-06 12:20:20',
|
|
2432
|
-
'Time is reported in the ISO 8601 format YYYY-MM-DD HR:MIN:SEC'],
|
|
2433
|
-
'region': ['cloud region',
|
|
2434
|
-
'US Gov Boston',
|
|
2435
|
-
"""Recommended naming methodology:
|
|
2436
|
-
|
|
2437
|
-
* local: node is the local machine
|
|
2438
|
-
* onprem: node in on-premises IT infrastructure
|
|
2439
|
-
* public: generic public cloud
|
|
2440
|
-
* govcloud: generic US government cloud
|
|
2441
|
-
* <region>: cloud and entity specific region string name
|
|
2442
|
-
"""],
|
|
2443
|
-
'scversion': ['software version',
|
|
2444
|
-
'1.0',
|
|
2445
|
-
"""Version number for the SiliconCompiler software."""],
|
|
2446
|
-
'toolversion': ['tool version',
|
|
2447
|
-
'1.0',
|
|
2448
|
-
"""The tool version captured corresponds to the 'tool'
|
|
2449
|
-
parameter within the 'tool' dictionary."""],
|
|
2450
|
-
'toolpath': ['tool path',
|
|
2451
|
-
'/usr/bin/openroad',
|
|
2452
|
-
"""Full path to tool executable used to run this
|
|
2453
|
-
task."""],
|
|
2454
|
-
'toolargs': ['tool CLI arguments',
|
|
2455
|
-
'-I include/ foo.v',
|
|
2456
|
-
'Arguments passed to tool via CLI.'],
|
|
2457
|
-
'pythonversion': ['Python version',
|
|
2458
|
-
'3.12.3',
|
|
2459
|
-
"""Version of python used to run this task."""],
|
|
2460
|
-
'osversion': ['O/S version',
|
|
2461
|
-
'20.04.1-Ubuntu',
|
|
2462
|
-
"""Since there is not standard version system for operating
|
|
2463
|
-
systems, extracting information from is platform dependent.
|
|
2464
|
-
For Linux based operating systems, the 'osversion' is the
|
|
2465
|
-
version of the distro."""],
|
|
2466
|
-
'kernelversion': ['O/S kernel version',
|
|
2467
|
-
'5.11.0-34-generic',
|
|
2468
|
-
"""Used for platforms that support a distinction
|
|
2469
|
-
between os kernels and os distributions."""]}
|
|
2470
|
-
|
|
2471
|
-
for item, val in records.items():
|
|
2472
|
-
helpext = trim(val[2])
|
|
2473
|
-
scparam(cfg, ['record', item],
|
|
2474
|
-
sctype='str',
|
|
2475
|
-
shorthelp=f"Record: {val[0]}",
|
|
2476
|
-
switch=f"-record_{item} 'step index <str>'",
|
|
2477
|
-
example=[
|
|
2478
|
-
f"cli: -record_{item} 'dfm 0 {val[1]}'",
|
|
2479
|
-
f"api: chip.set('record', '{item}', '{val[1]}', step='dfm', index=0)"],
|
|
2480
|
-
pernode=PerNode.REQUIRED,
|
|
2481
|
-
schelp=f'Record tracking the {val[0]} per step and index basis. {helpext}')
|
|
2482
|
-
|
|
2483
|
-
scparam(cfg, ['record', 'toolexitcode'],
|
|
2484
|
-
sctype='int',
|
|
2485
|
-
shorthelp="Record: tool exit code",
|
|
2486
|
-
switch="-record_toolexitcode 'step index <int>'",
|
|
2487
|
-
example=[
|
|
2488
|
-
"cli: -record_toolexitcode 'dfm 0 0'",
|
|
2489
|
-
"api: chip.set('record', 'toolexitcode', 0, step='dfm', index=0)"],
|
|
2490
|
-
pernode=PerNode.REQUIRED,
|
|
2491
|
-
schelp='Record tracking the tool exit code per step and index basis.')
|
|
2492
|
-
|
|
2493
|
-
# Non-per-node records.
|
|
2494
|
-
scparam(cfg, ['record', 'remoteid'],
|
|
2495
|
-
sctype='str',
|
|
2496
|
-
shorthelp="Record: remote job ID",
|
|
2497
|
-
switch="-record_remoteid '<str>'",
|
|
2498
|
-
example=[
|
|
2499
|
-
"cli: -record_remoteid '0123456789abcdeffedcba9876543210'",
|
|
2500
|
-
"api: chip.set('record', 'remoteid', '0123456789abcdeffedcba9876543210')"],
|
|
2501
|
-
schelp='Record tracking the job ID for a remote run.')
|
|
2502
|
-
|
|
2503
|
-
scparam(cfg, ['record', 'pythonpackage'],
|
|
2504
|
-
sctype='[str]',
|
|
2505
|
-
shorthelp="Record: python packages",
|
|
2506
|
-
switch="-record_pythonpackage '<str>'",
|
|
2507
|
-
example=[
|
|
2508
|
-
"cli: -record_pythonpackage 'siliconcompiler==0.28.0'",
|
|
2509
|
-
"api: chip.set('record', 'pythonpackage', 'siliconcompiler==0.28.0')"],
|
|
2510
|
-
schelp='Record tracking for the python packages installed.')
|
|
2511
|
-
|
|
2512
|
-
# flowgraph status
|
|
2513
|
-
scparam(cfg, ['record', 'status'],
|
|
2514
|
-
sctype='enum',
|
|
2515
|
-
pernode=PerNode.REQUIRED,
|
|
2516
|
-
enum=[ # keep in sync with NodeStatus
|
|
2517
|
-
"pending",
|
|
2518
|
-
"queued",
|
|
2519
|
-
"running",
|
|
2520
|
-
"success",
|
|
2521
|
-
"error",
|
|
2522
|
-
"skipped",
|
|
2523
|
-
"timeout"],
|
|
2524
|
-
shorthelp="Record: node execution status",
|
|
2525
|
-
switch="-record_status 'step index <str>'",
|
|
2526
|
-
example=[
|
|
2527
|
-
"cli: -record_status 'syn 0 success'",
|
|
2528
|
-
"api: chip.set('record', 'status', 'success', step='syn', index='0')"],
|
|
2529
|
-
schelp="""Record tracking for the status of a node.""")
|
|
2530
|
-
|
|
2531
|
-
# flowgraph select
|
|
2532
|
-
scparam(cfg, ['record', 'inputnode'],
|
|
2533
|
-
sctype='[(str,str)]',
|
|
2534
|
-
pernode=PerNode.REQUIRED,
|
|
2535
|
-
shorthelp="Record: node inputs",
|
|
2536
|
-
switch="-record_inputnode 'step index <(str,str)>'",
|
|
2537
|
-
example=[
|
|
2538
|
-
"cli: -record_inputnode 'cts 0 (place,42)'",
|
|
2539
|
-
"api: chip.set('record', 'inputnode', ('place', '42'), step='syn', index='0')"],
|
|
2540
|
-
schelp="""
|
|
2541
|
-
List of selected inputs for the current step/index specified as
|
|
2542
|
-
(in_step, in_index) tuple.""")
|
|
2543
|
-
|
|
1080
|
+
def schema_record(cfg):
|
|
1081
|
+
from siliconcompiler.record import RecordSchema
|
|
1082
|
+
cfg.insert("record", RecordSchema())
|
|
2544
1083
|
return cfg
|
|
2545
1084
|
|
|
2546
1085
|
|
|
@@ -2743,8 +1282,7 @@ def schema_option(cfg):
|
|
|
2743
1282
|
not directly supported by the schema.""")
|
|
2744
1283
|
|
|
2745
1284
|
scparam(cfg, ['option', 'loglevel'],
|
|
2746
|
-
sctype='
|
|
2747
|
-
enum=["info", "warning", "error", "critical", "debug", "quiet"],
|
|
1285
|
+
sctype='<info,warning,error,critical,debug,quiet>',
|
|
2748
1286
|
pernode=PerNode.OPTIONAL,
|
|
2749
1287
|
scope=Scope.JOB,
|
|
2750
1288
|
defvalue='info',
|
|
@@ -3077,8 +1615,7 @@ def schema_option(cfg):
|
|
|
3077
1615
|
|
|
3078
1616
|
# job scheduler
|
|
3079
1617
|
scparam(cfg, ['option', 'scheduler', 'name'],
|
|
3080
|
-
sctype='
|
|
3081
|
-
enum=["slurm", "lsf", "sge", "docker"],
|
|
1618
|
+
sctype='<slurm,lsf,sge,docker>',
|
|
3082
1619
|
scope=Scope.JOB,
|
|
3083
1620
|
pernode=PerNode.OPTIONAL,
|
|
3084
1621
|
shorthelp="Option: scheduler platform",
|
|
@@ -3169,8 +1706,7 @@ def schema_option(cfg):
|
|
|
3169
1706
|
For more information, see the job scheduler documentation.""")
|
|
3170
1707
|
|
|
3171
1708
|
scparam(cfg, ['option', 'scheduler', 'msgevent'],
|
|
3172
|
-
sctype='[
|
|
3173
|
-
enum=['all', 'summary', 'begin', 'end', 'timeout', 'fail'],
|
|
1709
|
+
sctype='[<all,summary,begin,end,timeout,fail>]',
|
|
3174
1710
|
scope=Scope.JOB,
|
|
3175
1711
|
pernode=PerNode.OPTIONAL,
|
|
3176
1712
|
shorthelp="Option: message event trigger",
|
|
@@ -3385,123 +1921,8 @@ def schema_package(cfg):
|
|
|
3385
1921
|
# Design Checklist
|
|
3386
1922
|
############################################
|
|
3387
1923
|
def schema_checklist(cfg):
|
|
3388
|
-
|
|
3389
|
-
|
|
3390
|
-
standard = 'default'
|
|
3391
|
-
metric = 'default'
|
|
3392
|
-
|
|
3393
|
-
scparam(cfg, ['checklist', standard, item, 'description'],
|
|
3394
|
-
sctype='str',
|
|
3395
|
-
scope=Scope.GLOBAL,
|
|
3396
|
-
shorthelp="Checklist: item description",
|
|
3397
|
-
switch="-checklist_description 'standard item <str>'",
|
|
3398
|
-
example=[
|
|
3399
|
-
"cli: -checklist_description 'ISO D000 A-DESCRIPTION'",
|
|
3400
|
-
"api: chip.set('checklist', 'ISO', 'D000', 'description', 'A-DESCRIPTION')"],
|
|
3401
|
-
schelp="""
|
|
3402
|
-
A short one line description of the checklist item.""")
|
|
3403
|
-
|
|
3404
|
-
scparam(cfg, ['checklist', standard, item, 'requirement'],
|
|
3405
|
-
sctype='str',
|
|
3406
|
-
scope=Scope.GLOBAL,
|
|
3407
|
-
shorthelp="Checklist: item requirement",
|
|
3408
|
-
switch="-checklist_requirement 'standard item <str>'",
|
|
3409
|
-
example=[
|
|
3410
|
-
"cli: -checklist_requirement 'ISO D000 DOCSTRING'",
|
|
3411
|
-
"api: chip.set('checklist', 'ISO', 'D000', 'requirement', 'DOCSTRING')"],
|
|
3412
|
-
schelp="""
|
|
3413
|
-
A complete requirement description of the checklist item
|
|
3414
|
-
entered as a multi-line string.""")
|
|
3415
|
-
|
|
3416
|
-
scparam(cfg, ['checklist', standard, item, 'dataformat'],
|
|
3417
|
-
sctype='str',
|
|
3418
|
-
scope=Scope.GLOBAL,
|
|
3419
|
-
shorthelp="Checklist: item data format",
|
|
3420
|
-
switch="-checklist_dataformat 'standard item <str>'",
|
|
3421
|
-
example=[
|
|
3422
|
-
"cli: -checklist_dataformat 'ISO D000 dataformat README'",
|
|
3423
|
-
"api: chip.set('checklist', 'ISO', 'D000', 'dataformat', 'README')"],
|
|
3424
|
-
schelp="""
|
|
3425
|
-
Free text description of the type of data files acceptable as
|
|
3426
|
-
checklist signoff validation.""")
|
|
3427
|
-
|
|
3428
|
-
scparam(cfg, ['checklist', standard, item, 'rationale'],
|
|
3429
|
-
sctype='[str]',
|
|
3430
|
-
scope=Scope.GLOBAL,
|
|
3431
|
-
shorthelp="Checklist: item rational",
|
|
3432
|
-
switch="-checklist_rationale 'standard item <str>'",
|
|
3433
|
-
example=[
|
|
3434
|
-
"cli: -checklist_rationale 'ISO D000 reliability'",
|
|
3435
|
-
"api: chip.set('checklist', 'ISO', 'D000', 'rationale', 'reliability')"],
|
|
3436
|
-
schelp="""
|
|
3437
|
-
Rationale for the the checklist item. Rationale should be a
|
|
3438
|
-
unique alphanumeric code used by the standard or a short one line
|
|
3439
|
-
or single word description.""")
|
|
3440
|
-
|
|
3441
|
-
scparam(cfg, ['checklist', standard, item, 'criteria'],
|
|
3442
|
-
sctype='[str]',
|
|
3443
|
-
scope=Scope.GLOBAL,
|
|
3444
|
-
shorthelp="Checklist: item criteria",
|
|
3445
|
-
switch="-checklist_criteria 'standard item <str>'",
|
|
3446
|
-
example=[
|
|
3447
|
-
"cli: -checklist_criteria 'ISO D000 errors==0'",
|
|
3448
|
-
"api: chip.set('checklist', 'ISO', 'D000', 'criteria', 'errors==0')"],
|
|
3449
|
-
schelp="""
|
|
3450
|
-
Simple list of signoff criteria for checklist item which
|
|
3451
|
-
must all be met for signoff. Each signoff criteria consists of
|
|
3452
|
-
a metric, a relational operator, and a value in the form.
|
|
3453
|
-
'metric op value'.""")
|
|
3454
|
-
|
|
3455
|
-
scparam(cfg, ['checklist', standard, item, 'task'],
|
|
3456
|
-
sctype='[(str,str,str)]',
|
|
3457
|
-
scope=Scope.GLOBAL,
|
|
3458
|
-
shorthelp="Checklist: item task",
|
|
3459
|
-
switch="-checklist_task 'standard item <(str,str,str)>'",
|
|
3460
|
-
example=[
|
|
3461
|
-
"cli: -checklist_task 'ISO D000 (job0,place,0)'",
|
|
3462
|
-
"api: chip.set('checklist', 'ISO', 'D000', 'task', ('job0', 'place', '0'))"],
|
|
3463
|
-
schelp="""
|
|
3464
|
-
Flowgraph job and task used to verify the checklist item.
|
|
3465
|
-
The parameter should be left empty for manual and for tool
|
|
3466
|
-
flows that bypass the SC infrastructure.""")
|
|
3467
|
-
|
|
3468
|
-
scparam(cfg, ['checklist', standard, item, 'report'],
|
|
3469
|
-
sctype='[file]',
|
|
3470
|
-
scope=Scope.GLOBAL,
|
|
3471
|
-
shorthelp="Checklist: item report",
|
|
3472
|
-
switch="-checklist_report 'standard item <file>'",
|
|
3473
|
-
example=[
|
|
3474
|
-
"cli: -checklist_report 'ISO D000 my.rpt'",
|
|
3475
|
-
"api: chip.set('checklist', 'ISO', 'D000', 'report', 'my.rpt')"],
|
|
3476
|
-
schelp="""
|
|
3477
|
-
Filepath to report(s) of specified type documenting the successful
|
|
3478
|
-
validation of the checklist item.""")
|
|
3479
|
-
|
|
3480
|
-
scparam(cfg, ['checklist', standard, item, 'waiver', metric],
|
|
3481
|
-
sctype='[file]',
|
|
3482
|
-
scope=Scope.GLOBAL,
|
|
3483
|
-
shorthelp="Checklist: item metric waivers",
|
|
3484
|
-
switch="-checklist_waiver 'standard item metric <file>'",
|
|
3485
|
-
example=[
|
|
3486
|
-
"cli: -checklist_waiver 'ISO D000 bold my.txt'",
|
|
3487
|
-
"api: chip.set('checklist', 'ISO', 'D000', 'waiver', 'hold', 'my.txt')"],
|
|
3488
|
-
schelp="""
|
|
3489
|
-
Filepath to report(s) documenting waivers for the checklist
|
|
3490
|
-
item specified on a per metric basis.""")
|
|
3491
|
-
|
|
3492
|
-
scparam(cfg, ['checklist', standard, item, 'ok'],
|
|
3493
|
-
sctype='bool',
|
|
3494
|
-
scope=Scope.GLOBAL,
|
|
3495
|
-
shorthelp="Checklist: item ok",
|
|
3496
|
-
switch="-checklist_ok 'standard item <bool>'",
|
|
3497
|
-
example=[
|
|
3498
|
-
"cli: -checklist_ok 'ISO D000 true'",
|
|
3499
|
-
"api: chip.set('checklist', 'ISO', 'D000', 'ok', True)"],
|
|
3500
|
-
schelp="""
|
|
3501
|
-
Boolean check mark for the checklist item. A value of
|
|
3502
|
-
True indicates a human has inspected the all item dictionary
|
|
3503
|
-
parameters check out.""")
|
|
3504
|
-
|
|
1924
|
+
from siliconcompiler.checklist import ChecklistSchema
|
|
1925
|
+
cfg.insert("checklist", "default", ChecklistSchema())
|
|
3505
1926
|
return cfg
|
|
3506
1927
|
|
|
3507
1928
|
|
|
@@ -3509,99 +1930,8 @@ def schema_checklist(cfg):
|
|
|
3509
1930
|
# ASIC Setup
|
|
3510
1931
|
###########################
|
|
3511
1932
|
def schema_asic(cfg):
|
|
3512
|
-
|
|
3513
|
-
|
|
3514
|
-
scparam(cfg, ['asic', 'logiclib'],
|
|
3515
|
-
sctype='[str]',
|
|
3516
|
-
scope=Scope.JOB,
|
|
3517
|
-
pernode=PerNode.OPTIONAL,
|
|
3518
|
-
shorthelp="ASIC: logic libraries",
|
|
3519
|
-
switch="-asic_logiclib <str>",
|
|
3520
|
-
example=["cli: -asic_logiclib nangate45",
|
|
3521
|
-
"api: chip.set('asic', 'logiclib', 'nangate45')"],
|
|
3522
|
-
schelp="""List of all selected logic libraries libraries
|
|
3523
|
-
to use for optimization for a given library architecture
|
|
3524
|
-
(9T, 11T, etc).""")
|
|
3525
|
-
|
|
3526
|
-
scparam(cfg, ['asic', 'macrolib'],
|
|
3527
|
-
sctype='[str]',
|
|
3528
|
-
scope=Scope.JOB,
|
|
3529
|
-
pernode=PerNode.OPTIONAL,
|
|
3530
|
-
shorthelp="ASIC: macro libraries",
|
|
3531
|
-
switch="-asic_macrolib <str>",
|
|
3532
|
-
example=["cli: -asic_macrolib sram64x1024",
|
|
3533
|
-
"api: chip.set('asic', 'macrolib', 'sram64x1024')"],
|
|
3534
|
-
schelp="""
|
|
3535
|
-
List of macro libraries to be linked in during synthesis and place
|
|
3536
|
-
and route. Macro libraries are used for resolving instances but are
|
|
3537
|
-
not used as targets for logic synthesis.""")
|
|
3538
|
-
|
|
3539
|
-
scparam(cfg, ['asic', 'delaymodel'],
|
|
3540
|
-
sctype='str',
|
|
3541
|
-
scope=Scope.JOB,
|
|
3542
|
-
pernode=PerNode.OPTIONAL,
|
|
3543
|
-
shorthelp="ASIC: delay model",
|
|
3544
|
-
switch="-asic_delaymodel <str>",
|
|
3545
|
-
example=["cli: -asic_delaymodel ccs",
|
|
3546
|
-
"api: chip.set('asic', 'delaymodel', 'ccs')"],
|
|
3547
|
-
schelp="""
|
|
3548
|
-
Delay model to use for the target libs. Commonly supported values
|
|
3549
|
-
are nldm and ccs.""")
|
|
3550
|
-
|
|
3551
|
-
# TODO: Expand on the exact definitions of these types of cells.
|
|
3552
|
-
# minimize typing
|
|
3553
|
-
names = ['decap',
|
|
3554
|
-
'tie',
|
|
3555
|
-
'hold',
|
|
3556
|
-
'clkbuf',
|
|
3557
|
-
'clkgate',
|
|
3558
|
-
'clklogic',
|
|
3559
|
-
'dontuse',
|
|
3560
|
-
'filler',
|
|
3561
|
-
'tap',
|
|
3562
|
-
'endcap',
|
|
3563
|
-
'antenna']
|
|
3564
|
-
|
|
3565
|
-
for item in names:
|
|
3566
|
-
scparam(cfg, ['asic', 'cells', item],
|
|
3567
|
-
sctype='[str]',
|
|
3568
|
-
pernode=PerNode.OPTIONAL,
|
|
3569
|
-
shorthelp=f"ASIC: {item} cell list",
|
|
3570
|
-
switch=f"-asic_cells_{item} '<str>'",
|
|
3571
|
-
example=[
|
|
3572
|
-
f"cli: -asic_cells_{item} '*eco*'",
|
|
3573
|
-
f"api: chip.set('asic', 'cells', '{item}', '*eco*')"],
|
|
3574
|
-
schelp="""
|
|
3575
|
-
List of cells grouped by a property that can be accessed
|
|
3576
|
-
directly by the designer and tools. The example below shows how
|
|
3577
|
-
all cells containing the string 'eco' could be marked as dont use
|
|
3578
|
-
for the tool.""")
|
|
3579
|
-
|
|
3580
|
-
scparam(cfg, ['asic', 'libarch'],
|
|
3581
|
-
sctype='str',
|
|
3582
|
-
pernode=PerNode.OPTIONAL,
|
|
3583
|
-
shorthelp="ASIC: library architecture",
|
|
3584
|
-
switch="-asic_libarch '<str>'",
|
|
3585
|
-
example=[
|
|
3586
|
-
"cli: -asic_libarch '12track'",
|
|
3587
|
-
"api: chip.set('asic', 'libarch', '12track')"],
|
|
3588
|
-
schelp="""
|
|
3589
|
-
The library architecture (e.g. library height) used to build the
|
|
3590
|
-
design. For example a PDK with support for 9 and 12 track libraries
|
|
3591
|
-
might have 'libarchs' called 9t and 12t.""")
|
|
3592
|
-
|
|
3593
|
-
libarch = 'default'
|
|
3594
|
-
scparam(cfg, ['asic', 'site', libarch],
|
|
3595
|
-
sctype='[str]',
|
|
3596
|
-
pernode=PerNode.OPTIONAL,
|
|
3597
|
-
shorthelp="ASIC: library sites",
|
|
3598
|
-
switch="-asic_site 'libarch <str>'",
|
|
3599
|
-
example=[
|
|
3600
|
-
"cli: -asic_site '12track Site_12T'",
|
|
3601
|
-
"api: chip.set('asic', 'site', '12track', 'Site_12T')"],
|
|
3602
|
-
schelp="""
|
|
3603
|
-
Site names for a given library architecture.""")
|
|
3604
|
-
|
|
1933
|
+
from siliconcompiler.asic import ASICSchema
|
|
1934
|
+
cfg.insert("asic", ASICSchema())
|
|
3605
1935
|
return cfg
|
|
3606
1936
|
|
|
3607
1937
|
|
|
@@ -3759,16 +2089,16 @@ def schema_constraint(cfg):
|
|
|
3759
2089
|
Placement keepout halo around the named component, specified as a
|
|
3760
2090
|
(horizontal, vertical) tuple.""")
|
|
3761
2091
|
|
|
2092
|
+
rotations = ['R0', 'R90', 'R180', 'R270',
|
|
2093
|
+
'MX', 'MX_R90', 'MX_R180', 'MX_R270',
|
|
2094
|
+
'MY', 'MY_R90', 'MY_R180', 'MY_R270',
|
|
2095
|
+
'MZ', 'MZ_R90', 'MZ_R180', 'MZ_R270',
|
|
2096
|
+
'MZ_MX', 'MZ_MX_R90', 'MZ_MX_R180', 'MZ_MX_R270',
|
|
2097
|
+
'MZ_MY', 'MZ_MY_R90', 'MZ_MY_R180', 'MZ_MY_R270']
|
|
3762
2098
|
scparam(cfg, ['constraint', 'component', inst, 'rotation'],
|
|
3763
|
-
sctype='
|
|
2099
|
+
sctype=f'<{",".join(rotations)}>',
|
|
3764
2100
|
pernode=PerNode.OPTIONAL,
|
|
3765
2101
|
defvalue='R0',
|
|
3766
|
-
enum=['R0', 'R90', 'R180', 'R270',
|
|
3767
|
-
'MX', 'MX_R90', 'MX_R180', 'MX_R270',
|
|
3768
|
-
'MY', 'MY_R90', 'MY_R180', 'MY_R270',
|
|
3769
|
-
'MZ', 'MZ_R90', 'MZ_R180', 'MZ_R270',
|
|
3770
|
-
'MZ_MX', 'MZ_MX_R90', 'MZ_MX_R180', 'MZ_MX_R270',
|
|
3771
|
-
'MZ_MY', 'MZ_MY_R90', 'MZ_MY_R180', 'MZ_MY_R270'],
|
|
3772
2102
|
shorthelp="Constraint: component rotation",
|
|
3773
2103
|
switch="-constraint_component_rotation 'inst <str>'",
|
|
3774
2104
|
example=[
|
|
@@ -3816,8 +2146,7 @@ def schema_constraint(cfg):
|
|
|
3816
2146
|
substrates, interposers).""")
|
|
3817
2147
|
|
|
3818
2148
|
scparam(cfg, ['constraint', 'component', inst, 'side'],
|
|
3819
|
-
sctype='
|
|
3820
|
-
enum=['left', 'right', 'front', 'back', 'top', 'bottom'],
|
|
2149
|
+
sctype='<left,right,front,back,top,bottom>',
|
|
3821
2150
|
pernode=PerNode.OPTIONAL,
|
|
3822
2151
|
shorthelp="Constraint: component side",
|
|
3823
2152
|
switch="-constraint_component_side 'inst <str>'",
|
|
@@ -3899,9 +2228,7 @@ def schema_constraint(cfg):
|
|
|
3899
2228
|
guidelines.""")
|
|
3900
2229
|
|
|
3901
2230
|
scparam(cfg, ['constraint', 'pin', name, 'shape'],
|
|
3902
|
-
sctype='
|
|
3903
|
-
enum=['circle', 'rectangle', 'square',
|
|
3904
|
-
'hexagon', 'octagon', 'oval', 'pill', 'polygon'],
|
|
2231
|
+
sctype='<circle,rectangle,square,hexagon,octagon,oval,pill,polygon>',
|
|
3905
2232
|
pernode=PerNode.OPTIONAL,
|
|
3906
2233
|
shorthelp="Constraint: pin shape",
|
|
3907
2234
|
switch="-constraint_pin_shape 'name <str>'",
|
|
@@ -4139,7 +2466,7 @@ def schema_constraint(cfg):
|
|
|
4139
2466
|
scparam(cfg, ['constraint', 'aspectratio'],
|
|
4140
2467
|
sctype='float',
|
|
4141
2468
|
pernode=PerNode.OPTIONAL,
|
|
4142
|
-
defvalue=
|
|
2469
|
+
defvalue=1.0,
|
|
4143
2470
|
scope=Scope.JOB,
|
|
4144
2471
|
shorthelp="Constraint: layout aspect ratio",
|
|
4145
2472
|
switch="-constraint_aspectratio <float>",
|
|
@@ -4153,10 +2480,3 @@ def schema_constraint(cfg):
|
|
|
4153
2480
|
is supplied.""")
|
|
4154
2481
|
|
|
4155
2482
|
return cfg
|
|
4156
|
-
|
|
4157
|
-
|
|
4158
|
-
##############################################################################
|
|
4159
|
-
# Main routine
|
|
4160
|
-
if __name__ == "__main__":
|
|
4161
|
-
cfg = schema_cfg()
|
|
4162
|
-
print(json.dumps(cfg, indent=4, sort_keys=True))
|