siliconcompiler 0.32.3__py3-none-any.whl → 0.33.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. siliconcompiler/__init__.py +19 -2
  2. siliconcompiler/_common.py +5 -0
  3. siliconcompiler/_metadata.py +1 -1
  4. siliconcompiler/apps/sc.py +2 -2
  5. siliconcompiler/apps/sc_install.py +10 -3
  6. siliconcompiler/apps/sc_issue.py +1 -1
  7. siliconcompiler/apps/sc_remote.py +10 -5
  8. siliconcompiler/apps/sc_show.py +2 -2
  9. siliconcompiler/apps/utils/replay.py +5 -3
  10. siliconcompiler/asic.py +120 -0
  11. siliconcompiler/checklist.py +150 -0
  12. siliconcompiler/core.py +299 -299
  13. siliconcompiler/flowgraph.py +803 -515
  14. siliconcompiler/fpga.py +84 -0
  15. siliconcompiler/metric.py +479 -0
  16. siliconcompiler/optimizer/vizier.py +2 -3
  17. siliconcompiler/package/__init__.py +29 -6
  18. siliconcompiler/pdk.py +415 -0
  19. siliconcompiler/record.py +453 -0
  20. siliconcompiler/remote/client.py +15 -5
  21. siliconcompiler/remote/schema.py +116 -112
  22. siliconcompiler/remote/server.py +9 -6
  23. siliconcompiler/report/dashboard/cli/__init__.py +14 -721
  24. siliconcompiler/report/dashboard/cli/board.py +899 -0
  25. siliconcompiler/report/dashboard/web/__init__.py +10 -10
  26. siliconcompiler/report/dashboard/web/components/__init__.py +5 -4
  27. siliconcompiler/report/dashboard/web/components/flowgraph.py +3 -3
  28. siliconcompiler/report/dashboard/web/components/graph.py +6 -3
  29. siliconcompiler/report/dashboard/web/state.py +1 -1
  30. siliconcompiler/report/dashboard/web/utils/__init__.py +4 -3
  31. siliconcompiler/report/html_report.py +2 -3
  32. siliconcompiler/report/report.py +22 -11
  33. siliconcompiler/report/summary_image.py +1 -1
  34. siliconcompiler/report/summary_table.py +3 -3
  35. siliconcompiler/report/utils.py +21 -14
  36. siliconcompiler/scheduler/__init__.py +234 -1206
  37. siliconcompiler/scheduler/run_node.py +2 -1
  38. siliconcompiler/scheduler/send_messages.py +11 -5
  39. siliconcompiler/scheduler/slurm.py +11 -44
  40. siliconcompiler/scheduler/taskscheduler.py +320 -0
  41. siliconcompiler/schema/__init__.py +19 -2
  42. siliconcompiler/schema/baseschema.py +493 -0
  43. siliconcompiler/schema/cmdlineschema.py +250 -0
  44. siliconcompiler/{sphinx_ext → schema/docs}/__init__.py +3 -1
  45. siliconcompiler/{sphinx_ext → schema/docs}/dynamicgen.py +63 -81
  46. siliconcompiler/{sphinx_ext → schema/docs}/schemagen.py +73 -85
  47. siliconcompiler/{sphinx_ext → schema/docs}/utils.py +12 -13
  48. siliconcompiler/schema/editableschema.py +136 -0
  49. siliconcompiler/schema/journalingschema.py +238 -0
  50. siliconcompiler/schema/namedschema.py +41 -0
  51. siliconcompiler/schema/packageschema.py +101 -0
  52. siliconcompiler/schema/parameter.py +791 -0
  53. siliconcompiler/schema/parametertype.py +323 -0
  54. siliconcompiler/schema/parametervalue.py +736 -0
  55. siliconcompiler/schema/safeschema.py +37 -0
  56. siliconcompiler/schema/schema_cfg.py +109 -1789
  57. siliconcompiler/schema/utils.py +5 -68
  58. siliconcompiler/schema_obj.py +119 -0
  59. siliconcompiler/tool.py +1416 -0
  60. siliconcompiler/tools/_common/__init__.py +6 -10
  61. siliconcompiler/tools/_common/asic.py +5 -5
  62. siliconcompiler/tools/_common/sdc/sc_constraints.sdc +1 -1
  63. siliconcompiler/tools/bluespec/convert.py +9 -8
  64. siliconcompiler/tools/builtin/_common.py +9 -2
  65. siliconcompiler/tools/builtin/concatenate.py +7 -3
  66. siliconcompiler/tools/builtin/minimum.py +7 -2
  67. siliconcompiler/tools/builtin/mux.py +8 -2
  68. siliconcompiler/tools/builtin/nop.py +7 -2
  69. siliconcompiler/tools/builtin/verify.py +11 -5
  70. siliconcompiler/tools/chisel/convert.py +10 -10
  71. siliconcompiler/tools/genfasm/bitstream.py +3 -3
  72. siliconcompiler/tools/ghdl/convert.py +1 -1
  73. siliconcompiler/tools/icarus/compile.py +4 -4
  74. siliconcompiler/tools/icepack/bitstream.py +6 -1
  75. siliconcompiler/tools/klayout/convert_drc_db.py +5 -0
  76. siliconcompiler/tools/klayout/drc.py +2 -2
  77. siliconcompiler/tools/klayout/klayout_export.py +0 -1
  78. siliconcompiler/tools/klayout/klayout_show.py +6 -6
  79. siliconcompiler/tools/klayout/klayout_utils.py +15 -22
  80. siliconcompiler/tools/netgen/count_lvs.py +2 -2
  81. siliconcompiler/tools/netgen/lvs.py +1 -1
  82. siliconcompiler/tools/nextpnr/apr.py +6 -1
  83. siliconcompiler/tools/nextpnr/nextpnr.py +4 -4
  84. siliconcompiler/tools/openroad/_apr.py +15 -2
  85. siliconcompiler/tools/openroad/rdlroute.py +3 -3
  86. siliconcompiler/tools/openroad/scripts/apr/postamble.tcl +1 -1
  87. siliconcompiler/tools/openroad/scripts/apr/preamble.tcl +5 -5
  88. siliconcompiler/tools/openroad/scripts/apr/sc_antenna_repair.tcl +2 -2
  89. siliconcompiler/tools/openroad/scripts/apr/sc_clock_tree_synthesis.tcl +2 -2
  90. siliconcompiler/tools/openroad/scripts/apr/sc_detailed_placement.tcl +2 -2
  91. siliconcompiler/tools/openroad/scripts/apr/sc_detailed_route.tcl +2 -2
  92. siliconcompiler/tools/openroad/scripts/apr/sc_endcap_tapcell_insertion.tcl +2 -2
  93. siliconcompiler/tools/openroad/scripts/apr/sc_fillercell_insertion.tcl +2 -2
  94. siliconcompiler/tools/openroad/scripts/apr/sc_fillmetal_insertion.tcl +2 -2
  95. siliconcompiler/tools/openroad/scripts/apr/sc_global_placement.tcl +2 -2
  96. siliconcompiler/tools/openroad/scripts/apr/sc_global_route.tcl +2 -2
  97. siliconcompiler/tools/openroad/scripts/apr/sc_init_floorplan.tcl +3 -9
  98. siliconcompiler/tools/openroad/scripts/apr/sc_macro_placement.tcl +3 -3
  99. siliconcompiler/tools/openroad/scripts/apr/sc_metrics.tcl +2 -2
  100. siliconcompiler/tools/openroad/scripts/apr/sc_pin_placement.tcl +2 -2
  101. siliconcompiler/tools/openroad/scripts/apr/sc_power_grid.tcl +2 -2
  102. siliconcompiler/tools/openroad/scripts/apr/sc_repair_design.tcl +2 -2
  103. siliconcompiler/tools/openroad/scripts/apr/sc_repair_timing.tcl +2 -2
  104. siliconcompiler/tools/openroad/scripts/apr/sc_write_data.tcl +2 -2
  105. siliconcompiler/tools/openroad/scripts/common/procs.tcl +75 -1
  106. siliconcompiler/tools/openroad/scripts/common/read_input_files.tcl +1 -7
  107. siliconcompiler/tools/openroad/scripts/common/screenshot.tcl +2 -2
  108. siliconcompiler/tools/openroad/scripts/common/write_images.tcl +28 -3
  109. siliconcompiler/tools/openroad/scripts/sc_rcx.tcl +1 -1
  110. siliconcompiler/tools/openroad/scripts/sc_rdlroute.tcl +3 -3
  111. siliconcompiler/tools/openroad/scripts/sc_show.tcl +6 -6
  112. siliconcompiler/tools/opensta/scripts/sc_timing.tcl +10 -0
  113. siliconcompiler/tools/opensta/timing.py +11 -0
  114. siliconcompiler/tools/slang/__init__.py +13 -13
  115. siliconcompiler/tools/slang/elaborate.py +6 -6
  116. siliconcompiler/tools/slang/lint.py +1 -3
  117. siliconcompiler/tools/surelog/parse.py +4 -4
  118. siliconcompiler/tools/sv2v/convert.py +20 -3
  119. siliconcompiler/tools/verilator/compile.py +2 -2
  120. siliconcompiler/tools/verilator/verilator.py +3 -3
  121. siliconcompiler/tools/vpr/_xml_constraint.py +8 -8
  122. siliconcompiler/tools/vpr/place.py +1 -1
  123. siliconcompiler/tools/vpr/route.py +4 -4
  124. siliconcompiler/tools/vpr/screenshot.py +1 -1
  125. siliconcompiler/tools/vpr/show.py +5 -5
  126. siliconcompiler/tools/vpr/vpr.py +24 -24
  127. siliconcompiler/tools/xdm/convert.py +2 -2
  128. siliconcompiler/tools/xyce/simulate.py +1 -1
  129. siliconcompiler/tools/yosys/prepareLib.py +2 -2
  130. siliconcompiler/tools/yosys/sc_synth_asic.tcl +111 -63
  131. siliconcompiler/tools/yosys/screenshot.py +1 -1
  132. siliconcompiler/tools/yosys/syn_asic.py +7 -7
  133. siliconcompiler/toolscripts/_tools.json +12 -10
  134. siliconcompiler/toolscripts/rhel8/install-chisel.sh +9 -2
  135. siliconcompiler/toolscripts/rhel8/install-icarus.sh +10 -3
  136. siliconcompiler/toolscripts/rhel8/install-klayout.sh +8 -1
  137. siliconcompiler/toolscripts/rhel8/install-magic.sh +9 -2
  138. siliconcompiler/toolscripts/rhel8/install-montage.sh +1 -1
  139. siliconcompiler/toolscripts/rhel8/install-netgen.sh +9 -2
  140. siliconcompiler/toolscripts/rhel8/install-slang.sh +11 -4
  141. siliconcompiler/toolscripts/rhel8/install-surelog.sh +9 -2
  142. siliconcompiler/toolscripts/rhel8/install-sv2v.sh +11 -4
  143. siliconcompiler/toolscripts/rhel8/install-verible.sh +11 -3
  144. siliconcompiler/toolscripts/rhel8/install-verilator.sh +10 -3
  145. siliconcompiler/toolscripts/rhel8/install-xyce.sh +15 -10
  146. siliconcompiler/toolscripts/rhel9/install-chisel.sh +9 -2
  147. siliconcompiler/toolscripts/rhel9/install-ghdl.sh +9 -2
  148. siliconcompiler/toolscripts/rhel9/install-gtkwave.sh +10 -3
  149. siliconcompiler/toolscripts/rhel9/install-icarus.sh +10 -3
  150. siliconcompiler/toolscripts/rhel9/install-klayout.sh +8 -1
  151. siliconcompiler/toolscripts/rhel9/install-magic.sh +9 -2
  152. siliconcompiler/toolscripts/rhel9/install-montage.sh +1 -1
  153. siliconcompiler/toolscripts/rhel9/install-netgen.sh +9 -2
  154. siliconcompiler/toolscripts/rhel9/install-openroad.sh +16 -3
  155. siliconcompiler/toolscripts/rhel9/install-opensta.sh +17 -5
  156. siliconcompiler/toolscripts/rhel9/install-slang.sh +11 -4
  157. siliconcompiler/toolscripts/rhel9/install-surelog.sh +9 -2
  158. siliconcompiler/toolscripts/rhel9/install-sv2v.sh +11 -4
  159. siliconcompiler/toolscripts/rhel9/install-verible.sh +11 -3
  160. siliconcompiler/toolscripts/rhel9/install-verilator.sh +10 -3
  161. siliconcompiler/toolscripts/rhel9/install-vpr.sh +9 -2
  162. siliconcompiler/toolscripts/rhel9/install-xdm.sh +10 -2
  163. siliconcompiler/toolscripts/rhel9/install-xyce.sh +15 -10
  164. siliconcompiler/toolscripts/rhel9/install-yosys-moosic.sh +9 -2
  165. siliconcompiler/toolscripts/rhel9/install-yosys-parmys.sh +10 -3
  166. siliconcompiler/toolscripts/rhel9/install-yosys-slang.sh +10 -2
  167. siliconcompiler/toolscripts/rhel9/install-yosys.sh +9 -2
  168. siliconcompiler/toolscripts/ubuntu20/install-bambu.sh +10 -2
  169. siliconcompiler/toolscripts/ubuntu20/install-bluespec.sh +10 -3
  170. siliconcompiler/toolscripts/ubuntu20/install-chisel.sh +9 -2
  171. siliconcompiler/toolscripts/ubuntu20/install-ghdl.sh +9 -2
  172. siliconcompiler/toolscripts/ubuntu20/install-gtkwave.sh +9 -2
  173. siliconcompiler/toolscripts/ubuntu20/install-icarus.sh +9 -2
  174. siliconcompiler/toolscripts/ubuntu20/install-icepack.sh +9 -2
  175. siliconcompiler/toolscripts/ubuntu20/install-klayout.sh +8 -1
  176. siliconcompiler/toolscripts/ubuntu20/install-magic.sh +9 -2
  177. siliconcompiler/toolscripts/ubuntu20/install-montage.sh +1 -1
  178. siliconcompiler/toolscripts/ubuntu20/install-netgen.sh +9 -2
  179. siliconcompiler/toolscripts/ubuntu20/install-nextpnr.sh +9 -2
  180. siliconcompiler/toolscripts/ubuntu20/install-openroad.sh +16 -3
  181. siliconcompiler/toolscripts/ubuntu20/install-opensta.sh +16 -5
  182. siliconcompiler/toolscripts/ubuntu20/install-slang.sh +11 -4
  183. siliconcompiler/toolscripts/ubuntu20/install-slurm.sh +9 -2
  184. siliconcompiler/toolscripts/ubuntu20/install-surelog.sh +10 -2
  185. siliconcompiler/toolscripts/ubuntu20/install-sv2v.sh +11 -4
  186. siliconcompiler/toolscripts/ubuntu20/install-verible.sh +11 -3
  187. siliconcompiler/toolscripts/ubuntu20/install-verilator.sh +9 -2
  188. siliconcompiler/toolscripts/ubuntu20/install-xdm.sh +10 -2
  189. siliconcompiler/toolscripts/ubuntu20/install-xyce.sh +13 -8
  190. siliconcompiler/toolscripts/ubuntu20/install-yosys-moosic.sh +9 -2
  191. siliconcompiler/toolscripts/ubuntu20/install-yosys.sh +9 -2
  192. siliconcompiler/toolscripts/ubuntu22/install-bambu.sh +10 -2
  193. siliconcompiler/toolscripts/ubuntu22/install-bluespec.sh +10 -3
  194. siliconcompiler/toolscripts/ubuntu22/install-chisel.sh +9 -2
  195. siliconcompiler/toolscripts/ubuntu22/install-ghdl.sh +9 -2
  196. siliconcompiler/toolscripts/ubuntu22/install-gtkwave.sh +9 -2
  197. siliconcompiler/toolscripts/ubuntu22/install-icarus.sh +9 -2
  198. siliconcompiler/toolscripts/ubuntu22/install-icepack.sh +9 -2
  199. siliconcompiler/toolscripts/ubuntu22/install-klayout.sh +8 -1
  200. siliconcompiler/toolscripts/ubuntu22/install-magic.sh +9 -2
  201. siliconcompiler/toolscripts/ubuntu22/install-montage.sh +1 -1
  202. siliconcompiler/toolscripts/ubuntu22/install-netgen.sh +9 -2
  203. siliconcompiler/toolscripts/ubuntu22/install-nextpnr.sh +9 -2
  204. siliconcompiler/toolscripts/ubuntu22/install-openroad.sh +16 -3
  205. siliconcompiler/toolscripts/ubuntu22/install-opensta.sh +17 -5
  206. siliconcompiler/toolscripts/ubuntu22/install-slang.sh +11 -4
  207. siliconcompiler/toolscripts/ubuntu22/install-slurm.sh +9 -2
  208. siliconcompiler/toolscripts/ubuntu22/install-surelog.sh +10 -2
  209. siliconcompiler/toolscripts/ubuntu22/install-sv2v.sh +11 -4
  210. siliconcompiler/toolscripts/ubuntu22/install-verible.sh +11 -3
  211. siliconcompiler/toolscripts/ubuntu22/install-verilator.sh +9 -2
  212. siliconcompiler/toolscripts/ubuntu22/install-vpr.sh +9 -4
  213. siliconcompiler/toolscripts/ubuntu22/install-xdm.sh +10 -2
  214. siliconcompiler/toolscripts/ubuntu22/install-xyce.sh +13 -8
  215. siliconcompiler/toolscripts/ubuntu22/install-yosys-moosic.sh +9 -2
  216. siliconcompiler/toolscripts/ubuntu22/install-yosys-parmys.sh +10 -3
  217. siliconcompiler/toolscripts/ubuntu22/install-yosys-slang.sh +10 -2
  218. siliconcompiler/toolscripts/ubuntu22/install-yosys.sh +9 -2
  219. siliconcompiler/toolscripts/ubuntu24/install-bambu.sh +12 -4
  220. siliconcompiler/toolscripts/ubuntu24/install-bluespec.sh +10 -3
  221. siliconcompiler/toolscripts/ubuntu24/install-chisel.sh +9 -2
  222. siliconcompiler/toolscripts/ubuntu24/install-ghdl.sh +9 -2
  223. siliconcompiler/toolscripts/ubuntu24/install-gtkwave.sh +9 -2
  224. siliconcompiler/toolscripts/ubuntu24/install-icarus.sh +9 -2
  225. siliconcompiler/toolscripts/ubuntu24/install-icepack.sh +9 -2
  226. siliconcompiler/toolscripts/ubuntu24/install-klayout.sh +8 -1
  227. siliconcompiler/toolscripts/ubuntu24/install-magic.sh +9 -2
  228. siliconcompiler/toolscripts/ubuntu24/install-montage.sh +1 -1
  229. siliconcompiler/toolscripts/ubuntu24/install-netgen.sh +9 -2
  230. siliconcompiler/toolscripts/ubuntu24/install-nextpnr.sh +9 -2
  231. siliconcompiler/toolscripts/ubuntu24/install-openroad.sh +16 -3
  232. siliconcompiler/toolscripts/ubuntu24/install-opensta.sh +17 -5
  233. siliconcompiler/toolscripts/ubuntu24/install-slang.sh +11 -4
  234. siliconcompiler/toolscripts/ubuntu24/install-slurm.sh +9 -2
  235. siliconcompiler/toolscripts/ubuntu24/install-surelog.sh +10 -2
  236. siliconcompiler/toolscripts/ubuntu24/install-sv2v.sh +11 -4
  237. siliconcompiler/toolscripts/ubuntu24/install-verible.sh +11 -3
  238. siliconcompiler/toolscripts/ubuntu24/install-verilator.sh +9 -2
  239. siliconcompiler/toolscripts/ubuntu24/install-vpr.sh +9 -4
  240. siliconcompiler/toolscripts/ubuntu24/install-xdm.sh +10 -2
  241. siliconcompiler/toolscripts/ubuntu24/install-xyce.sh +13 -8
  242. siliconcompiler/toolscripts/ubuntu24/install-yosys-moosic.sh +9 -2
  243. siliconcompiler/toolscripts/ubuntu24/install-yosys-parmys.sh +10 -3
  244. siliconcompiler/toolscripts/ubuntu24/install-yosys-slang.sh +10 -2
  245. siliconcompiler/toolscripts/ubuntu24/install-yosys.sh +9 -2
  246. siliconcompiler/utils/__init__.py +19 -112
  247. siliconcompiler/utils/flowgraph.py +244 -0
  248. siliconcompiler/{issue.py → utils/issue.py} +18 -25
  249. siliconcompiler/utils/logging.py +3 -4
  250. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.1.dist-info}/METADATA +9 -8
  251. siliconcompiler-0.33.1.dist-info/RECORD +488 -0
  252. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.1.dist-info}/WHEEL +1 -1
  253. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.1.dist-info}/entry_points.txt +8 -8
  254. siliconcompiler/schema/schema_obj.py +0 -1936
  255. siliconcompiler/toolscripts/ubuntu20/install-vpr.sh +0 -29
  256. siliconcompiler/toolscripts/ubuntu20/install-yosys-parmys.sh +0 -61
  257. siliconcompiler-0.32.3.dist-info/RECORD +0 -470
  258. /siliconcompiler/{templates → data/templates}/__init__.py +0 -0
  259. /siliconcompiler/{templates → data/templates}/email/__init__.py +0 -0
  260. /siliconcompiler/{templates → data/templates}/email/general.j2 +0 -0
  261. /siliconcompiler/{templates → data/templates}/email/summary.j2 +0 -0
  262. /siliconcompiler/{templates → data/templates}/issue/README.txt +0 -0
  263. /siliconcompiler/{templates → data/templates}/issue/__init__.py +0 -0
  264. /siliconcompiler/{templates → data/templates}/issue/run.sh +0 -0
  265. /siliconcompiler/{templates → data/templates}/replay/replay.py.j2 +0 -0
  266. /siliconcompiler/{templates → data/templates}/replay/replay.sh.j2 +0 -0
  267. /siliconcompiler/{templates → data/templates}/replay/requirements.txt +0 -0
  268. /siliconcompiler/{templates → data/templates}/replay/setup.sh +0 -0
  269. /siliconcompiler/{templates → data/templates}/report/__init__.py +0 -0
  270. /siliconcompiler/{templates → data/templates}/report/bootstrap.min.css +0 -0
  271. /siliconcompiler/{templates → data/templates}/report/bootstrap.min.js +0 -0
  272. /siliconcompiler/{templates → data/templates}/report/bootstrap_LICENSE.md +0 -0
  273. /siliconcompiler/{templates → data/templates}/report/sc_report.j2 +0 -0
  274. /siliconcompiler/{templates → data/templates}/slurm/__init__.py +0 -0
  275. /siliconcompiler/{templates → data/templates}/slurm/run.sh +0 -0
  276. /siliconcompiler/{templates → data/templates}/tcl/__init__.py +0 -0
  277. /siliconcompiler/{templates → data/templates}/tcl/manifest.tcl.j2 +0 -0
  278. /siliconcompiler/{units.py → utils/units.py} +0 -0
  279. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.1.dist-info}/licenses/LICENSE +0 -0
  280. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.1.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 json
