librelane 3.1.0.dev4__tar.gz → 3.1.0.dev5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/PKG-INFO +7 -5
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/Readme.md +6 -4
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/config/variable.py +2 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/io.tcl +30 -24
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/gui.tcl +4 -4
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/sta/corner.tcl +3 -3
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/pyosys/synthesize.py +24 -3
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/pyosys.py +2 -2
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/step.py +8 -5
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/pyproject.toml +1 -1
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/__init__.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/__main__.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/__version__.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/__init__.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/cli.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/drc.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/generic_dict.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/metrics/__init__.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/metrics/__main__.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/metrics/compare.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/metrics/library.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/metrics/metric.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/metrics/util.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/misc.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/ring_buffer.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/tcl.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/toolbox.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/tpe.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/common/types.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/config/__init__.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/config/__main__.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/config/config.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/config/flow.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/config/pdk_compat.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/config/preprocessor.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/config/removals.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/container.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/env_info.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/hold_eco_demo/config.yaml +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/hold_eco_demo/demo.v +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm/config.yaml +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm/pin_order.cfg +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm/src/impl.sdc +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm/src/signoff.sdc +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm/src/spm.v +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm/verify/spm_tb.v +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/SPM_example.v +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/base_sdc_file.sdc +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/config-tut.json +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/config.json +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/defines.v +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/template.def +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/user_project_wrapper.v +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/__init__.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/builtins.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/chip.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/classic.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/cli.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/flow.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/misc.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/optimizing.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/sequential.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/flows/synth_explore.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/help/__main__.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/logging/__init__.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/logging/logger.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/pdk_hashes.yaml +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/plugins.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/py.typed +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/base.sdc +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/klayout/Readme.md +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/klayout/insert_cell.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/klayout/open_design.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/klayout/render.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/klayout/stream_out.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/klayout/xml_drc_report_to_json.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/klayout/xor.drc +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/Readme.md +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/common/read.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/def/antenna_check.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/def/mag.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/def/mag_gds.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/drc.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/extract_spice.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/gds/drc_batch.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/gds/erase_box.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/gds/extras_mag.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/gds/mag_with_pointers.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/get_bbox.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/lef/extras_maglef.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/lef/maglef.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/lef.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/open.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/spice_rcx.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/wrapper.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/netgen/setup.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/apply_def_template.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/cell_frequency.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/check_antenna_properties.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/contextualize.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/defutil.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/diodes.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/disconnected_pins.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/eco_buffer.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/eco_diode.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/filter_unannotated.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/io_place.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/ioplace_parser/__init__.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/ioplace_parser/parse.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/label_macro_pins.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/lefutil.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/placers.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/power_utils.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/random_place.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/reader.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/remove_buffers.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/snap_to_grid.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/wire_lengths.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/antenna_check.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/antenna_repair.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/buffer_list.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/dpl.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/dpl_cell_pad.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/grt.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/pad_cfg.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/pdn_cfg.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/resizer.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_global_connections.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_layer_adjustments.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_power_nets.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_rc.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_routing_layers.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/cts.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/cut_rows.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/dpl.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/drt.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/dump_rc.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/fill.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/floorplan.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/gpl.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/grt.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/insert_buffer.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/ioplacer.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/irdrop.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/pad.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/pdn.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/rcx.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/repair_design.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/repair_design_postgrt.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/rsz_timing_postcts.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/rsz_timing_postgrt.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/sta/check_macro_instances.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/tapcell.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/ungpl.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/write_cdl.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/write_views.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/pyosys/construct_abc_script.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/pyosys/json_header.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/pyosys/ys_common.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/tclsh/hello.tcl +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/state/__init__.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/state/__main__.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/state/design_format.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/state/state.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/__init__.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/__main__.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/checker.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/common_variables.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/klayout.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/magic.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/misc.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/netgen.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/odb.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/openroad.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/openroad_alerts.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/tclstep.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/verilator.py +0 -0
- {librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/steps/yosys.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: librelane
|
|
3
|
-
Version: 3.1.0.
|
|
3
|
+
Version: 3.1.0.dev5
|
|
4
4
|
Summary: An infrastructure for implementing chip design flows
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Maintainer: Mohamed Gaber
|
|
@@ -80,7 +80,7 @@ LibreLane includes two reference flows (`Classic` and `Chip`) that are built
|
|
|
80
80
|
entirely using open-source EDA tools.
|
|
81
81
|
|
|
82
82
|
You can find the documentation
|
|
83
|
-
[here](https://librelane.readthedocs.io/en/
|
|
83
|
+
[here](https://librelane.readthedocs.io/en/stable/getting_started/) to get
|
|
84
84
|
started. You can discuss LibreLane in the
|
|
85
85
|
[FOSSi Chat Matrix Server](https://fossi-chat.org).
|
|
86
86
|
|
|
@@ -121,7 +121,7 @@ Works for macOS and Linux (x86-64 and aarch64). Recommended, as it is more
|
|
|
121
121
|
integrated with your filesystem and overall has less upload and download deltas.
|
|
122
122
|
|
|
123
123
|
See
|
|
124
|
-
[Nix-based installation](https://librelane.readthedocs.io/en/
|
|
124
|
+
[Nix-based installation](https://librelane.readthedocs.io/en/stable/installation/nix_installation/index.html)
|
|
125
125
|
in the docs for more info.
|
|
126
126
|
|
|
127
127
|
### Docker
|
|
@@ -129,7 +129,7 @@ in the docs for more info.
|
|
|
129
129
|
Works for Windows, macOS and Linux (x86-64 and aarch64).
|
|
130
130
|
|
|
131
131
|
See
|
|
132
|
-
[Docker-based installation](https://librelane.readthedocs.io/en/
|
|
132
|
+
[Docker-based installation](https://librelane.readthedocs.io/en/stable/installation/docker_installation/index.html)
|
|
133
133
|
in the docs for more info.
|
|
134
134
|
|
|
135
135
|
Do note you'll need to add `--dockerized` right after `librelane` in most CLI
|
|
@@ -145,7 +145,9 @@ python3 -m pip install --upgrade librelane
|
|
|
145
145
|
```
|
|
146
146
|
|
|
147
147
|
Python-only installations are presently unsupported and entirely at your own
|
|
148
|
-
risk
|
|
148
|
+
risk, but you may consult
|
|
149
|
+
[Manual installation](https://librelane.readthedocs.io/en/stable/installation/manual_installation/index.html)
|
|
150
|
+
in the docs for more info.
|
|
149
151
|
|
|
150
152
|
## Usage
|
|
151
153
|
|
|
@@ -45,7 +45,7 @@ LibreLane includes two reference flows (`Classic` and `Chip`) that are built
|
|
|
45
45
|
entirely using open-source EDA tools.
|
|
46
46
|
|
|
47
47
|
You can find the documentation
|
|
48
|
-
[here](https://librelane.readthedocs.io/en/
|
|
48
|
+
[here](https://librelane.readthedocs.io/en/stable/getting_started/) to get
|
|
49
49
|
started. You can discuss LibreLane in the
|
|
50
50
|
[FOSSi Chat Matrix Server](https://fossi-chat.org).
|
|
51
51
|
|
|
@@ -86,7 +86,7 @@ Works for macOS and Linux (x86-64 and aarch64). Recommended, as it is more
|
|
|
86
86
|
integrated with your filesystem and overall has less upload and download deltas.
|
|
87
87
|
|
|
88
88
|
See
|
|
89
|
-
[Nix-based installation](https://librelane.readthedocs.io/en/
|
|
89
|
+
[Nix-based installation](https://librelane.readthedocs.io/en/stable/installation/nix_installation/index.html)
|
|
90
90
|
in the docs for more info.
|
|
91
91
|
|
|
92
92
|
### Docker
|
|
@@ -94,7 +94,7 @@ in the docs for more info.
|
|
|
94
94
|
Works for Windows, macOS and Linux (x86-64 and aarch64).
|
|
95
95
|
|
|
96
96
|
See
|
|
97
|
-
[Docker-based installation](https://librelane.readthedocs.io/en/
|
|
97
|
+
[Docker-based installation](https://librelane.readthedocs.io/en/stable/installation/docker_installation/index.html)
|
|
98
98
|
in the docs for more info.
|
|
99
99
|
|
|
100
100
|
Do note you'll need to add `--dockerized` right after `librelane` in most CLI
|
|
@@ -110,7 +110,9 @@ python3 -m pip install --upgrade librelane
|
|
|
110
110
|
```
|
|
111
111
|
|
|
112
112
|
Python-only installations are presently unsupported and entirely at your own
|
|
113
|
-
risk
|
|
113
|
+
risk, but you may consult
|
|
114
|
+
[Manual installation](https://librelane.readthedocs.io/en/stable/installation/manual_installation/index.html)
|
|
115
|
+
in the docs for more info.
|
|
114
116
|
|
|
115
117
|
## Usage
|
|
116
118
|
|
|
@@ -245,6 +245,8 @@ class Macro:
|
|
|
245
245
|
|
|
246
246
|
# we need to make a copy here, as we're modifying the dictionary as we iterate
|
|
247
247
|
for instance_name, instance in self.instances.copy().items():
|
|
248
|
+
if not isinstance(instance, Instance):
|
|
249
|
+
instance = Instance(**instance)
|
|
248
250
|
if (array := instance.array) is not None:
|
|
249
251
|
# we have a macro to expand
|
|
250
252
|
# first, check it's valid
|
|
@@ -129,7 +129,7 @@ proc read_current_sdc {} {
|
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
puts "Reading design constraints file at '$::env(_SDC_IN)'…"
|
|
132
|
-
if {[catch {read_sdc $::env(_SDC_IN)} errmsg]} {
|
|
132
|
+
if {[catch {log_cmd read_sdc $::env(_SDC_IN)} errmsg]} {
|
|
133
133
|
puts stderr $errmsg
|
|
134
134
|
exit 1
|
|
135
135
|
}
|
|
@@ -137,10 +137,10 @@ proc read_current_sdc {} {
|
|
|
137
137
|
if { ![string_in_file $::env(_SDC_IN) "set_propagated_clock"] && ![string_in_file $::env(_SDC_IN) "unset_propagated_clock"] } {
|
|
138
138
|
if { [info exists ::env(OPENLANE_SDC_IDEAL_CLOCKS)] && $::env(OPENLANE_SDC_IDEAL_CLOCKS) } {
|
|
139
139
|
puts "\[INFO\] No information on clock propagation in input SDC file-- unpropagating all clocks."
|
|
140
|
-
unset_propagated_clock [all_clocks]
|
|
140
|
+
log_cmd unset_propagated_clock [all_clocks]
|
|
141
141
|
} else {
|
|
142
142
|
puts "\[INFO\] No information on clock propagation in input SDC file-- propagating all clocks."
|
|
143
|
-
set_propagated_clock [all_clocks]
|
|
143
|
+
log_cmd set_propagated_clock [all_clocks]
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
146
|
|
|
@@ -158,6 +158,12 @@ proc read_current_sdc {} {
|
|
|
158
158
|
unset ::env(SYNTH_DRIVING_CELL_PIN)
|
|
159
159
|
set ::env(SYNTH_DRIVING_CELL) $synth_driving_cell_bk
|
|
160
160
|
}
|
|
161
|
+
|
|
162
|
+
# this maneuver is so it ends up in the report directory even if it's not
|
|
163
|
+
# the step directory
|
|
164
|
+
puts "%OL_CREATE_REPORT resolved.sdc"
|
|
165
|
+
write_sdc /dev/stdout
|
|
166
|
+
puts "%OL_END_REPORT"
|
|
161
167
|
}
|
|
162
168
|
|
|
163
169
|
proc read_pad_cfg {} {
|
|
@@ -210,20 +216,20 @@ proc read_current_netlist {args} {
|
|
|
210
216
|
|
|
211
217
|
if { [info exists flags(-powered)] } {
|
|
212
218
|
puts "Reading top-level powered netlist at '$::env(CURRENT_PNL)'…"
|
|
213
|
-
if {[catch {read_verilog $::env(CURRENT_PNL)} errmsg]} {
|
|
219
|
+
if {[catch {log_cmd read_verilog $::env(CURRENT_PNL)} errmsg]} {
|
|
214
220
|
puts stderr $errmsg
|
|
215
221
|
exit 1
|
|
216
222
|
}
|
|
217
223
|
} else {
|
|
218
224
|
puts "Reading top-level netlist at '$::env(CURRENT_NL)'…"
|
|
219
|
-
if {[catch {read_verilog $::env(CURRENT_NL)} errmsg]} {
|
|
225
|
+
if {[catch {log_cmd read_verilog $::env(CURRENT_NL)} errmsg]} {
|
|
220
226
|
puts stderr $errmsg
|
|
221
227
|
exit 1
|
|
222
228
|
}
|
|
223
229
|
}
|
|
224
230
|
|
|
225
231
|
puts "Linking design '$::env(DESIGN_NAME)' from netlist…"
|
|
226
|
-
link_design $::env(DESIGN_NAME)
|
|
232
|
+
log_cmd link_design $::env(DESIGN_NAME)
|
|
227
233
|
set_global_vars
|
|
228
234
|
read_current_sdc
|
|
229
235
|
}
|
|
@@ -237,27 +243,27 @@ proc read_timing_info {args} {
|
|
|
237
243
|
return
|
|
238
244
|
}
|
|
239
245
|
set corner_name $::env(_CURRENT_CORNER_NAME)
|
|
240
|
-
|
|
246
|
+
log_cmd define_corners $corner_name
|
|
241
247
|
|
|
242
248
|
puts "Reading timing models for corner $corner_name…"
|
|
243
249
|
|
|
244
250
|
foreach lib $::env(_CURRENT_CORNER_LIBS) {
|
|
245
251
|
puts "Reading cell library for the '$corner_name' corner at '$lib'…"
|
|
246
|
-
read_liberty -corner $corner_name $lib
|
|
252
|
+
log_cmd read_liberty -corner $corner_name $lib
|
|
247
253
|
}
|
|
248
254
|
|
|
249
255
|
if { [info exists ::env(EXTRA_LIBS) ] } {
|
|
250
256
|
puts "Reading explicitly-specified extra libs for $corner_name…"
|
|
251
257
|
foreach extra_lib $::env(EXTRA_LIBS) {
|
|
252
258
|
puts "Reading extra timing library for the '$corner_name' corner at '$extra_lib'…"
|
|
253
|
-
read_liberty -corner $corner_name $extra_lib
|
|
259
|
+
log_cmd read_liberty -corner $corner_name $extra_lib
|
|
254
260
|
}
|
|
255
261
|
}
|
|
256
262
|
|
|
257
263
|
set blackbox_wildcard {/// sta-blackbox}
|
|
258
264
|
foreach nl $::env(_CURRENT_CORNER_NETLISTS) {
|
|
259
265
|
puts "Reading macro netlist at '$nl'…"
|
|
260
|
-
if { [catch {read_verilog $nl} err] } {
|
|
266
|
+
if { [catch {log_cmd read_verilog $nl} err] } {
|
|
261
267
|
puts stderr "Error while reading macro netlist '$nl':"
|
|
262
268
|
puts stderr $err
|
|
263
269
|
puts stderr "Make sure that this a gate-level netlist and not an RTL file."
|
|
@@ -268,7 +274,7 @@ proc read_timing_info {args} {
|
|
|
268
274
|
foreach verilog_file $::env(EXTRA_VERILOG_MODELS) {
|
|
269
275
|
if { [string_in_file $verilog_file $blackbox_wildcard] } {
|
|
270
276
|
puts "Found '$blackbox_wildcard' in '$verilog_file', skipping…"
|
|
271
|
-
} elseif { [catch {puts "Reading Verilog model at '$verilog_file'…"; read_verilog $verilog_file} err] } {
|
|
277
|
+
} elseif { [catch {puts "Reading Verilog model at '$verilog_file'…"; log_cmd read_verilog $verilog_file} err] } {
|
|
272
278
|
puts stderr "Error while reading $verilog_file:"
|
|
273
279
|
puts stderr $err
|
|
274
280
|
puts stderr "Make sure that this a gate-level netlist and not an RTL file, otherwise, you can add the following comment '$blackbox_wildcard' in the file to skip it and blackbox the modules inside if needed."
|
|
@@ -295,7 +301,7 @@ proc read_spefs {} {
|
|
|
295
301
|
if { [info exists ::env(_CURRENT_SPEF_BY_CORNER)] } {
|
|
296
302
|
set corner_name $::env(_CURRENT_CORNER_NAME)
|
|
297
303
|
puts "Reading top-level design parasitics for the '$corner_name' corner at '$::env(_CURRENT_SPEF_BY_CORNER)'…"
|
|
298
|
-
read_spef -corner $corner_name $::env(_CURRENT_SPEF_BY_CORNER)
|
|
304
|
+
log_cmd read_spef -corner $corner_name $::env(_CURRENT_SPEF_BY_CORNER)
|
|
299
305
|
}
|
|
300
306
|
if { [info exists ::env(_CURRENT_CORNER_SPEFS)] } {
|
|
301
307
|
set corner_name $::env(_CURRENT_CORNER_NAME)
|
|
@@ -303,7 +309,7 @@ proc read_spefs {} {
|
|
|
303
309
|
set instance_path [lshift spefs]
|
|
304
310
|
foreach spef $spefs {
|
|
305
311
|
puts "Reading '$instance_path' parasitics for the '$corner_name' corner at '$spef'…"
|
|
306
|
-
read_spef -corner $corner_name -path $instance_path $spef
|
|
312
|
+
log_cmd read_spef -corner $corner_name -path $instance_path $spef
|
|
307
313
|
}
|
|
308
314
|
}
|
|
309
315
|
}
|
|
@@ -316,7 +322,7 @@ proc read_spefs {} {
|
|
|
316
322
|
if { "[get_property $cell ref_name]" eq "$module_name"} {
|
|
317
323
|
set instance_path [get_property $cell full_name]
|
|
318
324
|
puts "Reading '$instance_path' parasitics for the '$corner_name' corner at '$spef'…"
|
|
319
|
-
read_spef -corner $corner_name -path $instance_path $spef
|
|
325
|
+
log_cmd read_spef -corner $corner_name -path $instance_path $spef
|
|
320
326
|
}
|
|
321
327
|
}
|
|
322
328
|
}
|
|
@@ -336,7 +342,7 @@ proc read_pnr_libs {args} {
|
|
|
336
342
|
lappend corner_names $corner_name
|
|
337
343
|
}
|
|
338
344
|
|
|
339
|
-
define_corners {*}[array name corner]
|
|
345
|
+
log_cmd define_corners {*}[array name corner]
|
|
340
346
|
|
|
341
347
|
foreach corner_name [array name corner] {
|
|
342
348
|
puts "Reading timing models for corner $corner_name…"
|
|
@@ -344,14 +350,14 @@ proc read_pnr_libs {args} {
|
|
|
344
350
|
set corner_models $corner($corner_name)
|
|
345
351
|
foreach model $corner_models {
|
|
346
352
|
puts "Reading timing library for the '$corner_name' corner at '$model'…"
|
|
347
|
-
read_liberty -corner $corner_name $model
|
|
353
|
+
log_cmd read_liberty -corner $corner_name $model
|
|
348
354
|
}
|
|
349
355
|
|
|
350
356
|
if { [info exists ::env(EXTRA_LIBS) ] } {
|
|
351
357
|
puts "Reading explicitly-specified extra libs for $corner_name…"
|
|
352
358
|
foreach extra_lib $::env(EXTRA_LIBS) {
|
|
353
359
|
puts "Reading extra timing library for the '$corner_name' corner at '$extra_lib'…"
|
|
354
|
-
read_liberty -corner $corner_name $extra_lib
|
|
360
|
+
log_cmd read_liberty -corner $corner_name $extra_lib
|
|
355
361
|
}
|
|
356
362
|
}
|
|
357
363
|
}
|
|
@@ -361,7 +367,7 @@ proc read_tech_lef {{tlef_key "TECH_LEF"}} {
|
|
|
361
367
|
set tlef $::env($tlef_key)
|
|
362
368
|
|
|
363
369
|
puts "Reading technology LEF file at '$tlef'…"
|
|
364
|
-
read_lef $tlef
|
|
370
|
+
log_cmd read_lef $tlef
|
|
365
371
|
|
|
366
372
|
# Make fake I/O sites
|
|
367
373
|
if { [info exists ::env(PAD_FAKE_SITES)] } {
|
|
@@ -370,7 +376,7 @@ proc read_tech_lef {{tlef_key "TECH_LEF"}} {
|
|
|
370
376
|
set height [lindex $size 1]
|
|
371
377
|
|
|
372
378
|
puts "Making fake IO site $site_name…"
|
|
373
|
-
make_fake_io_site -name $site_name -width $width -height $height
|
|
379
|
+
log_cmd make_fake_io_site -name $site_name -width $width -height $height
|
|
374
380
|
}
|
|
375
381
|
}
|
|
376
382
|
}
|
|
@@ -378,24 +384,24 @@ proc read_tech_lef {{tlef_key "TECH_LEF"}} {
|
|
|
378
384
|
proc read_other_lefs {} {
|
|
379
385
|
foreach lef $::env(CELL_LEFS) {
|
|
380
386
|
puts "Reading cell LEF file at '$lef'…"
|
|
381
|
-
read_lef $lef
|
|
387
|
+
log_cmd read_lef $lef
|
|
382
388
|
}
|
|
383
389
|
if { [info exist ::env(MACRO_LEFS)] } {
|
|
384
390
|
foreach lef $::env(MACRO_LEFS) {
|
|
385
391
|
puts "Reading macro LEF file at '$lef'…"
|
|
386
|
-
read_lef $lef
|
|
392
|
+
log_cmd read_lef $lef
|
|
387
393
|
}
|
|
388
394
|
}
|
|
389
395
|
if { [info exist ::env(PAD_LEFS)] } {
|
|
390
396
|
foreach lef $::env(PAD_LEFS) {
|
|
391
397
|
puts "Reading gpio pad LEF file at '$lef'…"
|
|
392
|
-
read_lef $lef
|
|
398
|
+
log_cmd read_lef $lef
|
|
393
399
|
}
|
|
394
400
|
}
|
|
395
401
|
if { [info exist ::env(EXTRA_LEFS)] } {
|
|
396
402
|
foreach lef $::env(EXTRA_LEFS) {
|
|
397
403
|
puts "Reading extra LEF file at '$lef'…"
|
|
398
|
-
read_lef $lef
|
|
404
|
+
log_cmd read_lef $lef
|
|
399
405
|
}
|
|
400
406
|
}
|
|
401
407
|
}
|
|
@@ -416,7 +422,7 @@ proc read_current_odb {args} {
|
|
|
416
422
|
|
|
417
423
|
read_pnr_libs
|
|
418
424
|
puts "Reading OpenROAD database at '$::env(CURRENT_ODB)'…"
|
|
419
|
-
if { [ catch {read_db $::env(CURRENT_ODB)} errmsg ]} {
|
|
425
|
+
if { [ catch {log_cmd read_db $::env(CURRENT_ODB)} errmsg ]} {
|
|
420
426
|
puts stderr $errmsg
|
|
421
427
|
exit 1
|
|
422
428
|
}
|
|
@@ -14,18 +14,18 @@
|
|
|
14
14
|
source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
|
|
15
15
|
|
|
16
16
|
puts "Reading OpenROAD database at '$::env(CURRENT_ODB)'…"
|
|
17
|
-
if { [ catch {read_db $::env(CURRENT_ODB)} errmsg ]} {
|
|
17
|
+
if { [ catch {log_cmd read_db $::env(CURRENT_ODB)} errmsg ]} {
|
|
18
18
|
puts stderr $errmsg
|
|
19
19
|
exit 1
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
set_global_vars
|
|
23
23
|
|
|
24
|
-
define_corners $::env(DEFAULT_CORNER)
|
|
24
|
+
log_cmd define_corners $::env(DEFAULT_CORNER)
|
|
25
25
|
|
|
26
26
|
foreach lib $::env(_PNR_LIBS) {
|
|
27
27
|
puts "Reading library file at '$lib'…"
|
|
28
|
-
read_liberty $lib
|
|
28
|
+
log_cmd read_liberty $lib
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
read_current_sdc
|
|
@@ -33,5 +33,5 @@ read_current_sdc
|
|
|
33
33
|
if { [info exists ::env(_CURRENT_SPEF_BY_CORNER)] } {
|
|
34
34
|
set corner_name $::env(_CURRENT_CORNER_NAME)
|
|
35
35
|
puts "Reading top-level design parasitics for the '$corner_name' corner at '$::env(_CURRENT_SPEF_BY_CORNER)'…"
|
|
36
|
-
read_spef -corner $corner_name $::env(_CURRENT_SPEF_BY_CORNER)
|
|
36
|
+
log_cmd read_spef -corner $corner_name $::env(_CURRENT_SPEF_BY_CORNER)
|
|
37
37
|
}
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
source $::env(SCRIPTS_DIR)/openroad/common/io.tcl
|
|
25
25
|
|
|
26
|
-
set_cmd_units\
|
|
26
|
+
log_cmd set_cmd_units\
|
|
27
27
|
-time ns\
|
|
28
28
|
-capacitance pF\
|
|
29
29
|
-current mA\
|
|
@@ -39,9 +39,9 @@ if { [namespace exists ::ord] } {
|
|
|
39
39
|
|
|
40
40
|
# Internal API- brittle
|
|
41
41
|
if { [grt::have_routes] } {
|
|
42
|
-
estimate_parasitics -global_routing
|
|
42
|
+
log_cmd estimate_parasitics -global_routing
|
|
43
43
|
} elseif { [est::check_corner_wire_cap] } {
|
|
44
|
-
estimate_parasitics -placement
|
|
44
|
+
log_cmd estimate_parasitics -placement
|
|
45
45
|
}
|
|
46
46
|
} else {
|
|
47
47
|
read_timing_info
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
import os
|
|
35
35
|
import json
|
|
36
36
|
import shutil
|
|
37
|
-
from typing import List, Optional
|
|
37
|
+
from typing import List, Optional, Tuple
|
|
38
38
|
|
|
39
39
|
import click
|
|
40
40
|
|
|
@@ -42,6 +42,27 @@ from ys_common import ys, yosys_version_at_least
|
|
|
42
42
|
from construct_abc_script import ABCScriptCreator
|
|
43
43
|
|
|
44
44
|
|
|
45
|
+
def stat_json(d: ys.Design, lib_arguments: Tuple[str, ...], report_dir: str):
|
|
46
|
+
"""
|
|
47
|
+
hack: work around https://github.com/YosysHQ/yosys/issues/6442
|
|
48
|
+
"""
|
|
49
|
+
raw = os.path.join(report_dir, "stat.json.raw")
|
|
50
|
+
parseable = os.path.join(report_dir, "stat.json")
|
|
51
|
+
d.tee("stat", "-json", *lib_arguments, o=raw)
|
|
52
|
+
with (
|
|
53
|
+
open(raw, encoding="utf8") as f_in,
|
|
54
|
+
open(parseable, "w", encoding="utf8") as f_out,
|
|
55
|
+
):
|
|
56
|
+
char = " "
|
|
57
|
+
# skip until first { or EOF
|
|
58
|
+
while char != "{" and char != "":
|
|
59
|
+
char = f_in.read(1)
|
|
60
|
+
# if EOF reached, print nothing, just close
|
|
61
|
+
if char != "":
|
|
62
|
+
f_out.write("{") # { already consumed, replace it before writing the rest
|
|
63
|
+
f_out.write(f_in.read())
|
|
64
|
+
|
|
65
|
+
|
|
45
66
|
def librelane_proc(d: ys.Design, report_dir: str):
|
|
46
67
|
d.run_pass("proc_clean") # Clean up unused procedures
|
|
47
68
|
d.run_pass("proc_rmdead") # Remove dead procedures
|
|
@@ -357,7 +378,7 @@ def synthesize(
|
|
|
357
378
|
d.run_pass("splitnets")
|
|
358
379
|
d.run_pass("opt_clean", "-purge")
|
|
359
380
|
d.tee("check", o=os.path.join(report_dir, "chk.rpt"))
|
|
360
|
-
d
|
|
381
|
+
stat_json(d, lib_arguments, report_dir)
|
|
361
382
|
d.tee("stat", *lib_arguments, o=os.path.join(report_dir, "stat.rpt"))
|
|
362
383
|
|
|
363
384
|
noattr_flag = []
|
|
@@ -523,7 +544,7 @@ def synthesize(
|
|
|
523
544
|
d.run_pass("insbuf", "-buf", *config["SYNTH_BUFFER_CELL"].split("/"))
|
|
524
545
|
|
|
525
546
|
d.tee("check", o=os.path.join(report_dir, "chk.rpt"))
|
|
526
|
-
d
|
|
547
|
+
stat_json(d, lib_arguments, report_dir)
|
|
527
548
|
d.tee("stat", *lib_arguments, o=os.path.join(report_dir, "stat.rpt"))
|
|
528
549
|
|
|
529
550
|
if config["SYNTH_AUTONAME"]:
|
|
@@ -622,8 +622,8 @@ class SynthesisCommon(VerilogStep):
|
|
|
622
622
|
view_updates, metric_updates = super().run(state_in, **kwargs)
|
|
623
623
|
|
|
624
624
|
stats_file = os.path.join(self.step_dir, "reports", "stat.json")
|
|
625
|
-
|
|
626
|
-
|
|
625
|
+
with open(stats_file, encoding="utf8") as f:
|
|
626
|
+
stats = json.load(f, parse_float=Decimal)
|
|
627
627
|
|
|
628
628
|
metric_updates["design__instance__count"] = stats["design"]["num_cells"]
|
|
629
629
|
if chip_area := stats["design"].get("area"): # needs nonzero area
|
|
@@ -135,10 +135,13 @@ class DefaultOutputProcessor(OutputProcessor[Dict[str, Any]]):
|
|
|
135
135
|
|
|
136
136
|
* ``%OL_CREATE_REPORT <file>``\\: Starts redirecting all output from
|
|
137
137
|
standard output to a report file inside the step directory, with the
|
|
138
|
-
name <file>.
|
|
139
|
-
|
|
138
|
+
name <file>. Note that %OL_ commands take priority: a repeated call of
|
|
139
|
+
%OL_CREATE_REPORT will open a new report, closing the previous one, and
|
|
140
|
+
all metric calls will not be forwarded to the report.
|
|
141
|
+
* ``%OL_END_REPORT``: Stops redirection behavior, closing the report.
|
|
140
142
|
* ``%OL_METRIC <name> <value>``\\: Adds a string metric with the name <name>
|
|
141
|
-
and the value <value> to this function's returned object
|
|
143
|
+
and the value <value> to this function's returned object, with leading
|
|
144
|
+
and trailing whitespace stripped.
|
|
142
145
|
* ``%OL_METRIC_F <name> <value>``\\: Adds a floating-point metric with the
|
|
143
146
|
name <name> and the value <value> to this function's returned object.
|
|
144
147
|
* ``%OL_METRIC_I <name> <value>``\\: Adds an integer metric with the name
|
|
@@ -170,13 +173,13 @@ class DefaultOutputProcessor(OutputProcessor[Dict[str, Any]]):
|
|
|
170
173
|
self.current_rpt.close()
|
|
171
174
|
self.current_rpt = None
|
|
172
175
|
elif line.startswith(METRIC_LOCUS):
|
|
173
|
-
command, name, value = line.split(" ", maxsplit=
|
|
176
|
+
command, name, value = line.split(" ", maxsplit=2)
|
|
174
177
|
metric_type: Union[Type[str], Type[int], Type[Decimal]] = str
|
|
175
178
|
if command.endswith("_I"):
|
|
176
179
|
metric_type = int
|
|
177
180
|
elif command.endswith("_F"):
|
|
178
181
|
metric_type = Decimal
|
|
179
|
-
self.generated_metrics[name] = metric_type(value)
|
|
182
|
+
self.generated_metrics[name] = metric_type(value.strip())
|
|
180
183
|
elif self.current_rpt is not None:
|
|
181
184
|
# No echo- the timing reports especially can be very large
|
|
182
185
|
# and terminal emulators will slow the flow down.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/examples/spm-user_project_wrapper/defines.v
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/klayout/xml_drc_report_to_json.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/magic/gds/mag_with_pointers.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/check_antenna_properties.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/ioplace_parser/__init__.py
RENAMED
|
File without changes
|
{librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/odbpy/ioplace_parser/parse.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/dpl_cell_pad.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/common/set_power_nets.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/repair_design_postgrt.tcl
RENAMED
|
File without changes
|
{librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/rsz_timing_postcts.tcl
RENAMED
|
File without changes
|
{librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/openroad/rsz_timing_postgrt.tcl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{librelane-3.1.0.dev4 → librelane-3.1.0.dev5}/librelane/scripts/pyosys/construct_abc_script.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|