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.
Files changed (31) hide show
  1. librelane/config/config.py +9 -4
  2. librelane/config/flow.py +6 -0
  3. librelane/pdk_hashes.yaml +2 -2
  4. librelane/scripts/magic/def/antenna_check.tcl +3 -0
  5. librelane/scripts/magic/def/mag.tcl +4 -1
  6. librelane/scripts/magic/def/mag_gds.tcl +1 -0
  7. librelane/scripts/magic/drc.tcl +1 -0
  8. librelane/scripts/magic/extract_spice.tcl +3 -0
  9. librelane/scripts/magic/gds/drc_batch.tcl +3 -0
  10. librelane/scripts/magic/gds/erase_box.tcl +4 -0
  11. librelane/scripts/magic/gds/extras_mag.tcl +2 -0
  12. librelane/scripts/magic/gds/mag_with_pointers.tcl +2 -0
  13. librelane/scripts/magic/get_bbox.tcl +4 -0
  14. librelane/scripts/magic/lef/extras_maglef.tcl +2 -0
  15. librelane/scripts/magic/lef/maglef.tcl +2 -0
  16. librelane/scripts/magic/lef.tcl +3 -0
  17. librelane/scripts/magic/spice_rcx.tcl +4 -0
  18. librelane/scripts/odbpy/power_utils.py +9 -2
  19. librelane/scripts/openroad/common/io.tcl +5 -1
  20. librelane/scripts/openroad/common/pad_cfg.tcl +25 -11
  21. librelane/scripts/openroad/repair_design.tcl +5 -2
  22. librelane/scripts/pyosys/json_header.py +5 -0
  23. librelane/scripts/pyosys/synthesize.py +15 -6
  24. librelane/steps/common_variables.py +1 -1
  25. librelane/steps/klayout.py +12 -9
  26. librelane/steps/openroad.py +13 -0
  27. librelane/steps/verilator.py +15 -1
  28. {librelane-3.1.0.dev1.dist-info → librelane-3.1.0.dev2.dist-info}/METADATA +1 -1
  29. {librelane-3.1.0.dev1.dist-info → librelane-3.1.0.dev2.dist-info}/RECORD +31 -31
  30. {librelane-3.1.0.dev1.dist-info → librelane-3.1.0.dev2.dist-info}/WHEEL +1 -1
  31. {librelane-3.1.0.dev1.dist-info → librelane-3.1.0.dev2.dist-info}/entry_points.txt +0 -0
@@ -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 Volare is not installed.
498
+ :param pdk_root: Required if Ciel is not installed.
499
499
 
500
- If Volare is installed, this value can be used to optionally override
501
- Volare's default.
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, None),
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: d815bb30c9afdf9e264c276a8a2b533108dea3d0
2
- gf180mcu: d815bb30c9afdf9e264c276a8a2b533108dea3d0
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)."
@@ -18,6 +18,7 @@
18
18
  source $::env(SCRIPTS_DIR)/magic/common/read.tcl
19
19
  drc off
20
20
  crashbackups disable
21
+ locking disable
21
22
 
22
23
  gds noduplicates true
23
24
  gds readonly true
@@ -17,6 +17,7 @@
17
17
  # limitations under the License.
18
18
 
19
19
  crashbackups disable
20
+ locking disable
20
21
  units internal
21
22
 
22
23
  # Read in maglef views in order to blackbox cells
@@ -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)
@@ -12,6 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ crashbackups disable
16
+ locking disable
17
+
15
18
  if { [info exists ::env(TECH)] } {
16
19
  tech load $::env(TECH)
17
20
  }
@@ -12,6 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ drc off
16
+ crashbackups disable
17
+ locking disable
18
+
15
19
  tech unlock *
16
20
 
17
21
  gds read $::env(CURRENT_GDS)
@@ -17,6 +17,8 @@
17
17
  # corresponding maglefs
18
18
 
19
19
  drc off
20
+ crashbackups disable
21
+ locking disable
20
22
 
21
23
  gds readonly true
22
24
  gds rescale false
@@ -13,6 +13,8 @@
13
13
  # limitations under the License.
14
14
 
15
15
  drc off
16
+ crashbackups disable
17
+ locking disable
16
18
 
17
19
  gds readonly true
18
20
  gds rescale false
@@ -1,3 +1,7 @@
1
+ drc off
2
+ crashbackups disable
3
+ locking disable
4
+
1
5
  gds read $::env(_GDS_IN)
