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.
- librelane/common/metrics/__main__.py +4 -3
- librelane/config/flow.py +2 -2
- librelane/config/variable.py +1 -1
- librelane/flows/cli.py +15 -12
- librelane/flows/flow.py +10 -5
- librelane/scripts/magic/drc.tcl +7 -0
- librelane/scripts/openroad/common/io.tcl +11 -0
- librelane/scripts/openroad/common/pdn_cfg.tcl +73 -14
- librelane/scripts/openroad/ioplacer.tcl +6 -0
- librelane/scripts/openroad/sta/check_macro_instances.tcl +1 -1
- librelane/scripts/pyosys/synthesize.py +33 -7
- librelane/scripts/pyosys/ys_common.py +10 -1
- librelane/steps/common_variables.py +45 -1
- librelane/steps/magic.py +14 -1
- librelane/steps/openroad.py +7 -1
- librelane/steps/pyosys.py +22 -1
- librelane/steps/step.py +3 -1
- librelane/steps/verilator.py +37 -8
- {librelane-3.0.0.dev38.dist-info → librelane-3.0.0.dev40.dist-info}/METADATA +16 -16
- {librelane-3.0.0.dev38.dist-info → librelane-3.0.0.dev40.dist-info}/RECORD +22 -22
- {librelane-3.0.0.dev38.dist-info → librelane-3.0.0.dev40.dist-info}/WHEEL +1 -1
- {librelane-3.0.0.dev38.dist-info → librelane-3.0.0.dev40.dist-info}/entry_points.txt +0 -1
|
@@ -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
|
|
362
|
-
fileobj=bio,
|
|
363
|
-
|
|
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
|
|
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
|
|
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/config/variable.py
CHANGED
|
@@ -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
|
|
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
|
|
229
|
+
* ``config_override_strings`` ‡: ``Optional[Iterable[str]]``
|
|
227
230
|
* Sequential flow controls (if parameter ``sequential_flow_controls`` is ``True``)
|
|
228
|
-
* ``frm
|
|
229
|
-
* ``to
|
|
230
|
-
* ``skip
|
|
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
|
|
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
|
|
235
|
-
* ``last_run
|
|
236
|
-
* ``with_initial_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
|
|
239
|
-
* ``pdk_root
|
|
240
|
-
* ``pdk
|
|
241
|
-
* ``scl
|
|
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
|
|
917
|
-
|
|
918
|
-
|
|
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
|
|
1003
|
-
|
|
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]]] = {}
|
librelane/scripts/magic/drc.tcl
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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 "
|
|
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
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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",
|
|
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")
|
librelane/steps/openroad.py
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
librelane/steps/verilator.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");
|
|
@@ -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
|
-
|
|
153
|
-
|
|
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
|
-
|
|
156
|
-
|
|
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
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: librelane
|
|
3
|
-
Version: 3.0.0.
|
|
3
|
+
Version: 3.0.0.dev40
|
|
4
4
|
Summary: An infrastructure for implementing chip design flows
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
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.
|
|
23
|
-
Requires-Dist: libparse (
|
|
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
|
|
30
|
-
Requires-Dist: yamlcore (>=0.0.2,<0.0
|
|
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.
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
46
|
-
librelane/flows/flow.py,sha256=
|
|
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=
|
|
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=
|
|
112
|
-
librelane/scripts/openroad/common/pdn_cfg.tcl,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
147
|
-
librelane/scripts/pyosys/ys_common.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
163
|
+
librelane/steps/openroad.py,sha256=Mma0nPoEJ6JdYmZF24Uju21RL332wN9FH8GeOgMj9Qk,100890
|
|
164
164
|
librelane/steps/openroad_alerts.py,sha256=IJyB4piBDCKXhkJswHGMYCRDwbdQsR0GZlrGGDhmW6Q,3364
|
|
165
|
-
librelane/steps/pyosys.py,sha256=
|
|
166
|
-
librelane/steps/step.py,sha256=
|
|
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=
|
|
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.
|
|
171
|
-
librelane-3.0.0.
|
|
172
|
-
librelane-3.0.0.
|
|
173
|
-
librelane-3.0.0.
|
|
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,,
|