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.
- siliconcompiler/__init__.py +24 -0
- siliconcompiler/__main__.py +12 -0
- siliconcompiler/_common.py +49 -0
- siliconcompiler/_metadata.py +36 -0
- siliconcompiler/apps/__init__.py +0 -0
- siliconcompiler/apps/_common.py +76 -0
- siliconcompiler/apps/sc.py +92 -0
- siliconcompiler/apps/sc_dashboard.py +94 -0
- siliconcompiler/apps/sc_issue.py +178 -0
- siliconcompiler/apps/sc_remote.py +199 -0
- siliconcompiler/apps/sc_server.py +39 -0
- siliconcompiler/apps/sc_show.py +142 -0
- siliconcompiler/apps/smake.py +232 -0
- siliconcompiler/checklists/__init__.py +0 -0
- siliconcompiler/checklists/oh_tapeout.py +41 -0
- siliconcompiler/core.py +3221 -0
- siliconcompiler/data/RobotoMono/LICENSE.txt +202 -0
- siliconcompiler/data/RobotoMono/RobotoMono-Regular.ttf +0 -0
- siliconcompiler/data/heartbeat.v +18 -0
- siliconcompiler/data/logo.png +0 -0
- siliconcompiler/flowgraph.py +570 -0
- siliconcompiler/flows/__init__.py +0 -0
- siliconcompiler/flows/_common.py +67 -0
- siliconcompiler/flows/asicflow.py +180 -0
- siliconcompiler/flows/asictopflow.py +38 -0
- siliconcompiler/flows/dvflow.py +86 -0
- siliconcompiler/flows/fpgaflow.py +202 -0
- siliconcompiler/flows/generate_openroad_rcx.py +66 -0
- siliconcompiler/flows/lintflow.py +35 -0
- siliconcompiler/flows/screenshotflow.py +51 -0
- siliconcompiler/flows/showflow.py +59 -0
- siliconcompiler/flows/signoffflow.py +53 -0
- siliconcompiler/flows/synflow.py +128 -0
- siliconcompiler/fpgas/__init__.py +0 -0
- siliconcompiler/fpgas/lattice_ice40.py +42 -0
- siliconcompiler/fpgas/vpr_example.py +109 -0
- siliconcompiler/issue.py +300 -0
- siliconcompiler/libs/__init__.py +0 -0
- siliconcompiler/libs/asap7sc7p5t.py +8 -0
- siliconcompiler/libs/gf180mcu.py +8 -0
- siliconcompiler/libs/nangate45.py +8 -0
- siliconcompiler/libs/sky130hd.py +8 -0
- siliconcompiler/libs/sky130io.py +8 -0
- siliconcompiler/package.py +412 -0
- siliconcompiler/pdks/__init__.py +0 -0
- siliconcompiler/pdks/asap7.py +8 -0
- siliconcompiler/pdks/freepdk45.py +8 -0
- siliconcompiler/pdks/gf180.py +8 -0
- siliconcompiler/pdks/skywater130.py +8 -0
- siliconcompiler/remote/__init__.py +36 -0
- siliconcompiler/remote/client.py +891 -0
- siliconcompiler/remote/schema.py +106 -0
- siliconcompiler/remote/server.py +507 -0
- siliconcompiler/remote/server_schema/requests/cancel_job.json +51 -0
- siliconcompiler/remote/server_schema/requests/check_progress.json +61 -0
- siliconcompiler/remote/server_schema/requests/check_server.json +38 -0
- siliconcompiler/remote/server_schema/requests/delete_job.json +51 -0
- siliconcompiler/remote/server_schema/requests/get_results.json +48 -0
- siliconcompiler/remote/server_schema/requests/remote_run.json +40 -0
- siliconcompiler/remote/server_schema/responses/cancel_job.json +18 -0
- siliconcompiler/remote/server_schema/responses/check_progress.json +30 -0
- siliconcompiler/remote/server_schema/responses/check_server.json +32 -0
- siliconcompiler/remote/server_schema/responses/delete_job.json +18 -0
- siliconcompiler/remote/server_schema/responses/get_results.json +21 -0
- siliconcompiler/remote/server_schema/responses/remote_run.json +25 -0
- siliconcompiler/report/__init__.py +13 -0
- siliconcompiler/report/html_report.py +74 -0
- siliconcompiler/report/report.py +355 -0
- siliconcompiler/report/streamlit_report.py +137 -0
- siliconcompiler/report/streamlit_viewer.py +944 -0
- siliconcompiler/report/summary_image.py +117 -0
- siliconcompiler/report/summary_table.py +105 -0
- siliconcompiler/report/utils.py +163 -0
- siliconcompiler/scheduler/__init__.py +2092 -0
- siliconcompiler/scheduler/docker_runner.py +253 -0
- siliconcompiler/scheduler/run_node.py +138 -0
- siliconcompiler/scheduler/send_messages.py +178 -0
- siliconcompiler/scheduler/slurm.py +208 -0
- siliconcompiler/scheduler/validation/email_credentials.json +54 -0
- siliconcompiler/schema/__init__.py +7 -0
- siliconcompiler/schema/schema_cfg.py +4014 -0
- siliconcompiler/schema/schema_obj.py +1841 -0
- siliconcompiler/schema/utils.py +93 -0
- siliconcompiler/sphinx_ext/__init__.py +0 -0
- siliconcompiler/sphinx_ext/dynamicgen.py +1006 -0
- siliconcompiler/sphinx_ext/schemagen.py +221 -0
- siliconcompiler/sphinx_ext/utils.py +166 -0
- siliconcompiler/targets/__init__.py +0 -0
- siliconcompiler/targets/asap7_demo.py +68 -0
- siliconcompiler/targets/asic_demo.py +38 -0
- siliconcompiler/targets/fpgaflow_demo.py +47 -0
- siliconcompiler/targets/freepdk45_demo.py +59 -0
- siliconcompiler/targets/gf180_demo.py +77 -0
- siliconcompiler/targets/skywater130_demo.py +70 -0
- siliconcompiler/templates/email/general.j2 +66 -0
- siliconcompiler/templates/email/summary.j2 +43 -0
- siliconcompiler/templates/issue/README.txt +26 -0
- siliconcompiler/templates/issue/run.sh +6 -0
- siliconcompiler/templates/report/bootstrap.min.css +7 -0
- siliconcompiler/templates/report/bootstrap.min.js +7 -0
- siliconcompiler/templates/report/bootstrap_LICENSE.md +24 -0
- siliconcompiler/templates/report/sc_report.j2 +427 -0
- siliconcompiler/templates/slurm/run.sh +9 -0
- siliconcompiler/templates/tcl/manifest.tcl.j2 +137 -0
- siliconcompiler/tools/__init__.py +0 -0
- siliconcompiler/tools/_common/__init__.py +432 -0
- siliconcompiler/tools/_common/asic.py +115 -0
- siliconcompiler/tools/_common/sdc/sc_constraints.sdc +76 -0
- siliconcompiler/tools/_common/tcl/sc_pin_constraints.tcl +63 -0
- siliconcompiler/tools/bambu/bambu.py +32 -0
- siliconcompiler/tools/bambu/convert.py +77 -0
- siliconcompiler/tools/bluespec/bluespec.py +40 -0
- siliconcompiler/tools/bluespec/convert.py +103 -0
- siliconcompiler/tools/builtin/_common.py +155 -0
- siliconcompiler/tools/builtin/builtin.py +26 -0
- siliconcompiler/tools/builtin/concatenate.py +85 -0
- siliconcompiler/tools/builtin/join.py +27 -0
- siliconcompiler/tools/builtin/maximum.py +46 -0
- siliconcompiler/tools/builtin/minimum.py +57 -0
- siliconcompiler/tools/builtin/mux.py +70 -0
- siliconcompiler/tools/builtin/nop.py +38 -0
- siliconcompiler/tools/builtin/verify.py +83 -0
- siliconcompiler/tools/chisel/SCDriver.scala +10 -0
- siliconcompiler/tools/chisel/build.sbt +27 -0
- siliconcompiler/tools/chisel/chisel.py +37 -0
- siliconcompiler/tools/chisel/convert.py +140 -0
- siliconcompiler/tools/execute/exec_input.py +41 -0
- siliconcompiler/tools/execute/execute.py +17 -0
- siliconcompiler/tools/genfasm/bitstream.py +61 -0
- siliconcompiler/tools/genfasm/genfasm.py +40 -0
- siliconcompiler/tools/ghdl/convert.py +87 -0
- siliconcompiler/tools/ghdl/ghdl.py +41 -0
- siliconcompiler/tools/icarus/compile.py +87 -0
- siliconcompiler/tools/icarus/icarus.py +36 -0
- siliconcompiler/tools/icepack/bitstream.py +20 -0
- siliconcompiler/tools/icepack/icepack.py +43 -0
- siliconcompiler/tools/klayout/export.py +117 -0
- siliconcompiler/tools/klayout/klayout.py +119 -0
- siliconcompiler/tools/klayout/klayout_export.py +205 -0
- siliconcompiler/tools/klayout/klayout_operations.py +363 -0
- siliconcompiler/tools/klayout/klayout_show.py +242 -0
- siliconcompiler/tools/klayout/klayout_utils.py +176 -0
- siliconcompiler/tools/klayout/operations.py +194 -0
- siliconcompiler/tools/klayout/screenshot.py +98 -0
- siliconcompiler/tools/klayout/show.py +101 -0
- siliconcompiler/tools/magic/drc.py +49 -0
- siliconcompiler/tools/magic/extspice.py +19 -0
- siliconcompiler/tools/magic/magic.py +85 -0
- siliconcompiler/tools/magic/sc_drc.tcl +96 -0
- siliconcompiler/tools/magic/sc_extspice.tcl +54 -0
- siliconcompiler/tools/magic/sc_magic.tcl +47 -0
- siliconcompiler/tools/montage/montage.py +30 -0
- siliconcompiler/tools/montage/tile.py +66 -0
- siliconcompiler/tools/netgen/count_lvs.py +132 -0
- siliconcompiler/tools/netgen/lvs.py +90 -0
- siliconcompiler/tools/netgen/netgen.py +36 -0
- siliconcompiler/tools/netgen/sc_lvs.tcl +46 -0
- siliconcompiler/tools/nextpnr/apr.py +24 -0
- siliconcompiler/tools/nextpnr/nextpnr.py +59 -0
- siliconcompiler/tools/openfpgaloader/openfpgaloader.py +39 -0
- siliconcompiler/tools/openroad/__init__.py +0 -0
- siliconcompiler/tools/openroad/cts.py +45 -0
- siliconcompiler/tools/openroad/dfm.py +66 -0
- siliconcompiler/tools/openroad/export.py +131 -0
- siliconcompiler/tools/openroad/floorplan.py +70 -0
- siliconcompiler/tools/openroad/openroad.py +977 -0
- siliconcompiler/tools/openroad/physyn.py +27 -0
- siliconcompiler/tools/openroad/place.py +41 -0
- siliconcompiler/tools/openroad/rcx_bench.py +95 -0
- siliconcompiler/tools/openroad/rcx_extract.py +34 -0
- siliconcompiler/tools/openroad/route.py +45 -0
- siliconcompiler/tools/openroad/screenshot.py +60 -0
- siliconcompiler/tools/openroad/scripts/sc_apr.tcl +499 -0
- siliconcompiler/tools/openroad/scripts/sc_cts.tcl +64 -0
- siliconcompiler/tools/openroad/scripts/sc_dfm.tcl +20 -0
- siliconcompiler/tools/openroad/scripts/sc_export.tcl +98 -0
- siliconcompiler/tools/openroad/scripts/sc_floorplan.tcl +413 -0
- siliconcompiler/tools/openroad/scripts/sc_metrics.tcl +158 -0
- siliconcompiler/tools/openroad/scripts/sc_physyn.tcl +7 -0
- siliconcompiler/tools/openroad/scripts/sc_place.tcl +84 -0
- siliconcompiler/tools/openroad/scripts/sc_procs.tcl +423 -0
- siliconcompiler/tools/openroad/scripts/sc_rcx.tcl +63 -0
- siliconcompiler/tools/openroad/scripts/sc_rcx_bench.tcl +20 -0
- siliconcompiler/tools/openroad/scripts/sc_rcx_extract.tcl +12 -0
- siliconcompiler/tools/openroad/scripts/sc_route.tcl +133 -0
- siliconcompiler/tools/openroad/scripts/sc_screenshot.tcl +21 -0
- siliconcompiler/tools/openroad/scripts/sc_write.tcl +5 -0
- siliconcompiler/tools/openroad/scripts/sc_write_images.tcl +361 -0
- siliconcompiler/tools/openroad/show.py +94 -0
- siliconcompiler/tools/openroad/templates/pex.tcl +8 -0
- siliconcompiler/tools/opensta/__init__.py +101 -0
- siliconcompiler/tools/opensta/report_libraries.py +28 -0
- siliconcompiler/tools/opensta/scripts/sc_procs.tcl +47 -0
- siliconcompiler/tools/opensta/scripts/sc_report_libraries.tcl +74 -0
- siliconcompiler/tools/opensta/scripts/sc_timing.tcl +268 -0
- siliconcompiler/tools/opensta/timing.py +214 -0
- siliconcompiler/tools/slang/__init__.py +49 -0
- siliconcompiler/tools/slang/lint.py +101 -0
- siliconcompiler/tools/surelog/__init__.py +123 -0
- siliconcompiler/tools/surelog/parse.py +183 -0
- siliconcompiler/tools/surelog/templates/output.v +7 -0
- siliconcompiler/tools/sv2v/convert.py +46 -0
- siliconcompiler/tools/sv2v/sv2v.py +37 -0
- siliconcompiler/tools/template/template.py +125 -0
- siliconcompiler/tools/verilator/compile.py +139 -0
- siliconcompiler/tools/verilator/lint.py +19 -0
- siliconcompiler/tools/verilator/parse.py +27 -0
- siliconcompiler/tools/verilator/verilator.py +172 -0
- siliconcompiler/tools/vivado/__init__.py +7 -0
- siliconcompiler/tools/vivado/bitstream.py +21 -0
- siliconcompiler/tools/vivado/place.py +21 -0
- siliconcompiler/tools/vivado/route.py +21 -0
- siliconcompiler/tools/vivado/scripts/sc_bitstream.tcl +6 -0
- siliconcompiler/tools/vivado/scripts/sc_place.tcl +2 -0
- siliconcompiler/tools/vivado/scripts/sc_route.tcl +4 -0
- siliconcompiler/tools/vivado/scripts/sc_run.tcl +45 -0
- siliconcompiler/tools/vivado/scripts/sc_syn_fpga.tcl +25 -0
- siliconcompiler/tools/vivado/syn_fpga.py +20 -0
- siliconcompiler/tools/vivado/vivado.py +147 -0
- siliconcompiler/tools/vpr/_json_constraint.py +63 -0
- siliconcompiler/tools/vpr/_xml_constraint.py +109 -0
- siliconcompiler/tools/vpr/place.py +137 -0
- siliconcompiler/tools/vpr/route.py +124 -0
- siliconcompiler/tools/vpr/screenshot.py +54 -0
- siliconcompiler/tools/vpr/show.py +88 -0
- siliconcompiler/tools/vpr/vpr.py +357 -0
- siliconcompiler/tools/xyce/xyce.py +36 -0
- siliconcompiler/tools/yosys/lec.py +56 -0
- siliconcompiler/tools/yosys/prepareLib.py +59 -0
- siliconcompiler/tools/yosys/sc_lec.tcl +84 -0
- siliconcompiler/tools/yosys/sc_syn.tcl +79 -0
- siliconcompiler/tools/yosys/syn_asic.py +565 -0
- siliconcompiler/tools/yosys/syn_asic.tcl +377 -0
- siliconcompiler/tools/yosys/syn_asic_fpga_shared.tcl +31 -0
- siliconcompiler/tools/yosys/syn_fpga.py +146 -0
- siliconcompiler/tools/yosys/syn_fpga.tcl +233 -0
- siliconcompiler/tools/yosys/syn_strategies.tcl +81 -0
- siliconcompiler/tools/yosys/techmaps/lcu_kogge_stone.v +39 -0
- siliconcompiler/tools/yosys/templates/abc.const +2 -0
- siliconcompiler/tools/yosys/yosys.py +147 -0
- siliconcompiler/units.py +259 -0
- siliconcompiler/use.py +177 -0
- siliconcompiler/utils/__init__.py +423 -0
- siliconcompiler/utils/asic.py +158 -0
- siliconcompiler/utils/showtools.py +25 -0
- siliconcompiler-0.26.5.dist-info/LICENSE +190 -0
- siliconcompiler-0.26.5.dist-info/METADATA +195 -0
- siliconcompiler-0.26.5.dist-info/RECORD +251 -0
- siliconcompiler-0.26.5.dist-info/WHEEL +5 -0
- siliconcompiler-0.26.5.dist-info/entry_points.txt +12 -0
- 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)
|