librelane 3.1.0.dev1__py3-none-any.whl → 3.1.0.dev2__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.
- librelane/config/config.py +9 -4
- librelane/config/flow.py +6 -0
- librelane/pdk_hashes.yaml +2 -2
- librelane/scripts/magic/def/antenna_check.tcl +3 -0
- librelane/scripts/magic/def/mag.tcl +4 -1
- librelane/scripts/magic/def/mag_gds.tcl +1 -0
- librelane/scripts/magic/drc.tcl +1 -0
- librelane/scripts/magic/extract_spice.tcl +3 -0
- librelane/scripts/magic/gds/drc_batch.tcl +3 -0
- librelane/scripts/magic/gds/erase_box.tcl +4 -0
- librelane/scripts/magic/gds/extras_mag.tcl +2 -0
- librelane/scripts/magic/gds/mag_with_pointers.tcl +2 -0
- librelane/scripts/magic/get_bbox.tcl +4 -0
- librelane/scripts/magic/lef/extras_maglef.tcl +2 -0
- librelane/scripts/magic/lef/maglef.tcl +2 -0
- librelane/scripts/magic/lef.tcl +3 -0
- librelane/scripts/magic/spice_rcx.tcl +4 -0
- librelane/scripts/odbpy/power_utils.py +9 -2
- librelane/scripts/openroad/common/io.tcl +5 -1
- librelane/scripts/openroad/common/pad_cfg.tcl +25 -11
- librelane/scripts/openroad/repair_design.tcl +5 -2
- librelane/scripts/pyosys/json_header.py +5 -0
- librelane/scripts/pyosys/synthesize.py +15 -6
- librelane/steps/common_variables.py +1 -1
- librelane/steps/klayout.py +12 -9
- librelane/steps/openroad.py +13 -0
- librelane/steps/verilator.py +15 -1
- {librelane-3.1.0.dev1.dist-info → librelane-3.1.0.dev2.dist-info}/METADATA +1 -1
- {librelane-3.1.0.dev1.dist-info → librelane-3.1.0.dev2.dist-info}/RECORD +31 -31
- {librelane-3.1.0.dev1.dist-info → librelane-3.1.0.dev2.dist-info}/WHEEL +1 -1
- {librelane-3.1.0.dev1.dist-info → librelane-3.1.0.dev2.dist-info}/entry_points.txt +0 -0
librelane/config/config.py
CHANGED
|
@@ -495,10 +495,10 @@ class Config(GenericImmutableDict[str, Any]):
|
|
|
495
495
|
:param pdk: A process design kit to use. Required unless specified via the
|
|
496
496
|
"PDK" key in a configuration object.
|
|
497
497
|
|
|
498
|
-
:param pdk_root: Required if
|
|
498
|
+
:param pdk_root: Required if Ciel is not installed.
|
|
499
499
|
|
|
500
|
-
If
|
|
501
|
-
|
|
500
|
+
If Ciel is installed, this value can be used to optionally override
|
|
501
|
+
Ciel's default.
|
|
502
502
|
|
|
503
503
|
:param scl: A standard cell library to use. If not specified, the PDK's
|
|
504
504
|
default standard cell library will be used instead.
|
|
@@ -713,7 +713,7 @@ class Config(GenericImmutableDict[str, Any]):
|
|
|
713
713
|
pdk=pdk,
|
|
714
714
|
pdkpath=pdkpath,
|
|
715
715
|
scl=mutable[SpecialKeys.scl],
|
|
716
|
-
pad=mutable.get(SpecialKeys.pad,
|
|
716
|
+
pad=mutable.get(SpecialKeys.pad, pad),
|
|
717
717
|
design_dir=design_dir,
|
|
718
718
|
)
|
|
719
719
|
)
|
|
@@ -833,6 +833,11 @@ class Config(GenericImmutableDict[str, Any]):
|
|
|
833
833
|
if scl is not None:
|
|
834
834
|
pdk_config[SpecialKeys.scl] = scl
|
|
835
835
|
|
|
836
|
+
# HACK: Prevent loading default SCL cfg vars for old openlane PDK
|
|
837
|
+
# configs
|
|
838
|
+
# For more info: https://github.com/librelane/librelane/issues/932
|
|
839
|
+
pdk_config["STD_CELL_LIBRARY_OPT"] = scl
|
|
840
|
+
|
|
836
841
|
if pad is not None:
|
|
837
842
|
pdk_config[SpecialKeys.pad] = pad
|
|
838
843
|
|
librelane/config/flow.py
CHANGED
|
@@ -39,6 +39,12 @@ pdk_variables = [
|
|
|
39
39
|
"Specifies the default standard cell library to be used under the specified PDK. Must be a valid C identifier, i.e., matches the regular expression `[_a-zA-Z][_a-zA-Z0-9]+`.",
|
|
40
40
|
pdk=True,
|
|
41
41
|
),
|
|
42
|
+
Variable(
|
|
43
|
+
"PAD_CELL_LIBRARY",
|
|
44
|
+
Optional[str],
|
|
45
|
+
"Specifies the default pad cell library to be used under the specified PDK. Must be a valid C identifier, i.e., matches the regular expression `[_a-zA-Z][_a-zA-Z0-9]+`.",
|
|
46
|
+
pdk=True,
|
|
47
|
+
),
|
|
42
48
|
Variable(
|
|
43
49
|
"VDD_PIN",
|
|
44
50
|
str,
|
librelane/pdk_hashes.yaml
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
sky130:
|
|
2
|
-
gf180mcu:
|
|
1
|
+
sky130: 74c0e6b118a67d94c24172143d3bd597473fa63d
|
|
2
|
+
gf180mcu: b344c97eacc2aaf8e14ae7e43e2e9dc0871de2c0
|
|
3
3
|
ihp-sg13g2: c4b8b4e5e7a05f375cca3815d51b3a37721fbf5c
|
|
@@ -12,6 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
source $::env(SCRIPTS_DIR)/magic/def/read.tcl
|
|
15
|
+
drc off
|
|
16
|
+
crashbackups disable
|
|
17
|
+
locking disable
|
|
15
18
|
|
|
16
19
|
load $::env(DESIGN_NAME) -dereference
|
|
17
20
|
|
|
@@ -13,7 +13,10 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
source $::env(SCRIPTS_DIR)/magic/def/read.tcl
|
|
16
|
+
drc off
|
|
17
|
+
crashbackups disable
|
|
18
|
+
locking disable
|
|
16
19
|
|
|
17
20
|
save $::env(SAVE_MAG)
|
|
18
21
|
|
|
19
|
-
puts "[INFO] Done exporting $::env(SAVE_MAG)."
|
|
22
|
+
puts "[INFO] Done exporting $::env(SAVE_MAG)."
|
librelane/scripts/magic/drc.tcl
CHANGED
|
@@ -20,6 +20,9 @@ puts $f [expr {((round([magic::cif scale output] * 10000)) / 10000.0) * 1}]
|
|
|
20
20
|
close $f
|
|
21
21
|
|
|
22
22
|
source $::env(SCRIPTS_DIR)/magic/common/read.tcl
|
|
23
|
+
drc off
|
|
24
|
+
crashbackups disable
|
|
25
|
+
locking disable
|
|
23
26
|
|
|
24
27
|
if { $::env(MAGIC_EXT_USE_GDS) } {
|
|
25
28
|
gds read $::env(CURRENT_GDS)
|
librelane/scripts/magic/lef.tcl
CHANGED
|
@@ -52,8 +52,15 @@ class Design(object):
|
|
|
52
52
|
netname_by_bit = {}
|
|
53
53
|
|
|
54
54
|
for netname, info in yosys_design_object["netnames"].items():
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
assert len(info["bits"]) > 0
|
|
56
|
+
# Single bit net, return name directly
|
|
57
|
+
if len(info["bits"]) == 1:
|
|
58
|
+
netname_by_bit[info["bits"][0]] = netname
|
|
59
|
+
# Append bit index to signal name
|
|
60
|
+
else:
|
|
61
|
+
offset = info.get("offset", 0)
|
|
62
|
+
for index, bit in enumerate(info["bits"]):
|
|
63
|
+
netname_by_bit[bit] = f"{netname}[{offset + index}]"
|
|
57
64
|
|
|
58
65
|
self.verilog_net_names_by_bit_by_module[top_module] = netname_by_bit
|
|
59
66
|
return self.verilog_net_names_by_bit_by_module[top_module][target_bit]
|
|
@@ -588,7 +588,11 @@ proc write_libs {} {
|
|
|
588
588
|
foreach corner_name [lln::get_corner_names] {
|
|
589
589
|
set target $::env(_LIB_SAVE_DIR)/$::env(DESIGN_NAME)__$corner_name.lib
|
|
590
590
|
puts "Writing timing models for the $corner_name corner to $target…"
|
|
591
|
-
|
|
591
|
+
if {[string length [namespace which sta::scenes]] != 0} {
|
|
592
|
+
write_timing_model -scene $corner_name $target
|
|
593
|
+
} else {
|
|
594
|
+
write_timing_model -corner $corner_name $target
|
|
595
|
+
}
|
|
592
596
|
}
|
|
593
597
|
}
|
|
594
598
|
}
|
|
@@ -20,6 +20,11 @@ puts "\[INFO\] Generating padring…"
|
|
|
20
20
|
set block [ord::get_db_block]
|
|
21
21
|
set units [$block getDefUnits]
|
|
22
22
|
|
|
23
|
+
# Round a micrometer value to nanometer
|
|
24
|
+
proc round_um_nm {value} {
|
|
25
|
+
return [expr double(round($value * 1000)) / 1000]
|
|
26
|
+
}
|
|
27
|
+
|
|
23
28
|
# Pad Placement Algorithm
|
|
24
29
|
#
|
|
25
30
|
# For all sides:
|
|
@@ -128,15 +133,15 @@ foreach side $sides {
|
|
|
128
133
|
|
|
129
134
|
set space_between_pads [expr $space_for_fill / ([llength $::env($side)] + 1)]
|
|
130
135
|
puts "space_between_pads: $space_between_pads"
|
|
131
|
-
|
|
132
|
-
# Round to
|
|
133
|
-
set
|
|
134
|
-
puts "
|
|
136
|
+
|
|
137
|
+
# Round to PAD_SPACING_MULTIPLE
|
|
138
|
+
set space_between_pads_multiple [round_um_nm [expr floor($space_between_pads / $::env(PAD_SPACING_MULTIPLE)) * $::env(PAD_SPACING_MULTIPLE)]]
|
|
139
|
+
puts "space_between_pads_multiple: $space_between_pads_multiple"
|
|
135
140
|
|
|
136
141
|
# The spacing for the pads on the side (the remaining space)
|
|
137
|
-
set space_side [expr
|
|
142
|
+
set space_side [round_um_nm [expr ($space_for_fill - $space_between_pads_multiple * ([llength $::env($side)] - 1)) / 2]]
|
|
138
143
|
|
|
139
|
-
if { $space_side !=
|
|
144
|
+
if { $space_side != [round_um_nm [expr floor($space_side / $pad_site_width) * $pad_site_width]] } {
|
|
140
145
|
puts "\[Error\] The remaining area for the pads on the side ($space_side) is not divisible by the minimum site width (minimum filler: $pad_site_width)."
|
|
141
146
|
exit 1
|
|
142
147
|
}
|
|
@@ -166,7 +171,7 @@ foreach side $sides {
|
|
|
166
171
|
place_pad -row [dict get $row_names $side] -location $cur_pos $inst_name -master $master_name
|
|
167
172
|
|
|
168
173
|
# Increment current position
|
|
169
|
-
set cur_pos [expr $cur_pos + $
|
|
174
|
+
set cur_pos [expr $cur_pos + $space_between_pads_multiple + $width]
|
|
170
175
|
}
|
|
171
176
|
}
|
|
172
177
|
|
|
@@ -178,10 +183,18 @@ place_corners $::env(PAD_CORNER)
|
|
|
178
183
|
puts "\[INFO\] Placing filler cells…"
|
|
179
184
|
|
|
180
185
|
# Place filler cells
|
|
181
|
-
place_io_fill -row IO_NORTH {*}$::env(PAD_FILLERS)
|
|
182
|
-
place_io_fill -row IO_SOUTH {*}$::env(PAD_FILLERS)
|
|
183
|
-
place_io_fill -row IO_WEST {*}$::env(PAD_FILLERS)
|
|
184
|
-
place_io_fill -row IO_EAST {*}$::env(PAD_FILLERS)
|
|
186
|
+
if {!$::env(PAD_TRIM_ROWS) || ($::env(PAD_NORTH) ne "")} { place_io_fill -row IO_NORTH {*}$::env(PAD_FILLERS) }
|
|
187
|
+
if {!$::env(PAD_TRIM_ROWS) || ($::env(PAD_SOUTH) ne "")} { place_io_fill -row IO_SOUTH {*}$::env(PAD_FILLERS) }
|
|
188
|
+
if {!$::env(PAD_TRIM_ROWS) || ($::env(PAD_WEST) ne "")} { place_io_fill -row IO_WEST {*}$::env(PAD_FILLERS) }
|
|
189
|
+
if {!$::env(PAD_TRIM_ROWS) || ($::env(PAD_EAST) ne "")} { place_io_fill -row IO_EAST {*}$::env(PAD_FILLERS) }
|
|
190
|
+
|
|
191
|
+
puts "\[INFO\] Deleting corner cells (if required)…"
|
|
192
|
+
|
|
193
|
+
# Delete corner cells if required
|
|
194
|
+
if {$::env(PAD_TRIM_ROWS) && ($::env(PAD_NORTH) eq "") && ($::env(PAD_WEST) eq "")} { odb::dbInst_destroy [$block findInst IO_CORNER_NORTH_WEST_INST] }
|
|
195
|
+
if {$::env(PAD_TRIM_ROWS) && ($::env(PAD_NORTH) eq "") && ($::env(PAD_EAST) eq "")} { odb::dbInst_destroy [$block findInst IO_CORNER_NORTH_EAST_INST] }
|
|
196
|
+
if {$::env(PAD_TRIM_ROWS) && ($::env(PAD_SOUTH) eq "") && ($::env(PAD_WEST) eq "")} { odb::dbInst_destroy [$block findInst IO_CORNER_SOUTH_WEST_INST] }
|
|
197
|
+
if {$::env(PAD_TRIM_ROWS) && ($::env(PAD_SOUTH) eq "") && ($::env(PAD_EAST) eq "")} { odb::dbInst_destroy [$block findInst IO_CORNER_SOUTH_EAST_INST] }
|
|
185
198
|
|
|
186
199
|
puts "\[INFO\] Connecting ring signals…"
|
|
187
200
|
|
|
@@ -246,3 +259,4 @@ if { [info exists ::env(PAD_PLACE_IO_TERMINALS)] } {
|
|
|
246
259
|
# Remove io rows to avoid causing confusion with the other tools
|
|
247
260
|
puts "\[INFO\] Removing I/O rows…"
|
|
248
261
|
remove_io_rows
|
|
262
|
+
|
|
@@ -33,12 +33,15 @@ if { $::env(DESIGN_REPAIR_REMOVE_BUFFERS) } {
|
|
|
33
33
|
remove_buffers
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
# Use SYNTH_BUFFER_CELL as buffer, since OpenROAD may select a hold/delay buffer
|
|
37
|
+
# See: https://github.com/librelane/librelane/pull/961
|
|
38
|
+
|
|
36
39
|
if { $::env(DESIGN_REPAIR_BUFFER_INPUT_PORTS) } {
|
|
37
|
-
buffer_ports -inputs
|
|
40
|
+
buffer_ports -inputs -buffer_cell [lindex [split $::env(SYNTH_BUFFER_CELL) "/"] 0]
|
|
38
41
|
}
|
|
39
42
|
|
|
40
43
|
if { $::env(DESIGN_REPAIR_BUFFER_OUTPUT_PORTS) } {
|
|
41
|
-
buffer_ports -outputs
|
|
44
|
+
buffer_ports -outputs -buffer_cell [lindex [split $::env(SYNTH_BUFFER_CELL) "/"] 0]
|
|
42
45
|
}
|
|
43
46
|
|
|
44
47
|
set arg_list [list]
|
|
@@ -157,6 +157,7 @@ def librelane_synth(
|
|
|
157
157
|
):
|
|
158
158
|
|
|
159
159
|
d.run_pass("hierarchy", "-check", "-top", top, "-nokeep_prints", "-nokeep_asserts")
|
|
160
|
+
d.run_pass("chformal", "-remove")
|
|
160
161
|
librelane_proc(d, report_dir)
|
|
161
162
|
|
|
162
163
|
if keep_hierarchy_min_cost:
|
|
@@ -251,12 +252,20 @@ def synthesize(
|
|
|
251
252
|
extra = json.load(open(extra_in))
|
|
252
253
|
|
|
253
254
|
includes = config.get("VERILOG_INCLUDE_DIRS") or []
|
|
254
|
-
defines = (
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
255
|
+
defines = (
|
|
256
|
+
(config.get("VERILOG_DEFINES") or [])
|
|
257
|
+
+ [
|
|
258
|
+
f"PDK_{config['PDK'].replace('-','_')}",
|
|
259
|
+
f"SCL_{config['STD_CELL_LIBRARY']}",
|
|
260
|
+
"__librelane__",
|
|
261
|
+
"__pnr__",
|
|
262
|
+
]
|
|
263
|
+
+ (
|
|
264
|
+
[f"PAD_{config['PAD_CELL_LIBRARY']}"]
|
|
265
|
+
if "PAD_CELL_LIBRARY" in config
|
|
266
|
+
else []
|
|
267
|
+
)
|
|
268
|
+
)
|
|
260
269
|
|
|
261
270
|
blackbox_models = extra["blackbox_models"]
|
|
262
271
|
libs = extra["libs_synth"]
|
|
@@ -286,7 +286,7 @@ pdn_variables = [
|
|
|
286
286
|
Variable(
|
|
287
287
|
"PDN_RAIL_WIDTH",
|
|
288
288
|
Decimal,
|
|
289
|
-
"Defines the width of PDN rails on the `
|
|
289
|
+
"Defines the width of PDN rails on the `PDN_RAIL_LAYER` layer.",
|
|
290
290
|
units="µm",
|
|
291
291
|
pdk=True,
|
|
292
292
|
deprecated_names=["FP_PDN_RAIL_WIDTH"],
|
librelane/steps/klayout.py
CHANGED
|
@@ -171,7 +171,7 @@ class Render(KLayoutStep):
|
|
|
171
171
|
id = "KLayout.Render"
|
|
172
172
|
name = "Render Image (w/ KLayout)"
|
|
173
173
|
|
|
174
|
-
inputs = [
|
|
174
|
+
inputs = []
|
|
175
175
|
outputs = []
|
|
176
176
|
|
|
177
177
|
config_vars = KLayoutStep.config_vars + [
|
|
@@ -216,10 +216,14 @@ class Render(KLayoutStep):
|
|
|
216
216
|
def run(self, state_in: State, **kwargs) -> Tuple[ViewsUpdate, MetricsUpdate]:
|
|
217
217
|
views_updates: ViewsUpdate = {}
|
|
218
218
|
|
|
219
|
-
input_view = state_in
|
|
219
|
+
input_view = state_in.get(DesignFormat.DEF)
|
|
220
|
+
|
|
220
221
|
if gds := state_in.get(DesignFormat.GDS):
|
|
221
222
|
input_view = gds
|
|
222
223
|
|
|
224
|
+
if input_view is None:
|
|
225
|
+
raise StepError(f"{id} requires at least one of LEF or GDS as input.")
|
|
226
|
+
|
|
223
227
|
assert isinstance(input_view, Path)
|
|
224
228
|
|
|
225
229
|
klayout_render = os.path.join(
|
|
@@ -434,7 +438,7 @@ class DRC(KLayoutStep):
|
|
|
434
438
|
Unlike most steps, the KLayout scripts vary quite wildly by PDK. If a PDK
|
|
435
439
|
is not supported by this step, it will simply be skipped.
|
|
436
440
|
|
|
437
|
-
Currently,
|
|
441
|
+
Currently, sky130, gf180mcu and ihp-sg13 are supported.
|
|
438
442
|
"""
|
|
439
443
|
|
|
440
444
|
id = "KLayout.DRC"
|
|
@@ -455,7 +459,7 @@ class DRC(KLayoutStep):
|
|
|
455
459
|
),
|
|
456
460
|
Variable(
|
|
457
461
|
"KLAYOUT_DRC_OPTIONS",
|
|
458
|
-
Optional[Dict[str, Union[
|
|
462
|
+
Optional[Dict[str, Union[int, bool, str]]],
|
|
459
463
|
"Options passed directly to the KLayout DRC runset. They vary from one PDK to another.",
|
|
460
464
|
pdk=True,
|
|
461
465
|
),
|
|
@@ -513,9 +517,6 @@ class DRC(KLayoutStep):
|
|
|
513
517
|
if threads != "1":
|
|
514
518
|
opts.extend(
|
|
515
519
|
[
|
|
516
|
-
"-rd",
|
|
517
|
-
f"thr={threads}",
|
|
518
|
-
# Use "threads" if possible
|
|
519
520
|
"-rd",
|
|
520
521
|
f"threads={threads}",
|
|
521
522
|
]
|
|
@@ -602,6 +603,8 @@ class DRC(KLayoutStep):
|
|
|
602
603
|
"-rd",
|
|
603
604
|
f"seal={seal}",
|
|
604
605
|
"-rd",
|
|
606
|
+
f"thr={threads}",
|
|
607
|
+
"-rd",
|
|
605
608
|
f"threads={threads}",
|
|
606
609
|
],
|
|
607
610
|
env=env,
|
|
@@ -658,7 +661,7 @@ class DRC(KLayoutStep):
|
|
|
658
661
|
opts.extend(
|
|
659
662
|
[
|
|
660
663
|
"-rd",
|
|
661
|
-
f"
|
|
664
|
+
f"threads={threads}",
|
|
662
665
|
]
|
|
663
666
|
)
|
|
664
667
|
|
|
@@ -727,7 +730,7 @@ class DRC(KLayoutStep):
|
|
|
727
730
|
opts.extend(
|
|
728
731
|
[
|
|
729
732
|
"-rd",
|
|
730
|
-
f"
|
|
733
|
+
f"threads={threads}",
|
|
731
734
|
]
|
|
732
735
|
)
|
|
733
736
|
|
librelane/steps/openroad.py
CHANGED
|
@@ -1267,6 +1267,19 @@ class PadRing(OpenROADStep):
|
|
|
1267
1267
|
Optional[List[str]],
|
|
1268
1268
|
"The pad instance names for the west pad row.",
|
|
1269
1269
|
),
|
|
1270
|
+
Variable(
|
|
1271
|
+
"PAD_SPACING_MULTIPLE",
|
|
1272
|
+
Decimal,
|
|
1273
|
+
"The spacing between the pad cells will be a multiple of this value. Please ensure that the remaining space on the sides is divisible by the minimum site width.",
|
|
1274
|
+
default=1,
|
|
1275
|
+
units="µm",
|
|
1276
|
+
),
|
|
1277
|
+
Variable(
|
|
1278
|
+
"PAD_TRIM_ROWS",
|
|
1279
|
+
bool,
|
|
1280
|
+
"If any of `PAD_[SOUTH|EAST|NORTH|WEST]` is empty, skip io fill for those rows and delete the corners with two neighbouring empty rows.",
|
|
1281
|
+
default=False,
|
|
1282
|
+
),
|
|
1270
1283
|
]
|
|
1271
1284
|
|
|
1272
1285
|
def get_script_path(self):
|
librelane/steps/verilator.py
CHANGED
|
@@ -77,6 +77,12 @@ class Lint(Step):
|
|
|
77
77
|
"When a latch is inferred by an `always` block that is not explicitly marked as `always_latch`, report this as a linter error.",
|
|
78
78
|
default=True,
|
|
79
79
|
),
|
|
80
|
+
Variable(
|
|
81
|
+
"LINTER_ERROR_ON_MULTIDRIVEN",
|
|
82
|
+
bool,
|
|
83
|
+
"When a net has multiple drivers, report this as a linter error.",
|
|
84
|
+
default=True,
|
|
85
|
+
),
|
|
80
86
|
Variable(
|
|
81
87
|
"VERILOG_DEFINES",
|
|
82
88
|
Optional[List[str]],
|
|
@@ -162,7 +168,11 @@ class Lint(Step):
|
|
|
162
168
|
f"SCL_{self.config['STD_CELL_LIBRARY']}",
|
|
163
169
|
"__librelane__",
|
|
164
170
|
"__pnr__",
|
|
165
|
-
]
|
|
171
|
+
] + (
|
|
172
|
+
[f"PAD_{self.config['PAD_CELL_LIBRARY']}"]
|
|
173
|
+
if "PAD_CELL_LIBRARY" in self.config
|
|
174
|
+
else []
|
|
175
|
+
)
|
|
166
176
|
if verilog_power_define := self.config.get("VERILOG_POWER_DEFINE"):
|
|
167
177
|
defines += [verilog_power_define]
|
|
168
178
|
|
|
@@ -197,6 +207,10 @@ class Lint(Step):
|
|
|
197
207
|
if self.config["LINTER_ERROR_ON_LATCH"]:
|
|
198
208
|
extra_args.append("--Werror-LATCH")
|
|
199
209
|
|
|
210
|
+
# It's more user-friendly to catch multiple-driver conflicts here in Verilator (if possible) than later in Yosys.
|
|
211
|
+
if self.config["LINTER_ERROR_ON_MULTIDRIVEN"]:
|
|
212
|
+
extra_args.append("--Werror-MULTIDRIVEN")
|
|
213
|
+
|
|
200
214
|
if include_dirs := self.config["VERILOG_INCLUDE_DIRS"]:
|
|
201
215
|
extra_args.extend([f"-I{dir}" for dir in include_dirs])
|
|
202
216
|
|
|
@@ -18,8 +18,8 @@ librelane/common/tpe.py,sha256=Txj0fVscXSDJTYmEKZ2ESFHOeqrhHnaPPiwWBgyx4g8,1285
|
|
|
18
18
|
librelane/common/types.py,sha256=yFzUWnfnwrzhOz06uh45oHY8un0kDk4CJR5B32TbQDw,3950
|
|
19
19
|
librelane/config/__init__.py,sha256=lbJmD5CbrrrnaNdIUWqFIK488ea0uyej3iExh-9mkgE,1107
|
|
20
20
|
librelane/config/__main__.py,sha256=NsJGoIOb950mdXql1zmzSq10wuFovK9NGWm011NNJ3A,4474
|
|
21
|
-
librelane/config/config.py,sha256=
|
|
22
|
-
librelane/config/flow.py,sha256=
|
|
21
|
+
librelane/config/config.py,sha256=V0GrsDs8N46C1UJtOIFsVPYbk4wWO94iXTFxSO0fCBo,36708
|
|
22
|
+
librelane/config/flow.py,sha256=mBZkBuQOvke9Xf8OQuTvGmJSX72UfQ5xI0ycTbNm-dc,18618
|
|
23
23
|
librelane/config/pdk_compat.py,sha256=NI_vwueokX7lccbMFOCR7NNHq7VNvs3Euw6A3oQYgOY,13988
|
|
24
24
|
librelane/config/preprocessor.py,sha256=kef1hGXcL3tqNhKFAV5Oqt53jKM2Gsa9bBjojdSXUKE,14075
|
|
25
25
|
librelane/config/removals.py,sha256=57jRLJ8505IsNbyr68iAyHBFEyIloq7DQUPw4L3iisc,3173
|
|
@@ -54,7 +54,7 @@ librelane/flows/synth_explore.py,sha256=brLxVFg1VOczN_U8DqYtYkRZWFdUHqZKYjX3mf_t
|
|
|
54
54
|
librelane/help/__main__.py,sha256=gnm0yi-Ih8YoyY2cMiHONV2ZzR-tvHfdEHCb28YQJZ0,1243
|
|
55
55
|
librelane/logging/__init__.py,sha256=mrTnzjpH6AOu2CiDZYfOMCVByAS2Xeg9HS4FJyXsJOE,1043
|
|
56
56
|
librelane/logging/logger.py,sha256=kA61TGsR00Fi6kQSxgTC1pHpS_-zqC1PdQnYqnk2TWY,8632
|
|
57
|
-
librelane/pdk_hashes.yaml,sha256=
|
|
57
|
+
librelane/pdk_hashes.yaml,sha256=FFcmt6hZKFlM4Q4zEoqn40X1OH_5OxiliXurAjAaePo,153
|
|
58
58
|
librelane/plugins.py,sha256=G5o2h1LT4a1LO1Q0gKXXuhqcEdjdTFkYU8QUSg2D2eM,820
|
|
59
59
|
librelane/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
60
60
|
librelane/scripts/base.sdc,sha256=zGPSBLDt-5dbYvm3AGbjsZsyKxjFOc4znyjwZM4wIps,3145
|
|
@@ -67,21 +67,21 @@ librelane/scripts/klayout/xml_drc_report_to_json.py,sha256=NZlBoYJh2bqfqevTrDWEQ
|
|
|
67
67
|
librelane/scripts/klayout/xor.drc,sha256=Nm_6JR_png-31uajL3DrW3dVGo7Kd6G-zS9RTftL25o,3131
|
|
68
68
|
librelane/scripts/magic/Readme.md,sha256=NaQrlxY8l8GT-kokJNlMHeAR3PksWVbFpSznOWWshhw,126
|
|
69
69
|
librelane/scripts/magic/common/read.tcl,sha256=OSp7JxLxqJhE0lslVJgvAthLCeYHUJKUlMwTT14q1LA,3278
|
|
70
|
-
librelane/scripts/magic/def/antenna_check.tcl,sha256=
|
|
71
|
-
librelane/scripts/magic/def/mag.tcl,sha256=
|
|
72
|
-
librelane/scripts/magic/def/mag_gds.tcl,sha256=
|
|
73
|
-
librelane/scripts/magic/drc.tcl,sha256=
|
|
74
|
-
librelane/scripts/magic/extract_spice.tcl,sha256=
|
|
75
|
-
librelane/scripts/magic/gds/drc_batch.tcl,sha256=
|
|
76
|
-
librelane/scripts/magic/gds/erase_box.tcl,sha256=
|
|
77
|
-
librelane/scripts/magic/gds/extras_mag.tcl,sha256=
|
|
78
|
-
librelane/scripts/magic/gds/mag_with_pointers.tcl,sha256=
|
|
79
|
-
librelane/scripts/magic/get_bbox.tcl,sha256=
|
|
80
|
-
librelane/scripts/magic/lef/extras_maglef.tcl,sha256=
|
|
81
|
-
librelane/scripts/magic/lef/maglef.tcl,sha256=
|
|
82
|
-
librelane/scripts/magic/lef.tcl,sha256=
|
|
70
|
+
librelane/scripts/magic/def/antenna_check.tcl,sha256=k35mexWum_rMt73z7GonxysuV9DAZYDFAkf0QlmF1GE,1064
|
|
71
|
+
librelane/scripts/magic/def/mag.tcl,sha256=L23NgMcBhsfQiUOtFLsm20VNus_ZgO5S3048QYQsOlk,753
|
|
72
|
+
librelane/scripts/magic/def/mag_gds.tcl,sha256=CuaUrNcprsYJHBcK7lWFwKN9onbjlp5wUzjxjdAfnK0,2558
|
|
73
|
+
librelane/scripts/magic/drc.tcl,sha256=gVwK2gjVW7CztchM2A4GIFkIl7fz6OPHw9PxF7vh90s,3214
|
|
74
|
+
librelane/scripts/magic/extract_spice.tcl,sha256=Rhv1HkImwoPeMzYbrQL0jQM1rXqwWWXLukPiZ34EBmA,2993
|
|
75
|
+
librelane/scripts/magic/gds/drc_batch.tcl,sha256=wcU1ZqY_JXlutWFlib6bDyPrPbQEVSmcB_tJR_sJbSo,2236
|
|
76
|
+
librelane/scripts/magic/gds/erase_box.tcl,sha256=F7xYZ05uxa_uKcQX9HiMHgiHX0chfrvk5L2Oe1RyiQs,975
|
|
77
|
+
librelane/scripts/magic/gds/extras_mag.tcl,sha256=wugfabgtm3MZuB5HiahW2gutbqqBvQIY1iHVA8o9ISc,1341
|
|
78
|
+
librelane/scripts/magic/gds/mag_with_pointers.tcl,sha256=08c9tYj-TdzMM6dp1WW0f4mer3rzKDPvv7dU6D77byU,1093
|
|
79
|
+
librelane/scripts/magic/get_bbox.tcl,sha256=8ELR3JiS_4JpfxV5I1G0iBDErvmf2FClt4yoZ_xeXYc,391
|
|
80
|
+
librelane/scripts/magic/lef/extras_maglef.tcl,sha256=OyeFrqEGVcRJIpQmCgmf6Y6muW2y9xbitM1J6wZJ2GE,1623
|
|
81
|
+
librelane/scripts/magic/lef/maglef.tcl,sha256=1vpAP4U4gP67_Gu1IjaCaRJ4fuW78CoAljd6Xc5KDS4,893
|
|
82
|
+
librelane/scripts/magic/lef.tcl,sha256=8xSeBUjCiv9b7hNr0dW8QruNAOe1E5F83yXMa3n9Glw,2199
|
|
83
83
|
librelane/scripts/magic/open.tcl,sha256=v-4xFkcFxoLl_IpKCcEBoclZO4S0zkJLHhd60QaxSuo,1000
|
|
84
|
-
librelane/scripts/magic/spice_rcx.tcl,sha256=
|
|
84
|
+
librelane/scripts/magic/spice_rcx.tcl,sha256=b6RimpEF3xh27pFjPMTrixyCjUk1W7mSUApat4OEzKg,2170
|
|
85
85
|
librelane/scripts/magic/wrapper.tcl,sha256=qO33N2AiEYBTABMB5vWMWWEd2FpyOhg8JlcGsBVD6MY,712
|
|
86
86
|
librelane/scripts/netgen/setup.tcl,sha256=_NfZUGFeSxFzanm32r0ytipSYg6JXVjC3oPdIgYj7NY,1281
|
|
87
87
|
librelane/scripts/odbpy/apply_def_template.py,sha256=Tn6y65biu0bAQ6XilYxq5jn3a_KqjTl423-aXWI864k,1534
|
|
@@ -100,7 +100,7 @@ librelane/scripts/odbpy/ioplace_parser/parse.py,sha256=L2GXzNA-gkjyySZcTWXrRRP8r
|
|
|
100
100
|
librelane/scripts/odbpy/label_macro_pins.py,sha256=n3o9-_g6HkVP8k49yNnCkQJms9f_ykCE0Rye7bVFtIk,8620
|
|
101
101
|
librelane/scripts/odbpy/lefutil.py,sha256=XhfWSGHdn96yZWYQAPisgJM0iuY3xw4SW7jmMTzbpZs,3064
|
|
102
102
|
librelane/scripts/odbpy/placers.py,sha256=mgy_-GYeLDPMG41YAopMTtJyCHP6ucJRk7cJzI9PLRQ,4572
|
|
103
|
-
librelane/scripts/odbpy/power_utils.py,sha256=
|
|
103
|
+
librelane/scripts/odbpy/power_utils.py,sha256=fxT4BmBkkeruw6ms1EJJdAgq_JfbUXOAdZJ6BC0FQFo,15099
|
|
104
104
|
librelane/scripts/odbpy/random_place.py,sha256=TEsV4LtXQTP8OJvnBh09Siu9fKkwG9UpIkCkQpdXAgU,1649
|
|
105
105
|
librelane/scripts/odbpy/reader.py,sha256=uoLHGKfXRoMdrfXmkgIj3HHa_sqMOFvB3DIUT3vSSQw,8542
|
|
106
106
|
librelane/scripts/odbpy/remove_buffers.py,sha256=f-kGZIPnMtu4gnl2r2CDkng8U8vUMJKJWNV_akOpc38,5460
|
|
@@ -112,8 +112,8 @@ librelane/scripts/openroad/buffer_list.tcl,sha256=sXygy1KRSUS4dZi1UOpBkGGOuXRVLM
|
|
|
112
112
|
librelane/scripts/openroad/common/dpl.tcl,sha256=T_rzoZy8i7S9C92TOmiN79w0MCfudafEhkXcHmB1BAM,920
|
|
113
113
|
librelane/scripts/openroad/common/dpl_cell_pad.tcl,sha256=KWVuj8u1-y3ZUiQr48TAsFv1GSzOCVnAjdqfBjtoQxQ,1066
|
|
114
114
|
librelane/scripts/openroad/common/grt.tcl,sha256=VbZORyX7DljoylaUXyhY5vDIjAoYMlLGgrY_ZnXiJoE,1111
|
|
115
|
-
librelane/scripts/openroad/common/io.tcl,sha256
|
|
116
|
-
librelane/scripts/openroad/common/pad_cfg.tcl,sha256=
|
|
115
|
+
librelane/scripts/openroad/common/io.tcl,sha256=-QYM-if_iONa6CuOiaIQDOXJBpwZnDNethPKWWjUQMo,25365
|
|
116
|
+
librelane/scripts/openroad/common/pad_cfg.tcl,sha256=2WMNEwWJUZq3UQsTVJBDJfZE5dDdVKkYQ6b-_3iDO5g,10643
|
|
117
117
|
librelane/scripts/openroad/common/pdn_cfg.tcl,sha256=ovCfiwTD-ft6OXksI9hwgZZ6ynwQohC79HIU88fHvf4,6354
|
|
118
118
|
librelane/scripts/openroad/common/resizer.tcl,sha256=OhjpVxw_8IOx5Bmh2_gh_EIHxKaX84NS37Of9Rlchpw,2255
|
|
119
119
|
librelane/scripts/openroad/common/set_global_connections.tcl,sha256=gMbxRe40okHgickWZW1VhtosMwzcylrnAEsXhqHjtZk,3018
|
|
@@ -137,7 +137,7 @@ librelane/scripts/openroad/irdrop.tcl,sha256=bXhNY_87xPV-ocF9v8wOWqjlnFPaVO_6K_D
|
|
|
137
137
|
librelane/scripts/openroad/pad.tcl,sha256=ZEFhUfGDfWm-eNp-HkB_Q82jkdPNsK8vTN4QKzlxIaI,801
|
|
138
138
|
librelane/scripts/openroad/pdn.tcl,sha256=WiKVmLw3g_ZN1Hs4iiAzc6Qah7ZwCn6o-OA5iNmlTtY,1566
|
|
139
139
|
librelane/scripts/openroad/rcx.tcl,sha256=kyEhli4sGFMEj-He9UXZDGb0Tmxlw7d6iZD7t6adUx8,1057
|
|
140
|
-
librelane/scripts/openroad/repair_design.tcl,sha256=
|
|
140
|
+
librelane/scripts/openroad/repair_design.tcl,sha256=ojwbIgUHShUFEzQtTfv6gq365ExPgpXbRSuMOK9xKm0,2575
|
|
141
141
|
librelane/scripts/openroad/repair_design_postgrt.tcl,sha256=sEXdFfH2le-q0ggcsWGgCR-GCFyzPdxk4P3RZyWCnpI,1902
|
|
142
142
|
librelane/scripts/openroad/rsz_timing_postcts.tcl,sha256=ztDJ__R7f3eK7-xAg9SklGXqL5F1jydGPQDH7X5twNE,2553
|
|
143
143
|
librelane/scripts/openroad/rsz_timing_postgrt.tcl,sha256=F6ex9Ke85YzS4z9rf8SpqCKjMyzuiQEhYYSJfkN93sM,2699
|
|
@@ -148,8 +148,8 @@ librelane/scripts/openroad/ungpl.tcl,sha256=vhHxou1W3VROwJePoQzmWn0h0d5lQrrt1vof
|
|
|
148
148
|
librelane/scripts/openroad/write_cdl.tcl,sha256=pp-l-7JkuwpdtR1bypIVI_PKCOGCoUOD9Gy3Bi9wY4U,1159
|
|
149
149
|
librelane/scripts/openroad/write_views.tcl,sha256=-MxTJsB4EF7l5trDaZe-VBFjhfzqRt8F5_DZrADTs0U,892
|
|
150
150
|
librelane/scripts/pyosys/construct_abc_script.py,sha256=6lJ__CUU5MKEkBD8o_Xfq-I299fIJDJCuGi14QjaiEk,6742
|
|
151
|
-
librelane/scripts/pyosys/json_header.py,sha256=
|
|
152
|
-
librelane/scripts/pyosys/synthesize.py,sha256=
|
|
151
|
+
librelane/scripts/pyosys/json_header.py,sha256=LSoDHLMKch3tUwsjrps2HdF6PJZ3ydxM8NZHf3z0Bz4,2525
|
|
152
|
+
librelane/scripts/pyosys/synthesize.py,sha256=ZF24YghHAb-dq31X-XbJXFC8rMr2_vpWPj3KBV3fAjA,18884
|
|
153
153
|
librelane/scripts/pyosys/ys_common.py,sha256=CsqHbuqFi3T5FWwETpwHex0EPj9PWKxrA_kEMYqPWH8,4287
|
|
154
154
|
librelane/scripts/tclsh/hello.tcl,sha256=kkR3akY7QnGHYXsQODYwLkMkUEOgWcNFtzaMTTEV2bY,34
|
|
155
155
|
librelane/state/__init__.py,sha256=DZ_RyKMr2oj4p5d32u8MmDKfCxR7OEdDw-1HWKTpatA,949
|
|
@@ -159,20 +159,20 @@ librelane/state/state.py,sha256=5ydOmP_eYTJ8X7TqtmE7LQx-OXuHnrPmoHZifwJa-Gg,1244
|
|
|
159
159
|
librelane/steps/__init__.py,sha256=j3JYrdnWM74dYuEvE931oSrQI7FUz-hKWr8Mts8C0wg,1668
|
|
160
160
|
librelane/steps/__main__.py,sha256=7TaEmJGiphnIqEbAALyThNQPNlelXeJRHg114P6DZ4M,13463
|
|
161
161
|
librelane/steps/checker.py,sha256=CxGshm_2K1-zFTso-aPZNFuu-Y9hdSv5KkjumN6pbLY,22655
|
|
162
|
-
librelane/steps/common_variables.py,sha256=
|
|
163
|
-
librelane/steps/klayout.py,sha256=
|
|
162
|
+
librelane/steps/common_variables.py,sha256=tTEVB9bnZ8AnufEVZUGS6fnpQWfpyyBVK_Eax5DVD64,14990
|
|
163
|
+
librelane/steps/klayout.py,sha256=ifaDO_6soOzQGFh1SxVPvjTctoPqhlY3Iw7-Q-OoKDE,45776
|
|
164
164
|
librelane/steps/magic.py,sha256=GS2TzOzf3XZuYIzz5P3CQ3T_QHb47YTMaTbA9-ggb0M,28044
|
|
165
165
|
librelane/steps/misc.py,sha256=3O-6V3QPnqsYACoogg9I7SrJ7C0VMQbtA0anF13wa7w,5806
|
|
166
166
|
librelane/steps/netgen.py,sha256=tfHaY2ItpmmbKhSuduPvGmMw8Rqb7O1sLpXEDKSVEXg,9454
|
|
167
167
|
librelane/steps/odb.py,sha256=Nrk37F33-qKz-pcCYAWvWkOlSHiLMwSqpeYldx33v1Q,40772
|
|
168
|
-
librelane/steps/openroad.py,sha256=
|
|
168
|
+
librelane/steps/openroad.py,sha256=Tocw1op9Q8mFDZ74l-kbxaHocIIv8h8_a0IIZXGx0dk,109213
|
|
169
169
|
librelane/steps/openroad_alerts.py,sha256=IJyB4piBDCKXhkJswHGMYCRDwbdQsR0GZlrGGDhmW6Q,3364
|
|
170
170
|
librelane/steps/pyosys.py,sha256=QIChT0BkUDWUBdoUzRU4gW5V4m46WbAE6F4ZNlCZtWY,26126
|
|
171
171
|
librelane/steps/step.py,sha256=gtr8xlNv4J4m4maqO6V1R0YPK_IpX6g_6X6Mk-_Oklc,55539
|
|
172
172
|
librelane/steps/tclstep.py,sha256=68AjCmbLhBscbzQDxRcPQVU-6UvZQNOalO7qNwUXCa4,10138
|
|
173
|
-
librelane/steps/verilator.py,sha256=
|
|
173
|
+
librelane/steps/verilator.py,sha256=ombKve0tXRcq3FnsZGDcyJnq_5SmhoLJt-FCPBm-4b0,9815
|
|
174
174
|
librelane/steps/yosys.py,sha256=eRXc-pWuAY_E8jO7lKZ97Vd9fNYVwIeR1X2TMzGz5uw,13120
|
|
175
|
-
librelane-3.1.0.
|
|
176
|
-
librelane-3.1.0.
|
|
177
|
-
librelane-3.1.0.
|
|
178
|
-
librelane-3.1.0.
|
|
175
|
+
librelane-3.1.0.dev2.dist-info/METADATA,sha256=e7IHN2FGX9iW3Dh-3ryjo1FYDpha9XDDyiHd5JTGWb8,8766
|
|
176
|
+
librelane-3.1.0.dev2.dist-info/WHEEL,sha256=EGEvSphFYqXKs23-kQBeyNoJP1nrT8ZJKQoi5p5DYL8,88
|
|
177
|
+
librelane-3.1.0.dev2.dist-info/entry_points.txt,sha256=Ub2wE2U4uZPjJgBVTPYFeXtwhNyqAqaKT8q4jGoKIUk,274
|
|
178
|
+
librelane-3.1.0.dev2.dist-info/RECORD,,
|
|
File without changes
|