librelane 2.4.2__py3-none-any.whl → 2.4.4__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/__init__.py CHANGED
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
  """
15
15
  The LibreLane API
16
- ----------------
16
+ -----------------
17
17
 
18
18
  Documented elements of this API represent the primary programming interface for
19
19
  the LibreLane infrastructure.
librelane/__main__.py CHANGED
@@ -220,7 +220,10 @@ def print_version(ctx: click.Context, param: click.Parameter, value: bool):
220
220
  if len(discovered_plugins) > 0:
221
221
  print("Discovered plugins:")
222
222
  for name, module in discovered_plugins.items():
223
- print(f"{name} -> {module.__version__}")
223
+ if hasattr(module, "__version__"):
224
+ print(f"{name} -> {module.__version__}")
225
+ else:
226
+ print(f"{name}")
224
227
 
225
228
  ctx.exit(0)
226
229
 
librelane/common/tcl.py CHANGED
@@ -12,7 +12,6 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  import re
15
- import tkinter
16
15
  from typing import Dict, Mapping, Any, Iterable
17
16
 
18
17
  _env_rx = re.compile(r"(?:\:\:)?env\((\w+)\)")
@@ -55,6 +54,8 @@ class TclUtils(object):
55
54
 
56
55
  @staticmethod
57
56
  def _eval_env(env_in: Mapping[str, Any], tcl_in: str) -> Dict[str, Any]:
57
+ import tkinter
58
+
58
59
  interpreter = tkinter.Tcl()
59
60
 
60
61
  interpreter.eval("array unset ::env")
librelane/container.py CHANGED
@@ -57,10 +57,13 @@ def gui_args(osinfo: OSInfo) -> List[str]:
57
57
  args += [
58
58
  "-e",
59
59
  f"DISPLAY={os.environ.get('DISPLAY')}",
60
- "-v",
61
- "/tmp/.X11-unix:/tmp/.X11-unix",
62
- "-v",
63
- f"{os.path.expanduser('~')}/.Xauthority:/.Xauthority",
60
+ ]
61
+ if os.path.isdir("/tmp/.X11-unix"):
62
+ args += ["-v", "/tmp/.X11-unix:/tmp/.X11-unix"]
63
+ homedir = os.path.expanduser("~")
64
+ if os.path.isfile(f"{homedir}/.Xauthority"):
65
+ args += ["-v", f"{homedir}/.Xauthority:/.Xauthority"]
66
+ args += [
64
67
  "--network",
65
68
  "host",
66
69
  "--security-opt",
@@ -0,0 +1,18 @@
1
+ DESIGN_NAME: hold_violation
2
+ CLOCK_PORT: clk
3
+ CLOCK_PERIOD: 5
4
+ VERILOG_FILES: dir::demo.v
5
+ RUN_POST_CTS_RESIZER_TIMING: false
6
+ RUN_POST_GRT_RESIZER_TIMING: false
7
+ FP_SIZING: absolute
8
+ DIE_AREA: [0, 0, 100, 100]
9
+ INSERT_ECO_BUFFERS:
10
+ - target: u_ff1/Q
11
+ buffer: sky130_fd_sc_hd__buf_1
12
+ - target: u_ff1/Q
13
+ buffer: sky130_fd_sc_hd__buf_1
14
+ meta:
15
+ flow: Classic
16
+ substituting_steps:
17
+ "+OpenROAD.DetailedRouting": "Odb.InsertECOBuffers"
18
+ "+Odb.InsertECOBuffers": "OpenROAD.DetailedRouting"
@@ -0,0 +1,27 @@
1
+ module hold_violation(
2
+ input clk,
3
+ input d,
4
+ output q
5
+ );
6
+ wire intermediate;
7
+ wire clk_delayed;
8
+
9
+ sky130_fd_sc_hd__clkbuf_4 dly (
10
+ .A(clk),
11
+ .X(clk_delayed)
12
+ );
13
+
14
+ sky130_fd_sc_hd__dfrtp_4 u_ff1 (
15
+ .CLK(clk),
16
+ .D(d),
17
+ .RESET_B(1'b1),
18
+ .Q(intermediate)
19
+ );
20
+
21
+ sky130_fd_sc_hd__dfrtp_1 u_ff2 (
22
+ .CLK(clk_delayed),
23
+ .D(intermediate),
24
+ .RESET_B(1'b1),
25
+ .Q(q)
26
+ );
27
+ endmodule
librelane/flows/cli.py CHANGED
@@ -35,7 +35,7 @@ from cloup.typing import Decorator
35
35
 
36
36
  from .flow import Flow
37
37
  from ..common import set_tpe, cli, get_opdks_rev, _get_process_limit
38
- from ..logging import set_log_level, verbose, err, options, LogLevels
38
+ from ..logging import set_log_level, verbose, info, err, options, LogLevels
39
39
  from ..state import State, InvalidState
40
40
 
41
41
 
@@ -446,16 +446,29 @@ def cloup_flow_opts(
446
446
  err(f"Could not resolve the PDK '{pdk}'.")
447
447
  exit(1)
448
448
 
449
- version = ciel.fetch(
450
- ciel_home,
451
- pdk_family,
452
- opdks_rev,
453
- data_source=StaticWebDataSource(
454
- "https://fossi-foundation.github.io/ciel-releases"
455
- ),
456
- include_libraries=include_libraries,
457
- )
458
- pdk_root = version.get_dir(ciel_home)
449
+ if pdk_family == "ihp-sg13g2":
450
+ err(
451
+ "The IHP Open PDK is only supported in the development version of LibreLane, specifically 3.0.0.dev28 or higher."
452
+ )
453
+ info(
454
+ "If you're using Nix, switch to the 'dev' branch. If you're using the Python package, run \"python3 -m pip install 'librelane>=3.0.0.dev28'\"."
455
+ )
456
+ exit(1)
457
+
458
+ try:
459
+ version = ciel.fetch(
460
+ ciel_home,
461
+ pdk_family,
462
+ opdks_rev,
463
+ data_source=StaticWebDataSource(
464
+ "https://fossi-foundation.github.io/ciel-releases"
465
+ ),
466
+ include_libraries=include_libraries,
467
+ )
468
+ pdk_root = version.get_dir(ciel_home)
469
+ except ValueError as e:
470
+ err(f"Failed to download PDK: {e}")
471
+ exit(1)
459
472
 
460
473
  return f(*args, pdk_root=pdk_root, pdk=pdk, scl=scl, **kwargs)
461
474
 
@@ -248,13 +248,19 @@ def relocate_pins(db, input_lefs, template_def, permissive, copy_def_power=False
248
248
  pin_name = bterm.getName()
249
249
  pin_net_name = bterm.getNet().getName()
250
250
  pin_net = output_block.findNet(pin_net_name)
251
+ new_net_created = False
251
252
  if pin_net is None:
252
253
  pin_net = odb.dbNet.create(output_block, pin_net_name, True)
253
254
  pin_net.setSpecial()
254
255
  pin_net.setSigType(bterm.getSigType())
255
- pin_bterm = odb.dbBTerm.create(pin_net, pin_name)
256
- pin_bterm.setSigType(bterm.getSigType())
257
- output_bterms.append(pin_bterm)
256
+ new_net_created = True
257
+ pin_bterm = output_block.findBTerm(pin_name)
258
+ if pin_bterm is None:
259
+ pin_bterm = odb.dbBTerm.create(pin_net, pin_name)
260
+ pin_bterm.setSigType(bterm.getSigType())
261
+ output_bterms.append(pin_bterm)
262
+ elif new_net_created:
263
+ pin_bterm.connect(pin_net)
258
264
 
259
265
  grid_errors = False
260
266
  for output_bterm in output_bterms:
@@ -43,7 +43,8 @@ def cli(reader):
43
43
  grt_inc = GRT.IncrementalGRoute(grt, reader.block)
44
44
  i = 0
45
45
 
46
- for target_info in reader.config["INSERT_ECO_BUFFERS"]:
46
+ eco_buffers = reader.config["INSERT_ECO_BUFFERS"] or []
47
+ for target_info in eco_buffers:
47
48
  target_name, target_pin = target_info["target"].split("/")
48
49
  name_escaped = reader.escape_verilog_name(target_name)
49
50
  buffer_master = target_info["buffer"]
@@ -38,7 +38,8 @@ def cli(reader):
38
38
  # print(grt)
39
39
  grt_inc = GRT.IncrementalGRoute(grt, reader.block)
40
40
  i = 0
41
- for target_info in reader.config["INSERT_ECO_DIODES"]:
41
+ diodes = reader.config["INSERT_ECO_DIODES"] or []
42
+ for target_info in diodes:
42
43
  target_name, target_pin = target_info["target"].split("/")
43
44
  name_escaped = reader.escape_verilog_name(target_name)
44
45
 
@@ -47,8 +47,9 @@ def load_step_from_inputs(
47
47
  if Found := Step.factory.get(id):
48
48
  Target = Found
49
49
  else:
50
- err(
51
- f"No step registered with id '{id}'. Ensure all relevant plugins are installed."
50
+ err(f"No step registered with id '{id}'.")
51
+ info(
52
+ f"If the step '{id}' is part of a plugin, make sure the plugin's parent directory is in the PYTHONPATH environment variable."
52
53
  )
53
54
  ctx.exit(-1)
54
55
 
@@ -79,22 +79,21 @@ class MetricChecker(Step):
79
79
  deferred: ClassVar[bool] = True
80
80
  error_on_var: Optional[Variable] = None
81
81
 
82
- @classmethod
83
- def get_help_md(Self, **kwargs): # pragma: no cover
84
- threshold_string = Self.get_threshold_description(None)
82
+ def __init_subclass__(cls):
83
+ threshold_string = cls.get_threshold_description(None)
85
84
  if threshold_string is None:
86
- threshold_string = str(Self.get_threshold(None))
85
+ threshold_string = str(cls.get_threshold(None))
87
86
  dynamic_docstring = "Raises"
88
- if Self.deferred:
87
+ if cls.deferred:
89
88
  dynamic_docstring += " a deferred error"
90
89
  else:
91
90
  dynamic_docstring += " an immediate error"
92
- dynamic_docstring += f" if {Self.metric_description} (metric: ``{Self.metric_name}``) are >= {threshold_string}."
91
+ dynamic_docstring += f" if {cls.metric_description} (metric: ``{cls.metric_name}``) are >= {threshold_string}."
93
92
  dynamic_docstring += (
94
93
  " Doesn't raise an error depending on error_on_var if defined."
95
94
  )
96
-
97
- return super().get_help_md(docstring_override=dynamic_docstring, **kwargs)
95
+ cls.__doc__ = dynamic_docstring
96
+ return super().__init_subclass__()
98
97
 
99
98
  def get_threshold(self: Optional["MetricChecker"]) -> Optional[Decimal]:
100
99
  return Decimal(0)
@@ -327,6 +327,15 @@ class XOR(KLayoutStep):
327
327
 
328
328
  @Step.factory.register()
329
329
  class DRC(KLayoutStep):
330
+ """
331
+ Runs DRC using KLayout.
332
+
333
+ Unlike most steps, the KLayout scripts vary quite wildly by PDK. If a PDK
334
+ is not supported by this step, it will simply be skipped.
335
+
336
+ Currently, only sky130A and sky130B are supported.
337
+ """
338
+
330
339
  id = "KLayout.DRC"
331
340
  name = "Design Rule Check (KLayout)"
332
341
 
librelane/steps/misc.py CHANGED
@@ -53,6 +53,11 @@ class LoadBaseSDC(Step):
53
53
 
54
54
  @Step.factory.register()
55
55
  class ReportManufacturability(Step):
56
+ """
57
+ Logs a simple "manufacturability report", i.e., the status of DRC, LVS, and
58
+ antenna violations.
59
+ """
60
+
56
61
  id = "Misc.ReportManufacturability"
57
62
  name = "Report Manufacturability"
58
63
  long_name = "Report Manufacturability (DRC, LVS, Antenna)"
librelane/steps/odb.py CHANGED
@@ -176,6 +176,10 @@ class OdbpyStep(Step):
176
176
 
177
177
  @Step.factory.register()
178
178
  class CheckMacroAntennaProperties(OdbpyStep):
179
+ """
180
+ Prints warnings if the LEF views of macros are missing antenna information.
181
+ """
182
+
179
183
  id = "Odb.CheckMacroAntennaProperties"
180
184
  name = "Check Antenna Properties of Macros Pins in Their LEF Views"
181
185
  inputs = OdbpyStep.inputs
@@ -213,6 +217,10 @@ class CheckMacroAntennaProperties(OdbpyStep):
213
217
 
214
218
  @Step.factory.register()
215
219
  class CheckDesignAntennaProperties(CheckMacroAntennaProperties):
220
+ """
221
+ Prints warnings if the LEF view of the design is missing antenna information.
222
+ """
223
+
216
224
  id = "Odb.CheckDesignAntennaProperties"
217
225
  name = "Check Antenna Properties of Pins in The Generated Design LEF view"
218
226
  inputs = CheckMacroAntennaProperties.inputs + [DesignFormat.LEF]
@@ -519,6 +527,11 @@ class ReportDisconnectedPins(OdbpyStep):
519
527
 
520
528
  @Step.factory.register()
521
529
  class AddRoutingObstructions(OdbpyStep):
530
+ """
531
+ Adds obstructions on metal layers which prevent shapes from being created in
532
+ the designated areas.
533
+ """
534
+
522
535
  id = "Odb.AddRoutingObstructions"
523
536
  name = "Add Obstructions"
524
537
  config_vars = [
@@ -561,6 +574,11 @@ class AddRoutingObstructions(OdbpyStep):
561
574
 
562
575
  @Step.factory.register()
563
576
  class RemoveRoutingObstructions(AddRoutingObstructions):
577
+ """
578
+ Removes any routing obstructions previously placed by
579
+ <#Odb.AddRoutingObstructions>`_.
580
+ """
581
+
564
582
  id = "Odb.RemoveRoutingObstructions"
565
583
  name = "Remove Obstructions"
566
584
 
@@ -570,6 +588,15 @@ class RemoveRoutingObstructions(AddRoutingObstructions):
570
588
 
571
589
  @Step.factory.register()
572
590
  class AddPDNObstructions(AddRoutingObstructions):
591
+ """
592
+ Adds obstructions on metal layers which prevent shapes from being created in
593
+ the designated areas.
594
+
595
+ A soft-duplicate of <#Odb.AddRoutingObstructions>`_ , though this one uses
596
+ a different variable name so the obstructions can be restricted for PDN
597
+ steps only.
598
+ """
599
+
573
600
  id = "Odb.AddPDNObstructions"
574
601
  name = "Add PDN obstructions"
575
602
 
@@ -587,6 +614,11 @@ class AddPDNObstructions(AddRoutingObstructions):
587
614
 
588
615
  @Step.factory.register()
589
616
  class RemovePDNObstructions(RemoveRoutingObstructions):
617
+ """
618
+ Removes any PDN obstructions previously placed by
619
+ <#Odb.RemovePDNObstructions>`_.
620
+ """
621
+
590
622
  id = "Odb.RemovePDNObstructions"
591
623
  name = "Remove PDN obstructions"
592
624
 
@@ -1051,11 +1051,6 @@ class IOPlacement(OpenROADStep):
1051
1051
  Optional[Path],
1052
1052
  "Path to a custom pin configuration file.",
1053
1053
  ),
1054
- Variable(
1055
- "FP_DEF_TEMPLATE",
1056
- Optional[Path],
1057
- "Points to the DEF file to be used as a template.",
1058
- ),
1059
1054
  Variable(
1060
1055
  "FP_IO_VLENGTH",
1061
1056
  Optional[Decimal],
@@ -1327,11 +1322,6 @@ class GlobalPlacementSkipIO(_GlobalPlacement):
1327
1322
  default="matching",
1328
1323
  deprecated_names=[("FP_IO_MODE", _migrate_ppl_mode)],
1329
1324
  ),
1330
- Variable(
1331
- "FP_DEF_TEMPLATE",
1332
- Optional[Path],
1333
- "Points to the DEF file to be used as a template.",
1334
- ),
1335
1325
  ]
1336
1326
 
1337
1327
  def run(self, state_in: State, **kwargs) -> Tuple[ViewsUpdate, MetricsUpdate]:
librelane/steps/pyosys.py CHANGED
@@ -302,6 +302,12 @@ class VerilogStep(PyosysStep):
302
302
 
303
303
  @Step.factory.register()
304
304
  class JsonHeader(VerilogStep):
305
+ """
306
+ Extracts a high-level hierarchical view of the circuit in JSON format,
307
+ including power connections. The power connections are used in later steps
308
+ to ensure macros and cells are connected as desired.
309
+ """
310
+
305
311
  id = "Yosys.JsonHeader"
306
312
  name = "Generate JSON Header"
307
313
  long_name = "Generate JSON Header"
librelane/steps/yosys.py CHANGED
@@ -248,6 +248,14 @@ class YosysStep(TclStep):
248
248
 
249
249
  @Step.factory.register()
250
250
  class EQY(Step):
251
+ """
252
+ Experimental: Uses the `EQY <https://github.com/yosyshq/eqy>`_ utility to
253
+ perform an RTL vs. Netlist equivalence check.
254
+
255
+ Currently, you are expected to provide your own EQY script if you want this
256
+ to work properly.
257
+ """
258
+
251
259
  id = "Yosys.EQY"
252
260
  name = "Equivalence Check"
253
261
  long_name = "RTL/Netlist Equivalence Check"
@@ -262,7 +270,7 @@ class EQY(Step):
262
270
  Variable(
263
271
  "EQY_SCRIPT",
264
272
  Optional[Path],
265
- "An optional override for the automatically generated EQY script for more complex designs.",
273
+ "The EQY script to use. If unset, a generic EQY script will be generated, but this fails in a number of scenarios.",
266
274
  ),
267
275
  Variable(
268
276
  "MACRO_PLACEMENT_CFG",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: librelane
3
- Version: 2.4.2
3
+ Version: 2.4.4
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
@@ -1,5 +1,5 @@
1
- librelane/__init__.py,sha256=EMpoZrRmS_wsweKjhyAg52OXCK7HWQ8o8CVrYaX4ub0,1220
2
- librelane/__main__.py,sha256=Yqc42w-sb5DNIOdTENTzeAaraG1ZvdRc1Oqsl__JodM,14953
1
+ librelane/__init__.py,sha256=Xbz6e-J9pNxv0AIi89-mApMEQQtRgxJyzHS6yYc00Y0,1221
2
+ librelane/__main__.py,sha256=XeQHNgw0w3ODYxJ9K-dQVfQMMoguteytCrXRquv3RjQ,15055
3
3
  librelane/__version__.py,sha256=dbE4stCACDmIoxgKksesAkTa-_hi5dW6nPLWw9Pfq3Q,1486
4
4
  librelane/common/__init__.py,sha256=tUX6pVEPrf7LnX7OiIaQFCyB1fs5AgwGt0xR2OHWC5Q,1557
5
5
  librelane/common/cli.py,sha256=xi48GBGHRsYrLGwx40ARwpykHx7GnuHbJjHxjOwtZ5Y,2349
@@ -12,7 +12,7 @@ librelane/common/metrics/metric.py,sha256=h3Xd26z5M80IJgVmmrBTjKcdGLb4I0wyjM-H4j
12
12
  librelane/common/metrics/util.py,sha256=Bl_9znlot7-Os2VigYLSmMf56aAkGdv3evWz9vfK7K4,9344
13
13
  librelane/common/misc.py,sha256=kcCD0Ld8jEEuCOe3HhU-AAtic3GUxbYsHxGBPwehqR4,14387
14
14
  librelane/common/ring_buffer.py,sha256=DGFen9y0JOmiL7E27tmzDTVSJKZtV-waF9hl5Rz9uek,1898
15
- librelane/common/tcl.py,sha256=G0__oR6azVCS2Aue87zboba7vAR7v-SVQeUbqfviiDA,2709
15
+ librelane/common/tcl.py,sha256=eNHMyAU_96z_ABPV56HMLDe__Zm2QLZBxR5PjWJN1t8,2718
16
16
  librelane/common/toolbox.py,sha256=fBMkpoOOL7rdbwi3W3-U5rrCxSplAqFZtlTcJtjLgMY,20968
17
17
  librelane/common/tpe.py,sha256=Txj0fVscXSDJTYmEKZ2ESFHOeqrhHnaPPiwWBgyx4g8,1285
18
18
  librelane/common/types.py,sha256=xo_OKq-2ue7JVpyQb6oUu6JuVSnLNEFKQCPBqNhZnQ4,3509
@@ -24,8 +24,10 @@ librelane/config/pdk_compat.py,sha256=rznq5xIny9M0PmddhPOGtCIrSdv98ysAoYgkpyM0gU
24
24
  librelane/config/preprocessor.py,sha256=I239Y01dC2o5eb1UtcSbLdybVrZgqGyDr7ecT234I4Y,14913
25
25
  librelane/config/removals.py,sha256=lJ0xpkCqnZAdA_ug4yq0NDjRBFuw4XsdORwymbEVGyQ,2907
26
26
  librelane/config/variable.py,sha256=r88sLpxb7GR2QBwh9EKJNN_Vpd_vjUpRBJq7V3Fd6jI,26786
27
- librelane/container.py,sha256=7w_V2Fpb3dbnZ8FqBce1vK31jH30UrxByppfEJRyG9M,8672
27
+ librelane/container.py,sha256=GN1lqVguuqPAuTxINii-bWKBKmIQ-VJc0WHPDEp73sU,8829
28
28
  librelane/env_info.py,sha256=xF9iqwwJv5yZz7n7BTrrT_yP3Dp1HjAOUObNE9k_1g4,11074
29
+ librelane/examples/hold_eco_demo/config.yaml,sha256=InDj4pS6o6TpyvQZyR3qCrYcIHdmCd6l04wqanKnK_A,490
30
+ librelane/examples/hold_eco_demo/demo.v,sha256=0In_gDLH1svr4xK59l5N15VjCNtN74uZx1yT5tIVGrM,471
29
31
  librelane/examples/spm/config.yaml,sha256=YKBm0lsY3AJZNcxAh1sQ1QMmJeVCpOpil6dw_RgQh4c,633
30
32
  librelane/examples/spm/pin_order.cfg,sha256=-8mTGFKnES0vhQATfaE2TXN_mdCZ3SZIN90Src1l6fY,52
31
33
  librelane/examples/spm/src/impl.sdc,sha256=wP18UoVlOJ9q4lmUoa3XpgcpPdyzEqHBNxCgOOU7QH0,2961
@@ -42,7 +44,7 @@ librelane/examples/spm-user_project_wrapper/user_project_wrapper.v,sha256=zc6GC5
42
44
  librelane/flows/__init__.py,sha256=ghtmUG-taVpHJ3CKJRYZGn3dU0r93araT1EIGlBEsxg,896
43
45
  librelane/flows/builtins.py,sha256=tR14Qc1ZUey2w-Ar4DWOvxuP7LGPtMecCJq8WgcYJpk,773
44
46
  librelane/flows/classic.py,sha256=fI-LNhrvi7lzfsHRyJv_yjgFbpbWBVxN-9QpsgDxpTQ,10940
45
- librelane/flows/cli.py,sha256=6hphbCO_iN30IskyrFDqGMJ3fOQVvE1O9IjEi9JD2PE,16727
47
+ librelane/flows/cli.py,sha256=4cJT7l9Nl-RJMMqWrS6W5QpbomM5aPYBToXdyZjwF4I,17443
46
48
  librelane/flows/flow.py,sha256=V3NMKH0C8XHcfWiRwus36kQ3TqxOpnimGDCe0iLIo5A,37199
47
49
  librelane/flows/misc.py,sha256=32Om3isexesfKKiJZCajNmINc-xdv7eVx_tgoh9SR6U,2015
48
50
  librelane/flows/optimizing.py,sha256=OwZz6WGmXpliwO8vtmhjKHD-kzDyNv-zoCECZIigXsI,6076
@@ -83,11 +85,11 @@ librelane/scripts/odbpy/apply_def_template.py,sha256=Tn6y65biu0bAQ6XilYxq5jn3a_K
83
85
  librelane/scripts/odbpy/cell_frequency.py,sha256=NfGgM8wxIvjM1C_GHUghZPOh8gpdasLOWR4qBdHHLFE,3105
84
86
  librelane/scripts/odbpy/check_antenna_properties.py,sha256=dMD-RcoA7plcAu9IIqa2e-8XCO0EMcKG-6P39D3Gpic,3942
85
87
  librelane/scripts/odbpy/contextualize.py,sha256=G8EEgmK6ISikXD2-Pw-RTs1JxLWPnuppwL7oPfAsb84,4020
86
- librelane/scripts/odbpy/defutil.py,sha256=g0UaAQRt8hXb9nfI6SbMp_Hx__0o1POw33_fS6xyibU,17849
88
+ librelane/scripts/odbpy/defutil.py,sha256=gBANy_XTeLeXRBMGdCy2vI5y44qMB6E_Fy0VeyW6rUg,18104
87
89
  librelane/scripts/odbpy/diodes.py,sha256=ZS_1niaTcwvaTTNjJcth4Qepcwxa6aV6E9WM_KiMtTI,11811
88
90
  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
91
+ librelane/scripts/odbpy/eco_buffer.py,sha256=lb7KtVZUzXSkPq9mRTXPVnSo_isy4845wohLFPhDN30,6292
92
+ librelane/scripts/odbpy/eco_diode.py,sha256=LSM3D0ygE7_vSHbXt49DU1R068NkqmSYVlb32a3scZI,4307
91
93
  librelane/scripts/odbpy/filter_unannotated.py,sha256=Gvcaj_WNr6TPiHk-36nkMu4betNHZo1g2lD3UcA9hDQ,2950
92
94
  librelane/scripts/odbpy/io_place.py,sha256=LSJIJQDLSOpENyQOg_kVTIbh1AbYLiHIXx0siduo-lg,15589
93
95
  librelane/scripts/odbpy/ioplace_parser/__init__.py,sha256=_xCDqam3PxWO-uhTZ6afdn3dpuu4XlX2T_RaOn7QqJQ,877
@@ -148,23 +150,23 @@ librelane/state/__main__.py,sha256=Ici4Ejg1ICUZNSYZRguC3BfEk_wFxsmE0ag0Vv8iY1I,1
148
150
  librelane/state/design_format.py,sha256=ISl4O18ky1BiMkQn8Si0Tcf8UA5vrlZ1yay0iKPxvfk,5794
149
151
  librelane/state/state.py,sha256=-vg7pYJ7U7uzC26oDKM49H410fm2-kV03Hf0bg3dMus,12149
150
152
  librelane/steps/__init__.py,sha256=j3JYrdnWM74dYuEvE931oSrQI7FUz-hKWr8Mts8C0wg,1668
151
- librelane/steps/__main__.py,sha256=GQZiV4s-9GIF4AwP34W61zwgzMvPp-QTR4cNELi7r5c,13349
152
- librelane/steps/checker.py,sha256=vul1D0cT03144qKK5QAKswClKKICK7kNB4PB6xXykvc,21353
153
+ librelane/steps/__main__.py,sha256=p7eQ8l8V47RBmQifLcwZPXbEN807qR9ICUx4sMwM7fY,13450
154
+ librelane/steps/checker.py,sha256=Uq7DyO8wE7WD3RjDSiB_w_T9f4YO6CC_zkGn21MLrRI,21305
153
155
  librelane/steps/common_variables.py,sha256=qT0VeIstFsDbe8VGAyqXrXxQw69OZ08haM6u1IbdFiE,10429
154
156
  librelane/steps/cvc_rv.py,sha256=32vxFIbzSbrDtE0fXvdoQ-v3LVMrfi3r88f8Y-TKPKg,5531
155
- librelane/steps/klayout.py,sha256=g7jYz-1cLwgfPTiMJIdAQ9zmkrwNtJLPoRg6PqOUv6Y,16490
157
+ librelane/steps/klayout.py,sha256=i7XXdd9U7Uj6D1vflToOi1FysNJ-WbrbyeQkmMTkU1Q,16732
156
158
  librelane/steps/magic.py,sha256=60Ko7sf_E3KNO18op_pyojrBdfej0v5NCexXxmI0X90,20716
157
- librelane/steps/misc.py,sha256=Xk_a6JJPljkk8pemu-NtlzDRs-8S7vuRKZKj4pnCRlE,5690
159
+ librelane/steps/misc.py,sha256=VUe3GOOaZm9r0mHmMSUi4cDCN2Mccm16I_isisW_r8Y,5811
158
160
  librelane/steps/netgen.py,sha256=R9sDWv-9wKMdi2rkuLQdOc4uLlbYhXcKKd6WsZsnLt0,8953
159
- librelane/steps/odb.py,sha256=WaYquQfdp0j5XSbDa7a_un0HF4bOprpuC6fFtKpHHI8,37956
160
- librelane/steps/openroad.py,sha256=XJ8D8pvKLToTR83uTWAeszNu30BDGewntBQ8uttXGeU,86458
161
+ librelane/steps/odb.py,sha256=9TFYkFojERc4wVoTxpaHHVvB_sI3SNi6vakTwpmdTfU,38791
162
+ librelane/steps/openroad.py,sha256=SmZT2zj0phyD7aIiVV0USi5KUDHHvDXfyg2VyWFV3Yw,86134
161
163
  librelane/steps/openroad_alerts.py,sha256=IJyB4piBDCKXhkJswHGMYCRDwbdQsR0GZlrGGDhmW6Q,3364
162
- librelane/steps/pyosys.py,sha256=mnbPR267XzJvDhtXW4cdTAB3IqvksUZt4ch5xQHgdY0,22705
164
+ librelane/steps/pyosys.py,sha256=DLft0-g4RFaMiEtElve6-CaNV24IT1usNprzLNYB5io,22933
163
165
  librelane/steps/step.py,sha256=oV67Vdw7apNaHovvLguNwX4EylWEvzqkciV6Edocc_M,55802
164
166
  librelane/steps/tclstep.py,sha256=0PMWJ6C3dKnlQf9mA9rZntgxUBCiByE9csHcEcM1iq0,10027
165
167
  librelane/steps/verilator.py,sha256=MWx2TpLqYyea9_jSeLG9c2S5ujvYERQZRFNaMhfHxZE,7916
166
- librelane/steps/yosys.py,sha256=GX6rTiQG-ZhDxfB9SxrPQ9Sab3WC84p0OUtqiL1Nubk,12533
167
- librelane-2.4.2.dist-info/METADATA,sha256=jRuSXSm0_gZdUKqLvDmV-qq-_OQVkowUDHr5wM1virg,6557
168
- librelane-2.4.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
169
- librelane-2.4.2.dist-info/entry_points.txt,sha256=0eZs2NOH-w-W_GVRCs-ualst26XplkPpJkOnGWMaFw0,306
170
- librelane-2.4.2.dist-info/RECORD,,
168
+ librelane/steps/yosys.py,sha256=3MDUZU-LSe0YArm1VxGRysZM6Pb87uuzOh8T0AqdHcQ,12805
169
+ librelane-2.4.4.dist-info/METADATA,sha256=GTmElvScePSjTLG0pSK1njhmMh9MXgooMZp1kCcPEBM,6557
170
+ librelane-2.4.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
171
+ librelane-2.4.4.dist-info/entry_points.txt,sha256=0eZs2NOH-w-W_GVRCs-ualst26XplkPpJkOnGWMaFw0,306
172
+ librelane-2.4.4.dist-info/RECORD,,