siliconcompiler 0.28.8__py3-none-any.whl → 0.29.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- siliconcompiler/_metadata.py +1 -1
- siliconcompiler/apps/sc_remote.py +15 -14
- siliconcompiler/apps/sc_show.py +5 -5
- siliconcompiler/apps/utils/replay.py +136 -0
- siliconcompiler/core.py +14 -12
- siliconcompiler/flows/_common.py +11 -13
- siliconcompiler/flows/asicflow.py +83 -42
- siliconcompiler/remote/__init__.py +11 -0
- siliconcompiler/remote/client.py +753 -815
- siliconcompiler/report/report.py +2 -0
- siliconcompiler/report/summary_table.py +1 -1
- siliconcompiler/scheduler/__init__.py +51 -9
- siliconcompiler/scheduler/send_messages.py +37 -33
- siliconcompiler/scheduler/validation/email_credentials.json +7 -0
- siliconcompiler/schema/schema_cfg.py +15 -3
- siliconcompiler/schema/schema_obj.py +16 -0
- siliconcompiler/sphinx_ext/dynamicgen.py +4 -3
- siliconcompiler/targets/fpgaflow_demo.py +6 -7
- siliconcompiler/targets/gf180_demo.py +3 -3
- siliconcompiler/templates/replay/requirements.txt +6 -0
- siliconcompiler/templates/replay/run.py.j2 +22 -0
- siliconcompiler/templates/replay/setup.sh +17 -0
- siliconcompiler/tools/_common/__init__.py +17 -3
- siliconcompiler/tools/_common/asic.py +10 -3
- siliconcompiler/tools/builtin/concatenate.py +1 -1
- siliconcompiler/tools/openroad/__init__.py +103 -0
- siliconcompiler/tools/openroad/{openroad.py → _apr.py} +413 -422
- siliconcompiler/tools/openroad/antenna_repair.py +78 -0
- siliconcompiler/tools/openroad/clock_tree_synthesis.py +64 -0
- siliconcompiler/tools/openroad/detailed_placement.py +59 -0
- siliconcompiler/tools/openroad/detailed_route.py +62 -0
- siliconcompiler/tools/openroad/endcap_tapcell_insertion.py +52 -0
- siliconcompiler/tools/openroad/fillercell_insertion.py +58 -0
- siliconcompiler/tools/openroad/{dfm.py → fillmetal_insertion.py} +35 -19
- siliconcompiler/tools/openroad/global_placement.py +58 -0
- siliconcompiler/tools/openroad/global_route.py +63 -0
- siliconcompiler/tools/openroad/init_floorplan.py +103 -0
- siliconcompiler/tools/openroad/macro_placement.py +65 -0
- siliconcompiler/tools/openroad/metrics.py +23 -8
- siliconcompiler/tools/openroad/pin_placement.py +56 -0
- siliconcompiler/tools/openroad/power_grid.py +65 -0
- siliconcompiler/tools/openroad/rcx_bench.py +7 -4
- siliconcompiler/tools/openroad/rcx_extract.py +2 -1
- siliconcompiler/tools/openroad/rdlroute.py +4 -4
- siliconcompiler/tools/openroad/repair_design.py +59 -0
- siliconcompiler/tools/openroad/repair_timing.py +63 -0
- siliconcompiler/tools/openroad/screenshot.py +9 -20
- siliconcompiler/tools/openroad/scripts/apr/postamble.tcl +44 -0
- siliconcompiler/tools/openroad/scripts/apr/preamble.tcl +95 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_antenna_repair.tcl +51 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_clock_tree_synthesis.tcl +62 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_detailed_placement.tcl +41 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_detailed_route.tcl +71 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_endcap_tapcell_insertion.tcl +55 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_fillercell_insertion.tcl +27 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_fillmetal_insertion.tcl +36 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_global_placement.tcl +26 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_global_route.tcl +61 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_init_floorplan.tcl +333 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_macro_placement.tcl +123 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_metrics.tcl +22 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_pin_placement.tcl +41 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_power_grid.tcl +60 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_repair_design.tcl +68 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_repair_timing.tcl +83 -0
- siliconcompiler/tools/openroad/scripts/apr/sc_write_data.tcl +125 -0
- siliconcompiler/tools/openroad/scripts/common/debugging.tcl +28 -0
- siliconcompiler/tools/openroad/scripts/common/procs.tcl +675 -0
- siliconcompiler/tools/openroad/scripts/common/read_input_files.tcl +59 -0
- siliconcompiler/tools/openroad/scripts/common/read_liberty.tcl +20 -0
- siliconcompiler/tools/openroad/scripts/common/read_timing_constraints.tcl +16 -0
- siliconcompiler/tools/openroad/scripts/common/reports.tcl +180 -0
- siliconcompiler/tools/openroad/scripts/common/screenshot.tcl +18 -0
- siliconcompiler/tools/openroad/scripts/common/write_images.tcl +395 -0
- siliconcompiler/tools/openroad/scripts/{sc_rcx_bench.tcl → rcx/sc_rcx_bench.tcl} +5 -5
- siliconcompiler/tools/openroad/scripts/{sc_rcx_extract.tcl → rcx/sc_rcx_extract.tcl} +0 -0
- siliconcompiler/tools/openroad/scripts/sc_rcx.tcl +5 -16
- siliconcompiler/tools/openroad/scripts/sc_rdlroute.tcl +51 -51
- siliconcompiler/tools/openroad/scripts/sc_show.tcl +105 -0
- siliconcompiler/tools/openroad/show.py +28 -23
- siliconcompiler/tools/openroad/{export.py → write_data.py} +31 -26
- siliconcompiler/tools/opensta/__init__.py +1 -1
- siliconcompiler/tools/vivado/bitstream.py +8 -2
- siliconcompiler/tools/vivado/place.py +6 -2
- siliconcompiler/tools/vivado/route.py +6 -2
- siliconcompiler/tools/vivado/scripts/sc_bitstream.tcl +1 -1
- siliconcompiler/tools/vivado/scripts/sc_place.tcl +1 -1
- siliconcompiler/tools/vivado/scripts/sc_route.tcl +1 -1
- siliconcompiler/tools/vivado/scripts/sc_run.tcl +4 -2
- siliconcompiler/tools/vivado/syn_fpga.py +5 -1
- siliconcompiler/tools/vivado/vivado.py +26 -10
- siliconcompiler/tools/vpr/vpr.py +5 -0
- siliconcompiler/tools/yosys/syn_asic.py +7 -0
- siliconcompiler/tools/yosys/syn_asic.tcl +27 -6
- siliconcompiler/tools/yosys/syn_fpga.tcl +26 -18
- siliconcompiler/toolscripts/_tools.json +5 -5
- {siliconcompiler-0.28.8.dist-info → siliconcompiler-0.29.0.dist-info}/METADATA +50 -48
- {siliconcompiler-0.28.8.dist-info → siliconcompiler-0.29.0.dist-info}/RECORD +103 -76
- {siliconcompiler-0.28.8.dist-info → siliconcompiler-0.29.0.dist-info}/WHEEL +1 -1
- siliconcompiler/tools/openroad/cts.py +0 -45
- siliconcompiler/tools/openroad/floorplan.py +0 -75
- siliconcompiler/tools/openroad/physyn.py +0 -27
- siliconcompiler/tools/openroad/place.py +0 -41
- siliconcompiler/tools/openroad/route.py +0 -45
- siliconcompiler/tools/openroad/scripts/__init__.py +0 -0
- siliconcompiler/tools/openroad/scripts/sc_apr.tcl +0 -514
- siliconcompiler/tools/openroad/scripts/sc_cts.tcl +0 -68
- siliconcompiler/tools/openroad/scripts/sc_dfm.tcl +0 -22
- siliconcompiler/tools/openroad/scripts/sc_export.tcl +0 -100
- siliconcompiler/tools/openroad/scripts/sc_floorplan.tcl +0 -456
- siliconcompiler/tools/openroad/scripts/sc_metrics.tcl +0 -1
- siliconcompiler/tools/openroad/scripts/sc_physyn.tcl +0 -6
- siliconcompiler/tools/openroad/scripts/sc_place.tcl +0 -84
- siliconcompiler/tools/openroad/scripts/sc_procs.tcl +0 -494
- siliconcompiler/tools/openroad/scripts/sc_report.tcl +0 -189
- siliconcompiler/tools/openroad/scripts/sc_route.tcl +0 -143
- siliconcompiler/tools/openroad/scripts/sc_screenshot.tcl +0 -18
- siliconcompiler/tools/openroad/scripts/sc_write_images.tcl +0 -393
- /siliconcompiler/tools/openroad/scripts/{sc_write.tcl → common/write_data.tcl} +0 -0
- {siliconcompiler-0.28.8.dist-info → siliconcompiler-0.29.0.dist-info}/LICENSE +0 -0
- {siliconcompiler-0.28.8.dist-info → siliconcompiler-0.29.0.dist-info}/entry_points.txt +0 -0
- {siliconcompiler-0.28.8.dist-info → siliconcompiler-0.29.0.dist-info}/top_level.txt +0 -0
|
@@ -1,514 +0,0 @@
|
|
|
1
|
-
###############################
|
|
2
|
-
# Reading SC Schema
|
|
3
|
-
###############################
|
|
4
|
-
|
|
5
|
-
source ./sc_manifest.tcl > /dev/null
|
|
6
|
-
|
|
7
|
-
##############################
|
|
8
|
-
# Schema Helper functions
|
|
9
|
-
###############################
|
|
10
|
-
|
|
11
|
-
proc sc_get_layer_name { name } {
|
|
12
|
-
if { [llength $name] > 1 } {
|
|
13
|
-
set layers []
|
|
14
|
-
foreach l $name {
|
|
15
|
-
lappend layers [sc_get_layer_name $l]
|
|
16
|
-
}
|
|
17
|
-
return $layers
|
|
18
|
-
}
|
|
19
|
-
if { [string length $name] == 0 } {
|
|
20
|
-
return ""
|
|
21
|
-
}
|
|
22
|
-
if { [string is integer $name] } {
|
|
23
|
-
set layer [[ord::get_db_tech] findRoutingLayer $name]
|
|
24
|
-
if { $layer == "NULL" } {
|
|
25
|
-
utl::error FLW 1 "$name is not a valid routing layer."
|
|
26
|
-
}
|
|
27
|
-
return [$layer getName]
|
|
28
|
-
}
|
|
29
|
-
return $name
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
proc has_tie_cell { type } {
|
|
33
|
-
upvar sc_cfg sc_cfg
|
|
34
|
-
upvar sc_mainlib sc_mainlib
|
|
35
|
-
upvar sc_tool sc_tool
|
|
36
|
-
|
|
37
|
-
set library_vars [sc_cfg_get library $sc_mainlib option {var}]
|
|
38
|
-
return [expr {
|
|
39
|
-
[dict exists $library_vars openroad_tie${type}_cell] &&
|
|
40
|
-
[dict exists $library_vars openroad_tie${type}_port]
|
|
41
|
-
}]
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
proc get_tie_cell { type } {
|
|
45
|
-
upvar sc_cfg sc_cfg
|
|
46
|
-
upvar sc_mainlib sc_mainlib
|
|
47
|
-
upvar sc_tool sc_tool
|
|
48
|
-
|
|
49
|
-
set cell [lindex [sc_cfg_get library $sc_mainlib option {var} openroad_tie${type}_cell] 0]
|
|
50
|
-
set port [lindex [sc_cfg_get library $sc_mainlib option {var} openroad_tie${type}_port] 0]
|
|
51
|
-
|
|
52
|
-
return "$cell/$port"
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
##############################
|
|
56
|
-
# Schema Adapter
|
|
57
|
-
###############################
|
|
58
|
-
|
|
59
|
-
set sc_tool openroad
|
|
60
|
-
set sc_step [sc_cfg_get arg step]
|
|
61
|
-
set sc_index [sc_cfg_get arg index]
|
|
62
|
-
set sc_flow [sc_cfg_get option flow]
|
|
63
|
-
set sc_task [sc_cfg_get flowgraph $sc_flow $sc_step $sc_index task]
|
|
64
|
-
|
|
65
|
-
set sc_refdir [sc_cfg_tool_task_get refdir]
|
|
66
|
-
|
|
67
|
-
# Design
|
|
68
|
-
set sc_design [sc_top]
|
|
69
|
-
set sc_optmode [sc_cfg_get option optmode]
|
|
70
|
-
set sc_pdk [sc_cfg_get option pdk]
|
|
71
|
-
set sc_stackup [sc_cfg_get option stackup]
|
|
72
|
-
|
|
73
|
-
# APR Parameters
|
|
74
|
-
set sc_targetlibs [sc_get_asic_libraries logic]
|
|
75
|
-
set sc_mainlib [lindex $sc_targetlibs 0]
|
|
76
|
-
set sc_delaymodel [sc_cfg_get asic delaymodel]
|
|
77
|
-
set sc_pdk_vars [sc_cfg_get pdk $sc_pdk {var} $sc_tool]
|
|
78
|
-
set sc_hpinmetal [dict get $sc_pdk_vars pin_layer_horizontal $sc_stackup]
|
|
79
|
-
set sc_vpinmetal [dict get $sc_pdk_vars pin_layer_vertical $sc_stackup]
|
|
80
|
-
set sc_rc_signal [lindex [dict get $sc_pdk_vars rclayer_signal $sc_stackup] 0]
|
|
81
|
-
set sc_rc_clk [lindex [dict get $sc_pdk_vars rclayer_clock $sc_stackup] 0]
|
|
82
|
-
set sc_minmetal [sc_cfg_get pdk $sc_pdk minlayer $sc_stackup]
|
|
83
|
-
set sc_maxmetal [sc_cfg_get pdk $sc_pdk maxlayer $sc_stackup]
|
|
84
|
-
set sc_aspectratio [sc_cfg_get constraint aspectratio]
|
|
85
|
-
set sc_density [sc_cfg_get constraint density]
|
|
86
|
-
set sc_scenarios [dict keys [sc_cfg_get constraint timing]]
|
|
87
|
-
|
|
88
|
-
# Library
|
|
89
|
-
set sc_libtype [sc_cfg_get library $sc_mainlib asic libarch]
|
|
90
|
-
# TODO: handle multiple sites properly
|
|
91
|
-
set sc_site [lindex [sc_cfg_get library $sc_mainlib asic site $sc_libtype] 0]
|
|
92
|
-
set sc_filler [sc_cfg_get library $sc_mainlib asic cells filler]
|
|
93
|
-
set sc_dontuse [sc_cfg_get library $sc_mainlib asic cells dontuse]
|
|
94
|
-
set sc_clkbuf [lindex [sc_cfg_tool_task_get {var} cts_clock_buffer] 0]
|
|
95
|
-
set sc_filler [sc_cfg_get library $sc_mainlib asic cells filler]
|
|
96
|
-
set sc_tap [sc_cfg_get library $sc_mainlib asic cells tap]
|
|
97
|
-
set sc_endcap [sc_cfg_get library $sc_mainlib asic cells endcap]
|
|
98
|
-
set sc_pex_corners [sc_cfg_tool_task_get {var} pex_corners]
|
|
99
|
-
set sc_power_corner [lindex [sc_cfg_tool_task_get {var} power_corner] 0]
|
|
100
|
-
|
|
101
|
-
# PDK Design Rules
|
|
102
|
-
set sc_techlef [sc_cfg_get pdk $sc_pdk aprtech openroad $sc_stackup $sc_libtype lef]
|
|
103
|
-
|
|
104
|
-
if { [sc_cfg_exists datasheet $sc_design] } {
|
|
105
|
-
set sc_pins [dict keys [sc_cfg_get datasheet $sc_design pin]]
|
|
106
|
-
} else {
|
|
107
|
-
set sc_pins [list]
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
set sc_threads [sc_cfg_tool_task_get threads]
|
|
111
|
-
|
|
112
|
-
set openroad_dont_touch {}
|
|
113
|
-
if { [sc_cfg_tool_task_exists {var} dont_touch] } {
|
|
114
|
-
set openroad_dont_touch [sc_cfg_tool_task_get {var} dont_touch]
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
###############################
|
|
118
|
-
# Optional
|
|
119
|
-
###############################
|
|
120
|
-
|
|
121
|
-
# MACROS
|
|
122
|
-
set sc_macrolibs [sc_get_asic_libraries macro]
|
|
123
|
-
|
|
124
|
-
###############################
|
|
125
|
-
# Setup debugging if requested
|
|
126
|
-
###############################
|
|
127
|
-
|
|
128
|
-
if { [llength [sc_cfg_tool_task_get {var} debug_level]] > 0 } {
|
|
129
|
-
foreach debug [sc_cfg_tool_task_get {var} debug_level] {
|
|
130
|
-
set debug_setting [split $debug " "]
|
|
131
|
-
set debug_tool [lindex $debug_setting 0]
|
|
132
|
-
set debug_category [lindex $debug_setting 1]
|
|
133
|
-
set debug_level [lindex $debug_setting 2]
|
|
134
|
-
utl::info FLW 1 "Setting debugging for $debug_tool/$debug_category/$debug_level"
|
|
135
|
-
set_debug_level $debug_tool $debug_category $debug_level
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
###############################
|
|
140
|
-
# Suppress messages if requested
|
|
141
|
-
###############################
|
|
142
|
-
|
|
143
|
-
foreach msg [sc_cfg_tool_task_get warningoff] {
|
|
144
|
-
set or_msg [split $msg "-"]
|
|
145
|
-
if { [llength $or_msg] != 2 } {
|
|
146
|
-
utl::warn FLW 1 "$msg is not a valid message id"
|
|
147
|
-
} else {
|
|
148
|
-
set or_tool [lindex $or_msg 0]
|
|
149
|
-
set or_msg_id [expr { int([lindex $or_msg 1]) }]
|
|
150
|
-
utl::info FLW 1 "Suppressing $msg messages"
|
|
151
|
-
suppress_message $or_tool $or_msg_id
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
###############################
|
|
156
|
-
# Source helper functions
|
|
157
|
-
###############################
|
|
158
|
-
|
|
159
|
-
source "$sc_refdir/sc_procs.tcl"
|
|
160
|
-
|
|
161
|
-
###############################
|
|
162
|
-
# Read Files
|
|
163
|
-
###############################
|
|
164
|
-
|
|
165
|
-
# Read Liberty
|
|
166
|
-
utl::info FLW 1 "Defining timing corners: $sc_scenarios"
|
|
167
|
-
define_corners {*}$sc_scenarios
|
|
168
|
-
foreach lib "$sc_targetlibs $sc_macrolibs" {
|
|
169
|
-
#Liberty
|
|
170
|
-
foreach corner $sc_scenarios {
|
|
171
|
-
foreach libcorner [sc_cfg_get constraint timing $corner libcorner] {
|
|
172
|
-
if { [sc_cfg_exists library $lib output $libcorner $sc_delaymodel] } {
|
|
173
|
-
foreach lib_file [sc_cfg_get library $lib output $libcorner $sc_delaymodel] {
|
|
174
|
-
puts "Reading liberty file for ${corner} ($libcorner): ${lib_file}"
|
|
175
|
-
read_liberty -corner $corner $lib_file
|
|
176
|
-
}
|
|
177
|
-
break
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
if { [file exists "inputs/$sc_design.odb"] } {
|
|
184
|
-
# read ODB
|
|
185
|
-
set odb_file "inputs/$sc_design.odb"
|
|
186
|
-
puts "Reading ODB: ${odb_file}"
|
|
187
|
-
read_db $odb_file
|
|
188
|
-
} else {
|
|
189
|
-
# Read techlef
|
|
190
|
-
puts "Reading techlef: ${sc_techlef}"
|
|
191
|
-
read_lef $sc_techlef
|
|
192
|
-
|
|
193
|
-
# Read Lefs
|
|
194
|
-
foreach lib "$sc_targetlibs $sc_macrolibs" {
|
|
195
|
-
foreach lef_file [sc_cfg_get library $lib output $sc_stackup lef] {
|
|
196
|
-
puts "Reading lef: ${lef_file}"
|
|
197
|
-
read_lef $lef_file
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
if { [file exists "inputs/${sc_design}.def"] } {
|
|
202
|
-
# Read DEF
|
|
203
|
-
# get from previous step
|
|
204
|
-
puts "Reading DEF: inputs/${sc_design}.def"
|
|
205
|
-
read_def "inputs/${sc_design}.def"
|
|
206
|
-
} elseif { [sc_cfg_exists input layout def] } {
|
|
207
|
-
# Read DEF
|
|
208
|
-
set sc_def [lindex [sc_cfg_get input layout def] 0]
|
|
209
|
-
puts "Reading DEF: ${sc_def}"
|
|
210
|
-
read_def $sc_def
|
|
211
|
-
} elseif { [file exists "inputs/${sc_design}.vg"] } {
|
|
212
|
-
# Read Verilog
|
|
213
|
-
puts "Reading netlist verilog: inputs/${sc_design}.vg"
|
|
214
|
-
read_verilog "inputs/${sc_design}.vg"
|
|
215
|
-
link_design $sc_design
|
|
216
|
-
} else {
|
|
217
|
-
# Read Verilog
|
|
218
|
-
foreach netlist [sc_cfg_get input netlist verilog] {
|
|
219
|
-
puts "Reading netlist verilog: ${netlist}"
|
|
220
|
-
read_verilog $netlist
|
|
221
|
-
}
|
|
222
|
-
link_design $sc_design
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
# Read SDC (in order of priority)
|
|
227
|
-
# TODO: add logic for reading from ['constraint', ...] once we support MCMM
|
|
228
|
-
if { [file exists "inputs/${sc_design}.sdc"] } {
|
|
229
|
-
# get from previous step
|
|
230
|
-
puts "Reading SDC: inputs/${sc_design}.sdc"
|
|
231
|
-
read_sdc "inputs/${sc_design}.sdc"
|
|
232
|
-
} elseif { [sc_cfg_exists input constraint sdc] } {
|
|
233
|
-
foreach sdc [sc_cfg_get input constraint sdc] {
|
|
234
|
-
# read step constraint if exists
|
|
235
|
-
puts "Reading SDC: ${sdc}"
|
|
236
|
-
read_sdc $sdc
|
|
237
|
-
}
|
|
238
|
-
} else {
|
|
239
|
-
# fall back on default auto generated constraints file
|
|
240
|
-
set sdc "[sc_cfg_tool_task_get file opensta_generic_sdc]"
|
|
241
|
-
puts "Reading SDC: ${sdc}"
|
|
242
|
-
utl::warn FLW 1 "Defaulting back to default SDC"
|
|
243
|
-
read_sdc "${sdc}"
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
###############################
|
|
247
|
-
# Common Setup
|
|
248
|
-
###############################
|
|
249
|
-
|
|
250
|
-
set openroad_task_vars [sc_cfg_tool_task_get {var}]
|
|
251
|
-
|
|
252
|
-
# Sweep parameters
|
|
253
|
-
set openroad_ifp_tie_separation [lindex [dict get $openroad_task_vars ifp_tie_separation] 0]
|
|
254
|
-
|
|
255
|
-
set openroad_pdn_enable [lindex [dict get $openroad_task_vars pdn_enable] 0]
|
|
256
|
-
|
|
257
|
-
set openroad_psm_enable [lindex [dict get $openroad_task_vars psm_enable] 0]
|
|
258
|
-
set openroad_psm_skip_nets [dict get $openroad_task_vars psm_skip_nets]
|
|
259
|
-
|
|
260
|
-
set openroad_mpl_macro_place_halo [dict get $openroad_task_vars macro_place_halo]
|
|
261
|
-
set openroad_mpl_macro_place_channel [dict get $openroad_task_vars macro_place_channel]
|
|
262
|
-
|
|
263
|
-
set openroad_ppl_arguments [dict get $openroad_task_vars ppl_arguments]
|
|
264
|
-
|
|
265
|
-
set openroad_rtlmp_enable [lindex [dict get $openroad_task_vars rtlmp_enable] 0]
|
|
266
|
-
set openroad_rtlmp_max_levels [lindex [dict get $openroad_task_vars rtlmp_max_levels] 0]
|
|
267
|
-
set openroad_rtlmp_min_instances [lindex [dict get $openroad_task_vars rtlmp_min_instances] 0]
|
|
268
|
-
set openroad_rtlmp_max_instances [lindex [dict get $openroad_task_vars rtlmp_max_instances] 0]
|
|
269
|
-
set openroad_rtlmp_min_macros [lindex [dict get $openroad_task_vars rtlmp_min_macros] 0]
|
|
270
|
-
set openroad_rtlmp_max_macros [lindex [dict get $openroad_task_vars rtlmp_max_macros] 0]
|
|
271
|
-
set openroad_rtlmp_min_aspect_ratio [lindex [dict get $openroad_task_vars rtlmp_min_aspect_ratio] 0]
|
|
272
|
-
set openroad_rtlmp_fence [dict get $openroad_task_vars rtlmp_fence]
|
|
273
|
-
set openroad_rtlmp_bus_planning [lindex [dict get $openroad_task_vars rtlmp_bus_planning] 0]
|
|
274
|
-
set openroad_rtlmp_target_dead_space \
|
|
275
|
-
[lindex [dict get $openroad_task_vars rtlmp_target_dead_space] 0]
|
|
276
|
-
set openroad_rtlmp_area_weight [lindex [dict get $openroad_task_vars rtlmp_area_weight] 0]
|
|
277
|
-
set openroad_rtlmp_outline_weight [lindex [dict get $openroad_task_vars rtlmp_outline_weight] 0]
|
|
278
|
-
set openroad_rtlmp_wirelength_weight \
|
|
279
|
-
[lindex [dict get $openroad_task_vars rtlmp_wirelength_weight] 0]
|
|
280
|
-
set openroad_rtlmp_guidance_weight [lindex [dict get $openroad_task_vars rtlmp_guidance_weight] 0]
|
|
281
|
-
set openroad_rtlmp_fence_weight [lindex [dict get $openroad_task_vars rtlmp_fence_weight] 0]
|
|
282
|
-
set openroad_rtlmp_notch_weight [lindex [dict get $openroad_task_vars rtlmp_notch_weight] 0]
|
|
283
|
-
set openroad_rtlmp_blockage_weight [lindex [dict get $openroad_task_vars rtlmp_blockage_weight] 0]
|
|
284
|
-
|
|
285
|
-
set openroad_gpl_place_density [lindex [dict get $openroad_task_vars place_density] 0]
|
|
286
|
-
set openroad_gpl_padding [lindex [dict get $openroad_task_vars pad_global_place] 0]
|
|
287
|
-
set openroad_gpl_routability_driven [lindex [dict get $openroad_task_vars gpl_routability_driven] 0]
|
|
288
|
-
set openroad_gpl_timing_driven [lindex [dict get $openroad_task_vars gpl_timing_driven] 0]
|
|
289
|
-
set openroad_gpl_uniform_placement_adjustment \
|
|
290
|
-
[lindex [dict get $openroad_task_vars gpl_uniform_placement_adjustment] 0]
|
|
291
|
-
set openroad_gpl_enable_skip_io [lindex [dict get $openroad_task_vars gpl_enable_skip_io] 0]
|
|
292
|
-
|
|
293
|
-
set openroad_dpo_enable [lindex [dict get $openroad_task_vars dpo_enable] 0]
|
|
294
|
-
set openroad_dpo_max_displacement [lindex [dict get $openroad_task_vars dpo_max_displacement] 0]
|
|
295
|
-
|
|
296
|
-
set openroad_dpl_max_displacement [lindex [dict get $openroad_task_vars dpl_max_displacement] 0]
|
|
297
|
-
set openroad_dpl_disallow_one_site [lindex [dict get $openroad_task_vars dpl_disallow_one_site] 0]
|
|
298
|
-
set openroad_dpl_padding [lindex [dict get $openroad_task_vars pad_detail_place] 0]
|
|
299
|
-
|
|
300
|
-
set openroad_cts_distance_between_buffers \
|
|
301
|
-
[lindex [dict get $openroad_task_vars cts_distance_between_buffers] 0]
|
|
302
|
-
set openroad_cts_cluster_diameter [lindex [dict get $openroad_task_vars cts_cluster_diameter] 0]
|
|
303
|
-
set openroad_cts_cluster_size [lindex [dict get $openroad_task_vars cts_cluster_size] 0]
|
|
304
|
-
set openroad_cts_balance_levels [lindex [dict get $openroad_task_vars cts_balance_levels] 0]
|
|
305
|
-
set openroad_cts_obstruction_aware [lindex [dict get $openroad_task_vars cts_obstruction_aware] 0]
|
|
306
|
-
|
|
307
|
-
set openroad_ant_iterations [lindex [dict get $openroad_task_vars ant_iterations] 0]
|
|
308
|
-
set openroad_ant_margin [lindex [dict get $openroad_task_vars ant_margin] 0]
|
|
309
|
-
set openroad_ant_check [lindex [dict get $openroad_task_vars ant_check] 0]
|
|
310
|
-
set openroad_ant_repair [lindex [dict get $openroad_task_vars ant_repair] 0]
|
|
311
|
-
|
|
312
|
-
set openroad_grt_use_pin_access [lindex [dict get $openroad_task_vars grt_use_pin_access] 0]
|
|
313
|
-
set openroad_grt_overflow_iter [lindex [dict get $openroad_task_vars grt_overflow_iter] 0]
|
|
314
|
-
set openroad_grt_macro_extension [lindex [dict get $openroad_task_vars grt_macro_extension] 0]
|
|
315
|
-
set openroad_grt_allow_congestion [lindex [dict get $openroad_task_vars grt_allow_congestion] 0]
|
|
316
|
-
set openroad_grt_allow_overflow [lindex [dict get $openroad_task_vars grt_allow_overflow] 0]
|
|
317
|
-
set openroad_grt_signal_min_layer [lindex [dict get $openroad_task_vars grt_signal_min_layer] 0]
|
|
318
|
-
set openroad_grt_signal_max_layer [lindex [dict get $openroad_task_vars grt_signal_max_layer] 0]
|
|
319
|
-
set openroad_grt_clock_min_layer [lindex [dict get $openroad_task_vars grt_clock_min_layer] 0]
|
|
320
|
-
set openroad_grt_clock_max_layer [lindex [dict get $openroad_task_vars grt_clock_max_layer] 0]
|
|
321
|
-
|
|
322
|
-
set openroad_drt_disable_via_gen [lindex [dict get $openroad_task_vars drt_disable_via_gen] 0]
|
|
323
|
-
set openroad_drt_process_node [lindex [dict get $openroad_task_vars drt_process_node] 0]
|
|
324
|
-
set openroad_drt_via_in_pin_bottom_layer \
|
|
325
|
-
[lindex [dict get $openroad_task_vars drt_via_in_pin_bottom_layer] 0]
|
|
326
|
-
set openroad_drt_via_in_pin_top_layer \
|
|
327
|
-
[lindex [dict get $openroad_task_vars drt_via_in_pin_top_layer] 0]
|
|
328
|
-
set openroad_drt_repair_pdn_vias [lindex [dict get $openroad_task_vars drt_repair_pdn_vias] 0]
|
|
329
|
-
set openroad_drt_via_repair_post_route \
|
|
330
|
-
[lindex [dict get $openroad_task_vars drt_via_repair_post_route] 0]
|
|
331
|
-
set openroad_drt_default_vias []
|
|
332
|
-
if { [dict exists $openroad_task_vars detailed_route_default_via] } {
|
|
333
|
-
foreach via [dict get $openroad_task_vars detailed_route_default_via] {
|
|
334
|
-
lappend openroad_drt_default_vias $via
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
set openroad_drt_unidirectional_layers []
|
|
338
|
-
if { [dict exists $openroad_task_vars detailed_route_unidirectional_layer] } {
|
|
339
|
-
foreach layer [dict get $openroad_task_vars detailed_route_unidirectional_layer] {
|
|
340
|
-
lappend openroad_drt_unidirectional_layers [sc_get_layer_name $layer]
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
set openroad_rsz_setup_slack_margin [lindex [dict get $openroad_task_vars rsz_setup_slack_margin] 0]
|
|
345
|
-
set openroad_rsz_hold_slack_margin [lindex [dict get $openroad_task_vars rsz_hold_slack_margin] 0]
|
|
346
|
-
set openroad_rsz_slew_margin [lindex [dict get $openroad_task_vars rsz_slew_margin] 0]
|
|
347
|
-
set openroad_rsz_cap_margin [lindex [dict get $openroad_task_vars rsz_cap_margin] 0]
|
|
348
|
-
set openroad_rsz_buffer_inputs [lindex [dict get $openroad_task_vars rsz_buffer_inputs] 0]
|
|
349
|
-
set openroad_rsz_buffer_outputs [lindex [dict get $openroad_task_vars rsz_buffer_outputs] 0]
|
|
350
|
-
set openroad_rsz_skip_pin_swap [lindex [dict get $openroad_task_vars rsz_skip_pin_swap] 0]
|
|
351
|
-
set openroad_rsz_skip_gate_cloning [lindex [dict get $openroad_task_vars rsz_skip_gate_cloning] 0]
|
|
352
|
-
set openroad_rsz_repair_tns [lindex [dict get $openroad_task_vars rsz_repair_tns] 0]
|
|
353
|
-
|
|
354
|
-
set openroad_sta_early_timing_derate \
|
|
355
|
-
[lindex [dict get $openroad_task_vars sta_early_timing_derate] 0]
|
|
356
|
-
set openroad_sta_late_timing_derate [lindex [dict get $openroad_task_vars sta_late_timing_derate] 0]
|
|
357
|
-
set openroad_sta_top_n_paths [lindex [dict get $openroad_task_vars sta_top_n_paths] 0]
|
|
358
|
-
|
|
359
|
-
set openroad_fin_add_fill [lindex [dict get $openroad_task_vars fin_add_fill] 0]
|
|
360
|
-
|
|
361
|
-
set openroad_ord_enable_images [lindex [dict get $openroad_task_vars ord_enable_images] 0]
|
|
362
|
-
set openroad_ord_heatmap_bins_x [lindex [dict get $openroad_task_vars ord_heatmap_bins_x] 0]
|
|
363
|
-
set openroad_ord_heatmap_bins_y [lindex [dict get $openroad_task_vars ord_heatmap_bins_y] 0]
|
|
364
|
-
|
|
365
|
-
# PDK agnostic design rule translation
|
|
366
|
-
set sc_minmetal [sc_get_layer_name $sc_minmetal]
|
|
367
|
-
set sc_maxmetal [sc_get_layer_name $sc_maxmetal]
|
|
368
|
-
set sc_hpinmetal [sc_get_layer_name $sc_hpinmetal]
|
|
369
|
-
set sc_vpinmetal [sc_get_layer_name $sc_vpinmetal]
|
|
370
|
-
set sc_rc_clk [sc_get_layer_name $sc_rc_clk]
|
|
371
|
-
set sc_rc_signal [sc_get_layer_name $sc_rc_signal]
|
|
372
|
-
set openroad_grt_signal_min_layer [sc_get_layer_name $openroad_grt_signal_min_layer]
|
|
373
|
-
set openroad_grt_signal_max_layer [sc_get_layer_name $openroad_grt_signal_max_layer]
|
|
374
|
-
set openroad_grt_clock_min_layer [sc_get_layer_name $openroad_grt_clock_min_layer]
|
|
375
|
-
set openroad_grt_clock_max_layer [sc_get_layer_name $openroad_grt_clock_max_layer]
|
|
376
|
-
set openroad_drt_via_in_pin_bottom_layer [sc_get_layer_name $openroad_drt_via_in_pin_bottom_layer]
|
|
377
|
-
set openroad_drt_via_in_pin_top_layer [sc_get_layer_name $openroad_drt_via_in_pin_top_layer]
|
|
378
|
-
set openroad_drt_repair_pdn_vias [sc_get_layer_name $openroad_drt_repair_pdn_vias]
|
|
379
|
-
|
|
380
|
-
# Setup timing derating
|
|
381
|
-
if { $openroad_sta_early_timing_derate != 0.0 } {
|
|
382
|
-
set_timing_derate -early $openroad_sta_early_timing_derate
|
|
383
|
-
}
|
|
384
|
-
if { $openroad_sta_late_timing_derate != 0.0 } {
|
|
385
|
-
set_timing_derate -late $openroad_sta_late_timing_derate
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
# Check timing setup
|
|
389
|
-
check_setup
|
|
390
|
-
|
|
391
|
-
if { [llength [all_clocks]] == 0 } {
|
|
392
|
-
utl::warn FLW 1 "No clocks defined."
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
set_dont_use $sc_dontuse
|
|
396
|
-
|
|
397
|
-
set sc_parasitics [lindex [sc_cfg_tool_task_get {file} parasitics] 0]
|
|
398
|
-
source $sc_parasitics
|
|
399
|
-
set_wire_rc -clock -layer $sc_rc_clk
|
|
400
|
-
set_wire_rc -signal -layer $sc_rc_signal
|
|
401
|
-
utl::info FLW 1 "Using $sc_rc_clk for clock parasitics estimation"
|
|
402
|
-
utl::info FLW 1 "Using $sc_rc_signal for signal parasitics estimation"
|
|
403
|
-
|
|
404
|
-
set_thread_count $sc_threads
|
|
405
|
-
|
|
406
|
-
if { $sc_task != "floorplan" && $sc_task != "metrics" } {
|
|
407
|
-
## Setup global routing
|
|
408
|
-
|
|
409
|
-
# Adjust routing track density
|
|
410
|
-
foreach layer [[ord::get_db_tech] getLayers] {
|
|
411
|
-
if { [$layer getRoutingLevel] == 0 } {
|
|
412
|
-
continue
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
set layername [$layer getName]
|
|
416
|
-
if { ![sc_cfg_exists pdk $sc_pdk {var} $sc_tool "${layername}_adjustment" $sc_stackup] } {
|
|
417
|
-
utl::warn FLW 1 "Missing global routing adjustment for ${layername}"
|
|
418
|
-
} else {
|
|
419
|
-
set adjustment [lindex \
|
|
420
|
-
[sc_cfg_get pdk $sc_pdk {var} $sc_tool "${layername}_adjustment" $sc_stackup] 0]
|
|
421
|
-
utl::info FLW 1 \
|
|
422
|
-
"Setting global routing adjustment for $layername to [expr { $adjustment * 100 }]%"
|
|
423
|
-
set_global_routing_layer_adjustment $layername $adjustment
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
if { $openroad_grt_macro_extension > 0 } {
|
|
428
|
-
utl::info FLW 1 "Setting global routing macro extension to $openroad_grt_macro_extension gcells"
|
|
429
|
-
set_macro_extension $openroad_grt_macro_extension
|
|
430
|
-
}
|
|
431
|
-
utl::info FLW 1 "Setting global routing signal routing layers to:\
|
|
432
|
-
${openroad_grt_signal_min_layer}-${openroad_grt_signal_max_layer}"
|
|
433
|
-
set_routing_layers -signal "${openroad_grt_signal_min_layer}-${openroad_grt_signal_max_layer}"
|
|
434
|
-
utl::info FLW 1 "Setting global routing clock routing layers to:\
|
|
435
|
-
${openroad_grt_signal_min_layer}-${openroad_grt_signal_max_layer}"
|
|
436
|
-
set_routing_layers -clock "${openroad_grt_clock_min_layer}-${openroad_grt_clock_max_layer}"
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
# Setup reports directories
|
|
440
|
-
file mkdir reports/timing
|
|
441
|
-
file mkdir reports/power
|
|
442
|
-
file mkdir reports/markers
|
|
443
|
-
|
|
444
|
-
if { $sc_task == "show" || $sc_task == "screenshot" } {
|
|
445
|
-
if { $sc_task == "screenshot" } {
|
|
446
|
-
source "$sc_refdir/sc_screenshot.tcl"
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
set show_exit [lindex [sc_cfg_tool_task_get {var} show_exit] 0]
|
|
450
|
-
if { $show_exit == "true" } {
|
|
451
|
-
exit
|
|
452
|
-
}
|
|
453
|
-
} else {
|
|
454
|
-
###############################
|
|
455
|
-
# Source Step Script
|
|
456
|
-
###############################
|
|
457
|
-
|
|
458
|
-
report_units_metric
|
|
459
|
-
|
|
460
|
-
utl::push_metrics_stage "sc__prestep__{}"
|
|
461
|
-
if { [sc_cfg_tool_task_exists prescript] } {
|
|
462
|
-
foreach sc_pre_script [sc_cfg_tool_task_get prescript] {
|
|
463
|
-
puts "Sourcing pre script: ${sc_pre_script}"
|
|
464
|
-
source -echo $sc_pre_script
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
utl::pop_metrics_stage
|
|
468
|
-
|
|
469
|
-
utl::push_metrics_stage "sc__step__{}"
|
|
470
|
-
if { [llength $openroad_dont_touch] > 0 } {
|
|
471
|
-
# set don't touch list
|
|
472
|
-
set_dont_touch $openroad_dont_touch
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
source -echo "$sc_refdir/sc_$sc_task.tcl"
|
|
476
|
-
|
|
477
|
-
if { [llength $openroad_dont_touch] > 0 } {
|
|
478
|
-
# unset for next step
|
|
479
|
-
unset_dont_touch $openroad_dont_touch
|
|
480
|
-
}
|
|
481
|
-
utl::pop_metrics_stage
|
|
482
|
-
|
|
483
|
-
utl::push_metrics_stage "sc__poststep__{}"
|
|
484
|
-
if { [sc_cfg_tool_task_exists postscript] } {
|
|
485
|
-
foreach sc_post_script [sc_cfg_tool_task_get postscript] {
|
|
486
|
-
puts "Sourcing post script: ${sc_post_script}"
|
|
487
|
-
source -echo $sc_post_script
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
utl::pop_metrics_stage
|
|
491
|
-
|
|
492
|
-
###############################
|
|
493
|
-
# Write Design Data
|
|
494
|
-
###############################
|
|
495
|
-
|
|
496
|
-
utl::push_metrics_stage "sc__write__{}"
|
|
497
|
-
source "$sc_refdir/sc_write.tcl"
|
|
498
|
-
utl::pop_metrics_stage
|
|
499
|
-
|
|
500
|
-
###############################
|
|
501
|
-
# Reporting
|
|
502
|
-
###############################
|
|
503
|
-
|
|
504
|
-
utl::push_metrics_stage "sc__metric__{}"
|
|
505
|
-
source "$sc_refdir/sc_report.tcl"
|
|
506
|
-
utl::pop_metrics_stage
|
|
507
|
-
|
|
508
|
-
# Images
|
|
509
|
-
if { [sc_has_gui] && $openroad_ord_enable_images == "true" } {
|
|
510
|
-
utl::push_metrics_stage "sc__image__{}"
|
|
511
|
-
gui::show "source \"$sc_refdir/sc_write_images.tcl\"" false
|
|
512
|
-
utl::pop_metrics_stage
|
|
513
|
-
}
|
|
514
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
#######################################
|
|
2
|
-
# Clock tree synthesis
|
|
3
|
-
# (skip if no clocks defined)
|
|
4
|
-
#######################################
|
|
5
|
-
|
|
6
|
-
if { [llength [all_clocks]] > 0 } {
|
|
7
|
-
# Clone clock tree inverters next to register loads
|
|
8
|
-
# so cts does not try to buffer the inverted clocks.
|
|
9
|
-
repair_clock_inverters
|
|
10
|
-
|
|
11
|
-
set sc_cts_arguments []
|
|
12
|
-
if { $openroad_cts_balance_levels == "true" } {
|
|
13
|
-
lappend sc_cts_arguments "-balance_levels"
|
|
14
|
-
}
|
|
15
|
-
if { $openroad_cts_obstruction_aware == "true" } {
|
|
16
|
-
lappend sc_cts_arguments "-obstruction_aware"
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
clock_tree_synthesis -root_buf $sc_clkbuf -buf_list $sc_clkbuf \
|
|
20
|
-
-sink_clustering_enable \
|
|
21
|
-
-sink_clustering_size $openroad_cts_cluster_size \
|
|
22
|
-
-sink_clustering_max_diameter $openroad_cts_cluster_diameter \
|
|
23
|
-
-distance_between_buffers $openroad_cts_distance_between_buffers \
|
|
24
|
-
{*}$sc_cts_arguments
|
|
25
|
-
|
|
26
|
-
set_propagated_clock [all_clocks]
|
|
27
|
-
|
|
28
|
-
estimate_parasitics -placement
|
|
29
|
-
|
|
30
|
-
repair_clock_nets
|
|
31
|
-
|
|
32
|
-
sc_detailed_placement
|
|
33
|
-
|
|
34
|
-
set repair_timing_args []
|
|
35
|
-
if { $openroad_rsz_skip_pin_swap == "true" } {
|
|
36
|
-
lappend repair_timing_args "-skip_pin_swap"
|
|
37
|
-
}
|
|
38
|
-
if { $openroad_rsz_skip_gate_cloning == "true" } {
|
|
39
|
-
lappend repair_timing_args "-skip_gate_cloning"
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if { [lindex [sc_cfg_tool_task_get var rsz_skip_setup_repair] 0] != "true" } {
|
|
43
|
-
estimate_parasitics -placement
|
|
44
|
-
|
|
45
|
-
repair_timing -setup -verbose \
|
|
46
|
-
-setup_margin $openroad_rsz_setup_slack_margin \
|
|
47
|
-
-hold_margin $openroad_rsz_hold_slack_margin \
|
|
48
|
-
-repair_tns $openroad_rsz_repair_tns \
|
|
49
|
-
{*}$repair_timing_args
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if { [lindex [sc_cfg_tool_task_get var rsz_skip_hold_repair] 0] != "true" } {
|
|
53
|
-
estimate_parasitics -placement
|
|
54
|
-
|
|
55
|
-
repair_timing -hold -verbose \
|
|
56
|
-
-setup_margin $openroad_rsz_setup_slack_margin \
|
|
57
|
-
-hold_margin $openroad_rsz_hold_slack_margin \
|
|
58
|
-
-repair_tns $openroad_rsz_repair_tns \
|
|
59
|
-
{*}$repair_timing_args
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
sc_detailed_placement
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
global_connect
|
|
66
|
-
|
|
67
|
-
# estimate for metrics
|
|
68
|
-
estimate_parasitics -placement
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
######################
|
|
2
|
-
# Do fill
|
|
3
|
-
######################
|
|
4
|
-
|
|
5
|
-
set removed_obs 0
|
|
6
|
-
foreach obstruction [[ord::get_db_block] getObstructions] {
|
|
7
|
-
odb::dbObstruction_destroy $obstruction
|
|
8
|
-
incr removed_obs
|
|
9
|
-
}
|
|
10
|
-
utl::info FLW 1 "Deleted $removed_obs routing obstructions"
|
|
11
|
-
|
|
12
|
-
if {
|
|
13
|
-
$openroad_fin_add_fill == "true" &&
|
|
14
|
-
[sc_cfg_exists pdk $sc_pdk aprtech openroad $sc_stackup $sc_libtype fill]
|
|
15
|
-
} {
|
|
16
|
-
set sc_fillrules \
|
|
17
|
-
[lindex [sc_cfg_get pdk $sc_pdk aprtech openroad $sc_stackup $sc_libtype fill] 0]
|
|
18
|
-
density_fill -rules $sc_fillrules
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
# estimate for metrics
|
|
22
|
-
estimate_parasitics -global_routing
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
###########################
|
|
2
|
-
# Generate LEF
|
|
3
|
-
###########################
|
|
4
|
-
|
|
5
|
-
set lef_args []
|
|
6
|
-
if {
|
|
7
|
-
[lindex [sc_cfg_tool_task_get {var} ord_abstract_lef_bloat_layers] 0]
|
|
8
|
-
== "true"
|
|
9
|
-
} {
|
|
10
|
-
lappend lef_args "-bloat_occupied_layers"
|
|
11
|
-
} else {
|
|
12
|
-
lappend lef_args \
|
|
13
|
-
"-bloat_factor" \
|
|
14
|
-
[lindex [sc_cfg_tool_task_get {var} ord_abstract_lef_bloat_factor] 0]
|
|
15
|
-
}
|
|
16
|
-
write_abstract_lef {*}$lef_args "outputs/${sc_design}.lef"
|
|
17
|
-
|
|
18
|
-
###########################
|
|
19
|
-
# Generate CDL
|
|
20
|
-
###########################
|
|
21
|
-
|
|
22
|
-
if { [lindex [sc_cfg_tool_task_get {var} write_cdl] 0] == "true" } {
|
|
23
|
-
# Write CDL
|
|
24
|
-
set sc_cdl_masters []
|
|
25
|
-
foreach lib "$sc_targetlibs $sc_macrolibs" {
|
|
26
|
-
#CDL files
|
|
27
|
-
if { [sc_cfg_exists library $lib output $sc_stackup cdl] } {
|
|
28
|
-
foreach cdl_file [sc_cfg_get library $lib output $sc_stackup cdl] {
|
|
29
|
-
lappend sc_cdl_masters $cdl_file
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
write_cdl -masters $sc_cdl_masters "outputs/${sc_design}.cdl"
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
###########################
|
|
37
|
-
# Generate SPEF
|
|
38
|
-
###########################
|
|
39
|
-
|
|
40
|
-
if { [lindex [sc_cfg_tool_task_get {var} write_spef] 0] == "true" } {
|
|
41
|
-
# just need to define a corner
|
|
42
|
-
define_process_corner -ext_model_index 0 X
|
|
43
|
-
foreach pexcorner $sc_pex_corners {
|
|
44
|
-
set sc_pextool "${sc_tool}-openrcx"
|
|
45
|
-
set pex_model \
|
|
46
|
-
[lindex [sc_cfg_get pdk $sc_pdk pexmodel $sc_pextool $sc_stackup $pexcorner] 0]
|
|
47
|
-
puts "Writing SPEF for $pexcorner"
|
|
48
|
-
extract_parasitics -ext_model_file $pex_model
|
|
49
|
-
write_spef "outputs/${sc_design}.${pexcorner}.spef"
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if { [lindex [sc_cfg_tool_task_get {var} use_spef] 0] == "true" } {
|
|
53
|
-
set lib_pex [dict create]
|
|
54
|
-
foreach scenario $sc_scenarios {
|
|
55
|
-
set pexcorner [sc_cfg_get constraint timing $scenario pexcorner]
|
|
56
|
-
|
|
57
|
-
dict set lib_pex $scenario $pexcorner
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
# read in spef for timing corners
|
|
61
|
-
foreach corner $sc_scenarios {
|
|
62
|
-
set pexcorner [dict get $lib_pex $corner]
|
|
63
|
-
|
|
64
|
-
puts "Reading SPEF for $pexcorner into $corner"
|
|
65
|
-
read_spef -corner $corner \
|
|
66
|
-
"outputs/${sc_design}.${pexcorner}.spef"
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
###########################
|
|
72
|
-
# Write Timing Models
|
|
73
|
-
###########################
|
|
74
|
-
|
|
75
|
-
foreach corner $sc_scenarios {
|
|
76
|
-
if { [lindex [sc_cfg_tool_task_get {var} write_liberty] 0] == "true" } {
|
|
77
|
-
puts "Writing timing model for $corner"
|
|
78
|
-
write_timing_model -library_name "${sc_design}_${corner}" \
|
|
79
|
-
-corner $corner \
|
|
80
|
-
"outputs/${sc_design}.${corner}.lib"
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if { [lindex [sc_cfg_tool_task_get {var} write_sdf] 0] == "true" } {
|
|
84
|
-
puts "Writing SDF for $corner"
|
|
85
|
-
write_sdf -corner $corner \
|
|
86
|
-
-include_typ \
|
|
87
|
-
"outputs/${sc_design}.${corner}.sdf"
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
###########################
|
|
92
|
-
# Check Power Network
|
|
93
|
-
###########################
|
|
94
|
-
|
|
95
|
-
foreach net [sc_psm_check_nets] {
|
|
96
|
-
foreach corner $sc_scenarios {
|
|
97
|
-
puts "Analyzing supply net: $net on $corner"
|
|
98
|
-
analyze_power_grid -net $net -corner $corner
|
|
99
|
-
}
|
|
100
|
-
}
|