librelane 3.0.0.dev37__py3-none-any.whl → 3.0.0.dev39__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of librelane might be problematic. Click here for more details.

librelane/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),
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
 
@@ -999,8 +1002,9 @@ class Flow(ABC):
999
1002
  A factory singleton for Flows, allowing Flow types to be registered and then
1000
1003
  retrieved by name.
1001
1004
 
1002
- See https://en.wikipedia.org/wiki/Factory_(object-oriented_programming) for
1003
- a primer.
1005
+ See
1006
+ `Factory (object-oriented programming) on Wikipedia <https://en.wikipedia.org/wiki/Factory_(object-oriented_programming)>`_
1007
+ for a primer.
1004
1008
  """
1005
1009
 
1006
1010
  __registry: ClassVar[Dict[str, Type[Flow]]] = {}
@@ -44,7 +44,7 @@ def cli(reader):
44
44
  i = 0
45
45
 
46
46
  for target_info in reader.config["INSERT_ECO_BUFFERS"]:
47
- target_name, target_pin = target_info["target"].split("/")
47
+ target_name, target_pin = target_info["target"].rsplit("/", 1)
48
48
  name_escaped = reader.escape_verilog_name(target_name)
49
49
  buffer_master = target_info["buffer"]
50
50
 
@@ -38,8 +38,9 @@ def cli(reader):
38
38
  # print(grt)
39
39
  grt_inc = GRT.IncrementalGRoute(grt, reader.block)
40
40
  i = 0
41
+
41
42
  for target_info in reader.config["INSERT_ECO_DIODES"]:
42
- target_name, target_pin = target_info["target"].split("/")
43
+ target_name, target_pin = target_info["target"].rsplit("/", 1)
43
44
  name_escaped = reader.escape_verilog_name(target_name)
44
45
 
45
46
  target = reader.block.findInst(name_escaped)
@@ -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
 
@@ -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/odb.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");
@@ -979,7 +983,7 @@ class ManualGlobalPlacement(OdbpyStep):
979
983
 
980
984
  def run(self, state_in: State, **kwargs) -> Tuple[ViewsUpdate, MetricsUpdate]:
981
985
  if self.config["MANUAL_GLOBAL_PLACEMENTS"] is None:
982
- info(f"'MANUAL_GLOBAL_PLACEMENTS' not set, skipping '{self.id}'…")
986
+ info(f"'MANUAL_GLOBAL_PLACEMENTS' not set. Skipping '{self.id}'…")
983
987
  return {}, {}
984
988
  return super().run(state_in, **kwargs)
985
989
 
@@ -1039,6 +1043,12 @@ class InsertECOBuffers(OdbpyStep):
1039
1043
  assert self.config_path is not None, "get_command called before start()"
1040
1044
  return super().get_command() + ["--step-config", self.config_path]
1041
1045
 
1046
+ def run(self, state_in: State, **kwargs) -> Tuple[ViewsUpdate, MetricsUpdate]:
1047
+ if self.config["INSERT_ECO_BUFFERS"] is None:
1048
+ info(f"'INSERT_ECO_BUFFERS' not set. Skipping '{self.id}'…")
1049
+ return {}, {}
1050
+ return super().run(state_in, **kwargs)
1051
+
1042
1052
 
1043
1053
  @dataclass
1044
1054
  class ECODiode:
@@ -1092,4 +1102,7 @@ class InsertECODiodes(OdbpyStep):
1092
1102
  if self.config["DIODE_CELL"] is None:
1093
1103
  info(f"'DIODE_CELL' not set. Skipping '{self.id}'…")
1094
1104
  return {}, {}
1105
+ if self.config["INSERT_ECO_DIODES"] is None:
1106
+ info(f"'INSERT_ECO_DIODES' not set. Skipping '{self.id}'…")
1107
+ return {}, {}
1095
1108
  return super().run(state_in, **kwargs)
@@ -2394,7 +2394,7 @@ class RepairDesignPostGPL(ResizerStep):
2394
2394
  Variable(
2395
2395
  "DESIGN_REPAIR_BUFFER_OUTPUT_PORTS",
2396
2396
  bool,
2397
- "Specifies whether or not to insert buffers on input ports when design repairs are run.",
2397
+ "Specifies whether or not to insert buffers on output ports when design repairs are run.",
2398
2398
  default=True,
2399
2399
  deprecated_names=["PL_RESIZER_BUFFER_OUTPUT_PORTS"],
2400
2400
  ),
librelane/steps/step.py CHANGED
@@ -1437,7 +1437,8 @@ class Step(ABC):
1437
1437
  A factory singleton for Steps, allowing steps types to be registered and then
1438
1438
  retrieved by name.
1439
1439
 
1440
- See https://en.wikipedia.org/wiki/Factory_(object-oriented_programming) for
1440
+ See
1441
+ `Factory (object-oriented programming) on Wikipedia <https://en.wikipedia.org/wiki/Factory_(object-oriented_programming)>`_
1441
1442
  a primer.
1442
1443
  """
