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.
Files changed (154) hide show
  1. siliconcompiler/__init__.py +19 -2
  2. siliconcompiler/_metadata.py +1 -1
  3. siliconcompiler/apps/sc.py +2 -2
  4. siliconcompiler/apps/sc_install.py +3 -3
  5. siliconcompiler/apps/sc_issue.py +1 -1
  6. siliconcompiler/apps/sc_remote.py +4 -4
  7. siliconcompiler/apps/sc_show.py +2 -2
  8. siliconcompiler/apps/utils/replay.py +5 -3
  9. siliconcompiler/asic.py +120 -0
  10. siliconcompiler/checklist.py +150 -0
  11. siliconcompiler/core.py +267 -289
  12. siliconcompiler/flowgraph.py +803 -515
  13. siliconcompiler/fpga.py +84 -0
  14. siliconcompiler/metric.py +420 -0
  15. siliconcompiler/optimizer/vizier.py +2 -3
  16. siliconcompiler/package/__init__.py +29 -6
  17. siliconcompiler/pdk.py +415 -0
  18. siliconcompiler/record.py +449 -0
  19. siliconcompiler/remote/client.py +6 -3
  20. siliconcompiler/remote/schema.py +116 -112
  21. siliconcompiler/remote/server.py +3 -5
  22. siliconcompiler/report/dashboard/cli/__init__.py +13 -722
  23. siliconcompiler/report/dashboard/cli/board.py +895 -0
  24. siliconcompiler/report/dashboard/web/__init__.py +10 -10
  25. siliconcompiler/report/dashboard/web/components/__init__.py +5 -4
  26. siliconcompiler/report/dashboard/web/components/flowgraph.py +3 -3
  27. siliconcompiler/report/dashboard/web/components/graph.py +6 -3
  28. siliconcompiler/report/dashboard/web/state.py +1 -1
  29. siliconcompiler/report/dashboard/web/utils/__init__.py +4 -3
  30. siliconcompiler/report/html_report.py +2 -3
  31. siliconcompiler/report/report.py +13 -7
  32. siliconcompiler/report/summary_image.py +1 -1
  33. siliconcompiler/report/summary_table.py +3 -3
  34. siliconcompiler/report/utils.py +11 -10
  35. siliconcompiler/scheduler/__init__.py +145 -280
  36. siliconcompiler/scheduler/run_node.py +2 -1
  37. siliconcompiler/scheduler/send_messages.py +4 -4
  38. siliconcompiler/scheduler/slurm.py +2 -2
  39. siliconcompiler/schema/__init__.py +19 -2
  40. siliconcompiler/schema/baseschema.py +493 -0
  41. siliconcompiler/schema/cmdlineschema.py +250 -0
  42. siliconcompiler/{sphinx_ext → schema/docs}/__init__.py +3 -1
  43. siliconcompiler/{sphinx_ext → schema/docs}/dynamicgen.py +63 -81
  44. siliconcompiler/{sphinx_ext → schema/docs}/schemagen.py +73 -85
  45. siliconcompiler/{sphinx_ext → schema/docs}/utils.py +12 -13
  46. siliconcompiler/schema/editableschema.py +136 -0
  47. siliconcompiler/schema/journalingschema.py +238 -0
  48. siliconcompiler/schema/namedschema.py +41 -0
  49. siliconcompiler/schema/packageschema.py +101 -0
  50. siliconcompiler/schema/parameter.py +791 -0
  51. siliconcompiler/schema/parametertype.py +323 -0
  52. siliconcompiler/schema/parametervalue.py +736 -0
  53. siliconcompiler/schema/safeschema.py +37 -0
  54. siliconcompiler/schema/schema_cfg.py +109 -1789
  55. siliconcompiler/schema/utils.py +5 -68
  56. siliconcompiler/schema_obj.py +119 -0
  57. siliconcompiler/tool.py +1308 -0
  58. siliconcompiler/tools/_common/__init__.py +6 -10
  59. siliconcompiler/tools/_common/sdc/sc_constraints.sdc +1 -1
  60. siliconcompiler/tools/bluespec/convert.py +7 -7
  61. siliconcompiler/tools/builtin/_common.py +1 -1
  62. siliconcompiler/tools/builtin/concatenate.py +2 -2
  63. siliconcompiler/tools/builtin/minimum.py +1 -1
  64. siliconcompiler/tools/builtin/mux.py +2 -1
  65. siliconcompiler/tools/builtin/nop.py +1 -1
  66. siliconcompiler/tools/builtin/verify.py +6 -4
  67. siliconcompiler/tools/chisel/convert.py +4 -4
  68. siliconcompiler/tools/genfasm/bitstream.py +3 -3
  69. siliconcompiler/tools/ghdl/convert.py +1 -1
  70. siliconcompiler/tools/icarus/compile.py +4 -4
  71. siliconcompiler/tools/icepack/bitstream.py +6 -1
  72. siliconcompiler/tools/klayout/convert_drc_db.py +5 -0
  73. siliconcompiler/tools/klayout/klayout_export.py +0 -1
  74. siliconcompiler/tools/klayout/klayout_utils.py +3 -10
  75. siliconcompiler/tools/nextpnr/apr.py +6 -1
  76. siliconcompiler/tools/nextpnr/nextpnr.py +4 -4
  77. siliconcompiler/tools/openroad/_apr.py +13 -0
  78. siliconcompiler/tools/openroad/rdlroute.py +3 -3
  79. siliconcompiler/tools/openroad/scripts/apr/postamble.tcl +1 -1
  80. siliconcompiler/tools/openroad/scripts/apr/preamble.tcl +5 -5
  81. siliconcompiler/tools/openroad/scripts/apr/sc_antenna_repair.tcl +2 -2
  82. siliconcompiler/tools/openroad/scripts/apr/sc_clock_tree_synthesis.tcl +2 -2
  83. siliconcompiler/tools/openroad/scripts/apr/sc_detailed_placement.tcl +2 -2
  84. siliconcompiler/tools/openroad/scripts/apr/sc_detailed_route.tcl +2 -2
  85. siliconcompiler/tools/openroad/scripts/apr/sc_endcap_tapcell_insertion.tcl +2 -2
  86. siliconcompiler/tools/openroad/scripts/apr/sc_fillercell_insertion.tcl +2 -2
  87. siliconcompiler/tools/openroad/scripts/apr/sc_fillmetal_insertion.tcl +2 -2
  88. siliconcompiler/tools/openroad/scripts/apr/sc_global_placement.tcl +2 -2
  89. siliconcompiler/tools/openroad/scripts/apr/sc_global_route.tcl +2 -2
  90. siliconcompiler/tools/openroad/scripts/apr/sc_init_floorplan.tcl +2 -2
  91. siliconcompiler/tools/openroad/scripts/apr/sc_macro_placement.tcl +3 -3
  92. siliconcompiler/tools/openroad/scripts/apr/sc_metrics.tcl +2 -2
  93. siliconcompiler/tools/openroad/scripts/apr/sc_pin_placement.tcl +2 -2
  94. siliconcompiler/tools/openroad/scripts/apr/sc_power_grid.tcl +2 -2
  95. siliconcompiler/tools/openroad/scripts/apr/sc_repair_design.tcl +2 -2
  96. siliconcompiler/tools/openroad/scripts/apr/sc_repair_timing.tcl +2 -2
  97. siliconcompiler/tools/openroad/scripts/apr/sc_write_data.tcl +2 -2
  98. siliconcompiler/tools/openroad/scripts/common/procs.tcl +57 -1
  99. siliconcompiler/tools/openroad/scripts/common/screenshot.tcl +2 -2
  100. siliconcompiler/tools/openroad/scripts/common/write_images.tcl +28 -3
  101. siliconcompiler/tools/openroad/scripts/sc_rcx.tcl +1 -1
  102. siliconcompiler/tools/openroad/scripts/sc_rdlroute.tcl +3 -3
  103. siliconcompiler/tools/openroad/scripts/sc_show.tcl +6 -6
  104. siliconcompiler/tools/slang/__init__.py +10 -10
  105. siliconcompiler/tools/surelog/parse.py +4 -4
  106. siliconcompiler/tools/sv2v/convert.py +20 -3
  107. siliconcompiler/tools/verilator/compile.py +2 -2
  108. siliconcompiler/tools/verilator/verilator.py +3 -3
  109. siliconcompiler/tools/vpr/place.py +1 -1
  110. siliconcompiler/tools/vpr/route.py +4 -4
  111. siliconcompiler/tools/vpr/screenshot.py +1 -1
  112. siliconcompiler/tools/vpr/show.py +5 -5
  113. siliconcompiler/tools/vpr/vpr.py +24 -24
  114. siliconcompiler/tools/xdm/convert.py +2 -2
  115. siliconcompiler/tools/xyce/simulate.py +1 -1
  116. siliconcompiler/tools/yosys/sc_synth_asic.tcl +74 -68
  117. siliconcompiler/tools/yosys/syn_asic.py +2 -2
  118. siliconcompiler/toolscripts/_tools.json +7 -7
  119. siliconcompiler/toolscripts/ubuntu22/install-vpr.sh +0 -2
  120. siliconcompiler/toolscripts/ubuntu24/install-vpr.sh +0 -2
  121. siliconcompiler/utils/__init__.py +8 -112
  122. siliconcompiler/utils/flowgraph.py +339 -0
  123. siliconcompiler/{issue.py → utils/issue.py} +4 -3
  124. siliconcompiler/utils/logging.py +1 -2
  125. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/METADATA +9 -8
  126. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/RECORD +151 -134
  127. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/WHEEL +1 -1
  128. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/entry_points.txt +8 -8
  129. siliconcompiler/schema/schema_obj.py +0 -1936
  130. siliconcompiler/toolscripts/ubuntu20/install-vpr.sh +0 -29
  131. siliconcompiler/toolscripts/ubuntu20/install-yosys-parmys.sh +0 -61
  132. /siliconcompiler/{templates → data/templates}/__init__.py +0 -0
  133. /siliconcompiler/{templates → data/templates}/email/__init__.py +0 -0
  134. /siliconcompiler/{templates → data/templates}/email/general.j2 +0 -0
  135. /siliconcompiler/{templates → data/templates}/email/summary.j2 +0 -0
  136. /siliconcompiler/{templates → data/templates}/issue/README.txt +0 -0
  137. /siliconcompiler/{templates → data/templates}/issue/__init__.py +0 -0
  138. /siliconcompiler/{templates → data/templates}/issue/run.sh +0 -0
  139. /siliconcompiler/{templates → data/templates}/replay/replay.py.j2 +0 -0
  140. /siliconcompiler/{templates → data/templates}/replay/replay.sh.j2 +0 -0
  141. /siliconcompiler/{templates → data/templates}/replay/requirements.txt +0 -0
  142. /siliconcompiler/{templates → data/templates}/replay/setup.sh +0 -0
  143. /siliconcompiler/{templates → data/templates}/report/__init__.py +0 -0
  144. /siliconcompiler/{templates → data/templates}/report/bootstrap.min.css +0 -0
  145. /siliconcompiler/{templates → data/templates}/report/bootstrap.min.js +0 -0
  146. /siliconcompiler/{templates → data/templates}/report/bootstrap_LICENSE.md +0 -0
  147. /siliconcompiler/{templates → data/templates}/report/sc_report.j2 +0 -0
  148. /siliconcompiler/{templates → data/templates}/slurm/__init__.py +0 -0
  149. /siliconcompiler/{templates → data/templates}/slurm/run.sh +0 -0
  150. /siliconcompiler/{templates → data/templates}/tcl/__init__.py +0 -0
  151. /siliconcompiler/{templates → data/templates}/tcl/manifest.tcl.j2 +0 -0
  152. /siliconcompiler/{units.py → utils/units.py} +0 -0
  153. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/licenses/LICENSE +0 -0
  154. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/top_level.txt +0 -0
