librelane 2.4.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.
Potentially problematic release.
This version of librelane might be problematic. Click here for more details.
- librelane/__init__.py +38 -0
- librelane/__main__.py +479 -0
- librelane/__version__.py +43 -0
- librelane/common/__init__.py +63 -0
- librelane/common/cli.py +75 -0
- librelane/common/drc.py +246 -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 +456 -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 +116 -0
- librelane/config/__init__.py +32 -0
- librelane/config/__main__.py +155 -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 +743 -0
- librelane/container.py +285 -0
- librelane/env_info.py +320 -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 +327 -0
- librelane/flows/cli.py +463 -0
- librelane/flows/flow.py +1049 -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/help/__main__.py +39 -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 +79 -0
- librelane/scripts/magic/drc.tcl +78 -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 +45 -0
- librelane/scripts/magic/gds/mag_with_pointers.tcl +31 -0
- librelane/scripts/magic/get_bbox.tcl +11 -0
- librelane/scripts/magic/lef/extras_maglef.tcl +61 -0
- librelane/scripts/magic/lef/maglef.tcl +26 -0
- librelane/scripts/magic/lef.tcl +57 -0
- librelane/scripts/magic/open.tcl +28 -0
- librelane/scripts/magic/wrapper.tcl +21 -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 +573 -0
- librelane/scripts/odbpy/diodes.py +373 -0
- librelane/scripts/odbpy/disconnected_pins.py +305 -0
- librelane/scripts/odbpy/eco_buffer.py +181 -0
- librelane/scripts/odbpy/eco_diode.py +139 -0
- librelane/scripts/odbpy/filter_unannotated.py +100 -0
- librelane/scripts/odbpy/io_place.py +482 -0
- librelane/scripts/odbpy/ioplace_parser/__init__.py +23 -0
- librelane/scripts/odbpy/ioplace_parser/parse.py +147 -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 +397 -0
- librelane/scripts/odbpy/random_place.py +57 -0
- librelane/scripts/odbpy/reader.py +250 -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 +540 -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 +37 -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 +195 -0
- librelane/state/state.py +359 -0
- librelane/steps/__init__.py +61 -0
- librelane/steps/__main__.py +510 -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 +576 -0
- librelane/steps/misc.py +160 -0
- librelane/steps/netgen.py +253 -0
- librelane/steps/odb.py +1088 -0
- librelane/steps/openroad.py +2460 -0
- librelane/steps/openroad_alerts.py +102 -0
- librelane/steps/pyosys.py +640 -0
- librelane/steps/step.py +1571 -0
- librelane/steps/tclstep.py +288 -0
- librelane/steps/verilator.py +222 -0
- librelane/steps/yosys.py +371 -0
- librelane-2.4.0.dist-info/METADATA +169 -0
- librelane-2.4.0.dist-info/RECORD +170 -0
- librelane-2.4.0.dist-info/WHEEL +4 -0
- librelane-2.4.0.dist-info/entry_points.txt +9 -0
|
@@ -0,0 +1,393 @@
|
|
|
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
|
+
|
|
15
|
+
# This file supports one defined corner per-process.
|
|
16
|
+
# Any more defined corners will be ignored.
|
|
17
|
+
# Aggregation is left to the LibreLane step.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
|
|
21
|
+
|
|
22
|
+
set_cmd_units\
|
|
23
|
+
-time ns\
|
|
24
|
+
-capacitance pF\
|
|
25
|
+
-current mA\
|
|
26
|
+
-voltage V\
|
|
27
|
+
-resistance kOhm\
|
|
28
|
+
-distance um
|
|
29
|
+
|
|
30
|
+
set sta_report_default_digits 6
|
|
31
|
+
|
|
32
|
+
if { [namespace exists ::ord] } {
|
|
33
|
+
read_current_odb
|
|
34
|
+
source $::env(SCRIPTS_DIR)/openroad/common/set_rc.tcl
|
|
35
|
+
|
|
36
|
+
# Internal API- brittle
|
|
37
|
+
if { [grt::have_routes] } {
|
|
38
|
+
estimate_parasitics -global_routing
|
|
39
|
+
} elseif { [rsz::check_corner_wire_cap] } {
|
|
40
|
+
estimate_parasitics -placement
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
read_timing_info
|
|
44
|
+
}
|
|
45
|
+
read_spefs
|
|
46
|
+
|
|
47
|
+
set corner [lindex [sta::corners] 0]
|
|
48
|
+
sta::set_cmd_corner $corner
|
|
49
|
+
|
|
50
|
+
set clocks [sta::sort_by_name [sta::all_clocks]]
|
|
51
|
+
|
|
52
|
+
puts "%OL_CREATE_REPORT min.rpt"
|
|
53
|
+
puts "\n==========================================================================="
|
|
54
|
+
puts "report_checks -path_delay min (Hold)"
|
|
55
|
+
puts "============================================================================"
|
|
56
|
+
puts "======================= [$corner name] Corner ===================================\n"
|
|
57
|
+
report_checks -sort_by_slack -path_delay min -fields {slew cap input nets fanout} -format full_clock_expanded -group_count 1000 -corner [$corner name]
|
|
58
|
+
puts ""
|
|
59
|
+
puts "%OL_END_REPORT"
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
puts "%OL_CREATE_REPORT max.rpt"
|
|
63
|
+
puts "\n==========================================================================="
|
|
64
|
+
puts "report_checks -path_delay max (Setup)"
|
|
65
|
+
puts "============================================================================"
|
|
66
|
+
puts "======================= [$corner name] Corner ===================================\n"
|
|
67
|
+
report_checks -sort_by_slack -path_delay max -fields {slew cap input nets fanout} -format full_clock_expanded -group_count 1000 -corner [$corner name]
|
|
68
|
+
puts ""
|
|
69
|
+
puts "%OL_END_REPORT"
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
puts "%OL_CREATE_REPORT checks.rpt"
|
|
73
|
+
puts "\n==========================================================================="
|
|
74
|
+
puts "report_checks -unconstrained"
|
|
75
|
+
puts "==========================================================================="
|
|
76
|
+
puts "======================= [$corner name] Corner ===================================\n"
|
|
77
|
+
report_checks -unconstrained -fields {slew cap input nets fanout} -format full_clock_expanded -corner [$corner name]
|
|
78
|
+
puts ""
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
puts "\n==========================================================================="
|
|
82
|
+
puts "report_checks --slack_max -0.01"
|
|
83
|
+
puts "============================================================================"
|
|
84
|
+
puts "======================= [$corner name] Corner ===================================\n"
|
|
85
|
+
report_checks -slack_max -0.01 -fields {slew cap input nets fanout} -format full_clock_expanded -corner [$corner name]
|
|
86
|
+
puts ""
|
|
87
|
+
|
|
88
|
+
puts "\n==========================================================================="
|
|
89
|
+
puts " report_check_types -max_slew -max_cap -max_fanout -violators"
|
|
90
|
+
puts "============================================================================"
|
|
91
|
+
puts "======================= [$corner name] Corner ===================================\n"
|
|
92
|
+
report_check_types -max_slew -max_capacitance -max_fanout -violators -corner [$corner name]
|
|
93
|
+
puts ""
|
|
94
|
+
|
|
95
|
+
puts "\n==========================================================================="
|
|
96
|
+
puts "report_parasitic_annotation -report_unannotated"
|
|
97
|
+
puts "============================================================================"
|
|
98
|
+
report_parasitic_annotation -report_unannotated
|
|
99
|
+
|
|
100
|
+
puts "\n==========================================================================="
|
|
101
|
+
puts "max slew violation count [sta::max_slew_violation_count]"
|
|
102
|
+
write_metric_int "design__max_slew_violation__count__corner:[$corner name]" [sta::max_slew_violation_count]
|
|
103
|
+
puts "max fanout violation count [sta::max_fanout_violation_count]"
|
|
104
|
+
write_metric_int "design__max_fanout_violation__count__corner:[$corner name]" [sta::max_fanout_violation_count]
|
|
105
|
+
puts "max cap violation count [sta::max_capacitance_violation_count]"
|
|
106
|
+
write_metric_int "design__max_cap_violation__count__corner:[$corner name]" [sta::max_capacitance_violation_count]
|
|
107
|
+
puts "============================================================================"
|
|
108
|
+
|
|
109
|
+
puts "\n==========================================================================="
|
|
110
|
+
puts "check_setup -verbose -unconstrained_endpoints -multiple_clock -no_clock -no_input_delay -loops -generated_clocks"
|
|
111
|
+
puts "==========================================================================="
|
|
112
|
+
check_setup -verbose -unconstrained_endpoints -multiple_clock -no_clock -no_input_delay -loops -generated_clocks
|
|
113
|
+
puts "%OL_END_REPORT"
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
puts "%OL_CREATE_REPORT power.rpt"
|
|
118
|
+
puts "\n==========================================================================="
|
|
119
|
+
puts " report_power"
|
|
120
|
+
puts "============================================================================"
|
|
121
|
+
puts "======================= [$corner name] Corner ===================================\n"
|
|
122
|
+
report_power -corner [$corner name]
|
|
123
|
+
|
|
124
|
+
set power_result [sta::design_power $corner]
|
|
125
|
+
set totals [lrange $power_result 0 3]
|
|
126
|
+
lassign $totals design_internal design_switching design_leakage design_total
|
|
127
|
+
|
|
128
|
+
write_metric_num "power__internal__total" $design_internal
|
|
129
|
+
write_metric_num "power__switching__total" $design_switching
|
|
130
|
+
write_metric_num "power__leakage__total" $design_leakage
|
|
131
|
+
write_metric_num "power__total" $design_total
|
|
132
|
+
|
|
133
|
+
puts ""
|
|
134
|
+
puts "%OL_END_REPORT"
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
puts "%OL_CREATE_REPORT skew.min.rpt"
|
|
138
|
+
puts "\n==========================================================================="
|
|
139
|
+
puts "Clock Skew (Hold)"
|
|
140
|
+
puts "============================================================================"
|
|
141
|
+
set skew_corner [worst_clock_skew -hold]
|
|
142
|
+
write_metric_num "clock__skew__worst_hold__corner:[$corner name]" $skew_corner
|
|
143
|
+
|
|
144
|
+
puts "======================= [$corner name] Corner ===================================\n"
|
|
145
|
+
report_clock_skew -corner [$corner name] -hold
|
|
146
|
+
|
|
147
|
+
puts "%OL_END_REPORT"
|
|
148
|
+
|
|
149
|
+
puts "%OL_CREATE_REPORT skew.max.rpt"
|
|
150
|
+
puts "\n==========================================================================="
|
|
151
|
+
puts "Clock Skew (Setup)"
|
|
152
|
+
puts "============================================================================"
|
|
153
|
+
set skew_corner [worst_clock_skew -setup]
|
|
154
|
+
write_metric_num "clock__skew__worst_setup__corner:[$corner name]" $skew_corner
|
|
155
|
+
|
|
156
|
+
puts "======================= [$corner name] Corner ===================================\n"
|
|
157
|
+
report_clock_skew -corner [$corner name] -setup
|
|
158
|
+
|
|
159
|
+
puts "%OL_END_REPORT"
|
|
160
|
+
|
|
161
|
+
puts "%OL_CREATE_REPORT ws.min.rpt"
|
|
162
|
+
puts "\n==========================================================================="
|
|
163
|
+
puts "Worst Slack (Hold)"
|
|
164
|
+
puts "============================================================================"
|
|
165
|
+
set ws [worst_slack -corner [$corner name] -min]
|
|
166
|
+
write_metric_num "timing__hold__ws__corner:[$corner name]" $ws
|
|
167
|
+
puts "[$corner name]: $ws"
|
|
168
|
+
puts "%OL_END_REPORT"
|
|
169
|
+
|
|
170
|
+
puts "%OL_CREATE_REPORT ws.max.rpt"
|
|
171
|
+
puts "\n==========================================================================="
|
|
172
|
+
puts "Worst Slack (Setup)"
|
|
173
|
+
puts "============================================================================"
|
|
174
|
+
|
|
175
|
+
set ws [worst_slack -corner [$corner name] -max]
|
|
176
|
+
write_metric_num "timing__setup__ws__corner:[$corner name]" $ws
|
|
177
|
+
puts "[$corner name]: $ws"
|
|
178
|
+
puts "%OL_END_REPORT"
|
|
179
|
+
|
|
180
|
+
puts "%OL_CREATE_REPORT tns.min.rpt"
|
|
181
|
+
puts "\n==========================================================================="
|
|
182
|
+
puts "Total Negative Slack (Hold)"
|
|
183
|
+
puts "============================================================================"
|
|
184
|
+
|
|
185
|
+
set tns [total_negative_slack -corner [$corner name] -min]
|
|
186
|
+
write_metric_num "timing__hold__tns__corner:[$corner name]" $tns
|
|
187
|
+
puts "[$corner name]: $tns"
|
|
188
|
+
puts "%OL_END_REPORT"
|
|
189
|
+
|
|
190
|
+
puts "%OL_CREATE_REPORT tns.max.rpt"
|
|
191
|
+
puts "\n==========================================================================="
|
|
192
|
+
puts "Total Negative Slack (Setup)"
|
|
193
|
+
puts "============================================================================"
|
|
194
|
+
set tns [total_negative_slack -corner [$corner name] -max]
|
|
195
|
+
write_metric_num "timing__setup__tns__corner:[$corner name]" $tns
|
|
196
|
+
puts "[$corner name]: $tns"
|
|
197
|
+
puts "%OL_END_REPORT"
|
|
198
|
+
|
|
199
|
+
puts "%OL_CREATE_REPORT wns.min.rpt"
|
|
200
|
+
puts "\n==========================================================================="
|
|
201
|
+
puts "Worst Negative Slack (Hold)"
|
|
202
|
+
puts "============================================================================"
|
|
203
|
+
|
|
204
|
+
set ws [worst_slack -corner [$corner name] -min]
|
|
205
|
+
set wns 0
|
|
206
|
+
if { $ws < 0 } {
|
|
207
|
+
set wns $ws
|
|
208
|
+
}
|
|
209
|
+
write_metric_num "timing__hold__wns__corner:[$corner name]" $wns
|
|
210
|
+
puts "[$corner name]: $wns"
|
|
211
|
+
puts "%OL_END_REPORT"
|
|
212
|
+
|
|
213
|
+
puts "%OL_CREATE_REPORT wns.max.rpt"
|
|
214
|
+
puts "\n==========================================================================="
|
|
215
|
+
puts "Worst Negative Slack (Setup)"
|
|
216
|
+
puts "============================================================================"
|
|
217
|
+
|
|
218
|
+
set ws [worst_slack -corner [$corner name] -max]
|
|
219
|
+
set wns 0.0
|
|
220
|
+
if { $ws < 0 } {
|
|
221
|
+
set wns $ws
|
|
222
|
+
}
|
|
223
|
+
write_metric_num "timing__setup__wns__corner:[$corner name]" $wns
|
|
224
|
+
puts "[$corner name]: $wns"
|
|
225
|
+
puts "%OL_END_REPORT"
|
|
226
|
+
|
|
227
|
+
proc check_if_terminal {pin_object} {
|
|
228
|
+
set net [get_nets -of_object $pin_object]
|
|
229
|
+
if { "$net" == "NULL" } {
|
|
230
|
+
return 1
|
|
231
|
+
}
|
|
232
|
+
return 0
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
proc get_path_kind {start_pin end_pin} {
|
|
236
|
+
set from "reg"
|
|
237
|
+
set to "reg"
|
|
238
|
+
|
|
239
|
+
if { [check_if_terminal $start_pin] } {
|
|
240
|
+
set from "in"
|
|
241
|
+
}
|
|
242
|
+
if { [check_if_terminal $end_pin] } {
|
|
243
|
+
set to "out"
|
|
244
|
+
}
|
|
245
|
+
return "$from-$to"
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
puts "%OL_CREATE_REPORT violator_list.rpt"
|
|
249
|
+
puts "\n==========================================================================="
|
|
250
|
+
puts "Violator List"
|
|
251
|
+
puts "============================================================================"
|
|
252
|
+
|
|
253
|
+
set total_hold_vios 0
|
|
254
|
+
set r2r_hold_vios 0
|
|
255
|
+
set total_setup_vios 0
|
|
256
|
+
set r2r_setup_vios 0
|
|
257
|
+
|
|
258
|
+
set max_violator_count 999999999
|
|
259
|
+
if { [info exists ::env(STA_MAX_VIOLATOR_COUNT)] } {
|
|
260
|
+
set max_violator_count $::env(STA_MAX_VIOLATOR_COUNT)
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
set hold_violating_paths [find_timing_paths -unique_paths_to_endpoint -path_delay min -sort_by_slack -group_count $max_violator_count -slack_max 0]
|
|
264
|
+
foreach path $hold_violating_paths {
|
|
265
|
+
set start_pin [get_property $path startpoint]
|
|
266
|
+
set end_pin [get_property $path endpoint]
|
|
267
|
+
set kind "[get_path_kind $start_pin $end_pin]"
|
|
268
|
+
set slack [get_property $path slack]
|
|
269
|
+
|
|
270
|
+
if { $slack >= 0 } {
|
|
271
|
+
continue
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
incr total_hold_vios
|
|
275
|
+
if { "$kind" == "reg-reg" } {
|
|
276
|
+
incr r2r_hold_vios
|
|
277
|
+
}
|
|
278
|
+
puts "\[hold $kind] [get_property $start_pin full_name] -> [get_property $end_pin full_name] : [get_property $path slack]"
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
set worst_r2r_hold_slack 1e30
|
|
282
|
+
set hold_paths [find_timing_paths -unique_paths_to_endpoint -path_delay min -sort_by_slack -group_count $max_violator_count -slack_max $worst_r2r_hold_slack]
|
|
283
|
+
foreach path $hold_paths {
|
|
284
|
+
set start_pin [get_property $path startpoint]
|
|
285
|
+
set end_pin [get_property $path endpoint]
|
|
286
|
+
set kind "[get_path_kind $start_pin $end_pin]"
|
|
287
|
+
set slack [get_property $path slack]
|
|
288
|
+
|
|
289
|
+
if { "$kind" == "reg-reg" } {
|
|
290
|
+
set slack [get_property $path slack]
|
|
291
|
+
|
|
292
|
+
if { $slack < $worst_r2r_hold_slack } {
|
|
293
|
+
set worst_r2r_hold_slack $slack
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
set setup_violating_paths [find_timing_paths -unique_paths_to_endpoint -path_delay max -sort_by_slack -group_count $max_violator_count -slack_max 0]
|
|
299
|
+
foreach path $setup_violating_paths {
|
|
300
|
+
set start_pin [get_property $path startpoint]
|
|
301
|
+
set end_pin [get_property $path endpoint]
|
|
302
|
+
set kind "[get_path_kind $start_pin $end_pin]"
|
|
303
|
+
set slack [get_property $path slack]
|
|
304
|
+
|
|
305
|
+
if { $slack >= 0 } {
|
|
306
|
+
continue
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
incr total_setup_vios
|
|
310
|
+
if { "$kind" == "reg-reg" } {
|
|
311
|
+
incr r2r_setup_vios
|
|
312
|
+
}
|
|
313
|
+
puts "\[setup $kind] [get_property $start_pin full_name] -> [get_property $end_pin full_name] : [get_property $path slack]"
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
set worst_r2r_setup_slack 1e30
|
|
317
|
+
set setup_paths [find_timing_paths -unique_paths_to_endpoint -path_delay max -sort_by_slack -group_count $max_violator_count -slack_max $worst_r2r_setup_slack]
|
|
318
|
+
foreach path $setup_paths {
|
|
319
|
+
set start_pin [get_property $path startpoint]
|
|
320
|
+
set end_pin [get_property $path endpoint]
|
|
321
|
+
set kind "[get_path_kind $start_pin $end_pin]"
|
|
322
|
+
set slack [get_property $path slack]
|
|
323
|
+
|
|
324
|
+
if { "$kind" == "reg-reg" } {
|
|
325
|
+
set slack [get_property $path slack]
|
|
326
|
+
if { $slack < $worst_r2r_setup_slack } {
|
|
327
|
+
set worst_r2r_setup_slack $slack
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
write_metric_int "timing__hold_vio__count__corner:[$corner name]" $total_hold_vios
|
|
333
|
+
write_metric_num "timing__hold_r2r__ws__corner:[$corner name]" $worst_r2r_hold_slack
|
|
334
|
+
write_metric_int "timing__hold_r2r_vio__count__corner:[$corner name]" $r2r_hold_vios
|
|
335
|
+
write_metric_int "timing__setup_vio__count__corner:[$corner name]" $total_setup_vios
|
|
336
|
+
write_metric_num "timing__setup_r2r__ws__corner:[$corner name]" $worst_r2r_setup_slack
|
|
337
|
+
write_metric_int "timing__setup_r2r_vio__count__corner:[$corner name]" $r2r_setup_vios
|
|
338
|
+
puts "%OL_END_REPORT"
|
|
339
|
+
|
|
340
|
+
puts "%OL_CREATE_REPORT unpropagated.rpt"
|
|
341
|
+
|
|
342
|
+
foreach clock [all_clocks] {
|
|
343
|
+
if { ![get_property $clock is_propagated] } {
|
|
344
|
+
puts "[get_property $clock full_name]"
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
puts "%OL_END_REPORT"
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
puts "%OL_CREATE_REPORT clock.rpt"
|
|
352
|
+
|
|
353
|
+
foreach clock [all_clocks] {
|
|
354
|
+
set source_names ""
|
|
355
|
+
set is_generated "no"
|
|
356
|
+
set is_virtual "no"
|
|
357
|
+
set is_propagated "no"
|
|
358
|
+
foreach source [get_property $clock sources] {
|
|
359
|
+
set source_names "[get_property $source full_name] $source_names"
|
|
360
|
+
}
|
|
361
|
+
if { [get_property $clock is_generated] } {
|
|
362
|
+
set is_generated "yes"
|
|
363
|
+
}
|
|
364
|
+
if { [get_property $clock is_virtual] } {
|
|
365
|
+
set is_virtual "yes"
|
|
366
|
+
}
|
|
367
|
+
if { [get_property $clock is_propagated] } {
|
|
368
|
+
set is_virtual "yes"
|
|
369
|
+
}
|
|
370
|
+
puts "Clock: [get_property $clock name]"
|
|
371
|
+
puts "Sources: $source_names"
|
|
372
|
+
puts "Generated: $is_generated"
|
|
373
|
+
puts "Virtual: $is_virtual"
|
|
374
|
+
puts "Propagated: $is_propagated"
|
|
375
|
+
puts "Period: [get_property $clock period]"
|
|
376
|
+
puts "\n==========================================================================="
|
|
377
|
+
puts "report_clock_properties"
|
|
378
|
+
puts "============================================================================"
|
|
379
|
+
report_clock_properties $clock
|
|
380
|
+
puts "\n==========================================================================="
|
|
381
|
+
puts "report_clock_latency"
|
|
382
|
+
puts "============================================================================"
|
|
383
|
+
report_clock_latency -clock $clock
|
|
384
|
+
puts "\n==========================================================================="
|
|
385
|
+
puts "report_clock_min_period"
|
|
386
|
+
puts "============================================================================"
|
|
387
|
+
report_clock_min_period -clocks [get_property $clock name]
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
puts "%OL_END_REPORT"
|
|
391
|
+
|
|
392
|
+
write_sdfs
|
|
393
|
+
write_libs
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
tapcell\
|
|
18
|
+
-distance $::env(FP_TAPCELL_DIST)\
|
|
19
|
+
-tapcell_master "$::env(WELLTAP_CELL)"\
|
|
20
|
+
-endcap_master "$::env(ENDCAP_CELL)"\
|
|
21
|
+
-halo_width_x $::env(FP_MACRO_HORIZONTAL_HALO)\
|
|
22
|
+
-halo_width_y $::env(FP_MACRO_VERTICAL_HALO)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
write_views
|
|
@@ -0,0 +1,27 @@
|
|
|
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
|
+
if { [info exists ::env(CURRENT_ODB)] } {
|
|
16
|
+
read_current_odb
|
|
17
|
+
} elseif { [info exists ::env(CURRENT_DEF)] } {
|
|
18
|
+
read_pnr_libs
|
|
19
|
+
read_lefs
|
|
20
|
+
read_def $::env(CURRENT_DEF)
|
|
21
|
+
} else {
|
|
22
|
+
read_pnr_libs
|
|
23
|
+
read_lefs
|
|
24
|
+
read_current_netlist
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
write_views
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# Copyright 2020-2024 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
|
+
import os
|
|
15
|
+
import re
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ABCScriptCreator:
|
|
19
|
+
def __init__(self, config):
|
|
20
|
+
self.config = config
|
|
21
|
+
|
|
22
|
+
self.rs_K = "resub -K "
|
|
23
|
+
self.rs = "resub"
|
|
24
|
+
self.rsz = "resub -z"
|
|
25
|
+
self.rf = "drf -l"
|
|
26
|
+
self.rfz = "drf -l -z"
|
|
27
|
+
self.rw = "drw -l"
|
|
28
|
+
self.rwz = "drw -l -z"
|
|
29
|
+
self.rw_K = "drw -l -K"
|
|
30
|
+
|
|
31
|
+
if config["SYNTH_ABC_LEGACY_REFACTOR"]:
|
|
32
|
+
self.rf = "refactor"
|
|
33
|
+
self.rfz = "refactor -z"
|
|
34
|
+
|
|
35
|
+
if config["SYNTH_ABC_LEGACY_REWRITE"]:
|
|
36
|
+
self.rw = "rewrite"
|
|
37
|
+
self.rwz = "rewrite -z"
|
|
38
|
+
self.rw_K = "rewrite -K"
|
|
39
|
+
|
|
40
|
+
self.b = "balance"
|
|
41
|
+
self.resyn2 = f"{self.b}; {self.rw}; {self.rf}; {self.b}; {self.rw}; {self.rwz}; {self.b}; {self.rfz}; {self.rwz}; {self.b}"
|
|
42
|
+
self.share = f"strash; multi -m; {self.resyn2}"
|
|
43
|
+
self.resyn2a = f"{self.b};{self.rw};{self.b};{self.rw};{self.rwz};{self.b};{self.rwz};{self.b}"
|
|
44
|
+
self.resyn3 = f"{self.b}; resub; resub -K 6; {self.b};resub -z;resub -z -K 6; {self.b};resub -z -K 5; {self.b}"
|
|
45
|
+
self.resyn2rs = f"{self.b};{self.rs_K} 6;{self.rw};{self.rs_K} 6 -N 2;{self.rf};{self.rs_K} 8;{self.rw};{self.rs_K} 10;{self.rwz};{self.rs_K} 10 -N 2;{self.b} {self.rs_K} 12;{self.rfz};{self.rs_K} 12 -N 2;{self.rwz};{self.b}"
|
|
46
|
+
|
|
47
|
+
self.choice = f"fraig_store; {self.resyn2}; fraig_store; {self.resyn2}; fraig_store; fraig_restore"
|
|
48
|
+
self.choice2 = f"fraig_store; {self.b}; fraig_store; {self.resyn2}; fraig_store; {self.resyn2}; fraig_store; {self.resyn2}; fraig_store; fraig_restore"
|
|
49
|
+
|
|
50
|
+
self.area_mfs3 = ""
|
|
51
|
+
self.delay_mfs3 = ""
|
|
52
|
+
if config["SYNTH_ABC_USE_MFS3"]:
|
|
53
|
+
self.area_mfs3 = "mfs3 -aemvz -I 4 -O 2"
|
|
54
|
+
self.delay_mfs3 = "mfs3 -emvz -I 4 -O 2"
|
|
55
|
+
|
|
56
|
+
self.map_old_area = "map -p -a -B 0.2 -A 0.9 -M 0"
|
|
57
|
+
self.map_old_dly = "map -p -B 0.2 -A 0.9 -M 0"
|
|
58
|
+
self.retime_area = "retime {D} -M 5"
|
|
59
|
+
self.retime_dly = "retime {D} -M 6"
|
|
60
|
+
self.map_new_area = "amap -m -Q 0.1 -F 20 -A 20 -C 5000"
|
|
61
|
+
|
|
62
|
+
if config["SYNTH_ABC_AREA_USE_NF"]:
|
|
63
|
+
self.map_new_area = "&get -n; &nf -R 1000; &put"
|
|
64
|
+
|
|
65
|
+
self.max_fanout = config["MAX_FANOUT_CONSTRAINT"]
|
|
66
|
+
self.max_transition = (
|
|
67
|
+
config.get("MAX_TRANSITION_CONSTRAINT") or 0
|
|
68
|
+
) * 1000 # ns -> ps
|
|
69
|
+
self.fine_tune = ""
|
|
70
|
+
if config["SYNTH_ABC_BUFFERING"]:
|
|
71
|
+
max_tr_arg = ""
|
|
72
|
+
if self.max_transition != 0:
|
|
73
|
+
max_tr_arg = f" -S {self.max_transition}"
|
|
74
|
+
self.fine_tune = (
|
|
75
|
+
f"buffer -N {self.max_fanout}{max_tr_arg};upsize {{D}};dnsize {{D}}"
|
|
76
|
+
)
|
|
77
|
+
elif config["SYNTH_SIZING"]:
|
|
78
|
+
self.fine_tune = "upsize {D};dnsize {D}"
|
|
79
|
+
|
|
80
|
+
def generate_abc_script(self, step_dir, strategy):
|
|
81
|
+
strategy_clean = re.sub(r"\s+", "_", strategy)
|
|
82
|
+
abc_script_path = os.path.join(step_dir, f"{strategy_clean}.abc")
|
|
83
|
+
f = open(abc_script_path, "w")
|
|
84
|
+
|
|
85
|
+
if strategy == "AREA 3":
|
|
86
|
+
# ORFS Area Script
|
|
87
|
+
print("strash", file=f)
|
|
88
|
+
print("dch", file=f)
|
|
89
|
+
print("map -B 0.9", file=f)
|
|
90
|
+
print("topo", file=f)
|
|
91
|
+
print("stime -c", file=f)
|
|
92
|
+
print(f"buffer -c -N {self.max_fanout}", file=f)
|
|
93
|
+
print("upsize -c", file=f)
|
|
94
|
+
print("dnsize -c", file=f)
|
|
95
|
+
elif strategy == "DELAY 4":
|
|
96
|
+
# ORFS Delay Script
|
|
97
|
+
def repeated_sequence(f):
|
|
98
|
+
print("&st", file=f)
|
|
99
|
+
print("&syn2", file=f)
|
|
100
|
+
print("&if -g -K 6", file=f)
|
|
101
|
+
print("&synch2", file=f)
|
|
102
|
+
print("&nf", file=f)
|
|
103
|
+
|
|
104
|
+
print("&get -n", file=f)
|
|
105
|
+
print("&st", file=f)
|
|
106
|
+
print("&dch", file=f)
|
|
107
|
+
print("&nf", file=f)
|
|
108
|
+
|
|
109
|
+
for _ in range(5):
|
|
110
|
+
repeated_sequence(f)
|
|
111
|
+
|
|
112
|
+
print("&put", file=f)
|
|
113
|
+
print(f"buffer -c -N {self.max_fanout}", file=f)
|
|
114
|
+
print("topo", file=f)
|
|
115
|
+
print("stime -c", file=f)
|
|
116
|
+
print("upsize -c", file=f)
|
|
117
|
+
print("dnsize -c", file=f)
|
|
118
|
+
else:
|
|
119
|
+
print("fx", file=f)
|
|
120
|
+
print("mfs", file=f)
|
|
121
|
+
print("strash", file=f)
|
|
122
|
+
print(self.rf, file=f)
|
|
123
|
+
|
|
124
|
+
# Resynth/Retime
|
|
125
|
+
if strategy == "AREA 2":
|
|
126
|
+
print(self.choice2, file=f)
|
|
127
|
+
else:
|
|
128
|
+
print(self.resyn2, file=f)
|
|
129
|
+
if strategy.startswith("AREA ") or strategy == "DELAY 3":
|
|
130
|
+
print(self.retime_area, file=f)
|
|
131
|
+
else:
|
|
132
|
+
print(self.retime_dly, file=f)
|
|
133
|
+
print("scleanup", file=f)
|
|
134
|
+
|
|
135
|
+
if strategy in ["AREA 4", "DELAY 2"]:
|
|
136
|
+
print(self.choice, file=f)
|
|
137
|
+
elif strategy != "DELAY 0":
|
|
138
|
+
print(self.choice2, file=f)
|
|
139
|
+
if strategy.startswith("AREA ") or strategy == "DELAY 3":
|
|
140
|
+
print(self.map_new_area, file=f)
|
|
141
|
+
else:
|
|
142
|
+
print(self.map_old_dly, file=f)
|
|
143
|
+
|
|
144
|
+
# Area Recovery
|
|
145
|
+
if strategy in ["AREA 1", "AREA 2"]:
|
|
146
|
+
print(self.choice2, file=f)
|
|
147
|
+
print(self.map_new_area, file=f)
|
|
148
|
+
elif strategy in ["DELAY 1"]:
|
|
149
|
+
print(self.choice2, file=f)
|
|
150
|
+
print("map", file=f)
|
|
151
|
+
elif strategy in ["DELAY 2"]:
|
|
152
|
+
print(self.choice, file=f)
|
|
153
|
+
print("map", file=f)
|
|
154
|
+
elif strategy in ["DELAY 3"]:
|
|
155
|
+
print(self.choice2, file=f)
|
|
156
|
+
print(self.map_old_dly, file=f)
|
|
157
|
+
|
|
158
|
+
if strategy.startswith("AREA "):
|
|
159
|
+
print(self.area_mfs3, file=f)
|
|
160
|
+
else:
|
|
161
|
+
print(self.delay_mfs3, file=f)
|
|
162
|
+
|
|
163
|
+
print("retime {D}", file=f)
|
|
164
|
+
|
|
165
|
+
# & space
|
|
166
|
+
print("&get -n", file=f)
|
|
167
|
+
print("&st", file=f)
|
|
168
|
+
print("&dch", file=f)
|
|
169
|
+
print("&nf", file=f)
|
|
170
|
+
print("&put", file=f)
|
|
171
|
+
print(self.fine_tune, file=f)
|
|
172
|
+
|
|
173
|
+
# Common Conclusion
|
|
174
|
+
print("stime -p", file=f)
|
|
175
|
+
print("print_stats -m", file=f)
|
|
176
|
+
f.close()
|
|
177
|
+
return abc_script_path
|