librelane 2.4.0.dev11__py3-none-any.whl → 2.4.1__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/steps/magic.py CHANGED
@@ -14,7 +14,6 @@
14
14
  import os
15
15
  import re
16
16
  import shutil
17
- import functools
18
17
  import subprocess
19
18
  from signal import SIGKILL
20
19
  from decimal import Decimal
@@ -34,7 +33,8 @@ from .tclstep import TclStep
34
33
  from ..state import DesignFormat, State
35
34
 
36
35
  from ..config import Variable
37
- from ..common import get_script_dir, DRC as DRCObject, Path, mkdirp
36
+ from ..common import get_script_dir, DRC as DRCObject, Path, mkdirp, count_occurences
37
+ from ..logging import warn
38
38
 
39
39
 
40
40
  class MagicOutputProcessor(OutputProcessor):
@@ -464,6 +464,12 @@ class SpiceExtraction(MagicStep):
464
464
  "Extracts a SPICE netlist based on black-boxed standard cells and macros (basically, anything with a LEF) rather than transistors. An error will be thrown if both this and `MAGIC_EXT_USE_GDS` is set to ``True``.",
465
465
  default=False,
466
466
  ),
467
+ Variable(
468
+ "MAGIC_FEEDBACK_CONVERSION_THRESHOLD",
469
+ int,
470
+ "If Magic provides more feedback items than this threshold, conversion to KLayout databases is skipped (as something has gone horribly wrong.)",
471
+ default=10000,
472
+ ),
467
473
  ]
468
474
 
469
475
  def get_script_path(self):
@@ -481,22 +487,29 @@ class SpiceExtraction(MagicStep):
481
487
 
482
488
  views_updates, metrics_updates = super().run(state_in, env=env, **kwargs)
483
489
 
484
- cif_scale = Decimal(open(os.path.join(self.step_dir, "cif_scale.txt")).read())
485
490
  feedback_path = os.path.join(self.step_dir, "feedback.txt")
491
+ with open(feedback_path, encoding="utf8") as f:
492
+ illegal_overlap_count = count_occurences(f, "Illegal overlap")
493
+
494
+ metrics_updates["magic__illegal_overlap__count"] = illegal_overlap_count
495
+ threshold = self.config["MAGIC_FEEDBACK_CONVERSION_THRESHOLD"]
496
+ if illegal_overlap_count > threshold:
497
+ warn(
498
+ f"Not converting the feedback to the KLayout database format: {illegal_overlap_count} > MAGIC_FEEDBACK_CONVERSION_THRESHOLD ({threshold}). You may manually increase the threshold, but it might take forever."
499
+ )
500
+ return views_updates, metrics_updates
501
+
502
+ cif_scale = Decimal(open(os.path.join(self.step_dir, "cif_scale.txt")).read())
486
503
  try:
487
504
  se_feedback, _ = DRCObject.from_magic_feedback(
488
505
  open(feedback_path, encoding="utf8"),
489
506
  cif_scale,
490
507
  self.config["DESIGN_NAME"],
491
508
  )
492
- illegal_overlap_count = functools.reduce(
493
- lambda a, b: a + len(b.bounding_boxes),
494
- [
495
- v
496
- for v in se_feedback.violations.values()
497
- if "Illegal overlap" in v.description
498
- ],
499
- 0,
509
+ illegal_overlap_count = sum(
510
+ len(v.bounding_boxes)
511
+ for v in se_feedback.violations.values()
512
+ if "Illegal overlap" in v.description
500
513
  )
501
514
  with open(os.path.join(self.step_dir, "feedback.xml"), "wb") as f:
502
515
  se_feedback.to_klayout_xml(f)
@@ -505,9 +518,6 @@ class SpiceExtraction(MagicStep):
505
518
  self.warn(
506
519
  f"Failed to convert SPICE extraction feedback to KLayout database format: {e}"
507
520
  )
508
- metrics_updates["magic__illegal_overlap__count"] = (
509
- open(feedback_path, encoding="utf8").read().count("Illegal overlap")
510
- )
511
521
  return views_updates, metrics_updates
512
522
 
513
523
 
librelane/steps/odb.py CHANGED
@@ -17,7 +17,6 @@ import json
17
17
  import shutil
18
18
  from math import inf
19
19
  from decimal import Decimal
20
- from functools import reduce
21
20
  from abc import abstractmethod
22
21
  from dataclasses import dataclass
23
22
  from typing import Dict, List, Literal, Optional, Tuple
@@ -414,9 +413,7 @@ class ManualMacroPlacement(OdbpyStep):
414
413
  )
