siliconcompiler 0.26.5__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 (251) hide show
  1. siliconcompiler/__init__.py +24 -0
  2. siliconcompiler/__main__.py +12 -0
  3. siliconcompiler/_common.py +49 -0
  4. siliconcompiler/_metadata.py +36 -0
  5. siliconcompiler/apps/__init__.py +0 -0
  6. siliconcompiler/apps/_common.py +76 -0
  7. siliconcompiler/apps/sc.py +92 -0
  8. siliconcompiler/apps/sc_dashboard.py +94 -0
  9. siliconcompiler/apps/sc_issue.py +178 -0
  10. siliconcompiler/apps/sc_remote.py +199 -0
  11. siliconcompiler/apps/sc_server.py +39 -0
  12. siliconcompiler/apps/sc_show.py +142 -0
  13. siliconcompiler/apps/smake.py +232 -0
  14. siliconcompiler/checklists/__init__.py +0 -0
  15. siliconcompiler/checklists/oh_tapeout.py +41 -0
  16. siliconcompiler/core.py +3221 -0
  17. siliconcompiler/data/RobotoMono/LICENSE.txt +202 -0
  18. siliconcompiler/data/RobotoMono/RobotoMono-Regular.ttf +0 -0
  19. siliconcompiler/data/heartbeat.v +18 -0
  20. siliconcompiler/data/logo.png +0 -0
  21. siliconcompiler/flowgraph.py +570 -0
  22. siliconcompiler/flows/__init__.py +0 -0
  23. siliconcompiler/flows/_common.py +67 -0
  24. siliconcompiler/flows/asicflow.py +180 -0
  25. siliconcompiler/flows/asictopflow.py +38 -0
  26. siliconcompiler/flows/dvflow.py +86 -0
  27. siliconcompiler/flows/fpgaflow.py +202 -0
  28. siliconcompiler/flows/generate_openroad_rcx.py +66 -0
  29. siliconcompiler/flows/lintflow.py +35 -0
  30. siliconcompiler/flows/screenshotflow.py +51 -0
  31. siliconcompiler/flows/showflow.py +59 -0
  32. siliconcompiler/flows/signoffflow.py +53 -0
  33. siliconcompiler/flows/synflow.py +128 -0
  34. siliconcompiler/fpgas/__init__.py +0 -0
  35. siliconcompiler/fpgas/lattice_ice40.py +42 -0
  36. siliconcompiler/fpgas/vpr_example.py +109 -0
  37. siliconcompiler/issue.py +300 -0
  38. siliconcompiler/libs/__init__.py +0 -0
  39. siliconcompiler/libs/asap7sc7p5t.py +8 -0
  40. siliconcompiler/libs/gf180mcu.py +8 -0
  41. siliconcompiler/libs/nangate45.py +8 -0
  42. siliconcompiler/libs/sky130hd.py +8 -0
  43. siliconcompiler/libs/sky130io.py +8 -0
  44. siliconcompiler/package.py +412 -0
  45. siliconcompiler/pdks/__init__.py +0 -0
  46. siliconcompiler/pdks/asap7.py +8 -0
  47. siliconcompiler/pdks/freepdk45.py +8 -0
  48. siliconcompiler/pdks/gf180.py +8 -0
  49. siliconcompiler/pdks/skywater130.py +8 -0
  50. siliconcompiler/remote/__init__.py +36 -0
  51. siliconcompiler/remote/client.py +891 -0
  52. siliconcompiler/remote/schema.py +106 -0
  53. siliconcompiler/remote/server.py +507 -0
  54. siliconcompiler/remote/server_schema/requests/cancel_job.json +51 -0
  55. siliconcompiler/remote/server_schema/requests/check_progress.json +61 -0
  56. siliconcompiler/remote/server_schema/requests/check_server.json +38 -0
  57. siliconcompiler/remote/server_schema/requests/delete_job.json +51 -0
  58. siliconcompiler/remote/server_schema/requests/get_results.json +48 -0
  59. siliconcompiler/remote/server_schema/requests/remote_run.json +40 -0
  60. siliconcompiler/remote/server_schema/responses/cancel_job.json +18 -0
  61. siliconcompiler/remote/server_schema/responses/check_progress.json +30 -0
  62. siliconcompiler/remote/server_schema/responses/check_server.json +32 -0
  63. siliconcompiler/remote/server_schema/responses/delete_job.json +18 -0
  64. siliconcompiler/remote/server_schema/responses/get_results.json +21 -0
  65. siliconcompiler/remote/server_schema/responses/remote_run.json +25 -0
  66. siliconcompiler/report/__init__.py +13 -0
  67. siliconcompiler/report/html_report.py +74 -0
  68. siliconcompiler/report/report.py +355 -0
  69. siliconcompiler/report/streamlit_report.py +137 -0
  70. siliconcompiler/report/streamlit_viewer.py +944 -0
  71. siliconcompiler/report/summary_image.py +117 -0
  72. siliconcompiler/report/summary_table.py +105 -0
  73. siliconcompiler/report/utils.py +163 -0
  74. siliconcompiler/scheduler/__init__.py +2092 -0
  75. siliconcompiler/scheduler/docker_runner.py +253 -0
  76. siliconcompiler/scheduler/run_node.py +138 -0
  77. siliconcompiler/scheduler/send_messages.py +178 -0
  78. siliconcompiler/scheduler/slurm.py +208 -0
  79. siliconcompiler/scheduler/validation/email_credentials.json +54 -0
  80. siliconcompiler/schema/__init__.py +7 -0
  81. siliconcompiler/schema/schema_cfg.py +4014 -0
  82. siliconcompiler/schema/schema_obj.py +1841 -0
  83. siliconcompiler/schema/utils.py +93 -0
  84. siliconcompiler/sphinx_ext/__init__.py +0 -0
  85. siliconcompiler/sphinx_ext/dynamicgen.py +1006 -0
  86. siliconcompiler/sphinx_ext/schemagen.py +221 -0
  87. siliconcompiler/sphinx_ext/utils.py +166 -0
  88. siliconcompiler/targets/__init__.py +0 -0
  89. siliconcompiler/targets/asap7_demo.py +68 -0
  90. siliconcompiler/targets/asic_demo.py +38 -0
  91. siliconcompiler/targets/fpgaflow_demo.py +47 -0
  92. siliconcompiler/targets/freepdk45_demo.py +59 -0
  93. siliconcompiler/targets/gf180_demo.py +77 -0
  94. siliconcompiler/targets/skywater130_demo.py +70 -0
  95. siliconcompiler/templates/email/general.j2 +66 -0
  96. siliconcompiler/templates/email/summary.j2 +43 -0
  97. siliconcompiler/templates/issue/README.txt +26 -0
  98. siliconcompiler/templates/issue/run.sh +6 -0
  99. siliconcompiler/templates/report/bootstrap.min.css +7 -0
  100. siliconcompiler/templates/report/bootstrap.min.js +7 -0
  101. siliconcompiler/templates/report/bootstrap_LICENSE.md +24 -0
  102. siliconcompiler/templates/report/sc_report.j2 +427 -0
  103. siliconcompiler/templates/slurm/run.sh +9 -0
  104. siliconcompiler/templates/tcl/manifest.tcl.j2 +137 -0
  105. siliconcompiler/tools/__init__.py +0 -0
  106. siliconcompiler/tools/_common/__init__.py +432 -0
  107. siliconcompiler/tools/_common/asic.py +115 -0
  108. siliconcompiler/tools/_common/sdc/sc_constraints.sdc +76 -0
  109. siliconcompiler/tools/_common/tcl/sc_pin_constraints.tcl +63 -0
  110. siliconcompiler/tools/bambu/bambu.py +32 -0
  111. siliconcompiler/tools/bambu/convert.py +77 -0
  112. siliconcompiler/tools/bluespec/bluespec.py +40 -0
  113. siliconcompiler/tools/bluespec/convert.py +103 -0
  114. siliconcompiler/tools/builtin/_common.py +155 -0
  115. siliconcompiler/tools/builtin/builtin.py +26 -0
  116. siliconcompiler/tools/builtin/concatenate.py +85 -0
  117. siliconcompiler/tools/builtin/join.py +27 -0
  118. siliconcompiler/tools/builtin/maximum.py +46 -0
  119. siliconcompiler/tools/builtin/minimum.py +57 -0
  120. siliconcompiler/tools/builtin/mux.py +70 -0
  121. siliconcompiler/tools/builtin/nop.py +38 -0
  122. siliconcompiler/tools/builtin/verify.py +83 -0
  123. siliconcompiler/tools/chisel/SCDriver.scala +10 -0
  124. siliconcompiler/tools/chisel/build.sbt +27 -0
  125. siliconcompiler/tools/chisel/chisel.py +37 -0
  126. siliconcompiler/tools/chisel/convert.py +140 -0
  127. siliconcompiler/tools/execute/exec_input.py +41 -0
  128. siliconcompiler/tools/execute/execute.py +17 -0
  129. siliconcompiler/tools/genfasm/bitstream.py +61 -0
  130. siliconcompiler/tools/genfasm/genfasm.py +40 -0
  131. siliconcompiler/tools/ghdl/convert.py +87 -0
  132. siliconcompiler/tools/ghdl/ghdl.py +41 -0
  133. siliconcompiler/tools/icarus/compile.py +87 -0
  134. siliconcompiler/tools/icarus/icarus.py +36 -0
  135. siliconcompiler/tools/icepack/bitstream.py +20 -0
  136. siliconcompiler/tools/icepack/icepack.py +43 -0
  137. siliconcompiler/tools/klayout/export.py +117 -0
  138. siliconcompiler/tools/klayout/klayout.py +119 -0
  139. siliconcompiler/tools/klayout/klayout_export.py +205 -0
  140. siliconcompiler/tools/klayout/klayout_operations.py +363 -0
  141. siliconcompiler/tools/klayout/klayout_show.py +242 -0
  142. siliconcompiler/tools/klayout/klayout_utils.py +176 -0
  143. siliconcompiler/tools/klayout/operations.py +194 -0
  144. siliconcompiler/tools/klayout/screenshot.py +98 -0
  145. siliconcompiler/tools/klayout/show.py +101 -0
  146. siliconcompiler/tools/magic/drc.py +49 -0
  147. siliconcompiler/tools/magic/extspice.py +19 -0
  148. siliconcompiler/tools/magic/magic.py +85 -0
  149. siliconcompiler/tools/magic/sc_drc.tcl +96 -0
  150. siliconcompiler/tools/magic/sc_extspice.tcl +54 -0
  151. siliconcompiler/tools/magic/sc_magic.tcl +47 -0
  152. siliconcompiler/tools/montage/montage.py +30 -0
  153. siliconcompiler/tools/montage/tile.py +66 -0
  154. siliconcompiler/tools/netgen/count_lvs.py +132 -0
  155. siliconcompiler/tools/netgen/lvs.py +90 -0
  156. siliconcompiler/tools/netgen/netgen.py +36 -0
  157. siliconcompiler/tools/netgen/sc_lvs.tcl +46 -0
  158. siliconcompiler/tools/nextpnr/apr.py +24 -0
  159. siliconcompiler/tools/nextpnr/nextpnr.py +59 -0
  160. siliconcompiler/tools/openfpgaloader/openfpgaloader.py +39 -0
  161. siliconcompiler/tools/openroad/__init__.py +0 -0
  162. siliconcompiler/tools/openroad/cts.py +45 -0
  163. siliconcompiler/tools/openroad/dfm.py +66 -0
  164. siliconcompiler/tools/openroad/export.py +131 -0
  165. siliconcompiler/tools/openroad/floorplan.py +70 -0
  166. siliconcompiler/tools/openroad/openroad.py +977 -0
  167. siliconcompiler/tools/openroad/physyn.py +27 -0
  168. siliconcompiler/tools/openroad/place.py +41 -0
  169. siliconcompiler/tools/openroad/rcx_bench.py +95 -0
  170. siliconcompiler/tools/openroad/rcx_extract.py +34 -0
  171. siliconcompiler/tools/openroad/route.py +45 -0
  172. siliconcompiler/tools/openroad/screenshot.py +60 -0
  173. siliconcompiler/tools/openroad/scripts/sc_apr.tcl +499 -0
  174. siliconcompiler/tools/openroad/scripts/sc_cts.tcl +64 -0
  175. siliconcompiler/tools/openroad/scripts/sc_dfm.tcl +20 -0
  176. siliconcompiler/tools/openroad/scripts/sc_export.tcl +98 -0
  177. siliconcompiler/tools/openroad/scripts/sc_floorplan.tcl +413 -0
  178. siliconcompiler/tools/openroad/scripts/sc_metrics.tcl +158 -0
  179. siliconcompiler/tools/openroad/scripts/sc_physyn.tcl +7 -0
  180. siliconcompiler/tools/openroad/scripts/sc_place.tcl +84 -0
  181. siliconcompiler/tools/openroad/scripts/sc_procs.tcl +423 -0
  182. siliconcompiler/tools/openroad/scripts/sc_rcx.tcl +63 -0
  183. siliconcompiler/tools/openroad/scripts/sc_rcx_bench.tcl +20 -0
  184. siliconcompiler/tools/openroad/scripts/sc_rcx_extract.tcl +12 -0
  185. siliconcompiler/tools/openroad/scripts/sc_route.tcl +133 -0
  186. siliconcompiler/tools/openroad/scripts/sc_screenshot.tcl +21 -0
  187. siliconcompiler/tools/openroad/scripts/sc_write.tcl +5 -0
  188. siliconcompiler/tools/openroad/scripts/sc_write_images.tcl +361 -0
  189. siliconcompiler/tools/openroad/show.py +94 -0
  190. siliconcompiler/tools/openroad/templates/pex.tcl +8 -0
  191. siliconcompiler/tools/opensta/__init__.py +101 -0
  192. siliconcompiler/tools/opensta/report_libraries.py +28 -0
  193. siliconcompiler/tools/opensta/scripts/sc_procs.tcl +47 -0
  194. siliconcompiler/tools/opensta/scripts/sc_report_libraries.tcl +74 -0
  195. siliconcompiler/tools/opensta/scripts/sc_timing.tcl +268 -0
  196. siliconcompiler/tools/opensta/timing.py +214 -0
  197. siliconcompiler/tools/slang/__init__.py +49 -0
  198. siliconcompiler/tools/slang/lint.py +101 -0
  199. siliconcompiler/tools/surelog/__init__.py +123 -0
  200. siliconcompiler/tools/surelog/parse.py +183 -0
  201. siliconcompiler/tools/surelog/templates/output.v +7 -0
  202. siliconcompiler/tools/sv2v/convert.py +46 -0
  203. siliconcompiler/tools/sv2v/sv2v.py +37 -0
  204. siliconcompiler/tools/template/template.py +125 -0
  205. siliconcompiler/tools/verilator/compile.py +139 -0
  206. siliconcompiler/tools/verilator/lint.py +19 -0
  207. siliconcompiler/tools/verilator/parse.py +27 -0
  208. siliconcompiler/tools/verilator/verilator.py +172 -0
  209. siliconcompiler/tools/vivado/__init__.py +7 -0
  210. siliconcompiler/tools/vivado/bitstream.py +21 -0
  211. siliconcompiler/tools/vivado/place.py +21 -0
  212. siliconcompiler/tools/vivado/route.py +21 -0
  213. siliconcompiler/tools/vivado/scripts/sc_bitstream.tcl +6 -0
  214. siliconcompiler/tools/vivado/scripts/sc_place.tcl +2 -0
  215. siliconcompiler/tools/vivado/scripts/sc_route.tcl +4 -0
  216. siliconcompiler/tools/vivado/scripts/sc_run.tcl +45 -0
  217. siliconcompiler/tools/vivado/scripts/sc_syn_fpga.tcl +25 -0
  218. siliconcompiler/tools/vivado/syn_fpga.py +20 -0
  219. siliconcompiler/tools/vivado/vivado.py +147 -0
  220. siliconcompiler/tools/vpr/_json_constraint.py +63 -0
  221. siliconcompiler/tools/vpr/_xml_constraint.py +109 -0
  222. siliconcompiler/tools/vpr/place.py +137 -0
  223. siliconcompiler/tools/vpr/route.py +124 -0
  224. siliconcompiler/tools/vpr/screenshot.py +54 -0
  225. siliconcompiler/tools/vpr/show.py +88 -0
  226. siliconcompiler/tools/vpr/vpr.py +357 -0
  227. siliconcompiler/tools/xyce/xyce.py +36 -0
  228. siliconcompiler/tools/yosys/lec.py +56 -0
  229. siliconcompiler/tools/yosys/prepareLib.py +59 -0
  230. siliconcompiler/tools/yosys/sc_lec.tcl +84 -0
  231. siliconcompiler/tools/yosys/sc_syn.tcl +79 -0
  232. siliconcompiler/tools/yosys/syn_asic.py +565 -0
  233. siliconcompiler/tools/yosys/syn_asic.tcl +377 -0
  234. siliconcompiler/tools/yosys/syn_asic_fpga_shared.tcl +31 -0
  235. siliconcompiler/tools/yosys/syn_fpga.py +146 -0
  236. siliconcompiler/tools/yosys/syn_fpga.tcl +233 -0
  237. siliconcompiler/tools/yosys/syn_strategies.tcl +81 -0
  238. siliconcompiler/tools/yosys/techmaps/lcu_kogge_stone.v +39 -0
  239. siliconcompiler/tools/yosys/templates/abc.const +2 -0
  240. siliconcompiler/tools/yosys/yosys.py +147 -0
  241. siliconcompiler/units.py +259 -0
  242. siliconcompiler/use.py +177 -0
  243. siliconcompiler/utils/__init__.py +423 -0
  244. siliconcompiler/utils/asic.py +158 -0
  245. siliconcompiler/utils/showtools.py +25 -0
  246. siliconcompiler-0.26.5.dist-info/LICENSE +190 -0
  247. siliconcompiler-0.26.5.dist-info/METADATA +195 -0
  248. siliconcompiler-0.26.5.dist-info/RECORD +251 -0
  249. siliconcompiler-0.26.5.dist-info/WHEEL +5 -0
  250. siliconcompiler-0.26.5.dist-info/entry_points.txt +12 -0
  251. siliconcompiler-0.26.5.dist-info/top_level.txt +1 -0
