librelane 2.4.0.dev7__tar.gz → 3.0.0.dev22__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of librelane might be problematic. Click here for more details.
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/PKG-INFO +1 -1
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/__main__.py +12 -15
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/common/__init__.py +1 -1
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/common/drc.py +88 -7
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/common/toolbox.py +1 -1
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/config/config.py +5 -1
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/config/flow.py +51 -66
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/config/pdk_compat.py +79 -2
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/config/preprocessor.py +1 -1
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/config/variable.py +2 -2
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/flows/classic.py +1 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/flows/flow.py +3 -6
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/flows/sequential.py +85 -40
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/plugins.py +1 -1
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/magic/common/read.tcl +2 -2
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/magic/gds/extras_mag.tcl +2 -2
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/diodes.py +2 -2
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/dpl.tcl +1 -1
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/grt.tcl +3 -3
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/io.tcl +163 -45
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/resizer.tcl +1 -40
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/set_global_connections.tcl +2 -2
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/set_power_nets.tcl +1 -1
- librelane-3.0.0.dev22/librelane/scripts/openroad/common/set_rc.tcl +194 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/cts.tcl +37 -6
- librelane-3.0.0.dev22/librelane/scripts/openroad/cut_rows.tcl +39 -0
- librelane-3.0.0.dev22/librelane/scripts/openroad/drt.tcl +88 -0
- librelane-3.0.0.dev22/librelane/scripts/openroad/dump_rc.tcl +105 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/fill.tcl +2 -2
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/floorplan.tcl +5 -3
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/gpl.tcl +7 -8
- librelane-3.0.0.dev22/librelane/scripts/openroad/gui.tcl +37 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/insert_buffer.tcl +2 -2
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/ioplacer.tcl +1 -2
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/irdrop.tcl +3 -3
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/pdn.tcl +17 -18
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/rcx.tcl +1 -1
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/repair_design.tcl +14 -7
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/repair_design_postgrt.tcl +13 -6
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/rsz_timing_postcts.tcl +13 -12
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +13 -12
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/sta/check_macro_instances.tcl +1 -1
- librelane-3.0.0.dev22/librelane/scripts/openroad/tapcell.tcl +32 -0
- librelane-2.4.0.dev7/librelane/scripts/openroad/gui.tcl → librelane-3.0.0.dev22/librelane/scripts/openroad/ungpl.tcl +9 -3
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/state/__init__.py +1 -1
- librelane-3.0.0.dev22/librelane/state/design_format.py +247 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/state/state.py +20 -21
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/steps/checker.py +12 -1
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/steps/common_variables.py +4 -4
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/steps/cvc_rv.py +1 -1
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/steps/klayout.py +14 -6
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/steps/magic.py +18 -2
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/steps/misc.py +1 -1
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/steps/odb.py +50 -31
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/steps/openroad.py +455 -128
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/steps/pyosys.py +20 -5
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/steps/step.py +17 -20
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/steps/tclstep.py +9 -7
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/steps/yosys.py +1 -1
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/pyproject.toml +1 -1
- librelane-2.4.0.dev7/librelane/scripts/openroad/common/set_rc.tcl +0 -75
- librelane-2.4.0.dev7/librelane/scripts/openroad/cut_rows.tcl +0 -24
- librelane-2.4.0.dev7/librelane/scripts/openroad/drt.tcl +0 -37
- librelane-2.4.0.dev7/librelane/scripts/openroad/tapcell.tcl +0 -25
- librelane-2.4.0.dev7/librelane/state/design_format.py +0 -195
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/Readme.md +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/__init__.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/__version__.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/common/cli.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/common/generic_dict.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/common/metrics/__init__.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/common/metrics/__main__.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/common/metrics/library.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/common/metrics/metric.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/common/metrics/util.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/common/misc.py +6 -6
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/common/ring_buffer.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/common/tcl.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/common/tpe.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/common/types.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/config/__init__.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/config/__main__.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/config/removals.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/container.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/env_info.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/examples/spm/config.yaml +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/examples/spm/pin_order.cfg +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/examples/spm/src/impl.sdc +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/examples/spm/src/signoff.sdc +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/examples/spm/src/spm.v +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/examples/spm/verify/spm_tb.v +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/examples/spm-user_project_wrapper/config.json +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/flows/__init__.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/flows/builtins.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/flows/cli.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/flows/misc.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/flows/optimizing.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/flows/synth_explore.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/logging/__init__.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/logging/logger.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/open_pdks_rev +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/py.typed +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/base.sdc +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/klayout/Readme.md +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/klayout/open_design.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/klayout/render.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/klayout/stream_out.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/klayout/xor.drc +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/magic/Readme.md +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/magic/def/antenna_check.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/magic/def/mag.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/magic/def/mag_gds.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/magic/drc.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/magic/extract_spice.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/magic/gds/drc_batch.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/magic/gds/erase_box.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/magic/gds/mag_with_pointers.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/magic/get_bbox.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/magic/lef/extras_maglef.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/magic/lef/maglef.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/magic/lef.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/magic/open.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/magic/wrapper.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/netgen/setup.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/apply_def_template.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/cell_frequency.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/check_antenna_properties.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/contextualize.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/defutil.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/eco_buffer.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/eco_diode.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/io_place.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/ioplace_parser/__init__.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/ioplace_parser/parse.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/lefutil.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/placers.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/power_utils.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/random_place.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/reader.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/remove_buffers.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/odbpy/wire_lengths.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/antenna_check.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/basic_mp.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/buffer_list.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/pdn_cfg.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/dpl.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/grt.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/sta/corner.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/openroad/write_views.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/pyosys/json_header.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/pyosys/synthesize.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/pyosys/ys_common.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/scripts/tclsh/hello.tcl +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/state/__main__.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/steps/__init__.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/steps/__main__.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/steps/netgen.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/steps/openroad_alerts.py +0 -0
- {librelane-2.4.0.dev7 → librelane-3.0.0.dev22}/librelane/steps/verilator.py +0 -0
|
@@ -85,28 +85,25 @@ def run(
|
|
|
85
85
|
|
|
86
86
|
for config_file in config_files:
|
|
87
87
|
if meta := Config.get_meta(config_file):
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
target_flow_desc = meta.flow or "Classic"
|
|
91
|
-
|
|
92
|
-
if isinstance(target_flow_desc, str):
|
|
93
|
-
if found := Flow.factory.get(target_flow_desc):
|
|
88
|
+
if isinstance(meta.flow, str):
|
|
89
|
+
if found := Flow.factory.get(meta.flow):
|
|
94
90
|
TargetFlow = found
|
|
95
91
|
else:
|
|
96
92
|
err(
|
|
97
93
|
f"Unknown flow '{meta.flow}' specified in configuration file's 'meta' object."
|
|
98
94
|
)
|
|
99
95
|
ctx.exit(1)
|
|
100
|
-
elif isinstance(
|
|
101
|
-
TargetFlow = SequentialFlow.make(
|
|
102
|
-
if meta.substituting_steps is not None
|
|
103
|
-
TargetFlow, SequentialFlow
|
|
104
|
-
):
|
|
96
|
+
elif isinstance(meta.flow, list):
|
|
97
|
+
TargetFlow = SequentialFlow.make(meta.flow)
|
|
98
|
+
if meta.substituting_steps is not None:
|
|
105
99
|
if meta.flow is None:
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
100
|
+
err("config_file has substituting_steps set with no flow.")
|
|
101
|
+
ctx.exit(1)
|
|
102
|
+
assert (
|
|
103
|
+
TargetFlow is not None
|
|
104
|
+
), "run() failed to properly deduce TargetFlow -- please file an issue"
|
|
105
|
+
if issubclass(TargetFlow, SequentialFlow):
|
|
106
|
+
TargetFlow = TargetFlow.Substitute(meta.substituting_steps) # type: ignore # Type checker is being rowdy with this one
|
|
110
107
|
|
|
111
108
|
if flow_name is not None:
|
|
112
109
|
if found := Flow.factory.get(flow_name):
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright 2020-
|
|
1
|
+
# Copyright 2020-2025 Efabless Corporation
|
|
2
2
|
#
|
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
# you may not use this file except in compliance with the License.
|
|
@@ -18,9 +18,19 @@ import shlex
|
|
|
18
18
|
from enum import IntEnum
|
|
19
19
|
from decimal import Decimal, InvalidOperation
|
|
20
20
|
from dataclasses import dataclass, field, asdict
|
|
21
|
-
from typing import List, Optional, Tuple, Dict
|
|
21
|
+
from typing import List, Optional, Tuple, Dict, Iterable
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
|
|
24
|
+
@dataclass
|
|
25
|
+
class BoundingBox(Iterable[Decimal]):
|
|
26
|
+
llx: Decimal
|
|
27
|
+
lly: Decimal
|
|
28
|
+
urx: Decimal
|
|
29
|
+
ury: Decimal
|
|
30
|
+
info: Optional[str] = None
|
|
31
|
+
|
|
32
|
+
def __iter__(self):
|
|
33
|
+
return iter([self.llx, self.lly, self.urx, self.ury])
|
|
24
34
|
|
|
25
35
|
|
|
26
36
|
@dataclass
|
|
@@ -54,6 +64,75 @@ class DRC:
|
|
|
54
64
|
module: str
|
|
55
65
|
violations: Dict[str, Violation]
|
|
56
66
|
|
|
67
|
+
@classmethod
|
|
68
|
+
def from_openroad(
|
|
69
|
+
Self,
|
|
70
|
+
report: io.TextIOWrapper,
|
|
71
|
+
module: str,
|
|
72
|
+
) -> Tuple["DRC", int]:
|
|
73
|
+
class State(IntEnum):
|
|
74
|
+
vio_type = 0
|
|
75
|
+
src = 1
|
|
76
|
+
bbox = 10
|
|
77
|
+
|
|
78
|
+
re_violation = re.compile(r"violation type: (?P<type>.*)$")
|
|
79
|
+
re_src = re.compile(r"srcs: (?P<src1>\S+)( (?P<src2>\S+))?")
|
|
80
|
+
re_bbox = re.compile(
|
|
81
|
+
r"bbox = \((?P<llx>\S+), (?P<lly>\S+)\) - \((?P<urx>\S+), (?P<ury>\S+)\) on Layer (?P<layer>\S+)"
|
|
82
|
+
)
|
|
83
|
+
bbox_count = 0
|
|
84
|
+
violations: Dict[str, Violation] = {}
|
|
85
|
+
state = State.vio_type
|
|
86
|
+
vio_type = src1 = src2 = lly = llx = urx = ury = ""
|
|
87
|
+
for line in report:
|
|
88
|
+
line = line.strip()
|
|
89
|
+
if line.strip() == "":
|
|
90
|
+
continue
|
|
91
|
+
if state == State.vio_type:
|
|
92
|
+
vio_match = re_violation.match(line)
|
|
93
|
+
assert (
|
|
94
|
+
vio_match is not None
|
|
95
|
+
), f"Error while parsing drc report file: Could not match violation line '{line}'"
|
|
96
|
+
vio_type = vio_match.group("type")
|
|
97
|
+
state = State.src
|
|
98
|
+
elif state == State.src:
|
|
99
|
+
src_match = re_src.match(line)
|
|
100
|
+
assert (
|
|
101
|
+
src_match is not None
|
|
102
|
+
), f"Error while parsing drc report file: Could not match source line '{line}'"
|
|
103
|
+
src1 = src_match.group("src1")
|
|
104
|
+
src2 = src_match.group("src2")
|
|
105
|
+
state = State.bbox
|
|
106
|
+
elif state == State.bbox:
|
|
107
|
+
bbox_match = re_bbox.match(line)
|
|
108
|
+
assert (
|
|
109
|
+
bbox_match is not None
|
|
110
|
+
), f"Error while parsing drc report file: Could not match bbox line '{line}'"
|
|
111
|
+
llx = bbox_match.group("llx")
|
|
112
|
+
lly = bbox_match.group("lly")
|
|
113
|
+
urx = bbox_match.group("urx")
|
|
114
|
+
ury = bbox_match.group("ury")
|
|
115
|
+
layer = bbox_match.group("layer")
|
|
116
|
+
bbox_count += 1
|
|
117
|
+
bounding_box = BoundingBox(
|
|
118
|
+
Decimal(llx),
|
|
119
|
+
Decimal(lly),
|
|
120
|
+
Decimal(urx),
|
|
121
|
+
Decimal(ury),
|
|
122
|
+
f"{src1} to {src2}",
|
|
123
|
+
)
|
|
124
|
+
violation = (layer, vio_type)
|
|
125
|
+
description = vio_type
|
|
126
|
+
if violations.get(vio_type) is not None:
|
|
127
|
+
violations[vio_type].bounding_boxes.append(bounding_box)
|
|
128
|
+
else:
|
|
129
|
+
violations[vio_type] = Violation(
|
|
130
|
+
[violation], description, [bounding_box]
|
|
131
|
+
)
|
|
132
|
+
state = State.vio_type
|
|
133
|
+
|
|
134
|
+
return (Self(module, violations), bbox_count)
|
|
135
|
+
|
|
57
136
|
@classmethod
|
|
58
137
|
def from_magic(
|
|
59
138
|
Self,
|
|
@@ -125,7 +204,7 @@ class DRC:
|
|
|
125
204
|
f"invalid bounding box at line {i}: bounding box has {len(coord_list)}/4 elements"
|
|
126
205
|
)
|
|
127
206
|
|
|
128
|
-
bounding_box
|
|
207
|
+
bounding_box = BoundingBox(
|
|
129
208
|
coord_list[0],
|
|
130
209
|
coord_list[1],
|
|
131
210
|
coord_list[2],
|
|
@@ -155,7 +234,7 @@ class DRC:
|
|
|
155
234
|
"Invalid syntax: 'box' command has less than 4 arguments"
|
|
156
235
|
)
|
|
157
236
|
lx, ly, ux, uy = components[0:4]
|
|
158
|
-
last_bounding_box = (
|
|
237
|
+
last_bounding_box = BoundingBox(
|
|
159
238
|
Decimal(lx) * cif_scale,
|
|
160
239
|
Decimal(ly) * cif_scale,
|
|
161
240
|
Decimal(ux) * cif_scale,
|
|
@@ -239,7 +318,9 @@ class DRC:
|
|
|
239
318
|
multiplicity.text = str(len(violation.bounding_boxes))
|
|
240
319
|
xf.write(cell, category, visited, multiplicity)
|
|
241
320
|
with xf.element("values"):
|
|
242
|
-
llx, lly, urx, ury = bounding_box
|
|
243
321
|
value = ET.Element("value")
|
|
244
|
-
value.text = f"polygon: ({llx},{lly};{urx},{lly};{urx},{ury};{llx},{ury})"
|
|
322
|
+
value.text = f"polygon: ({bounding_box.llx},{bounding_box.lly};{bounding_box.urx},{bounding_box.lly};{bounding_box.urx},{bounding_box.ury};{bounding_box.llx},{bounding_box.ury})"
|
|
323
|
+
xf.write(value)
|
|
324
|
+
value = ET.Element("value")
|
|
325
|
+
value.text = f"text: '{bounding_box.info}'"
|
|
245
326
|
xf.write(value)
|
|
@@ -91,7 +91,7 @@ class Toolbox(object):
|
|
|
91
91
|
corner.
|
|
92
92
|
:param views_by_corner: The mapping from (wild cards) of corner names to
|
|
93
93
|
views.
|
|
94
|
-
:param
|
|
94
|
+
:param timing_corner: An explicit override for the default corner. Must be a
|
|
95
95
|
fully qualified IPVT corner.
|
|
96
96
|
:returns: The created list
|
|
97
97
|
"""
|
|
@@ -166,7 +166,11 @@ class Meta:
|
|
|
166
166
|
|
|
167
167
|
version: int = 1
|
|
168
168
|
flow: Union[None, str, List[str]] = None
|
|
169
|
-
substituting_steps: Union[
|
|
169
|
+
substituting_steps: Union[
|
|
170
|
+
None,
|
|
171
|
+
Dict[str, Union[str, None]],
|
|
172
|
+
List[Tuple[str, Union[str, None]]],
|
|
173
|
+
] = None
|
|
170
174
|
step: Union[None, str] = None
|
|
171
175
|
librelane_version: Union[None, str] = __version__
|
|
172
176
|
|
|
@@ -53,44 +53,12 @@ pdk_variables = [
|
|
|
53
53
|
"The ground pin for the cells.",
|
|
54
54
|
pdk=True,
|
|
55
55
|
),
|
|
56
|
-
Variable(
|
|
57
|
-
"WIRE_LENGTH_THRESHOLD",
|
|
58
|
-
Optional[Decimal],
|
|
59
|
-
"A value above which wire lengths generate warnings.",
|
|
60
|
-
units="µm",
|
|
61
|
-
pdk=True,
|
|
62
|
-
),
|
|
63
56
|
Variable(
|
|
64
57
|
"TECH_LEFS",
|
|
65
58
|
Dict[str, Path],
|
|
66
59
|
"Map of corner patterns to to technology LEF files. A corner not matched here will not be supported by OpenRCX in the default flow.",
|
|
67
60
|
pdk=True,
|
|
68
61
|
),
|
|
69
|
-
Variable(
|
|
70
|
-
"GPIO_PADS_LEF",
|
|
71
|
-
Optional[List[Path]],
|
|
72
|
-
"Path(s) to GPIO pad LEF file(s).",
|
|
73
|
-
pdk=True,
|
|
74
|
-
),
|
|
75
|
-
Variable(
|
|
76
|
-
"GPIO_PADS_LEF_CORE_SIDE",
|
|
77
|
-
Optional[List[Path]],
|
|
78
|
-
"Path(s) to GPIO pad LEF file(s) as used for routing (?).",
|
|
79
|
-
pdk=True,
|
|
80
|
-
),
|
|
81
|
-
Variable(
|
|
82
|
-
"GPIO_PADS_VERILOG",
|
|
83
|
-
Optional[List[Path]],
|
|
84
|
-
"Path(s) to GPIO pad Verilog models.",
|
|
85
|
-
pdk=True,
|
|
86
|
-
),
|
|
87
|
-
Variable(
|
|
88
|
-
"GPIO_PAD_CELLS",
|
|
89
|
-
Optional[List[str]],
|
|
90
|
-
"A list of pad cell name prefixes.",
|
|
91
|
-
deprecated_names=[("GPIO_PADS_PREFIX", _prefix_to_wildcard)],
|
|
92
|
-
pdk=True,
|
|
93
|
-
),
|
|
94
62
|
Variable(
|
|
95
63
|
"PRIMARY_GDSII_STREAMOUT_TOOL",
|
|
96
64
|
str,
|
|
@@ -136,20 +104,6 @@ pdk_variables = [
|
|
|
136
104
|
pdk=True,
|
|
137
105
|
),
|
|
138
106
|
# Floorplanning
|
|
139
|
-
Variable(
|
|
140
|
-
"FP_TRACKS_INFO",
|
|
141
|
-
Path,
|
|
142
|
-
"A path to the a classic OpenROAD `.tracks` file. Used by the floorplanner to generate tracks.",
|
|
143
|
-
deprecated_names=["TRACKS_INFO_FILE"],
|
|
144
|
-
pdk=True,
|
|
145
|
-
),
|
|
146
|
-
Variable(
|
|
147
|
-
"FP_TAPCELL_DIST",
|
|
148
|
-
Decimal,
|
|
149
|
-
"The distance between tap cell columns.",
|
|
150
|
-
units="µm",
|
|
151
|
-
pdk=True,
|
|
152
|
-
),
|
|
153
107
|
Variable(
|
|
154
108
|
"FP_IO_HLAYER",
|
|
155
109
|
str,
|
|
@@ -190,16 +144,18 @@ scl_variables = [
|
|
|
190
144
|
pdk=True,
|
|
191
145
|
),
|
|
192
146
|
Variable(
|
|
193
|
-
"
|
|
147
|
+
"FILL_CELLS",
|
|
194
148
|
List[str],
|
|
195
149
|
"A list of cell names or wildcards of fill cells to be used in fill insertion.",
|
|
196
150
|
pdk=True,
|
|
151
|
+
deprecated_names=["FILL_CELL"],
|
|
197
152
|
),
|
|
198
153
|
Variable(
|
|
199
|
-
"
|
|
154
|
+
"DECAP_CELLS",
|
|
200
155
|
List[str],
|
|
201
156
|
"A list of cell names or wildcards of decap cells to be used in fill insertion.",
|
|
202
157
|
pdk=True,
|
|
158
|
+
deprecated_names=["DECAP_CELL"],
|
|
203
159
|
),
|
|
204
160
|
Variable(
|
|
205
161
|
"LIB",
|
|
@@ -348,20 +304,6 @@ scl_variables = [
|
|
|
348
304
|
"Defines a buffer port to be used by yosys during synthesis: in the format `{cell}/{input_port}/{output_port}`",
|
|
349
305
|
pdk=True,
|
|
350
306
|
),
|
|
351
|
-
Variable(
|
|
352
|
-
"WELLTAP_CELL",
|
|
353
|
-
str,
|
|
354
|
-
"Defines the cell used for tap insertion.",
|
|
355
|
-
pdk=True,
|
|
356
|
-
deprecated_names=["FP_WELLTAP_CELL"],
|
|
357
|
-
),
|
|
358
|
-
Variable(
|
|
359
|
-
"ENDCAP_CELL",
|
|
360
|
-
str,
|
|
361
|
-
"Defines so-called 'end-cap' cells- decap cells placed at either sides of a design.",
|
|
362
|
-
pdk=True,
|
|
363
|
-
deprecated_names=["FP_ENDCAP_CELL"],
|
|
364
|
-
),
|
|
365
307
|
# Placement
|
|
366
308
|
Variable(
|
|
367
309
|
"PLACE_SITE",
|
|
@@ -379,9 +321,23 @@ scl_variables = [
|
|
|
379
321
|
Variable(
|
|
380
322
|
"DIODE_CELL",
|
|
381
323
|
Optional[str],
|
|
382
|
-
"Defines a diode cell used to fix antenna violations, in the format {name}/{port}.",
|
|
324
|
+
"Defines a diode cell used to fix antenna violations, in the format {name}/{port}. If not defined, steps should not attempt to repair the antenna effect by inserting diode cells.",
|
|
383
325
|
pdk=True,
|
|
384
326
|
),
|
|
327
|
+
Variable(
|
|
328
|
+
"WELLTAP_CELL",
|
|
329
|
+
Optional[str],
|
|
330
|
+
"Defines the cell used for tap insertion. If not defined, steps should not attempt to insert welltap cells.",
|
|
331
|
+
pdk=True,
|
|
332
|
+
deprecated_names=["FP_WELLTAP_CELL"],
|
|
333
|
+
),
|
|
334
|
+
Variable(
|
|
335
|
+
"ENDCAP_CELL",
|
|
336
|
+
Optional[str],
|
|
337
|
+
"Defines the so-called 'end-cap' cell- class of decap cells placed at either sides of a design, if available.",
|
|
338
|
+
pdk=True,
|
|
339
|
+
deprecated_names=["FP_ENDCAP_CELL"],
|
|
340
|
+
),
|
|
385
341
|
]
|
|
386
342
|
option_variables = [
|
|
387
343
|
# Common
|
|
@@ -474,17 +430,46 @@ option_variables = [
|
|
|
474
430
|
"Specifies LIB files of pre-hardened macros used in the current design, used during timing analyses (and during parasitics-based STA as a fallback). These are loaded indiscriminately for all timing corners.",
|
|
475
431
|
),
|
|
476
432
|
Variable(
|
|
477
|
-
"
|
|
433
|
+
"EXTRA_GDS",
|
|
478
434
|
Optional[List[Path]],
|
|
479
435
|
"Specifies GDS files of pre-hardened macros used in the current design, used during tape-out.",
|
|
436
|
+
deprecated_names=["EXTRA_GDS_FILES"],
|
|
480
437
|
),
|
|
481
438
|
Variable(
|
|
482
|
-
"
|
|
439
|
+
"FALLBACK_SDC",
|
|
483
440
|
Path,
|
|
484
441
|
"A fallback SDC file for when a step-specific SDC file is not defined.",
|
|
485
|
-
deprecated_names=["BASE_SDC_FILE", "SDC_FILE"],
|
|
442
|
+
deprecated_names=["FALLBACK_SDC_FILE", "BASE_SDC_FILE", "SDC_FILE"],
|
|
486
443
|
default=Path(os.path.join(get_script_dir(), "base.sdc")),
|
|
487
444
|
),
|
|
488
445
|
]
|
|
489
446
|
|
|
447
|
+
__for_whenever_we_implement_padring = [
|
|
448
|
+
Variable(
|
|
449
|
+
"GPIO_PADS_LEF",
|
|
450
|
+
Optional[List[Path]],
|
|
451
|
+
"Path(s) to GPIO pad LEF file(s).",
|
|
452
|
+
pdk=True,
|
|
453
|
+
),
|
|
454
|
+
Variable(
|
|
455
|
+
"GPIO_PADS_LEF_CORE_SIDE",
|
|
456
|
+
Optional[List[Path]],
|
|
457
|
+
"Path(s) to GPIO pad LEF file(s) as used for routing (?).",
|
|
458
|
+
pdk=True,
|
|
459
|
+
),
|
|
460
|
+
Variable(
|
|
461
|
+
"GPIO_PADS_VERILOG",
|
|
462
|
+
Optional[List[Path]],
|
|
463
|
+
"Path(s) to GPIO pad Verilog models.",
|
|
464
|
+
pdk=True,
|
|
465
|
+
),
|
|
466
|
+
Variable(
|
|
467
|
+
"GPIO_PAD_CELLS",
|
|
468
|
+
Optional[List[str]],
|
|
469
|
+
"A list of pad cell name prefixes.",
|
|
470
|
+
deprecated_names=[("GPIO_PADS_PREFIX", _prefix_to_wildcard)],
|
|
471
|
+
pdk=True,
|
|
472
|
+
),
|
|
473
|
+
]
|
|
474
|
+
|
|
490
475
|
flow_common_variables = pdk_variables + scl_variables + option_variables
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright 2023 Efabless Corporation
|
|
1
|
+
# Copyright 2023-2025 Efabless Corporation
|
|
2
2
|
#
|
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
# you may not use this file except in compliance with the License.
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
import os
|
|
15
15
|
import re
|
|
16
16
|
from glob import glob
|
|
17
|
-
from typing import Any, List, Mapping
|
|
17
|
+
from typing import Any, Dict, List, Mapping
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
def migrate_old_config(config: Mapping[str, Any]) -> Dict[str, Any]:
|
|
@@ -214,6 +214,83 @@ def migrate_old_config(config: Mapping[str, Any]) -> Dict[str, Any]:
|
|
|
214
214
|
"max_ss_100C_1v60",
|
|
215
215
|
"max_ff_n40C_1v95",
|
|
216
216
|
]
|
|
217
|
+
|
|
218
|
+
# Code below adapted from OpenROAD Flow Scripts under the following license:
|
|
219
|
+
#
|
|
220
|
+
# BSD 3-Clause License
|
|
221
|
+
#
|
|
222
|
+
# Copyright (c) 2018-2023, The Regents of the University of California
|
|
223
|
+
# All rights reserved.
|
|
224
|
+
#
|
|
225
|
+
# Redistribution and use in source and binary forms, with or without
|
|
226
|
+
# modification, are permitted provided that the following conditions are met:
|
|
227
|
+
|
|
228
|
+
# * Redistributions of source code must retain the above copyright notice, this
|
|
229
|
+
# list of conditions and the following disclaimer.
|
|
230
|
+
#
|
|
231
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
232
|
+
# this list of conditions and the following disclaimer in the documentation
|
|
233
|
+
# and/or other materials provided with the distribution.
|
|
234
|
+
#
|
|
235
|
+
# * Neither the name of the copyright holder nor the names of its
|
|
236
|
+
# contributors may be used to endorse or promote products derived from
|
|
237
|
+
# this software without specific prior written permission.
|
|
238
|
+
#
|
|
239
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
240
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
241
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
242
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
243
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
244
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
245
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
246
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
247
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
248
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
249
|
+
|
|
250
|
+
# new["LAYERS_RC"] = {
|
|
251
|
+
# "*tt*": {
|
|
252
|
+
# "li1": {"res": 7.176e-02, "cap": 1.499e-04},
|
|
253
|
+
# "met1": {"res": 8.929e-04, "cap": 1.72375e-04},
|
|
254
|
+
# "met2": {"res": 8.929e-04, "cap": 1.36233e-04},
|
|
255
|
+
# "met3": {"res": 1.567e-04, "cap": 2.14962e-04},
|
|
256
|
+
# "met4": {"res": 1.567e-04, "cap": 1.54087e-04},
|
|
257
|
+
# "met5": {"res": 1.781e-05, "cap": 1.54087e-04},
|
|
258
|
+
# },
|
|
259
|
+
# "*ff*": {
|
|
260
|
+
# "li1": {"res": 0.050232, "cap": 0.00010493},
|
|
261
|
+
# "met1": {"res": 0.0006250299999999999, "cap": 0.0001206625},
|
|
262
|
+
# "met2": {"res": 0.0006250299999999999, "cap": 9.53631e-05},
|
|
263
|
+
# "met3": {
|
|
264
|
+
# "res": 0.00010968999999999999,
|
|
265
|
+
# "cap": 0.00015047339999999998,
|
|
266
|
+
# },
|
|
267
|
+
# "met4": {
|
|
268
|
+
# "res": 0.00010968999999999999,
|
|
269
|
+
# "cap": 0.00010786089999999998,
|
|
270
|
+
# },
|
|
271
|
+
# "met5": {"res": 1.2467e-05, "cap": 0.00010786089999999998},
|
|
272
|
+
# },
|
|
273
|
+
# "*ss*": {
|
|
274
|
+
# "li1": {"res": 0.09328800000000001, "cap": 0.00019487},
|
|
275
|
+
# "met1": {"res": 0.00116077, "cap": 0.00022408750000000002},
|
|
276
|
+
# "met2": {"res": 0.00116077, "cap": 0.0001771029},
|
|
277
|
+
# "met3": {"res": 0.00020370999999999999, "cap": 0.0002794506},
|
|
278
|
+
# "met4": {
|
|
279
|
+
# "res": 0.00020370999999999999,
|
|
280
|
+
# "cap": 0.00020031309999999998,
|
|
281
|
+
# },
|
|
282
|
+
# "met5": {"res": 2.3153e-05, "cap": 0.00020031309999999998},
|
|
283
|
+
# },
|
|
284
|
+
# }
|
|
285
|
+
# new["VIAS_RC"] = {
|
|
286
|
+
# "*": {
|
|
287
|
+
# "mcon": {"res": 9.249146e-3},
|
|
288
|
+
# "via": {"res": 4.5e-3},
|
|
289
|
+
# "via2": {"res": 3.368786e-3},
|
|
290
|
+
# "via3": {"res": 0.376635e-3},
|
|
291
|
+
# "via4": {"res": 0.00580e-3},
|
|
292
|
+
# }
|
|
293
|
+
# }
|
|
217
294
|
elif new["PDK"].startswith("gf180mcu"):
|
|
218
295
|
new["STA_CORNERS"] = [
|
|
219
296
|
"nom_tt_025C_5v00",
|
|
@@ -160,7 +160,7 @@ class Macro:
|
|
|
160
160
|
self, df: DesignFormat
|
|
161
161
|
) -> Union[None, Path, List[Path], Dict[str, List[Path]]]:
|
|
162
162
|
try:
|
|
163
|
-
return getattr(self, df.
|
|
163
|
+
return getattr(self, df.id)
|
|
164
164
|
except AttributeError:
|
|
165
165
|
return None
|
|
166
166
|
|
|
@@ -593,7 +593,7 @@ class Variable:
|
|
|
593
593
|
value=field_value,
|
|
594
594
|
explicitly_specified=explicitly_specified,
|
|
595
595
|
default=field_default,
|
|
596
|
-
validating_type=subtype,
|
|
596
|
+
validating_type=subtype, # type: ignore
|
|
597
597
|
permissive_typing=permissive_typing,
|
|
598
598
|
depth=depth + 1,
|
|
599
599
|
)
|
|
@@ -48,7 +48,7 @@ from deprecated.sphinx import deprecated
|
|
|
48
48
|
from librelane.common.types import Path
|
|
49
49
|
|
|
50
50
|
from ..config import Config, Variable, universal_flow_config_variables, AnyConfigs
|
|
51
|
-
from ..state import State, DesignFormat
|
|
51
|
+
from ..state import State, DesignFormat
|
|
52
52
|
from ..steps import Step, StepNotFound
|
|
53
53
|
from ..logging import (
|
|
54
54
|
LevelFilter,
|
|
@@ -804,14 +804,11 @@ class Flow(ABC):
|
|
|
804
804
|
}
|
|
805
805
|
|
|
806
806
|
def visitor(key, value, top_key, _, __):
|
|
807
|
-
df = DesignFormat.
|
|
807
|
+
df = DesignFormat.factory.get(top_key)
|
|
808
808
|
assert df is not None
|
|
809
809
|
if df not in supported_formats:
|
|
810
810
|
return
|
|
811
811
|
|
|
812
|
-
dfo = df.value
|
|
813
|
-
assert isinstance(dfo, DesignFormatObject)
|
|
814
|
-
|
|
815
812
|
subdirectory, extension = supported_formats[df]
|
|
816
813
|
|
|
817
814
|
target_dir = os.path.join(path, subdirectory)
|
|
@@ -837,7 +834,7 @@ class Flow(ABC):
|
|
|
837
834
|
return
|
|
838
835
|
|
|
839
836
|
target_basename = os.path.basename(str(value))
|
|
840
|
-
target_basename = target_basename[: -len(
|
|
837
|
+
target_basename = target_basename[: -len(df.extension)] + extension
|
|
841
838
|
target_path = os.path.join(target_dir, target_basename)
|
|
842
839
|
mkdirp(target_dir)
|
|
843
840
|
shutil.copyfile(value, target_path, follow_symlinks=True)
|