415
414
  shutil.copyfile(cfg_ref, cfg_file)
416
415
  elif macros := self.config.get("MACROS"):
417
- instance_count = reduce(
418
- lambda x, y: x + len(y.instances), macros.values(), 0
419
- )
416
+ instance_count = sum(len(m.instances) for m in macros.values())
420
417
  if instance_count >= 1:
421
418
  with open(cfg_file, "w") as f:
422
419
  for module, macro in macros.items():
@@ -19,7 +19,6 @@ import io
19
19
  import os
20
20
  import re
21
21
  import json
22
- import functools
23
22
  import subprocess
24
23
  from enum import Enum
25
24
  from math import inf
@@ -1147,9 +1146,7 @@ def get_psm_error_count(rpt: io.TextIOWrapper) -> int:
1147
1146
 
1148
1147
  sio.seek(0)
1149
1148
  violations = yaml.load(sio, Loader=yaml.SafeLoader) or []
1150
- return functools.reduce(
1151
- lambda acc, current: acc + len(current["srcs"]), violations, 0
1152
- )
1149
+ return sum(len(violation["srcs"]) for violation in violations)
1153
1150
 
1154
1151
 
1155
1152
  @Step.factory.register()
@@ -2140,7 +2137,7 @@ class RepairDesignPostGPL(ResizerStep):
2140
2137
  Variable(
2141
2138
  "DESIGN_REPAIR_BUFFER_OUTPUT_PORTS",
2142
2139
  bool,
2143
- "Specifies whether or not to insert buffers on input ports when design repairs are run.",
2140
+ "Specifies whether or not to insert buffers on output ports when design repairs are run.",
2144
2141
  default=True,
2145
2142
  deprecated_names=["PL_RESIZER_BUFFER_OUTPUT_PORTS"],
2146
2143
  ),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: librelane
3
- Version: 2.4.0.dev11
3
+ Version: 2.4.1
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)
@@ -1,31 +1,31 @@
1
1
  librelane/__init__.py,sha256=EMpoZrRmS_wsweKjhyAg52OXCK7HWQ8o8CVrYaX4ub0,1220
2
- librelane/__main__.py,sha256=GTPX4SM4euBFFFOd3ah_il5GEBBBOa6af6QC4KH2bjE,14792
2
+ librelane/__main__.py,sha256=Yqc42w-sb5DNIOdTENTzeAaraG1ZvdRc1Oqsl__JodM,14953
3
3
  librelane/__version__.py,sha256=dbE4stCACDmIoxgKksesAkTa-_hi5dW6nPLWw9Pfq3Q,1486
4
- librelane/common/__init__.py,sha256=LrzxjZKJu3-i8oEYdXtV1IxkXicHtoSUNRcOGrGVGsw,1516
4
+ librelane/common/__init__.py,sha256=tUX6pVEPrf7LnX7OiIaQFCyB1fs5AgwGt0xR2OHWC5Q,1557
5
5
  librelane/common/cli.py,sha256=xi48GBGHRsYrLGwx40ARwpykHx7GnuHbJjHxjOwtZ5Y,2349
6
- librelane/common/drc.py,sha256=2N5jPbM0cxnOj2Kci2AhHTTgHcynTtkV118ii3kq7IU,9603
6
+ librelane/common/drc.py,sha256=3AUxg986X_lCPrQvDkLekVTeC4-4qS7ZDpVMKlVkEmo,9638
7
7
  librelane/common/generic_dict.py,sha256=ASa5wtVcLuGlsBqGfLxLYXrYksqQB62iHljV04plIqI,10010
8
8
  librelane/common/metrics/__init__.py,sha256=nzdmeia1fN4CDPT604v-OHaBVydz-M4hz232g-jxJ6M,1521
9
9
  librelane/common/metrics/__main__.py,sha256=VfoOHFkGXtei6GLkPUD42X6io8QKFCHhxLMWOXPz_5E,12473
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
13
- librelane/common/misc.py,sha256=gxf5kDwn6m1Zib9BWK19nfAb2HLEBVlH-OyR3MiGpFQ,12408
13
+ librelane/common/misc.py,sha256=kcCD0Ld8jEEuCOe3HhU-AAtic3GUxbYsHxGBPwehqR4,14387
14
14
  librelane/common/ring_buffer.py,sha256=DGFen9y0JOmiL7E27tmzDTVSJKZtV-waF9hl5Rz9uek,1898
