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.

Files changed (166) hide show
  1. librelane/__init__.py +38 -0
  2. librelane/__main__.py +470 -0
  3. librelane/__version__.py +43 -0
  4. librelane/common/__init__.py +61 -0
  5. librelane/common/cli.py +75 -0
  6. librelane/common/drc.py +245 -0
  7. librelane/common/generic_dict.py +319 -0
  8. librelane/common/metrics/__init__.py +35 -0
  9. librelane/common/metrics/__main__.py +413 -0
  10. librelane/common/metrics/library.py +354 -0
  11. librelane/common/metrics/metric.py +186 -0
  12. librelane/common/metrics/util.py +279 -0
  13. librelane/common/misc.py +402 -0
  14. librelane/common/ring_buffer.py +63 -0
  15. librelane/common/tcl.py +80 -0
  16. librelane/common/toolbox.py +549 -0
  17. librelane/common/tpe.py +41 -0
  18. librelane/common/types.py +117 -0
  19. librelane/config/__init__.py +32 -0
  20. librelane/config/__main__.py +158 -0
  21. librelane/config/config.py +1025 -0
  22. librelane/config/flow.py +490 -0
  23. librelane/config/pdk_compat.py +255 -0
  24. librelane/config/preprocessor.py +464 -0
  25. librelane/config/removals.py +45 -0
  26. librelane/config/variable.py +722 -0
  27. librelane/container.py +264 -0
  28. librelane/env_info.py +306 -0
  29. librelane/examples/spm/config.yaml +33 -0
  30. librelane/examples/spm/pin_order.cfg +14 -0
  31. librelane/examples/spm/src/impl.sdc +73 -0
  32. librelane/examples/spm/src/signoff.sdc +68 -0
  33. librelane/examples/spm/src/spm.v +73 -0
  34. librelane/examples/spm/verify/spm_tb.v +106 -0
  35. librelane/examples/spm-user_project_wrapper/SPM_example.v +286 -0
  36. librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +145 -0
  37. librelane/examples/spm-user_project_wrapper/config-tut.json +12 -0
  38. librelane/examples/spm-user_project_wrapper/config.json +13 -0
  39. librelane/examples/spm-user_project_wrapper/defines.v +66 -0
  40. librelane/examples/spm-user_project_wrapper/template.def +7656 -0
  41. librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +123 -0
  42. librelane/flows/__init__.py +24 -0
  43. librelane/flows/builtins.py +18 -0
  44. librelane/flows/classic.py +330 -0
  45. librelane/flows/cli.py +463 -0
  46. librelane/flows/flow.py +985 -0
  47. librelane/flows/misc.py +71 -0
  48. librelane/flows/optimizing.py +179 -0
  49. librelane/flows/sequential.py +367 -0
  50. librelane/flows/synth_explore.py +173 -0
  51. librelane/logging/__init__.py +40 -0
  52. librelane/logging/logger.py +323 -0
  53. librelane/open_pdks_rev +1 -0
  54. librelane/plugins.py +21 -0
  55. librelane/py.typed +0 -0
  56. librelane/scripts/base.sdc +80 -0
  57. librelane/scripts/klayout/Readme.md +2 -0
  58. librelane/scripts/klayout/open_design.py +63 -0
  59. librelane/scripts/klayout/render.py +121 -0
  60. librelane/scripts/klayout/stream_out.py +176 -0
  61. librelane/scripts/klayout/xml_drc_report_to_json.py +45 -0
  62. librelane/scripts/klayout/xor.drc +120 -0
  63. librelane/scripts/magic/Readme.md +1 -0
  64. librelane/scripts/magic/common/read.tcl +114 -0
  65. librelane/scripts/magic/def/antenna_check.tcl +35 -0
  66. librelane/scripts/magic/def/mag.tcl +19 -0
  67. librelane/scripts/magic/def/mag_gds.tcl +81 -0
  68. librelane/scripts/magic/drc.tcl +79 -0
  69. librelane/scripts/magic/extract_spice.tcl +98 -0
  70. librelane/scripts/magic/gds/drc_batch.tcl +74 -0
  71. librelane/scripts/magic/gds/erase_box.tcl +32 -0
  72. librelane/scripts/magic/gds/extras_mag.tcl +47 -0
  73. librelane/scripts/magic/gds/mag_with_pointers.tcl +32 -0
  74. librelane/scripts/magic/get_bbox.tcl +11 -0
  75. librelane/scripts/magic/lef/extras_maglef.tcl +63 -0
  76. librelane/scripts/magic/lef/maglef.tcl +27 -0
  77. librelane/scripts/magic/lef.tcl +57 -0
  78. librelane/scripts/magic/open.tcl +28 -0
  79. librelane/scripts/magic/wrapper.tcl +19 -0
  80. librelane/scripts/netgen/setup.tcl +28 -0
  81. librelane/scripts/odbpy/apply_def_template.py +49 -0
  82. librelane/scripts/odbpy/cell_frequency.py +107 -0
  83. librelane/scripts/odbpy/check_antenna_properties.py +116 -0
  84. librelane/scripts/odbpy/contextualize.py +109 -0
  85. librelane/scripts/odbpy/defutil.py +574 -0
  86. librelane/scripts/odbpy/diodes.py +373 -0
  87. librelane/scripts/odbpy/disconnected_pins.py +305 -0
  88. librelane/scripts/odbpy/exception_codes.py +17 -0
  89. librelane/scripts/odbpy/filter_unannotated.py +100 -0
  90. librelane/scripts/odbpy/io_place.py +482 -0
  91. librelane/scripts/odbpy/label_macro_pins.py +277 -0
  92. librelane/scripts/odbpy/lefutil.py +97 -0
  93. librelane/scripts/odbpy/placers.py +162 -0
  94. librelane/scripts/odbpy/power_utils.py +395 -0
  95. librelane/scripts/odbpy/random_place.py +57 -0
  96. librelane/scripts/odbpy/reader.py +246 -0
  97. librelane/scripts/odbpy/remove_buffers.py +173 -0
  98. librelane/scripts/odbpy/snap_to_grid.py +57 -0
  99. librelane/scripts/odbpy/wire_lengths.py +93 -0
  100. librelane/scripts/openroad/antenna_check.tcl +20 -0
  101. librelane/scripts/openroad/antenna_repair.tcl +31 -0
  102. librelane/scripts/openroad/basic_mp.tcl +24 -0
  103. librelane/scripts/openroad/buffer_list.tcl +10 -0
  104. librelane/scripts/openroad/common/dpl.tcl +24 -0
  105. librelane/scripts/openroad/common/dpl_cell_pad.tcl +26 -0
  106. librelane/scripts/openroad/common/grt.tcl +32 -0
  107. librelane/scripts/openroad/common/io.tcl +476 -0
  108. librelane/scripts/openroad/common/pdn_cfg.tcl +135 -0
  109. librelane/scripts/openroad/common/resizer.tcl +103 -0
  110. librelane/scripts/openroad/common/set_global_connections.tcl +78 -0
  111. librelane/scripts/openroad/common/set_layer_adjustments.tcl +31 -0
  112. librelane/scripts/openroad/common/set_power_nets.tcl +30 -0
  113. librelane/scripts/openroad/common/set_rc.tcl +75 -0
  114. librelane/scripts/openroad/common/set_routing_layers.tcl +30 -0
  115. librelane/scripts/openroad/cts.tcl +80 -0
  116. librelane/scripts/openroad/cut_rows.tcl +24 -0
  117. librelane/scripts/openroad/dpl.tcl +24 -0
  118. librelane/scripts/openroad/drt.tcl +37 -0
  119. librelane/scripts/openroad/fill.tcl +30 -0
  120. librelane/scripts/openroad/floorplan.tcl +145 -0
  121. librelane/scripts/openroad/gpl.tcl +88 -0
  122. librelane/scripts/openroad/grt.tcl +30 -0
  123. librelane/scripts/openroad/gui.tcl +15 -0
  124. librelane/scripts/openroad/insert_buffer.tcl +127 -0
  125. librelane/scripts/openroad/ioplacer.tcl +67 -0
  126. librelane/scripts/openroad/irdrop.tcl +51 -0
  127. librelane/scripts/openroad/pdn.tcl +52 -0
  128. librelane/scripts/openroad/rcx.tcl +32 -0
  129. librelane/scripts/openroad/repair_design.tcl +70 -0
  130. librelane/scripts/openroad/repair_design_postgrt.tcl +48 -0
  131. librelane/scripts/openroad/rsz_timing_postcts.tcl +68 -0
  132. librelane/scripts/openroad/rsz_timing_postgrt.tcl +70 -0
  133. librelane/scripts/openroad/sta/check_macro_instances.tcl +53 -0
  134. librelane/scripts/openroad/sta/corner.tcl +393 -0
  135. librelane/scripts/openroad/tapcell.tcl +25 -0
  136. librelane/scripts/openroad/write_views.tcl +27 -0
  137. librelane/scripts/pyosys/construct_abc_script.py +177 -0
  138. librelane/scripts/pyosys/json_header.py +84 -0
  139. librelane/scripts/pyosys/synthesize.py +493 -0
  140. librelane/scripts/pyosys/ys_common.py +153 -0
  141. librelane/scripts/tclsh/hello.tcl +1 -0
  142. librelane/state/__init__.py +24 -0
  143. librelane/state/__main__.py +61 -0
  144. librelane/state/design_format.py +180 -0
  145. librelane/state/state.py +351 -0
  146. librelane/steps/__init__.py +61 -0
  147. librelane/steps/__main__.py +511 -0
  148. librelane/steps/checker.py +637 -0
  149. librelane/steps/common_variables.py +340 -0
  150. librelane/steps/cvc_rv.py +169 -0
  151. librelane/steps/klayout.py +509 -0
  152. librelane/steps/magic.py +566 -0
  153. librelane/steps/misc.py +160 -0
  154. librelane/steps/netgen.py +253 -0
  155. librelane/steps/odb.py +955 -0
  156. librelane/steps/openroad.py +2433 -0
  157. librelane/steps/openroad_alerts.py +102 -0
  158. librelane/steps/pyosys.py +629 -0
  159. librelane/steps/step.py +1547 -0
  160. librelane/steps/tclstep.py +288 -0
  161. librelane/steps/verilator.py +222 -0
  162. librelane/steps/yosys.py +371 -0
  163. librelane-2.4.0.dev0.dist-info/METADATA +151 -0
  164. librelane-2.4.0.dev0.dist-info/RECORD +166 -0
  165. librelane-2.4.0.dev0.dist-info/WHEEL +4 -0
  166. 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
+