librelane 3.0.0.dev40__tar.gz → 3.0.0.dev42__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-3.0.0.dev40 → librelane-3.0.0.dev42}/PKG-INFO +1 -1
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/__init__.py +1 -1
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/__main__.py +4 -1
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/common/tcl.py +2 -1
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/config/variable.py +20 -10
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/container.py +7 -4
- librelane-3.0.0.dev42/librelane/examples/hold_eco_demo/config.yaml +18 -0
- librelane-3.0.0.dev42/librelane/examples/hold_eco_demo/demo.v +27 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/flows/cli.py +24 -11
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/defutil.py +9 -3
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/eco_buffer.py +3 -2
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/eco_diode.py +3 -3
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/steps/__main__.py +3 -2
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/steps/checker.py +7 -8
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/steps/klayout.py +9 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/steps/misc.py +5 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/steps/odb.py +32 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/steps/openroad.py +0 -5
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/steps/pyosys.py +6 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/steps/yosys.py +9 -1
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/pyproject.toml +7 -1
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/Readme.md +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/__version__.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/common/__init__.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/common/cli.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/common/drc.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/common/generic_dict.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/common/metrics/__init__.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/common/metrics/__main__.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/common/metrics/library.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/common/metrics/metric.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/common/metrics/util.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/common/misc.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/common/ring_buffer.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/common/toolbox.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/common/tpe.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/common/types.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/config/__init__.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/config/__main__.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/config/config.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/config/flow.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/config/pdk_compat.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/config/preprocessor.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/config/removals.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/env_info.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/examples/spm/config.yaml +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/examples/spm/pin_order.cfg +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/examples/spm/src/impl.sdc +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/examples/spm/src/signoff.sdc +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/examples/spm/src/spm.v +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/examples/spm/verify/spm_tb.v +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/examples/spm-user_project_wrapper/config.json +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/flows/__init__.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/flows/builtins.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/flows/classic.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/flows/flow.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/flows/misc.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/flows/optimizing.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/flows/sequential.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/flows/synth_explore.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/help/__main__.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/logging/__init__.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/logging/logger.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/pdk_hashes.yaml +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/plugins.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/py.typed +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/base.sdc +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/klayout/Readme.md +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/klayout/open_design.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/klayout/render.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/klayout/stream_out.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/klayout/xor.drc +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/Readme.md +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/common/read.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/def/antenna_check.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/def/mag.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/def/mag_gds.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/drc.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/extract_spice.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/gds/drc_batch.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/gds/erase_box.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/gds/extras_mag.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/gds/mag_with_pointers.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/get_bbox.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/lef/extras_maglef.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/lef/maglef.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/lef.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/open.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/wrapper.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/netgen/setup.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/apply_def_template.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/cell_frequency.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/check_antenna_properties.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/contextualize.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/diodes.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/io_place.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/ioplace_parser/__init__.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/ioplace_parser/parse.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/lefutil.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/placers.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/power_utils.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/random_place.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/reader.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/remove_buffers.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/wire_lengths.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/antenna_check.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/basic_mp.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/buffer_list.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/dpl.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/grt.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/io.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/pdn_cfg.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/resizer.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/set_global_connections.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/set_power_nets.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/set_rc.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/cts.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/cut_rows.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/dpl.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/drt.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/dump_rc.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/fill.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/floorplan.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/gpl.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/grt.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/gui.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/insert_buffer.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/ioplacer.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/irdrop.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/pdn.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/rcx.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/repair_design.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/repair_design_postgrt.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/rsz_timing_postcts.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/sta/check_macro_instances.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/sta/corner.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/tapcell.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/ungpl.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/write_cdl.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/write_views.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/pyosys/json_header.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/pyosys/synthesize.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/pyosys/ys_common.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/tclsh/hello.tcl +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/state/__init__.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/state/__main__.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/state/design_format.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/state/state.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/steps/__init__.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/steps/common_variables.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/steps/cvc_rv.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/steps/magic.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/steps/netgen.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/steps/openroad_alerts.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/steps/step.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/steps/tclstep.py +0 -0
- {librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/steps/verilator.py +0 -0
|
@@ -217,7 +217,10 @@ def print_version(ctx: click.Context, param: click.Parameter, value: bool):
|
|
|
217
217
|
if len(discovered_plugins) > 0:
|
|
218
218
|
print("Discovered plugins:")
|
|
219
219
|
for name, module in discovered_plugins.items():
|
|
220
|
-
|
|
220
|
+
if hasattr(module, "__version__"):
|
|
221
|
+
print(f"{name} -> {module.__version__}")
|
|
222
|
+
else:
|
|
223
|
+
print(f"{name}")
|
|
221
224
|
|
|
222
225
|
ctx.exit(0)
|
|
223
226
|
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
# See the License for the specific language governing permissions and
|
|
17
17
|
# limitations under the License.
|
|
18
18
|
import re
|
|
19
|
-
import tkinter
|
|
20
19
|
from typing import Dict, Mapping, Any, Iterable
|
|
21
20
|
|
|
22
21
|
_env_rx = re.compile(r"(?:\:\:)?env\((\w+)\)")
|
|
@@ -59,6 +58,8 @@ class TclUtils(object):
|
|
|
59
58
|
|
|
60
59
|
@staticmethod
|
|
61
60
|
def _eval_env(env_in: Mapping[str, Any], tcl_in: str) -> Dict[str, Any]:
|
|
61
|
+
import tkinter
|
|
62
|
+
|
|
62
63
|
interpreter = tkinter.Tcl()
|
|
63
64
|
|
|
64
65
|
interpreter.eval("array unset ::env")
|
|
@@ -16,7 +16,6 @@ import inspect
|
|
|
16
16
|
from enum import Enum
|
|
17
17
|
from decimal import Decimal, InvalidOperation
|
|
18
18
|
from dataclasses import (
|
|
19
|
-
_MISSING_TYPE,
|
|
20
19
|
MISSING,
|
|
21
20
|
asdict,
|
|
22
21
|
dataclass,
|
|
@@ -24,6 +23,7 @@ from dataclasses import (
|
|
|
24
23
|
fields,
|
|
25
24
|
is_dataclass,
|
|
26
25
|
)
|
|
26
|
+
import types
|
|
27
27
|
from typing import (
|
|
28
28
|
ClassVar,
|
|
29
29
|
Dict,
|
|
@@ -219,7 +219,8 @@ class Macro:
|
|
|
219
219
|
|
|
220
220
|
def is_optional(t: Type[Any]) -> bool:
|
|
221
221
|
type_args = get_args(t)
|
|
222
|
-
|
|
222
|
+
origin = get_origin(t)
|
|
223
|
+
return (origin is Union or origin is types.UnionType) and type(None) in type_args
|
|
223
224
|
|
|
224
225
|
|
|
225
226
|
def some_of(t: Type[Any]) -> Type[Any]:
|
|
@@ -229,11 +230,20 @@ def some_of(t: Type[Any]) -> Type[Any]:
|
|
|
229
230
|
# t must be a Union with None if we're here
|
|
230
231
|
|
|
231
232
|
type_args = get_args(t)
|
|
233
|
+
origin = get_origin(t)
|
|
232
234
|
|
|
233
|
-
args_without_none = [arg for arg in type_args if arg
|
|
235
|
+
args_without_none = [arg for arg in type_args if arg is not type(None)]
|
|
234
236
|
if len(args_without_none) == 1:
|
|
235
237
|
return args_without_none[0]
|
|
236
238
|
|
|
239
|
+
if origin is types.UnionType:
|
|
240
|
+
# Use the | operator to create a UnionType
|
|
241
|
+
result = args_without_none[0]
|
|
242
|
+
for arg in args_without_none[1:]:
|
|
243
|
+
result = result | arg
|
|
244
|
+
return result
|
|
245
|
+
|
|
246
|
+
# Otherwise, return a typing.Union
|
|
237
247
|
new_union = Union[tuple(args_without_none)] # type: ignore
|
|
238
248
|
return new_union # type: ignore
|
|
239
249
|
|
|
@@ -440,7 +450,7 @@ class Variable:
|
|
|
440
450
|
return_value = list()
|
|
441
451
|
raw = value
|
|
442
452
|
if isinstance(raw, list) or isinstance(raw, tuple):
|
|
443
|
-
if type_origin
|
|
453
|
+
if type_origin is list and type_args == (str,):
|
|
444
454
|
if any(isinstance(item, List) for item in raw):
|
|
445
455
|
Variable.__flatten_list(value)
|
|
446
456
|
pass
|
|
@@ -462,7 +472,7 @@ class Variable:
|
|
|
462
472
|
f"List provided for variable '{key_path}' is invalid: {value}"
|
|
463
473
|
)
|
|
464
474
|
|
|
465
|
-
if type_origin
|
|
475
|
+
if type_origin is tuple:
|
|
466
476
|
if len(raw) != len(type_args):
|
|
467
477
|
raise ValueError(
|
|
468
478
|
f"Value provided for variable '{key_path}' of type {validating_type} is invalid: ({len(raw)}/{len(type_args)}) tuple entries provided"
|
|
@@ -481,11 +491,11 @@ class Variable:
|
|
|
481
491
|
)
|
|
482
492
|
)
|
|
483
493
|
|
|
484
|
-
if type_origin
|
|
494
|
+
if type_origin is tuple:
|
|
485
495
|
return tuple(return_value)
|
|
486
496
|
|
|
487
497
|
return return_value
|
|
488
|
-
elif type_origin
|
|
498
|
+
elif type_origin is dict:
|
|
489
499
|
raw = value
|
|
490
500
|
key_type, value_type = type_args
|
|
491
501
|
if isinstance(raw, dict):
|
|
@@ -586,7 +596,7 @@ class Variable:
|
|
|
586
596
|
field_default = None
|
|
587
597
|
if (
|
|
588
598
|
current_field.default is not None
|
|
589
|
-
and
|
|
599
|
+
and current_field.default != MISSING
|
|
590
600
|
):
|
|
591
601
|
field_default = current_field.default
|
|
592
602
|
if current_field.default_factory != MISSING:
|
|
@@ -615,7 +625,7 @@ class Variable:
|
|
|
615
625
|
result = Path(value)
|
|
616
626
|
result.validate(f"Path provided for variable '{key_path}' is invalid")
|
|
617
627
|
return result
|
|
618
|
-
elif validating_type
|
|
628
|
+
elif validating_type is bool:
|
|
619
629
|
if not permissive_typing and not isinstance(value, bool):
|
|
620
630
|
raise ValueError(
|
|
621
631
|
f"Refusing to automatically convert '{value}' at '{key_path}' to a Boolean"
|
|
@@ -629,7 +639,7 @@ class Variable:
|
|
|
629
639
|
f"Value provided for variable '{key_path}' of type {validating_type.__name__} is invalid: '{value}'"
|
|
630
640
|
)
|
|
631
641
|
elif issubclass(validating_type, Enum):
|
|
632
|
-
if type(value)
|
|
642
|
+
if type(value) is validating_type:
|
|
633
643
|
return value
|
|
634
644
|
try:
|
|
635
645
|
return validating_type[value]
|
|
@@ -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,7 @@ from cloup.typing import Decorator
|
|
|
43
43
|
|
|
44
44
|
from .flow import Flow
|
|
45
45
|
from ..common import set_tpe, cli, get_pdk_hash, _get_process_limit
|
|
46
|
-
from ..logging import set_log_level, verbose, err, options, LogLevels
|
|
46
|
+
from ..logging import set_log_level, verbose, info, err, options, LogLevels
|
|
47
47
|
from ..state import State, InvalidState
|
|
48
48
|
|
|
49
49
|
|
|
@@ -520,16 +520,29 @@ def cloup_flow_opts(
|
|
|
520
520
|
err(f"Could not resolve the PDK '{pdk}'.")
|
|
521
521
|
exit(1)
|
|
522
522
|
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
"
|
|
529
|
-
)
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
523
|
+
if pdk_family == "ihp-sg13g2":
|
|
524
|
+
err(
|
|
525
|
+
"The IHP Open PDK is only supported in the development version of LibreLane, specifically 3.0.0.dev28 or higher."
|
|
526
|
+
)
|
|
527
|
+
info(
|
|
528
|
+
"If you're using Nix, switch to the 'dev' branch. If you're using the Python package, run \"python3 -m pip install 'librelane>=3.0.0.dev28'\"."
|
|
529
|
+
)
|
|
530
|
+
exit(1)
|
|
531
|
+
|
|
532
|
+
try:
|
|
533
|
+
version = ciel.fetch(
|
|
534
|
+
ciel_home,
|
|
535
|
+
pdk_family,
|
|
536
|
+
opdks_rev,
|
|
537
|
+
data_source=StaticWebDataSource(
|
|
538
|
+
"https://fossi-foundation.github.io/ciel-releases"
|
|
539
|
+
),
|
|
540
|
+
include_libraries=include_libraries,
|
|
541
|
+
)
|
|
542
|
+
pdk_root = version.get_dir(ciel_home)
|
|
543
|
+
except ValueError as e:
|
|
544
|
+
err(f"Failed to download PDK: {e}")
|
|
545
|
+
exit(1)
|
|
533
546
|
|
|
534
547
|
return f(*args, pdk_root=pdk_root, pdk=pdk, scl=scl, **kwargs)
|
|
535
548
|
|
|
@@ -248,13 +248,19 @@ def relocate_pins(db, input_lefs, template_def, permissive, copy_def_power=False
|
|
|
248
248
|
pin_name = bterm.getName()
|
|
249
249
|
pin_net_name = bterm.getNet().getName()
|
|
250
250
|
pin_net = output_block.findNet(pin_net_name)
|
|
251
|
+
new_net_created = False
|
|
251
252
|
if pin_net is None:
|
|
252
253
|
pin_net = odb.dbNet.create(output_block, pin_net_name, True)
|
|
253
254
|
pin_net.setSpecial()
|
|
254
255
|
pin_net.setSigType(bterm.getSigType())
|
|
255
|
-
|
|
256
|
-
pin_bterm.
|
|
257
|
-
|
|
256
|
+
new_net_created = True
|
|
257
|
+
pin_bterm = output_block.findBTerm(pin_name)
|
|
258
|
+
if pin_bterm is None:
|
|
259
|
+
pin_bterm = odb.dbBTerm.create(pin_net, pin_name)
|
|
260
|
+
pin_bterm.setSigType(bterm.getSigType())
|
|
261
|
+
output_bterms.append(pin_bterm)
|
|
262
|
+
elif new_net_created:
|
|
263
|
+
pin_bterm.connect(pin_net)
|
|
258
264
|
|
|
259
265
|
grid_errors = False
|
|
260
266
|
for output_bterm in output_bterms:
|
|
@@ -43,8 +43,9 @@ def cli(reader):
|
|
|
43
43
|
grt_inc = GRT.IncrementalGRoute(grt, reader.block)
|
|
44
44
|
i = 0
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
eco_buffers = reader.config["INSERT_ECO_BUFFERS"] or []
|
|
47
|
+
for target_info in eco_buffers:
|
|
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"]
|
|
50
51
|
|
|
@@ -38,9 +38,9 @@ def cli(reader):
|
|
|
38
38
|
# print(grt)
|
|
39
39
|
grt_inc = GRT.IncrementalGRoute(grt, reader.block)
|
|
40
40
|
i = 0
|
|
41
|
-
|
|
42
|
-
for target_info in
|
|
43
|
-
target_name, target_pin = target_info["target"].
|
|
41
|
+
diodes = reader.config["INSERT_ECO_DIODES"] or []
|
|
42
|
+
for target_info in diodes:
|
|
43
|
+
target_name, target_pin = target_info["target"].split("/")
|
|
44
44
|
name_escaped = reader.escape_verilog_name(target_name)
|
|
45
45
|
|
|
46
46
|
target = reader.block.findInst(name_escaped)
|
|
@@ -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)
|
|
@@ -353,6 +353,15 @@ class XOR(KLayoutStep):
|
|
|
353
353
|
|
|
354
354
|
@Step.factory.register()
|
|
355
355
|
class DRC(KLayoutStep):
|
|
356
|
+
"""
|
|
357
|
+
Runs DRC using KLayout.
|
|
358
|
+
|
|
359
|
+
Unlike most steps, the KLayout scripts vary quite wildly by PDK. If a PDK
|
|
360
|
+
is not supported by this step, it will simply be skipped.
|
|
361
|
+
|
|
362
|
+
Currently, only sky130A and sky130B are supported.
|
|
363
|
+
"""
|
|
364
|
+
|
|
356
365
|
id = "KLayout.DRC"
|
|
357
366
|
name = "Design Rule Check (KLayout)"
|
|
358
367
|
|
|
@@ -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)"
|
|
@@ -184,6 +184,10 @@ class OdbpyStep(Step):
|
|
|
184
184
|
|
|
185
185
|
@Step.factory.register()
|
|
186
186
|
class CheckMacroAntennaProperties(OdbpyStep):
|
|
187
|
+
"""
|
|
188
|
+
Prints warnings if the LEF views of macros are missing antenna information.
|
|
189
|
+
"""
|
|
190
|
+
|
|
187
191
|
id = "Odb.CheckMacroAntennaProperties"
|
|
188
192
|
name = "Check Antenna Properties of Macros Pins in Their LEF Views"
|
|
189
193
|
inputs = OdbpyStep.inputs
|
|
@@ -221,6 +225,10 @@ class CheckMacroAntennaProperties(OdbpyStep):
|
|
|
221
225
|
|
|
222
226
|
@Step.factory.register()
|
|
223
227
|
class CheckDesignAntennaProperties(CheckMacroAntennaProperties):
|
|
228
|
+
"""
|
|
229
|
+
Prints warnings if the LEF view of the design is missing antenna information.
|
|
230
|
+
"""
|
|
231
|
+
|
|
224
232
|
id = "Odb.CheckDesignAntennaProperties"
|
|
225
233
|
name = "Check Antenna Properties of Pins in The Generated Design LEF view"
|
|
226
234
|
inputs = CheckMacroAntennaProperties.inputs + [DesignFormat.LEF]
|
|
@@ -527,6 +535,11 @@ class ReportDisconnectedPins(OdbpyStep):
|
|
|
527
535
|
|
|
528
536
|
@Step.factory.register()
|
|
529
537
|
class AddRoutingObstructions(OdbpyStep):
|
|
538
|
+
"""
|
|
539
|
+
Adds obstructions on metal layers which prevent shapes from being created in
|
|
540
|
+
the designated areas.
|
|
541
|
+
"""
|
|
542
|
+
|
|
530
543
|
id = "Odb.AddRoutingObstructions"
|
|
531
544
|
name = "Add Obstructions"
|
|
532
545
|
config_vars = [
|
|
@@ -569,6 +582,11 @@ class AddRoutingObstructions(OdbpyStep):
|
|
|
569
582
|
|
|
570
583
|
@Step.factory.register()
|
|
571
584
|
class RemoveRoutingObstructions(AddRoutingObstructions):
|
|
585
|
+
"""
|
|
586
|
+
Removes any routing obstructions previously placed by
|
|
587
|
+
<#Odb.AddRoutingObstructions>`_.
|
|
588
|
+
"""
|
|
589
|
+
|
|
572
590
|
id = "Odb.RemoveRoutingObstructions"
|
|
573
591
|
name = "Remove Obstructions"
|
|
574
592
|
|
|
@@ -578,6 +596,15 @@ class RemoveRoutingObstructions(AddRoutingObstructions):
|
|
|
578
596
|
|
|
579
597
|
@Step.factory.register()
|
|
580
598
|
class AddPDNObstructions(AddRoutingObstructions):
|
|
599
|
+
"""
|
|
600
|
+
Adds obstructions on metal layers which prevent shapes from being created in
|
|
601
|
+
the designated areas.
|
|
602
|
+
|
|
603
|
+
A soft-duplicate of <#Odb.AddRoutingObstructions>`_ , though this one uses
|
|
604
|
+
a different variable name so the obstructions can be restricted for PDN
|
|
605
|
+
steps only.
|
|
606
|
+
"""
|
|
607
|
+
|
|
581
608
|
id = "Odb.AddPDNObstructions"
|
|
582
609
|
name = "Add PDN obstructions"
|
|
583
610
|
|
|
@@ -595,6 +622,11 @@ class AddPDNObstructions(AddRoutingObstructions):
|
|
|
595
622
|
|
|
596
623
|
@Step.factory.register()
|
|
597
624
|
class RemovePDNObstructions(RemoveRoutingObstructions):
|
|
625
|
+
"""
|
|
626
|
+
Removes any PDN obstructions previously placed by
|
|
627
|
+
<#Odb.RemovePDNObstructions>`_.
|
|
628
|
+
"""
|
|
629
|
+
|
|
598
630
|
id = "Odb.RemovePDNObstructions"
|
|
599
631
|
name = "Remove PDN obstructions"
|
|
600
632
|
|
|
@@ -1518,11 +1518,6 @@ class GlobalPlacementSkipIO(_GlobalPlacement):
|
|
|
1518
1518
|
"Path to a custom pin configuration file.",
|
|
1519
1519
|
deprecated_names=["FP_PIN_ORDER_CFG"],
|
|
1520
1520
|
),
|
|
1521
|
-
Variable(
|
|
1522
|
-
"FP_DEF_TEMPLATE",
|
|
1523
|
-
Optional[Path],
|
|
1524
|
-
"Points to the DEF file to be used as a template.",
|
|
1525
|
-
),
|
|
1526
1521
|
]
|
|
1527
1522
|
|
|
1528
1523
|
def run(self, state_in: State, **kwargs) -> Tuple[ViewsUpdate, MetricsUpdate]:
|
|
@@ -327,6 +327,12 @@ class VerilogStep(PyosysStep):
|
|
|
327
327
|
|
|
328
328
|
@Step.factory.register()
|
|
329
329
|
class JsonHeader(VerilogStep):
|
|
330
|
+
"""
|
|
331
|
+
Extracts a high-level hierarchical view of the circuit in JSON format,
|
|
332
|
+
including power connections. The power connections are used in later steps
|
|
333
|
+
to ensure macros and cells are connected as desired.
|
|
334
|
+
"""
|
|
335
|
+
|
|
330
336
|
id = "Yosys.JsonHeader"
|
|
331
337
|
name = "Generate JSON Header"
|
|
332
338
|
long_name = "Generate JSON Header"
|
|
@@ -258,6 +258,14 @@ class YosysStep(TclStep):
|
|
|
258
258
|
|
|
259
259
|
@Step.factory.register()
|
|
260
260
|
class EQY(Step):
|
|
261
|
+
"""
|
|
262
|
+
Experimental: Uses the `EQY <https://github.com/yosyshq/eqy>`_ utility to
|
|
263
|
+
perform an RTL vs. Netlist equivalence check.
|
|
264
|
+
|
|
265
|
+
Currently, you are expected to provide your own EQY script if you want this
|
|
266
|
+
to work properly.
|
|
267
|
+
"""
|
|
268
|
+
|
|
261
269
|
id = "Yosys.EQY"
|
|
262
270
|
name = "Equivalence Check"
|
|
263
271
|
long_name = "RTL/Netlist Equivalence Check"
|
|
@@ -272,7 +280,7 @@ class EQY(Step):
|
|
|
272
280
|
Variable(
|
|
273
281
|
"EQY_SCRIPT",
|
|
274
282
|
Optional[Path],
|
|
275
|
-
"
|
|
283
|
+
"The EQY script to use. If unset, a generic EQY script will be generated, but this fails in a number of scenarios.",
|
|
276
284
|
),
|
|
277
285
|
Variable(
|
|
278
286
|
"MACRO_PLACEMENT_CFG",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "librelane"
|
|
3
|
-
version = "3.0.0.
|
|
3
|
+
version = "3.0.0.dev42"
|
|
4
4
|
description = "An infrastructure for implementing chip design flows"
|
|
5
5
|
maintainers = [
|
|
6
6
|
{name = "Mohamed Gaber", email = "me@donn.website"}
|
|
@@ -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 py310
|
|
73
|
+
# $ ruff check .
|
|
74
|
+
target-version = "py310"
|
|
75
|
+
lint.ignore = ["E", "F"]
|
|
76
|
+
|
|
71
77
|
[build-system]
|
|
72
78
|
requires = ["poetry-core>=2.0.0,<3"]
|
|
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
|
|
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-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/klayout/xml_drc_report_to_json.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/def/antenna_check.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
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/gds/mag_with_pointers.tcl
RENAMED
|
File without changes
|
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/magic/lef/extras_maglef.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/apply_def_template.py
RENAMED
|
File without changes
|
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/check_antenna_properties.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/disconnected_pins.py
RENAMED
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/filter_unannotated.py
RENAMED
|
File without changes
|
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/ioplace_parser/__init__.py
RENAMED
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/odbpy/ioplace_parser/parse.py
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
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/antenna_check.tcl
RENAMED
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/antenna_repair.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/dpl_cell_pad.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/pdn_cfg.tcl
RENAMED
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/resizer.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/set_power_nets.tcl
RENAMED
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/common/set_rc.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
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/insert_buffer.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/repair_design.tcl
RENAMED
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/repair_design_postgrt.tcl
RENAMED
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/rsz_timing_postcts.tcl
RENAMED
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/openroad/rsz_timing_postgrt.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-3.0.0.dev40 → librelane-3.0.0.dev42}/librelane/scripts/pyosys/construct_abc_script.py
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
|