librelane 3.0.0.dev38__py3-none-any.whl → 3.0.0.dev40__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.

@@ -358,9 +358,10 @@ def compare_remote(
358
358
  for chunk in r.iter_bytes(chunk_size=8192):
359
359
  bio_gz.write(chunk)
360
360
  bio_gz.seek(0)
361
- with gzip.GzipFile(fileobj=bio_gz) as bio, tarfile.TarFile(
362
- fileobj=bio, mode="r"
363
- ) as tf:
361
+ with (
362
+ gzip.GzipFile(fileobj=bio_gz) as bio,
363
+ tarfile.TarFile(fileobj=bio, mode="r") as tf,
364
+ ):
364
365
  for file in tf:
365
366
  if file.isdir():
366
367
  continue
librelane/config/flow.py CHANGED
@@ -107,13 +107,13 @@ pdk_variables = [
107
107
  Variable(
108
108
  "FP_IO_HLAYER",
109
109
  str,
110
- "The metal layer on which to place horizontal IO pins, i.e., the top and bottom of the die.",
110
+ "The metal layer on which to place horizontally-aligned (long side parallel with the horizon) pins alongside the east and west edges of the die.",
111
111
  pdk=True,
112
112
  ),
113
113
  Variable(
114
114
  "FP_IO_VLAYER",
115
115
  str,
116
- "The metal layer on which to place vertical IO pins, i.e., the top and bottom of the die.",
116
+ "The metal layer on which to place vertically-aligned (long side perpendicular to the horizon) pins alongside the north and south edges of the die.",
117
117
  pdk=True,
118
118
  ),
119
119
  Variable("RT_MIN_LAYER", str, "The lowest metal layer to route on.", pdk=True),
@@ -440,7 +440,7 @@ class Variable:
440
440
  return_value = list()
441
441
  raw = value
442
442
  if isinstance(raw, list) or isinstance(raw, tuple):
443
- if validating_type == List[Path]:
443
+ if type_origin == list and type_args == (str,):
444
444
  if any(isinstance(item, List) for item in raw):
445
445
  Variable.__flatten_list(value)
446
446
  pass
librelane/flows/cli.py CHANGED
@@ -218,27 +218,30 @@ def cloup_flow_opts(
218
218
  function decorated with @cloup.command (https://cloup.readthedocs.io/en/stable/autoapi/cloup/index.html#cloup.command).
219
219
 
220
220
  The following keyword arguments will be passed to the decorated function.
221
+
221
222
  * Those postfixed ‡ are compatible with the constructor for :class:`Flow`.
222
223
  * Those postfixed § are compatible with the :meth:`Flow.start`.
223
224
 
225
+ ---
226
+
224
227
  * Flow configuration options (if parameter ``config_options`` is ``True``):
225
228
  * ``flow_name``: ``Optional[str]``: A valid flow ID to be used with :meth:`Flow.factory.get`
226
- * ``config_override_strings``‡: ``Optional[Iterable[str]]``
229
+ * ``config_override_strings`` ‡: ``Optional[Iterable[str]]``
227
230
  * Sequential flow controls (if parameter ``sequential_flow_controls`` is ``True``)
228
- * ``frm``§: ``Optional[str]``: Start from a step with this ID. Supported by sequential flows.
229
- * ``to``§: ``Optional[str]``: Stop at a step with this id. Supported by sequential flows.
230
- * ``skip``§: ``Iterable[str]``: Skip these steps. Supported by sequential flows.
231
+ * ``frm`` §: ``Optional[str]``: Start from a step with this ID. Supported by sequential flows.
232
+ * ``to`` §: ``Optional[str]``: Stop at a step with this id. Supported by sequential flows.
233
+ * ``skip`` §: ``Iterable[str]``: Skip these steps. Supported by sequential flows.
231
234
  * Sequential flow reproducible (if parameter ``sequential_flow_reproducible`` is ``True``)
232
- * ``reproducible``§: ``str``: Create a reproducible for a step with is ID, aborting the flow afterwards. Supported by sequential flows.
235
+ * ``reproducible`` §: ``str``: Create a reproducible for a step with is ID, aborting the flow afterwards. Supported by sequential flows.
233
236
  * Flow run options (if parameter ``run_options`` is ``True``):
234
- * ``tag``§: ``Optional[str]``
235
- * ``last_run``§: ``bool``: If ``True``, ``tag`` is guaranteed to be None.
236
- * ``with_initial_state``§: ``Optional[State]``
237
+ * ``tag`` §: ``Optional[str]``
238
+ * ``last_run`` §: ``bool``: If ``True``, ``tag`` is guaranteed to be None.
239
+ * ``with_initial_state`` §: ``Optional[State]``
237
240
  * PDK options
238
- * ``use_volare``: ``bool``
239
- * ``pdk_root``‡: ``Optional[str]``
240
- * ``pdk``‡: ``str``
241
- * ``scl``‡: ``Optional[str]``
241
+ * ``use_volare`` : ``bool``
242
+ * ``pdk_root`` ‡: ``Optional[str]``
243
+ * ``pdk`` ‡: ``str``
244
+ * ``scl`` ‡: ``Optional[str]``
242
245
  * ``config_files``: ``Iterable[str]``: Paths to configuration files (if
243
246
  parameter ``accept_config_files`` is ``True``)
244
247
 
librelane/flows/flow.py CHANGED
@@ -534,8 +534,11 @@ class Flow(ABC):
534
534
 
535
535
  :param with_initial_state: An optional initial state object to use.
536
536
  If not provided:
537
+
537
538
  * If resuming a previous run, the latest ``state_out.json`` (by filesystem modification date)
539
+
538
540
  * If not, an empty state object is created.
541
+
539
542
  :param tag: A name for this invocation of the flow. If not provided,
540
543
  one based on a date string will be created.
541
544
 
@@ -913,9 +916,10 @@ class Flow(ABC):
913
916
  # Despite the name, this is the Magic DRC report simply
914
917
  # converted into a KLayout-compatible format. Confusing!
915
918
  drc_xml_out = os.path.join(openlane_signoff_dir, "drc.klayout.xml")
916
- with open(drc_xml, encoding="utf8") as i, open(
917
- drc_xml_out, "w", encoding="utf8"
918
- ) as o:
919
+ with (
920
+ open(drc_xml, encoding="utf8") as i,
921
+ open(drc_xml_out, "w", encoding="utf8") as o,
922
+ ):
919
923
  o.write(
920
924
  "<!-- Despite the name, this is the Magic DRC report in KLayout format. -->\n"
921
925
  )
@@ -999,8 +1003,9 @@ class Flow(ABC):
999
1003
  A factory singleton for Flows, allowing Flow types to be registered and then
1000
1004
  retrieved by name.
1001
1005
 
1002
- See https://en.wikipedia.org/wiki/Factory_(object-oriented_programming) for
1003
- a primer.
1006
+ See
1007
+ `Factory (object-oriented programming) on Wikipedia <https://en.wikipedia.org/wiki/Factory_(object-oriented_programming)>`_
1008
+ for a primer.
1004
1009
  """
1005
1010
 
1006
1011
  __registry: ClassVar[Dict[str, Type[Flow]]] = {}
@@ -12,6 +12,13 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ # Flatten cells
16
+ if { [info exists ::env(MAGIC_GDS_FLATGLOB)] } {
17
+ foreach {gds_flatglob} $::env(MAGIC_GDS_FLATGLOB) {
18
+ gds flatglob $gds_flatglob
19
+ }
20
+ }
21
+
15
22
  if { $::env(MAGIC_DRC_USE_GDS) } {
16
23
  gds read $::env(CURRENT_GDS)
17
24
  } else {
@@ -1,3 +1,7 @@
1
+ # Copyright 2025 LibreLane Contributors
2
+ #
3
+ # Adapted from OpenLane
4
+ #
1
5
  # Copyright 2022-2025 Efabless Corporation
2
6
  #
3
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -641,6 +645,13 @@ proc append_if_not_flag {list_arg glob_variable_name flag} {
641
645
  }
642
646
  }
643
647
 
648
+ proc append_if_equals {list_arg glob_variable_name value flag} {
649
+ upvar $list_arg local_array
650
+ if { [info exists ::env($glob_variable_name)] && $::env($glob_variable_name) == $value } {
651
+ lappend local_array $flag
652
+ }
653
+ }
654
+
644
655
  # Code below adapted from OpenROAD Flow Scripts under the following license:
645
656
  #
646
657
  # BSD 3-Clause License
@@ -1,3 +1,7 @@
1
+ # Copyright 2025 LibreLane Contributors
2
+ #
3
+ # Adapted from OpenLane
4
+ #
1
5
  # Copyright 2020-2022 Efabless Corporation
2
6
  #
3
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,6 +16,7 @@
12
16
  # See the License for the specific language governing permissions and
13
17
  # limitations under the License.
14
18
 
19
+ source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
15
20
  source $::env(SCRIPTS_DIR)/openroad/common/set_global_connections.tcl
16
21
  set_global_connections
17
22
 
@@ -43,12 +48,24 @@ foreach vdd $::env(VDD_NETS) gnd $::env(GND_NETS) {
43
48
  set_voltage_domain -name CORE -power $::env(VDD_NET) -ground $::env(GND_NET) \
44
49
  -secondary_power $secondary
45
50
 
51
+
52
+
46
53
  if { $::env(PDN_MULTILAYER) == 1 } {
54
+
55
+ set arg_list [list]
56
+ if { $::env(PDN_ENABLE_PINS) } {
57
+ lappend arg_list -pins "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)"
58
+ }
59
+
47
60
  define_pdn_grid \
48
61
  -name stdcell_grid \
49
62
  -starts_with POWER \
50
63
  -voltage_domain CORE \
51
- -pins "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)"
64
+ {*}$arg_list
65
+
66
+ set arg_list [list]
67
+ append_if_equals arg_list PDN_EXTEND_TO "core_ring" -extend_to_core_ring
68
+ append_if_equals arg_list PDN_EXTEND_TO "boundary" -extend_to_boundary
52
69
 
53
70
  add_pdn_stripe \
54
71
  -grid stdcell_grid \
@@ -57,7 +74,8 @@ if { $::env(PDN_MULTILAYER) == 1 } {
57
74
  -pitch $::env(PDN_VPITCH) \
58
75
  -offset $::env(PDN_VOFFSET) \
59
76
  -spacing $::env(PDN_VSPACING) \
60
- -starts_with POWER -extend_to_core_ring
77
+ -starts_with POWER \
78
+ {*}$arg_list
61
79
 
62
80
  add_pdn_stripe \
63
81
  -grid stdcell_grid \
@@ -66,17 +84,28 @@ if { $::env(PDN_MULTILAYER) == 1 } {
66
84
  -pitch $::env(PDN_HPITCH) \
67
85
  -offset $::env(PDN_HOFFSET) \
68
86
  -spacing $::env(PDN_HSPACING) \
69
- -starts_with POWER -extend_to_core_ring
87
+ -starts_with POWER \
88
+ {*}$arg_list
70
89
 
71
90
  add_pdn_connect \
72
91
  -grid stdcell_grid \
73
92
  -layers "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)"
74
93
  } else {
94
+
95
+ set arg_list [list]
96
+ if { $::env(PDN_ENABLE_PINS) } {
97
+ lappend arg_list -pins "$::env(PDN_VERTICAL_LAYER)"
98
+ }
99
+
75
100
  define_pdn_grid \
76
101
  -name stdcell_grid \
77
102
  -starts_with POWER \
78
103
  -voltage_domain CORE \
79
- -pins $::env(PDN_VERTICAL_LAYER)
104
+ {*}$arg_list
105
+
106
+ set arg_list [list]
107
+ append_if_equals arg_list PDN_EXTEND_TO "core_ring" -extend_to_core_ring
108
+ append_if_equals arg_list PDN_EXTEND_TO "boundary" -extend_to_boundary
80
109
 
81
110
  add_pdn_stripe \
82
111
  -grid stdcell_grid \
@@ -85,7 +114,8 @@ if { $::env(PDN_MULTILAYER) == 1 } {
85
114
  -pitch $::env(PDN_VPITCH) \
86
115
  -offset $::env(PDN_VOFFSET) \
87
116
  -spacing $::env(PDN_VSPACING) \
88
- -starts_with POWER -extend_to_core_ring
117
+ -starts_with POWER \
118
+ {*}$arg_list
89
119
  }
90
120
 
91
121
  # Adds the standard cell rails if enabled.
@@ -105,21 +135,50 @@ if { $::env(PDN_ENABLE_RAILS) == 1 } {
105
135
  # Adds the core ring if enabled.
106
136
  if { $::env(PDN_CORE_RING) == 1 } {
107
137
  if { $::env(PDN_MULTILAYER) == 1 } {
138
+ set arg_list [list]
139
+ append_if_flag arg_list PDN_CORE_RING_ALLOW_OUT_OF_DIE -allow_out_of_die
140
+ append_if_flag arg_list PDN_CORE_RING_CONNECT_TO_PADS -connect_to_pads
141
+ append_if_equals arg_list PDN_EXTEND_TO "boundary" -extend_to_boundary
142
+
143
+ set pdn_core_vertical_layer $::env(PDN_VERTICAL_LAYER)
144
+ set pdn_core_horizontal_layer $::env(PDN_HORIZONTAL_LAYER)
145
+
146
+ if { [info exists ::env(PDN_CORE_VERTICAL_LAYER)] } {
147
+ set pdn_core_vertical_layer $::env(PDN_CORE_VERTICAL_LAYER)
148
+ }
149
+
150
+ if { [info exists ::env(PDN_CORE_HORIZONTAL_LAYER)] } {
151
+ set pdn_core_horizontal_layer $::env(PDN_CORE_HORIZONTAL_LAYER)
152
+ }
153
+
108
154
  add_pdn_ring \
109
- -allow_out_of_die \
110
155
  -grid stdcell_grid \
111
- -layers "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)" \
156
+ -layers "$pdn_core_vertical_layer $pdn_core_horizontal_layer" \
112
157
  -widths "$::env(PDN_CORE_RING_VWIDTH) $::env(PDN_CORE_RING_HWIDTH)" \
113
158
  -spacings "$::env(PDN_CORE_RING_VSPACING) $::env(PDN_CORE_RING_HSPACING)" \
114
- -core_offset "$::env(PDN_CORE_RING_VOFFSET) $::env(PDN_CORE_RING_HOFFSET)"
159
+ -core_offset "$::env(PDN_CORE_RING_VOFFSET) $::env(PDN_CORE_RING_HOFFSET)" \
160
+ {*}$arg_list
161
+
162
+ if { [info exists ::env(PDN_CORE_VERTICAL_LAYER)] } {
163
+ add_pdn_connect \
164
+ -grid stdcell_grid \
165
+ -layers "$::env(PDN_CORE_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)"
166
+ }
167
+
168
+ if { [info exists ::env(PDN_CORE_HORIZONTAL_LAYER)] } {
169
+ add_pdn_connect \
170
+ -grid stdcell_grid \
171
+ -layers "$::env(PDN_CORE_HORIZONTAL_LAYER) $::env(PDN_VERTICAL_LAYER)"
172
+ }
173
+
174
+ if { [info exists ::env(PDN_CORE_VERTICAL_LAYER)] && [info exists ::env(PDN_CORE_HORIZONTAL_LAYER)] } {
175
+ add_pdn_connect \
176
+ -grid stdcell_grid \
177
+ -layers "$::env(PDN_CORE_VERTICAL_LAYER) $::env(PDN_CORE_HORIZONTAL_LAYER)"
178
+ }
179
+
115
180
  } else {
116
181
  throw APPLICATION "PDN_CORE_RING cannot be used when PDN_MULTILAYER is set to false."
117
- # add_pdn_ring \
118
- # -grid stdcell_grid \
119
- # -layers "$::env(PDN_VERTICAL_LAYER)" \
120
- # -widths "$::env(PDN_CORE_RING_VWIDTH)" \
121
- # -spacings "$::env(PDN_CORE_RING_VSPACING)" \
122
- # -core_offset "$::env(PDN_CORE_RING_VOFFSET)"
123
182
  }
124
183
  }
125
184
 
@@ -53,6 +53,12 @@ if { $::env(IO_PIN_PLACEMENT_MODE) == "annealing" } {
53
53
  lappend arg_list -annealing
54
54
  }
55
55
 
56
+ if { [info exists ::env(IO_EXCLUDE_PIN_REGION)] } {
57
+ foreach exclude $::env(IO_EXCLUDE_PIN_REGION) {
58
+ lappend arg_list -exclude $exclude
59
+ }
60
+ }
61
+
56
62
  set HMETAL $::env(FP_IO_HLAYER)
57
63
  set VMETAL $::env(FP_IO_VLAYER)
58
64
 
@@ -27,7 +27,7 @@ read_timing_info
27
27
 
28
28
  set error_count 0
29
29
  foreach {instance_name macro_name} $::env(_check_macro_instances) {
30
- set instances [get_cells -hierarchical $instance_name]
30
+ set instances [get_cells $instance_name]
31
31
  set instance_count [llength $instances]
32
32
  if { $instance_count < 1 } {
33
33
  puts stderr "\[ERROR\] No macro instance $instance_name found."
@@ -34,6 +34,7 @@
34
34
  import os
35
35
  import json
36
36
  import shutil
37
+ from typing import List, Optional
37
38
 
38
39
  import click
39
40
 
@@ -142,11 +143,37 @@ def librelane_opt(
142
143
 
143
144
 
144
145
  def librelane_synth(
145
- d, top, flatten, report_dir, *, booth=False, abc_dff=False, undriven=True
146
+ d,
147
+ top,
148
+ flatten,
149
+ report_dir,
150
+ *,
151
+ booth=False,
152
+ abc_dff=False,
153
+ undriven=True,
154
+ keep_hierarchy_min_cost: Optional[int],
155
+ keep_hierarchy_instances: List[str],
156
+ keep_hierarchy_modules: List[str],
146
157
  ):
158
+
147
159
  d.run_pass("hierarchy", "-check", "-top", top, "-nokeep_prints", "-nokeep_asserts")
148
160
  librelane_proc(d, report_dir)
149
161
 
162
+ if keep_hierarchy_min_cost:
163
+ d.run_pass("keep_hierarchy", "-min_cost", str(keep_hierarchy_min_cost))
164
+
165
+ if keep_hierarchy_instances:
166
+ for keep_hierarchy_instance in keep_hierarchy_instances:
167
+ d.run_pass(
168
+ "setattr", "-set", "keep_hierarchy", "1", keep_hierarchy_instance
169
+ )
170
+
171
+ if keep_hierarchy_modules:
172
+ for keep_hierarchy_module in keep_hierarchy_modules:
173
+ d.run_pass(
174
+ "setattr", "-mod", "-set", "keep_hierarchy", "1", keep_hierarchy_module
175
+ )
176
+
150
177
  if flatten:
151
178
  d.run_pass("flatten") # Flatten the design hierarchy
152
179
 
@@ -294,12 +321,10 @@ def synthesize(
294
321
  )
295
322
  d.run_pass("rename", "-top", config["DESIGN_NAME"])
296
323
  d.run_pass("select", "-module", config["DESIGN_NAME"])
297
- try:
324
+ if config["SYNTH_SHOW"]:
298
325
  d.run_pass(
299
326
  "show", "-format", "dot", "-prefix", os.path.join(step_dir, "hierarchy")
300
327
  )
301
- except Exception:
302
- pass
303
328
  if config["SYNTH_NORMALIZE_SINGLE_BIT_VECTORS"]:
304
329
  d.run_pass("attrmap", "-remove", "single_bit_vector")
305
330
  d.run_pass("select", "-clear")
@@ -356,12 +381,15 @@ def synthesize(
356
381
  booth=config["SYNTH_MUL_BOOTH"],
357
382
  abc_dff=config["SYNTH_ABC_DFF"],
358
383
  undriven=config.get("SYNTH_TIE_UNDEFINED") is not None,
384
+ keep_hierarchy_min_cost=config["SYNTH_KEEP_HIERARCHY_MIN_COST"],
385
+ keep_hierarchy_instances=config["SYNTH_KEEP_HIERARCHY_INSTANCES"],
386
+ keep_hierarchy_modules=config["SYNTH_KEEP_HIERARCHY_MODULES"],
359
387
  )
360
388
 
361
389
  d.run_pass("delete", "t:$print")
362
390
  d.run_pass("delete", "t:$assert")
363
391
 
364
- try:
392
+ if config["SYNTH_SHOW"]:
365
393
  d.run_pass(
366
394
  "show",
367
395
  "-format",
@@ -369,8 +397,6 @@ def synthesize(
369
397
  "-prefix",
370
398
  os.path.join(step_dir, "primitive_techmap"),
371
399
  )
372
- except Exception:
373
- pass
374
400
 
375
401
  d.run_pass("opt")
376
402
  d.run_pass("opt_clean", "-purge")
@@ -112,7 +112,14 @@ def _Design_add_blackbox_models(
112
112
 
113
113
  if ext in [".v", ".sv", ".vh"]:
114
114
  self.run_pass(
115
- "read_verilog", "-sv", "-lib", *include_args, *define_args, model
115
+ "read_verilog",
116
+ "-sv",
117
+ "-setattr",
118
+ "keep_hierarchy",
119
+ "-lib",
120
+ *include_args,
121
+ *define_args,
122
+ model,
116
123
  )
117
124
  elif ext in [".lib"]:
118
125
  self.run_pass(
@@ -121,6 +128,8 @@ def _Design_add_blackbox_models(
121
128
  "-ignore_miss_dir",
122
129
  "-setattr",
123
130
  "blackbox",
131
+ "-setattr",
132
+ "keep_hierarchy",
124
133
  model,
125
134
  )
126
135
  else:
@@ -1,3 +1,7 @@
1
+ # Copyright 2025 LibreLane Contributors
2
+ #
3
+ # Adapted from OpenLane
4
+ #
1
5
  # Copyright 2023 Efabless Corporation
2
6
  #
3
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,7 +16,7 @@
12
16
  # See the License for the specific language governing permissions and
13
17
  # limitations under the License.
14
18
  from decimal import Decimal
15
- from typing import Optional, List
19
+ from typing import Optional, List, Literal
16
20
 
17
21
  from ..config import Variable
18
22
 
@@ -238,6 +242,20 @@ pdn_variables = [
238
242
  pdk=True,
239
243
  deprecated_names=["FP_PDN_CORE_RING_HOFFSET"],
240
244
  ),
245
+ Variable(
246
+ "PDN_CORE_RING_CONNECT_TO_PADS",
247
+ bool,
248
+ "If specified, the core side of the pad pins will be connected to the ring.",
249
+ default=False,
250
+ pdk=True,
251
+ ),
252
+ Variable(
253
+ "PDN_CORE_RING_ALLOW_OUT_OF_DIE",
254
+ bool,
255
+ "If specified, the ring shapes are allowed to be outside the die boundary.",
256
+ default=True,
257
+ pdk=True,
258
+ ),
241
259
  Variable(
242
260
  "PDN_RAIL_LAYER",
243
261
  str,
@@ -267,6 +285,32 @@ pdn_variables = [
267
285
  deprecated_names=["FP_PDN_VERTICAL_LAYER", "FP_PDN_LOWER_LAYER"],
268
286
  pdk=True,
269
287
  ),
288
+ Variable(
289
+ "PDN_CORE_HORIZONTAL_LAYER",
290
+ Optional[str],
291
+ "Defines the horizontal PDN layer for the core ring. Falls back to `PDN_HORIZONTAL_LAYER` if undefined.",
292
+ pdk=True,
293
+ ),
294
+ Variable(
295
+ "PDN_CORE_VERTICAL_LAYER",
296
+ Optional[str],
297
+ "Defines the vertical PDN layer for the core ring. Falls back to `PDN_VERTICAL_LAYER` if undefined.",
298
+ pdk=True,
299
+ ),
300
+ Variable(
301
+ "PDN_EXTEND_TO",
302
+ Literal["core_ring", "boundary"],
303
+ "Defines how far the stripes and rings extend.",
304
+ default="core_ring",
305
+ pdk=True,
306
+ ),
307
+ Variable(
308
+ "PDN_ENABLE_PINS",
309
+ bool,
310
+ "If specified, the power straps will be promoted to block pins.",
311
+ default=True,
312
+ pdk=True,
313
+ ),
270
314
  ]
271
315
 
272
316
  routing_layer_variables = [
librelane/steps/magic.py CHANGED
@@ -1,3 +1,7 @@
1
+ # Copyright 2025 LibreLane Contributors
2
+ #
3
+ # Adapted from OpenLane
4
+ #
1
5
  # Copyright 2023 Efabless Corporation
2
6
  #
3
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -389,7 +393,7 @@ class DRC(MagicStep):
389
393
  name = "DRC"
390
394
  long_name = "Design Rule Checks"
391
395
 
392
- inputs = [DesignFormat.DEF, DesignFormat.GDS]
396
+ inputs = [DesignFormat.DEF.mkOptional(), DesignFormat.GDS]
393
397
  outputs = []
394
398
 
395
399
  config_vars = MagicStep.config_vars + [
@@ -399,6 +403,11 @@ class DRC(MagicStep):
399
403
  "A flag to choose whether to run the Magic DRC checks on GDS or not. If not, then the checks will be done on the DEF view of the design, which is a bit faster, but may be less accurate as some DEF/LEF elements are abstract.",
400
404
  default=True,
401
405
  ),
406
+ Variable(
407
+ "MAGIC_GDS_FLATGLOB",
408
+ Optional[List[str]],
409
+ "Flatten cells by name pattern on input. May be used to avoid false positive DRC errors. The strings may use standard shell-type glob patterns, with * for any length string match, ? for any single character match, \\ for special characters, and [] for matching character sets or ranges.",
410
+ ),
402
411
  ]
403
412
 
404
413
  def get_script_path(self):
@@ -408,6 +417,10 @@ class DRC(MagicStep):
408
417
  reports_dir = os.path.join(self.step_dir, "reports")
409
418
  mkdirp(reports_dir)
410
419
 
420
+ # Check that the DEF exists if needed
421
+ if not self.config["MAGIC_DRC_USE_GDS"]:
422
+ assert state_in.get(DesignFormat.DEF)
423
+
411
424
  views_updates, metrics_updates = super().run(state_in, **kwargs)
412
425
 
413
426
  report_path = os.path.join(reports_dir, "drc_violations.magic.rpt")
@@ -1213,6 +1213,12 @@ class IOPlacement(OpenROADStep):
1213
1213
  Optional[Path],
1214
1214
  "Points to the DEF file to be used as a template.",
1215
1215
  ),
1216
+ Variable(
1217
+ "IO_EXCLUDE_PIN_REGION",
1218
+ Optional[List[str]],
1219
+ "List of regions where pins cannot be placed. The regions are strings in the format `{edge}:{interval}` where edge is `top|bottom|left|right` and the interval is either `*` to exclude the entire edge or `{begin}-{end}` to exclude a part of the edge, where `begin` and `end` are either absolute distance values or themselves `*` to denote the very start or end of an edge.",
1220
+ units="µm",
1221
+ ),
1216
1222
  ]
1217
1223
  )
1218
1224
 
@@ -2394,7 +2400,7 @@ class RepairDesignPostGPL(ResizerStep):
2394
2400
  Variable(
2395
2401
  "DESIGN_REPAIR_BUFFER_OUTPUT_PORTS",
2396
2402
  bool,
2397
- "Specifies whether or not to insert buffers on input ports when design repairs are run.",
2403
+ "Specifies whether or not to insert buffers on output ports when design repairs are run.",
2398
2404
  default=True,
2399
2405
  deprecated_names=["PL_RESIZER_BUFFER_OUTPUT_PORTS"],
2400
2406
  ),
librelane/steps/pyosys.py CHANGED
@@ -214,6 +214,12 @@ class PyosysStep(Step):
214
214
  "A fully qualified IPVT corner to use during synthesis. If unspecified, the value for `DEFAULT_CORNER` from the PDK will be used.",
215
215
  pdk=True,
216
216
  ),
217
+ Variable(
218
+ "SYNTH_SHOW",
219
+ bool,
220
+ "Generate a graphviz DOT file for the design. This will fail on a completely empty design.",
221
+ default=False,
222
+ ),
217
223
  ]
218
224
 
219
225
  @classmethod
@@ -444,7 +450,7 @@ class SynthesisCommon(VerilogStep):
444
450
  Variable(
445
451
  "SYNTH_HIERARCHY_MODE",
446
452
  Literal["flatten", "deferred_flatten", "keep"],
447
- "Affects how hierarchy is maintained throughout and after synthesis. 'flatten' flattens it during and after synthesis. 'deferred_flatten' flattens it after synthesis. 'keep' never flattens it. Please note that when using the Slang plugin, you need to pass '--keep-hierarchy' to `SLANG_ARGUMENTS` separately.",
453
+ "Affects how hierarchy is maintained throughout and after synthesis. 'flatten' flattens it during and after synthesis. 'deferred_flatten' flattens it after synthesis. 'keep' never flattens it. Please note that when using the Slang plugin, you need to pass '--keep-hierarchy' to `SLANG_ARGUMENTS` separately. To keep the hierarchy partially, use one of the flattening options and set the 'keep_hierarchy' attribute on instances or modules via: `SYNTH_KEEP_HIERARCHY_INSTANCES`, `SYNTH_KEEP_HIERARCHY_MODULES` or `SYNTH_KEEP_HIERARCHY_MIN_COST`.",
448
454
  default="flatten",
449
455
  deprecated_names=[
450
456
  (
@@ -453,6 +459,21 @@ class SynthesisCommon(VerilogStep):
453
459
  )
454
460
  ],
455
461
  ),
462
+ Variable(
463
+ "SYNTH_KEEP_HIERARCHY_MIN_COST",
464
+ Optional[int],
465
+ "Sets the 'keep_hierarchy' attribute on modules where the gate count is estimated to exceed the specified threshold. This prevents larger modules from being flattened. This variable only affects the design when 'flatten' is called through `SYNTH_HIERARCHY_MODE`.",
466
+ ),
467
+ Variable(
468
+ "SYNTH_KEEP_HIERARCHY_INSTANCES",
469
+ Optional[List[str]],
470
+ "A list of instances for which to set the 'keep_hierarchy' attribute. This variable only affects the design when 'flatten' is called through `SYNTH_HIERARCHY_MODE`.",
471
+ ),
472
+ Variable(
473
+ "SYNTH_KEEP_HIERARCHY_MODULES",
474
+ Optional[List[str]],
475
+ "A list of modules for which to set the 'keep_hierarchy' attribute. This variable only affects the design when 'flatten' is called through `SYNTH_HIERARCHY_MODE`.",
476
+ ),
456
477
  Variable(
457
478
  "SYNTH_SHARE_RESOURCES",
458
479
  bool,
librelane/steps/step.py CHANGED
@@ -1016,6 +1016,7 @@ class Step(ABC):
1016
1016
  state_in: GenericDict[str, Any] = self.state_in.result().copy_mut()
1017
1017
  for format_id in state_in:
1018
1018
  format = DesignFormat.factory.get(format_id)
1019
+ assert format is not None
1019
1020
  if format not in self.__class__.inputs and not (
1020
1021
  format == DesignFormat.DEF
1021
1022
  and DesignFormat.ODB
@@ -1437,7 +1438,8 @@ class Step(ABC):
1437
1438
  A factory singleton for Steps, allowing steps types to be registered and then
1438
1439
  retrieved by name.
1439
1440
 
1440
- See https://en.wikipedia.org/wiki/Factory_(object-oriented_programming) for
1441
+ See
1442
+ `Factory (object-oriented programming) on Wikipedia <https://en.wikipedia.org/wiki/Factory_(object-oriented_programming)>`_
1441
1443
  a primer.
1442
1444
  """
1443
1445
 
@@ -1,3 +1,7 @@
1
+ # Copyright 2025 LibreLane Contributors
2
+ #
3
+ # Adapted from OpenLane
4
+ #
1
5
  # Copyright 2023 Efabless Corporation
2
6
  #
3
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -84,6 +88,23 @@ class Lint(Step):
84
88
  Optional[List[str]],
85
89
  "Linter-specific preprocessor definitions; overrides VERILOG_DEFINES for the lint step if exists",
86
90
  ),
91
+ Variable(
92
+ "LINTER_DISABLE_WARNINGS",
93
+ Optional[List[str]],
94
+ "Warning codes that are passed to the linter to be disabled.",
95
+ default=["DECLFILENAME", "EOFNEWLINE"],
96
+ ),
97
+ Variable(
98
+ "LINTER_DISABLE_WARNINGS_BLACKBOX",
99
+ Optional[List[str]],
100
+ "Warning codes that are passed to the linter to be disabled for all blackbox modules.",
101
+ default=["UNDRIVEN", "UNUSEDSIGNAL"],
102
+ ),
103
+ Variable(
104
+ "LINTER_VLT",
105
+ Optional[Path],
106
+ "Path to a Verilator Configuration format file (`.vlt`) that is passed to the linter.",
107
+ ),
87
108
  ]
88
109
 
89
110
  def run(self, state_in: State, **kwargs) -> Tuple[ViewsUpdate, MetricsUpdate]:
@@ -149,11 +170,16 @@ class Lint(Step):
149
170
  vlt_file = os.path.join(self.step_dir, "_deps.vlt")
150
171
  with open(vlt_file, "w") as f:
151
172
  f.write("`verilator_config\n")
152
- f.write("lint_off -rule DECLFILENAME\n")
153
- f.write("lint_off -rule EOFNEWLINE\n")
173
+ if disable_warnings := self.config["LINTER_DISABLE_WARNINGS"]:
174
+ for warn in disable_warnings:
175
+ f.write(f"lint_off -rule {warn}\n")
176
+
154
177
  for blackbox in blackboxes:
155
- f.write(f'lint_off -rule UNDRIVEN -file "{blackbox}"\n')
156
- f.write(f'lint_off -rule UNUSEDSIGNAL -file "{blackbox}"\n')
178
+ if disable_warnings_bb := self.config[
179
+ "LINTER_DISABLE_WARNINGS_BLACKBOX"
180
+ ]:
181
+ for warn in disable_warnings_bb:
182
+ f.write(f'lint_off -rule {warn} -file "{blackbox}"\n')
157
183
 
158
184
  extra_args.append("--Wno-fatal")
159
185
 
@@ -169,20 +195,23 @@ class Lint(Step):
169
195
  for define in defines:
170
196
  extra_args.append(f"+define+{define}")
171
197
 
198
+ if linter_vlt := self.config["LINTER_VLT"]:
199
+ extra_args.append(linter_vlt)
200
+
172
201
  result = self.run_subprocess(
173
202
  [
174
203
  "verilator",
175
204
  "--lint-only",
205
+ "--waiver-output",
206
+ os.path.join(self.step_dir, "_waivers_output.vlt"),
176
207
  "--Wall",
177
- "--Wno-DECLFILENAME",
178
- "--Wno-EOFNEWLINE",
179
208
  "--top-module",
180
209
  self.config["DESIGN_NAME"],
181
210
  vlt_file,
182
211
  ]
212
+ + extra_args
183
213
  + blackboxes
184
- + self.config["VERILOG_FILES"]
185
- + extra_args,
214
+ + self.config["VERILOG_FILES"],
186
215
  env=env,
187
216
  check=False,
188
217
  )
@@ -1,41 +1,41 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: librelane
3
- Version: 3.0.0.dev38
3
+ Version: 3.0.0.dev40
4
4
  Summary: An infrastructure for implementing chip design flows
5
- Home-page: https://github.com/librelane/librelane
6
- License: Apache-2.0
7
- Author: Mohamed Gaber
8
- Author-email: me@donn.website
9
- Requires-Python: >=3.8.1,<4
10
- Classifier: License :: OSI Approved :: Apache Software License
5
+ License-Expression: Apache-2.0
6
+ Maintainer: Mohamed Gaber
7
+ Maintainer-email: me@donn.website
8
+ Requires-Python: >=3.10
11
9
  Classifier: Programming Language :: Python :: 3
12
- Classifier: Programming Language :: Python :: 3.9
13
10
  Classifier: Programming Language :: Python :: 3.10
14
11
  Classifier: Programming Language :: Python :: 3.11
15
12
  Classifier: Programming Language :: Python :: 3.12
16
13
  Classifier: Programming Language :: Python :: 3.13
17
- Requires-Dist: ciel (>=2.0.3,<3)
14
+ Classifier: Programming Language :: Python :: 3.14
15
+ Requires-Dist: ciel (>=2.3.1,<3)
18
16
  Requires-Dist: click (>=8,<8.2)
19
17
  Requires-Dist: cloup (>=3.0.5,<4)
20
18
  Requires-Dist: deprecated (>=1.2.10,<2)
21
19
  Requires-Dist: httpx (>=0.22.0,<0.29)
22
- Requires-Dist: klayout (>=0.29.0,<0.31.0)
23
- Requires-Dist: libparse (>=0.3.1,<1)
20
+ Requires-Dist: klayout (>=0.29.0,<0.32.0)
21
+ Requires-Dist: lln-libparse (==0.56.*)
24
22
  Requires-Dist: lxml (>=4.9.0)
25
23
  Requires-Dist: psutil (>=5.9.0)
26
24
  Requires-Dist: pyyaml (>=5,<7)
27
25
  Requires-Dist: rapidfuzz (>=3.9.0,<4)
28
26
  Requires-Dist: rich (>=12,<15)
29
- Requires-Dist: semver (>=3.0.2,<4.0.0)
30
- Requires-Dist: yamlcore (>=0.0.2,<0.0.3)
27
+ Requires-Dist: semver (>=3.0.2,<4)
28
+ Requires-Dist: yamlcore (>=0.0.2,<0.1.0)
29
+ Project-URL: Bug Tracker, https://github.com/librelane/librelane/issues
31
30
  Project-URL: Documentation, https://librelane.readthedocs.io
31
+ Project-URL: Homepage, https://librelane.org/
32
32
  Project-URL: Repository, https://github.com/librelane/librelane
33
33
  Description-Content-Type: text/markdown
34
34
 
35
35
  <h1 align="center">LibreLane</h1>
36
36
  <p align="center">
37
37
  <a href="https://opensource.org/licenses/Apache-2.0"><img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg" alt="License: Apache 2.0"/></a>
38
- <a href="https://www.python.org"><img src="https://img.shields.io/badge/Python-3.8-3776AB.svg?style=flat&logo=python&logoColor=white" alt="Python 3.8.1 or higher" /></a>
38
+ <a href="https://www.python.org"><img src="https://img.shields.io/badge/Python-3.10-3776AB.svg?style=flat&logo=python&logoColor=white" alt="Python 3.10" /></a>
39
39
  <a href="https://github.com/psf/black"><img src="https://img.shields.io/badge/code%20style-black-000000.svg" alt="Code Style: black"/></a>
40
40
  <a href="https://mypy-lang.org/"><img src="https://www.mypy-lang.org/static/mypy_badge.svg" alt="Checked with mypy"/></a>
41
41
  <a href="https://nixos.org/"><img src="https://img.shields.io/static/v1?logo=nixos&logoColor=white&label=&message=Built%20with%20Nix&color=41439a" alt="Built with Nix"/></a>
@@ -72,7 +72,7 @@ Colaboratory by following
72
72
 
73
73
  You'll need the following:
74
74
 
75
- * Python **3.8.1** or higher with PIP, Venv and Tkinter
75
+ * Python **3.10** or higher with PIP, Venv and Tkinter
76
76
 
77
77
  ### Nix (Recommended)
78
78
 
@@ -6,7 +6,7 @@ librelane/common/cli.py,sha256=xi48GBGHRsYrLGwx40ARwpykHx7GnuHbJjHxjOwtZ5Y,2349
6
6
  librelane/common/drc.py,sha256=l1quZbHXGb7yjKCO5IFn-Xxf_zIx4f6kxqpNm3YmpOs,12809
7
7
  librelane/common/generic_dict.py,sha256=ASa5wtVcLuGlsBqGfLxLYXrYksqQB62iHljV04plIqI,10010
8
8
  librelane/common/metrics/__init__.py,sha256=nzdmeia1fN4CDPT604v-OHaBVydz-M4hz232g-jxJ6M,1521
9
- librelane/common/metrics/__main__.py,sha256=1w23V_1-f0WUSfxG36ewNHctgPisQFFG4p-R-wZsyNs,12539
9
+ librelane/common/metrics/__main__.py,sha256=tU-HzmvisMlAt6mlg5IhR4WOFUr8PZZFdb_cfwP5FnY,12558
10
10
  librelane/common/metrics/library.py,sha256=CG7rubLdjuCQL9-9bzAC-64hf-KlH-iu_Fg0oKuesqs,7373
11
11
  librelane/common/metrics/metric.py,sha256=h3Xd26z5M80IJgVmmrBTjKcdGLb4I0wyjM-H4jdyi_0,6990
12
12
  librelane/common/metrics/util.py,sha256=Bl_9znlot7-Os2VigYLSmMf56aAkGdv3evWz9vfK7K4,9344
@@ -19,11 +19,11 @@ librelane/common/types.py,sha256=xo_OKq-2ue7JVpyQb6oUu6JuVSnLNEFKQCPBqNhZnQ4,350
19
19
  librelane/config/__init__.py,sha256=lbJmD5CbrrrnaNdIUWqFIK488ea0uyej3iExh-9mkgE,1107
20
20
  librelane/config/__main__.py,sha256=NsJGoIOb950mdXql1zmzSq10wuFovK9NGWm011NNJ3A,4474
21
21
  librelane/config/config.py,sha256=bAxB0qpw95YoLGmMjvxAwrX1hcpHRvNhH7wjQdyW-DE,35031
22
- librelane/config/flow.py,sha256=DLB1h3UX_0cWgJblAmCSrsWL6dV0SEx0mz4ohIsV2uo,16892
22
+ librelane/config/flow.py,sha256=Dr2i9MlCcGFg_ilCpeys3vPo_DLDb1yF6yGrMCZZabE,17003
23
23
  librelane/config/pdk_compat.py,sha256=ofqYuD-MgTcfvPVXpGJo8H1GKzCvN6sxHsK_OqCVXa8,12870
24
24
  librelane/config/preprocessor.py,sha256=ATi29SHz0_OBq1IqUkGxvhHUDKB5z5jO0KqvoQXg8R8,14913
25
25
  librelane/config/removals.py,sha256=vxqTuRTJ0jt2TX4KmFZCZPTwghDFkCVjIhF2iReHwJA,2958
26
- librelane/config/variable.py,sha256=YKRlnQu6YvkwnJ5zYfWTcj0fHP0Jcy22ZTb0i4kb3h4,26823
26
+ librelane/config/variable.py,sha256=oPPdvo12Gy17sIcEJtjJkrIO93AOUSrIZaG_ocL70vI,26837
27
27
  librelane/container.py,sha256=7w_V2Fpb3dbnZ8FqBce1vK31jH30UrxByppfEJRyG9M,8672
28
28
  librelane/env_info.py,sha256=xF9iqwwJv5yZz7n7BTrrT_yP3Dp1HjAOUObNE9k_1g4,11074
29
29
  librelane/examples/spm/config.yaml,sha256=H2ERY4xoIeXN7kM3N9yGWiFBbtByyaN2Ni1kFqYPtO4,612
@@ -42,8 +42,8 @@ librelane/examples/spm-user_project_wrapper/user_project_wrapper.v,sha256=zc6GC5
42
42
  librelane/flows/__init__.py,sha256=ghtmUG-taVpHJ3CKJRYZGn3dU0r93araT1EIGlBEsxg,896
43
43
  librelane/flows/builtins.py,sha256=tR14Qc1ZUey2w-Ar4DWOvxuP7LGPtMecCJq8WgcYJpk,773
44
44
  librelane/flows/classic.py,sha256=JB9gVgP2hHPhMuCJg7hvoj2BvJcvRec7suEXPgHmz14,10971
45
- librelane/flows/cli.py,sha256=cW_S12VZqNVaWNcMlAKOVfbCALgl1AG_8rqvTcsvBDY,19324
46
- librelane/flows/flow.py,sha256=1zRhYQvnRte-VNcsVmAkikD_kZJVbgsqgLR-8CGYaLI,37034
45
+ librelane/flows/cli.py,sha256=ClFU3f81I5PDUMg249UzSdlYU_iZoX_CaEQtYpwvkA8,19346
46
+ librelane/flows/flow.py,sha256=kV6874HFxceFCrGpv4V7hjplajUpd7OvEyU5-2OhGQg,37128
47
47
  librelane/flows/misc.py,sha256=32Om3isexesfKKiJZCajNmINc-xdv7eVx_tgoh9SR6U,2015
48
48
  librelane/flows/optimizing.py,sha256=OwZz6WGmXpliwO8vtmhjKHD-kzDyNv-zoCECZIigXsI,6076
49
49
  librelane/flows/sequential.py,sha256=kBpR9kxfEfdTaNy9Ter2KNQXkW6qojCwoBsFJBwTq6I,15359
@@ -66,7 +66,7 @@ librelane/scripts/magic/common/read.tcl,sha256=BiKyRi2ExXaR7WcSSmbtLfW-CaJU2DAmg
66
66
  librelane/scripts/magic/def/antenna_check.tcl,sha256=T_r1CWgySFVlLMcoTrNXQ_aMRs_fBAUYUUjyXJV1Sg0,1019
67
67
  librelane/scripts/magic/def/mag.tcl,sha256=PuL3MH6pmZP5Qh2cJ0GygWNzaYjdCSCoAbOli-JB4fs,707
68
68
  librelane/scripts/magic/def/mag_gds.tcl,sha256=fwtQR9zPZpWqVmmLb-1hzY4WMCr4gbA3S0pTZsS9sss,2144
69
- librelane/scripts/magic/drc.tcl,sha256=gPGyI96lR10dJXcJACajzHaHiT6ayAYPJqrmmuQkABc,2395
69
+ librelane/scripts/magic/drc.tcl,sha256=M0jAHU53Y9S4018axoSaQGBtNDp6eKnxHetPfpuhYkY,2560
70
70
  librelane/scripts/magic/extract_spice.tcl,sha256=2NjDFbqRfTsWhD1s-NGcDr8e4o3Ejg-4vCEoLt22RCc,2820
71
71
  librelane/scripts/magic/gds/drc_batch.tcl,sha256=O76rwxSrQgoCuoxk36tRBZkQaeMfJknlHrQA3mtU2JU,2198
72
72
  librelane/scripts/magic/gds/erase_box.tcl,sha256=wsVSwMlkZFJa_MEGNsdXLnXFvjZlrl_lzIWkJjcDBgg,929
@@ -108,8 +108,8 @@ librelane/scripts/openroad/buffer_list.tcl,sha256=sXygy1KRSUS4dZi1UOpBkGGOuXRVLM
108
108
  librelane/scripts/openroad/common/dpl.tcl,sha256=T_rzoZy8i7S9C92TOmiN79w0MCfudafEhkXcHmB1BAM,920
109
109
  librelane/scripts/openroad/common/dpl_cell_pad.tcl,sha256=KWVuj8u1-y3ZUiQr48TAsFv1GSzOCVnAjdqfBjtoQxQ,1066
110
110
  librelane/scripts/openroad/common/grt.tcl,sha256=2qDLSj8lKKEJHH9V9npiSMXQdsIsIHE0DVmbVRStbk4,1132
111
- librelane/scripts/openroad/common/io.tcl,sha256=fAoRoz6E9iwanFsWvaO50T1xGF6CSuxw38O6MtgrZ1w,22756
112
- librelane/scripts/openroad/common/pdn_cfg.tcl,sha256=8xTK4_her0hcaxySKpXKlQIIe0goetTcJlSEBl88qL0,4417
111
+ librelane/scripts/openroad/common/io.tcl,sha256=64nLQxM7sDHpsbi_f3GWbsucZFFw5g6GT-4JoTSMLbE,23059
112
+ librelane/scripts/openroad/common/pdn_cfg.tcl,sha256=ue2LH7mH3i99-OM3oe6hq_nA_wa73xcSCJpKXlCd3_0,6252
113
113
  librelane/scripts/openroad/common/resizer.tcl,sha256=OhjpVxw_8IOx5Bmh2_gh_EIHxKaX84NS37Of9Rlchpw,2255
114
114
  librelane/scripts/openroad/common/set_global_connections.tcl,sha256=jxafLD-2SLciJYeueobrlJYetnfAfK0P5uMLwhaTQco,2927
115
115
  librelane/scripts/openroad/common/set_layer_adjustments.tcl,sha256=xqAIDXsTa1_JsGmKXf6eG2Rni2EZSilSsHfJAhCl1xY,1037
@@ -127,7 +127,7 @@ librelane/scripts/openroad/gpl.tcl,sha256=WzxlyikUf70Q1FgaE6sIVvquYPZ8RU02_te1VB
127
127
  librelane/scripts/openroad/grt.tcl,sha256=r_73hbvc4wMi2EFoPbGTh29Lh5ATT4vVwKjxyPIOFcM,1022
128
128
  librelane/scripts/openroad/gui.tcl,sha256=BhKTcYEo-SajnYtdzXqpzjYbczy0qZ-OvEFlHMjPtlU,1255
129
129
  librelane/scripts/openroad/insert_buffer.tcl,sha256=ST0tbr1LoutjjaouqgngiQZudlzzHMd5APB6DTE2TGw,4412
130
- librelane/scripts/openroad/ioplacer.tcl,sha256=tV-GF4ExJAKXqw-PQTf1Xlcc87xDJDLi1jksmnS1Smk,1970
130
+ librelane/scripts/openroad/ioplacer.tcl,sha256=n-1RO5MtRX69_8KAIpRzQkgBmFb9QU53yfAdBKlnYM0,2126
131
131
  librelane/scripts/openroad/irdrop.tcl,sha256=bXhNY_87xPV-ocF9v8wOWqjlnFPaVO_6K_DWbBHAAPs,1974
132
132
  librelane/scripts/openroad/pdn.tcl,sha256=WiKVmLw3g_ZN1Hs4iiAzc6Qah7ZwCn6o-OA5iNmlTtY,1566
133
133
  librelane/scripts/openroad/rcx.tcl,sha256=kyEhli4sGFMEj-He9UXZDGb0Tmxlw7d6iZD7t6adUx8,1057
@@ -135,7 +135,7 @@ librelane/scripts/openroad/repair_design.tcl,sha256=mSQKIT-uac2gJFia_xMNQtHJKD--
135
135
  librelane/scripts/openroad/repair_design_postgrt.tcl,sha256=sEXdFfH2le-q0ggcsWGgCR-GCFyzPdxk4P3RZyWCnpI,1902
136
136
  librelane/scripts/openroad/rsz_timing_postcts.tcl,sha256=ztDJ__R7f3eK7-xAg9SklGXqL5F1jydGPQDH7X5twNE,2553
137
137
  librelane/scripts/openroad/rsz_timing_postgrt.tcl,sha256=F6ex9Ke85YzS4z9rf8SpqCKjMyzuiQEhYYSJfkN93sM,2699
138
- librelane/scripts/openroad/sta/check_macro_instances.tcl,sha256=j8DlW1wkVk5bLbG7R4LL_-YcjetxmJKijXDD_q2fpqs,1797
138
+ librelane/scripts/openroad/sta/check_macro_instances.tcl,sha256=YpHleMNIWHqQLLEl1HZlimphxyMRqUT4l09XBIeH14M,1783
139
139
  librelane/scripts/openroad/sta/corner.tcl,sha256=0YAzHFGbs4zRsB5E7e8zdzFyLuzrpV1w_S2BgrLfqak,15235
140
140
  librelane/scripts/openroad/tapcell.tcl,sha256=4Ouy5U-_ct5Cfy3vuLQudWL0c1xWF_auLsr9rYh6dP4,1177
141
141
  librelane/scripts/openroad/ungpl.tcl,sha256=vhHxou1W3VROwJePoQzmWn0h0d5lQrrt1vofyt-Woek,761
@@ -143,8 +143,8 @@ librelane/scripts/openroad/write_cdl.tcl,sha256=uPO1IROPTr5NrW0-VZA8tXQD8aseGeXD
143
143
  librelane/scripts/openroad/write_views.tcl,sha256=-MxTJsB4EF7l5trDaZe-VBFjhfzqRt8F5_DZrADTs0U,892
144
144
  librelane/scripts/pyosys/construct_abc_script.py,sha256=3CCDz5ZTEPpWLco-OvikTmn361-BNitqjQE_-5zHm14,6733
145
145
  librelane/scripts/pyosys/json_header.py,sha256=fbHPjUkTQHKbdGPh7P1jZjip3nat4k8oSD1N7rpXxFk,2389
146
- librelane/scripts/pyosys/synthesize.py,sha256=5BlgXK5gfJWv9E8ki9UXUDLxlfKoGwXgqjdDMiPrms8,17020
147
- librelane/scripts/pyosys/ys_common.py,sha256=r9BQ7j8gN6sgJM9nC3QPNZcZX10m_PF8We4S93qZ5w0,3957
146
+ librelane/scripts/pyosys/synthesize.py,sha256=xlclPPkb0V5Z4UhP_Kv2jweRjUVy-0MjyQUTXh__8BM,17948
147
+ librelane/scripts/pyosys/ys_common.py,sha256=bU8YzsJNoi6ZkHi6sPcw9eY6Ev2wPfQe_p0j8-OsdAM,4162
148
148
  librelane/scripts/tclsh/hello.tcl,sha256=kkR3akY7QnGHYXsQODYwLkMkUEOgWcNFtzaMTTEV2bY,34
149
149
  librelane/state/__init__.py,sha256=DZ_RyKMr2oj4p5d32u8MmDKfCxR7OEdDw-1HWKTpatA,949
150
150
  librelane/state/__main__.py,sha256=Ici4Ejg1ICUZNSYZRguC3BfEk_wFxsmE0ag0Vv8iY1I,1679
@@ -153,21 +153,21 @@ librelane/state/state.py,sha256=tYn2si8NlkVErOSWKfVhsgrMpyxeX2Hv9EAPsQBWx2c,1190
153
153
  librelane/steps/__init__.py,sha256=j3JYrdnWM74dYuEvE931oSrQI7FUz-hKWr8Mts8C0wg,1668
154
154
  librelane/steps/__main__.py,sha256=GQZiV4s-9GIF4AwP34W61zwgzMvPp-QTR4cNELi7r5c,13349
155
155
  librelane/steps/checker.py,sha256=HD5YFPAbHQKsFmBDrIAbo_0clZcCszNhIXb4lHaNIeQ,21629
156
- librelane/steps/common_variables.py,sha256=eih2eA1m0FpL8ydF5WWattwh_SxtzI55eb8gggJtBuY,12494
156
+ librelane/steps/common_variables.py,sha256=NA0zH_amgyiorfPrBu6YJIt9En4wkycYRox11bJ1CoY,13764
157
157
  librelane/steps/cvc_rv.py,sha256=qeroQPjidSAMYSp3nJNiQBYt8V73kkz3JK97uioo7J8,5294
158
158
  librelane/steps/klayout.py,sha256=18B7trKjyD8HnGUVwrjQV8XRzGu298CuosM1WOzg9oM,23255
159
- librelane/steps/magic.py,sha256=Cc_qApOgeltIn7lKA7dBQ4Ud9EQtbMatsuGPEvqvpcQ,21183
159
+ librelane/steps/magic.py,sha256=a7OfO9S8zhrn8eGsgAa_IriiPirmaOXDOUqc8LEkhZU,21807
160
160
  librelane/steps/misc.py,sha256=8ubCvFeFEspXrgnzNWINY5-TXTyalNtlvcX8TSw0qdg,5685
161
161
  librelane/steps/netgen.py,sha256=R9sDWv-9wKMdi2rkuLQdOc4uLlbYhXcKKd6WsZsnLt0,8953
162
162
  librelane/steps/odb.py,sha256=szve7HMRVR9kWrIHkeViyeGszXlNd9k-oP9litb_tmo,38931
163
- librelane/steps/openroad.py,sha256=0UZDYTqKHOvkqXTEb44HaesaZ8d4GS-6gUahtjDc-m4,100355
163
+ librelane/steps/openroad.py,sha256=Mma0nPoEJ6JdYmZF24Uju21RL332wN9FH8GeOgMj9Qk,100890
164
164
  librelane/steps/openroad_alerts.py,sha256=IJyB4piBDCKXhkJswHGMYCRDwbdQsR0GZlrGGDhmW6Q,3364
165
- librelane/steps/pyosys.py,sha256=BzTUYCFxXJWtHqPtEPAztoWNLbDWvECWnsWVdK_lljU,23589
166
- librelane/steps/step.py,sha256=THIxZkhtkNYt1iRgMduD0ywrOTCaV7cCfUB2EqXN6-k,55751
165
+ librelane/steps/pyosys.py,sha256=CqHpKPbLb199E5g9axfeUSGlzdgoXdmuy4iRBSdjjQ4,24978
166
+ librelane/steps/step.py,sha256=tYTN5QzX0huhFMLegpir4mPi3q9QAVSFZ7kchW6OECk,55849
167
167
  librelane/steps/tclstep.py,sha256=68AjCmbLhBscbzQDxRcPQVU-6UvZQNOalO7qNwUXCa4,10138
168
- librelane/steps/verilator.py,sha256=MWx2TpLqYyea9_jSeLG9c2S5ujvYERQZRFNaMhfHxZE,7916
168
+ librelane/steps/verilator.py,sha256=m3vcsBStF4i1eutzHdWHPGGoSEBwQrCKMY2k-1qJbMI,8964
169
169
  librelane/steps/yosys.py,sha256=lYdZPFvjcmdu_NE6rtB94_dysIK2qwGdGb480W6pg2w,12711
170
- librelane-3.0.0.dev38.dist-info/METADATA,sha256=BfBjJzm_dTdILw9z0OpLMEX37burnXXf1Xdmi-0c6SQ,6561
171
- librelane-3.0.0.dev38.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
172
- librelane-3.0.0.dev38.dist-info/entry_points.txt,sha256=0eZs2NOH-w-W_GVRCs-ualst26XplkPpJkOnGWMaFw0,306
173
- librelane-3.0.0.dev38.dist-info/RECORD,,
170
+ librelane-3.0.0.dev40.dist-info/METADATA,sha256=wFojMkKM8YiFCuQTjcUa_jUXyZD7zNVaiUA_Vn_uzzU,6572
171
+ librelane-3.0.0.dev40.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
172
+ librelane-3.0.0.dev40.dist-info/entry_points.txt,sha256=Ub2wE2U4uZPjJgBVTPYFeXtwhNyqAqaKT8q4jGoKIUk,274
173
+ librelane-3.0.0.dev40.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.1
2
+ Generator: poetry-core 2.2.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -5,5 +5,4 @@ librelane.env_info=librelane:env_info_cli
5
5
  librelane.help=librelane.help.__main__:cli
6
6
  librelane.state=librelane.state.__main__:cli
7
7
  librelane.steps=librelane.steps.__main__:cli
8
- openlane=librelane.__main__:cli
9
8