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.
Files changed (122) hide show
  1. siliconcompiler/_metadata.py +1 -1
  2. siliconcompiler/apps/sc_remote.py +15 -14
  3. siliconcompiler/apps/sc_show.py +5 -5
  4. siliconcompiler/apps/utils/replay.py +136 -0
  5. siliconcompiler/core.py +14 -12
  6. siliconcompiler/flows/_common.py +11 -13
  7. siliconcompiler/flows/asicflow.py +83 -42
  8. siliconcompiler/remote/__init__.py +11 -0
  9. siliconcompiler/remote/client.py +753 -815
  10. siliconcompiler/report/report.py +2 -0
  11. siliconcompiler/report/summary_table.py +1 -1
  12. siliconcompiler/scheduler/__init__.py +51 -9
  13. siliconcompiler/scheduler/send_messages.py +37 -33
  14. siliconcompiler/scheduler/validation/email_credentials.json +7 -0
  15. siliconcompiler/schema/schema_cfg.py +15 -3
  16. siliconcompiler/schema/schema_obj.py +16 -0
  17. siliconcompiler/sphinx_ext/dynamicgen.py +4 -3
  18. siliconcompiler/targets/fpgaflow_demo.py +6 -7
  19. siliconcompiler/targets/gf180_demo.py +3 -3
  20. siliconcompiler/templates/replay/requirements.txt +6 -0
  21. siliconcompiler/templates/replay/run.py.j2 +22 -0
  22. siliconcompiler/templates/replay/setup.sh +17 -0
  23. siliconcompiler/tools/_common/__init__.py +17 -3
  24. siliconcompiler/tools/_common/asic.py +10 -3
  25. siliconcompiler/tools/builtin/concatenate.py +1 -1
  26. siliconcompiler/tools/openroad/__init__.py +103 -0
  27. siliconcompiler/tools/openroad/{openroad.py → _apr.py} +413 -422
  28. siliconcompiler/tools/openroad/antenna_repair.py +78 -0
  29. siliconcompiler/tools/openroad/clock_tree_synthesis.py +64 -0
  30. siliconcompiler/tools/openroad/detailed_placement.py +59 -0
  31. siliconcompiler/tools/openroad/detailed_route.py +62 -0
  32. siliconcompiler/tools/openroad/endcap_tapcell_insertion.py +52 -0
  33. siliconcompiler/tools/openroad/fillercell_insertion.py +58 -0
  34. siliconcompiler/tools/openroad/{dfm.py → fillmetal_insertion.py} +35 -19
  35. siliconcompiler/tools/openroad/global_placement.py +58 -0
  36. siliconcompiler/tools/openroad/global_route.py +63 -0
  37. siliconcompiler/tools/openroad/init_floorplan.py +103 -0
  38. siliconcompiler/tools/openroad/macro_placement.py +65 -0
  39. siliconcompiler/tools/openroad/metrics.py +23 -8
  40. siliconcompiler/tools/openroad/pin_placement.py +56 -0
  41. siliconcompiler/tools/openroad/power_grid.py +65 -0
  42. siliconcompiler/tools/openroad/rcx_bench.py +7 -4
  43. siliconcompiler/tools/openroad/rcx_extract.py +2 -1
  44. siliconcompiler/tools/openroad/rdlroute.py +4 -4
  45. siliconcompiler/tools/openroad/repair_design.py +59 -0
  46. siliconcompiler/tools/openroad/repair_timing.py +63 -0
  47. siliconcompiler/tools/openroad/screenshot.py +9 -20
  48. siliconcompiler/tools/openroad/scripts/apr/postamble.tcl +44 -0
  49. siliconcompiler/tools/openroad/scripts/apr/preamble.tcl +95 -0
  50. siliconcompiler/tools/openroad/scripts/apr/sc_antenna_repair.tcl +51 -0
  51. siliconcompiler/tools/openroad/scripts/apr/sc_clock_tree_synthesis.tcl +62 -0
  52. siliconcompiler/tools/openroad/scripts/apr/sc_detailed_placement.tcl +41 -0
  53. siliconcompiler/tools/openroad/scripts/apr/sc_detailed_route.tcl +71 -0
  54. siliconcompiler/tools/openroad/scripts/apr/sc_endcap_tapcell_insertion.tcl +55 -0
  55. siliconcompiler/tools/openroad/scripts/apr/sc_fillercell_insertion.tcl +27 -0
  56. siliconcompiler/tools/openroad/scripts/apr/sc_fillmetal_insertion.tcl +36 -0
  57. siliconcompiler/tools/openroad/scripts/apr/sc_global_placement.tcl +26 -0
  58. siliconcompiler/tools/openroad/scripts/apr/sc_global_route.tcl +61 -0
  59. siliconcompiler/tools/openroad/scripts/apr/sc_init_floorplan.tcl +333 -0
  60. siliconcompiler/tools/openroad/scripts/apr/sc_macro_placement.tcl +123 -0
  61. siliconcompiler/tools/openroad/scripts/apr/sc_metrics.tcl +22 -0
  62. siliconcompiler/tools/openroad/scripts/apr/sc_pin_placement.tcl +41 -0
  63. siliconcompiler/tools/openroad/scripts/apr/sc_power_grid.tcl +60 -0
  64. siliconcompiler/tools/openroad/scripts/apr/sc_repair_design.tcl +68 -0
  65. siliconcompiler/tools/openroad/scripts/apr/sc_repair_timing.tcl +83 -0
  66. siliconcompiler/tools/openroad/scripts/apr/sc_write_data.tcl +125 -0
  67. siliconcompiler/tools/openroad/scripts/common/debugging.tcl +28 -0
  68. siliconcompiler/tools/openroad/scripts/common/procs.tcl +675 -0
  69. siliconcompiler/tools/openroad/scripts/common/read_input_files.tcl +59 -0
  70. siliconcompiler/tools/openroad/scripts/common/read_liberty.tcl +20 -0
  71. siliconcompiler/tools/openroad/scripts/common/read_timing_constraints.tcl +16 -0
  72. siliconcompiler/tools/openroad/scripts/common/reports.tcl +180 -0
  73. siliconcompiler/tools/openroad/scripts/common/screenshot.tcl +18 -0
  74. siliconcompiler/tools/openroad/scripts/common/write_images.tcl +395 -0
  75. siliconcompiler/tools/openroad/scripts/{sc_rcx_bench.tcl → rcx/sc_rcx_bench.tcl} +5 -5
  76. siliconcompiler/tools/openroad/scripts/{sc_rcx_extract.tcl → rcx/sc_rcx_extract.tcl} +0 -0
  77. siliconcompiler/tools/openroad/scripts/sc_rcx.tcl +5 -16
  78. siliconcompiler/tools/openroad/scripts/sc_rdlroute.tcl +51 -51
  79. siliconcompiler/tools/openroad/scripts/sc_show.tcl +105 -0
  80. siliconcompiler/tools/openroad/show.py +28 -23
  81. siliconcompiler/tools/openroad/{export.py → write_data.py} +31 -26
  82. siliconcompiler/tools/opensta/__init__.py +1 -1
  83. siliconcompiler/tools/vivado/bitstream.py +8 -2
  84. siliconcompiler/tools/vivado/place.py +6 -2
  85. siliconcompiler/tools/vivado/route.py +6 -2
  86. siliconcompiler/tools/vivado/scripts/sc_bitstream.tcl +1 -1
  87. siliconcompiler/tools/vivado/scripts/sc_place.tcl +1 -1
  88. siliconcompiler/tools/vivado/scripts/sc_route.tcl +1 -1
  89. siliconcompiler/tools/vivado/scripts/sc_run.tcl +4 -2
  90. siliconcompiler/tools/vivado/syn_fpga.py +5 -1
  91. siliconcompiler/tools/vivado/vivado.py +26 -10
  92. siliconcompiler/tools/vpr/vpr.py +5 -0
  93. siliconcompiler/tools/yosys/syn_asic.py +7 -0
  94. siliconcompiler/tools/yosys/syn_asic.tcl +27 -6
  95. siliconcompiler/tools/yosys/syn_fpga.tcl +26 -18
  96. siliconcompiler/toolscripts/_tools.json +5 -5
  97. {siliconcompiler-0.28.8.dist-info → siliconcompiler-0.29.0.dist-info}/METADATA +50 -48
  98. {siliconcompiler-0.28.8.dist-info → siliconcompiler-0.29.0.dist-info}/RECORD +103 -76
  99. {siliconcompiler-0.28.8.dist-info → siliconcompiler-0.29.0.dist-info}/WHEEL +1 -1
  100. siliconcompiler/tools/openroad/cts.py +0 -45
  101. siliconcompiler/tools/openroad/floorplan.py +0 -75
  102. siliconcompiler/tools/openroad/physyn.py +0 -27
  103. siliconcompiler/tools/openroad/place.py +0 -41
  104. siliconcompiler/tools/openroad/route.py +0 -45
  105. siliconcompiler/tools/openroad/scripts/__init__.py +0 -0
  106. siliconcompiler/tools/openroad/scripts/sc_apr.tcl +0 -514
  107. siliconcompiler/tools/openroad/scripts/sc_cts.tcl +0 -68
  108. siliconcompiler/tools/openroad/scripts/sc_dfm.tcl +0 -22
  109. siliconcompiler/tools/openroad/scripts/sc_export.tcl +0 -100
  110. siliconcompiler/tools/openroad/scripts/sc_floorplan.tcl +0 -456
  111. siliconcompiler/tools/openroad/scripts/sc_metrics.tcl +0 -1
  112. siliconcompiler/tools/openroad/scripts/sc_physyn.tcl +0 -6
  113. siliconcompiler/tools/openroad/scripts/sc_place.tcl +0 -84
  114. siliconcompiler/tools/openroad/scripts/sc_procs.tcl +0 -494
  115. siliconcompiler/tools/openroad/scripts/sc_report.tcl +0 -189
  116. siliconcompiler/tools/openroad/scripts/sc_route.tcl +0 -143
  117. siliconcompiler/tools/openroad/scripts/sc_screenshot.tcl +0 -18
  118. siliconcompiler/tools/openroad/scripts/sc_write_images.tcl +0 -393
  119. /siliconcompiler/tools/openroad/scripts/{sc_write.tcl → common/write_data.tcl} +0 -0
  120. {siliconcompiler-0.28.8.dist-info → siliconcompiler-0.29.0.dist-info}/LICENSE +0 -0
  121. {siliconcompiler-0.28.8.dist-info → siliconcompiler-0.29.0.dist-info}/entry_points.txt +0 -0
  122. {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
- }