15
15
  librelane/common/tcl.py,sha256=G0__oR6azVCS2Aue87zboba7vAR7v-SVQeUbqfviiDA,2709
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
19
19
  librelane/config/__init__.py,sha256=lbJmD5CbrrrnaNdIUWqFIK488ea0uyej3iExh-9mkgE,1107
20
- librelane/config/__main__.py,sha256=6KSXxM4qNE2yJhizUsF1kdMsY1kY7hLHoPoz50POsS8,4532
20
+ librelane/config/__main__.py,sha256=NsJGoIOb950mdXql1zmzSq10wuFovK9NGWm011NNJ3A,4474
21
21
  librelane/config/config.py,sha256=WUznKnVYLn7ZNbUL4YMkMX7akmyc2S26ksQSicKeN1c,34964
22
22
  librelane/config/flow.py,sha256=qCGaUOj12j57gORzoE10m7_WG-n600llnFDMlZagUF4,16660
23
23
  librelane/config/pdk_compat.py,sha256=rznq5xIny9M0PmddhPOGtCIrSdv98ysAoYgkpyM0gUA,8450
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=3KHxs3dUSVUZVYsS6fsA7dD3Q4QEQEzRxgXZZh9dzi0,7554
28
- librelane/env_info.py,sha256=vAE9AZ_vDFLt7Srtg4ZywPzE6vgVhCrIvg8PP25-BJ8,10460
27
+ librelane/container.py,sha256=7w_V2Fpb3dbnZ8FqBce1vK31jH30UrxByppfEJRyG9M,8672
28
+ librelane/env_info.py,sha256=xF9iqwwJv5yZz7n7BTrrT_yP3Dp1HjAOUObNE9k_1g4,11074
29
29
  librelane/examples/spm/config.yaml,sha256=YKBm0lsY3AJZNcxAh1sQ1QMmJeVCpOpil6dw_RgQh4c,633
30
30
  librelane/examples/spm/pin_order.cfg,sha256=-8mTGFKnES0vhQATfaE2TXN_mdCZ3SZIN90Src1l6fY,52
31
31
  librelane/examples/spm/src/impl.sdc,sha256=wP18UoVlOJ9q4lmUoa3XpgcpPdyzEqHBNxCgOOU7QH0,2961
@@ -43,11 +43,12 @@ librelane/flows/__init__.py,sha256=ghtmUG-taVpHJ3CKJRYZGn3dU0r93araT1EIGlBEsxg,8
43
43
  librelane/flows/builtins.py,sha256=tR14Qc1ZUey2w-Ar4DWOvxuP7LGPtMecCJq8WgcYJpk,773
44
44
  librelane/flows/classic.py,sha256=fI-LNhrvi7lzfsHRyJv_yjgFbpbWBVxN-9QpsgDxpTQ,10940
45
45
  librelane/flows/cli.py,sha256=P2LCFn5_RQ88yB0WuetpLAuWeKQXd-DrpCOMgnVh9Mg,16705
46
- librelane/flows/flow.py,sha256=zVSz52LDuCsG_Fenx6OJtLrj-SMLk-CFBIH-p4_Y5LE,35083
46
+ librelane/flows/flow.py,sha256=LkG9B-kes37IqqLS3MDjD97c9YbHV3WP-m8Kh5fuv9Q,37132
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=DLzgvHKq0cO-U-eLO98zIFRnhGLfRv80_ozSX973TlI,13350
50
50
  librelane/flows/synth_explore.py,sha256=8mpeuG6oxeEXVQi4NwS4I415eCu7Ak6DN4oK30h1eCQ,7418
51
+ librelane/help/__main__.py,sha256=gnm0yi-Ih8YoyY2cMiHONV2ZzR-tvHfdEHCb28YQJZ0,1243
51
52
  librelane/logging/__init__.py,sha256=mrTnzjpH6AOu2CiDZYfOMCVByAS2Xeg9HS4FJyXsJOE,1043
52
53
  librelane/logging/logger.py,sha256=kA61TGsR00Fi6kQSxgTC1pHpS_-zqC1PdQnYqnk2TWY,8632
53
54
  librelane/open_pdks_rev,sha256=_q6FiO0UljepWU99r9IgkbLrKLDIPbO-80--OFWrZxA,41