@@ -0,0 +1,74 @@
1
+ ###############################
2
+ # Reading SC Schema
3
+ ###############################
4
+
5
+ source ./sc_manifest.tcl > /dev/null
6
+
7
+ ##############################
8
+ # Schema Adapter
9
+ ###############################
10
+
11
+ set sc_tool opensta
12
+ set sc_step [sc_cfg_get arg step]
13
+ set sc_index [sc_cfg_get arg index]
14
+ set sc_flow [sc_cfg_get option flow]
15
+ set sc_task [sc_cfg_get flowgraph $sc_flow $sc_step $sc_index task]
16
+
17
+ set sc_refdir [sc_cfg_tool_task_get refdir]
18
+
19
+ # Design
20
+ set sc_design [sc_top]
21
+
22
+ # APR Parameters
23
+ set sc_targetlibs [sc_get_asic_libraries logic]
24
+ set sc_delaymodel [sc_cfg_get asic delaymodel]
25
+ set sc_scenarios [dict keys [sc_cfg_get constraint timing]]
26
+
27
+ ###############################
28
+ # Optional
29
+ ###############################
30
+
31
+ # MACROS
32
+ set sc_macrolibs [sc_get_asic_libraries macro]
33
+
34
+ ###############################
35
+ # Read Files
36
+ ###############################
37
+
38
+ # Read Liberty
39
+ puts "Defining timing corners: $sc_scenarios"
40
+ define_corners {*}$sc_scenarios
41
+ foreach lib "$sc_targetlibs $sc_macrolibs" {
42
+ #Liberty
43
+ foreach corner $sc_scenarios {
44
+ foreach libcorner [sc_cfg_get constraint timing $corner libcorner] {
45
+ if { [sc_cfg_exists library $lib output $libcorner $sc_delaymodel] } {
46
+ foreach lib_file [sc_cfg_get library $lib output $libcorner $sc_delaymodel] {
47
+ puts "Reading liberty file for ${corner} ($libcorner): ${lib_file}"
48
+ read_liberty -corner $corner $lib_file
49
+ }
50
+ break
51
+ }
52
+ }
53
+ }
54
+ }
55
+
56
+ # Report cells
57
+ foreach cell [get_lib_cells *] {
58
+ puts [get_full_name $cell]
59
+
60
+ set pins [get_lib_pins -quiet [get_full_name $cell]/*]
61
+ if { [llength $pins] == 0 } {
62
+ puts " No pins"
63
+ continue
64
+ }
65
+ foreach pin $pins {
66
+ puts " [get_full_name $pin] [get_property $pin direction]"
67
+ set cap [expr { [sta::capacitance_ui_sta [get_property $pin capacitance]] / 1e-15 }]
68
+ puts " Capacitance: [format %.3f $cap]fF"
69
+ set res [sta::resistance_ui_sta [get_property $pin drive_resistance]]
70
+ puts " Drive resistance: [format %.3f $res]ohm"
71
+ set delay [expr { [sta::time_ui_sta [get_property $pin intrinsic_delay]] / 1e-12 }]
72
+ puts " Intrinsic delay: [format %.3f $delay]ps"
73
+ }
74
+ }
@@ -0,0 +1,268 @@
1
+ ###############################
2
+ # Reading SC Schema
3
+ ###############################
4
+
5
+ source ./sc_manifest.tcl > /dev/null
6
+
7
+ ##############################
8
+ # Schema Adapter
9
+ ###############################
10
+
11
+ set sc_tool opensta
12
+ set sc_step [sc_cfg_get arg step]
13
+ set sc_index [sc_cfg_get arg index]
14
+ set sc_flow [sc_cfg_get option flow]
15
+ set sc_task [sc_cfg_get flowgraph $sc_flow $sc_step $sc_index task]
16
+
17
+ set sc_refdir [sc_cfg_tool_task_get refdir]
18
+
19
+ # Design
20
+ set sc_design [sc_top]
21
+
22
+ # APR Parameters
23
+ set sc_targetlibs [sc_get_asic_libraries logic]
24
+ set sc_mainlib [lindex $sc_targetlibs 0]
25
+ set sc_delaymodel [sc_cfg_get asic delaymodel]
26
+ set sc_timing_mode [lindex [sc_cfg_tool_task_get var timing_mode] 0]
27
+ set sc_scenarios []
28
+ foreach corner [dict keys [sc_cfg_get constraint timing]] {
29
+ if { [sc_cfg_get constraint timing $corner mode] == $sc_timing_mode } {
30
+ lappend sc_scenarios $corner
31
+ }
32
+ }
33
+
34
+ ###############################
35
+ # Optional
36
+ ###############################
37
+
38
+ # MACROS
39
+ set sc_macrolibs [sc_get_asic_libraries macro]
40
+
41
+ ###############################
42
+ # Read Files
43
+ ###############################
44
+
45
+ # Read Liberty
46
+ puts "Defining timing corners: $sc_scenarios"
47
+ define_corners {*}$sc_scenarios
48
+ foreach lib "$sc_targetlibs $sc_macrolibs" {
49
+ #Liberty
50
+ foreach corner $sc_scenarios {
51
+ foreach libcorner [sc_cfg_get constraint timing $corner libcorner] {
52
+ if { [sc_cfg_exists library $lib output $libcorner $sc_delaymodel] } {
53
+ foreach lib_file [sc_cfg_get library $lib output $libcorner $sc_delaymodel] {
54
+ puts "Reading liberty file for ${corner} ($libcorner): ${lib_file}"
55
+ read_liberty -corner $corner $lib_file
56
+ }
57
+ break
58
+ }
59
+ }
60
+ }
61
+ }
62
+
63
+ # Read Verilog
64
+ if { [file exists "inputs/${sc_design}.vg"] } {
65
+ puts "Reading netlist verilog: inputs/${sc_design}.vg"
66
+ read_verilog "inputs/${sc_design}.vg"
67
+ } else {
68
+ foreach netlist [sc_cfg_get input netlist verilog] {
69
+ puts "Reading netlist verilog: ${netlist}"
70
+ read_verilog $netlist
71
+ }
72
+ }
73
+ link_design $sc_design
74
+
75
+ # Read SDC (in order of priority)
76
+ # TODO: add logic for reading from ['constraint', ...] once we support MCMM
77
+ if { [file exists "inputs/${sc_design}.sdc"] } {
78
+ # get from previous step
79
+ puts "Reading SDC: inputs/${sc_design}.sdc"
80
+ read_sdc "inputs/${sc_design}.sdc"
81
+ } elseif { [sc_cfg_exists input constraint sdc] } {
82
+ foreach sdc [sc_cfg_get input constraint sdc] {
83
+ # read step constraint if exists
84
+ puts "Reading SDC: ${sdc}"
85
+ read_sdc $sdc
86
+ }
87
+
88
+ set sdc_files []
89
+ foreach corner $sc_scenarios {
90
+ foreach sdc [sc_cfg_get constraint timing $corner file] {
91
+ if { [lsearch -exact $sdc_files $sdc] == -1 } {
92
+ # read step constraint if exists
93
+ puts "Reading mode (${sc_timing_mode}) SDC: ${sdc}"
94
+ lappend sdc_files $sdc
95
+ read_sdc $sdc
96
+ }
97
+ }
98
+ }
99
+ } else {
100
+ # fall back on default auto generated constraints file
101
+ set sdc "[sc_cfg_tool_task_get file opensta_generic_sdc]"
102
+ puts "Reading SDC: ${sdc}"
103
+ puts "Warning: Defaulting back to default SDC"
104
+ read_sdc "${sdc}"
105
+ }
106
+
107
+ ###############################
108
+
109
+ foreach corner $sc_scenarios {
110
+ set pex_corner [sc_cfg_get constraint timing $corner pexcorner]
111
+
112
+ set spef_file "inputs/${sc_design}.${pex_corner}.spef"
113
+ if { [file exists $spef_file] } {
114
+ puts "Reading SPEF ($corner): $spef_file"
115
+ read_spef -corner $corner $spef_file
116
+ }
117
+ }
118
+
119
+ ###############################
120
+ # Source helper functions
121
+ ###############################
122
+
123
+ source "$sc_refdir/sc_procs.tcl"
124
+
125
+ ###############################
126
+ # Report Metrics
127
+ ###############################
128
+
129
+ set opensta_top_n_paths [lindex [sc_cfg_tool_task_get var top_n_paths] 0]
130
+
131
+ set fields "{capacitance slew input_pins nets fanout}"
132
+ set PREFIX "SC_METRIC:"
133
+
134
+ puts "$PREFIX timeunit"
135
+ puts [sta::unit_scale_abbreviation time]
136
+
137
+ puts "$PREFIX report_checks -path_delay max"
138
+ report_checks -fields $fields -path_delay max -format full_clock_expanded \
139
+ > reports/setup.rpt
140
+ sc_display_report reports/setup.rpt
141
+ report_checks -path_delay max -group_count $opensta_top_n_paths \
142
+ > reports/setup.topN.rpt
143
+
144
+ puts "$PREFIX setupslack"
145
+ report_worst_slack -max > reports/worst_slack.setup.rpt
146
+ sc_display_report reports/worst_slack.setup.rpt
147
+
148
+ puts "$PREFIX setuppaths"
149
+ puts [sta::endpoint_violation_count max]
150
+
151
+ puts "$PREFIX setuptns"
152
+ report_tns > reports/total_negative_slack.rpt
153
+ sc_display_report reports/total_negative_slack.rpt
154
+
155
+ puts "$PREFIX report_checks -path_delay min"
156
+ report_checks -fields $fields -path_delay min -format full_clock_expanded \
157
+ > reports/hold.rpt
158
+ sc_display_report reports/hold.rpt
159
+ report_checks -path_delay min -group_count $opensta_top_n_paths \
160
+ > reports/hold.topN.rpt
161
+
162
+ puts "$PREFIX holdslack"
163
+ report_worst_slack -min > reports/worst_slack.hold.rpt
164
+ sc_display_report reports/worst_slack.hold.rpt
165
+
166
+ puts "$PREFIX holdpaths"
167
+ puts [sta::endpoint_violation_count max]
168
+
169
+ puts "$PREFIX holdtns"
170
+ puts "tns [sta::time_sta_ui [sta::total_negative_slack_cmd min]]"
171
+
172
+ report_checks -fields $fields -unconstrained -format full_clock_expanded \
173
+ > reports/unconstrained.rpt
174
+ sc_display_report reports/unconstrained.rpt
175
+ report_checks -unconstrained -group_count $opensta_top_n_paths \
176
+ > reports/unconstrained.topN.rpt
177
+
178
+ if { [llength [all_clocks]] > 0 } {
179
+ puts "$PREFIX setupskew"
180
+ report_clock_skew -setup -digits 4 > reports/skew.setup.rpt
181
+ sc_display_report reports/skew.setup.rpt
182
+ puts "$PREFIX holdskew"
183
+ report_clock_skew -hold -digits 4 > reports/skew.hold.rpt
184
+ sc_display_report reports/skew.hold.rpt
185
+ }
186
+
187
+ puts "$PREFIX drvs"
188
+ report_check_types -max_slew -max_capacitance -max_fanout -violators -no_line_splits \
189
+ > reports/drv_violators.rpt
190
+ sc_display_report reports/drv_violators.rpt
191
+
192
+ # Model on: https://github.com/The-OpenROAD-Project/OpenSTA/blob/f913c3ddbb3e7b4364ed4437c65ac78c4da9174b/tcl/Search.tcl#L1078
193
+ set fmax_metric 0
194
+ foreach clk [sta::sort_by_name [all_clocks]] {
195
+ puts "$PREFIX fmax"
196
+ set clk_name [get_name $clk]
197
+ set min_period [sta::find_clk_min_period $clk 1]
198
+ if { $min_period == 0.0 } {
199
+ continue
200
+ }
201
+ set fmax [expr { 1.0 / $min_period }]
202
+ puts "$clk_name fmax = [format %.2f [expr { $fmax / 1e6 }]] MHz"
203
+ set fmax_metric [expr { max($fmax_metric, $fmax) }]
204
+ }
205
+ if { $fmax_metric > 0 } {
206
+ puts "fmax = [format %.2f [expr { $fmax_metric / 1e6 }]] MHz"
207
+ }
208
+
209
+ # get logic depth of design
210
+ puts "$PREFIX logicdepth"
211
+ puts [sc_count_logic_depth]
212
+
213
+ puts "$PREFIX power"
214
+ foreach corner [sta::corners] {
215
+ set corner_name [$corner name]
216
+ puts "Power for corner: $corner_name"
217
+ report_power -corner $corner_name > reports/power.${corner_name}.rpt
218
+ sc_display_report reports/power.${corner_name}.rpt
219
+ }
220
+
221
+ puts "$PREFIX cells"
222
+ puts [llength [get_cells *]]
223
+
224
+ puts "$PREFIX cellarea"
225
+ puts [sc_design_area]
226
+
227
+ # get number of nets in design
228
+ puts "$PREFIX nets"
229
+ puts [llength [get_nets *]]
230
+
231
+ # get number of registers
232
+ puts "$PREFIX registers"
233
+ puts [llength [all_registers]]
234
+
235
+ # get number of buffers
236
+ set bufs 0
237
+ set invs 0
238
+ foreach inst [get_cells -hierarchical *] {
239
+ set cell [$inst cell]
240
+ if { $cell == "NULL" } {
241
+ continue
242
+ }
243
+ set liberty_cell [$cell liberty_cell]
244
+ if { $liberty_cell == "NULL" } {
245
+ continue
246
+ }
247
+ if { [$liberty_cell is_buffer] } {
248
+ incr bufs
249
+ } elseif { [$liberty_cell is_inverter] } {
250
+ incr invs
251
+ }
252
+ }
253
+ puts "$PREFIX buffers"
254
+ puts $bufs
255
+ puts "$PREFIX inverters"
256
+ puts $invs
257
+
258
+ puts "$PREFIX pins"
259
+ puts [llength [get_ports *]]
260
+
261
+ # get number of unconstrained endpoints
262
+ with_output_to_variable endpoints {check_setup -unconstrained_endpoints}
263
+ set unconstrained_endpoints [regexp -all -inline {[0-9]+} $endpoints]
264
+ if { $unconstrained_endpoints == "" } {
265
+ set unconstrained_endpoints 0
266
+ }
267
+ puts "$PREFIX unconstrained"
268
+ puts $unconstrained_endpoints
@@ -0,0 +1,214 @@
1
+ import os
2
+ import re
3
+ from siliconcompiler import sc_open, SiliconCompilerError
4
+ from siliconcompiler.tools.opensta import setup as tool_setup
5
+ from siliconcompiler.tools.opensta import runtime_options as tool_runtime_options
6
+ from siliconcompiler.tools._common import input_provides, add_common_file, \
7
+ get_tool_task, record_metric
8
+ from siliconcompiler.tools._common.asic import set_tool_task_var, get_timing_modes
9
+
10
+
11
+ def setup(chip):
12
+ '''
13
+ Generate a static timing reports.
14
+ '''
15
+
16
+ step = chip.get('arg', 'step')
17
+ index = chip.get('arg', 'index')
18
+ tool, task = get_tool_task(chip, step, index)
19
+
20
+ tool_setup(chip)
21
+
22
+ chip.set('tool', tool, 'task', task, 'script', 'sc_timing.tcl',
23
+ step=step, index=index, clobber=False)
24
+
25
+ chip.set('tool', tool, 'task', task, 'threads', os.cpu_count(),
26
+ step=step, index=index)
27
+
28
+ design = chip.top()
29
+ if f'{design}.vg' in input_provides(chip, step, index):
30
+ chip.set('tool', tool, 'task', task, 'input', f'{design}.vg',
31
+ step=step, index=index)
32
+ else:
33
+ chip.set('tool', tool, 'task', task, 'require', 'input,netlist,verilog',
34
+ step=step, index=index)
35
+
36
+ if f'{design}.sdc' in input_provides(chip, step, index):
37
+ chip.set('tool', tool, 'task', task, 'input', f'{design}.sdc',
38
+ step=step, index=index)
39
+ elif chip.valid('input', 'constraint', 'sdc') and \
40
+ chip.get('input', 'constraint', 'sdc', step=step, index=index):
41
+ chip.add('tool', tool, 'task', task, 'require', 'input,constraint,sdc',
42
+ step=step, index=index)
43
+
44
+ set_tool_task_var(chip, param_key='top_n_paths',
45
+ default_value='10',
46
+ schelp='number of paths to report timing for')
47
+
48
+ modes = get_timing_modes(chip)
49
+
50
+ set_tool_task_var(chip, param_key='timing_mode',
51
+ default_value=modes[0],
52
+ schelp='timing mode to use')
53
+
54
+ timing_mode = chip.get('tool', tool, 'task', task, 'var', 'timing_mode',
55
+ step=step, index=index)[0]
56
+ if timing_mode not in modes:
57
+ raise SiliconCompilerError(
58
+ f'{timing_mode} mode is not present in timing constraints', chip=chip)
59
+
60
+ for scenario in chip.getkeys('constraint', 'timing'):
61
+ if chip.get('constraint', 'timing', scenario, 'mode',
62
+ step=step, index=index) != timing_mode:
63
+ continue
64
+ if chip.get('constraint', 'timing', scenario, 'file', step=step, index=index):
65
+ chip.add('tool', tool, 'task', task, 'require', f'constraint,timing,{scenario},file',
66
+ step=step, index=index)
67
+
68
+ add_common_file(chip, 'opensta_generic_sdc', 'sdc/sc_constraints.sdc')
69
+
70
+
71
+ def __report_map(chip, metric, basefile):
72
+ corners = chip.getkeys('constraint', 'timing')
73
+ mapping = {
74
+ "power": [f"reports/power.{corner}.rpt" for corner in corners],
75
+ "unconstrained": ["reports/unconstrained.rpt", "reports/unconstrained.topN.rpt"],
76
+ "setuppaths": ["reports/setup.rpt", "reports/setup.topN.rpt"],
77
+ "holdpaths": ["reports/hold.rpt", "reports/hold.topN.rpt"],
78
+ "holdslack": ["reports/hold.rpt", "reports/hold.topN.rpt"],
79
+ "setupslack": ["reports/setup.rpt", "reports/setup.topN.rpt"],
80
+ "setuptns": ["reports/setup.rpt", "reports/setup.topN.rpt"],
81
+ "holdtns": ["reports/hold.rpt", "reports/hold.topN.rpt"],
82
+ "setupskew": ["reports/skew.setup.rpt", "reports/setup.rpt", "reports/setup.topN.rpt"],
83
+ "holdskew": ["reports/skew.hold.rpt", "reports/hold.rpt", "reports/hold.topN.rpt"]
84
+ }
85
+
86
+ if metric in mapping:
87
+ paths = [basefile]
88
+ for path in mapping[metric]:
89
+ if os.path.exists(path):
90
+ paths.append(path)
91
+ return paths
92
+ return [basefile]
93
+
94
+
95
+ ################################
96
+ # Post_process (post executable)
97
+ ################################
98
+ def post_process(chip):
99
+ '''
100
+ Tool specific function to run after step execution
101
+ '''
102
+
103
+ # Check log file for errors and statistics
104
+ step = chip.get('arg', 'step')
105
+ index = chip.get('arg', 'index')
106
+ logfile = f"{step}.log"
107
+
108
+ peakpower = []
109
+ leakagepower = []
110
+ skews = {}
111
+ # parsing log file
112
+ with sc_open(logfile) as f:
113
+ timescale = "s"
114
+ metric = None
115
+ for line in f:
116
+ metricmatch = re.search(r'^SC_METRIC:\s+(\w+)', line)
117
+ value = re.search(r'(\d*\.?\d)*', line)
118
+ fmax = re.search(r'fmax = (\d*\.?\d*)', line)
119
+ tns = re.search(r'^tns (.*)', line)
120
+ slack = re.search(r'^worst slack (.*)', line)
121
+ skew = re.search(r'^\s*(.*)\s+(.*) skew', line)
122
+ power = re.search(r'^Total(.*)', line)
123
+ if metricmatch:
124
+ metric = metricmatch.group(1)
125
+ continue
126
+
127
+ if metric:
128
+ if metric == 'timeunit':
129
+ timescale = f'{line.strip()}s'
130
+ metric = None
131
+ if metric == 'fmax':
132
+ if fmax:
133
+ record_metric(chip, step, index, 'fmax', float(fmax.group(1)),
134
+ __report_map(chip, 'fmax', logfile),
135
+ source_unit='MHz')
136
+ metric = None
137
+ elif metric == 'power':
138
+ if power:
139
+ powerlist = power.group(1).split()
140
+ leakage = powerlist[2]
141
+ total = powerlist[3]
142
+
143
+ peakpower.append(float(total))
144
+ leakagepower.append(float(leakage))
145
+
146
+ metric = None
147
+ elif metric == 'cellarea':
148
+ record_metric(chip, step, index, 'cellarea', float(value.group(0)),
149
+ __report_map(chip, 'cellarea', logfile),
150
+ source_unit='um^2')
151
+ metric = None
152
+ elif metric in ('logicdepth',
153
+ 'cells',
154
+ 'nets',
155
+ 'buffers',
156
+ 'inverters',
157
+ 'registers',
158
+ 'unconstrained',
159
+ 'pins',
160
+ 'setuppaths',
161
+ 'holdpaths'):
162
+ record_metric(chip, step, index, metric, int(value.group(0)),
163
+ __report_map(chip, metric, logfile))
164
+ metric = None
165
+ elif metric in ('holdslack', 'setupslack'):
166
+ if slack:
167
+ record_metric(chip, step, index, metric, float(slack.group(1)),
168
+ __report_map(chip, metric, logfile),
169
+ source_unit=timescale)
170
+ metric = None
171
+ elif metric in ('setuptns', 'holdtns'):
172
+ if tns:
173
+ record_metric(chip, step, index, metric, float(tns.group(1)),
174
+ __report_map(chip, metric, logfile),
175
+ source_unit=timescale)
176
+ metric = None
177
+ elif metric in ('setupskew', 'holdskew'):
178
+ if skew:
179
+ skews.setdefault(skew.group(2), []).append(float(skew.group(1)))
180
+ else:
181
+ metric = None
182
+
183
+ if peakpower:
184
+ record_metric(chip, step, index, 'peakpower', max(peakpower),
185
+ __report_map(chip, 'peakpower', logfile),
186
+ source_unit='W')
187
+ if leakagepower:
188
+ record_metric(chip, step, index, 'leakagepower', max(leakagepower),
189
+ __report_map(chip, 'leakagepower', logfile),
190
+ source_unit='W')
191
+ if skews:
192
+ for skewtype, values in skews.items():
193
+ skew = f'{skewtype}skew'
194
+ record_metric(chip, step, index, skew, max(values),
195
+ __report_map(chip, skew, logfile),
196
+ source_unit=timescale)
197
+
198
+ drv_report = "reports/drv_violators.rpt"
199
+ if os.path.exists(drv_report):
200
+ drv_count = 0
201
+ with sc_open(drv_report) as f:
202
+ for line in f:
203
+ if re.search(r'\(VIOLATED\)$', line):
204
+ drv_count += 1
205
+
206
+ record_metric(chip, step, index, 'drvs', drv_count,
207
+ [drv_report, logfile])
208
+
209
+
210
+ ################################
211
+ # Runtime options
212
+ ################################
213
+ def runtime_options(chip):
214
+ return tool_runtime_options(chip)
@@ -0,0 +1,49 @@
1
+ '''
2
+ slang is a software library that provides various components for lexing, parsing, type checking,
3
+ and elaborating SystemVerilog code. It comes with an executable tool that can compile and lint
4
+ any SystemVerilog project, but it is also intended to be usable as a front end for synthesis
5
+ tools, simulators, linters, code editors, and refactoring tools.
6
+
7
+ Documentation: https://sv-lang.com/
8
+
9
+ Sources: https://github.com/MikePopoloski/slang
10
+
11
+ Installation: https://sv-lang.com/building.html
12
+ '''
13
+ import re
14
+ from siliconcompiler import sc_open
15
+ from siliconcompiler.tools._common import get_tool_task, record_metric
16
+
17
+
18
+ ################################
19
+ # Setup Tool (pre executable)
20
+ ################################
21
+ def setup(chip):
22
+ tool = 'slang'
23
+
24
+ # Standard Setup
25
+ chip.set('tool', tool, 'exe', 'slang')
26
+ chip.set('tool', tool, 'vswitch', '--version')
27
+ chip.set('tool', tool, 'version', '>=6.0', clobber=False)
28
+
29
+
30
+ def parse_version(stdout):
31
+ # slang --version output looks like:
32
+ # slang version 6.0.121+c2c478cf
33
+
34
+ # grab version # by splitting on whitespace
35
+ return stdout.strip().split()[-1].split('+')[0]
36
+
37
+
38
+ def post_process(chip):
39
+ step = chip.get('arg', 'step')
40
+ index = chip.get('arg', 'index')
41
+ tool, task = get_tool_task(chip, step, index)
42
+
43
+ log = f'{step}.log'
44
+ with sc_open(log) as f:
45
+ for line in f:
46
+ match = re.search(r'(\d+) errors, (\d+) warnings', line)
47
+ if match:
48
+ record_metric(chip, step, index, 'errors', match.group(1), log)
49
+ record_metric(chip, step, index, 'warnings', match.group(2), log)