librelane 2.4.3__tar.gz → 2.4.4__tar.gz
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-2.4.3 → librelane-2.4.4}/PKG-INFO +1 -1
- {librelane-2.4.3 → librelane-2.4.4}/librelane/__init__.py +1 -1
- {librelane-2.4.3 → librelane-2.4.4}/librelane/__main__.py +4 -1
- {librelane-2.4.3 → librelane-2.4.4}/librelane/common/tcl.py +2 -1
- {librelane-2.4.3 → librelane-2.4.4}/librelane/container.py +7 -4
- librelane-2.4.4/librelane/examples/hold_eco_demo/config.yaml +18 -0
- librelane-2.4.4/librelane/examples/hold_eco_demo/demo.v +27 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/eco_buffer.py +2 -1
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/eco_diode.py +2 -1
- {librelane-2.4.3 → librelane-2.4.4}/librelane/steps/__main__.py +3 -2
- {librelane-2.4.3 → librelane-2.4.4}/librelane/steps/checker.py +7 -8
- {librelane-2.4.3 → librelane-2.4.4}/librelane/steps/klayout.py +9 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/steps/misc.py +5 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/steps/odb.py +32 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/steps/openroad.py +0 -10
- {librelane-2.4.3 → librelane-2.4.4}/librelane/steps/pyosys.py +6 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/steps/yosys.py +9 -1
- {librelane-2.4.3 → librelane-2.4.4}/pyproject.toml +7 -1
- {librelane-2.4.3 → librelane-2.4.4}/Readme.md +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/__version__.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/common/__init__.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/common/cli.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/common/drc.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/common/generic_dict.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/common/metrics/__init__.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/common/metrics/__main__.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/common/metrics/library.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/common/metrics/metric.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/common/metrics/util.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/common/misc.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/common/ring_buffer.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/common/toolbox.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/common/tpe.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/common/types.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/config/__init__.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/config/__main__.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/config/config.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/config/flow.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/config/pdk_compat.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/config/preprocessor.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/config/removals.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/config/variable.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/env_info.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/examples/spm/config.yaml +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/examples/spm/pin_order.cfg +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/examples/spm/src/impl.sdc +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/examples/spm/src/signoff.sdc +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/examples/spm/src/spm.v +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/examples/spm/verify/spm_tb.v +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/examples/spm-user_project_wrapper/config.json +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/flows/__init__.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/flows/builtins.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/flows/classic.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/flows/cli.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/flows/flow.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/flows/misc.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/flows/optimizing.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/flows/sequential.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/flows/synth_explore.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/help/__main__.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/logging/__init__.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/logging/logger.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/open_pdks_rev +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/plugins.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/py.typed +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/base.sdc +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/klayout/Readme.md +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/klayout/open_design.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/klayout/render.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/klayout/stream_out.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/klayout/xor.drc +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/magic/Readme.md +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/magic/common/read.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/magic/def/antenna_check.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/magic/def/mag.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/magic/def/mag_gds.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/magic/drc.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/magic/extract_spice.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/magic/gds/drc_batch.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/magic/gds/erase_box.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/magic/gds/extras_mag.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/magic/gds/mag_with_pointers.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/magic/get_bbox.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/magic/lef/extras_maglef.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/magic/lef/maglef.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/magic/lef.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/magic/open.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/magic/wrapper.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/netgen/setup.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/apply_def_template.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/cell_frequency.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/check_antenna_properties.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/contextualize.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/defutil.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/diodes.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/io_place.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/ioplace_parser/__init__.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/ioplace_parser/parse.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/lefutil.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/placers.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/power_utils.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/random_place.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/reader.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/remove_buffers.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/odbpy/wire_lengths.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/antenna_check.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/basic_mp.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/buffer_list.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/common/dpl.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/common/grt.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/common/io.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/common/pdn_cfg.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/common/resizer.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/common/set_global_connections.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/common/set_power_nets.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/common/set_rc.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/cts.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/cut_rows.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/dpl.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/drt.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/fill.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/floorplan.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/gpl.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/grt.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/gui.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/insert_buffer.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/ioplacer.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/irdrop.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/pdn.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/rcx.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/repair_design.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/repair_design_postgrt.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/rsz_timing_postcts.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/sta/check_macro_instances.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/sta/corner.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/tapcell.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/write_views.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/pyosys/json_header.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/pyosys/synthesize.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/pyosys/ys_common.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/tclsh/hello.tcl +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/state/__init__.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/state/__main__.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/state/design_format.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/state/state.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/steps/__init__.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/steps/common_variables.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/steps/cvc_rv.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/steps/magic.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/steps/netgen.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/steps/openroad_alerts.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/steps/step.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/steps/tclstep.py +0 -0
- {librelane-2.4.3 → librelane-2.4.4}/librelane/steps/verilator.py +0 -0
|
@@ -220,7 +220,10 @@ def print_version(ctx: click.Context, param: click.Parameter, value: bool):
|
|
|
220
220
|
if len(discovered_plugins) > 0:
|
|
221
221
|
print("Discovered plugins:")
|
|
222
222
|
for name, module in discovered_plugins.items():
|
|
223
|
-
|
|
223
|
+
if hasattr(module, "__version__"):
|
|
224
|
+
print(f"{name} -> {module.__version__}")
|
|
225
|
+
else:
|
|
226
|
+
print(f"{name}")
|
|
224
227
|
|
|
225
228
|
ctx.exit(0)
|
|
226
229
|
|
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
import re
|
|
15
|
-
import tkinter
|
|
16
15
|
from typing import Dict, Mapping, Any, Iterable
|
|
17
16
|
|
|
18
17
|
_env_rx = re.compile(r"(?:\:\:)?env\((\w+)\)")
|
|
@@ -55,6 +54,8 @@ class TclUtils(object):
|
|
|
55
54
|
|
|
56
55
|
@staticmethod
|
|
57
56
|
def _eval_env(env_in: Mapping[str, Any], tcl_in: str) -> Dict[str, Any]:
|
|
57
|
+
import tkinter
|
|
58
|
+
|
|
58
59
|
interpreter = tkinter.Tcl()
|
|
59
60
|
|
|
60
61
|
interpreter.eval("array unset ::env")
|
|
@@ -57,10 +57,13 @@ def gui_args(osinfo: OSInfo) -> List[str]:
|
|
|
57
57
|
args += [
|
|
58
58
|
"-e",
|
|
59
59
|
f"DISPLAY={os.environ.get('DISPLAY')}",
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
"-v",
|
|
63
|
-
|
|
60
|
+
]
|
|
61
|
+
if os.path.isdir("/tmp/.X11-unix"):
|
|
62
|
+
args += ["-v", "/tmp/.X11-unix:/tmp/.X11-unix"]
|
|
63
|
+
homedir = os.path.expanduser("~")
|
|
64
|
+
if os.path.isfile(f"{homedir}/.Xauthority"):
|
|
65
|
+
args += ["-v", f"{homedir}/.Xauthority:/.Xauthority"]
|
|
66
|
+
args += [
|
|
64
67
|
"--network",
|
|
65
68
|
"host",
|
|
66
69
|
"--security-opt",
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
DESIGN_NAME: hold_violation
|
|
2
|
+
CLOCK_PORT: clk
|
|
3
|
+
CLOCK_PERIOD: 5
|
|
4
|
+
VERILOG_FILES: dir::demo.v
|
|
5
|
+
RUN_POST_CTS_RESIZER_TIMING: false
|
|
6
|
+
RUN_POST_GRT_RESIZER_TIMING: false
|
|
7
|
+
FP_SIZING: absolute
|
|
8
|
+
DIE_AREA: [0, 0, 100, 100]
|
|
9
|
+
INSERT_ECO_BUFFERS:
|
|
10
|
+
- target: u_ff1/Q
|
|
11
|
+
buffer: sky130_fd_sc_hd__buf_1
|
|
12
|
+
- target: u_ff1/Q
|
|
13
|
+
buffer: sky130_fd_sc_hd__buf_1
|
|
14
|
+
meta:
|
|
15
|
+
flow: Classic
|
|
16
|
+
substituting_steps:
|
|
17
|
+
"+OpenROAD.DetailedRouting": "Odb.InsertECOBuffers"
|
|
18
|
+
"+Odb.InsertECOBuffers": "OpenROAD.DetailedRouting"
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module hold_violation(
|
|
2
|
+
input clk,
|
|
3
|
+
input d,
|
|
4
|
+
output q
|
|
5
|
+
);
|
|
6
|
+
wire intermediate;
|
|
7
|
+
wire clk_delayed;
|
|
8
|
+
|
|
9
|
+
sky130_fd_sc_hd__clkbuf_4 dly (
|
|
10
|
+
.A(clk),
|
|
11
|
+
.X(clk_delayed)
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
sky130_fd_sc_hd__dfrtp_4 u_ff1 (
|
|
15
|
+
.CLK(clk),
|
|
16
|
+
.D(d),
|
|
17
|
+
.RESET_B(1'b1),
|
|
18
|
+
.Q(intermediate)
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
sky130_fd_sc_hd__dfrtp_1 u_ff2 (
|
|
22
|
+
.CLK(clk_delayed),
|
|
23
|
+
.D(intermediate),
|
|
24
|
+
.RESET_B(1'b1),
|
|
25
|
+
.Q(q)
|
|
26
|
+
);
|
|
27
|
+
endmodule
|
|
@@ -43,7 +43,8 @@ def cli(reader):
|
|
|
43
43
|
grt_inc = GRT.IncrementalGRoute(grt, reader.block)
|
|
44
44
|
i = 0
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
eco_buffers = reader.config["INSERT_ECO_BUFFERS"] or []
|
|
47
|
+
for target_info in eco_buffers:
|
|
47
48
|
target_name, target_pin = target_info["target"].split("/")
|
|
48
49
|
name_escaped = reader.escape_verilog_name(target_name)
|
|
49
50
|
buffer_master = target_info["buffer"]
|
|
@@ -38,7 +38,8 @@ def cli(reader):
|
|
|
38
38
|
# print(grt)
|
|
39
39
|
grt_inc = GRT.IncrementalGRoute(grt, reader.block)
|
|
40
40
|
i = 0
|
|
41
|
-
|
|
41
|
+
diodes = reader.config["INSERT_ECO_DIODES"] or []
|
|
42
|
+
for target_info in diodes:
|
|
42
43
|
target_name, target_pin = target_info["target"].split("/")
|
|
43
44
|
name_escaped = reader.escape_verilog_name(target_name)
|
|
44
45
|
|
|
@@ -47,8 +47,9 @@ def load_step_from_inputs(
|
|
|
47
47
|
if Found := Step.factory.get(id):
|
|
48
48
|
Target = Found
|
|
49
49
|
else:
|
|
50
|
-
err(
|
|
51
|
-
|
|
50
|
+
err(f"No step registered with id '{id}'.")
|
|
51
|
+
info(
|
|
52
|
+
f"If the step '{id}' is part of a plugin, make sure the plugin's parent directory is in the PYTHONPATH environment variable."
|
|
52
53
|
)
|
|
53
54
|
ctx.exit(-1)
|
|
54
55
|
|
|
@@ -79,22 +79,21 @@ class MetricChecker(Step):
|
|
|
79
79
|
deferred: ClassVar[bool] = True
|
|
80
80
|
error_on_var: Optional[Variable] = None
|
|
81
81
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
threshold_string = Self.get_threshold_description(None)
|
|
82
|
+
def __init_subclass__(cls):
|
|
83
|
+
threshold_string = cls.get_threshold_description(None)
|
|
85
84
|
if threshold_string is None:
|
|
86
|
-
threshold_string = str(
|
|
85
|
+
threshold_string = str(cls.get_threshold(None))
|
|
87
86
|
dynamic_docstring = "Raises"
|
|
88
|
-
if
|
|
87
|
+
if cls.deferred:
|
|
89
88
|
dynamic_docstring += " a deferred error"
|
|
90
89
|
else:
|
|
91
90
|
dynamic_docstring += " an immediate error"
|
|
92
|
-
dynamic_docstring += f" if {
|
|
91
|
+
dynamic_docstring += f" if {cls.metric_description} (metric: ``{cls.metric_name}``) are >= {threshold_string}."
|
|
93
92
|
dynamic_docstring += (
|
|
94
93
|
" Doesn't raise an error depending on error_on_var if defined."
|
|
95
94
|
)
|
|
96
|
-
|
|
97
|
-
return super().
|
|
95
|
+
cls.__doc__ = dynamic_docstring
|
|
96
|
+
return super().__init_subclass__()
|
|
98
97
|
|
|
99
98
|
def get_threshold(self: Optional["MetricChecker"]) -> Optional[Decimal]:
|
|
100
99
|
return Decimal(0)
|
|
@@ -327,6 +327,15 @@ class XOR(KLayoutStep):
|
|
|
327
327
|
|
|
328
328
|
@Step.factory.register()
|
|
329
329
|
class DRC(KLayoutStep):
|
|
330
|
+
"""
|
|
331
|
+
Runs DRC using KLayout.
|
|
332
|
+
|
|
333
|
+
Unlike most steps, the KLayout scripts vary quite wildly by PDK. If a PDK
|
|
334
|
+
is not supported by this step, it will simply be skipped.
|
|
335
|
+
|
|
336
|
+
Currently, only sky130A and sky130B are supported.
|
|
337
|
+
"""
|
|
338
|
+
|
|
330
339
|
id = "KLayout.DRC"
|
|
331
340
|
name = "Design Rule Check (KLayout)"
|
|
332
341
|
|
|
@@ -53,6 +53,11 @@ class LoadBaseSDC(Step):
|
|
|
53
53
|
|
|
54
54
|
@Step.factory.register()
|
|
55
55
|
class ReportManufacturability(Step):
|
|
56
|
+
"""
|
|
57
|
+
Logs a simple "manufacturability report", i.e., the status of DRC, LVS, and
|
|
58
|
+
antenna violations.
|
|
59
|
+
"""
|
|
60
|
+
|
|
56
61
|
id = "Misc.ReportManufacturability"
|
|
57
62
|
name = "Report Manufacturability"
|
|
58
63
|
long_name = "Report Manufacturability (DRC, LVS, Antenna)"
|
|
@@ -176,6 +176,10 @@ class OdbpyStep(Step):
|
|
|
176
176
|
|
|
177
177
|
@Step.factory.register()
|
|
178
178
|
class CheckMacroAntennaProperties(OdbpyStep):
|
|
179
|
+
"""
|
|
180
|
+
Prints warnings if the LEF views of macros are missing antenna information.
|
|
181
|
+
"""
|
|
182
|
+
|
|
179
183
|
id = "Odb.CheckMacroAntennaProperties"
|
|
180
184
|
name = "Check Antenna Properties of Macros Pins in Their LEF Views"
|
|
181
185
|
inputs = OdbpyStep.inputs
|
|
@@ -213,6 +217,10 @@ class CheckMacroAntennaProperties(OdbpyStep):
|
|
|
213
217
|
|
|
214
218
|
@Step.factory.register()
|
|
215
219
|
class CheckDesignAntennaProperties(CheckMacroAntennaProperties):
|
|
220
|
+
"""
|
|
221
|
+
Prints warnings if the LEF view of the design is missing antenna information.
|
|
222
|
+
"""
|
|
223
|
+
|
|
216
224
|
id = "Odb.CheckDesignAntennaProperties"
|
|
217
225
|
name = "Check Antenna Properties of Pins in The Generated Design LEF view"
|
|
218
226
|
inputs = CheckMacroAntennaProperties.inputs + [DesignFormat.LEF]
|
|
@@ -519,6 +527,11 @@ class ReportDisconnectedPins(OdbpyStep):
|
|
|
519
527
|
|
|
520
528
|
@Step.factory.register()
|
|
521
529
|
class AddRoutingObstructions(OdbpyStep):
|
|
530
|
+
"""
|
|
531
|
+
Adds obstructions on metal layers which prevent shapes from being created in
|
|
532
|
+
the designated areas.
|
|
533
|
+
"""
|
|
534
|
+
|
|
522
535
|
id = "Odb.AddRoutingObstructions"
|
|
523
536
|
name = "Add Obstructions"
|
|
524
537
|
config_vars = [
|
|
@@ -561,6 +574,11 @@ class AddRoutingObstructions(OdbpyStep):
|
|
|
561
574
|
|
|
562
575
|
@Step.factory.register()
|
|
563
576
|
class RemoveRoutingObstructions(AddRoutingObstructions):
|
|
577
|
+
"""
|
|
578
|
+
Removes any routing obstructions previously placed by
|
|
579
|
+
<#Odb.AddRoutingObstructions>`_.
|
|
580
|
+
"""
|
|
581
|
+
|
|
564
582
|
id = "Odb.RemoveRoutingObstructions"
|
|
565
583
|
name = "Remove Obstructions"
|
|
566
584
|
|
|
@@ -570,6 +588,15 @@ class RemoveRoutingObstructions(AddRoutingObstructions):
|
|
|
570
588
|
|
|
571
589
|
@Step.factory.register()
|
|
572
590
|
class AddPDNObstructions(AddRoutingObstructions):
|
|
591
|
+
"""
|
|
592
|
+
Adds obstructions on metal layers which prevent shapes from being created in
|
|
593
|
+
the designated areas.
|
|
594
|
+
|
|
595
|
+
A soft-duplicate of <#Odb.AddRoutingObstructions>`_ , though this one uses
|
|
596
|
+
a different variable name so the obstructions can be restricted for PDN
|
|
597
|
+
steps only.
|
|
598
|
+
"""
|
|
599
|
+
|
|
573
600
|
id = "Odb.AddPDNObstructions"
|
|
574
601
|
name = "Add PDN obstructions"
|
|
575
602
|
|
|
@@ -587,6 +614,11 @@ class AddPDNObstructions(AddRoutingObstructions):
|
|
|
587
614
|
|
|
588
615
|
@Step.factory.register()
|
|
589
616
|
class RemovePDNObstructions(RemoveRoutingObstructions):
|
|
617
|
+
"""
|
|
618
|
+
Removes any PDN obstructions previously placed by
|
|
619
|
+
<#Odb.RemovePDNObstructions>`_.
|
|
620
|
+
"""
|
|
621
|
+
|
|
590
622
|
id = "Odb.RemovePDNObstructions"
|
|
591
623
|
name = "Remove PDN obstructions"
|
|
592
624
|
|
|
@@ -1051,11 +1051,6 @@ class IOPlacement(OpenROADStep):
|
|
|
1051
1051
|
Optional[Path],
|
|
1052
1052
|
"Path to a custom pin configuration file.",
|
|
1053
1053
|
),
|
|
1054
|
-
Variable(
|
|
1055
|
-
"FP_DEF_TEMPLATE",
|
|
1056
|
-
Optional[Path],
|
|
1057
|
-
"Points to the DEF file to be used as a template.",
|
|
1058
|
-
),
|
|
1059
1054
|
Variable(
|
|
1060
1055
|
"FP_IO_VLENGTH",
|
|
1061
1056
|
Optional[Decimal],
|
|
@@ -1327,11 +1322,6 @@ class GlobalPlacementSkipIO(_GlobalPlacement):
|
|
|
1327
1322
|
default="matching",
|
|
1328
1323
|
deprecated_names=[("FP_IO_MODE", _migrate_ppl_mode)],
|
|
1329
1324
|
),
|
|
1330
|
-
Variable(
|
|
1331
|
-
"FP_DEF_TEMPLATE",
|
|
1332
|
-
Optional[Path],
|
|
1333
|
-
"Points to the DEF file to be used as a template.",
|
|
1334
|
-
),
|
|
1335
1325
|
]
|
|
1336
1326
|
|
|
1337
1327
|
def run(self, state_in: State, **kwargs) -> Tuple[ViewsUpdate, MetricsUpdate]:
|
|
@@ -302,6 +302,12 @@ class VerilogStep(PyosysStep):
|
|
|
302
302
|
|
|
303
303
|
@Step.factory.register()
|
|
304
304
|
class JsonHeader(VerilogStep):
|
|
305
|
+
"""
|
|
306
|
+
Extracts a high-level hierarchical view of the circuit in JSON format,
|
|
307
|
+
including power connections. The power connections are used in later steps
|
|
308
|
+
to ensure macros and cells are connected as desired.
|
|
309
|
+
"""
|
|
310
|
+
|
|
305
311
|
id = "Yosys.JsonHeader"
|
|
306
312
|
name = "Generate JSON Header"
|
|
307
313
|
long_name = "Generate JSON Header"
|
|
@@ -248,6 +248,14 @@ class YosysStep(TclStep):
|
|
|
248
248
|
|
|
249
249
|
@Step.factory.register()
|
|
250
250
|
class EQY(Step):
|
|
251
|
+
"""
|
|
252
|
+
Experimental: Uses the `EQY <https://github.com/yosyshq/eqy>`_ utility to
|
|
253
|
+
perform an RTL vs. Netlist equivalence check.
|
|
254
|
+
|
|
255
|
+
Currently, you are expected to provide your own EQY script if you want this
|
|
256
|
+
to work properly.
|
|
257
|
+
"""
|
|
258
|
+
|
|
251
259
|
id = "Yosys.EQY"
|
|
252
260
|
name = "Equivalence Check"
|
|
253
261
|
long_name = "RTL/Netlist Equivalence Check"
|
|
@@ -262,7 +270,7 @@ class EQY(Step):
|
|
|
262
270
|
Variable(
|
|
263
271
|
"EQY_SCRIPT",
|
|
264
272
|
Optional[Path],
|
|
265
|
-
"
|
|
273
|
+
"The EQY script to use. If unset, a generic EQY script will be generated, but this fails in a number of scenarios.",
|
|
266
274
|
),
|
|
267
275
|
Variable(
|
|
268
276
|
"MACRO_PLACEMENT_CFG",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "librelane"
|
|
3
|
-
version = "2.4.
|
|
3
|
+
version = "2.4.4"
|
|
4
4
|
description = "An infrastructure for implementing chip design flows"
|
|
5
5
|
# Technically, maintainer. We cannot use the maintainers field until
|
|
6
6
|
# poetry-core>=2.0.0 which requires Python version 3.9+. This field does
|
|
@@ -68,6 +68,12 @@ librelane = "librelane.__main__:cli"
|
|
|
68
68
|
"librelane.help" = "librelane.help.__main__:cli"
|
|
69
69
|
"librelane.env_info" = "librelane:env_info_cli"
|
|
70
70
|
|
|
71
|
+
[tool.ruff]
|
|
72
|
+
# syntax-only check, make sure files are parseable under py38
|
|
73
|
+
# $ ruff check .
|
|
74
|
+
target-version = "py38"
|
|
75
|
+
lint.ignore = ["E", "F"]
|
|
76
|
+
|
|
71
77
|
[build-system]
|
|
72
78
|
requires = ["poetry-core>=1.0.0"]
|
|
73
79
|
build-backend = "poetry.core.masonry.api"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-2.4.3 → librelane-2.4.4}/librelane/examples/spm-user_project_wrapper/SPM_example.v
RENAMED
|
File without changes
|
{librelane-2.4.3 → librelane-2.4.4}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc
RENAMED
|
File without changes
|
{librelane-2.4.3 → librelane-2.4.4}/librelane/examples/spm-user_project_wrapper/config-tut.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-2.4.3 → librelane-2.4.4}/librelane/examples/spm-user_project_wrapper/template.def
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/common/set_global_connections.tcl
RENAMED
|
File without changes
|
{librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/common/set_layer_adjustments.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/common/set_routing_layers.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-2.4.3 → librelane-2.4.4}/librelane/scripts/openroad/sta/check_macro_instances.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|