@@ -64,19 +65,19 @@ librelane/scripts/magic/Readme.md,sha256=NaQrlxY8l8GT-kokJNlMHeAR3PksWVbFpSznOWW
64
65
  librelane/scripts/magic/common/read.tcl,sha256=BcTGgul2TuSVd0TmhXrR0mvwE4hVO6NaHcy_5uLsOMI,3132
65
66
  librelane/scripts/magic/def/antenna_check.tcl,sha256=T_r1CWgySFVlLMcoTrNXQ_aMRs_fBAUYUUjyXJV1Sg0,1019
66
67
  librelane/scripts/magic/def/mag.tcl,sha256=PuL3MH6pmZP5Qh2cJ0GygWNzaYjdCSCoAbOli-JB4fs,707
67
- librelane/scripts/magic/def/mag_gds.tcl,sha256=pPNKntSkVM0fzHuyVrUtxWc7HWY2-MIMoId6PW8SIT4,2137
68
- librelane/scripts/magic/drc.tcl,sha256=slHVfI6QoApKc2S6V3MIqcV5xnKRMJ_1wSGleJzkHpk,2402
68
+ librelane/scripts/magic/def/mag_gds.tcl,sha256=zZESdGgKZG6__Z9f8Kjxhw3Fx4FMpYlSBGCilggIuv8,2129
69
+ librelane/scripts/magic/drc.tcl,sha256=gPGyI96lR10dJXcJACajzHaHiT6ayAYPJqrmmuQkABc,2395
69
70
  librelane/scripts/magic/extract_spice.tcl,sha256=lFNXfjIIzAWb2wda9ZtBOecENOOXyFBsh9HgrPYf7VQ,2737
70
71
  librelane/scripts/magic/gds/drc_batch.tcl,sha256=O76rwxSrQgoCuoxk36tRBZkQaeMfJknlHrQA3mtU2JU,2198
71
72
  librelane/scripts/magic/gds/erase_box.tcl,sha256=wsVSwMlkZFJa_MEGNsdXLnXFvjZlrl_lzIWkJjcDBgg,929
72
- librelane/scripts/magic/gds/extras_mag.tcl,sha256=aEABKbyUukMr3AhCCgpE8WpEzWwZzeFbqlQ8kAQJFYI,1325
73
- librelane/scripts/magic/gds/mag_with_pointers.tcl,sha256=mK0MEeQMRPN0MopgMlF2v5mq9jkssHEFRKv5gssWbLI,1063
73
+ librelane/scripts/magic/gds/extras_mag.tcl,sha256=hOmFK12wmGiA_H70YS0jVK4Faav-1sTCpajUxjTsopM,1317
74
+ librelane/scripts/magic/gds/mag_with_pointers.tcl,sha256=mfYTQdio1XAA0DpWlV5JS7c3rkxtSS06kZqVfDfKGuQ,1056
74
75
  librelane/scripts/magic/get_bbox.tcl,sha256=iC0D5Pw09ZiNxHyy70Z0_axlc7eIT_jVGmvlutM8z_4,377
75
- librelane/scripts/magic/lef/extras_maglef.tcl,sha256=PsLCHxLslS3UxspmYf_vniL4Jzq54nZTa2AB5F90i58,1594
76
- librelane/scripts/magic/lef/maglef.tcl,sha256=MyCuqqR9zhKaC7OAVU2iCFIMkSZxl4hyc5bsEVnBG2k,863
76
+ librelane/scripts/magic/lef/extras_maglef.tcl,sha256=V0TivPN4aLJ0is497IAmOB1qQm8vmCqqycKuwV3w0HY,1586
77
+ librelane/scripts/magic/lef/maglef.tcl,sha256=I6-xFtsCZQtQI4UbU53gaWrpELWUd4agNF5LLgq9Eq0,856
77
78
  librelane/scripts/magic/lef.tcl,sha256=Ij_v63siQrgYh56juCiZMcJBBCl2Lco3Ah4YKg-xiAU,2076
78
79
  librelane/scripts/magic/open.tcl,sha256=qgk3HiT4qI-pMWn2E2MxwijgveCVmt6oCd8wEWh0jio,915