1443
1444
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: librelane
3
- Version: 3.0.0.dev37
3
+ Version: 3.0.0.dev39
4
4
  Summary: An infrastructure for implementing chip design flows
5
5
  Home-page: https://github.com/librelane/librelane
6
6
  License: Apache-2.0
@@ -20,7 +20,7 @@ Requires-Dist: cloup (>=3.0.5,<4)
20
20
  Requires-Dist: deprecated (>=1.2.10,<2)
21
21
  Requires-Dist: httpx (>=0.22.0,<0.29)
22
22
  Requires-Dist: klayout (>=0.29.0,<0.31.0)
23
- Requires-Dist: libparse (>=0.3.1,<1)
23
+ Requires-Dist: lln-libparse (==0.56.*)
24
24
  Requires-Dist: lxml (>=4.9.0)
25
25
  Requires-Dist: psutil (>=5.9.0)
26
26
  Requires-Dist: pyyaml (>=5,<7)
@@ -19,7 +19,7 @@ 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
@@ -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=uMGahVBfpDbvfC8-BUk959q4j5PH97Z3iNRluL5TMBw,37101
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
@@ -86,8 +86,8 @@ librelane/scripts/odbpy/contextualize.py,sha256=G8EEgmK6ISikXD2-Pw-RTs1JxLWPnupp
86
86
  librelane/scripts/odbpy/defutil.py,sha256=g0UaAQRt8hXb9nfI6SbMp_Hx__0o1POw33_fS6xyibU,17849
87
87
  librelane/scripts/odbpy/diodes.py,sha256=qpsTW2RQlqNm4pzrUFm7d0Jj4x4zSQqladcv5SJF7XI,11752
88
88
  librelane/scripts/odbpy/disconnected_pins.py,sha256=hS_Iletg7N6K6yN_ccvWxZ3nWNZp4ecUJM-oY0kkEfA,11139
89
- librelane/scripts/odbpy/eco_buffer.py,sha256=QOL2J0UJQiVvuGFbpdyAj-RRsPfEL-rT_qro3Rp0KeE,6256
90
- librelane/scripts/odbpy/eco_diode.py,sha256=2LN7fHh9uO9JP3PYIxIwUiP1lyeqdTNF2ADTcY_Bu-g,4281
89
+ librelane/scripts/odbpy/eco_buffer.py,sha256=GnqKNEXqBb_NE6JWqnjp5Sx6baUD1pEEXclxlm6hbSU,6260
90
+ librelane/scripts/odbpy/eco_diode.py,sha256=RK1_58Jwx4ufJp_XRXEAScTQL4J3h-jt0C7VUMNm9p0,4286
91
91
  librelane/scripts/odbpy/filter_unannotated.py,sha256=Gvcaj_WNr6TPiHk-36nkMu4betNHZo1g2lD3UcA9hDQ,2950
