librelane 3.0.0.dev26__py3-none-any.whl → 3.0.0.dev27__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/tcl.py +42 -0
- librelane/config/flow.py +12 -0
- librelane/scripts/magic/extract_spice.tcl +1 -1
- librelane/scripts/openroad/write_cdl.tcl +23 -0
- librelane/state/design_format.py +7 -0
- librelane/steps/cvc_rv.py +1 -8
- librelane/steps/klayout.py +193 -1
- librelane/steps/openroad.py +14 -0
- {librelane-3.0.0.dev26.dist-info → librelane-3.0.0.dev27.dist-info}/METADATA +1 -1
- {librelane-3.0.0.dev26.dist-info → librelane-3.0.0.dev27.dist-info}/RECORD +12 -11
- {librelane-3.0.0.dev26.dist-info → librelane-3.0.0.dev27.dist-info}/WHEEL +0 -0
- {librelane-3.0.0.dev26.dist-info → librelane-3.0.0.dev27.dist-info}/entry_points.txt +0 -0
librelane/common/tcl.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");
|
|
@@ -68,12 +72,50 @@ class TclUtils(object):
|
|
|
68
72
|
if value is not None:
|
|
69
73
|
env_out[match.group(1)] = value
|
|
70
74
|
|
|
75
|
+
def py_dict(command, target=None, *args):
|
|
76
|
+
if command == "set":
|
|
77
|
+
if match := _env_rx.fullmatch(target):
|
|
78
|
+
|
|
79
|
+
if len(args) > 1:
|
|
80
|
+
value = args[-1]
|
|
81
|
+
keys = args[:-1]
|
|
82
|
+
|
|
83
|
+
# Create new dict if it does not exist
|
|
84
|
+
if not match.group(1) in env_out:
|
|
85
|
+
env_out[match.group(1)] = {}
|
|
86
|
+
|
|
87
|
+
# set ::env(...) [dict create]
|
|
88
|
+
# will create an empty string ""
|
|
89
|
+
# convert into an empty dictionary
|
|
90
|
+
if env_out[match.group(1)] == "":
|
|
91
|
+
env_out[match.group(1)] = {}
|
|
92
|
+
|
|
93
|
+
# Set key value pair
|
|
94
|
+
cur_dict = env_out[match.group(1)]
|
|
95
|
+
|
|
96
|
+
# Create all nested dicts
|
|
97
|
+
for key in keys[:-1]:
|
|
98
|
+
if key in cur_dict:
|
|
99
|
+
cur_dict = cur_dict[key]
|
|
100
|
+
else:
|
|
101
|
+
cur_dict[key] = {}
|
|
102
|
+
cur_dict = cur_dict[key]
|
|
103
|
+
|
|
104
|
+
# Finally set the value
|
|
105
|
+
cur_dict[keys[-1]] = value
|
|
106
|
+
|
|
71
107
|
py_set_name = interpreter.register(py_set)
|
|
108
|
+
py_dict_name = interpreter.register(py_dict)
|
|
72
109
|
interpreter.call("rename", py_set_name, "_py_set")
|
|
73
110
|
interpreter.call("rename", "set", "_orig_set")
|
|
111
|
+
interpreter.call("rename", py_dict_name, "_py_dict")
|
|
112
|
+
interpreter.call("rename", "dict", "_orig_dict")
|
|
74
113
|
interpreter.eval(
|
|
75
114
|
"proc set args { _py_set {*}$args; tailcall _orig_set {*}$args; }"
|
|
76
115
|
)
|
|
116
|
+
interpreter.eval(
|
|
117
|
+
"proc dict args { _py_dict {*}$args; tailcall _orig_dict {*}$args; }"
|
|
118
|
+
)
|
|
77
119
|
|
|
78
120
|
interpreter.eval(tcl_in)
|
|
79
121
|
|
librelane/config/flow.py
CHANGED
|
@@ -195,6 +195,13 @@ scl_variables = [
|
|
|
195
195
|
"Path(s) to cells' SPICE model(s)",
|
|
196
196
|
pdk=True,
|
|
197
197
|
),
|
|
198
|
+
Variable(
|
|
199
|
+
"CELL_CDLS",
|
|
200
|
+
Optional[List[Path]],
|
|
201
|
+
description="A circuit-design language view of the standard cell library.",
|
|
202
|
+
pdk=True,
|
|
203
|
+
deprecated_names=["STD_CELL_LIBRARY_CDL"],
|
|
204
|
+
),
|
|
198
205
|
Variable(
|
|
199
206
|
"SYNTH_EXCLUDED_CELL_FILE",
|
|
200
207
|
Path,
|
|
@@ -424,6 +431,11 @@ option_variables = [
|
|
|
424
431
|
Optional[List[Path]],
|
|
425
432
|
"Specifies miscellaneous SPICE models to be loaded indiscriminately whenever SPICE models are loaded.",
|
|
426
433
|
),
|
|
434
|
+
Variable(
|
|
435
|
+
"EXTRA_CDLS",
|
|
436
|
+
Optional[List[Path]],
|
|
437
|
+
"Specifies miscellaneous CDL netlists to be loaded indiscriminately whenever CDL netlists are loaded.",
|
|
438
|
+
),
|
|
427
439
|
Variable(
|
|
428
440
|
"EXTRA_LIBS",
|
|
429
441
|
Optional[List[Path]],
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
set f [open $::env(STEP_DIR)/cif_scale.txt "w"]
|
|
15
|
-
puts $f
|
|
15
|
+
puts $f [expr {((round([magic::cif scale output] * 10000)) / 10000.0) * 1}]
|
|
16
16
|
close $f
|
|
17
17
|
|
|
18
18
|
if { $::env(MAGIC_EXT_USE_GDS) } {
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Write CDL netlist of the current design
|
|
3
|
+
#
|
|
4
|
+
|
|
5
|
+
# Load design database
|
|
6
|
+
source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
|
|
7
|
+
read_current_odb
|
|
8
|
+
|
|
9
|
+
# Collect masters CDL
|
|
10
|
+
set masters {}
|
|
11
|
+
|
|
12
|
+
foreach cdl $::env(CELL_CDLS) {
|
|
13
|
+
lappend masters $cdl
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if { [info exist ::env(EXTRA_CDLS)] } {
|
|
17
|
+
foreach cdl $::env(EXTRA_CDLS) {
|
|
18
|
+
lappend masters $cdl
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
# Write only the CDL
|
|
23
|
+
write_cdl -include_fillers -masters "$masters" $::env(STEP_DIR)/$::env(DESIGN_NAME).cdl
|
librelane/state/design_format.py
CHANGED
librelane/steps/cvc_rv.py
CHANGED
|
@@ -16,7 +16,7 @@ import re
|
|
|
16
16
|
import json
|
|
17
17
|
from enum import Enum
|
|
18
18
|
from io import StringIO, TextIOWrapper
|
|
19
|
-
from typing import
|
|
19
|
+
from typing import Optional, Tuple
|
|
20
20
|
|
|
21
21
|
from .step import StepException, ViewsUpdate, MetricsUpdate, Step
|
|
22
22
|
from ..common import Path
|
|
@@ -124,13 +124,6 @@ class ERC(Step):
|
|
|
124
124
|
description="",
|
|
125
125
|
pdk=True,
|
|
126
126
|
),
|
|
127
|
-
Variable(
|
|
128
|
-
"CELL_CDLS",
|
|
129
|
-
List[Path],
|
|
130
|
-
description="A circuit-design language view of the standard cell library.",
|
|
131
|
-
pdk=True,
|
|
132
|
-
deprecated_names=["STD_CELL_LIBRARY_CDL"],
|
|
133
|
-
),
|
|
134
127
|
]
|
|
135
128
|
|
|
136
129
|
def run(self, state_in: State, **kwargs) -> Tuple[ViewsUpdate, MetricsUpdate]:
|
librelane/steps/klayout.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");
|
|
@@ -19,6 +23,7 @@ import shutil
|
|
|
19
23
|
import subprocess
|
|
20
24
|
from os.path import abspath
|
|
21
25
|
from base64 import b64encode
|
|
26
|
+
from tempfile import NamedTemporaryFile
|
|
22
27
|
from typing import Any, Dict, Optional, List, Sequence, Tuple, Union
|
|
23
28
|
|
|
24
29
|
from .step import ViewsUpdate, MetricsUpdate, Step, StepError, StepException
|
|
@@ -431,10 +436,77 @@ class DRC(KLayoutStep):
|
|
|
431
436
|
)
|
|
432
437
|
return subprocess_result["generated_metrics"]
|
|
433
438
|
|
|
439
|
+
def run_ihp_sg13g2(self, state_in: State, **kwargs) -> MetricsUpdate:
|
|
440
|
+
kwargs, env = self.extract_env(kwargs)
|
|
441
|
+
|
|
442
|
+
drc_script_path = self.config["KLAYOUT_DRC_RUNSET"]
|
|
443
|
+
|
|
444
|
+
reports_dir = os.path.join(self.step_dir, "reports")
|
|
445
|
+
mkdirp(reports_dir)
|
|
446
|
+
xml_report = os.path.join(reports_dir, "drc_violations.klayout.xml")
|
|
447
|
+
json_report = os.path.join(reports_dir, "drc_violations.klayout.json")
|
|
448
|
+
|
|
449
|
+
input_view = state_in[DesignFormat.GDS]
|
|
450
|
+
assert isinstance(input_view, Path)
|
|
451
|
+
|
|
452
|
+
opts = []
|
|
453
|
+
for k, v in self.config["KLAYOUT_DRC_OPTIONS"].items():
|
|
454
|
+
opts.extend(
|
|
455
|
+
[
|
|
456
|
+
"-rd",
|
|
457
|
+
f"{k}={v}",
|
|
458
|
+
]
|
|
459
|
+
)
|
|
460
|
+
|
|
461
|
+
threads = self.config["KLAYOUT_DRC_THREADS"] or str(_get_process_limit())
|
|
462
|
+
if threads != "1":
|
|
463
|
+
opts.extend(
|
|
464
|
+
[
|
|
465
|
+
"-rd",
|
|
466
|
+
f"threads={threads}",
|
|
467
|
+
]
|
|
468
|
+
)
|
|
469
|
+
|
|
470
|
+
info(f"Running KLayout DRC with {threads} threads…")
|
|
471
|
+
|
|
472
|
+
# Not pya script - DRC script is not part of OpenLane
|
|
473
|
+
self.run_subprocess(
|
|
474
|
+
[
|
|
475
|
+
"klayout",
|
|
476
|
+
"-b",
|
|
477
|
+
"-zz",
|
|
478
|
+
"-r",
|
|
479
|
+
drc_script_path,
|
|
480
|
+
"-rd",
|
|
481
|
+
f"in_gds={abspath(input_view)}",
|
|
482
|
+
"-rd",
|
|
483
|
+
f"report_file={abspath(xml_report)}",
|
|
484
|
+
*opts,
|
|
485
|
+
]
|
|
486
|
+
)
|
|
487
|
+
|
|
488
|
+
subprocess_result = self.run_pya_script(
|
|
489
|
+
[
|
|
490
|
+
"python3",
|
|
491
|
+
os.path.join(
|
|
492
|
+
get_script_dir(),
|
|
493
|
+
"klayout",
|
|
494
|
+
"xml_drc_report_to_json.py",
|
|
495
|
+
),
|
|
496
|
+
f"--xml-file={abspath(xml_report)}",
|
|
497
|
+
f"--json-file={abspath(json_report)}",
|
|
498
|
+
],
|
|
499
|
+
env=env,
|
|
500
|
+
log_to=os.path.join(self.step_dir, "xml_drc_report_to_json.log"),
|
|
501
|
+
)
|
|
502
|
+
return subprocess_result["generated_metrics"]
|
|
503
|
+
|
|
434
504
|
def run(self, state_in: State, **kwargs) -> Tuple[ViewsUpdate, MetricsUpdate]:
|
|
435
505
|
metrics_updates: MetricsUpdate = {}
|
|
436
506
|
if self.config["PDK"] in ["sky130A", "sky130B"]:
|
|
437
507
|
metrics_updates = self.run_sky130(state_in, **kwargs)
|
|
508
|
+
elif self.config["PDK"] in ["ihp-sg13g2"]:
|
|
509
|
+
metrics_updates = self.run_ihp_sg13g2(state_in, **kwargs)
|
|
438
510
|
else:
|
|
439
511
|
self.warn(
|
|
440
512
|
f"KLayout DRC is not supported for the {self.config['PDK']} PDK. This step will be skipped."
|
|
@@ -443,6 +515,126 @@ class DRC(KLayoutStep):
|
|
|
443
515
|
return {}, metrics_updates
|
|
444
516
|
|
|
445
517
|
|
|
518
|
+
@Step.factory.register()
|
|
519
|
+
class LVS(KLayoutStep):
|
|
520
|
+
id = "KLayout.LVS"
|
|
521
|
+
name = "Layout Versus Schematic (KLayout)"
|
|
522
|
+
|
|
523
|
+
inputs = [
|
|
524
|
+
DesignFormat.CDL,
|
|
525
|
+
DesignFormat.GDS,
|
|
526
|
+
]
|
|
527
|
+
outputs = [DesignFormat.SPICE]
|
|
528
|
+
|
|
529
|
+
config_vars = KLayoutStep.config_vars + [
|
|
530
|
+
Variable(
|
|
531
|
+
"KLAYOUT_LVS_SCRIPT",
|
|
532
|
+
Optional[Path],
|
|
533
|
+
"A path to KLayout LVS script.",
|
|
534
|
+
pdk=True,
|
|
535
|
+
),
|
|
536
|
+
Variable(
|
|
537
|
+
"KLAYOUT_LVS_OPTIONS",
|
|
538
|
+
Optional[Dict[str, Union[bool, int, str]]],
|
|
539
|
+
"Options passed directly to the KLayout LVS script. They vary from one PDK to another.",
|
|
540
|
+
pdk=True,
|
|
541
|
+
),
|
|
542
|
+
]
|
|
543
|
+
|
|
544
|
+
def run_ihp_sg13g2(
|
|
545
|
+
self, state_in: State, **kwargs
|
|
546
|
+
) -> Tuple[ViewsUpdate, MetricsUpdate]:
|
|
547
|
+
kwargs, env = self.extract_env(kwargs)
|
|
548
|
+
|
|
549
|
+
lvs_script_path = self.config["KLAYOUT_LVS_SCRIPT"]
|
|
550
|
+
|
|
551
|
+
reports_dir = os.path.join(self.step_dir, "reports")
|
|
552
|
+
mkdirp(reports_dir)
|
|
553
|
+
lvsdb_report = os.path.join(reports_dir, "lvs.klayout.lvsdb")
|
|
554
|
+
|
|
555
|
+
input_view_gds = state_in[DesignFormat.GDS]
|
|
556
|
+
input_view_cdl = state_in[DesignFormat.CDL]
|
|
557
|
+
assert isinstance(input_view_gds, Path)
|
|
558
|
+
assert isinstance(input_view_cdl, Path)
|
|
559
|
+
|
|
560
|
+
output_spice = os.path.join(
|
|
561
|
+
self.step_dir,
|
|
562
|
+
f"{self.config['DESIGN_NAME']}.{DesignFormat.SPICE.value.extension}",
|
|
563
|
+
)
|
|
564
|
+
|
|
565
|
+
with NamedTemporaryFile("w") as f:
|
|
566
|
+
# Merge all CDL inputs
|
|
567
|
+
cdl_lst = [input_view_cdl]
|
|
568
|
+
cdl_lst.extend(self.config["CELL_CDLS"] or [])
|
|
569
|
+
cdl_lst.extend(self.config["EXTRA_CDLS"] or [])
|
|
570
|
+
|
|
571
|
+
for fn in cdl_lst:
|
|
572
|
+
with open(fn, "r") as cdl_fh:
|
|
573
|
+
f.write(cdl_fh.read())
|
|
574
|
+
|
|
575
|
+
opts = []
|
|
576
|
+
for k, v in self.config["KLAYOUT_LVS_OPTIONS"].items():
|
|
577
|
+
opts.extend(
|
|
578
|
+
[
|
|
579
|
+
"-rd",
|
|
580
|
+
f"{k}={v}",
|
|
581
|
+
]
|
|
582
|
+
)
|
|
583
|
+
|
|
584
|
+
# Not pya script - LVS script is not part of LibreLane
|
|
585
|
+
subprocess_result = self.run_subprocess(
|
|
586
|
+
[
|
|
587
|
+
"klayout",
|
|
588
|
+
"-b",
|
|
589
|
+
"-zz",
|
|
590
|
+
"-r",
|
|
591
|
+
lvs_script_path,
|
|
592
|
+
"-rd",
|
|
593
|
+
f"input={abspath(input_view_gds)}",
|
|
594
|
+
"-rd",
|
|
595
|
+
f"schematic={abspath(f.name)}",
|
|
596
|
+
"-rd",
|
|
597
|
+
f"report={abspath(lvsdb_report)}",
|
|
598
|
+
"-rd",
|
|
599
|
+
f"target_netlist={abspath(output_spice)}",
|
|
600
|
+
]
|
|
601
|
+
+ opts,
|
|
602
|
+
env=env,
|
|
603
|
+
)
|
|
604
|
+
|
|
605
|
+
with open(subprocess_result["log_path"]) as fh:
|
|
606
|
+
for line in fh:
|
|
607
|
+
if "INFO : Congratulations! Netlists match" in line:
|
|
608
|
+
ok = True
|
|
609
|
+
break
|
|
610
|
+
elif "ERROR : Netlists don't match" in line:
|
|
611
|
+
ok = False
|
|
612
|
+
break
|
|
613
|
+
else:
|
|
614
|
+
ok = False
|
|
615
|
+
|
|
616
|
+
views_updates: ViewsUpdate = {
|
|
617
|
+
DesignFormat.SPICE: Path(output_spice),
|
|
618
|
+
}
|
|
619
|
+
metrics_updates: MetricsUpdate = {
|
|
620
|
+
"design__lvs_error__count": 0 if ok else 1,
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
return views_updates, metrics_updates
|
|
624
|
+
|
|
625
|
+
def run(self, state_in: State, **kwargs) -> Tuple[ViewsUpdate, MetricsUpdate]:
|
|
626
|
+
metrics_updates: MetricsUpdate = {}
|
|
627
|
+
views_updates: ViewsUpdate = {}
|
|
628
|
+
if self.config["PDK"] in ["ihp-sg13g2"]:
|
|
629
|
+
views_updates, metrics_updates = self.run_ihp_sg13g2(state_in, **kwargs)
|
|
630
|
+
else:
|
|
631
|
+
self.warn(
|
|
632
|
+
f"KLayout LVS is not supported for the {self.config['PDK']} PDK. This step will be skipped."
|
|
633
|
+
)
|
|
634
|
+
|
|
635
|
+
return views_updates, metrics_updates
|
|
636
|
+
|
|
637
|
+
|
|
446
638
|
@Step.factory.register()
|
|
447
639
|
class OpenGUI(KLayoutStep):
|
|
448
640
|
"""
|
|
@@ -480,7 +672,7 @@ class OpenGUI(KLayoutStep):
|
|
|
480
672
|
|
|
481
673
|
layout = state_in[DesignFormat.DEF]
|
|
482
674
|
if self.config["KLAYOUT_GUI_USE_GDS"]:
|
|
483
|
-
if gds := state_in
|
|
675
|
+
if gds := state_in.get(DesignFormat.GDS):
|
|
484
676
|
layout = gds
|
|
485
677
|
assert isinstance(layout, Path)
|
|
486
678
|
|
librelane/steps/openroad.py
CHANGED
|
@@ -2188,6 +2188,20 @@ class WriteViews(OpenROADStep):
|
|
|
2188
2188
|
return os.path.join(get_script_dir(), "openroad", "write_views.tcl")
|
|
2189
2189
|
|
|
2190
2190
|
|
|
2191
|
+
@Step.factory.register()
|
|
2192
|
+
class WriteCDL(OpenROADStep):
|
|
2193
|
+
"""
|
|
2194
|
+
Write CDL view of an ODB design
|
|
2195
|
+
"""
|
|
2196
|
+
|
|
2197
|
+
id = "OpenROAD.WriteCDL"
|
|
2198
|
+
name = "Write CDL"
|
|
2199
|
+
outputs = [DesignFormat.CDL]
|
|
2200
|
+
|
|
2201
|
+
def get_script_path(self):
|
|
2202
|
+
return os.path.join(get_script_dir(), "openroad", "write_cdl.tcl")
|
|
2203
|
+
|
|
2204
|
+
|
|
2191
2205
|
# Resizer Steps
|
|
2192
2206
|
|
|
2193
2207
|
|
|
@@ -12,14 +12,14 @@ 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=2zj62QbSuYaD2iYqGnM7vFR3ga41E3TxZpOOBYYIka8,13257
|
|
14
14
|
librelane/common/ring_buffer.py,sha256=DGFen9y0JOmiL7E27tmzDTVSJKZtV-waF9hl5Rz9uek,1898
|
|
15
|
-
librelane/common/tcl.py,sha256=
|
|
15
|
+
librelane/common/tcl.py,sha256=AfTxbSLA0VUXVMMwoAQndyQTcEZQoQfMa4FFizZiEgU,4341
|
|
16
16
|
librelane/common/toolbox.py,sha256=ijR__rVqQ_nJtfm34H-VdSCIeArKns7lVAc1TcTUSsQ,20975
|
|
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
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=DLB1h3UX_0cWgJblAmCSrsWL6dV0SEx0mz4ohIsV2uo,16892
|
|
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
|
|
@@ -66,7 +66,7 @@ librelane/scripts/magic/def/antenna_check.tcl,sha256=T_r1CWgySFVlLMcoTrNXQ_aMRs_
|
|
|
66
66
|
librelane/scripts/magic/def/mag.tcl,sha256=PuL3MH6pmZP5Qh2cJ0GygWNzaYjdCSCoAbOli-JB4fs,707
|
|
67
67
|
librelane/scripts/magic/def/mag_gds.tcl,sha256=fwtQR9zPZpWqVmmLb-1hzY4WMCr4gbA3S0pTZsS9sss,2144
|
|
68
68
|
librelane/scripts/magic/drc.tcl,sha256=gPGyI96lR10dJXcJACajzHaHiT6ayAYPJqrmmuQkABc,2395
|
|
69
|
-
librelane/scripts/magic/extract_spice.tcl,sha256
|
|
69
|
+
librelane/scripts/magic/extract_spice.tcl,sha256=-jDxVEGddch1YZLZXW1vFXhdLkeTjxk0d8eU1tBMBWc,2788
|
|
70
70
|
librelane/scripts/magic/gds/drc_batch.tcl,sha256=O76rwxSrQgoCuoxk36tRBZkQaeMfJknlHrQA3mtU2JU,2198
|
|
71
71
|
librelane/scripts/magic/gds/erase_box.tcl,sha256=wsVSwMlkZFJa_MEGNsdXLnXFvjZlrl_lzIWkJjcDBgg,929
|
|
72
72
|
librelane/scripts/magic/gds/extras_mag.tcl,sha256=1raG0URUezUDEKkdDeJqdlS0Y5gb4IzQFnjFysHHlmU,1304
|
|
@@ -138,6 +138,7 @@ librelane/scripts/openroad/sta/check_macro_instances.tcl,sha256=j8DlW1wkVk5bLbG7
|
|
|
138
138
|
librelane/scripts/openroad/sta/corner.tcl,sha256=0YAzHFGbs4zRsB5E7e8zdzFyLuzrpV1w_S2BgrLfqak,15235
|
|
139
139
|
librelane/scripts/openroad/tapcell.tcl,sha256=4Ouy5U-_ct5Cfy3vuLQudWL0c1xWF_auLsr9rYh6dP4,1177
|
|
140
140
|
librelane/scripts/openroad/ungpl.tcl,sha256=vhHxou1W3VROwJePoQzmWn0h0d5lQrrt1vofyt-Woek,761
|
|
141
|
+
librelane/scripts/openroad/write_cdl.tcl,sha256=uPO1IROPTr5NrW0-VZA8tXQD8aseGeXDXDsU8TX-9nQ,460
|
|
141
142
|
librelane/scripts/openroad/write_views.tcl,sha256=-MxTJsB4EF7l5trDaZe-VBFjhfzqRt8F5_DZrADTs0U,892
|
|
142
143
|
librelane/scripts/pyosys/construct_abc_script.py,sha256=3CCDz5ZTEPpWLco-OvikTmn361-BNitqjQE_-5zHm14,6733
|
|
143
144
|
librelane/scripts/pyosys/json_header.py,sha256=C1BmKFRbwMknXV_RVp5QGbAxCwU6ElE6UIGRZceHQpI,2315
|
|
@@ -146,26 +147,26 @@ librelane/scripts/pyosys/ys_common.py,sha256=t5LLEYoy4cfCIeEaAo8Nr51rXtlI8ZPe1h_
|
|
|
146
147
|
librelane/scripts/tclsh/hello.tcl,sha256=kkR3akY7QnGHYXsQODYwLkMkUEOgWcNFtzaMTTEV2bY,34
|
|
147
148
|
librelane/state/__init__.py,sha256=DZ_RyKMr2oj4p5d32u8MmDKfCxR7OEdDw-1HWKTpatA,949
|
|
148
149
|
librelane/state/__main__.py,sha256=Ici4Ejg1ICUZNSYZRguC3BfEk_wFxsmE0ag0Vv8iY1I,1679
|
|
149
|
-
librelane/state/design_format.py,sha256=
|
|
150
|
+
librelane/state/design_format.py,sha256=v1Nj-glM3Nc6SVXMZKanAMiaBjgDnW8KjAlmr_TiOqk,6560
|
|
150
151
|
librelane/state/state.py,sha256=tYn2si8NlkVErOSWKfVhsgrMpyxeX2Hv9EAPsQBWx2c,11902
|
|
151
152
|
librelane/steps/__init__.py,sha256=j3JYrdnWM74dYuEvE931oSrQI7FUz-hKWr8Mts8C0wg,1668
|
|
152
153
|
librelane/steps/__main__.py,sha256=GQZiV4s-9GIF4AwP34W61zwgzMvPp-QTR4cNELi7r5c,13349
|
|
153
154
|
librelane/steps/checker.py,sha256=HD5YFPAbHQKsFmBDrIAbo_0clZcCszNhIXb4lHaNIeQ,21629
|
|
154
155
|
librelane/steps/common_variables.py,sha256=eih2eA1m0FpL8ydF5WWattwh_SxtzI55eb8gggJtBuY,12494
|
|
155
|
-
librelane/steps/cvc_rv.py,sha256=
|
|
156
|
-
librelane/steps/klayout.py,sha256=
|
|
156
|
+
librelane/steps/cvc_rv.py,sha256=qeroQPjidSAMYSp3nJNiQBYt8V73kkz3JK97uioo7J8,5294
|
|
157
|
+
librelane/steps/klayout.py,sha256=oHLb1gbKUSqEX9ofDcABHlrpuRYtGAUjuYTkzw7NGnU,22785
|
|
157
158
|
librelane/steps/magic.py,sha256=m4cZH2VomJs0RudtV8avSaZVqRj1NP7Pm2P6qo2z2X0,20919
|
|
158
159
|
librelane/steps/misc.py,sha256=8ubCvFeFEspXrgnzNWINY5-TXTyalNtlvcX8TSw0qdg,5685
|
|
159
160
|
librelane/steps/netgen.py,sha256=R9sDWv-9wKMdi2rkuLQdOc4uLlbYhXcKKd6WsZsnLt0,8953
|
|
160
161
|
librelane/steps/odb.py,sha256=-zsXi0jVdtfBfAJI0OC4x1jI_B2OX5YVn4uAn6NyFdk,38424
|
|
161
|
-
librelane/steps/openroad.py,sha256=
|
|
162
|
+
librelane/steps/openroad.py,sha256=hgpqsVQi7tFRlj75zefQkD3Vdmq21ubZAFWyU12WxUg,99586
|
|
162
163
|
librelane/steps/openroad_alerts.py,sha256=IJyB4piBDCKXhkJswHGMYCRDwbdQsR0GZlrGGDhmW6Q,3364
|
|
163
164
|
librelane/steps/pyosys.py,sha256=LY7qqxkhjfoyBBR7vdkm7ylabbxMJDwIoYm7mAUbLVY,23348
|
|
164
165
|
librelane/steps/step.py,sha256=THIxZkhtkNYt1iRgMduD0ywrOTCaV7cCfUB2EqXN6-k,55751
|
|
165
166
|
librelane/steps/tclstep.py,sha256=8-zpYOo562E86nm7f4DiTqUsLKY0AFtEJgrp9CnWWDw,10083
|
|
166
167
|
librelane/steps/verilator.py,sha256=MWx2TpLqYyea9_jSeLG9c2S5ujvYERQZRFNaMhfHxZE,7916
|
|
167
168
|
librelane/steps/yosys.py,sha256=uC72fb1yFXyIxrtcRu5DxxR3hadG19SlGh668yjhWHc,12694
|
|
168
|
-
librelane-3.0.0.
|
|
169
|
-
librelane-3.0.0.
|
|
170
|
-
librelane-3.0.0.
|
|
171
|
-
librelane-3.0.0.
|
|
169
|
+
librelane-3.0.0.dev27.dist-info/METADATA,sha256=ZwojMc8UwfZmZy2TaBKKoXJUHtoy9ODA6cvoBewu5Vo,6561
|
|
170
|
+
librelane-3.0.0.dev27.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
171
|
+
librelane-3.0.0.dev27.dist-info/entry_points.txt,sha256=GTBvXykNMMFsNKiJFgtEw7P1wb_VZIqVM35EFSpyZQE,263
|
|
172
|
+
librelane-3.0.0.dev27.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|