79
- librelane/scripts/magic/wrapper.tcl,sha256=rBeBSExykheFx7MTejjnX_OKROnWeDYNE5ciCAQvueU,704
80
+ librelane/scripts/magic/wrapper.tcl,sha256=qO33N2AiEYBTABMB5vWMWWEd2FpyOhg8JlcGsBVD6MY,712
80
81
  librelane/scripts/netgen/setup.tcl,sha256=LBkdtVZpxrNGQ8UNwMkEQ-xSrkn9DNIBW_jzB9b1gYk,979
81
82
  librelane/scripts/odbpy/apply_def_template.py,sha256=Tn6y65biu0bAQ6XilYxq5jn3a_KqjTl423-aXWI864k,1534
82
83
  librelane/scripts/odbpy/cell_frequency.py,sha256=NfGgM8wxIvjM1C_GHUghZPOh8gpdasLOWR4qBdHHLFE,3105
@@ -94,9 +95,9 @@ librelane/scripts/odbpy/ioplace_parser/parse.py,sha256=L2GXzNA-gkjyySZcTWXrRRP8r
94
95
  librelane/scripts/odbpy/label_macro_pins.py,sha256=n3o9-_g6HkVP8k49yNnCkQJms9f_ykCE0Rye7bVFtIk,8620
95
96
  librelane/scripts/odbpy/lefutil.py,sha256=XhfWSGHdn96yZWYQAPisgJM0iuY3xw4SW7jmMTzbpZs,3064
96
97
  librelane/scripts/odbpy/placers.py,sha256=mgy_-GYeLDPMG41YAopMTtJyCHP6ucJRk7cJzI9PLRQ,4572
97
- librelane/scripts/odbpy/power_utils.py,sha256=al12uMiv8G0yQZOPKXNHYQ1dm2KGlu9xigSuYLEAo_A,14627
98
+ librelane/scripts/odbpy/power_utils.py,sha256=qbwhvW0QRiqtFXpYNGyfDIrhNZv9dt0JX2n4CQ8YRs8,14722
98
99
  librelane/scripts/odbpy/random_place.py,sha256=TEsV4LtXQTP8OJvnBh09Siu9fKkwG9UpIkCkQpdXAgU,1649
99
- librelane/scripts/odbpy/reader.py,sha256=5-hpG3TgmKwJtnbEDQoAPejeDx1QyRBRbIMULMkBesM,8539
100
+ librelane/scripts/odbpy/reader.py,sha256=omOCANavm7khGq3AvDyJX00IvhDn_15cW64IU-u2dRQ,8540
100
101
  librelane/scripts/odbpy/remove_buffers.py,sha256=f-kGZIPnMtu4gnl2r2CDkng8U8vUMJKJWNV_akOpc38,5460
101
102
  librelane/scripts/odbpy/snap_to_grid.py,sha256=lULRWlcYXvrTBUpemUPlpO2dBnbFeriuG-DlI4KnViE,1743
102
103
  librelane/scripts/odbpy/wire_lengths.py,sha256=pSPhVnLlvcvmgEh89G8nu8DRaZVP66r-4ieVoV3zrm4,2737
@@ -145,25 +146,25 @@ librelane/scripts/tclsh/hello.tcl,sha256=kkR3akY7QnGHYXsQODYwLkMkUEOgWcNFtzaMTTE
145
146
  librelane/state/__init__.py,sha256=rLUdAkeB278r8pB2Jpv-ccmmmP32FR90wANIFHXdA0w,969
146
147
  librelane/state/__main__.py,sha256=Ici4Ejg1ICUZNSYZRguC3BfEk_wFxsmE0ag0Vv8iY1I,1679
147
148
  librelane/state/design_format.py,sha256=ISl4O18ky1BiMkQn8Si0Tcf8UA5vrlZ1yay0iKPxvfk,5794
148
- librelane/state/state.py,sha256=J05gAeSVDiF76ITuw4WJZ7WkMyG4oTjt_7kpsI3E3PE,11957
149
+ librelane/state/state.py,sha256=-vg7pYJ7U7uzC26oDKM49H410fm2-kV03Hf0bg3dMus,12149
149
150
  librelane/steps/__init__.py,sha256=j3JYrdnWM74dYuEvE931oSrQI7FUz-hKWr8Mts8C0wg,1668
150
- librelane/steps/__main__.py,sha256=GviXtDLISKJCufKxK3oFPOSMF1GyShZbG5RXpVCYFkk,13376
151
+ librelane/steps/__main__.py,sha256=GQZiV4s-9GIF4AwP34W61zwgzMvPp-QTR4cNELi7r5c,13349
151
152
  librelane/steps/checker.py,sha256=vul1D0cT03144qKK5QAKswClKKICK7kNB4PB6xXykvc,21353