92
92
  librelane/scripts/odbpy/io_place.py,sha256=LSJIJQDLSOpENyQOg_kVTIbh1AbYLiHIXx0siduo-lg,15589
93
93
  librelane/scripts/odbpy/ioplace_parser/__init__.py,sha256=_xCDqam3PxWO-uhTZ6afdn3dpuu4XlX2T_RaOn7QqJQ,877
@@ -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
@@ -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
159
  librelane/steps/magic.py,sha256=Cc_qApOgeltIn7lKA7dBQ4Ud9EQtbMatsuGPEvqvpcQ,21183
160
160
  librelane/steps/misc.py,sha256=8ubCvFeFEspXrgnzNWINY5-TXTyalNtlvcX8TSw0qdg,5685
161
161
  librelane/steps/netgen.py,sha256=R9sDWv-9wKMdi2rkuLQdOc4uLlbYhXcKKd6WsZsnLt0,8953
162
- librelane/steps/odb.py,sha256=-zsXi0jVdtfBfAJI0OC4x1jI_B2OX5YVn4uAn6NyFdk,38424
163
- librelane/steps/openroad.py,sha256=0UZDYTqKHOvkqXTEb44HaesaZ8d4GS-6gUahtjDc-m4,100355
162
+ librelane/steps/odb.py,sha256=szve7HMRVR9kWrIHkeViyeGszXlNd9k-oP9litb_tmo,38931
163
+ librelane/steps/openroad.py,sha256=8R129T1fnAZeoKXRwPm79h2BUBh1csAtuWOTn32kBdQ,100356
164
164
  librelane/steps/openroad_alerts.py,sha256=IJyB4piBDCKXhkJswHGMYCRDwbdQsR0GZlrGGDhmW6Q,3364
165
165
  librelane/steps/pyosys.py,sha256=BzTUYCFxXJWtHqPtEPAztoWNLbDWvECWnsWVdK_lljU,23589
166
- librelane/steps/step.py,sha256=THIxZkhtkNYt1iRgMduD0ywrOTCaV7cCfUB2EqXN6-k,55751
166
+ librelane/steps/step.py,sha256=y7PjodTaAhz2fQNVl8yBgF1KSLAA4ZxRyHz3cZ4f9ps,55811
167
167
  librelane/steps/tclstep.py,sha256=68AjCmbLhBscbzQDxRcPQVU-6UvZQNOalO7qNwUXCa4,10138
168
168
  librelane/steps/verilator.py,sha256=MWx2TpLqYyea9_jSeLG9c2S5ujvYERQZRFNaMhfHxZE,7916
169
169
  librelane/steps/yosys.py,sha256=lYdZPFvjcmdu_NE6rtB94_dysIK2qwGdGb480W6pg2w,12711
170
- librelane-3.0.0.dev37.dist-info/METADATA,sha256=XRDuS9Fu4WGt0zMRqNHRl_0gut_L7opE_WwTnhfUIVs,6561
171
- librelane-3.0.0.dev37.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
172
- librelane-3.0.0.dev37.dist-info/entry_points.txt,sha256=0eZs2NOH-w-W_GVRCs-ualst26XplkPpJkOnGWMaFw0,306
173
- librelane-3.0.0.dev37.dist-info/RECORD,,
170
+ librelane-3.0.0.dev39.dist-info/METADATA,sha256=7xHQL2tCxf0ztjj3ceE_HNhCUhfqncl31wnZawqZkpo,6563
171
+ librelane-3.0.0.dev39.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
172
+ librelane-3.0.0.dev39.dist-info/entry_points.txt,sha256=0eZs2NOH-w-W_GVRCs-ualst26XplkPpJkOnGWMaFw0,306
173
+ librelane-3.0.0.dev39.dist-info/RECORD,,