3
+ from . import EditableSchema, Parameter, Scope, PerNode
4
+ from .utils import trim
4
5
 
5
- # Default import must be relative, to facilitate tools with Python interfaces
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
- # 1. descend keypath until done
39
- # 2. create key if missing
40
- # 3. populate leaf cell when keypath empty
41
- if keypath:
42
- key = keypath[0]
43
- keypath.pop(0)
44
- if key not in cfg.keys():
45
- cfg[key] = {}
46
- scparam(cfg[key],
47
- keypath,
48
- sctype=sctype,
49
- scope=scope,
50
- require=require,
51
- defvalue=defvalue,
52
- copy=copy,
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, name='default'):
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='enum',
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
- ''' FPGA configuration
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, stackup='default'):
348
- ''' Process design kit configuration
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, partname='default', mode='default'):
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='enum',
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='enum',
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='enum',
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='enum',
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='[enum]',
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} 'partname {v[1]}'",
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} 'partname {v[1]}'",
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} '{v[1]}'",
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='enum',
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, 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='enum',
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='enum',
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='enum',
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 {val[1]}'",
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} 'a glob clock {v[1]}'",
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, flow='default', step='default', index='default'):
1509
-
1510
- # flowgraph input
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
- def schema_tool(cfg, tool='default'):
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 ToolSchemaTmp
1028
+ cfg.insert("tool", "default", ToolSchemaTmp())
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, step='default', index='default'):
2071
-
2072
- metrics = {'errors': 'errors',
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, step='default', index='default'):
2399
-
2400
- # setting up local data structure
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='enum',
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='enum',
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='[enum]',
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
- item = 'default'
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
- '''ASIC Automated Place and Route Parameters'''
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='enum',
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='enum',
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='enum',
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='1.0',
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))