librelane 3.0.0.dev24__tar.gz → 3.0.0.dev26__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.dev24 → librelane-3.0.0.dev26}/PKG-INFO +1 -1
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/__init__.py +1 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/drc.py +1 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/misc.py +27 -5
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/types.py +2 -3
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/config/__main__.py +1 -1
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/config/variable.py +16 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm/config.yaml +8 -8
- librelane-3.0.0.dev26/librelane/examples/spm-user_project_wrapper/config.json +25 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/flow.py +89 -21
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/def/mag_gds.tcl +1 -2
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/drc.tcl +0 -1
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/gds/extras_mag.tcl +0 -2
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/gds/mag_with_pointers.tcl +0 -1
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/lef/extras_maglef.tcl +0 -2
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/lef/maglef.tcl +0 -1
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/wrapper.tcl +2 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/power_utils.py +8 -6
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/reader.py +2 -2
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/io.tcl +23 -11
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/pdn_cfg.tcl +36 -36
- librelane-3.0.0.dev26/librelane/scripts/openroad/ioplacer.tcl +67 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/pdn.tcl +1 -1
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/state/state.py +11 -3
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/__main__.py +1 -2
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/common_variables.py +82 -33
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/magic.py +24 -14
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/odb.py +15 -39
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/openroad.py +22 -44
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/step.py +22 -7
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/tclstep.py +1 -1
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/pyproject.toml +1 -1
- librelane-3.0.0.dev24/librelane/examples/spm-user_project_wrapper/config.json +0 -13
- librelane-3.0.0.dev24/librelane/scripts/openroad/ioplacer.tcl +0 -66
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/Readme.md +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/__init__.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/__main__.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/__version__.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/cli.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/generic_dict.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/metrics/__init__.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/metrics/__main__.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/metrics/library.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/metrics/metric.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/metrics/util.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/ring_buffer.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/tcl.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/toolbox.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/common/tpe.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/config/__init__.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/config/config.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/config/flow.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/config/pdk_compat.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/config/preprocessor.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/config/removals.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/container.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/env_info.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm/pin_order.cfg +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm/src/impl.sdc +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm/src/signoff.sdc +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm/src/spm.v +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm/verify/spm_tb.v +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/__init__.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/builtins.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/classic.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/cli.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/misc.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/optimizing.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/sequential.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/flows/synth_explore.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/logging/__init__.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/logging/logger.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/open_pdks_rev +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/plugins.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/py.typed +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/base.sdc +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/klayout/Readme.md +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/klayout/open_design.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/klayout/render.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/klayout/stream_out.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/klayout/xor.drc +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/Readme.md +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/common/read.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/def/antenna_check.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/def/mag.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/extract_spice.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/gds/drc_batch.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/gds/erase_box.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/get_bbox.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/lef.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/magic/open.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/netgen/setup.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/apply_def_template.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/cell_frequency.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/check_antenna_properties.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/contextualize.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/defutil.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/diodes.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/eco_buffer.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/eco_diode.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/io_place.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/ioplace_parser/__init__.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/ioplace_parser/parse.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/lefutil.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/placers.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/random_place.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/remove_buffers.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/odbpy/wire_lengths.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/antenna_check.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/basic_mp.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/buffer_list.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/dpl.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/grt.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/resizer.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/set_global_connections.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/set_power_nets.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/set_rc.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/cts.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/cut_rows.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/dpl.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/drt.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/dump_rc.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/fill.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/floorplan.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/gpl.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/grt.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/gui.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/insert_buffer.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/irdrop.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/rcx.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/repair_design.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/repair_design_postgrt.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/rsz_timing_postcts.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/sta/check_macro_instances.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/sta/corner.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/tapcell.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/ungpl.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/write_views.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/pyosys/json_header.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/pyosys/synthesize.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/pyosys/ys_common.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/tclsh/hello.tcl +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/state/__init__.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/state/__main__.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/state/design_format.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/__init__.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/checker.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/cvc_rv.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/klayout.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/misc.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/netgen.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/openroad_alerts.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/pyosys.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/verilator.py +0 -0
- {librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/steps/yosys.py +0 -0
|
@@ -11,16 +11,18 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
-
import
|
|
15
|
-
import glob
|
|
16
|
-
import gzip
|
|
14
|
+
import io
|
|
17
15
|
import os
|
|
18
|
-
import pathlib
|
|
19
16
|
import re
|
|
17
|
+
import glob
|
|
18
|
+
import gzip
|
|
20
19
|
import typing
|
|
20
|
+
import pathlib
|
|
21
|
+
import fnmatch
|
|
21
22
|
import unicodedata
|
|
22
23
|
from math import inf
|
|
23
24
|
from typing import (
|
|
25
|
+
IO,
|
|
24
26
|
Any,
|
|
25
27
|
Generator,
|
|
26
28
|
Iterable,
|
|
@@ -378,7 +380,7 @@ def _get_process_limit() -> int:
|
|
|
378
380
|
return int(os.getenv("_OPENLANE_MAX_CORES", os.cpu_count() or 1))
|
|
379
381
|
|
|
380
382
|
|
|
381
|
-
def gzopen(filename, mode="rt"):
|
|
383
|
+
def gzopen(filename: AnyPath, mode="rt") -> IO[Any]:
|
|
382
384
|
"""
|
|
383
385
|
This method (tries to?) emulate the gzopen from the Linux Standard Base,
|
|
384
386
|
specifically this part:
|
|
@@ -388,6 +390,11 @@ def gzopen(filename, mode="rt"):
|
|
|
388
390
|
for reading directly from the file without any decompression.
|
|
389
391
|
|
|
390
392
|
gzip.open does not have this behavior.
|
|
393
|
+
|
|
394
|
+
:param filename: The full path to the uncompressed or gzipped file.
|
|
395
|
+
:param mode: "r", "rb", "w", "wb", "x", "xb", "a" or "ab" for
|
|
396
|
+
binary mode, or "rt", "wt", "xt" or "at" for text mode.
|
|
397
|
+
:returns: An I/O wrapper that may very slightly based on the mode.
|
|
391
398
|
"""
|
|
392
399
|
try:
|
|
393
400
|
g = gzip.open(filename, mode=mode)
|
|
@@ -400,3 +407,18 @@ def gzopen(filename, mode="rt"):
|
|
|
400
407
|
except gzip.BadGzipFile:
|
|
401
408
|
g.close()
|
|
402
409
|
return open(filename, mode=mode)
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
def count_occurences(fp: io.TextIOWrapper, pattern: str = "") -> int:
|
|
413
|
+
"""
|
|
414
|
+
Counts the occurences of a certain string in a stream, line-by-line, without
|
|
415
|
+
necessarily loading the entire file into memory.
|
|
416
|
+
|
|
417
|
+
Equivalent to: ``grep -c 'pattern' <file>`` (but without regex support).
|
|
418
|
+
|
|
419
|
+
:param fp: the text stream
|
|
420
|
+
:param pattern: the substring to search for. if set to "", it will simply
|
|
421
|
+
count the lines in the file.
|
|
422
|
+
:returns: the number of matching lines
|
|
423
|
+
"""
|
|
424
|
+
return sum(pattern in line for line in fp)
|
|
@@ -16,6 +16,7 @@ import sys
|
|
|
16
16
|
import tempfile
|
|
17
17
|
from math import isfinite
|
|
18
18
|
from decimal import Decimal
|
|
19
|
+
from weakref import finalize
|
|
19
20
|
from collections import UserString
|
|
20
21
|
from typing import Any, Union, ClassVar, Tuple, Optional
|
|
21
22
|
|
|
@@ -112,6 +113,4 @@ class ScopedFile(Path):
|
|
|
112
113
|
super().__init__(self._ntf.name)
|
|
113
114
|
self._ntf.write(contents)
|
|
114
115
|
self._ntf.close()
|
|
115
|
-
|
|
116
|
-
def __del__(self):
|
|
117
|
-
os.unlink(self._ntf.name)
|
|
116
|
+
self._ntf_cleanup = finalize(self, os.unlink, self._ntf.name)
|
|
@@ -110,7 +110,7 @@ def create_config(
|
|
|
110
110
|
print("At least one source RTL file is required.", file=sys.stderr)
|
|
111
111
|
exit(1)
|
|
112
112
|
source_rtl_key = "VERILOG_FILES"
|
|
113
|
-
if not all(
|
|
113
|
+
if not all(file.endswith(".sv") or file.endswith(".v") for file in source_rtl):
|
|
114
114
|
print(
|
|
115
115
|
"Only Verilog/SystemVerilog files are supported by create-config.",
|
|
116
116
|
file=sys.stderr,
|
|
@@ -440,6 +440,9 @@ class Variable:
|
|
|
440
440
|
return_value = list()
|
|
441
441
|
raw = value
|
|
442
442
|
if isinstance(raw, list) or isinstance(raw, tuple):
|
|
443
|
+
if validating_type == List[Path]:
|
|
444
|
+
if any(isinstance(item, List) for item in raw):
|
|
445
|
+
Variable.__flatten_list(value)
|
|
443
446
|
pass
|
|
444
447
|
elif is_string(raw):
|
|
445
448
|
if not permissive_typing:
|
|
@@ -725,3 +728,16 @@ class Variable:
|
|
|
725
728
|
and self.type == rhs.type
|
|
726
729
|
and self.default == rhs.default
|
|
727
730
|
)
|
|
731
|
+
|
|
732
|
+
# Flatten list. Note: Must modify value, not return a new list.
|
|
733
|
+
@staticmethod
|
|
734
|
+
def __flatten_list(value: list):
|
|
735
|
+
new_list = []
|
|
736
|
+
for item in value:
|
|
737
|
+
if isinstance(item, list):
|
|
738
|
+
for sub_item in item:
|
|
739
|
+
new_list.append(sub_item)
|
|
740
|
+
else:
|
|
741
|
+
new_list.append(item)
|
|
742
|
+
|
|
743
|
+
value[:] = new_list
|
|
@@ -7,16 +7,16 @@ PNR_SDC_FILE: dir::src/impl.sdc
|
|
|
7
7
|
SIGNOFF_SDC_FILE: dir::src/signoff.sdc
|
|
8
8
|
|
|
9
9
|
# PDN
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
PDN_VOFFSET: 5
|
|
11
|
+
PDN_HOFFSET: 5
|
|
12
|
+
PDN_VWIDTH: 2
|
|
13
|
+
PDN_HWIDTH: 2
|
|
14
|
+
PDN_VPITCH: 30
|
|
15
|
+
PDN_HPITCH: 30
|
|
16
|
+
PDN_SKIPTRIM: true
|
|
17
17
|
|
|
18
18
|
# Pin Order
|
|
19
|
-
|
|
19
|
+
IO_PIN_ORDER_CFG: dir::pin_order.cfg
|
|
20
20
|
|
|
21
21
|
# Technology-Specific Configs
|
|
22
22
|
pdk::sky130*:
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"DESIGN_NAME": "SPM_example",
|
|
3
|
+
"VERILOG_FILES": [
|
|
4
|
+
"dir::./defines.v",
|
|
5
|
+
"dir::./SPM_example.v"
|
|
6
|
+
],
|
|
7
|
+
"CLOCK_PERIOD": 25,
|
|
8
|
+
"CLOCK_PORT": "wb_clk_i",
|
|
9
|
+
"CLOCK_NET": "SPM.clk",
|
|
10
|
+
"RT_MAX_LAYER": "met4",
|
|
11
|
+
"FP_SIZING": "absolute",
|
|
12
|
+
"VDD_NETS": [
|
|
13
|
+
"vccd1"
|
|
14
|
+
],
|
|
15
|
+
"GND_NETS": [
|
|
16
|
+
"vssd1"
|
|
17
|
+
],
|
|
18
|
+
"PDN_MULTILAYER": false,
|
|
19
|
+
"DIE_AREA": [
|
|
20
|
+
0,
|
|
21
|
+
0,
|
|
22
|
+
600,
|
|
23
|
+
600
|
|
24
|
+
]
|
|
25
|
+
}
|
|
@@ -375,7 +375,7 @@ class Flow(ABC):
|
|
|
375
375
|
self.progress_bar = FlowProgressBar(self.name)
|
|
376
376
|
|
|
377
377
|
@classmethod
|
|
378
|
-
def get_help_md(Self) -> str: # pragma: no cover
|
|
378
|
+
def get_help_md(Self, myst_anchors: bool = True) -> str: # pragma: no cover
|
|
379
379
|
"""
|
|
380
380
|
:returns: rendered Markdown help for this Flow
|
|
381
381
|
"""
|
|
@@ -383,10 +383,12 @@ class Flow(ABC):
|
|
|
383
383
|
if Self.__doc__:
|
|
384
384
|
doc_string = textwrap.dedent(Self.__doc__)
|
|
385
385
|
|
|
386
|
+
flow_anchor = f"(flow-{slugify(Self.__name__, lower=True)})="
|
|
387
|
+
|
|
386
388
|
result = (
|
|
387
389
|
textwrap.dedent(
|
|
388
390
|
f"""\
|
|
389
|
-
|
|
391
|
+
{flow_anchor * myst_anchors}
|
|
390
392
|
### {Self.__name__}
|
|
391
393
|
|
|
392
394
|
```{{eval-rst}}
|
|
@@ -426,7 +428,8 @@ class Flow(ABC):
|
|
|
426
428
|
for var in flow_config_vars:
|
|
427
429
|
units = var.units or ""
|
|
428
430
|
pdk_superscript = "<sup>PDK</sup>" if var.pdk else ""
|
|
429
|
-
|
|
431
|
+
var_anchor = f"{{#{var._get_docs_identifier(Self.__name__)}}}"
|
|
432
|
+
result += f"| `{var.name}`{var_anchor * myst_anchors} {pdk_superscript} | {var.type_repr_md()} | {var.desc_repr_md()} | `{var.default}` | {units} |\n"
|
|
430
433
|
result += "\n"
|
|
431
434
|
|
|
432
435
|
if len(Self.Steps):
|
|
@@ -438,10 +441,35 @@ class Flow(ABC):
|
|
|
438
441
|
name = step.name
|
|
439
442
|
else:
|
|
440
443
|
name = step.id
|
|
441
|
-
|
|
444
|
+
if myst_anchors:
|
|
445
|
+
result += (
|
|
446
|
+
f"* [`{step.id}`](./step_config_vars.md#{slugify(name)})\n"
|
|
447
|
+
)
|
|
448
|
+
else:
|
|
449
|
+
result += f"* {step.id}"
|
|
442
450
|
|
|
443
451
|
return result
|
|
444
452
|
|
|
453
|
+
@classmethod
|
|
454
|
+
def display_help(Self): # pragma: no cover
|
|
455
|
+
"""
|
|
456
|
+
Displays Markdown help for a given flow.
|
|
457
|
+
|
|
458
|
+
If in an IPython environment, it's rendered using ``IPython.display``.
|
|
459
|
+
Otherwise, it's rendered using ``rich.markdown``.
|
|
460
|
+
"""
|
|
461
|
+
try:
|
|
462
|
+
get_ipython() # type: ignore
|
|
463
|
+
|
|
464
|
+
import IPython.display
|
|
465
|
+
|
|
466
|
+
IPython.display.display(IPython.display.Markdown(Self.get_help_md()))
|
|
467
|
+
except NameError:
|
|
468
|
+
from ..logging import console
|
|
469
|
+
from rich.markdown import Markdown
|
|
470
|
+
|
|
471
|
+
console.log(Markdown(Self.get_help_md()))
|
|
472
|
+
|
|
445
473
|
def get_all_config_variables(self) -> List[Variable]:
|
|
446
474
|
"""
|
|
447
475
|
:returns: All configuration variables for this Flow, including
|
|
@@ -796,7 +824,6 @@ class Flow(ABC):
|
|
|
796
824
|
DesignFormat.POWERED_NETLIST: (os.path.join("verilog", "gl"), "v"),
|
|
797
825
|
DesignFormat.DEF: ("def", "def"),
|
|
798
826
|
DesignFormat.LEF: ("lef", "lef"),
|
|
799
|
-
DesignFormat.SDF: (os.path.join("sdf", "multicorner"), "sdf"),
|
|
800
827
|
DesignFormat.SPEF: (os.path.join("spef", "multicorner"), "spef"),
|
|
801
828
|
DesignFormat.LIB: (os.path.join("lib", "multicorner"), "lib"),
|
|
802
829
|
DesignFormat.GDS: ("gds", "gds"),
|
|
@@ -852,38 +879,67 @@ class Flow(ABC):
|
|
|
852
879
|
file_path, os.path.join(to_dir, file), follow_symlinks=True
|
|
853
880
|
)
|
|
854
881
|
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
882
|
+
def find_one(pattern):
|
|
883
|
+
result = glob.glob(pattern)
|
|
884
|
+
if len(result) == 0:
|
|
885
|
+
return None
|
|
886
|
+
return result[0]
|
|
887
|
+
|
|
888
|
+
signoff_dir = os.path.join(path, "signoff", self.config["DESIGN_NAME"])
|
|
889
|
+
openlane_signoff_dir = os.path.join(signoff_dir, "openlane-signoff")
|
|
890
|
+
mkdirp(openlane_signoff_dir)
|
|
859
891
|
|
|
860
|
-
|
|
892
|
+
## resolved.json
|
|
861
893
|
shutil.copyfile(
|
|
862
894
|
self.config_resolved_path,
|
|
863
|
-
os.path.join(
|
|
895
|
+
os.path.join(openlane_signoff_dir, "resolved.json"),
|
|
864
896
|
follow_symlinks=True,
|
|
865
897
|
)
|
|
866
898
|
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
899
|
+
## metrics
|
|
900
|
+
with open(os.path.join(signoff_dir, "metrics.csv"), "w", encoding="utf8") as f:
|
|
901
|
+
last_state.metrics_to_csv(f)
|
|
870
902
|
|
|
871
|
-
|
|
903
|
+
## flow logs
|
|
904
|
+
mkdirp(openlane_signoff_dir)
|
|
905
|
+
copy_dir_contents(self.run_dir, openlane_signoff_dir, "*.log")
|
|
906
|
+
|
|
907
|
+
### step-specific signoff logs and reports
|
|
872
908
|
for step in self.step_objects:
|
|
873
909
|
reports_dir = os.path.join(step.step_dir, "reports")
|
|
874
910
|
step_imp_id = step.get_implementation_id()
|
|
911
|
+
if step_imp_id == "Magic.DRC":
|
|
912
|
+
if drc_rpt := find_one(os.path.join(reports_dir, "*.rpt")):
|
|
913
|
+
shutil.copyfile(
|
|
914
|
+
drc_rpt, os.path.join(openlane_signoff_dir, "drc.rpt")
|
|
915
|
+
)
|
|
916
|
+
if drc_xml := find_one(os.path.join(reports_dir, "*.xml")):
|
|
917
|
+
# Despite the name, this is the Magic DRC report simply
|
|
918
|
+
# converted into a KLayout-compatible format. Confusing!
|
|
919
|
+
drc_xml_out = os.path.join(openlane_signoff_dir, "drc.klayout.xml")
|
|
920
|
+
with open(drc_xml, encoding="utf8") as i, open(
|
|
921
|
+
drc_xml_out, "w", encoding="utf8"
|
|
922
|
+
) as o:
|
|
923
|
+
o.write(
|
|
924
|
+
"<!-- Despite the name, this is the Magic DRC report in KLayout format. -->\n"
|
|
925
|
+
)
|
|
926
|
+
shutil.copyfileobj(i, o)
|
|
927
|
+
if step_imp_id == "Netgen.LVS":
|
|
928
|
+
if lvs_rpt := find_one(os.path.join(reports_dir, "*.rpt")):
|
|
929
|
+
shutil.copyfile(
|
|
930
|
+
lvs_rpt, os.path.join(openlane_signoff_dir, "lvs.rpt")
|
|
931
|
+
)
|
|
875
932
|
if step_imp_id.endswith("DRC") or step_imp_id.endswith("LVS"):
|
|
876
|
-
|
|
877
|
-
copy_dir_contents(reports_dir, signoff_folder)
|
|
878
|
-
if step_imp_id.endswith("LVS"):
|
|
879
|
-
copy_dir_contents(step.step_dir, signoff_folder, "*.log")
|
|
933
|
+
copy_dir_contents(step.step_dir, openlane_signoff_dir, "*.log")
|
|
880
934
|
if step_imp_id.endswith("CheckAntennas"):
|
|
881
935
|
if os.path.exists(reports_dir):
|
|
882
936
|
copy_dir_contents(
|
|
883
|
-
reports_dir,
|
|
937
|
+
reports_dir, openlane_signoff_dir, "antenna_summary.rpt"
|
|
884
938
|
)
|
|
885
939
|
if step_imp_id.endswith("STAPostPNR"):
|
|
886
|
-
timing_report_folder = os.path.join(
|
|
940
|
+
timing_report_folder = os.path.join(
|
|
941
|
+
openlane_signoff_dir, "timing-reports"
|
|
942
|
+
)
|
|
887
943
|
mkdirp(timing_report_folder)
|
|
888
944
|
copy_dir_contents(step.step_dir, timing_report_folder, "*summary.rpt")
|
|
889
945
|
for dir in os.listdir(step.step_dir):
|
|
@@ -894,6 +950,18 @@ class Flow(ABC):
|
|
|
894
950
|
mkdirp(target)
|
|
895
951
|
copy_dir_contents(dir_path, target, "*.rpt")
|
|
896
952
|
|
|
953
|
+
# 3. SDF
|
|
954
|
+
# (This one, as with many things in the Efabless format, is special)
|
|
955
|
+
if sdf := last_state[DesignFormat.SDF]:
|
|
956
|
+
assert isinstance(sdf, dict), "SDF is not a dictionary"
|
|
957
|
+
for corner, view in sdf.items():
|
|
958
|
+
assert isinstance(view, Path), "SDF state out returned multiple paths"
|
|
959
|
+
target_dir = os.path.join(signoff_dir, "sdf", corner)
|
|
960
|
+
mkdirp(target_dir)
|
|
961
|
+
shutil.copyfile(
|
|
962
|
+
view, os.path.join(target_dir, f"{self.config['DESIGN_NAME']}.sdf")
|
|
963
|
+
)
|
|
964
|
+
|
|
897
965
|
@deprecated(
|
|
898
966
|
version="2.0.0a46",
|
|
899
967
|
reason="Use .progress_bar.set_max_stage_count",
|
|
@@ -24,6 +24,7 @@ if { $::env(MAGIC_MACRO_STD_CELL_SOURCE) == "PDK" } {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
read_extra_gds
|
|
27
|
+
read_extra_lef
|
|
27
28
|
|
|
28
29
|
load (NEWCELL)
|
|
29
30
|
|
|
@@ -77,5 +78,3 @@ if { $::env(MAGIC_GDS_POLYGON_SUBCELLS) } {
|
|
|
77
78
|
|
|
78
79
|
gds write $::env(SAVE_MAG_GDS)
|
|
79
80
|
puts "\[INFO\] GDS Write Complete"
|
|
80
|
-
|
|
81
|
-
exit 0
|
|
@@ -17,7 +17,6 @@ import utl
|
|
|
17
17
|
|
|
18
18
|
import re
|
|
19
19
|
import json
|
|
20
|
-
import functools
|
|
21
20
|
from dataclasses import dataclass
|
|
22
21
|
from typing import Dict, List, Optional
|
|
23
22
|
|
|
@@ -49,11 +48,14 @@ class Design(object):
|
|
|
49
48
|
def get_verilog_net_name_by_bit(self, top_module: str, target_bit: int):
|
|
50
49
|
yosys_design_object = self.yosys_dict["modules"][top_module]
|
|
51
50
|
if top_module not in self.verilog_net_names_by_bit_by_module:
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
51
|
+
# check git history for a version of this loop that is drunk on power
|
|
52
|
+
netname_by_bit = {}
|
|
53
|
+
|
|
54
|
+
for netname, info in yosys_design_object["netnames"].items():
|
|
55
|
+
for bit in info["bits"]:
|
|
56
|
+
netname_by_bit[bit] = netname
|
|
57
|
+
|
|
58
|
+
self.verilog_net_names_by_bit_by_module[top_module] = netname_by_bit
|
|
57
59
|
return self.verilog_net_names_by_bit_by_module[top_module][target_bit]
|
|
58
60
|
|
|
59
61
|
def get_pins(self, module_name: str) -> Dict[str, odb.dbMTerm]:
|
|
@@ -20,7 +20,7 @@ import sys
|
|
|
20
20
|
import json
|
|
21
21
|
import locale
|
|
22
22
|
import inspect
|
|
23
|
-
import
|
|
23
|
+
from functools import wraps
|
|
24
24
|
from decimal import Decimal
|
|
25
25
|
from fnmatch import fnmatch
|
|
26
26
|
from typing import Callable, Dict
|
|
@@ -188,7 +188,7 @@ class OdbReader(object):
|
|
|
188
188
|
|
|
189
189
|
|
|
190
190
|
def click_odb(function):
|
|
191
|
-
@
|
|
191
|
+
@wraps(function)
|
|
192
192
|
def wrapper(input_db, input_lefs, config_path, **kwargs):
|
|
193
193
|
reader = OdbReader(input_db, config_path=config_path)
|
|
194
194
|
|
|
@@ -99,23 +99,35 @@ proc read_pdn_cfg {} {
|
|
|
99
99
|
|
|
100
100
|
# Compatibility Layer for Deprecated Variables That May Still Be Used By
|
|
101
101
|
# User Files
|
|
102
|
-
set
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
102
|
+
set unset_list {
|
|
103
|
+
DESIGN_IS_CORE
|
|
104
|
+
PDN_ENABLE_MACROS_GRID
|
|
105
|
+
PDN_RAILS_LAYER
|
|
106
|
+
PDN_UPPER_LAYER
|
|
107
|
+
PDN_LOWER_LAYER
|
|
108
|
+
}
|
|
109
|
+
set ::env(DESIGN_IS_CORE) $::env(PDN_MULTILAYER)
|
|
110
|
+
set ::env(PDN_ENABLE_MACROS_GRID) $::env(PDN_CONNECT_MACROS_TO_GRID)
|
|
111
|
+
set ::env(PDN_RAILS_LAYER) $::env(PDN_RAIL_LAYER)
|
|
112
|
+
set ::env(PDN_UPPER_LAYER) $::env(PDN_HORIZONTAL_LAYER)
|
|
113
|
+
set ::env(PDN_LOWER_LAYER) $::env(PDN_VERTICAL_LAYER)
|
|
114
|
+
foreach key [array names ::env] {
|
|
115
|
+
if { [string match PDN_* $key] } {
|
|
116
|
+
set fp_name FP_$key
|
|
117
|
+
lappend unset_list $fp_name
|
|
118
|
+
set ::env($fp_name) $::env($key)
|
|
119
|
+
}
|
|
120
|
+
}
|
|
107
121
|
|
|
108
|
-
if {[catch {source $::env(
|
|
122
|
+
if {[catch {source $::env(PDN_CFG)} errmsg]} {
|
|
109
123
|
puts stderr $errmsg
|
|
110
124
|
exit 1
|
|
111
125
|
}
|
|
112
126
|
|
|
113
127
|
# Restore Environment
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
unset ::env(FP_PDN_UPPER_LAYER)
|
|
118
|
-
unset ::env(FP_PDN_LOWER_LAYER)
|
|
128
|
+
foreach unsettable $unset_list {
|
|
129
|
+
unset ::env($unsettable)
|
|
130
|
+
}
|
|
119
131
|
}
|
|
120
132
|
|
|
121
133
|
|
{librelane-3.0.0.dev24 → librelane-3.0.0.dev26}/librelane/scripts/openroad/common/pdn_cfg.tcl
RENAMED
|
@@ -43,83 +43,83 @@ foreach vdd $::env(VDD_NETS) gnd $::env(GND_NETS) {
|
|
|
43
43
|
set_voltage_domain -name CORE -power $::env(VDD_NET) -ground $::env(GND_NET) \
|
|
44
44
|
-secondary_power $secondary
|
|
45
45
|
|
|
46
|
-
if { $::env(
|
|
46
|
+
if { $::env(PDN_MULTILAYER) == 1 } {
|
|
47
47
|
define_pdn_grid \
|
|
48
48
|
-name stdcell_grid \
|
|
49
49
|
-starts_with POWER \
|
|
50
50
|
-voltage_domain CORE \
|
|
51
|
-
-pins "$::env(
|
|
51
|
+
-pins "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)"
|
|
52
52
|
|
|
53
53
|
add_pdn_stripe \
|
|
54
54
|
-grid stdcell_grid \
|
|
55
|
-
-layer $::env(
|
|
56
|
-
-width $::env(
|
|
57
|
-
-pitch $::env(
|
|
58
|
-
-offset $::env(
|
|
59
|
-
-spacing $::env(
|
|
55
|
+
-layer $::env(PDN_VERTICAL_LAYER) \
|
|
56
|
+
-width $::env(PDN_VWIDTH) \
|
|
57
|
+
-pitch $::env(PDN_VPITCH) \
|
|
58
|
+
-offset $::env(PDN_VOFFSET) \
|
|
59
|
+
-spacing $::env(PDN_VSPACING) \
|
|
60
60
|
-starts_with POWER -extend_to_core_ring
|
|
61
61
|
|
|
62
62
|
add_pdn_stripe \
|
|
63
63
|
-grid stdcell_grid \
|
|
64
|
-
-layer $::env(
|
|
65
|
-
-width $::env(
|
|
66
|
-
-pitch $::env(
|
|
67
|
-
-offset $::env(
|
|
68
|
-
-spacing $::env(
|
|
64
|
+
-layer $::env(PDN_HORIZONTAL_LAYER) \
|
|
65
|
+
-width $::env(PDN_HWIDTH) \
|
|
66
|
+
-pitch $::env(PDN_HPITCH) \
|
|
67
|
+
-offset $::env(PDN_HOFFSET) \
|
|
68
|
+
-spacing $::env(PDN_HSPACING) \
|
|
69
69
|
-starts_with POWER -extend_to_core_ring
|
|
70
70
|
|
|
71
71
|
add_pdn_connect \
|
|
72
72
|
-grid stdcell_grid \
|
|
73
|
-
-layers "$::env(
|
|
73
|
+
-layers "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)"
|
|
74
74
|
} else {
|
|
75
75
|
define_pdn_grid \
|
|
76
76
|
-name stdcell_grid \
|
|
77
77
|
-starts_with POWER \
|
|
78
78
|
-voltage_domain CORE \
|
|
79
|
-
-pins $::env(
|
|
79
|
+
-pins $::env(PDN_VERTICAL_LAYER)
|
|
80
80
|
|
|
81
81
|
add_pdn_stripe \
|
|
82
82
|
-grid stdcell_grid \
|
|
83
|
-
-layer $::env(
|
|
84
|
-
-width $::env(
|
|
85
|
-
-pitch $::env(
|
|
86
|
-
-offset $::env(
|
|
87
|
-
-spacing $::env(
|
|
83
|
+
-layer $::env(PDN_VERTICAL_LAYER) \
|
|
84
|
+
-width $::env(PDN_VWIDTH) \
|
|
85
|
+
-pitch $::env(PDN_VPITCH) \
|
|
86
|
+
-offset $::env(PDN_VOFFSET) \
|
|
87
|
+
-spacing $::env(PDN_VSPACING) \
|
|
88
88
|
-starts_with POWER -extend_to_core_ring
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
# Adds the standard cell rails if enabled.
|
|
92
|
-
if { $::env(
|
|
92
|
+
if { $::env(PDN_ENABLE_RAILS) == 1 } {
|
|
93
93
|
add_pdn_stripe \
|
|
94
94
|
-grid stdcell_grid \
|
|
95
|
-
-layer $::env(
|
|
96
|
-
-width $::env(
|
|
95
|
+
-layer $::env(PDN_RAIL_LAYER) \
|
|
96
|
+
-width $::env(PDN_RAIL_WIDTH) \
|
|
97
97
|
-followpins
|
|
98
98
|
|
|
99
99
|
add_pdn_connect \
|
|
100
100
|
-grid stdcell_grid \
|
|
101
|
-
-layers "$::env(
|
|
101
|
+
-layers "$::env(PDN_RAIL_LAYER) $::env(PDN_VERTICAL_LAYER)"
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
|
|
105
105
|
# Adds the core ring if enabled.
|
|
106
|
-
if { $::env(
|
|
107
|
-
if { $::env(
|
|
106
|
+
if { $::env(PDN_CORE_RING) == 1 } {
|
|
107
|
+
if { $::env(PDN_MULTILAYER) == 1 } {
|
|
108
108
|
add_pdn_ring \
|
|
109
109
|
-allow_out_of_die \
|
|
110
110
|
-grid stdcell_grid \
|
|
111
|
-
-layers "$::env(
|
|
112
|
-
-widths "$::env(
|
|
113
|
-
-spacings "$::env(
|
|
114
|
-
-core_offset "$::env(
|
|
111
|
+
-layers "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)" \
|
|
112
|
+
-widths "$::env(PDN_CORE_RING_VWIDTH) $::env(PDN_CORE_RING_HWIDTH)" \
|
|
113
|
+
-spacings "$::env(PDN_CORE_RING_VSPACING) $::env(PDN_CORE_RING_HSPACING)" \
|
|
114
|
+
-core_offset "$::env(PDN_CORE_RING_VOFFSET) $::env(PDN_CORE_RING_HOFFSET)"
|
|
115
115
|
} else {
|
|
116
|
-
throw APPLICATION "
|
|
116
|
+
throw APPLICATION "PDN_CORE_RING cannot be used when PDN_MULTILAYER is set to false."
|
|
117
117
|
# add_pdn_ring \
|
|
118
118
|
# -grid stdcell_grid \
|
|
119
|
-
# -layers "$::env(
|
|
120
|
-
# -widths "$::env(
|
|
121
|
-
# -spacings "$::env(
|
|
122
|
-
# -core_offset "$::env(
|
|
119
|
+
# -layers "$::env(PDN_VERTICAL_LAYER)" \
|
|
120
|
+
# -widths "$::env(PDN_CORE_RING_VWIDTH)" \
|
|
121
|
+
# -spacings "$::env(PDN_CORE_RING_VSPACING)" \
|
|
122
|
+
# -core_offset "$::env(PDN_CORE_RING_VOFFSET)"
|
|
123
123
|
}
|
|
124
124
|
}
|
|
125
125
|
|
|
@@ -128,8 +128,8 @@ define_pdn_grid \
|
|
|
128
128
|
-default \
|
|
129
129
|
-name macro \
|
|
130
130
|
-starts_with POWER \
|
|
131
|
-
-halo "$::env(
|
|
131
|
+
-halo "$::env(PDN_HORIZONTAL_HALO) $::env(PDN_VERTICAL_HALO)"
|
|
132
132
|
|
|
133
133
|
add_pdn_connect \
|
|
134
134
|
-grid macro \
|
|
135
|
-
-layers "$::env(
|
|
135
|
+
-layers "$::env(PDN_VERTICAL_LAYER) $::env(PDN_HORIZONTAL_LAYER)"
|