152
153
  librelane/steps/common_variables.py,sha256=qT0VeIstFsDbe8VGAyqXrXxQw69OZ08haM6u1IbdFiE,10429
153
154
  librelane/steps/cvc_rv.py,sha256=32vxFIbzSbrDtE0fXvdoQ-v3LVMrfi3r88f8Y-TKPKg,5531
154
155
  librelane/steps/klayout.py,sha256=g7jYz-1cLwgfPTiMJIdAQ9zmkrwNtJLPoRg6PqOUv6Y,16490
155
- librelane/steps/magic.py,sha256=4o_WarBAQdTTuekP72uovjvqW5wsaDCpMB3LtAhC_IY,20051
156
+ librelane/steps/magic.py,sha256=60Ko7sf_E3KNO18op_pyojrBdfej0v5NCexXxmI0X90,20716
156
157
  librelane/steps/misc.py,sha256=Xk_a6JJPljkk8pemu-NtlzDRs-8S7vuRKZKj4pnCRlE,5690
157
158
  librelane/steps/netgen.py,sha256=R9sDWv-9wKMdi2rkuLQdOc4uLlbYhXcKKd6WsZsnLt0,8953
158
- librelane/steps/odb.py,sha256=_WhAFEVbFioSGsVrGbXQVqcXYAnE22gLA4eF1v028EQ,38030
159
- librelane/steps/openroad.py,sha256=8YLMPq22ceG3TVRGghafuCD5a7DxwLtSSuPu4_7thPs,86513
159
+ librelane/steps/odb.py,sha256=WaYquQfdp0j5XSbDa7a_un0HF4bOprpuC6fFtKpHHI8,37956
160
+ librelane/steps/openroad.py,sha256=XJ8D8pvKLToTR83uTWAeszNu30BDGewntBQ8uttXGeU,86458
160
161
  librelane/steps/openroad_alerts.py,sha256=IJyB4piBDCKXhkJswHGMYCRDwbdQsR0GZlrGGDhmW6Q,3364
161
162
  librelane/steps/pyosys.py,sha256=mnbPR267XzJvDhtXW4cdTAB3IqvksUZt4ch5xQHgdY0,22705
162
163
  librelane/steps/step.py,sha256=M0Jqvr8sQaYmvXApZ-tfa4SFVOb-l_2ZfR31QaoRUf0,55742
163
164
  librelane/steps/tclstep.py,sha256=0PMWJ6C3dKnlQf9mA9rZntgxUBCiByE9csHcEcM1iq0,10027
164
165
  librelane/steps/verilator.py,sha256=MWx2TpLqYyea9_jSeLG9c2S5ujvYERQZRFNaMhfHxZE,7916
165
166
  librelane/steps/yosys.py,sha256=GX6rTiQG-ZhDxfB9SxrPQ9Sab3WC84p0OUtqiL1Nubk,12533
166
- librelane-2.4.0.dev11.dist-info/METADATA,sha256=HoIVhU-nvqiJnv8Y3d0RnZl_h68Eni-7i_o1X0JS9fU,6561
167
- librelane-2.4.0.dev11.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
168
- librelane-2.4.0.dev11.dist-info/entry_points.txt,sha256=GTBvXykNMMFsNKiJFgtEw7P1wb_VZIqVM35EFSpyZQE,263
169
- librelane-2.4.0.dev11.dist-info/RECORD,,
167
+ librelane-2.4.1.dist-info/METADATA,sha256=1MqDGeycFJQRU52dJbjGPx_9nDJG_zZW-BrjunZQmIM,6557
168
+ librelane-2.4.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
169
+ librelane-2.4.1.dist-info/entry_points.txt,sha256=0eZs2NOH-w-W_GVRCs-ualst26XplkPpJkOnGWMaFw0,306
170
+ librelane-2.4.1.dist-info/RECORD,,
@@ -2,6 +2,7 @@
2
2
  librelane=librelane.__main__:cli
3
3
  librelane.config=librelane.config.__main__:cli
4
4
  librelane.env_info=librelane:env_info_cli
5
+ librelane.help=librelane.help.__main__:cli
5
6
  librelane.state=librelane.state.__main__:cli
6
7
  librelane.steps=librelane.steps.__main__:cli
7
8
  openlane=librelane.__main__:cli