2
6
  load $::env(_MACRO_NAME_IN)
3
7
  set curunits [units]
@@ -15,6 +15,8 @@
15
15
  # convert all external macros to maglef views with GDS_* pointers
16
16
 
17
17
  drc off
18
+ crashbackups disable
19
+ locking disable
18
20
 
19
21
  if { [info exist ::env(EXTRA_LEFS)] } {
20
22
  foreach lef_file $::env(EXTRA_LEFS) {
@@ -13,6 +13,8 @@
13
13
  # limitations under the License.
14
14
 
15
15
  drc off
16
+ crashbackups disable
17
+ locking disable
16
18
 
17
19
  lef read $::env(signoff_results)/$::env(DESIGN_NAME).lef
18
20
 
@@ -16,6 +16,9 @@
16
16
  # See the License for the specific language governing permissions and
17
17
  # limitations under the License.
18
18
  drc off
19
+ crashbackups disable
20
+ locking disable
21
+
19
22
  if { $::env(MAGIC_LEF_WRITE_USE_GDS) } {
20
23
  gds read $::env(CURRENT_GDS)
21
24
  } else {
@@ -16,6 +16,10 @@
16
16
  # See the License for the specific language governing permissions and
17
17
  # limitations under the License.
18
18
 
19
+ drc off
20
+ crashbackups disable
21
+ locking disable
22
+
19
23
  # we do always want to read the GDS for this
20
24
  gds read $::env(CURRENT_GDS)
21
25
 
@@ -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
- for bit in info["bits"]:
56
- netname_by_bit[bit] = netname
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
- write_timing_model -corner $corner_name $target
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 minimum site width (min. filler)
133
- set space_between_pads_min_filler [expr round(floor($space_between_pads / $pad_site_width) * $pad_site_width * 1000) / 1000]
134
- puts "space_between_pads_min_filler: $space_between_pads_min_filler"
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 round(($space_for_fill - $space_between_pads_min_filler * ([llength $::env($side)] - 1)) / 2 * 1000) / 1000]
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 != round(floor($space_side / $pad_site_width) * $pad_site_width * 1000) / 1000 } {
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 + $space_between_pads_min_filler + $width]
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]
@@ -43,6 +43,11 @@ def json_header(
43
43
  "__librelane__",
44
44
  "__pnr__",
45
45
  ]
46
+ + (
47
+ [f"PAD_{config['PAD_CELL_LIBRARY']}"]
48
+ if "PAD_CELL_LIBRARY" in config
49
+ else []
50
+ )
46
51
  + (
47
52
  []
48
53
  if config.get("VERILOG_POWER_DEFINE") is None
@@ -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 = (config.get("VERILOG_DEFINES") or []) + [
255
- f"PDK_{config['PDK'].replace('-','_')}",
256
- f"SCL_{config['STD_CELL_LIBRARY']}",
257
- "__librelane__",
258
- "__pnr__",
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 `FP_PDN_RAILS_LAYER` layer.",
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"],
@@ -171,7 +171,7 @@ class Render(KLayoutStep):
171
171
  id = "KLayout.Render"
172
172
  name = "Render Image (w/ KLayout)"
173
173
 
174
- inputs = [DesignFormat.DEF]
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[DesignFormat.DEF]
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, only sky130A and sky130B are supported.
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[bool, int, str]]],
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"thr={threads}",
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"thr={threads}",
733
+ f"threads={threads}",
731
734
  ]
732
735
  )
733
736
 
@@ -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):
@@ -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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: librelane
3
- Version: 3.1.0.dev1
3
+ Version: 3.1.0.dev2
4
4
  Summary: An infrastructure for implementing chip design flows
5
5
  License-Expression: Apache-2.0
6
6
  Maintainer: Mohamed Gaber
