librelane 3.1.0.dev3__tar.gz → 3.1.0.dev5__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.dev5}/PKG-INFO +9 -6
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/Readme.md +6 -4
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/__init__.py +1 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/misc.py +27 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/toolbox.py +5 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/config/__init__.py +4 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/config/__main__.py +4 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/config/config.py +5 -1
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/config/flow.py +1 -1
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/config/pdk_compat.py +20 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/config/preprocessor.py +4 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/config/removals.py +4 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/config/variable.py +6 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/cli.py +20 -18
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/synth_explore.py +1 -0
- librelane-3.1.0.dev5/librelane/pdk_hashes.yaml +4 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/check_antenna_properties.py +1 -1
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/defutil.py +4 -1
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/io.tcl +53 -29
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/gui.tcl +4 -4
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/repair_design.tcl +3 -3
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/repair_design_postgrt.tcl +1 -4
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/sta/corner.tcl +3 -3
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/pyosys/synthesize.py +60 -20
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/pyosys/ys_common.py +7 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/klayout.py +59 -27
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/openroad.py +21 -1
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/pyosys.py +67 -39
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/step.py +9 -6
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/verilator.py +1 -1
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/pyproject.toml +2 -2
- librelane-3.1.0.dev3/librelane/pdk_hashes.yaml +0 -3
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/__init__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/__main__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/__version__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/cli.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/drc.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/generic_dict.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/metrics/__init__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/metrics/__main__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/metrics/compare.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/metrics/library.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/metrics/metric.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/metrics/util.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/ring_buffer.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/tcl.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/tpe.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/common/types.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/container.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/env_info.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/hold_eco_demo/config.yaml +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/hold_eco_demo/demo.v +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm/config.yaml +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm/pin_order.cfg +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm/src/impl.sdc +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm/src/signoff.sdc +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm/src/spm.v +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm/verify/spm_tb.v +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/config.json +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/__init__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/builtins.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/chip.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/classic.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/flow.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/misc.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/optimizing.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/flows/sequential.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/help/__main__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/logging/__init__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/logging/logger.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/plugins.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/py.typed +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/base.sdc +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/klayout/Readme.md +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/klayout/insert_cell.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/klayout/open_design.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/klayout/render.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/klayout/stream_out.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/klayout/xor.drc +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/Readme.md +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/common/read.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/def/antenna_check.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/def/mag.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/def/mag_gds.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/drc.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/extract_spice.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/gds/drc_batch.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/gds/erase_box.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/gds/extras_mag.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/gds/mag_with_pointers.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/get_bbox.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/lef/extras_maglef.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/lef/maglef.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/lef.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/open.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/spice_rcx.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/magic/wrapper.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/netgen/setup.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/apply_def_template.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/cell_frequency.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/contextualize.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/diodes.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/eco_buffer.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/eco_diode.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/io_place.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/ioplace_parser/__init__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/ioplace_parser/parse.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/lefutil.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/placers.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/power_utils.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/random_place.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/reader.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/remove_buffers.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/wire_lengths.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/antenna_check.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/buffer_list.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/dpl.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/grt.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/pad_cfg.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/pdn_cfg.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/resizer.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_global_connections.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_power_nets.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_rc.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/cts.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/cut_rows.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/dpl.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/drt.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/dump_rc.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/fill.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/floorplan.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/gpl.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/grt.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/insert_buffer.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/ioplacer.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/irdrop.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/pad.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/pdn.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/rcx.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/rsz_timing_postcts.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/sta/check_macro_instances.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/tapcell.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/ungpl.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/write_cdl.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/openroad/write_views.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/pyosys/json_header.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/scripts/tclsh/hello.tcl +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/state/__init__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/state/__main__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/state/design_format.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/state/state.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/__init__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/__main__.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/checker.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/common_variables.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/magic.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/misc.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/netgen.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/odb.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/openroad_alerts.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/librelane/steps/tclstep.py +0 -0
- {librelane-3.1.0.dev3 → librelane-3.1.0.dev5}/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.dev5
|
|
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)
|
|
@@ -79,7 +80,7 @@ LibreLane includes two reference flows (`Classic` and `Chip`) that are built
|
|
|
79
80
|
entirely using open-source EDA tools.
|
|
80
81
|
|
|
81
82
|
You can find the documentation
|
|
82
|
-
[here](https://librelane.readthedocs.io/en/
|
|
83
|
+
[here](https://librelane.readthedocs.io/en/stable/getting_started/) to get
|
|
83
84
|
started. You can discuss LibreLane in the
|
|
84
85
|
[FOSSi Chat Matrix Server](https://fossi-chat.org).
|
|
85
86
|
|
|
@@ -120,7 +121,7 @@ Works for macOS and Linux (x86-64 and aarch64). Recommended, as it is more
|
|
|
120
121
|
integrated with your filesystem and overall has less upload and download deltas.
|
|
121
122
|
|
|
122
123
|
See
|
|
123
|
-
[Nix-based installation](https://librelane.readthedocs.io/en/
|
|
124
|
+
[Nix-based installation](https://librelane.readthedocs.io/en/stable/installation/nix_installation/index.html)
|
|
124
125
|
in the docs for more info.
|
|
125
126
|
|
|
126
127
|
### Docker
|
|
@@ -128,7 +129,7 @@ in the docs for more info.
|
|
|
128
129
|
Works for Windows, macOS and Linux (x86-64 and aarch64).
|
|
129
130
|
|
|
130
131
|
See
|
|
131
|
-
[Docker-based installation](https://librelane.readthedocs.io/en/
|
|
132
|
+
[Docker-based installation](https://librelane.readthedocs.io/en/stable/installation/docker_installation/index.html)
|
|
132
133
|
in the docs for more info.
|
|
133
134
|
|
|
134
135
|
Do note you'll need to add `--dockerized` right after `librelane` in most CLI
|
|
@@ -144,7 +145,9 @@ python3 -m pip install --upgrade librelane
|
|
|
144
145
|
```
|
|
145
146
|
|
|
146
147
|
Python-only installations are presently unsupported and entirely at your own
|
|
147
|
-
risk
|
|
148
|
+
risk, but you may consult
|
|
149
|
+
[Manual installation](https://librelane.readthedocs.io/en/stable/installation/manual_installation/index.html)
|
|
150
|
+
in the docs for more info.
|
|
148
151
|
|
|
149
152
|
## Usage
|
|
150
153
|
|
|
@@ -45,7 +45,7 @@ LibreLane includes two reference flows (`Classic` and `Chip`) that are built
|
|
|
45
45
|
entirely using open-source EDA tools.
|
|
46
46
|
|
|
47
47
|
You can find the documentation
|
|
48
|
-
[here](https://librelane.readthedocs.io/en/
|
|
48
|
+
[here](https://librelane.readthedocs.io/en/stable/getting_started/) to get
|
|
49
49
|
started. You can discuss LibreLane in the
|
|
50
50
|
[FOSSi Chat Matrix Server](https://fossi-chat.org).
|
|
51
51
|
|
|
@@ -86,7 +86,7 @@ Works for macOS and Linux (x86-64 and aarch64). Recommended, as it is more
|
|
|
86
86
|
integrated with your filesystem and overall has less upload and download deltas.
|
|
87
87
|
|
|
88
88
|
See
|
|
89
|
-
[Nix-based installation](https://librelane.readthedocs.io/en/
|
|
89
|
+
[Nix-based installation](https://librelane.readthedocs.io/en/stable/installation/nix_installation/index.html)
|
|
90
90
|
in the docs for more info.
|
|
91
91
|
|
|
92
92
|
### Docker
|
|
@@ -94,7 +94,7 @@ in the docs for more info.
|
|
|
94
94
|
Works for Windows, macOS and Linux (x86-64 and aarch64).
|
|
95
95
|
|
|
96
96
|
See
|
|
97
|
-
[Docker-based installation](https://librelane.readthedocs.io/en/
|
|
97
|
+
[Docker-based installation](https://librelane.readthedocs.io/en/stable/installation/docker_installation/index.html)
|
|
98
98
|
in the docs for more info.
|
|
99
99
|
|
|
100
100
|
Do note you'll need to add `--dockerized` right after `librelane` in most CLI
|
|
@@ -110,7 +110,9 @@ python3 -m pip install --upgrade librelane
|
|
|
110
110
|
```
|
|
111
111
|
|
|
112
112
|
Python-only installations are presently unsupported and entirely at your own
|
|
113
|
-
risk
|
|
113
|
+
risk, but you may consult
|
|
114
|
+
[Manual installation](https://librelane.readthedocs.io/en/stable/installation/manual_installation/index.html)
|
|
115
|
+
in the docs for more info.
|
|
114
116
|
|
|
115
117
|
## Usage
|
|
116
118
|
|
|
@@ -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
|
|
@@ -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");
|
|
@@ -241,6 +245,8 @@ class Macro:
|
|
|
241
245
|
|
|
242
246
|
# we need to make a copy here, as we're modifying the dictionary as we iterate
|
|
243
247
|
for instance_name, instance in self.instances.copy().items():
|
|
248
|
+
if not isinstance(instance, Instance):
|
|
249
|
+
instance = Instance(**instance)
|
|
244
250
|
if (array := instance.array) is not None:
|
|
245
251
|
# we have a macro to expand
|
|
246
252
|
# first, check it's valid
|
|
@@ -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]
|
|
@@ -111,7 +129,7 @@ proc read_current_sdc {} {
|
|
|
111
129
|
}
|
|
112
130
|
|
|
113
131
|
puts "Reading design constraints file at '$::env(_SDC_IN)'…"
|
|
114
|
-
if {[catch {read_sdc $::env(_SDC_IN)} errmsg]} {
|
|
132
|
+
if {[catch {log_cmd read_sdc $::env(_SDC_IN)} errmsg]} {
|
|
115
133
|
puts stderr $errmsg
|
|
116
134
|
exit 1
|
|
117
135
|
}
|
|
@@ -119,10 +137,10 @@ proc read_current_sdc {} {
|
|
|
119
137
|
if { ![string_in_file $::env(_SDC_IN) "set_propagated_clock"] && ![string_in_file $::env(_SDC_IN) "unset_propagated_clock"] } {
|
|
120
138
|
if { [info exists ::env(OPENLANE_SDC_IDEAL_CLOCKS)] && $::env(OPENLANE_SDC_IDEAL_CLOCKS) } {
|
|
121
139
|
puts "\[INFO\] No information on clock propagation in input SDC file-- unpropagating all clocks."
|
|
122
|
-
unset_propagated_clock [all_clocks]
|
|
140
|
+
log_cmd unset_propagated_clock [all_clocks]
|
|
123
141
|
} else {
|
|
124
142
|
puts "\[INFO\] No information on clock propagation in input SDC file-- propagating all clocks."
|
|
125
|
-
set_propagated_clock [all_clocks]
|
|
143
|
+
log_cmd set_propagated_clock [all_clocks]
|
|
126
144
|
}
|
|
127
145
|
}
|
|
128
146
|
|
|
@@ -140,6 +158,12 @@ proc read_current_sdc {} {
|
|
|
140
158
|
unset ::env(SYNTH_DRIVING_CELL_PIN)
|
|
141
159
|
set ::env(SYNTH_DRIVING_CELL) $synth_driving_cell_bk
|
|
142
160
|
}
|
|
161
|
+
|
|
162
|
+
# this maneuver is so it ends up in the report directory even if it's not
|
|
163
|
+
# the step directory
|
|
164
|
+
puts "%OL_CREATE_REPORT resolved.sdc"
|
|
165
|
+
write_sdc /dev/stdout
|
|
166
|
+
puts "%OL_END_REPORT"
|
|
143
167
|
}
|
|
144
168
|
|
|
145
169
|
proc read_pad_cfg {} {
|
|
@@ -192,20 +216,20 @@ proc read_current_netlist {args} {
|
|
|
192
216
|
|
|
193
217
|
if { [info exists flags(-powered)] } {
|
|
194
218
|
puts "Reading top-level powered netlist at '$::env(CURRENT_PNL)'…"
|
|
195
|
-
if {[catch {read_verilog $::env(CURRENT_PNL)} errmsg]} {
|
|
219
|
+
if {[catch {log_cmd read_verilog $::env(CURRENT_PNL)} errmsg]} {
|
|
196
220
|
puts stderr $errmsg
|
|
197
221
|
exit 1
|
|
198
222
|
}
|
|
199
223
|
} else {
|
|
200
224
|
puts "Reading top-level netlist at '$::env(CURRENT_NL)'…"
|
|
201
|
-
if {[catch {read_verilog $::env(CURRENT_NL)} errmsg]} {
|
|
225
|
+
if {[catch {log_cmd read_verilog $::env(CURRENT_NL)} errmsg]} {
|
|
202
226
|
puts stderr $errmsg
|
|
203
227
|
exit 1
|
|
204
228
|
}
|
|
205
229
|
}
|
|
206
230
|
|
|
207
231
|
puts "Linking design '$::env(DESIGN_NAME)' from netlist…"
|
|
208
|
-
link_design $::env(DESIGN_NAME)
|
|
232
|
+
log_cmd link_design $::env(DESIGN_NAME)
|
|
209
233
|
set_global_vars
|
|
210
234
|
read_current_sdc
|
|
211
235
|
}
|
|
@@ -219,27 +243,27 @@ proc read_timing_info {args} {
|
|
|
219
243
|
return
|
|
220
244
|
}
|
|
221
245
|
set corner_name $::env(_CURRENT_CORNER_NAME)
|
|
222
|
-
|
|
246
|
+
log_cmd define_corners $corner_name
|
|
223
247
|
|
|
224
248
|
puts "Reading timing models for corner $corner_name…"
|
|
225
249
|
|
|
226
250
|
foreach lib $::env(_CURRENT_CORNER_LIBS) {
|
|
227
251
|
puts "Reading cell library for the '$corner_name' corner at '$lib'…"
|
|
228
|
-
read_liberty -corner $corner_name $lib
|
|
252
|
+
log_cmd read_liberty -corner $corner_name $lib
|
|
229
253
|
}
|
|
230
254
|
|
|
231
255
|
if { [info exists ::env(EXTRA_LIBS) ] } {
|
|
232
256
|
puts "Reading explicitly-specified extra libs for $corner_name…"
|
|
233
257
|
foreach extra_lib $::env(EXTRA_LIBS) {
|
|
234
258
|
puts "Reading extra timing library for the '$corner_name' corner at '$extra_lib'…"
|
|
235
|
-
read_liberty -corner $corner_name $extra_lib
|
|
259
|
+
log_cmd read_liberty -corner $corner_name $extra_lib
|
|
236
260
|
}
|
|
237
261
|
}
|
|
238
262
|
|
|
239
263
|
set blackbox_wildcard {/// sta-blackbox}
|
|
240
264
|
foreach nl $::env(_CURRENT_CORNER_NETLISTS) {
|
|
241
265
|
puts "Reading macro netlist at '$nl'…"
|
|
242
|
-
if { [catch {read_verilog $nl} err] } {
|
|
266
|
+
if { [catch {log_cmd read_verilog $nl} err] } {
|
|
243
267
|
puts stderr "Error while reading macro netlist '$nl':"
|
|
244
268
|
puts stderr $err
|
|
245
269
|
puts stderr "Make sure that this a gate-level netlist and not an RTL file."
|
|
@@ -250,7 +274,7 @@ proc read_timing_info {args} {
|
|
|
250
274
|
foreach verilog_file $::env(EXTRA_VERILOG_MODELS) {
|
|
251
275
|
if { [string_in_file $verilog_file $blackbox_wildcard] } {
|
|
252
276
|
puts "Found '$blackbox_wildcard' in '$verilog_file', skipping…"
|
|
253
|
-
} elseif { [catch {puts "Reading Verilog model at '$verilog_file'…"; read_verilog $verilog_file} err] } {
|
|
277
|
+
} elseif { [catch {puts "Reading Verilog model at '$verilog_file'…"; log_cmd read_verilog $verilog_file} err] } {
|
|
254
278
|
puts stderr "Error while reading $verilog_file:"
|
|
255
279
|
puts stderr $err
|
|
256
280
|
puts stderr "Make sure that this a gate-level netlist and not an RTL file, otherwise, you can add the following comment '$blackbox_wildcard' in the file to skip it and blackbox the modules inside if needed."
|
|
@@ -277,7 +301,7 @@ proc read_spefs {} {
|
|
|
277
301
|
if { [info exists ::env(_CURRENT_SPEF_BY_CORNER)] } {
|
|
278
302
|
set corner_name $::env(_CURRENT_CORNER_NAME)
|
|
279
303
|
puts "Reading top-level design parasitics for the '$corner_name' corner at '$::env(_CURRENT_SPEF_BY_CORNER)'…"
|
|
280
|
-
read_spef -corner $corner_name $::env(_CURRENT_SPEF_BY_CORNER)
|
|
304
|
+
log_cmd read_spef -corner $corner_name $::env(_CURRENT_SPEF_BY_CORNER)
|
|
281
305
|
}
|
|
282
306
|
if { [info exists ::env(_CURRENT_CORNER_SPEFS)] } {
|
|
283
307
|
set corner_name $::env(_CURRENT_CORNER_NAME)
|
|
@@ -285,7 +309,7 @@ proc read_spefs {} {
|
|
|
285
309
|
set instance_path [lshift spefs]
|
|
286
310
|
foreach spef $spefs {
|
|
287
311
|
puts "Reading '$instance_path' parasitics for the '$corner_name' corner at '$spef'…"
|
|
288
|
-
read_spef -corner $corner_name -path $instance_path $spef
|
|
312
|
+
log_cmd read_spef -corner $corner_name -path $instance_path $spef
|
|
289
313
|
}
|
|
290
314
|
}
|
|
291
315
|
}
|
|
@@ -298,7 +322,7 @@ proc read_spefs {} {
|
|
|
298
322
|
if { "[get_property $cell ref_name]" eq "$module_name"} {
|
|
299
323
|
set instance_path [get_property $cell full_name]
|
|
300
324
|
puts "Reading '$instance_path' parasitics for the '$corner_name' corner at '$spef'…"
|
|
301
|
-
read_spef -corner $corner_name -path $instance_path $spef
|
|
325
|
+
log_cmd read_spef -corner $corner_name -path $instance_path $spef
|
|
302
326
|
}
|
|
303
327
|
}
|
|
304
328
|
}
|
|
@@ -318,7 +342,7 @@ proc read_pnr_libs {args} {
|
|
|
318
342
|
lappend corner_names $corner_name
|
|
319
343
|
}
|
|
320
344
|
|
|
321
|
-
define_corners {*}[array name corner]
|
|
345
|
+
log_cmd define_corners {*}[array name corner]
|
|
322
346
|
|
|
323
347
|
foreach corner_name [array name corner] {
|
|
324
348
|
puts "Reading timing models for corner $corner_name…"
|
|
@@ -326,14 +350,14 @@ proc read_pnr_libs {args} {
|
|
|
326
350
|
set corner_models $corner($corner_name)
|
|
327
351
|
foreach model $corner_models {
|
|
328
352
|
puts "Reading timing library for the '$corner_name' corner at '$model'…"
|
|
329
|
-
read_liberty -corner $corner_name $model
|
|
353
|
+
log_cmd read_liberty -corner $corner_name $model
|
|
330
354
|
}
|
|
331
355
|
|
|
332
356
|
if { [info exists ::env(EXTRA_LIBS) ] } {
|
|
333
357
|
puts "Reading explicitly-specified extra libs for $corner_name…"
|
|
334
358
|
foreach extra_lib $::env(EXTRA_LIBS) {
|
|
335
359
|
puts "Reading extra timing library for the '$corner_name' corner at '$extra_lib'…"
|
|
336
|
-
read_liberty -corner $corner_name $extra_lib
|
|
360
|
+
log_cmd read_liberty -corner $corner_name $extra_lib
|
|
337
361
|
}
|
|
338
362
|
}
|
|
339
363
|
}
|
|
@@ -343,7 +367,7 @@ proc read_tech_lef {{tlef_key "TECH_LEF"}} {
|
|
|
343
367
|
set tlef $::env($tlef_key)
|
|
344
368
|
|
|
345
369
|
puts "Reading technology LEF file at '$tlef'…"
|
|
346
|
-
read_lef $tlef
|
|
370
|
+
log_cmd read_lef $tlef
|
|
347
371
|
|
|
348
372
|
# Make fake I/O sites
|
|
349
373
|
if { [info exists ::env(PAD_FAKE_SITES)] } {
|
|
@@ -352,7 +376,7 @@ proc read_tech_lef {{tlef_key "TECH_LEF"}} {
|
|
|
352
376
|
set height [lindex $size 1]
|
|
353
377
|
|
|
354
378
|
puts "Making fake IO site $site_name…"
|
|
355
|
-
make_fake_io_site -name $site_name -width $width -height $height
|
|
379
|
+
log_cmd make_fake_io_site -name $site_name -width $width -height $height
|
|
356
380
|
}
|
|
357
381
|
}
|
|
358
382
|
}
|
|
@@ -360,24 +384,24 @@ proc read_tech_lef {{tlef_key "TECH_LEF"}} {
|
|
|
360
384
|
proc read_other_lefs {} {
|
|
361
385
|
foreach lef $::env(CELL_LEFS) {
|
|
362
386
|
puts "Reading cell LEF file at '$lef'…"
|
|
363
|
-
read_lef $lef
|
|
387
|
+
log_cmd read_lef $lef
|
|
364
388
|
}
|
|
365
389
|
if { [info exist ::env(MACRO_LEFS)] } {
|
|
366
390
|
foreach lef $::env(MACRO_LEFS) {
|
|
367
391
|
puts "Reading macro LEF file at '$lef'…"
|
|
368
|
-
read_lef $lef
|
|
392
|
+
log_cmd read_lef $lef
|
|
369
393
|
}
|
|
370
394
|
}
|
|
371
395
|
if { [info exist ::env(PAD_LEFS)] } {
|
|
372
396
|
foreach lef $::env(PAD_LEFS) {
|
|
373
397
|
puts "Reading gpio pad LEF file at '$lef'…"
|
|
374
|
-
read_lef $lef
|
|
398
|
+
log_cmd read_lef $lef
|
|
375
399
|
}
|
|
376
400
|
}
|
|
377
401
|
if { [info exist ::env(EXTRA_LEFS)] } {
|
|
378
402
|
foreach lef $::env(EXTRA_LEFS) {
|
|
379
403
|
puts "Reading extra LEF file at '$lef'…"
|
|
380
|
-
read_lef $lef
|
|
404
|
+
log_cmd read_lef $lef
|
|
381
405
|
}
|
|
382
406
|
}
|
|
383
407
|
}
|
|
@@ -398,7 +422,7 @@ proc read_current_odb {args} {
|
|
|
398
422
|
|
|
399
423
|
read_pnr_libs
|
|
400
424
|
puts "Reading OpenROAD database at '$::env(CURRENT_ODB)'…"
|
|
401
|
-
if { [ catch {read_db $::env(CURRENT_ODB)} errmsg ]} {
|
|
425
|
+
if { [ catch {log_cmd read_db $::env(CURRENT_ODB)} errmsg ]} {
|
|
402
426
|
puts stderr $errmsg
|
|
403
427
|
exit 1
|
|
404
428
|
}
|