librelane 2.4.0.dev0__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.
Potentially problematic release.
This version of librelane might be problematic. Click here for more details.
- librelane/__init__.py +38 -0
- librelane/__main__.py +470 -0
- librelane/__version__.py +43 -0
- librelane/common/__init__.py +61 -0
- librelane/common/cli.py +75 -0
- librelane/common/drc.py +245 -0
- librelane/common/generic_dict.py +319 -0
- librelane/common/metrics/__init__.py +35 -0
- librelane/common/metrics/__main__.py +413 -0
- librelane/common/metrics/library.py +354 -0
- librelane/common/metrics/metric.py +186 -0
- librelane/common/metrics/util.py +279 -0
- librelane/common/misc.py +402 -0
- librelane/common/ring_buffer.py +63 -0
- librelane/common/tcl.py +80 -0
- librelane/common/toolbox.py +549 -0
- librelane/common/tpe.py +41 -0
- librelane/common/types.py +117 -0
- librelane/config/__init__.py +32 -0
- librelane/config/__main__.py +158 -0
- librelane/config/config.py +1025 -0
- librelane/config/flow.py +490 -0
- librelane/config/pdk_compat.py +255 -0
- librelane/config/preprocessor.py +464 -0
- librelane/config/removals.py +45 -0
- librelane/config/variable.py +722 -0
- librelane/container.py +264 -0
- librelane/env_info.py +306 -0
- librelane/examples/spm/config.yaml +33 -0
- librelane/examples/spm/pin_order.cfg +14 -0
- librelane/examples/spm/src/impl.sdc +73 -0
- librelane/examples/spm/src/signoff.sdc +68 -0
- librelane/examples/spm/src/spm.v +73 -0
- librelane/examples/spm/verify/spm_tb.v +106 -0
- librelane/examples/spm-user_project_wrapper/SPM_example.v +286 -0
- librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +145 -0
- librelane/examples/spm-user_project_wrapper/config-tut.json +12 -0
- librelane/examples/spm-user_project_wrapper/config.json +13 -0
- librelane/examples/spm-user_project_wrapper/defines.v +66 -0
- librelane/examples/spm-user_project_wrapper/template.def +7656 -0
- librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +123 -0
- librelane/flows/__init__.py +24 -0
- librelane/flows/builtins.py +18 -0
- librelane/flows/classic.py +330 -0
- librelane/flows/cli.py +463 -0
- librelane/flows/flow.py +985 -0
- librelane/flows/misc.py +71 -0
- librelane/flows/optimizing.py +179 -0
- librelane/flows/sequential.py +367 -0
- librelane/flows/synth_explore.py +173 -0
- librelane/logging/__init__.py +40 -0
- librelane/logging/logger.py +323 -0
- librelane/open_pdks_rev +1 -0
- librelane/plugins.py +21 -0
- librelane/py.typed +0 -0
- librelane/scripts/base.sdc +80 -0
- librelane/scripts/klayout/Readme.md +2 -0
- librelane/scripts/klayout/open_design.py +63 -0
- librelane/scripts/klayout/render.py +121 -0
- librelane/scripts/klayout/stream_out.py +176 -0
- librelane/scripts/klayout/xml_drc_report_to_json.py +45 -0
- librelane/scripts/klayout/xor.drc +120 -0
- librelane/scripts/magic/Readme.md +1 -0
- librelane/scripts/magic/common/read.tcl +114 -0
- librelane/scripts/magic/def/antenna_check.tcl +35 -0
- librelane/scripts/magic/def/mag.tcl +19 -0
- librelane/scripts/magic/def/mag_gds.tcl +81 -0
- librelane/scripts/magic/drc.tcl +79 -0
- librelane/scripts/magic/extract_spice.tcl +98 -0
- librelane/scripts/magic/gds/drc_batch.tcl +74 -0
- librelane/scripts/magic/gds/erase_box.tcl +32 -0
- librelane/scripts/magic/gds/extras_mag.tcl +47 -0
- librelane/scripts/magic/gds/mag_with_pointers.tcl +32 -0
- librelane/scripts/magic/get_bbox.tcl +11 -0
- librelane/scripts/magic/lef/extras_maglef.tcl +63 -0
- librelane/scripts/magic/lef/maglef.tcl +27 -0
- librelane/scripts/magic/lef.tcl +57 -0
- librelane/scripts/magic/open.tcl +28 -0
- librelane/scripts/magic/wrapper.tcl +19 -0
- librelane/scripts/netgen/setup.tcl +28 -0
- librelane/scripts/odbpy/apply_def_template.py +49 -0
- librelane/scripts/odbpy/cell_frequency.py +107 -0
- librelane/scripts/odbpy/check_antenna_properties.py +116 -0
- librelane/scripts/odbpy/contextualize.py +109 -0
- librelane/scripts/odbpy/defutil.py +574 -0
- librelane/scripts/odbpy/diodes.py +373 -0
- librelane/scripts/odbpy/disconnected_pins.py +305 -0
- librelane/scripts/odbpy/exception_codes.py +17 -0
- librelane/scripts/odbpy/filter_unannotated.py +100 -0
- librelane/scripts/odbpy/io_place.py +482 -0
- librelane/scripts/odbpy/label_macro_pins.py +277 -0
- librelane/scripts/odbpy/lefutil.py +97 -0
- librelane/scripts/odbpy/placers.py +162 -0
- librelane/scripts/odbpy/power_utils.py +395 -0
- librelane/scripts/odbpy/random_place.py +57 -0
- librelane/scripts/odbpy/reader.py +246 -0
- librelane/scripts/odbpy/remove_buffers.py +173 -0
- librelane/scripts/odbpy/snap_to_grid.py +57 -0
- librelane/scripts/odbpy/wire_lengths.py +93 -0
- librelane/scripts/openroad/antenna_check.tcl +20 -0
- librelane/scripts/openroad/antenna_repair.tcl +31 -0
- librelane/scripts/openroad/basic_mp.tcl +24 -0
- librelane/scripts/openroad/buffer_list.tcl +10 -0
- librelane/scripts/openroad/common/dpl.tcl +24 -0
- librelane/scripts/openroad/common/dpl_cell_pad.tcl +26 -0
- librelane/scripts/openroad/common/grt.tcl +32 -0
- librelane/scripts/openroad/common/io.tcl +476 -0
- librelane/scripts/openroad/common/pdn_cfg.tcl +135 -0
- librelane/scripts/openroad/common/resizer.tcl +103 -0
- librelane/scripts/openroad/common/set_global_connections.tcl +78 -0
- librelane/scripts/openroad/common/set_layer_adjustments.tcl +31 -0
- librelane/scripts/openroad/common/set_power_nets.tcl +30 -0
- librelane/scripts/openroad/common/set_rc.tcl +75 -0
- librelane/scripts/openroad/common/set_routing_layers.tcl +30 -0
- librelane/scripts/openroad/cts.tcl +80 -0
- librelane/scripts/openroad/cut_rows.tcl +24 -0
- librelane/scripts/openroad/dpl.tcl +24 -0
- librelane/scripts/openroad/drt.tcl +37 -0
- librelane/scripts/openroad/fill.tcl +30 -0
- librelane/scripts/openroad/floorplan.tcl +145 -0
- librelane/scripts/openroad/gpl.tcl +88 -0
- librelane/scripts/openroad/grt.tcl +30 -0
- librelane/scripts/openroad/gui.tcl +15 -0
- librelane/scripts/openroad/insert_buffer.tcl +127 -0
- librelane/scripts/openroad/ioplacer.tcl +67 -0
- librelane/scripts/openroad/irdrop.tcl +51 -0
- librelane/scripts/openroad/pdn.tcl +52 -0
- librelane/scripts/openroad/rcx.tcl +32 -0
- librelane/scripts/openroad/repair_design.tcl +70 -0
- librelane/scripts/openroad/repair_design_postgrt.tcl +48 -0
- librelane/scripts/openroad/rsz_timing_postcts.tcl +68 -0
- librelane/scripts/openroad/rsz_timing_postgrt.tcl +70 -0
- librelane/scripts/openroad/sta/check_macro_instances.tcl +53 -0
- librelane/scripts/openroad/sta/corner.tcl +393 -0
- librelane/scripts/openroad/tapcell.tcl +25 -0
- librelane/scripts/openroad/write_views.tcl +27 -0
- librelane/scripts/pyosys/construct_abc_script.py +177 -0
- librelane/scripts/pyosys/json_header.py +84 -0
- librelane/scripts/pyosys/synthesize.py +493 -0
- librelane/scripts/pyosys/ys_common.py +153 -0
- librelane/scripts/tclsh/hello.tcl +1 -0
- librelane/state/__init__.py +24 -0
- librelane/state/__main__.py +61 -0
- librelane/state/design_format.py +180 -0
- librelane/state/state.py +351 -0
- librelane/steps/__init__.py +61 -0
- librelane/steps/__main__.py +511 -0
- librelane/steps/checker.py +637 -0
- librelane/steps/common_variables.py +340 -0
- librelane/steps/cvc_rv.py +169 -0
- librelane/steps/klayout.py +509 -0
- librelane/steps/magic.py +566 -0
- librelane/steps/misc.py +160 -0
- librelane/steps/netgen.py +253 -0
- librelane/steps/odb.py +955 -0
- librelane/steps/openroad.py +2433 -0
- librelane/steps/openroad_alerts.py +102 -0
- librelane/steps/pyosys.py +629 -0
- librelane/steps/step.py +1547 -0
- librelane/steps/tclstep.py +288 -0
- librelane/steps/verilator.py +222 -0
- librelane/steps/yosys.py +371 -0
- librelane-2.4.0.dev0.dist-info/METADATA +151 -0
- librelane-2.4.0.dev0.dist-info/RECORD +166 -0
- librelane-2.4.0.dev0.dist-info/WHEEL +4 -0
- librelane-2.4.0.dev0.dist-info/entry_points.txt +8 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Copyright 2020-2022 Efabless Corporation
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
|
|
15
|
+
read_pnr_libs
|
|
16
|
+
read_lefs
|
|
17
|
+
read_current_netlist
|
|
18
|
+
|
|
19
|
+
foreach lib $::libs {
|
|
20
|
+
set current_sites [$lib getSites]
|
|
21
|
+
foreach site $current_sites {
|
|
22
|
+
set name [$site getName]
|
|
23
|
+
set ::sites($name) $site
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
set ::default_site $::sites($::env(PLACE_SITE))
|
|
28
|
+
|
|
29
|
+
set ::default_site_height [expr [$::default_site getHeight] / double($::dbu)]
|
|
30
|
+
set ::default_site_width [expr [$::default_site getWidth] / double($::dbu)]
|
|
31
|
+
|
|
32
|
+
puts "Using site height: $::default_site_height and site width: $::default_site_width…"
|
|
33
|
+
|
|
34
|
+
unset_propagated_clock [all_clocks]
|
|
35
|
+
|
|
36
|
+
set bottom_margin [expr $::default_site_height * $::env(BOTTOM_MARGIN_MULT)]
|
|
37
|
+
set top_margin [expr $::default_site_height * $::env(TOP_MARGIN_MULT)]
|
|
38
|
+
set left_margin [expr $::default_site_width * $::env(LEFT_MARGIN_MULT)]
|
|
39
|
+
set right_margin [expr $::default_site_width * $::env(RIGHT_MARGIN_MULT)]
|
|
40
|
+
|
|
41
|
+
set arg_list [list]
|
|
42
|
+
|
|
43
|
+
lappend arg_list -site $::env(PLACE_SITE)
|
|
44
|
+
|
|
45
|
+
if { [info exists ::env(EXTRA_SITES)] } {
|
|
46
|
+
foreach site $::env(EXTRA_SITES) {
|
|
47
|
+
lappend arg_list -additional_sites $site
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
puts "\[INFO\] Using $::env(FP_SIZING) sizing for the floorplan."
|
|
52
|
+
|
|
53
|
+
if {$::env(FP_SIZING) == "absolute"} {
|
|
54
|
+
if { [llength $::env(DIE_AREA)] != 4 } {
|
|
55
|
+
puts stderr "Invalid die area string '$::env(DIE_AREA)'."
|
|
56
|
+
exit -1
|
|
57
|
+
}
|
|
58
|
+
if { ! [info exists ::env(CORE_AREA)] } {
|
|
59
|
+
set die_x0 [lindex $::env(DIE_AREA) 0]
|
|
60
|
+
set die_y0 [lindex $::env(DIE_AREA) 1]
|
|
61
|
+
set die_x1 [lindex $::env(DIE_AREA) 2]
|
|
62
|
+
set die_y1 [lindex $::env(DIE_AREA) 3]
|
|
63
|
+
|
|
64
|
+
set x_dir [expr $die_x1 < $die_x0]
|
|
65
|
+
set y_dir [expr $die_y1 < $die_y0]
|
|
66
|
+
|
|
67
|
+
set core_x0 [expr {$die_x0 + (-1 ** $x_dir) * $left_margin}]
|
|
68
|
+
set core_y0 [expr {$die_y0 + (-1 ** $y_dir) * $bottom_margin}]
|
|
69
|
+
set core_x1 [expr {$die_x1 - (-1 ** $x_dir) * $right_margin}]
|
|
70
|
+
set core_y1 [expr {$die_y1 - (-1 ** $y_dir) * $top_margin}]
|
|
71
|
+
|
|
72
|
+
set ::env(CORE_AREA) [list $core_x0 $core_y0 $core_x1 $core_y1]
|
|
73
|
+
} else {
|
|
74
|
+
if { [llength $::env(CORE_AREA)] != 4 } {
|
|
75
|
+
puts stderr "Invalid core area string '$::env(CORE_AREA)'."
|
|
76
|
+
exit -1
|
|
77
|
+
}
|
|
78
|
+
puts "\[INFO\] Using the set CORE_AREA; ignoring core margin parameters"
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
lappend arg_list -die_area $::env(DIE_AREA)
|
|
82
|
+
lappend arg_list -core_area $::env(CORE_AREA)
|
|
83
|
+
} elseif { $::env(FP_SIZING) == "relative" } {
|
|
84
|
+
lappend arg_list -utilization $::env(FP_CORE_UTIL)
|
|
85
|
+
lappend arg_list -aspect_ratio $::env(FP_ASPECT_RATIO)
|
|
86
|
+
lappend arg_list -core_space "$bottom_margin $top_margin $left_margin $right_margin"
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if { [info exists ::env(FP_OBSTRUCTIONS)] } {
|
|
90
|
+
foreach obstruction $::env(FP_OBSTRUCTIONS) {
|
|
91
|
+
set llx [expr int([expr [lindex $obstruction 0] * $::dbu])]
|
|
92
|
+
set lly [expr int([expr [lindex $obstruction 1] * $::dbu])]
|
|
93
|
+
set urx [expr int([expr [lindex $obstruction 2] * $::dbu])]
|
|
94
|
+
set ury [expr int([expr [lindex $obstruction 3] * $::dbu])]
|
|
95
|
+
odb::dbBlockage_create [ord::get_db_block] $llx $lly $urx $ury
|
|
96
|
+
puts "\[INFO\] Created floorplan obstruction at $obstruction (µm)"
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
initialize_floorplan {*}$arg_list
|
|
101
|
+
|
|
102
|
+
insert_tiecells $::env(SYNTH_TIELO_CELL) -prefix "TIE_ZERO_"
|
|
103
|
+
insert_tiecells $::env(SYNTH_TIEHI_CELL) -prefix "TIE_ONE_"
|
|
104
|
+
|
|
105
|
+
if { [info exists ::env(PL_SOFT_OBSTRUCTIONS)] } {
|
|
106
|
+
foreach obstruction $::env(PL_SOFT_OBSTRUCTIONS) {
|
|
107
|
+
set llx [expr int([expr [lindex $obstruction 0] * $::dbu])]
|
|
108
|
+
set lly [expr int([expr [lindex $obstruction 1] * $::dbu])]
|
|
109
|
+
set urx [expr int([expr [lindex $obstruction 2] * $::dbu])]
|
|
110
|
+
set ury [expr int([expr [lindex $obstruction 3] * $::dbu])]
|
|
111
|
+
set obstruction_o [odb::dbBlockage_create [ord::get_db_block] $llx $lly $urx $ury]
|
|
112
|
+
set _ [$obstruction_o setSoft]
|
|
113
|
+
puts "\[INFO\] Created soft placement obstruction at $obstruction (µm)"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
puts "\[INFO\] Extracting DIE_AREA and CORE_AREA from the floorplan"
|
|
118
|
+
set ::env(DIE_AREA) [list]
|
|
119
|
+
set ::env(CORE_AREA) [list]
|
|
120
|
+
|
|
121
|
+
set die_area [$::block getDieArea]
|
|
122
|
+
set core_area [$::block getCoreArea]
|
|
123
|
+
|
|
124
|
+
set die_area [list [$die_area xMin] [$die_area yMin] [$die_area xMax] [$die_area yMax]]
|
|
125
|
+
set core_area [list [$core_area xMin] [$core_area yMin] [$core_area xMax] [$core_area yMax]]
|
|
126
|
+
|
|
127
|
+
set ::env(DIE_AREA) {}
|
|
128
|
+
set ::env(CORE_AREA) {}
|
|
129
|
+
|
|
130
|
+
foreach coord $die_area {
|
|
131
|
+
lappend ::env(DIE_AREA) [expr {1.0 * $coord / $::dbu}]
|
|
132
|
+
}
|
|
133
|
+
foreach coord $core_area {
|
|
134
|
+
lappend ::env(CORE_AREA) [expr {1.0 * $coord / $::dbu}]
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
puts "\[INFO\] Floorplanned on a die area of $::env(DIE_AREA) (µm)."
|
|
138
|
+
puts "\[INFO\] Floorplanned on a core area of $::env(CORE_AREA) (µm)."
|
|
139
|
+
|
|
140
|
+
source $::env(TRACKS_INFO_FILE_PROCESSED)
|
|
141
|
+
|
|
142
|
+
write_metric_str "design__die__bbox" $::env(DIE_AREA)
|
|
143
|
+
write_metric_str "design__core__bbox" $::env(CORE_AREA)
|
|
144
|
+
|
|
145
|
+
write_views
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Copyright 2020-2022 Efabless Corporation
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
|
|
15
|
+
read_current_odb
|
|
16
|
+
|
|
17
|
+
set ::insts [$::block getInsts]
|
|
18
|
+
|
|
19
|
+
set placement_needed 0
|
|
20
|
+
|
|
21
|
+
foreach inst $::insts {
|
|
22
|
+
if { ![$inst isFixed] } {
|
|
23
|
+
set placement_needed 1
|
|
24
|
+
break
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if { !$placement_needed } {
|
|
29
|
+
puts stderr "\[WARNING\] All instances are FIXED/FIRM."
|
|
30
|
+
puts stderr "\[WARNING\] No need to perform global placement."
|
|
31
|
+
puts stderr "\[WARNING\] Skipping…"
|
|
32
|
+
write_views
|
|
33
|
+
exit 0
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
set arg_list [list]
|
|
37
|
+
|
|
38
|
+
lappend arg_list -density [expr $::env(PL_TARGET_DENSITY_PCT) / 100.0]
|
|
39
|
+
|
|
40
|
+
if { [info exists ::env(PL_TIME_DRIVEN)] && $::env(PL_TIME_DRIVEN) } {
|
|
41
|
+
source $::env(SCRIPTS_DIR)/openroad/common/set_rc.tcl
|
|
42
|
+
lappend arg_list -timing_driven
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if { [info exists ::env(PL_ROUTABILITY_DRIVEN)] && $::env(PL_ROUTABILITY_DRIVEN) } {
|
|
46
|
+
source $::env(SCRIPTS_DIR)/openroad/common/set_routing_layers.tcl
|
|
47
|
+
set_macro_extension $::env(GRT_MACRO_EXTENSION)
|
|
48
|
+
source $::env(SCRIPTS_DIR)/openroad/common/set_layer_adjustments.tcl
|
|
49
|
+
lappend arg_list -routability_driven
|
|
50
|
+
if { [info exists ::env(PL_ROUTABILITY_OVERFLOW_THRESHOLD)] } {
|
|
51
|
+
lappend arg_list -routability_check_overflow $::env(PL_ROUTABILITY_OVERFLOW_THRESHOLD)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if { $::env(PL_SKIP_INITIAL_PLACEMENT) } {
|
|
56
|
+
lappend arg_list -skip_initial_place
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
if { [info exists ::env(__PL_SKIP_IO)] } {
|
|
61
|
+
lappend arg_list -skip_io
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if { [info exists ::env(PL_MIN_PHI_COEFFICIENT)] } {
|
|
65
|
+
lappend arg_list -min_phi_coef $::env(PL_MIN_PHI_COEFFICIENT)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if { [info exists ::env(PL_MAX_PHI_COEFFICIENT)] } {
|
|
69
|
+
lappend arg_list -max_phi_coef $::env(PL_MAX_PHI_COEFFICIENT)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
set cell_pad_side [expr $::env(GPL_CELL_PADDING) / 2]
|
|
73
|
+
|
|
74
|
+
lappend arg_list -pad_right $cell_pad_side
|
|
75
|
+
lappend arg_list -pad_left $cell_pad_side
|
|
76
|
+
lappend arg_list -init_wirelength_coef $::env(PL_WIRE_LENGTH_COEF)
|
|
77
|
+
|
|
78
|
+
puts "+ global_placement $arg_list"
|
|
79
|
+
global_placement {*}$arg_list
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
source $::env(SCRIPTS_DIR)/openroad/common/set_rc.tcl
|
|
83
|
+
estimate_parasitics -placement
|
|
84
|
+
|
|
85
|
+
write_views
|
|
86
|
+
|
|
87
|
+
report_design_area_metrics
|
|
88
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Copyright 2020-2023 Efabless Corporation
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
|
|
15
|
+
read_current_odb
|
|
16
|
+
source $::env(SCRIPTS_DIR)/openroad/common/dpl_cell_pad.tcl
|
|
17
|
+
|
|
18
|
+
set_propagated_clock [all_clocks]
|
|
19
|
+
|
|
20
|
+
source $::env(SCRIPTS_DIR)/openroad/common/grt.tcl
|
|
21
|
+
|
|
22
|
+
# Check Antennas (Pre-Repair)
|
|
23
|
+
puts "%OL_CREATE_REPORT antenna.rpt"
|
|
24
|
+
check_antennas -verbose
|
|
25
|
+
puts "%OL_END_REPORT"
|
|
26
|
+
|
|
27
|
+
source $::env(SCRIPTS_DIR)/openroad/common/set_rc.tcl
|
|
28
|
+
estimate_parasitics -global_routing
|
|
29
|
+
|
|
30
|
+
write_views
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Copyright 2022 Efabless Corporation
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
|
|
15
|
+
read_current_odb
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# Copyright 2021 The University of Michigan
|
|
2
|
+
# Copyright 2022 Efabless Corporation
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
proc insert_buffer {pin_name pin_type master_name net_name inst_name} {
|
|
17
|
+
set db [ord::get_db]
|
|
18
|
+
set block [ord::get_db_block]
|
|
19
|
+
|
|
20
|
+
# Create buffer instance
|
|
21
|
+
set master [$db findMaster $master_name]
|
|
22
|
+
if { $master == "NULL" } {
|
|
23
|
+
puts "Buffer cell '$master' not found."
|
|
24
|
+
exit -1
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
set inst [odb::dbInst_create $block $master $inst_name]
|
|
28
|
+
|
|
29
|
+
# Figure out the inputs & outputs of the master
|
|
30
|
+
foreach mterm [$master getMTerms] {
|
|
31
|
+
if {[$mterm getSigType] == "POWER"} {
|
|
32
|
+
continue
|
|
33
|
+
}
|
|
34
|
+
if {[$mterm getSigType] == "GROUND"} {
|
|
35
|
+
continue
|
|
36
|
+
}
|
|
37
|
+
if {[$mterm getIoType] == "INPUT"} {
|
|
38
|
+
set input $mterm
|
|
39
|
+
}
|
|
40
|
+
if {[$mterm getIoType] == "OUTPUT"} {
|
|
41
|
+
set output $mterm
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
# New net to connect to
|
|
46
|
+
set new_net [odb::dbNet_create $block $net_name]
|
|
47
|
+
|
|
48
|
+
if {$pin_type=="ITerm"} {
|
|
49
|
+
# Finding the block with pin name
|
|
50
|
+
set iterm [$block findITerm $pin_name]
|
|
51
|
+
if { $iterm == "NULL" } {
|
|
52
|
+
puts "Instance terminal '$pin_name' not found."
|
|
53
|
+
exit -1
|
|
54
|
+
}
|
|
55
|
+
set old_net [$iterm getNet]
|
|
56
|
+
|
|
57
|
+
# Original disconnect command
|
|
58
|
+
odb::dbITerm_disconnect $iterm
|
|
59
|
+
|
|
60
|
+
# Original connect command
|
|
61
|
+
odb::dbITerm_connect $iterm $new_net
|
|
62
|
+
|
|
63
|
+
# Set I/O of iterm (Buffer)
|
|
64
|
+
set in_iterm [$inst getITerm $input]
|
|
65
|
+
set out_iterm [$inst getITerm $output]
|
|
66
|
+
|
|
67
|
+
if { ![info exists ::env(INSERT_BUFFER_NO_PLACE)] } {
|
|
68
|
+
# define the instance to which the buffer inserted will connected to
|
|
69
|
+
set master_inst [$iterm getInst]
|
|
70
|
+
# get the geometry of the instance, geometry means its shape, the coordinate of its vertex…
|
|
71
|
+
set box [$master_inst getBBox]
|
|
72
|
+
|
|
73
|
+
# get the position of the lower left point of this instance
|
|
74
|
+
set x_min [$box xMin]
|
|
75
|
+
set y_min [$box yMin]
|
|
76
|
+
|
|
77
|
+
# $inst is the buffer we want to insert, now insert it in the position of the instance it is connected to,
|
|
78
|
+
# using setLocation, and detail_place will help us separate them
|
|
79
|
+
[$inst setLocation $x_min $y_min]
|
|
80
|
+
[$inst setPlacementStatus PLACED]
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
odb::dbITerm_connect $in_iterm $new_net
|
|
84
|
+
odb::dbITerm_connect $out_iterm $old_net
|
|
85
|
+
|
|
86
|
+
} else {
|
|
87
|
+
# Finding the block with pin name
|
|
88
|
+
set bterm [$block findBTerm $pin_name]
|
|
89
|
+
set old_net [$bterm getNet]
|
|
90
|
+
set net_out_iterm [odb::dbNet_get1stITerm $old_net]
|
|
91
|
+
set old_net_inst [$net_out_iterm getInst]
|
|
92
|
+
set net_mterm [$net_out_iterm getMTerm]
|
|
93
|
+
set old_net_input $net_mterm
|
|
94
|
+
odb::dbITerm_disconnect $net_out_iterm
|
|
95
|
+
|
|
96
|
+
if { ![info exists ::env(INSERT_BUFFER_NO_PLACE)] } {
|
|
97
|
+
set box [$bterm getBBox]
|
|
98
|
+
|
|
99
|
+
# get the position of the lower left point of this instance
|
|
100
|
+
set x_min [$box xMin]
|
|
101
|
+
set y_min [$box yMin]
|
|
102
|
+
|
|
103
|
+
# $inst is the buffer we want to insert, now insert it in the position of the instance it is connected to,
|
|
104
|
+
# using setLocation, and detail_place will help us separate them
|
|
105
|
+
[$inst setLocation $x_min $y_min]
|
|
106
|
+
[$inst setPlacementStatus PLACED]
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
# Find output/input of buffer iterm
|
|
110
|
+
set in_iterm [$inst getITerm $input]
|
|
111
|
+
set out_iterm [$inst getITerm $output]
|
|
112
|
+
|
|
113
|
+
odb::dbITerm_connect $out_iterm $new_net
|
|
114
|
+
odb::dbITerm_connect $net_out_iterm $new_net
|
|
115
|
+
odb::dbITerm_connect $in_iterm $old_net
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if { [info exists ::env(INSERT_BUFFER_COMMAND) ]} {
|
|
120
|
+
source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
|
|
121
|
+
read_current_odb
|
|
122
|
+
|
|
123
|
+
set arg_list [split $::env(INSERT_BUFFER_COMMAND) " "]
|
|
124
|
+
insert_buffer {*}$arg_list
|
|
125
|
+
|
|
126
|
+
write_views
|
|
127
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Copyright 2020-2022 Efabless Corporation
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
|
|
15
|
+
read_current_odb
|
|
16
|
+
|
|
17
|
+
if { [info exists ::env(CONTEXTUAL_IO_FLAG)] } {
|
|
18
|
+
read_lef $::env(placement_tmpfiles)/top_level.lef
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if { [info exists ::env(FP_IO_HLENGTH)] } {
|
|
22
|
+
set_pin_length -hor_length $::env(FP_IO_HLENGTH)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if { [info exists ::env(FP_IO_VLENGTH)] } {
|
|
26
|
+
set_pin_length -ver_length $::env(FP_IO_VLENGTH)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if { $::env(FP_IO_HEXTEND) != "0"} {
|
|
30
|
+
set_pin_length_extension -hor_extension $::env(FP_IO_HEXTEND)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if { $::env(FP_IO_VEXTEND) != "0"} {
|
|
34
|
+
set_pin_length_extension -ver_extension $::env(FP_IO_VEXTEND)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if {$::env(FP_IO_VTHICKNESS_MULT) != "" && $::env(FP_IO_HTHICKNESS_MULT) != ""} {
|
|
38
|
+
set_pin_thick_multiplier -hor_multiplier $::env(FP_IO_HTHICKNESS_MULT) \
|
|
39
|
+
-ver_multiplier $::env(FP_IO_VTHICKNESS_MULT)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
set arg_list [list]
|
|
43
|
+
if { $::env(FP_PPL_MODE) == "random_equidistant" } {
|
|
44
|
+
lappend arg_list -random
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if { [info exists ::env(FP_IO_MIN_DISTANCE)] } {
|
|
48
|
+
lappend arg_list -min_distance $::env(FP_IO_MIN_DISTANCE)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if { $::env(FP_PPL_MODE) == "annealing" } {
|
|
52
|
+
lappend arg_list -annealing
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
set HMETAL $::env(FP_IO_HLAYER)
|
|
56
|
+
set VMETAL $::env(FP_IO_VLAYER)
|
|
57
|
+
|
|
58
|
+
puts "\[INFO\] place_pins args: $arg_list"
|
|
59
|
+
place_pins {*}$arg_list \
|
|
60
|
+
-random_seed 42 \
|
|
61
|
+
-hor_layers $HMETAL \
|
|
62
|
+
-ver_layers $VMETAL
|
|
63
|
+
|
|
64
|
+
write_views
|
|
65
|
+
|
|
66
|
+
report_design_area_metrics
|
|
67
|
+
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Copyright 2022 Efabless Corporation
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
|
|
15
|
+
|
|
16
|
+
read_current_odb
|
|
17
|
+
|
|
18
|
+
source $::env(SCRIPTS_DIR)/openroad/common/set_power_nets.tcl
|
|
19
|
+
source $::env(SCRIPTS_DIR)/openroad/common/set_rc.tcl
|
|
20
|
+
|
|
21
|
+
read_spef $::env(CURRENT_SPEF_DEFAULT_CORNER)
|
|
22
|
+
|
|
23
|
+
if { [info exists ::env(VSRC_LOC_FILES)] } {
|
|
24
|
+
puts "%OL_CREATE_REPORT irdrop.rpt"
|
|
25
|
+
foreach {net vsrc_file} "$::env(VSRC_LOC_FILES)" {
|
|
26
|
+
set arg_list [list]
|
|
27
|
+
lappend arg_list -net $net
|
|
28
|
+
lappend arg_list -voltage_file $::env(STEP_DIR)/net-$net.csv
|
|
29
|
+
lappend arg_list -vsrc $vsrc_file
|
|
30
|
+
analyze_power_grid {*}$arg_list
|
|
31
|
+
}
|
|
32
|
+
puts "%OL_END_REPORT"
|
|
33
|
+
} else {
|
|
34
|
+
puts "\[INFO\] Using voltage extracted from lib ($::env(LIB_VOLTAGE)V) for power nets and 0V for ground nets…"
|
|
35
|
+
puts "%OL_CREATE_REPORT irdrop.rpt"
|
|
36
|
+
foreach net "$::env(VDD_NETS)" {
|
|
37
|
+
set arg_list [list]
|
|
38
|
+
lappend arg_list -net $net
|
|
39
|
+
lappend arg_list -voltage_file $::env(STEP_DIR)/net-$net.csv
|
|
40
|
+
set_pdnsim_net_voltage -net $net -voltage $::env(LIB_VOLTAGE)
|
|
41
|
+
analyze_power_grid {*}$arg_list
|
|
42
|
+
}
|
|
43
|
+
foreach net "$::env(GND_NETS)" {
|
|
44
|
+
set arg_list [list]
|
|
45
|
+
lappend arg_list -net $net
|
|
46
|
+
lappend arg_list -voltage_file $::env(STEP_DIR)/net-$net.csv
|
|
47
|
+
set_pdnsim_net_voltage -net $net -voltage 0
|
|
48
|
+
analyze_power_grid {*}$arg_list
|
|
49
|
+
}
|
|
50
|
+
puts "%OL_END_REPORT"
|
|
51
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Copyright 2020-2022 Efabless Corporation
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#
|
|
15
|
+
source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
|
|
16
|
+
read_current_odb
|
|
17
|
+
|
|
18
|
+
source $::env(SCRIPTS_DIR)/openroad/common/set_power_nets.tcl
|
|
19
|
+
|
|
20
|
+
# load the grid definitions
|
|
21
|
+
read_pdn_cfg
|
|
22
|
+
|
|
23
|
+
set arg_list [list]
|
|
24
|
+
if { $::env(FP_PDN_SKIPTRIM) } {
|
|
25
|
+
lappend arg_list -skip_trim
|
|
26
|
+
puts "adding -skip_trim to pdngen"
|
|
27
|
+
}
|
|
28
|
+
# run PDNGEN
|
|
29
|
+
if {[catch {pdngen {*}$arg_list} errmsg]} {
|
|
30
|
+
puts stderr $errmsg
|
|
31
|
+
exit 1
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
write_views
|
|
35
|
+
report_design_area_metrics
|
|
36
|
+
|
|
37
|
+
foreach {net} "$::env(VDD_NETS) $::env(GND_NETS)" {
|
|
38
|
+
set report_file $::env(STEP_DIR)/$net-grid-errors.rpt
|
|
39
|
+
|
|
40
|
+
# For some reason, check_power_grid is… totally okay if no nodes are found
|
|
41
|
+
# at all. i.e. PDN generation has completely failed.
|
|
42
|
+
# This is a fallback file.
|
|
43
|
+
set f [open $report_file "w"]
|
|
44
|
+
puts $f "violation type: no nodes"
|
|
45
|
+
puts $f " srcs: "
|
|
46
|
+
puts $f " - N/A"
|
|
47
|
+
close $f
|
|
48
|
+
|
|
49
|
+
if { [catch {check_power_grid -net $net -error_file $report_file} err] } {
|
|
50
|
+
puts stderr "\[WARNING\] Grid check for $net failed: $err"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Copyright 2020-2022 Efabless Corporation
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
|
|
15
|
+
read_lefs "RCX_LEF"
|
|
16
|
+
read_def $::env(CURRENT_DEF)
|
|
17
|
+
set_global_vars
|
|
18
|
+
|
|
19
|
+
set_propagated_clock [all_clocks]
|
|
20
|
+
|
|
21
|
+
set rcx_flags ""
|
|
22
|
+
if { !$::env(RCX_MERGE_VIA_WIRE_RES) } {
|
|
23
|
+
set rcx_flags "-no_merge_via_res"
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
# RCX
|
|
27
|
+
puts "Using RCX ruleset '$::env(RCX_RULESET)'…"
|
|
28
|
+
define_process_corner -ext_model_index 0 CURRENT_CORNER
|
|
29
|
+
extract_parasitics $rcx_flags\
|
|
30
|
+
-ext_model_file $::env(RCX_RULESET)\
|
|
31
|
+
-lef_res
|
|
32
|
+
write_views
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Copyright 2020-2023 Efabless Corporation
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
|
|
15
|
+
source $::env(SCRIPTS_DIR)/openroad/common/resizer.tcl
|
|
16
|
+
|
|
17
|
+
load_rsz_corners
|
|
18
|
+
read_current_odb
|
|
19
|
+
|
|
20
|
+
unset_propagated_clock [all_clocks]
|
|
21
|
+
|
|
22
|
+
set_dont_touch_objects
|
|
23
|
+
|
|
24
|
+
# set rc values
|
|
25
|
+
source $::env(SCRIPTS_DIR)/openroad/common/set_rc.tcl
|
|
26
|
+
|
|
27
|
+
# CTS and detailed placement move instances, so update parastic estimates.
|
|
28
|
+
# estimate wire rc parasitics
|
|
29
|
+
estimate_parasitics -placement
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# Buffer I/O
|
|
33
|
+
if { $::env(DESIGN_REPAIR_REMOVE_BUFFERS) } {
|
|
34
|
+
remove_buffers
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if { $::env(DESIGN_REPAIR_BUFFER_INPUT_PORTS) } {
|
|
38
|
+
buffer_ports -inputs
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if { $::env(DESIGN_REPAIR_BUFFER_OUTPUT_PORTS) } {
|
|
42
|
+
buffer_ports -outputs
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
# Repair Design
|
|
46
|
+
repair_design -verbose \
|
|
47
|
+
-max_wire_length $::env(DESIGN_REPAIR_MAX_WIRE_LENGTH) \
|
|
48
|
+
-slew_margin $::env(DESIGN_REPAIR_MAX_SLEW_PCT) \
|
|
49
|
+
-cap_margin $::env(DESIGN_REPAIR_MAX_CAP_PCT)
|
|
50
|
+
|
|
51
|
+
if { $::env(DESIGN_REPAIR_TIE_FANOUT) } {
|
|
52
|
+
# repair tie lo fanout
|
|
53
|
+
repair_tie_fanout -separation $::env(DESIGN_REPAIR_TIE_SEPARATION) $::env(SYNTH_TIELO_CELL)
|
|
54
|
+
# repair tie hi fanout
|
|
55
|
+
repair_tie_fanout -separation $::env(DESIGN_REPAIR_TIE_SEPARATION) $::env(SYNTH_TIEHI_CELL)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
report_floating_nets -verbose
|
|
59
|
+
|
|
60
|
+
# Legalize
|
|
61
|
+
source $::env(SCRIPTS_DIR)/openroad/common/dpl.tcl
|
|
62
|
+
|
|
63
|
+
unset_dont_touch_objects
|
|
64
|
+
|
|
65
|
+
source $::env(SCRIPTS_DIR)/openroad/common/set_rc.tcl
|
|
66
|
+
estimate_parasitics -placement
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
write_views
|
|
70
|
+
|