librelane 2.4.0.dev0__py3-none-any.whl → 2.4.0.dev2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
librelane/__main__.py CHANGED
@@ -1,3 +1,7 @@
1
+ # Copyright 2025 The American University in Cairo
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");
@@ -202,7 +206,8 @@ def print_version(ctx: click.Context, param: click.Parameter, value: bool):
202
206
  f"""
203
207
  LibreLane v{__version__}
204
208
 
205
- Copyright ©2020-2023 Efabless Corporation and other contributors.
209
+ Copyright ©2020-2025 Efabless Corporation, The American University in
210
+ Cairo, and other contributors.
206
211
 
207
212
  Available under the Apache License, version 2. Included with the source code,
208
213
  but you can also get a copy at https://www.apache.org/licenses/LICENSE-2.0
@@ -102,7 +102,7 @@ class PassedDirectoryError(ValueError):
102
102
  def __init__(self, config: AnyPath) -> None:
103
103
  self.config = str(config)
104
104
  super().__init__(
105
- "Passing design directories as arguments is unsupported in LibreLane 2 or higher: please pass the configuration file(s) directly."
105
+ "Passing design directories as arguments is unsupported in LibreLane: please pass the configuration file(s) directly."
106
106
  )
107
107
 
108
108
 
@@ -960,7 +960,7 @@ class Config(GenericImmutableDict[str, Any]):
960
960
  pass
961
961
  if not isinstance(dis, int) or dis in [1, 2, 5] or dis > 6:
962
962
  errors.append(
963
- f"DIODE_INSERTION_STRATEGY '{dis}' is not available in LibreLane 2 or higher. See 'Migrating DIODE_INSERTION_STRATEGY' in the docs for more info."
963
+ f"DIODE_INSERTION_STRATEGY '{dis}' is not available in LibreLane 2.0 or higher. See 'Migrating DIODE_INSERTION_STRATEGY' in the docs for more info."
964
964
  )
965
965
  else:
966
966
  warnings.append(
librelane/container.py CHANGED
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- ## This file is internal to LibreLane 2 and is not part of the API.
15
+ ## This file is internal to LibreLane and is not part of the API.
16
16
  import os
17
17
  import re
18
18
  import uuid
librelane/env_info.py CHANGED
@@ -18,7 +18,7 @@
18
18
  # environment surveys. Please ensure all code as compatible as possible
19
19
  # with ancient versions of Python.
20
20
 
21
- ## This file is internal to LibreLane 2 and is not part of the API.
21
+ ## This file is internal to LibreLane and is not part of the API.
22
22
  import os
23
23
  import re
24
24
  import sys
@@ -30,11 +30,8 @@ from ..steps import (
30
30
  @Flow.factory.register()
31
31
  class Classic(SequentialFlow):
32
32
  """
33
- **Note: While LibreLane 2 has a stable release, the default flow is in beta
34
- pending silicon validation. Use at your own risk.**
35
-
36
33
  A flow of type :class:`librelane.flows.SequentialFlow` that is the most
37
- similar to the original LibreLane 1.0 flow, running the Verilog RTL through
34
+ similar to the original OpenLane flow, running the Verilog RTL through
38
35
  Yosys, OpenROAD, KLayout and Magic to produce a valid GDSII for simpler designs.
39
36
 
40
37
  This is the default when using LibreLane via the command-line.
@@ -23,7 +23,7 @@ from ..steps import Step, Yosys, OpenROAD, StepError
23
23
  from ..logging import get_log_level, set_log_level, LogLevels, success, info
24
24
 
25
25
 
26
- # "Optimizing" is a custom demo flow to show what's possible with non-sequential Flows in LibreLane 2+.
26
+ # "Optimizing" is a custom demo flow to show what's possible with non-sequential Flows in LibreLan
27
27
  # It works across two steps:
28
28
  # * The Synthesis Exploration - tries multiple synthesis strategies in *parallel*.
