librelane 3.0.0.dev23__tar.gz → 3.0.0.dev24__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.dev23 → librelane-3.0.0.dev24}/PKG-INFO +1 -1
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/config/__main__.py +1 -4
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/config/removals.py +1 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/config/variable.py +1 -1
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/reader.py +1 -1
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/common/io.tcl +15 -7
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/common/pdn_cfg.tcl +2 -2
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/common/set_global_connections.tcl +1 -1
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/drt.tcl +3 -5
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/floorplan.tcl +12 -4
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/sta/check_macro_instances.tcl +3 -3
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/sta/corner.tcl +8 -8
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/pyosys/json_header.py +1 -2
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/pyosys/synthesize.py +4 -4
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/pyosys/ys_common.py +9 -29
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/state/design_format.py +7 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/steps/odb.py +12 -3
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/steps/openroad.py +15 -3
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/steps/pyosys.py +14 -9
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/steps/yosys.py +16 -6
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/pyproject.toml +1 -1
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/Readme.md +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/__init__.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/__main__.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/__version__.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/common/__init__.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/common/cli.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/common/drc.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/common/generic_dict.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/common/metrics/__init__.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/common/metrics/__main__.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/common/metrics/library.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/common/metrics/metric.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/common/metrics/util.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/common/misc.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/common/ring_buffer.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/common/tcl.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/common/toolbox.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/common/tpe.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/common/types.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/config/__init__.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/config/config.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/config/flow.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/config/pdk_compat.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/config/preprocessor.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/container.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/env_info.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/examples/spm/config.yaml +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/examples/spm/pin_order.cfg +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/examples/spm/src/impl.sdc +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/examples/spm/src/signoff.sdc +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/examples/spm/src/spm.v +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/examples/spm/verify/spm_tb.v +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/examples/spm-user_project_wrapper/config.json +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/flows/__init__.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/flows/builtins.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/flows/classic.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/flows/cli.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/flows/flow.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/flows/misc.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/flows/optimizing.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/flows/sequential.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/flows/synth_explore.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/logging/__init__.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/logging/logger.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/open_pdks_rev +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/plugins.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/py.typed +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/base.sdc +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/klayout/Readme.md +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/klayout/open_design.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/klayout/render.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/klayout/stream_out.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/klayout/xor.drc +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/magic/Readme.md +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/magic/common/read.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/magic/def/antenna_check.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/magic/def/mag.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/magic/def/mag_gds.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/magic/drc.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/magic/extract_spice.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/magic/gds/drc_batch.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/magic/gds/erase_box.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/magic/gds/extras_mag.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/magic/gds/mag_with_pointers.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/magic/get_bbox.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/magic/lef/extras_maglef.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/magic/lef/maglef.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/magic/lef.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/magic/open.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/magic/wrapper.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/netgen/setup.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/apply_def_template.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/cell_frequency.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/check_antenna_properties.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/contextualize.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/defutil.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/diodes.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/eco_buffer.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/eco_diode.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/io_place.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/ioplace_parser/__init__.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/ioplace_parser/parse.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/lefutil.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/placers.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/power_utils.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/random_place.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/remove_buffers.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/odbpy/wire_lengths.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/antenna_check.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/basic_mp.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/buffer_list.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/common/dpl.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/common/grt.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/common/resizer.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/common/set_power_nets.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/common/set_rc.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/cts.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/cut_rows.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/dpl.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/dump_rc.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/fill.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/gpl.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/grt.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/gui.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/insert_buffer.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/ioplacer.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/irdrop.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/pdn.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/rcx.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/repair_design.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/repair_design_postgrt.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/rsz_timing_postcts.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/tapcell.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/ungpl.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/write_views.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/tclsh/hello.tcl +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/state/__init__.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/state/__main__.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/state/state.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/steps/__init__.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/steps/__main__.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/steps/checker.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/steps/common_variables.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/steps/cvc_rv.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/steps/klayout.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/steps/magic.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/steps/misc.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/steps/netgen.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/steps/openroad_alerts.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/steps/step.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/steps/tclstep.py +0 -0
- {librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/steps/verilator.py +0 -0
|
@@ -14,7 +14,6 @@
|
|
|
14
14
|
import os
|
|
15
15
|
import sys
|
|
16
16
|
import json
|
|
17
|
-
import functools
|
|
18
17
|
from decimal import Decimal
|
|
19
18
|
|
|
20
19
|
import click
|
|
@@ -111,9 +110,7 @@ def create_config(
|
|
|
111
110
|
print("At least one source RTL file is required.", file=sys.stderr)
|
|
112
111
|
exit(1)
|
|
113
112
|
source_rtl_key = "VERILOG_FILES"
|
|
114
|
-
if not
|
|
115
|
-
lambda acc, x: acc and (x.endswith(".sv") or x.endswith(".v")), source_rtl, True
|
|
116
|
-
):
|
|
113
|
+
if not all((file.endswith(".sv") or file.endswith(".v")) for file in source_rtl):
|
|
117
114
|
print(
|
|
118
115
|
"Only Verilog/SystemVerilog files are supported by create-config.",
|
|
119
116
|
file=sys.stderr,
|
|
@@ -575,7 +575,7 @@ class Variable:
|
|
|
575
575
|
kwargs_dict = {}
|
|
576
576
|
for current_field in fields(validating_type):
|
|
577
577
|
key = current_field.name
|
|
578
|
-
subtype = current_field.type
|
|
578
|
+
subtype: Type[Any] = current_field.type # type: ignore
|
|
579
579
|
explicitly_specified = False
|
|
580
580
|
if key in raw:
|
|
581
581
|
explicitly_specified = True
|
|
@@ -166,7 +166,7 @@ class OdbReader(object):
|
|
|
166
166
|
grt.setMinLayerForClock(min_clk_idx)
|
|
167
167
|
grt.setMaxLayerForClock(max_clk_idx)
|
|
168
168
|
grt.setMacroExtension(self.config["GRT_MACRO_EXTENSION"])
|
|
169
|
-
grt.
|
|
169
|
+
grt.setCongestionIterations(self.config["GRT_OVERFLOW_ITERS"])
|
|
170
170
|
grt.setAllowCongestion(self.config["GRT_ALLOW_CONGESTION"])
|
|
171
171
|
grt.setVerbose(True)
|
|
172
172
|
grt.initFastRoute(min_layer_idx, max_layer_idx)
|
|
@@ -174,9 +174,9 @@ proc read_timing_info {args} {
|
|
|
174
174
|
foreach nl $::env(_CURRENT_CORNER_NETLISTS) {
|
|
175
175
|
puts "Reading macro netlist at '$nl'…"
|
|
176
176
|
if { [catch {read_verilog $nl} err] } {
|
|
177
|
-
puts "Error while reading macro netlist '$nl':"
|
|
178
|
-
puts $err
|
|
179
|
-
puts "Make sure that this a gate-level netlist and not an RTL file."
|
|
177
|
+
puts stderr "Error while reading macro netlist '$nl':"
|
|
178
|
+
puts stderr $err
|
|
179
|
+
puts stderr "Make sure that this a gate-level netlist and not an RTL file."
|
|
180
180
|
exit 1
|
|
181
181
|
}
|
|
182
182
|
}
|
|
@@ -185,9 +185,9 @@ proc read_timing_info {args} {
|
|
|
185
185
|
if { [string_in_file $verilog_file $blackbox_wildcard] } {
|
|
186
186
|
puts "Found '$blackbox_wildcard' in '$verilog_file', skipping…"
|
|
187
187
|
} elseif { [catch {puts "Reading Verilog model at '$verilog_file'…"; read_verilog $verilog_file} err] } {
|
|
188
|
-
puts "Error while reading $verilog_file:"
|
|
189
|
-
puts $err
|
|
190
|
-
puts "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."
|
|
188
|
+
puts stderr "Error while reading $verilog_file:"
|
|
189
|
+
puts stderr $err
|
|
190
|
+
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."
|
|
191
191
|
exit 1
|
|
192
192
|
}
|
|
193
193
|
}
|
|
@@ -411,6 +411,13 @@ proc write_views {args} {
|
|
|
411
411
|
write_verilog $::env(SAVE_NL)
|
|
412
412
|
}
|
|
413
413
|
|
|
414
|
+
if { [info exists ::env(SAVE_LOGICAL_NL)] } {
|
|
415
|
+
puts "Writing logic-only netlist to '$::env(SAVE_LOGICAL_NL)'…"
|
|
416
|
+
write_verilog\
|
|
417
|
+
-remove_cells "[get_physical_cells]"\
|
|
418
|
+
$::env(SAVE_LOGICAL_NL)
|
|
419
|
+
}
|
|
420
|
+
|
|
414
421
|
if { [info exists ::env(SAVE_PNL)] } {
|
|
415
422
|
puts "Writing powered netlist to '$::env(SAVE_PNL)'…"
|
|
416
423
|
write_verilog -include_pwr_gnd $::env(SAVE_PNL)
|
|
@@ -575,7 +582,8 @@ proc get_layers {args} {
|
|
|
575
582
|
flags {-constrained}
|
|
576
583
|
|
|
577
584
|
if { ![info exists keys(-types)] } {
|
|
578
|
-
puts "\[ERROR\] Invalid usage of get_layers: -types is required."
|
|
585
|
+
puts stderr "\[ERROR\] Invalid usage of get_layers: -types is required."
|
|
586
|
+
return -code error
|
|
579
587
|
}
|
|
580
588
|
|
|
581
589
|
set layers [$::tech getLayers]
|
{librelane-3.0.0.dev23 → librelane-3.0.0.dev24}/librelane/scripts/openroad/common/pdn_cfg.tcl
RENAMED
|
@@ -94,8 +94,7 @@ if { $::env(FP_PDN_ENABLE_RAILS) == 1 } {
|
|
|
94
94
|
-grid stdcell_grid \
|
|
95
95
|
-layer $::env(FP_PDN_RAIL_LAYER) \
|
|
96
96
|
-width $::env(FP_PDN_RAIL_WIDTH) \
|
|
97
|
-
-followpins
|
|
98
|
-
-starts_with POWER
|
|
97
|
+
-followpins
|
|
99
98
|
|
|
100
99
|
add_pdn_connect \
|
|
101
100
|
-grid stdcell_grid \
|
|
@@ -107,6 +106,7 @@ if { $::env(FP_PDN_ENABLE_RAILS) == 1 } {
|
|
|
107
106
|
if { $::env(FP_PDN_CORE_RING) == 1 } {
|
|
108
107
|
if { $::env(FP_PDN_MULTILAYER) == 1 } {
|
|
109
108
|
add_pdn_ring \
|
|
109
|
+
-allow_out_of_die \
|
|
110
110
|
-grid stdcell_grid \
|
|
111
111
|
-layers "$::env(FP_PDN_VERTICAL_LAYER) $::env(FP_PDN_HORIZONTAL_LAYER)" \
|
|
112
112
|
-widths "$::env(FP_PDN_CORE_RING_VWIDTH) $::env(FP_PDN_CORE_RING_HWIDTH)" \
|
|
@@ -56,7 +56,7 @@ proc set_global_connections {} {
|
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
if { $matched != 1 } {
|
|
59
|
-
puts "\[ERROR\] No match found for regular expression '$instance_name' defined in PDN_MACRO_CONNECTIONS."
|
|
59
|
+
puts stderr "\[ERROR\] No match found for regular expression '$instance_name' defined in PDN_MACRO_CONNECTIONS."
|
|
60
60
|
exit_unless_gui 1
|
|
61
61
|
}
|
|
62
62
|
|
|
@@ -17,8 +17,8 @@ proc drt_run {i args} {
|
|
|
17
17
|
set output_drc "-output_drc $::env(STEP_DIR)/$directory/$::env(DESIGN_NAME).drc"
|
|
18
18
|
log_cmd detailed_route {*}$args {*}$output_drc
|
|
19
19
|
if { $::env(DRT_SAVE_SNAPSHOTS) } {
|
|
20
|
-
foreach snapshot [glob -nocomplain drt_iter*.odb] {
|
|
21
|
-
file rename -force $snapshot
|
|
20
|
+
foreach snapshot [glob -nocomplain $::env(STEP_DIR)/drt_iter*.odb] {
|
|
21
|
+
file rename -force $snapshot $::env(STEP_DIR)/$directory/[file tail $snapshot]
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
foreach drc_file [glob -nocomplain $::env(STEP_DIR)/$directory/*.drc] {
|
|
@@ -41,13 +41,11 @@ set max_layer $::env(RT_MAX_LAYER)
|
|
|
41
41
|
if { [info exists ::env(DRT_MAX_LAYER)] } {
|
|
42
42
|
set max_layer $::env(DRT_MAX_LAYER)
|
|
43
43
|
}
|
|
44
|
-
if { $::env(DRT_SAVE_SNAPSHOTS) } {
|
|
45
|
-
set_debug_level DRT snapshot 1
|
|
46
|
-
}
|
|
47
44
|
set drc_report_iter_step_arg ""
|
|
48
45
|
if { $::env(DRT_SAVE_SNAPSHOTS) } {
|
|
49
46
|
set_debug_level DRT snapshot 1
|
|
50
47
|
set drc_report_iter_step_arg "-drc_report_iter_step 1"
|
|
48
|
+
detailed_route_debug -snapshot_dir "$::env(STEP_DIR)/$directory"
|
|
51
49
|
}
|
|
52
50
|
if { [info exists ::env(DRT_SAVE_DRC_REPORT_ITERS)] } {
|
|
53
51
|
set drc_report_iter_step_arg "-drc_report_iter_step $::env(DRT_SAVE_DRC_REPORT_ITERS)"
|
|
@@ -33,10 +33,18 @@ puts "Using site height: $::default_site_height and site width: $::default_site_
|
|
|
33
33
|
|
|
34
34
|
unset_propagated_clock [all_clocks]
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
set
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
proc set_margin {var site_dimension mult} {
|
|
37
|
+
set value [expr $site_dimension * $mult]
|
|
38
|
+
if { $value < 0 } {
|
|
39
|
+
puts stderr "\[ERROR IFP-0013\] Negative values not allowed for margins."
|
|
40
|
+
exit_unless_gui 1
|
|
41
|
+
}
|
|
42
|
+
uplevel 1 set "$var $value"
|
|
43
|
+
}
|
|
44
|
+
set_margin bottom_margin $::default_site_height $::env(BOTTOM_MARGIN_MULT)
|
|
45
|
+
set_margin top_margin $::default_site_height $::env(TOP_MARGIN_MULT)
|
|
46
|
+
set_margin left_margin $::default_site_width $::env(LEFT_MARGIN_MULT)
|
|
47
|
+
set_margin right_margin $::default_site_width $::env(RIGHT_MARGIN_MULT)
|
|
40
48
|
|
|
41
49
|
set arg_list [list]
|
|
42
50
|
|
|
@@ -30,10 +30,10 @@ foreach {instance_name macro_name} $::env(_check_macro_instances) {
|
|
|
30
30
|
set instances [get_cells -hierarchical $instance_name]
|
|
31
31
|
set instance_count [llength $instances]
|
|
32
32
|
if { $instance_count < 1 } {
|
|
33
|
-
puts "\[ERROR\] No macro instance $instance_name found."
|
|
33
|
+
puts stderr "\[ERROR\] No macro instance $instance_name found."
|
|
34
34
|
incr error_count
|
|
35
35
|
} elseif { $instance_count > 1 } {
|
|
36
|
-
puts "\[ERROR\] Macro instance name $instance_name matches multiple cells."
|
|
36
|
+
puts stderr "\[ERROR\] Macro instance name $instance_name matches multiple cells."
|
|
37
37
|
incr error_count
|
|
38
38
|
} else {
|
|
39
39
|
# The next line doesn't actually matter because this is Tcl but I'd feel
|
|
@@ -42,7 +42,7 @@ foreach {instance_name macro_name} $::env(_check_macro_instances) {
|
|
|
42
42
|
|
|
43
43
|
set master_name [get_property $instance ref_name]
|
|
44
44
|
if { $master_name != $macro_name } {
|
|
45
|
-
puts "\[ERROR\] Instance $instance_name is configured as an instance of macro $macro_name, but is an instance of $master_name."
|
|
45
|
+
puts stderr "\[ERROR\] Instance $instance_name is configured as an instance of macro $macro_name, but is an instance of $master_name."
|
|
46
46
|
incr error_count
|
|
47
47
|
}
|
|
48
48
|
}
|
|
@@ -54,7 +54,7 @@ puts "\n========================================================================
|
|
|
54
54
|
puts "report_checks -path_delay min (Hold)"
|
|
55
55
|
puts "============================================================================"
|
|
56
56
|
puts "======================= [$corner name] Corner ===================================\n"
|
|
57
|
-
report_checks -sort_by_slack -path_delay min -fields {slew cap input
|
|
57
|
+
report_checks -sort_by_slack -path_delay min -fields {slew cap input net fanout} -format full_clock_expanded -group_path_count 1000 -corner [$corner name]
|
|
58
58
|
puts ""
|
|
59
59
|
puts "%OL_END_REPORT"
|
|
60
60
|
|
|
@@ -64,7 +64,7 @@ puts "\n========================================================================
|
|
|
64
64
|
puts "report_checks -path_delay max (Setup)"
|
|
65
65
|
puts "============================================================================"
|
|
66
66
|
puts "======================= [$corner name] Corner ===================================\n"
|
|
67
|
-
report_checks -sort_by_slack -path_delay max -fields {slew cap input
|
|
67
|
+
report_checks -sort_by_slack -path_delay max -fields {slew cap input net fanout} -format full_clock_expanded -group_path_count 1000 -corner [$corner name]
|
|
68
68
|
puts ""
|
|
69
69
|
puts "%OL_END_REPORT"
|
|
70
70
|
|
|
@@ -74,7 +74,7 @@ puts "\n========================================================================
|
|
|
74
74
|
puts "report_checks -unconstrained"
|
|
75
75
|
puts "==========================================================================="
|
|
76
76
|
puts "======================= [$corner name] Corner ===================================\n"
|
|
77
|
-
report_checks -unconstrained -fields {slew cap input
|
|
77
|
+
report_checks -unconstrained -fields {slew cap input net fanout} -format full_clock_expanded -corner [$corner name]
|
|
78
78
|
puts ""
|
|
79
79
|
|
|
80
80
|
|
|
@@ -82,7 +82,7 @@ puts "\n========================================================================
|
|
|
82
82
|
puts "report_checks --slack_max -0.01"
|
|
83
83
|
puts "============================================================================"
|
|
84
84
|
puts "======================= [$corner name] Corner ===================================\n"
|
|
85
|
-
report_checks -slack_max -0.01 -fields {slew cap input
|
|
85
|
+
report_checks -slack_max -0.01 -fields {slew cap input net fanout} -format full_clock_expanded -corner [$corner name]
|
|
86
86
|
puts ""
|
|
87
87
|
|
|
88
88
|
puts "\n==========================================================================="
|
|
@@ -260,7 +260,7 @@ if { [info exists ::env(STA_MAX_VIOLATOR_COUNT)] } {
|
|
|
260
260
|
set max_violator_count $::env(STA_MAX_VIOLATOR_COUNT)
|
|
261
261
|
}
|
|
262
262
|
|
|
263
|
-
set hold_violating_paths [find_timing_paths -unique_paths_to_endpoint -path_delay min -sort_by_slack -
|
|
263
|
+
set hold_violating_paths [find_timing_paths -unique_paths_to_endpoint -path_delay min -sort_by_slack -group_path_count $max_violator_count -slack_max 0]
|
|
264
264
|
foreach path $hold_violating_paths {
|
|
265
265
|
set start_pin [get_property $path startpoint]
|
|
266
266
|
set end_pin [get_property $path endpoint]
|
|
@@ -279,7 +279,7 @@ foreach path $hold_violating_paths {
|
|
|
279
279
|
}
|
|
280
280
|
|
|
281
281
|
set worst_r2r_hold_slack 1e30
|
|
282
|
-
set hold_paths [find_timing_paths -unique_paths_to_endpoint -path_delay min -sort_by_slack -
|
|
282
|
+
set hold_paths [find_timing_paths -unique_paths_to_endpoint -path_delay min -sort_by_slack -group_path_count $max_violator_count -slack_max $worst_r2r_hold_slack]
|
|
283
283
|
foreach path $hold_paths {
|
|
284
284
|
set start_pin [get_property $path startpoint]
|
|
285
285
|
set end_pin [get_property $path endpoint]
|
|
@@ -295,7 +295,7 @@ foreach path $hold_paths {
|
|
|
295
295
|
}
|
|
296
296
|
}
|
|
297
297
|
|
|
298
|
-
set setup_violating_paths [find_timing_paths -unique_paths_to_endpoint -path_delay max -sort_by_slack -
|
|
298
|
+
set setup_violating_paths [find_timing_paths -unique_paths_to_endpoint -path_delay max -sort_by_slack -group_path_count $max_violator_count -slack_max 0]
|
|
299
299
|
foreach path $setup_violating_paths {
|
|
300
300
|
set start_pin [get_property $path startpoint]
|
|
301
301
|
set end_pin [get_property $path endpoint]
|
|
@@ -314,7 +314,7 @@ foreach path $setup_violating_paths {
|
|
|
314
314
|
}
|
|
315
315
|
|
|
316
316
|
set worst_r2r_setup_slack 1e30
|
|
317
|
-
set setup_paths [find_timing_paths -unique_paths_to_endpoint -path_delay max -sort_by_slack -
|
|
317
|
+
set setup_paths [find_timing_paths -unique_paths_to_endpoint -path_delay max -sort_by_slack -group_path_count $max_violator_count -slack_max $worst_r2r_setup_slack]
|
|
318
318
|
foreach path $setup_paths {
|
|
319
319
|
set start_pin [get_property $path startpoint]
|
|
320
320
|
set end_pin [get_property $path endpoint]
|
|
@@ -62,8 +62,7 @@ def json_header(
|
|
|
62
62
|
synth_parameters=config["SYNTH_PARAMETERS"] or [],
|
|
63
63
|
includes=includes,
|
|
64
64
|
defines=defines,
|
|
65
|
-
|
|
66
|
-
synlig_defer=config["SYNLIG_DEFER"],
|
|
65
|
+
use_slang=config["USE_SLANG"],
|
|
67
66
|
)
|
|
68
67
|
d.run_pass(
|
|
69
68
|
"hierarchy",
|
|
@@ -262,8 +262,7 @@ def synthesize(
|
|
|
262
262
|
synth_parameters=[],
|
|
263
263
|
includes=includes,
|
|
264
264
|
defines=defines,
|
|
265
|
-
|
|
266
|
-
synlig_defer=False,
|
|
265
|
+
use_slang=False,
|
|
267
266
|
)
|
|
268
267
|
elif verilog_files := config.get("VERILOG_FILES"):
|
|
269
268
|
d.read_verilog_files(
|
|
@@ -272,8 +271,7 @@ def synthesize(
|
|
|
272
271
|
synth_parameters=config["SYNTH_PARAMETERS"] or [],
|
|
273
272
|
includes=includes,
|
|
274
273
|
defines=defines,
|
|
275
|
-
|
|
276
|
-
synlig_defer=config["SYNLIG_DEFER"],
|
|
274
|
+
use_slang=config["USE_SLANG"],
|
|
277
275
|
)
|
|
278
276
|
elif vhdl_files := config.get("VHDL_FILES"):
|
|
279
277
|
d.run_pass("plugin", "-i", "ghdl")
|
|
@@ -300,6 +298,8 @@ def synthesize(
|
|
|
300
298
|
)
|
|
301
299
|
except Exception:
|
|
302
300
|
pass
|
|
301
|
+
if config["SYNTH_NORMALIZE_SINGLE_BIT_VECTORS"]:
|
|
302
|
+
d.run_pass("attrmap", "-remove", "single_bit_vector")
|
|
303
303
|
d.run_pass("select", "-clear")
|
|
304
304
|
|
|
305
305
|
lib_arguments = []
|
|
@@ -50,48 +50,28 @@ def _Design_read_verilog_files(
|
|
|
50
50
|
synth_parameters: Iterable[str],
|
|
51
51
|
includes: Iterable[str],
|
|
52
52
|
defines: Iterable[str],
|
|
53
|
-
|
|
54
|
-
synlig_defer: bool = False,
|
|
53
|
+
use_slang: bool = False,
|
|
55
54
|
):
|
|
56
55
|
files = list(files) # for easier concatenation
|
|
57
56
|
include_args = [f"-I{dir}" for dir in includes]
|
|
58
57
|
define_args = [f"-D{define}" for define in defines]
|
|
59
58
|
chparams = {}
|
|
60
|
-
|
|
59
|
+
slang_chparam_args = []
|
|
61
60
|
for chparam in synth_parameters:
|
|
62
61
|
param, value = chparam.split("=", maxsplit=1) # validate
|
|
63
62
|
chparams[param] = value
|
|
64
|
-
|
|
63
|
+
slang_chparam_args.append(f"-G{param}={value}")
|
|
65
64
|
|
|
66
|
-
if
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
self.run_pass(
|
|
70
|
-
"read_systemverilog",
|
|
71
|
-
"-defer",
|
|
72
|
-
"-sverilog",
|
|
73
|
-
*define_args,
|
|
74
|
-
*include_args,
|
|
75
|
-
file,
|
|
76
|
-
)
|
|
77
|
-
self.run_pass(
|
|
78
|
-
"read_systemverilog",
|
|
79
|
-
"-link",
|
|
80
|
-
"-sverilog",
|
|
81
|
-
"-top",
|
|
82
|
-
top,
|
|
83
|
-
*synlig_chparam_args,
|
|
84
|
-
)
|
|
85
|
-
elif use_synlig:
|
|
86
|
-
self.run_pass("plugin", "-i", "synlig-sv")
|
|
65
|
+
ys.log("use_slang" if use_slang else "wtaf")
|
|
66
|
+
if use_slang:
|
|
67
|
+
self.run_pass("plugin", "-i", "slang")
|
|
87
68
|
self.run_pass(
|
|
88
|
-
"
|
|
89
|
-
"
|
|
90
|
-
"-top",
|
|
69
|
+
"read_slang",
|
|
70
|
+
"--top",
|
|
91
71
|
top,
|
|
92
72
|
*define_args,
|
|
93
73
|
*include_args,
|
|
94
|
-
*
|
|
74
|
+
*slang_chparam_args,
|
|
95
75
|
*files,
|
|
96
76
|
)
|
|
97
77
|
else:
|
|
@@ -157,6 +157,13 @@ DesignFormat(
|
|
|
157
157
|
alts=["NETLIST"],
|
|
158
158
|
).register()
|
|
159
159
|
|
|
160
|
+
DesignFormat(
|
|
161
|
+
"logical_nl",
|
|
162
|
+
"logical_nl.v",
|
|
163
|
+
"Logical cell-only Verilog Netlist",
|
|
164
|
+
folder_override="nl",
|
|
165
|
+
).register()
|
|
166
|
+
|
|
160
167
|
DesignFormat(
|
|
161
168
|
"pnl",
|
|
162
169
|
"pnl.v",
|
|
@@ -27,7 +27,7 @@ from ..config import Instance, Macro, Variable
|
|
|
27
27
|
from ..logging import info, verbose
|
|
28
28
|
from ..state import DesignFormat, State
|
|
29
29
|
|
|
30
|
-
from .openroad import DetailedPlacement, GlobalRouting
|
|
30
|
+
from .openroad import DetailedPlacement, GlobalRouting, OpenROADStep
|
|
31
31
|
from .openroad_alerts import OpenROADAlert, OpenROADOutputProcessor
|
|
32
32
|
from .common_variables import io_layer_variables, dpl_variables, grt_variables
|
|
33
33
|
from .step import (
|
|
@@ -52,6 +52,10 @@ class OdbpyStep(Step):
|
|
|
52
52
|
|
|
53
53
|
alerts: Optional[List[OpenROADAlert]] = None
|
|
54
54
|
|
|
55
|
+
@classmethod
|
|
56
|
+
def get_openroad_path(Self) -> str:
|
|
57
|
+
return OpenROADStep.get_openroad_path()
|
|
58
|
+
|
|
55
59
|
def on_alert(self, alert: OpenROADAlert) -> OpenROADAlert:
|
|
56
60
|
if alert.code in [
|
|
57
61
|
"ORD-0039", # .openroad ignored with -python
|
|
@@ -155,7 +159,7 @@ class OdbpyStep(Step):
|
|
|
155
159
|
lefs.append(str(design_lef))
|
|
156
160
|
return (
|
|
157
161
|
[
|
|
158
|
-
|
|
162
|
+
self.get_openroad_path(),
|
|
159
163
|
"-exit",
|
|
160
164
|
"-no_splash",
|
|
161
165
|
"-metrics",
|
|
@@ -946,7 +950,12 @@ class CellFrequencyTables(OdbpyStep):
|
|
|
946
950
|
lib_list = self.toolbox.filter_views(self.config, self.config["LIB"])
|
|
947
951
|
env_copy["_PNR_LIBS"] = TclStep.value_to_tcl(lib_list)
|
|
948
952
|
super().run_subprocess(
|
|
949
|
-
[
|
|
953
|
+
[
|
|
954
|
+
self.get_openroad_path(),
|
|
955
|
+
"-no_splash",
|
|
956
|
+
"-exit",
|
|
957
|
+
self.get_buffer_list_script(),
|
|
958
|
+
],
|
|
950
959
|
env=env_copy,
|
|
951
960
|
log_to=self.get_buffer_list_file(),
|
|
952
961
|
)
|
|
@@ -267,6 +267,10 @@ class OpenROADStep(TclStep):
|
|
|
267
267
|
),
|
|
268
268
|
]
|
|
269
269
|
|
|
270
|
+
@classmethod
|
|
271
|
+
def get_openroad_path(Self) -> str:
|
|
272
|
+
return os.getenv("_LLN_OVERRIDE_OPENROAD", "openroad")
|
|
273
|
+
|
|
270
274
|
@abstractmethod
|
|
271
275
|
def get_script_path(self) -> str:
|
|
272
276
|
pass
|
|
@@ -469,7 +473,7 @@ class OpenROADStep(TclStep):
|
|
|
469
473
|
def get_command(self) -> List[str]:
|
|
470
474
|
metrics_path = os.path.join(self.step_dir, "or_metrics_out.json")
|
|
471
475
|
return [
|
|
472
|
-
|
|
476
|
+
self.get_openroad_path(),
|
|
473
477
|
("-gui" if os.getenv("_OPENROAD_GUI", "0") == "1" else "-exit"),
|
|
474
478
|
"-no_splash",
|
|
475
479
|
"-metrics",
|
|
@@ -956,7 +960,7 @@ class STAPostPNR(STAPrePNR):
|
|
|
956
960
|
lefs.append(lef)
|
|
957
961
|
metrics_path = os.path.join(corner_dir, "filter_unannotated_metrics.json")
|
|
958
962
|
filter_unannotated_cmd = [
|
|
959
|
-
|
|
963
|
+
self.get_openroad_path(),
|
|
960
964
|
"-exit",
|
|
961
965
|
"-no_splash",
|
|
962
966
|
"-metrics",
|
|
@@ -1369,10 +1373,18 @@ class GeneratePDN(OpenROADStep):
|
|
|
1369
1373
|
info(f"'FP_PDN_CFG' not explicitly set, setting it to {env['FP_PDN_CFG']}…")
|
|
1370
1374
|
views_updates, metrics_updates = super().run(state_in, env=env, **kwargs)
|
|
1371
1375
|
|
|
1376
|
+
alerts = self.alerts or []
|
|
1372
1377
|
error_reports = glob(os.path.join(self.step_dir, "*-grid-errors.rpt"))
|
|
1373
1378
|
for report in error_reports:
|
|
1374
1379
|
net = os.path.basename(report).split("-", maxsplit=1)[0]
|
|
1375
|
-
|
|
1380
|
+
no_terminals = any(
|
|
1381
|
+
alert.code == "PSM-0025" and alert.message.startswith(net)
|
|
1382
|
+
for alert in alerts
|
|
1383
|
+
)
|
|
1384
|
+
if no_terminals:
|
|
1385
|
+
count = 1
|
|
1386
|
+
else:
|
|
1387
|
+
count = get_psm_error_count(open(report, encoding="utf8"))
|
|
1376
1388
|
metrics_updates[f"design__power_grid_violation__count__net:{net}"] = count
|
|
1377
1389
|
|
|
1378
1390
|
metric_updates_with_aggregates = aggregate_metrics(
|
|
@@ -122,16 +122,11 @@ verilog_rtl_cfg_vars = [
|
|
|
122
122
|
"Key-value pairs to be `chparam`ed in Yosys, in the format `key1=value1`.",
|
|
123
123
|
),
|
|
124
124
|
Variable(
|
|
125
|
-
"
|
|
125
|
+
"USE_SLANG",
|
|
126
126
|
bool,
|
|
127
|
-
"Use the
|
|
128
|
-
default=False,
|
|
129
|
-
),
|
|
130
|
-
Variable(
|
|
131
|
-
"SYNLIG_DEFER",
|
|
132
|
-
bool,
|
|
133
|
-
"Uses -defer flag when reading files the Synlig plugin, which may improve performance by reading each file separately, but is experimental.",
|
|
127
|
+
"Use the Slang frontend to process files, which has better SystemVerilog parsing capabilities but is not as battle-tested as the default Yosys friend.",
|
|
134
128
|
default=False,
|
|
129
|
+
deprecated_names=["USE_SYNLIG"],
|
|
135
130
|
),
|
|
136
131
|
]
|
|
137
132
|
|
|
@@ -216,6 +211,10 @@ class PyosysStep(Step):
|
|
|
216
211
|
),
|
|
217
212
|
]
|
|
218
213
|
|
|
214
|
+
@classmethod
|
|
215
|
+
def get_yosys_path(Self) -> str:
|
|
216
|
+
return os.getenv("_LLN_OVERRIDE_YOSYS", "yosys")
|
|
217
|
+
|
|
219
218
|
@abstractmethod
|
|
220
219
|
def get_script_path(self) -> str:
|
|
221
220
|
pass
|
|
@@ -223,7 +222,7 @@ class PyosysStep(Step):
|
|
|
223
222
|
def get_command(self, state_in: State) -> List[str]:
|
|
224
223
|
script_path = self.get_script_path()
|
|
225
224
|
# HACK: Get Colab working
|
|
226
|
-
yosys_bin =
|
|
225
|
+
yosys_bin = self.get_yosys_path()
|
|
227
226
|
if "google.colab" in sys.modules:
|
|
228
227
|
yosys_bin = shutil.which("yosys") or "yosys"
|
|
229
228
|
cmd = [yosys_bin, "-y", script_path]
|
|
@@ -497,6 +496,12 @@ class SynthesisCommon(VerilogStep):
|
|
|
497
496
|
"If true, Verilog-2001 attributes are omitted from output netlists. Some utilities do not support attributes.",
|
|
498
497
|
default=True,
|
|
499
498
|
),
|
|
499
|
+
Variable(
|
|
500
|
+
"SYNTH_NORMALIZE_SINGLE_BIT_VECTORS",
|
|
501
|
+
bool,
|
|
502
|
+
"If true, vectors with the shape [0:0] are converted to normal wires in the netlist. If disabled, even one-width pins will be suffixed [0] in the layout when imported by most PnR tools.",
|
|
503
|
+
default=True,
|
|
504
|
+
),
|
|
500
505
|
# Variable(
|
|
501
506
|
# "SYNTH_SDC_FILE",
|
|
502
507
|
# Optional[Path],
|
|
@@ -19,7 +19,13 @@ from typing import List, Literal, Optional, Set, Tuple
|
|
|
19
19
|
|
|
20
20
|
from .tclstep import TclStep
|
|
21
21
|
from .step import ViewsUpdate, MetricsUpdate, Step
|
|
22
|
-
from .pyosys import
|
|
22
|
+
from .pyosys import (
|
|
23
|
+
PyosysStep,
|
|
24
|
+
JsonHeader,
|
|
25
|
+
verilog_rtl_cfg_vars,
|
|
26
|
+
Synthesis,
|
|
27
|
+
VHDLSynthesis,
|
|
28
|
+
)
|
|
23
29
|
|
|
24
30
|
from ..config import Variable, Config
|
|
25
31
|
from ..state import State, DesignFormat
|
|
@@ -210,9 +216,17 @@ class YosysStep(TclStep):
|
|
|
210
216
|
),
|
|
211
217
|
]
|
|
212
218
|
|
|
219
|
+
@classmethod
|
|
220
|
+
def get_yosys_path(Self) -> str:
|
|
221
|
+
return PyosysStep.get_yosys_path()
|
|
222
|
+
|
|
223
|
+
@abstractmethod
|
|
224
|
+
def get_script_path(self) -> str:
|
|
225
|
+
pass
|
|
226
|
+
|
|
213
227
|
def get_command(self) -> List[str]:
|
|
214
228
|
script_path = self.get_script_path()
|
|
215
|
-
cmd = [
|
|
229
|
+
cmd = [self.get_yosys_path(), "-c", script_path]
|
|
216
230
|
if self.config["YOSYS_LOG_LEVEL"] != "ALL":
|
|
217
231
|
cmd += ["-Q"]
|
|
218
232
|
if self.config["YOSYS_LOG_LEVEL"] == "WARNING":
|
|
@@ -221,10 +235,6 @@ class YosysStep(TclStep):
|
|
|
221
235
|
cmd += ["-qq"]
|
|
222
236
|
return cmd
|
|
223
237
|
|
|
224
|
-
@abstractmethod
|
|
225
|
-
def get_script_path(self) -> str:
|
|
226
|
-
pass
|
|
227
|
-
|
|
228
238
|
def run(self, state_in: State, **kwargs) -> Tuple[ViewsUpdate, MetricsUpdate]:
|
|
229
239
|
power_defines = False
|
|
230
240
|
if "power_defines" in kwargs:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "librelane"
|
|
3
|
-
version = "3.0.0.
|
|
3
|
+
version = "3.0.0.dev24"
|
|
4
4
|
description = "An infrastructure for implementing chip design flows"
|
|
5
5
|
# Technically, maintainer. We cannot use the maintainers field until
|
|
6
6
|
# poetry-core>=2.0.0 which requires Python version 3.9+. This field does
|
|
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
|