siliconcompiler/pdk.py ADDED
@@ -0,0 +1,415 @@
1
+ from siliconcompiler.schema import NamedSchema, PackageSchema
2
+ from siliconcompiler.schema import EditableSchema, Parameter, Scope
3
+ from siliconcompiler.schema.utils import trim
4
+
5
+
6
+ class PDKSchema(NamedSchema, PackageSchema):
7
+ def __init__(self, name=None, package=None):
8
+ NamedSchema.__init__(self, name=name)
9
+ PackageSchema.__init__(self, package=package)
10
+
11
+ schema_pdk(self)
12
+
13
+
14
+ ###############################################################################
15
+ # PDK
16
+ ###############################################################################
17
+ def schema_pdk(schema):
18
+ schema = EditableSchema(schema)
19
+
20
+ tool = 'default'
21
+ filetype = 'default'
22
+ stackup = 'default'
23
+
24
+ schema.insert(
25
+ 'foundry',
26
+ Parameter(
27
+ 'str',
28
+ scope=Scope.GLOBAL,
29
+ shorthelp="PDK: foundry name",
30
+ switch="-pdk_foundry 'pdkname <str>'",
31
+ example=["cli: -pdk_foundry 'asap7 virtual'",
32
+ "api: chip.set('pdk', 'asap7', 'foundry', 'virtual')"],
33
+ help=trim("""
34
+ Name of foundry corporation. Examples include intel, gf, tsmc,
35
+ samsung, skywater, virtual. The \'virtual\' keyword is reserved for
36
+ simulated non-manufacturable processes.""")))
37
+
38
+ schema.insert(
39
+ 'node',
40
+ Parameter(
41
+ 'float',
42
+ scope=Scope.GLOBAL,
43
+ unit='nm',
44
+ shorthelp="PDK: process node",
45
+ switch="-pdk_node 'pdkname <float>'",
46
+ example=["cli: -pdk_node 'asap7 130'",
47
+ "api: chip.set('pdk', 'asap7', 'node', 130)"],
48
+ help=trim("""
49
+ Approximate relative minimum dimension of the process target specified
50
+ in nanometers. The parameter is required for flows and tools that
51
+ leverage the value to drive technology dependent synthesis and APR
52
+ optimization. Node examples include 180, 130, 90, 65, 45, 32, 22 14,
53
+ 10, 7, 5, 3.""")))
54
+
55
+ schema.insert(
56
+ 'version',
57
+ Parameter(
58
+ 'str',
59
+ scope=Scope.GLOBAL,
60
+ shorthelp="PDK: version",
61
+ switch="-pdk_version 'pdkname <str>'",
62
+ example=["cli: -pdk_version 'asap7 1.0'",
63
+ "api: chip.set('pdk', 'asap7', 'version', '1.0')"],
64
+ help=trim("""
65
+ Alphanumeric string specifying the version of the PDK. Verification of
66
+ correct PDK and IP versions is a hard ASIC tapeout require in all
67
+ commercial foundries. The version number can be used for design manifest
68
+ tracking and tapeout checklists.""")))
69
+
70
+ schema.insert(
71
+ 'stackup',
72
+ Parameter(
73
+ '[str]',
74
+ scope=Scope.GLOBAL,
75
+ shorthelp="PDK: metal stackups",
76
+ switch="-pdk_stackup 'pdkname <str>'",
77
+ example=["cli: -pdk_stackup 'asap7 2MA4MB2MC'",
78
+ "api: chip.add('pdk', 'asap7', 'stackup', '2MA4MB2MC')"],
79
+ help=trim("""
80
+ List of all metal stackups offered in the process node. Older process
81
+ nodes may only offer a single metal stackup, while advanced nodes
82
+ offer a large but finite list of metal stacks with varying combinations
83
+ of metal line pitches and thicknesses. Stackup naming is unique to a
84
+ foundry, but is generally a long string or code. For example, a 10
85
+ metal stackup with two 1x wide, four 2x wide, and 4x wide metals,
86
+ might be identified as 2MA4MB2MC, where MA, MB, and MC denote wiring
87
+ layers with different properties (thickness, width, space). Each
88
+ stackup will come with its own set of routing technology files and
89
+ parasitic models specified in the pdk_pexmodel and pdk_aprtech
90
+ parameters.""")))
91
+
92
+ schema.insert(
93
+ 'minlayer', stackup,
94
+ Parameter(
95
+ 'str',
96
+ scope=Scope.GLOBAL,
97
+ shorthelp="PDK: minimum routing layer",
98
+ switch="-pdk_minlayer 'pdk stackup <str>'",
99
+ example=[
100
+ "cli: -pdk_minlayer 'asap7 2MA4MB2MC M2'",
101
+ "api: chip.set('pdk', 'asap7', 'minlayer', '2MA4MB2MC', 'M2')"],
102
+ help=trim("""
103
+ Minimum metal layer to be used for automated place and route
104
+ specified on a per stackup basis.""")))
105
+
106
+ schema.insert(
107
+ 'maxlayer', stackup,
108
+ Parameter(
109
+ 'str',
110
+ scope=Scope.GLOBAL,
111
+ shorthelp="PDK: maximum routing layer",
112
+ switch="-pdk_maxlayer 'pdk stackup <str>'",
113
+ example=[
114
+ "cli: -pdk_maxlayer 'asap7 2MA4MB2MC M8'",
115
+ "api: chip.set('pdk', 'asap7', 'maxlayer', 'MA4MB2MC', 'M8')"],
116
+ help=trim("""
117
+ Maximum metal layer to be used for automated place and route
118
+ specified on a per stackup basis.""")))
119
+
120
+ schema.insert(
121
+ 'wafersize',
122
+ Parameter(
123
+ 'float',
124
+ scope=Scope.GLOBAL,
125
+ unit='mm',
126
+ shorthelp="PDK: wafer size",
127
+ switch="-pdk_wafersize 'pdkname <float>'",
128
+ example=["cli: -pdk_wafersize 'asap7 300'",
129
+ "api: chip.set('pdk', 'asap7', 'wafersize', 300)"],
130
+ help=trim("""
131
+ Wafer diameter used in wafer based manufacturing process.
132
+ The standard diameter for leading edge manufacturing is 300mm. For
133
+ older process technologies and specialty fabs, smaller diameters
134
+ such as 200, 150, 125, and 100 are common. The value is used to
135
+ calculate dies per wafer and full factory chip costs.""")))
136
+
137
+ schema.insert(
138
+ 'panelsize',
139
+ Parameter(
140
+ '[(float,float)]',
141
+ scope=Scope.GLOBAL,
142
+ unit='mm',
143
+ shorthelp="PDK: panel size",
144
+ switch="-pdk_panelsize 'pdkname <(float,float)>'",
145
+ example=[
146
+ "cli: -pdk_panelsize 'asap7 (45.72,60.96)'",
147
+ "api: chip.set('pdk', 'asap7', 'panelsize', (45.72, 60.96))"],
148
+ help=trim("""
149
+ List of panel sizes supported in the manufacturing process.
150
+ """)))
151
+
152
+ schema.insert(
153
+ 'unitcost',
154
+ Parameter(
155
+ 'float',
156
+ scope=Scope.GLOBAL,
157
+ unit='USD',
158
+ shorthelp="PDK: unit cost",
159
+ switch="-pdk_unitcost 'pdkname <float>'",
160
+ example=["cli: -pdk_unitcost 'asap7 10000'",
161
+ "api: chip.set('pdk', 'asap7', 'unitcost', 10000)"],
162
+ help=trim("""
163
+ Raw cost per unit shipped by the factory, not accounting for yield
164
+ loss.""")))
165
+
166
+ schema.insert(
167
+ 'd0',
168
+ Parameter(
169
+ 'float',
170
+ scope=Scope.GLOBAL,
171
+ shorthelp="PDK: process defect density",
172
+ switch="-pdk_d0 'pdkname <float>'",
173
+ example=["cli: -pdk_d0 'asap7 0.1'",
174
+ "api: chip.set('pdk', 'asap7', 'd0', 0.1)"],
175
+ help=trim("""
176
+ Process defect density (d0) expressed as random defects per cm^2. The
177
+ value is used to calculate yield losses as a function of area, which in
178
+ turn affects the chip full factory costs. Two yield models are
179
+ supported: Poisson (default), and Murphy. The Poisson based yield is
180
+ calculated as dy = exp(-area * d0/100). The Murphy based yield is
181
+ calculated as dy = ((1-exp(-area * d0/100))/(area * d0/100))^2.""")))
182
+
183
+ schema.insert(
184
+ 'scribe',
185
+ Parameter(
186
+ '(float,float)',
187
+ scope=Scope.GLOBAL,
188
+ unit='mm',
189
+ shorthelp="PDK: horizontal scribe line width",
190
+ switch="-pdk_scribe 'pdkname <(float,float)>'",
191
+ example=["cli: -pdk_scribe 'asap7 (0.1,0.1)'",
192
+ "api: chip.set('pdk', 'asap7', 'scribe', (0.1, 0.1))"],
193
+ help=trim("""
194
+ Width of the horizontal and vertical scribe line used during die separation.
195
+ The process is generally completed using a mechanical saw, but can be
196
+ done through combinations of mechanical saws, lasers, wafer thinning,
197
+ and chemical etching in more advanced technologies. The value is used
198
+ to calculate effective dies per wafer and full factory cost.""")))
199
+
200
+ schema.insert(
201
+ 'edgemargin',
202
+ Parameter(
203
+ 'float',
204
+ scope=Scope.GLOBAL,
205
+ unit='mm',
206
+ shorthelp="PDK: wafer edge keep-out margin",
207
+ switch="-pdk_edgemargin 'pdkname <float>'",
208
+ example=[
209
+ "cli: -pdk_edgemargin 'asap7 1'",
210
+ "api: chip.set('pdk', 'asap7', 'edgemargin', 1)"],
211
+ help=trim("""
212
+ Keep-out distance/margin from the edge inwards. The edge
213
+ is prone to chipping and need special treatment that preclude
214
+ placement of designs in this area. The edge value is used to
215
+ calculate effective units per wafer/panel and full factory cost.""")))
216
+
217
+ simtype = 'default'
218
+ schema.insert(
219
+ 'devmodel', tool, simtype, stackup,
220
+ Parameter(
221
+ '[file]',
222
+ scope=Scope.GLOBAL,
223
+ shorthelp="PDK: device models",
224
+ switch="-pdk_devmodel 'pdkname tool simtype stackup <file>'",
225
+ example=[
226
+ "cli: -pdk_devmodel 'asap7 xyce spice M10 asap7.sp'",
227
+ "api: chip.set('pdk', 'asap7', 'devmodel', 'xyce', 'spice', 'M10', 'asap7.sp')"],
228
+ help=trim("""
229
+ List of filepaths to PDK device models for different simulation
230
+ purposes and for different tools. Examples of device model types
231
+ include spice, aging, electromigration, radiation. An example of a
232
+ 'spice' tool is xyce. Device models are specified on a per metal stack
233
+ basis. Process nodes with a single device model across all stacks will
234
+ have a unique parameter record per metal stack pointing to the same
235
+ device model file. Device types and tools are dynamic entries
236
+ that depend on the tool setup and device technology. Pseudo-standardized
237
+ device types include spice, em (electromigration), and aging.""")))
238
+
239
+ corner = 'default'
240
+ schema.insert(
241
+ 'pexmodel', tool, stackup, corner,
242
+ Parameter(
243
+ '[file]',
244
+ scope=Scope.GLOBAL,
245
+ shorthelp="PDK: parasitic TCAD models",
246
+ switch="-pdk_pexmodel 'pdkname tool stackup corner <file>'",
247
+ example=[
248
+ "cli: -pdk_pexmodel 'asap7 fastcap M10 max wire.mod'",
249
+ "api: chip.set('pdk', 'asap7', 'pexmodel', 'fastcap', 'M10', 'max', 'wire.mod')"],
250
+ help=trim("""
251
+ List of filepaths to PDK wire TCAD models used during automated
252
+ synthesis, APR, and signoff verification. Pexmodels are specified on
253
+ a per metal stack basis. Corner values depend on the process being
254
+ used, but typically include nomenclature such as min, max, nominal.
255
+ For exact names, refer to the DRM. Pexmodels are generally not
256
+ standardized and specified on a per tool basis. An example of pexmodel
257
+ type is 'fastcap'.""")))
258
+
259
+ src = 'default'
260
+ dst = 'default'
261
+ schema.insert(
262
+ 'layermap', tool, src, dst, stackup,
263
+ Parameter(
264
+ '[file]',
265
+ scope=Scope.GLOBAL,
266
+ shorthelp="PDK: layer map file",
267
+ switch="-pdk_layermap 'pdkname tool src dst stackup <file>'",
268
+ example=[
269
+ "cli: -pdk_layermap 'asap7 klayout db gds M10 asap7.map'",
270
+ "api: chip.set('pdk', 'asap7', 'layermap', 'klayout', 'db', 'gds', 'M10', "
271
+ "'asap7.map')"],
272
+ help=trim("""
273
+ Files describing input/output mapping for streaming layout data from
274
+ one format to another. A foundry PDK will include an official layer
275
+ list for all user entered and generated layers supported in the GDS
276
+ accepted by the foundry for processing, but there is no standardized
277
+ layer definition format that can be read and written by all EDA tools.
278
+ To ensure mask layer matching, key/value type mapping files are needed
279
+ to convert EDA databases to/from GDS and to convert between different
280
+ types of EDA databases. Layer maps are specified on a per metal
281
+ stackup basis. The 'src' and 'dst' can be names of SC supported tools
282
+ or file formats (like 'gds').""")))
283
+
284
+ schema.insert(
285
+ 'display', tool, stackup,
286
+ Parameter(
287
+ '[file]',
288
+ scope=Scope.GLOBAL,
289
+ shorthelp="PDK: display file",
290
+ switch="-pdk_display 'pdkname tool stackup <file>'",
291
+ example=[
292
+ "cli: -pdk_display 'asap7 klayout M10 display.lyt'",
293
+ "api: chip.set('pdk', 'asap7', 'display', 'klayout', 'M10', 'display.cfg')"],
294
+ help=trim("""
295
+ Display configuration files describing colors and pattern schemes for
296
+ all layers in the PDK. The display configuration file is entered on a
297
+ stackup and tool basis.""")))
298
+
299
+ # TODO: create firm list of accepted files
300
+ libarch = 'default'
301
+ schema.insert(
302
+ 'aprtech', tool, stackup, libarch, filetype,
303
+ Parameter(
304
+ '[file]',
305
+ scope=Scope.GLOBAL,
306
+ shorthelp="PDK: APR technology files",
307
+ switch="-pdk_aprtech 'pdkname tool stackup libarch filetype <file>'",
308
+ example=[
309
+ "cli: -pdk_aprtech 'asap7 openroad M10 12t lef tech.lef'",
310
+ "api: chip.set('pdk', 'asap7', 'aprtech', 'openroad', 'M10', '12t', 'lef', "
311
+ "'tech.lef')"],
312
+ help=trim("""
313
+ Technology file containing setup information needed to enable DRC clean APR
314
+ for the specified stackup, libarch, and format. The 'libarch' specifies the
315
+ library architecture (e.g. library height). For example a PDK with support
316
+ for 9 and 12 track libraries might have 'libarchs' called 9t and 12t.
317
+ The standard filetype for specifying place and route design rules for a
318
+ process node is through a 'lef' format technology file. The
319
+ 'filetype' used in the aprtech is used by the tool specific APR TCL scripts
320
+ to set up the technology parameters. Some tools may require additional
321
+ files beyond the tech.lef file. Examples of extra file types include
322
+ antenna, tracks, tapcell, viarules, and em.""")))
323
+
324
+ name = 'default'
325
+ for item in ('lvs', 'drc', 'erc', 'fill'):
326
+ schema.insert(
327
+ item, 'runset', tool, stackup, name,
328
+ Parameter(
329
+ '[file]',
330
+ scope=Scope.GLOBAL,
331
+ shorthelp=f"PDK: {item.upper()} runset files",
332
+ switch=f"-pdk_{item}_runset 'pdkname tool stackup name <file>'",
333
+ example=[
334
+ f"cli: -pdk_{item}_runset 'asap7 magic M10 basic $PDK/{item}.rs'",
335
+ f"api: chip.set('pdk', 'asap7', '{item}', 'runset', 'magic', 'M10', 'basic', "
336
+ f"'$PDK/{item}.rs')"],
337
+ help=trim(f"""Runset files for {item.upper()} task.""")))
338
+
339
+ schema.insert(
340
+ item, 'waiver', tool, stackup, name,
341
+ Parameter(
342
+ '[file]',
343
+ scope=Scope.GLOBAL,
344
+ shorthelp=f"PDK: {item.upper()} waiver files",
345
+ switch=f"-pdk_{item}_waiver 'pdkname tool stackup name <file>'",
346
+ example=[
347
+ f"cli: -pdk_{item}_waiver 'asap7 magic M10 basic $PDK/{item}.txt'",
348
+ f"api: chip.set('pdk', 'asap7', '{item}', 'waiver', 'magic', 'M10', 'basic', "
349
+ f"'$PDK/{item}.txt')"],
350
+ help=trim(f"""Waiver files for {item.upper()} task.""")))
351
+
352
+ ###############
353
+ # EDA vars
354
+ ###############
355
+
356
+ key = 'default'
357
+ schema.insert(
358
+ 'file', tool, key, stackup,
359
+ Parameter(
360
+ '[file]',
361
+ scope=Scope.GLOBAL,
362
+ shorthelp="PDK: custom file",
363
+ switch="-pdk_file 'pdkname tool key stackup <file>'",
364
+ example=[
365
+ "cli: -pdk_file 'asap7 xyce spice M10 asap7.sp'",
366
+ "api: chip.set('pdk', 'asap7', 'file', 'xyce', 'spice', 'M10', 'asap7.sp')"],
367
+ help=trim("""
368
+ List of named files specified on a per tool and per stackup basis.
369
+ The parameter should only be used for specifying files that are
370
+ not directly supported by the SiliconCompiler PDK schema.""")))
371
+
372
+ schema.insert(
373
+ 'dir', tool, key, stackup,
374
+ Parameter(
375
+ '[dir]',
376
+ scope=Scope.GLOBAL,
377
+ shorthelp="PDK: custom directory",
378
+ switch="-pdk_dir 'pdkname tool key stackup <dir>'",
379
+ example=[
380
+ "cli: -pdk_dir 'asap7 xyce rfmodel M10 rftechdir'",
381
+ "api: chip.set('pdk', 'asap7', 'dir', 'xyce', 'rfmodel', 'M10', "
382
+ "'rftechdir')"],
383
+ help=trim("""
384
+ List of named directories specified on a per tool and per stackup basis.
385
+ The parameter should only be used for specifying files that are
386
+ not directly supported by the SiliconCompiler PDK schema.""")))
387
+
388
+ schema.insert(
389
+ 'var', tool, key, stackup,
390
+ Parameter(
391
+ '[str]',
392
+ scope=Scope.GLOBAL,
393
+ shorthelp="PDK: custom, variable",
394
+ switch="-pdk_var 'pdkname tool stackup key <str>'",
395
+ example=[
396
+ "cli: -pdk_var 'asap7 xyce modeltype M10 bsim4'",
397
+ "api: chip.set('pdk', 'asap7', 'var', 'xyce', 'modeltype', 'M10', 'bsim4')"],
398
+ help=trim("""
399
+ List of key/value strings specified on a per tool and per stackup basis.
400
+ The parameter should only be used for specifying variables that are
401
+ not directly supported by the SiliconCompiler PDK schema.""")))
402
+
403
+ ###############
404
+ # Docs
405
+ ###############
406
+ schema.insert(
407
+ 'doc', 'default',
408
+ Parameter(
409
+ '[file]',
410
+ scope=Scope.GLOBAL,
411
+ shorthelp="PDK: documentation",
412
+ switch="-pdk_doc 'pdkname doctype <file>'",
413
+ example=["cli: -pdk_doc 'asap7 reference reference.pdf'",
414
+ "api: chip.set('pdk', 'asap7', 'doc', 'reference', 'reference.pdf')"],
415
+ help=trim("""Filepath to pdk documentation.""")))