@@ -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=W0kaWl3S4jIgnQqUEMt6JhraLRVK14yAUBJvCgN6Fwc,36482
22
- librelane/config/flow.py,sha256=1sqjZzIuQswDekQGqSDrsPZP3JJF2VI1t8HkLJxb9RM,18349
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=871iaOHLpvYy-heaawPKZQVrbVDfXOYYAkvLWyU2B5c,153
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=T_r1CWgySFVlLMcoTrNXQ_aMRs_fBAUYUUjyXJV1Sg0,1019
71
- librelane/scripts/magic/def/mag.tcl,sha256=PuL3MH6pmZP5Qh2cJ0GygWNzaYjdCSCoAbOli-JB4fs,707
72
- librelane/scripts/magic/def/mag_gds.tcl,sha256=k2th7LTLNOJWAQ_3FUv-ZHT6yDeIJd8qKM3JLKBfoAY,2542
73
- librelane/scripts/magic/drc.tcl,sha256=clVgX0R_ObY_2dYV6naNY_WmiOrQUDJ1wcUTiwWsZuE,3198
74
- librelane/scripts/magic/extract_spice.tcl,sha256=xMiCM6F3D8W_vw3yQMTr4f_RLbgmHOWgl_G8FQRrzio,2948
75
- librelane/scripts/magic/gds/drc_batch.tcl,sha256=O76rwxSrQgoCuoxk36tRBZkQaeMfJknlHrQA3mtU2JU,2198
76
- librelane/scripts/magic/gds/erase_box.tcl,sha256=wsVSwMlkZFJa_MEGNsdXLnXFvjZlrl_lzIWkJjcDBgg,929
77
- librelane/scripts/magic/gds/extras_mag.tcl,sha256=1raG0URUezUDEKkdDeJqdlS0Y5gb4IzQFnjFysHHlmU,1304
78
- librelane/scripts/magic/gds/mag_with_pointers.tcl,sha256=mfYTQdio1XAA0DpWlV5JS7c3rkxtSS06kZqVfDfKGuQ,1056
79
- librelane/scripts/magic/get_bbox.tcl,sha256=YrYUzVsvP-3e06FJo-Z5pCFh-uXaIArJ2kA4kWtprtA,345
80
- librelane/scripts/magic/lef/extras_maglef.tcl,sha256=V0TivPN4aLJ0is497IAmOB1qQm8vmCqqycKuwV3w0HY,1586
81
- librelane/scripts/magic/lef/maglef.tcl,sha256=I6-xFtsCZQtQI4UbU53gaWrpELWUd4agNF5LLgq9Eq0,856
82
- librelane/scripts/magic/lef.tcl,sha256=BndytgoIosQf6UfKYayEzyUnJTSWLnh4isvqvvz5tLg,2161
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=4oct0ztaJxcljvT0YZelFyR-g5HkT3dnkNGxEu32N_A,2124
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=qbwhvW0QRiqtFXpYNGyfDIrhNZv9dt0JX2n4CQ8YRs8,14722
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=7fFAKKCLuiprB1uZ_P3e6DKwL628GhfW7JMiicKlx3M,25193
116
- librelane/scripts/openroad/common/pad_cfg.tcl,sha256=o7rn1VnoyLnxbY3F0IbP0hcgftCWZyY72OGDpcXr1Sw,9591
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=mSQKIT-uac2gJFia_xMNQtHJKD--aTI2T0gmM5mrWZA,2314
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=fbHPjUkTQHKbdGPh7P1jZjip3nat4k8oSD1N7rpXxFk,2389
152
- librelane/scripts/pyosys/synthesize.py,sha256=ESFDV5iWZ5A4m9VC17z0ZFAa2YAMljvIeo3NMzpeWmk,18666
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=DKEVLFgiBdzG3sYpV8O7hVOG1GmxTM7VDOe29zt2JSo,14994
163
- librelane/steps/klayout.py,sha256=ptpHJ8F1xZSDb345UfqYCgCjGNv-h_WqKtOvrvMBPtU,45715
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=J_QQPzrA03k2I0CLlQxRc5pnKs4QVzgmwOdjbqswIok,108651
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=6Pbxx_imsquOIVH8OTGSHwFj0yRvG57-c_tr6rlNxm4,9250
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.dev1.dist-info/METADATA,sha256=3T5IFkx1nOHNNNpYehUZJtsUfqoan0UhqlRPRS5pWMA,8766
176
- librelane-3.1.0.dev1.dist-info/WHEEL,sha256=Vz2fHgx6HFtSwhs8KvkHLqH5Ea4w1_rner5uNVGCeIE,88
177
- librelane-3.1.0.dev1.dist-info/entry_points.txt,sha256=Ub2wE2U4uZPjJgBVTPYFeXtwhNyqAqaKT8q4jGoKIUk,274
178
- librelane-3.1.0.dev1.dist-info/RECORD,,
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,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.3.2
2
+ Generator: poetry-core 2.4.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any