librelane 3.1.0.dev3__tar.gz → 3.1.0.dev4__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.
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/PKG-INFO +3 -2
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/__init__.py +1 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/misc.py +27 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/toolbox.py +5 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/config/__init__.py +4 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/config/__main__.py +4 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/config/config.py +5 -1
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/config/flow.py +1 -1
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/config/pdk_compat.py +20 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/config/preprocessor.py +4 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/config/removals.py +4 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/config/variable.py +4 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/cli.py +20 -18
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/synth_explore.py +1 -0
- librelane-3.1.0.dev4/librelane/pdk_hashes.yaml +4 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/check_antenna_properties.py +1 -1
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/defutil.py +4 -1
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/io.tcl +23 -5
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/repair_design.tcl +3 -3
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/repair_design_postgrt.tcl +1 -4
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/pyosys/synthesize.py +36 -17
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/pyosys/ys_common.py +7 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/klayout.py +59 -27
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/openroad.py +21 -1
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/pyosys.py +65 -37
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/step.py +1 -1
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/verilator.py +1 -1
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/pyproject.toml +2 -2
- librelane-3.1.0.dev3/librelane/pdk_hashes.yaml +0 -3
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/Readme.md +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/__init__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/__main__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/__version__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/cli.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/drc.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/generic_dict.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/metrics/__init__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/metrics/__main__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/metrics/compare.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/metrics/library.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/metrics/metric.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/metrics/util.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/ring_buffer.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/tcl.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/tpe.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/common/types.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/container.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/env_info.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/hold_eco_demo/config.yaml +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/hold_eco_demo/demo.v +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm/config.yaml +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm/pin_order.cfg +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm/src/impl.sdc +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm/src/signoff.sdc +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm/src/spm.v +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm/verify/spm_tb.v +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm-user_project_wrapper/config.json +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/__init__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/builtins.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/chip.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/classic.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/flow.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/misc.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/optimizing.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/flows/sequential.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/help/__main__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/logging/__init__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/logging/logger.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/plugins.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/py.typed +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/base.sdc +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/klayout/Readme.md +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/klayout/insert_cell.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/klayout/open_design.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/klayout/render.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/klayout/stream_out.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/klayout/xor.drc +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/Readme.md +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/common/read.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/def/antenna_check.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/def/mag.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/def/mag_gds.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/drc.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/extract_spice.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/gds/drc_batch.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/gds/erase_box.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/gds/extras_mag.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/gds/mag_with_pointers.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/get_bbox.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/lef/extras_maglef.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/lef/maglef.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/lef.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/open.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/spice_rcx.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/magic/wrapper.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/netgen/setup.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/apply_def_template.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/cell_frequency.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/contextualize.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/diodes.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/eco_buffer.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/eco_diode.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/io_place.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/ioplace_parser/__init__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/ioplace_parser/parse.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/lefutil.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/placers.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/power_utils.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/random_place.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/reader.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/remove_buffers.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/odbpy/wire_lengths.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/antenna_check.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/buffer_list.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/dpl.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/grt.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/pad_cfg.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/pdn_cfg.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/resizer.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/set_global_connections.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/set_power_nets.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/set_rc.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/cts.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/cut_rows.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/dpl.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/drt.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/dump_rc.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/fill.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/floorplan.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/gpl.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/grt.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/gui.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/insert_buffer.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/ioplacer.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/irdrop.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/pad.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/pdn.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/rcx.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/rsz_timing_postcts.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/sta/check_macro_instances.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/sta/corner.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/tapcell.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/ungpl.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/write_cdl.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/write_views.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/pyosys/json_header.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/tclsh/hello.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/state/__init__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/state/__main__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/state/design_format.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/state/state.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/__init__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/__main__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/checker.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/common_variables.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/magic.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/misc.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/netgen.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/odb.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/openroad_alerts.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/tclstep.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/steps/yosys.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: librelane
|
|
3
|
-
Version: 3.1.0.
|
|
3
|
+
Version: 3.1.0.dev4
|
|
4
4
|
Summary: An infrastructure for implementing chip design flows
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Maintainer: Mohamed Gaber
|
|
@@ -12,7 +12,8 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.12
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.13
|
|
14
14
|
Classifier: Programming Language :: Python :: 3.14
|
|
15
|
-
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.15
|
|
16
|
+
Requires-Dist: ciel (>=3.2.0,<4)
|
|
16
17
|
Requires-Dist: click (>=8,<8.4)
|
|
17
18
|
Requires-Dist: cloup (>=3.0.5,<4)
|
|
18
19
|
Requires-Dist: deprecated (>=1.2.10,<2)
|
|
@@ -40,6 +40,7 @@ from typing import (
|
|
|
40
40
|
)
|
|
41
41
|
|
|
42
42
|
import httpx
|
|
43
|
+
from deprecated.sphinx import deprecated
|
|
43
44
|
|
|
44
45
|
from ..__version__ import __version__
|
|
45
46
|
from .types import AnyPath, Path
|
|
@@ -75,6 +76,11 @@ def get_script_dir() -> str:
|
|
|
75
76
|
)
|
|
76
77
|
|
|
77
78
|
|
|
79
|
+
@deprecated(
|
|
80
|
+
version="3.1.0",
|
|
81
|
+
reason="Use get_ciel_pdk_hash, this method can force an exit in some codepaths",
|
|
82
|
+
action="once",
|
|
83
|
+
)
|
|
78
84
|
def get_pdk_hash(pdk_variant) -> str:
|
|
79
85
|
"""
|
|
80
86
|
Gets the PDK version hash confirmed compatible with this version of LibreLane.
|
|
@@ -92,6 +98,27 @@ def get_pdk_hash(pdk_variant) -> str:
|
|
|
92
98
|
exit(1)
|
|
93
99
|
|
|
94
100
|
|
|
101
|
+
def get_ciel_pdk_hash(pdk_variant: str) -> str:
|
|
102
|
+
"""
|
|
103
|
+
Gets the PDK version hash confirmed compatible with this version of LibreLane.
|
|
104
|
+
|
|
105
|
+
Requires ciel
|
|
106
|
+
"""
|
|
107
|
+
import ciel
|
|
108
|
+
|
|
109
|
+
with open(os.path.join(get_librelane_root(), "pdk_hashes.yaml"), "r") as file:
|
|
110
|
+
pdk_hashes = yaml.safe_load(file)
|
|
111
|
+
|
|
112
|
+
pdk_family = ciel.resolve_pdk_family(pdk_variant)
|
|
113
|
+
|
|
114
|
+
if pdk_family not in pdk_hashes:
|
|
115
|
+
raise ValueError(
|
|
116
|
+
f"LibreLane does not have a validated version for Ciel PDK family {pdk_family}."
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
return pdk_hashes[pdk_family]
|
|
120
|
+
|
|
121
|
+
|
|
95
122
|
# The following code snippet has been adapted under the following license:
|
|
96
123
|
#
|
|
97
124
|
# Copyright (c) Django Software Foundation and individual contributors.
|
|
@@ -367,6 +367,11 @@ class Toolbox(object):
|
|
|
367
367
|
warn(f"Failed to generate preview: {e}.")
|
|
368
368
|
return None
|
|
369
369
|
|
|
370
|
+
@deprecated(
|
|
371
|
+
version="3.1.0",
|
|
372
|
+
reason="No longer needed by internal LibreLane steps and will be removed in LibreLane 4.0.",
|
|
373
|
+
action="once",
|
|
374
|
+
)
|
|
370
375
|
def remove_cells_from_lib(
|
|
371
376
|
self,
|
|
372
377
|
input_lib_files: FrozenSet[str],
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
# Copyright 2025 LibreLane Contributors
|
|
2
|
+
#
|
|
3
|
+
# Adapted from OpenLane 2
|
|
4
|
+
#
|
|
1
5
|
# Copyright 2023 Efabless Corporation
|
|
2
6
|
#
|
|
3
7
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -815,7 +819,7 @@ class Config(GenericImmutableDict[str, Any]):
|
|
|
815
819
|
try:
|
|
816
820
|
import ciel
|
|
817
821
|
|
|
818
|
-
pdk_root = ciel.get_ciel_home(pdk_root)
|
|
822
|
+
pdk_root = str(ciel.get_ciel_home(pdk_root))
|
|
819
823
|
except ImportError:
|
|
820
824
|
raise ValueError(
|
|
821
825
|
"The pdk_root argument is required as Ciel is not installed."
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
# Copyright 2025 LibreLane Contributors
|
|
2
|
+
#
|
|
3
|
+
# Adapted from OpenLane 2
|
|
4
|
+
#
|
|
1
5
|
# Copyright 2023-2025 Efabless Corporation
|
|
2
6
|
#
|
|
3
7
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -350,4 +354,20 @@ def migrate_old_config(config: Mapping[str, Any]) -> Dict[str, Any]:
|
|
|
350
354
|
if "HEURISTIC_ANTENNA_THRESHOLD" not in config:
|
|
351
355
|
new["HEURISTIC_ANTENNA_THRESHOLD"] = 130
|
|
352
356
|
|
|
357
|
+
# x7. KLAYOUT_DRC_OPTIONS to defines
|
|
358
|
+
if new["PDK"].startswith("sky130") and "KLAYOUT_DRC_OPTIONS" in new:
|
|
359
|
+
tcl_dict = new["KLAYOUT_DRC_OPTIONS"]
|
|
360
|
+
ws_rx = re.compile(r"\s+")
|
|
361
|
+
del new["KLAYOUT_DRC_OPTIONS"]
|
|
362
|
+
new["KLAYOUT_DRC_DEFINES"] = {}
|
|
363
|
+
# deliberately not checking for bad dicts or dicts that require quoting
|
|
364
|
+
# it's already overkill to assume people modified the PDK files here
|
|
365
|
+
#
|
|
366
|
+
# if someone complains we can parse a Tcl dict later
|
|
367
|
+
tcl_dict_entries = ws_rx.split(tcl_dict)
|
|
368
|
+
while len(tcl_dict_entries):
|
|
369
|
+
key = tcl_dict_entries.pop(0)
|
|
370
|
+
value = tcl_dict_entries.pop(0)
|
|
371
|
+
new["KLAYOUT_DRC_DEFINES"][key] = value
|
|
372
|
+
|
|
353
373
|
return new
|
|
@@ -43,7 +43,7 @@ from cloup.constraints import (
|
|
|
43
43
|
from cloup.typing import Decorator
|
|
44
44
|
|
|
45
45
|
from .flow import Flow
|
|
46
|
-
from ..common import set_tpe, cli,
|
|
46
|
+
from ..common import set_tpe, cli, get_ciel_pdk_hash, _get_process_limit
|
|
47
47
|
from ..logging import set_log_level, verbose, err, options, LogLevels
|
|
48
48
|
from ..state import State, InvalidState
|
|
49
49
|
|
|
@@ -517,8 +517,7 @@ def cloup_flow_opts(
|
|
|
517
517
|
import ciel
|
|
518
518
|
from ciel.source import StaticWebDataSource
|
|
519
519
|
|
|
520
|
-
|
|
521
|
-
ciel_home = ciel.get_ciel_home(pdk_root)
|
|
520
|
+
ciel_home = str(ciel.get_ciel_home(pdk_root))
|
|
522
521
|
|
|
523
522
|
include_libraries = ["default"]
|
|
524
523
|
if scl is not None:
|
|
@@ -527,32 +526,35 @@ def cloup_flow_opts(
|
|
|
527
526
|
if pad is not None:
|
|
528
527
|
include_libraries.append(pad)
|
|
529
528
|
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
529
|
+
selector = pdk
|
|
530
|
+
|
|
531
|
+
try:
|
|
532
|
+
pdk = ciel.resolve_pdk_variant(pdk)
|
|
533
|
+
if pdk != selector:
|
|
534
|
+
verbose(f"Resolved PDK variant {pdk}.")
|
|
535
|
+
except ValueError as e:
|
|
536
|
+
err(str(e))
|
|
537
|
+
err("If you're using a non-Ciel PDK, please pass --manual-pdk.")
|
|
538
|
+
exit(1)
|
|
539
|
+
|
|
540
|
+
try:
|
|
541
|
+
opdks_rev = volare_pdk_override or get_ciel_pdk_hash(pdk)
|
|
542
|
+
except ValueError as e:
|
|
543
|
+
err(str(e))
|
|
544
|
+
err("Please specify a PDK manually with '--manual-pdk'.")
|
|
543
545
|
exit(1)
|
|
544
546
|
|
|
545
547
|
try:
|
|
546
548
|
version = ciel.fetch(
|
|
547
549
|
ciel_home,
|
|
548
|
-
|
|
550
|
+
pdk, # only pull default libraries for resolved variant since we have a message saying "Resolved variant {pdk}..."
|
|
549
551
|
opdks_rev,
|
|
550
552
|
data_source=StaticWebDataSource(
|
|
551
553
|
"https://fossi-foundation.github.io/ciel-releases"
|
|
552
554
|
),
|
|
553
555
|
include_libraries=include_libraries,
|
|
554
556
|
)
|
|
555
|
-
pdk_root = version.get_dir(ciel_home)
|
|
557
|
+
pdk_root = str(version.get_dir(ciel_home))
|
|
556
558
|
except ValueError as e:
|
|
557
559
|
err(f"Failed to download PDK: {e}")
|
|
558
560
|
exit(1)
|
|
@@ -562,7 +562,10 @@ def remove_obstructions(reader, input_lefs, obstructions):
|
|
|
562
562
|
if (odb_layer, odb_bbox) == (layer, bbox):
|
|
563
563
|
print(f"Removing obstruction on {layer} at {bbox} (DBU)…")
|
|
564
564
|
found = True
|
|
565
|
-
|
|
565
|
+
if not odb_obj.isSystemReserved():
|
|
566
|
+
odb.dbObstruction_destroy(odb_obj)
|
|
567
|
+
else:
|
|
568
|
+
print("[WARNING] Obstruction is system-reserved.")
|
|
566
569
|
if found:
|
|
567
570
|
break
|
|
568
571
|
if not found:
|
|
@@ -19,11 +19,23 @@ source $::env(_TCL_ENV_IN)
|
|
|
19
19
|
source $::env(SCRIPTS_DIR)/openroad/common/set_global_connections.tcl
|
|
20
20
|
|
|
21
21
|
namespace eval lln {
|
|
22
|
+
proc scene_name {scene} {
|
|
23
|
+
# OpenSTA >= 3.1 (commit 998806cb, 2026-06-30) bridges scenes as SWIG
|
|
24
|
+
# objects instead of strings. Older OpenSTA 3 bridges them as strings,
|
|
25
|
+
# in which case the value already is the name.
|
|
26
|
+
if { [sta::is_object $scene] } {
|
|
27
|
+
return [sta::get_property $scene name]
|
|
28
|
+
}
|
|
29
|
+
return $scene
|
|
30
|
+
}
|
|
22
31
|
proc get_corner_names {} {
|
|
23
32
|
# returns: names as a Tcl list, compatible with both OpenSTA 2 and 3
|
|
24
33
|
if {[string length [namespace which sta::scenes]] != 0} {
|
|
25
|
-
|
|
26
|
-
|
|
34
|
+
set result [list]
|
|
35
|
+
foreach scene [sta::scenes] {
|
|
36
|
+
lappend result [scene_name $scene]
|
|
37
|
+
}
|
|
38
|
+
return $result
|
|
27
39
|
} else {
|
|
28
40
|
# corners are not bridged as strings
|
|
29
41
|
set result [list]
|
|
@@ -36,12 +48,14 @@ namespace eval lln {
|
|
|
36
48
|
proc get_corner_dict {} {
|
|
37
49
|
# returns: Tcl dictionary from corner names to whatever object is
|
|
38
50
|
# interpreted as a corner for internal commands that expect corners:
|
|
39
|
-
# - in OpenSTA 3, that's
|
|
51
|
+
# - in OpenSTA 3, that's whatever sta::find_scene returns (a name in
|
|
52
|
+
# OpenSTA 3.0, a Scene object since 3.1)
|
|
40
53
|
# - in OpenSTA 2, that's an opaque Tcl pointer
|
|
41
54
|
set result [dict create]
|
|
42
55
|
if {[string length [namespace which sta::scenes]] != 0} {
|
|
43
56
|
foreach scene [sta::scenes] {
|
|
44
|
-
|
|
57
|
+
set name [scene_name $scene]
|
|
58
|
+
dict set result $name [sta::find_scene $name]
|
|
45
59
|
}
|
|
46
60
|
} else {
|
|
47
61
|
foreach corner [sta::corners] {
|
|
@@ -52,7 +66,11 @@ namespace eval lln {
|
|
|
52
66
|
}
|
|
53
67
|
|
|
54
68
|
proc set_sta_cmd_corner {corner_name} {
|
|
55
|
-
|
|
69
|
+
# sta::set_scene takes a name in every OpenSTA 3; sta::set_cmd_scene
|
|
70
|
+
# takes a name before 998806cb and a Scene object after.
|
|
71
|
+
if {[string length [namespace which sta::set_scene]] != 0} {
|
|
72
|
+
sta::set_scene $corner_name
|
|
73
|
+
} elseif {[string length [namespace which sta::set_cmd_scene]] != 0} {
|
|
56
74
|
sta::set_cmd_scene $corner_name
|
|
57
75
|
} else {
|
|
58
76
|
set corner_object [sta::find_corner $corner_name]
|
|
@@ -49,11 +49,11 @@ lappend arg_list -verbose
|
|
|
49
49
|
lappend arg_list -max_wire_length $::env(DESIGN_REPAIR_MAX_WIRE_LENGTH)
|
|
50
50
|
lappend arg_list -slew_margin $::env(DESIGN_REPAIR_MAX_SLEW_PCT)
|
|
51
51
|
lappend arg_list -cap_margin $::env(DESIGN_REPAIR_MAX_CAP_PCT)
|
|
52
|
-
if {
|
|
52
|
+
if { $::env(DESIGN_REPAIR_MAX_UTILIZATION) > 0 } {
|
|
53
53
|
lappend arg_list -max_utilization $::env(DESIGN_REPAIR_MAX_UTILIZATION)
|
|
54
54
|
}
|
|
55
|
-
if {
|
|
56
|
-
lappend arg_list -
|
|
55
|
+
if { $::env(DESIGN_REPAIR_PRE_PLACEMENT) } {
|
|
56
|
+
lappend arg_list -pre_placement
|
|
57
57
|
}
|
|
58
58
|
# Repair Design
|
|
59
59
|
log_cmd repair_design {*}$arg_list
|
{librelane-3.1.0.dev3 → librelane-3.1.0.dev4}/librelane/scripts/openroad/repair_design_postgrt.tcl
RENAMED
|
@@ -36,12 +36,9 @@ lappend arg_list -verbose
|
|
|
36
36
|
lappend arg_list -max_wire_length $::env(GRT_DESIGN_REPAIR_MAX_WIRE_LENGTH)
|
|
37
37
|
lappend arg_list -slew_margin $::env(GRT_DESIGN_REPAIR_MAX_SLEW_PCT)
|
|
38
38
|
lappend arg_list -cap_margin $::env(GRT_DESIGN_REPAIR_MAX_CAP_PCT)
|
|
39
|
-
if {
|
|
39
|
+
if { $::env(GRT_DESIGN_REPAIR_MAX_UTILIZATION) > 0 } {
|
|
40
40
|
lappend arg_list -max_utilization $::env(GRT_DESIGN_REPAIR_MAX_UTILIZATION)
|
|
41
41
|
}
|
|
42
|
-
if { [info exists ::env(GRT_DESIGN_REPAIR_BUFFER_GAIN)] } {
|
|
43
|
-
lappend arg_list -buffer_gain $::env(GRT_DESIGN_REPAIR_BUFFER_GAIN)
|
|
44
|
-
}
|
|
45
42
|
log_cmd repair_design {*}$arg_list
|
|
46
43
|
|
|
47
44
|
# Re-DPL and GRT
|
|
@@ -257,6 +257,10 @@ def synthesize(
|
|
|
257
257
|
config = json.load(open(config_in))
|
|
258
258
|
extra = json.load(open(extra_in))
|
|
259
259
|
|
|
260
|
+
lib_dont_use_args = []
|
|
261
|
+
for excluded_cell in extra["excluded_cell_patterns"]:
|
|
262
|
+
lib_dont_use_args.extend(("-dont_use", excluded_cell))
|
|
263
|
+
|
|
260
264
|
includes = config.get("VERILOG_INCLUDE_DIRS") or []
|
|
261
265
|
defines = (
|
|
262
266
|
(config.get("VERILOG_DEFINES") or [])
|
|
@@ -288,7 +292,7 @@ def synthesize(
|
|
|
288
292
|
# https://github.com/YosysHQ/abc/blob/28d955ca97a1c4be3aed4062aec0241a734fac5d/src/map/scl/sclUtil.c#L257
|
|
289
293
|
sdc_path = os.path.join(step_dir, "synthesis.abc.sdc")
|
|
290
294
|
with open(sdc_path, "w") as f:
|
|
291
|
-
print(f"set_driving_cell {config['SYNTH_DRIVING_CELL']}", file=f)
|
|
295
|
+
print(f"set_driving_cell {config['SYNTH_DRIVING_CELL'].split('/')[0]}", file=f)
|
|
292
296
|
print(f"set_load {config['OUTPUT_CAP_LOAD']}", file=f)
|
|
293
297
|
|
|
294
298
|
ys.log(f"[INFO] Using SDC file '{sdc_path}' for ABC…")
|
|
@@ -434,6 +438,7 @@ def synthesize(
|
|
|
434
438
|
cg_min_width = config["SYNTH_CLOCKGATE_MIN_WIDTH"]
|
|
435
439
|
posedge = ()
|
|
436
440
|
negedge = ()
|
|
441
|
+
tie_lo = ()
|
|
437
442
|
if posedge_raw := config["SYNTH_CLOCKGATE_POSEDGE_ICG"]:
|
|
438
443
|
cell, ce, clk, gclk = posedge_raw.rsplit("/", maxsplit=4)
|
|
439
444
|
posedge = ("-pos", cell, f"{ce}:{clk}:{gclk}")
|
|
@@ -444,18 +449,21 @@ def synthesize(
|
|
|
444
449
|
ys.log(
|
|
445
450
|
"[WARNING] A minimum width for clock gating is set; but no ICGs are configured."
|
|
446
451
|
)
|
|
452
|
+
if tie_lo_raw := config["SYNTH_CLOCKGATE_TIE_LO"]:
|
|
453
|
+
tie_lo = ("-tie_lo", tie_lo_raw)
|
|
447
454
|
d.run_pass(
|
|
448
455
|
"clockgate",
|
|
449
456
|
"-min_net_size",
|
|
450
457
|
str(cg_min_width),
|
|
451
458
|
*posedge,
|
|
452
459
|
*negedge,
|
|
460
|
+
*tie_lo,
|
|
453
461
|
)
|
|
454
462
|
|
|
455
463
|
dfflibmap_args = []
|
|
456
464
|
for lib in libs:
|
|
457
465
|
dfflibmap_args.extend(["-liberty", lib])
|
|
458
|
-
d.run_pass("dfflibmap", *dfflibmap_args)
|
|
466
|
+
d.run_pass("dfflibmap", *dfflibmap_args, *lib_dont_use_args)
|
|
459
467
|
|
|
460
468
|
d.tee("stat", "-json", *lib_arguments, o=os.path.join(report_dir, "post_dff.json"))
|
|
461
469
|
d.tee("stat", *lib_arguments, o=os.path.join(report_dir, "post_dff.rpt"))
|
|
@@ -465,24 +473,35 @@ def synthesize(
|
|
|
465
473
|
def run_strategy(d):
|
|
466
474
|
abc_script = config["SYNTH_ABC_STRATEGY_SCRIPT"]
|
|
467
475
|
if abc_script:
|
|
468
|
-
ys.log(f"[INFO] Using custom ABC strategy script '{abc_script}'
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
476
|
+
ys.log(f"[INFO] Using custom ABC strategy script '{abc_script}'…\n")
|
|
477
|
+
elif config["SYNTH_STRATEGY"] != "DEFAULT":
|
|
478
|
+
if config["SYNTH_ABC_NEW"]:
|
|
479
|
+
ys.log(
|
|
480
|
+
"[WARN] Using Yosys-provided synthesis strategy for experimental abc_new pass: use SYNTH_ABC_STRATEGY_SCRIPT to provide your own synthesis scripts."
|
|
481
|
+
)
|
|
482
|
+
else:
|
|
483
|
+
abc_script = script_creator.generate_abc_script(
|
|
484
|
+
step_dir,
|
|
485
|
+
config["SYNTH_STRATEGY"],
|
|
486
|
+
)
|
|
487
|
+
ys.log(f"[INFO] Using generated ABC strategy script '{abc_script}'…\n")
|
|
488
|
+
ys.log_flush()
|
|
489
|
+
|
|
490
|
+
extra_args = ["-script", abc_script] * bool(abc_script)
|
|
491
|
+
if not config["SYNTH_ABC_NEW"]:
|
|
492
|
+
extra_args += ["-showtmp"]
|
|
493
|
+
if config["SYNTH_ABC_DFF"]:
|
|
494
|
+
extra_args += ["-dff"]
|
|
495
|
+
|
|
496
|
+
abc_pass = [
|
|
497
|
+
"abc_new" if config["SYNTH_ABC_NEW"] else "abc",
|
|
480
498
|
"-constr",
|
|
481
499
|
sdc_path,
|
|
482
|
-
"-showtmp",
|
|
483
500
|
*lib_arguments,
|
|
484
|
-
*
|
|
485
|
-
|
|
501
|
+
*extra_args,
|
|
502
|
+
*lib_dont_use_args,
|
|
503
|
+
]
|
|
504
|
+
d.run_pass(*abc_pass)
|
|
486
505
|
|
|
487
506
|
if value := config.get("SYNTH_TIE_UNDEFINED"):
|
|
488
507
|
flag = "-zero" if value == "low" else "-one"
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
import os
|
|
19
19
|
import re
|
|
20
20
|
import sys
|
|
21
|
+
import shlex
|
|
21
22
|
from typing import Iterable, List, Optional, Tuple, Union
|
|
22
23
|
|
|
23
24
|
try:
|
|
@@ -64,6 +65,9 @@ def yosys_version_at_least(*target: Tuple[int, ...]) -> Tuple[int, int]:
|
|
|
64
65
|
|
|
65
66
|
|
|
66
67
|
def _Design_run_pass(self, *command):
|
|
68
|
+
if pass_dump := os.getenv("_LIBRELANE_YOSYS_DUMP_PASSES_TO"):
|
|
69
|
+
with open(pass_dump, "a+", encoding="utf8") as f:
|
|
70
|
+
print(shlex.join(command), file=f)
|
|
67
71
|
ys.Pass.call(self, command)
|
|
68
72
|
|
|
69
73
|
|
|
@@ -151,6 +155,8 @@ def _Design_add_blackbox_models(
|
|
|
151
155
|
"-sv",
|
|
152
156
|
"-setattr",
|
|
153
157
|
"keep_hierarchy",
|
|
158
|
+
"-setattr",
|
|
159
|
+
"blackbox",
|
|
154
160
|
"-lib",
|
|
155
161
|
*include_args,
|
|
156
162
|
*define_args,
|
|
@@ -165,6 +171,7 @@ def _Design_add_blackbox_models(
|
|
|
165
171
|
"blackbox",
|
|
166
172
|
"-setattr",
|
|
167
173
|
"keep_hierarchy",
|
|
174
|
+
"-unit_delay",
|
|
168
175
|
model,
|
|
169
176
|
)
|
|
170
177
|
else:
|