29
29
  # The best-performing strategy in terms of minimizing the area makes it to the next stage.
@@ -0,0 +1,23 @@
1
+ # Copyright 2025 The American University in Cairo
2
+ #
3
+ # Adapted from ioplace_parser
4
+ #
5
+ # Copyright 2020-2023 Efabless Corporation
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ """
19
+ This is a modified version of https://github.com/efabless/ioplace_parser that
20
+ does NOT use Antlr4 and instead uses a custom parser that is faster and
21
+ dependency-free.
22
+ """
23
+ from .parse import Side, Order, parse
@@ -0,0 +1,147 @@
1
+ # Copyright 2025 The American University in Cairo
2
+ #
3
+ # Adapted from ioplace_parser
4
+ #
5
+ # Copyright 2020-2023 Efabless Corporation
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ import re
19
+ from enum import IntEnum
20
+ from typing import Literal, Optional, Dict, List, Union
21
+ from decimal import Decimal
22
+ import warnings
23
+
24
+ from dataclasses import dataclass, field
25
+
26
+
27
+ class Order(IntEnum):
28
+ busMajor = 0
29
+ bitMajor = 1
30
+
31
+
32
+ @dataclass
33
+ class Side:
34
+ min_distance: Optional[Decimal] = None
35
+ reverse_result: bool = False
36
+ pins: List[Union[str, int]] = field(default_factory=list)
37
+ sort_mode: Optional[Order] = Order.busMajor
38
+
39
+
40
+ VALUE_ANNOTATIONS = ["min_distance"]
41
+ STANDALONE_ANNOTATIONS = [
42
+ "bus_major",
43
+ "bit_major",
44
+ ]
45
+
46
+
47
+ def parse(string: str) -> Dict[Literal["N", "E", "W", "S"], Side]:
48
+ """
49
+ Parses a pin configuration into a dictionary of the four cardinal sides.
50
+
51
+ :param string: The input configuration as a string (not a file path)
52
+ :returns: A dictionary where each cardinal direction points to a Side object.
53
+ :raises ValueError: On syntax or token recognition errors
54
+ """
55
+ sides = {}
56
+ current_side: Optional[Side] = None
57
+ global_sort_mode: Order = Order.busMajor
58
+ global_min_distance: Optional[Decimal] = None
59
+
60
+ string_mut = string
61
+
62
+ ws_rx = re.compile(r"^\s+")
63
+ annotation_rx = re.compile(r"^@\s*(\w+)(?:\s*=\s*([0-9]+(?:.[0-9]+)?))?")
64
+ direction_rx = re.compile(r"^#\s*([NEWS]R?|BUS_SORT)")
65
+ virtual_pin_rx = re.compile(r"^\$\s*([0-9]+)")
66
+ non_ws_rx = re.compile(r"^\S+")
67
+ while len(string_mut):
68
+ # annotation
69
+ if skip_match := ws_rx.search(string_mut):
70
+ string_mut = string_mut[skip_match.end() :]
71
+ elif anno_match := annotation_rx.search(string_mut):
72
+ annotation = anno_match[1]
73
+ if annotation in VALUE_ANNOTATIONS:
74
+ if anno_match[2] is None:
75
+ raise ValueError(f"Annotation {annotation} requires a value")
76
+ value = anno_match[2]
77
+ if annotation == "min_distance":
78
+ if current_side is None:
79
+ global_min_distance = Decimal(value)
80
+ else:
81
+ current_side.min_distance = Decimal(value)
82
+ elif annotation in STANDALONE_ANNOTATIONS:
83
+ if anno_match[2] is not None:
84
+ raise ValueError(
85
+ f"Annotation {annotation} cannot be assigned a value"
86
+ )
87
+ if annotation == "bus_major":
88
+ if current_side is None:
89
+ global_sort_mode = Order.busMajor
90
+ else:
91
+ current_side.sort_mode = Order.busMajor
92
+ elif annotation == "bit_major":
93
+ if current_side is None:
94
+ global_sort_mode = Order.bitMajor
95
+ else:
96
+ current_side.sort_mode = Order.bitMajor
97
+ else:
98
+ raise ValueError(f"Unknown annotation '{annotation}'")
99
+ string_mut = string_mut[anno_match.end() :]
100
+ elif dir_match := direction_rx.search(string_mut):
101
+ direction = dir_match[1]
102
+ if direction == "BUS_SORT":
103
+ warnings.warn(
104
+ "Specifying bit-major using the direction token ('#BUS_SORT') is deprecated: use @bit_major."
105
+ )
106
+ global_sort_mode = Order.bitMajor
107
+ else:
108
+ current_side = Side(
109
+ min_distance=global_min_distance,
110
+ reverse_result=len(direction) == 2,
111
+ sort_mode=global_sort_mode,
112
+ )
113
+ side: Literal["N", "E", "W", "S"] = direction[0] # type: ignore
114
+ sides[side] = current_side
115
+ string_mut = string_mut[dir_match.end() :]
116
+ elif vp_match := virtual_pin_rx.search(string_mut):
117
+ count = int(vp_match[1])
118
+ if current_side is None:
119
+ raise ValueError(
120
+ f"virtual pin declaration ${count} requires a direction to be set first"
121
+ )
122
+ current_side.pins.append(count)
123
+ string_mut = string_mut[vp_match.end() :]
124
+ elif nonws_match := non_ws_rx.match(string_mut):
125
+ # assume regex
126
+ if current_side is None:
127
+ raise ValueError(
128
+ f"identifier/regex '{nonws_match[0]}' requires a direction to be set first"
129
+ )
130
+ current_side.pins.append(nonws_match[0])
131
+ string_mut = string_mut[nonws_match.end() :]
132
+ else:
133
+ raise ValueError(
134
+ f"Syntax Error: Unexpected character starting at {string_mut[:10]}…"
135
+ )
136
+
137
+ all_sides: List[Literal["N", "E", "W", "S"]] = ["N", "E", "W", "S"]
138
+ for side in all_sides:
139
+ if side in sides:
140
+ continue
141
+ sides[side] = Side(
142
+ min_distance=global_min_distance,
143
+ reverse_result=False,
144
+ sort_mode=global_sort_mode,
145
+ )
146
+
147
+ return sides
@@ -418,7 +418,7 @@ def create_reproducible(
418
418
  * The current working directory
419
419
 
420
420
  These reproducibles are filesystem-independent, i.e. they can be run
421
- on any computer that has the appropriate version of LibreLane 2 installed
421
+ on any computer that has the appropriate version of LibreLane installed
422
422
  (as well as the underlying utility for that specific step.)
423
423
 
424
424
  The reproducible will report an error if LibreLane is not installed and will
@@ -1,7 +1,8 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.1
2
2
  Name: librelane
3
- Version: 2.4.0.dev0
3
+ Version: 2.4.0.dev2
4
4
  Summary: An infrastructure for implementing chip design flows
5
+ Home-page: https://github.com/librelane/librelane
5
6
  License: Apache-2.0
6
7
  Author: Mohamed Gaber
7
8
  Author-email: me@donn.website
@@ -19,8 +20,7 @@ Requires-Dist: click (>=8,<9)
19
20
  Requires-Dist: cloup (>=3.0.5,<4)
20
21
  Requires-Dist: deprecated (>=1.2.10,<2)
21
22
  Requires-Dist: httpx (>=0.22.0,<0.29)
22
- Requires-Dist: ioplace-parser (>=0.3.0,<0.5.0)
23
- Requires-Dist: klayout (>=0.29.0,<0.30.0)
23
+ Requires-Dist: klayout (>=0.29.0,<0.31.0)
24
24
  Requires-Dist: libparse (>=0.3.1,<1)
25
25
  Requires-Dist: lxml (>=4.9.0)
26
26
  Requires-Dist: psutil (>=5.9.0)
@@ -49,8 +49,10 @@ Description-Content-Type: text/markdown
49
49
 
50
50
  LibreLane is an ASIC infrastructure library based on several components including
51
51
  OpenROAD, Yosys, Magic, Netgen, CVC, KLayout and a number of custom scripts for
52
- design exploration and optimization, currently developed and maintained by the
53
- American University in Cairo Open Hardware Lab (AUCOHL.)
52
+ design exploration and optimization, currently developed and maintained by
53
+ members and affiliates of the
54
+ [American University in Cairo Open Hardware Lab](https://github.com/aucohl)
55
+ under the stewardship of the [FOSSi Foundation](https://fossi-foundation.org).
54
56
 
55
57
  A reference flow, "Classic", performs all ASIC implementation steps from RTL all
56
58
  the way down to GDSII.
@@ -142,10 +144,27 @@ If you use LibreLane in your research, please cite the following paper.
142
144
 
143
145
  ## License and Legal Info
144
146
 
145
- LibreLane is a trademark of the FOSSi Foundation.
147
+ LibreLane is a trademark of the [FOSSi Foundation](https://fossi-foundation.org).
146
148
 
149
+ LibreLane code and binaries are available under
147
150
  [The Apache License, version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt).
148
151
 
149
- LibreLane is based on OpenLane 2.0 by Efabless Corporation
150
- (https://github.com/efabless/openlane2) under the same license.
152
+ LibreLane is based on [OpenLane 2](https://github.com/efabless/openlane2)
153
+ by Efabless Corporation:
154
+
155
+ ```
156
+ Copyright 2022-2025 Efabless Corporation
157
+
158
+ Licensed under the Apache License, Version 2.0 (the "License");
159
+ you may not use this file except in compliance with the License.
160
+ You may obtain a copy of the License at
161
+
162
+ http://www.apache.org/licenses/LICENSE-2.0
163
+
164
+ Unless required by applicable law or agreed to in writing, software
165
+ distributed under the License is distributed on an "AS IS" BASIS,
166
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
167
+ See the License for the specific language governing permissions and
168
+ limitations under the License.
169
+ ```
151
170
 
@@ -1,5 +1,5 @@
1
1
  librelane/__init__.py,sha256=EMpoZrRmS_wsweKjhyAg52OXCK7HWQ8o8CVrYaX4ub0,1220
2
- librelane/__main__.py,sha256=fcJnSzIGqtQMK0jsr5o5bmdH0_i6eiInl6rUl0dZANM,14681
2
+ librelane/__main__.py,sha256=48sW8mh1MNbG0Mf75f5LekXzerbaEASLInQSrvQqPw4,14802
3
3
  librelane/__version__.py,sha256=dbE4stCACDmIoxgKksesAkTa-_hi5dW6nPLWw9Pfq3Q,1486
4
4
  librelane/common/__init__.py,sha256=LrzxjZKJu3-i8oEYdXtV1IxkXicHtoSUNRcOGrGVGsw,1516
5
5
  librelane/common/cli.py,sha256=Ob7mDR77qX1DZ7MXBQ4EPGS3dAO0o7b4njIloOxoB-Q,2351
@@ -18,14 +18,14 @@ librelane/common/tpe.py,sha256=Txj0fVscXSDJTYmEKZ2ESFHOeqrhHnaPPiwWBgyx4g8,1285
18
18
  librelane/common/types.py,sha256=oclAQkeluz_iopI_28clHzxvac7gN5moT8Rzipy5mgM,3468
19
19
  librelane/config/__init__.py,sha256=lbJmD5CbrrrnaNdIUWqFIK488ea0uyej3iExh-9mkgE,1107
20
20
  librelane/config/__main__.py,sha256=6KSXxM4qNE2yJhizUsF1kdMsY1kY7hLHoPoz50POsS8,4532
21
- librelane/config/config.py,sha256=79wDEleGg7Q6dRvbDiOcwN7b3usKUw0xBH3vQDblPHE,34974
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=NbR4h1Y8h4pFr6ZLUPVTUzpWB9nmlgbD-zb1Z2Ct-ww,26057
27
- librelane/container.py,sha256=nM3sZPlfuUdROn2kInv99bTKpeT9MMQvl4oGteAsmEU,7556
28
- librelane/env_info.py,sha256=p2IyhEILUgcM-zeZaWNHvOya7KPc8_WexVLhhGLoKzM,10462
27
+ librelane/container.py,sha256=3KHxs3dUSVUZVYsS6fsA7dD3Q4QEQEzRxgXZZh9dzi0,7554
28
+ librelane/env_info.py,sha256=vAE9AZ_vDFLt7Srtg4ZywPzE6vgVhCrIvg8PP25-BJ8,10460
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
@@ -41,11 +41,11 @@ librelane/examples/spm-user_project_wrapper/template.def,sha256=7kl9l-oh4BDKuFHh
41
41
  librelane/examples/spm-user_project_wrapper/user_project_wrapper.v,sha256=zc6GC583muuWtzw3p6v_B1k8j-Oo9WypuQf_8doA4uo,3364
42
42
  librelane/flows/__init__.py,sha256=ghtmUG-taVpHJ3CKJRYZGn3dU0r93araT1EIGlBEsxg,896
43
43
  librelane/flows/builtins.py,sha256=tR14Qc1ZUey2w-Ar4DWOvxuP7LGPtMecCJq8WgcYJpk,773
44
- librelane/flows/classic.py,sha256=MTyAJz5SVJq4S2NAHYbUjLxv0w3wPx1GD5HrkMoTh7w,11082
44
+ librelane/flows/classic.py,sha256=fI-LNhrvi7lzfsHRyJv_yjgFbpbWBVxN-9QpsgDxpTQ,10940
45
45
  librelane/flows/cli.py,sha256=P2LCFn5_RQ88yB0WuetpLAuWeKQXd-DrpCOMgnVh9Mg,16705
46
46
  librelane/flows/flow.py,sha256=wyYw-w6NIbCCfyfgwiq3BpztLlvZkRFUUeePoI9DpaU,34167
47
47
  librelane/flows/misc.py,sha256=32Om3isexesfKKiJZCajNmINc-xdv7eVx_tgoh9SR6U,2015
48
- librelane/flows/optimizing.py,sha256=oBzXOiZqOnLTaGi3YTs1cU72EKKO36dCCK-czkpywKU,6081
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
51
  librelane/logging/__init__.py,sha256=mrTnzjpH6AOu2CiDZYfOMCVByAS2Xeg9HS4FJyXsJOE,1043
@@ -88,6 +88,8 @@ librelane/scripts/odbpy/disconnected_pins.py,sha256=hS_Iletg7N6K6yN_ccvWxZ3nWNZp
88
88
  librelane/scripts/odbpy/exception_codes.py,sha256=VXReNio2d9uxU4cXL1PpRxWhhK2_OSs5DeCpVqTDYJE,648
89
89
  librelane/scripts/odbpy/filter_unannotated.py,sha256=Gvcaj_WNr6TPiHk-36nkMu4betNHZo1g2lD3UcA9hDQ,2950
90
90
  librelane/scripts/odbpy/io_place.py,sha256=LSJIJQDLSOpENyQOg_kVTIbh1AbYLiHIXx0siduo-lg,15589
91
+ librelane/scripts/odbpy/ioplace_parser/__init__.py,sha256=TMKTIWwGJfdSr7dJcsoisUuKlbTKJdHV6-0kB77v2P8,887
92
+ librelane/scripts/odbpy/ioplace_parser/parse.py,sha256=LDncc8r1nDmcTCVtxqBu7xswiesVX6-snYiIKFB_kxs,5594
91
93
  librelane/scripts/odbpy/label_macro_pins.py,sha256=n3o9-_g6HkVP8k49yNnCkQJms9f_ykCE0Rye7bVFtIk,8620
92
94
  librelane/scripts/odbpy/lefutil.py,sha256=XhfWSGHdn96yZWYQAPisgJM0iuY3xw4SW7jmMTzbpZs,3064
93
95
  librelane/scripts/odbpy/placers.py,sha256=mgy_-GYeLDPMG41YAopMTtJyCHP6ucJRk7cJzI9PLRQ,4572
@@ -144,7 +146,7 @@ librelane/state/__main__.py,sha256=Ici4Ejg1ICUZNSYZRguC3BfEk_wFxsmE0ag0Vv8iY1I,1
144
146
  librelane/state/design_format.py,sha256=9mWBbHrhzludtv3dKB6P4UQncBVTMMtoj69kNgRvh5o,5306
145
147
  librelane/state/state.py,sha256=J05gAeSVDiF76ITuw4WJZ7WkMyG4oTjt_7kpsI3E3PE,11957
146
148
  librelane/steps/__init__.py,sha256=8jTPCsrzJWjNctKUSXOjxYqqeMQjYkAKslcIXS3GDzg,1647
147
- librelane/steps/__main__.py,sha256=d5tajnx3fscBrDeZsCIySxCiImO0OD6aCCtu4j1qltE,13378
149
+ librelane/steps/__main__.py,sha256=GviXtDLISKJCufKxK3oFPOSMF1GyShZbG5RXpVCYFkk,13376
148
150
  librelane/steps/checker.py,sha256=vul1D0cT03144qKK5QAKswClKKICK7kNB4PB6xXykvc,21353
149
151
  librelane/steps/common_variables.py,sha256=qT0VeIstFsDbe8VGAyqXrXxQw69OZ08haM6u1IbdFiE,10429
150
152
  librelane/steps/cvc_rv.py,sha256=32vxFIbzSbrDtE0fXvdoQ-v3LVMrfi3r88f8Y-TKPKg,5531
@@ -160,7 +162,7 @@ librelane/steps/step.py,sha256=YkUWbxx2dOz0QR90jM5NC7neFkWO1RW5zJc0I_XxRyc,54975
160
162
  librelane/steps/tclstep.py,sha256=0PMWJ6C3dKnlQf9mA9rZntgxUBCiByE9csHcEcM1iq0,10027
161
163
  librelane/steps/verilator.py,sha256=MWx2TpLqYyea9_jSeLG9c2S5ujvYERQZRFNaMhfHxZE,7916
162
164
  librelane/steps/yosys.py,sha256=GX6rTiQG-ZhDxfB9SxrPQ9Sab3WC84p0OUtqiL1Nubk,12533
163
- librelane-2.4.0.dev0.dist-info/METADATA,sha256=WjPPsHVB6NankUUSViUO1KpbjVrpVHyel06ogwlr46w,5841
164
- librelane-2.4.0.dev0.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
165
- librelane-2.4.0.dev0.dist-info/entry_points.txt,sha256=GTBvXykNMMFsNKiJFgtEw7P1wb_VZIqVM35EFSpyZQE,263
166
- librelane-2.4.0.dev0.dist-info/RECORD,,
165
+ librelane-2.4.0.dev2.dist-info/METADATA,sha256=JlRl6zQcZGwcjn6ZgcLHZivozmfzMWx0EqDzvFvuY-g,6600
166
+ librelane-2.4.0.dev2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
167
+ librelane-2.4.0.dev2.dist-info/entry_points.txt,sha256=GTBvXykNMMFsNKiJFgtEw7P1wb_VZIqVM35EFSpyZQE,263
168
+ librelane-2.4.0.dev2.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.2
2
+ Generator: poetry-core 1.9.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any