+ Add yosys to `run_tcl_script`, enabling the automatic production of reproducibles
~ yosys -> f109fa3d4c56fe33bc626c298e04d45ae510dd0e
~ Cleaned up LEC script a bit (thanks @emjunaid for initial work)
~ Fix bug where cell_count was not extracted properly
- Removed `get_yosys_bin`: It's been deprecated forever
\+ Add PDK variable `WIRE_LENGTH_THRESHOLD` which wires with lengths >= said value are flagged
\+ Add `QUIT_ON_LONG_WIRE` which fails the flow if any wires are flagged for length
~ Update all `$::env(OPENROAD_BIN) -exit -python` invocations to include `-no_init` to suppress message about rc file
~ Replace ill-fitting `$::env(OPENROAD_BIN) -exit -python` invocations with just `python3`
~ Replace local install check with a simple git directory check
+ Formalized concept of "exposed variables", environment variables that are exposed to `config.json` during processing
+ `dir::` is no longer a special case: all `ref::` prefices referencing a path now have the ability to glob inside said path
+ Made `dir::`, `pdk_dir::` and `scl_dir::` short-hands for various `ref::`s
+ Add `proc erase_box` to OpenLane
+ Add two new config variables for magic def reads: `MAGIC_DEF_NO_BLOCKAGES` and `MAGIC_DEF_LABELS`
~ Magic scripts hierachically organized by input format
~ `erase_box.sh` deprecated
~ More decisively separate LVS logs from reports
+ Add flag to enable/disable timing model generation after STA
+ Add both powered and unpowered netlists to `save_views`
+ Add multi-corner SDF and SPEF files to `save_views`
~ Fix#1413 and add regression test
~ Move `./run_issue_regressions.py` inside `tests` as a modular main function
+ Create `RCX_SDC_FILE` as an optional SDC file to be used only for parasitics extraction (and consequent STA)
+ Document `SYNTH_ELABORATE_ONLY`, which only elaborates structured netlists without an attempt at logic mapping ~ Add translation behavior from previous, ambiguously named `SYNTH_TOP_LEVEL` to `SYNTH_ELABORATE_ONLY`
~ `scripts/yosys/synth_top.tcl` -> `elaborate.tcl`
~ Documentation consistency fixes
~ Fix wildcard in `docker/Makefile`
+ Add calls to `set_dont_touch` and then `unset_dont_touch` at the beginning and end of every resizer script respectively ~ Reorganize config variables
+ Added undocumented variable `RSZ_USE_OLD_REMOVER` to continue to use the old `remove_buffers.py` script instead
~ `LIB_RESIZER_OPT` -> `RSZ_LIB` (with translation behavior)
~ `UNBUFFER_NETS` -> `RSZ_DONT_TOUCH_RX` (with translation behavior)
~ Made timing models only get written after CTS by checking for `STA_PRE_CTS` as well
===
Flow Scripts
===
+ Support OpenROAD ODB format as the primary format in which data is stored after placement
+ Create `manipulate_layout` to centralize calling odbpy scripts
+ Add `CURRENT_POWERED_NETLIST` to list of "current" variables, separate from
`CURRENT_NETLIST` to avoid confusion
~ Update `scripts/odbpy/reader.py:OdbReader` and *all dependent scripts* now to use `odb` inputs and outputs. Add new `--output-def` flag to continue saving a DEF layout of the result.
~ Verbosity now a global variable, not an environment variable
~ Streamline saving using `scripts/utils/utils.tcl:run_openroad_script`: new `-save` option added that will automatically handle setting and unsetting `SAVE_` variables and `CURRENT_` variables
~ Rewrite Diode Insertion Strategy 3 iterations to be readable by human beings
~ `scripts/tcl_commands/all.tcl:heal_antenna_violators` now only uses `CURRENT_DEF`
~ `scripts/tcl_commands/all.tcl:set_netlist` updated to support flags and arguments properly, `-lec` now only works if `LEC_ENABLE` is set to `1`. Invocations updated
~ Usage of `scripts/tcl_commands/all.tcl:trim_lib` updated: no longer has any optional arguments. Documentation updated.
~ `scripts/tcl_commands/all.tcl:write_verilog` now uses `write_views.tcl` with the `-save` option. Documentation updated to reflect the fact it no longer calls `set_netlist`.
~ Fix various python invocations
~ Move `scripts/tcl_commands/routing.tcl:gen_pdn` to `floorplan`
~ Update `scripts/or_issue.py` to handle `odb` inputs and outputs
~ Update `scripts/tcl_commands/lvs.tcl:write_powered_verilog`, `scripts/tcl_commands/routing.tcl:power_routing` to use `-odb` as an input instead of `-def` (and, if applicable, `-output_odb` *alongside* `-output_def`)
- Remove various scripts that rely on text manipulation (incl. `scripts/simple_cts.py`- thank you for your service)
- Remove vestiges of site widening
- Remove `-canonical` optional from `scripts/tcl_commands/all.tcl:write_verilog` (dubious/undocumented utility)
- Remove `verilog_to_verilogPower` (unused)
- Remove `zeroize_origin_lef`
- Remove `PREV_NETLIST` variable
- Remove various invocations of `scripts/tcl_commands/utils.tcl:write_verilog`, replace with `-save` arguments
## OpenROAD Scripts
+ Create OpenROAD script `common` folder, isolating common code into a folder instead of the preceding chaos
+ OpenROAD scripts now use a unified script for reading and writing views: `scripts/openroad/common/io.tcl`: `read` reads the `.odb` database + relevant liberty and sdc files and `write` writes any views specified as `SAVE_` variables: see the file for documentation
~ Update Copyright & Licensing for all OpenROAD scripts
~ Rewrite `scripts/odbpy/defutil.py:merge_components` to use odb
~ `scripts/odbpy/defutil.py:replace_pins` -> `relocate_pins`, with a partial rewrite and re-documentation.
~ `scripts/odbpy/defutil.py:add_def_obstructions` -> `add_obstructions`
~ `scripts/openroad/write_verilog.tcl` -> `write_view.tcl`, since it is literally just a "read" and a "write" call now
~ Partially rewrite `scripts/odbpy/power_utils.py:write_powered_def`, the most disgusting function in the codebase
- Remove `scripts/odbpy/defutil.py:merge_pins` (unused)
~ Documentation all moved under `docs/source`, arranged hierarchically according to the table of contents
~ `Klayout` changed to `KLayout` in all logging messages
~ Readme rewritten to just be concise, parts of it isolated into standalone documentation
~ RTD builds no longer use conda (saves some time)
~ Fixed all broken links
+ Add gf180mcuC configs for {APU, PPU, SPM}
~ Clean up some leftover variables
~ STD_CELL_LIBRARY now an optional environment variable- open_pdks config files are now responsible for setting the default
~ `to_tcl.py` updated to reflect that ^
~ Add ability to just set `METAL_LAYER_NAMES` in open_pdks
~ `open_pdks` -> 44a43c23c81b45b8e774ae7a84899a5a778b6b0b
+ Add feature to match PDK names using Python `fnmatch`, allowing wildcards in `config.json` `pdk::` statements
~ open_pdks -> `e8294524e5f67c533c5d0c3afa0bcc5b2a5fa066`
- Remove "dependencies" field from tool_metadata.yml
- Removed sky130 version from tool_metadata.yml, tracked through the open_pdks "sky130.json" file instead
- Removed CVC scripts, placed in the PDK
+ Added "logging to" information for long-running steps (CTS and Routing)
+ Added variable `GPL_CELL_PADDING` for global placement, with a default value of 0 (value divided by 2 and applied to both the left and right of the cell)
+ Add feature to also print mounted scripts' version if the container version does not match
+ Add `insert_tiecells` after floorplanning
~ `replace.tcl`, `opendp.tcl` -> `gpl.tcl`, `dpl.tcl`
~ `CELL_PAD` renamed `DPL_CELL_PADDING` for detailed placement, default value still 4, value divided by 2 and applied to both the left and right of the cell
~ DONT_BUFFER_PORTS given a default value (empty)
~ `remove_buffers` -> `remove_buffers_from_ports` (to more explicitly state what it does)
~ Renamed `RUN_ROUTING_DETAILED` to `RUN_DRT` (with translation behavior)
~ Cleanup OR antenna check
- Removed `CELL_PAD` from metrics and comparison
- Removed `widen_site_width`, `use_widened_lefs` and `use_original_lefs`: I don't know who used site widening
- Removed `MERGED_LEF_UNPADDED`: `MERGED_LEF` can be used for all places where the "unpadded" one was used
+ Tagging scheme is now YYYY.MM.DD, postfixed with rX for multiple releases on the same day to match internal Efabless utilities
+ Add git remotes to environment survey
+ Add feature to force reproducibles to be created for a specific script regardless of failure: see `docs/source/using_or_issue.md` for more info
~ Fix `generate_tag.py`
- Remove debugging vestiges from `all.tcl`
+ JSON Configs now support per-PDK and per-SCL options
+ JSON Configs now have a limited expression engine and a way to specify the current working directory and glob inside of it
+ Created script to help migrate tcl configs to json configs
+ `-init_design_config` rewritten, now creates an `openlane` folder inside the design's directory. New flag `-add_to_designs` restores the previous behavior
+ `docs/source/configuration_files.md` created with a focus on documenting how the configuration files work, including the JSON configuration files
~ Update `picorv32` design
~ Most `config.tcl`s replaced with `config.json` alternatives
~ Global configuration files now loaded in a specific order with no glob
~ Changed default values for PL_TARGET_DENSITY
~ Documentation updates to support the use of configuration JSON files as a first class citizen
~ Update author list
~ Replicate override_env after second design source
~ Move verify_mismatches to before most preparation
~ flow.tcl no longer requires `-design`, is happy to use the current working directory as a default
~ replicate.py rewritten
~ update.py not rewritten, but uses click now (and an improved --help)
- Removed "flag documentation" for some python scripts, just use `--help`
+ `run_magic_script` added, replacing all individual magic invocations and supporting `or_issue`
~ Fix max capacitance/fanout violations being misreported as slew violations
~ `extract_antenna_violators.py`, `or_issue.py` rewritten in click
~ Fix issue where `diodes.py` doesn't expose `replace_fake`
~ Fix various odbpy script invocations broken by #864
~ Fix issue where entire run folder was not deleted on overwrite (again, #864)
~ `spice_extract.tcl`, `antenna_check.tcl` both now attempt their own extraction to avoid maglef/mag confusion scenarios
~ Fix long-standing issue with diode insertion strategy 3
~ Rewrite diode insertion strategy 5
+ Added two new PDK-specific variables: SYNTH_CLK_DRIVING_CELL, SYNTH_DRIVING_CELL_PIN, which are used in the sdc file so clocks specifically can be driven by a different cell
~ NO_PG now also generated for the excluded cells
~ Document PDK-specific variables in their right place
~ Magic -> 085131b
~ Fix verify_versions.py
+ Consolidated all existing DRC conversion functions into `drc_rosetta.py`
+ Consolidated fake_diode_replace and place_diode into `diode.py`
+ Consolidated and/or rewrote most def manipulation functions into `defutil.py` and other files under `odbpy/`.
+ Consolidated and/or rewrote most lef manipulation functions into `lefutil.py`
~ Moved all files using odb to a new folder, `odbpy/`
~ Move replicate/update config scripts to `scripts/config` folder
~ Move all in-line magic spells into proper files
~ Tcl formatting (4 space-indents on all modified files)
- Removed many unused files, all consolidated files
---
API Breaks
* Care was taken to ensure all OpenLane tcl commands have the same API presuming the API in question was not stupid.
* Speaking of, `manual_macro_placement_test f` has been updated to `manual_macro_placement_test -f` to be consistent with literally every other command.
* All individual files that may be used by third party projects likely have a different CLI and are thus entirely broken.
Tested on Apple M1 and AWS Graviton.
+ Add support for multiple-architecture building
+ Support for amd64, ppc64le and arm64v8 added
+ amd64 and arm64v8 will be automatically built by the CI
~ Major CI Overhauls
~ Added composite actions for the Docker build and setting environment variables
~ pdk build is now its own job, and amd64/aarch64 have a job each
~ matrix -> design_matrix, designs only tested on amd64 for performance reasons
~ run/build base docker images now pushed to Docker Hub based on a hash of dependency lists (to work with the buildx `docker-container` driver)
- Remove pandas (overkill for what we're using it for)
- Remove `cugr`, `drcu` *for now* (they're x86-64 Linux-only utilities)
+ Added optional multiple **process corner** technology lef support (min/max/nom), in addition to the already existing multiple **timing corner** support (ss/tt/ff). This will also be our nomenclature going fwd.
+ Parasitics extraction now run at all process corners, and multi-corner analysis is run at all three process corners
~ `finishing` -> `signoff`
~ Parasitics extraction and STA are now an independent step instead of being lumped in routing, as part of the signoff block
~ Update OpenROAD
~ Update Open_PDKs, Sky130, and Magic
~ PDK verification made more PDK agnostic outside of env.py
~ Made RCX use LEF files instead of multiple configuration variables/set_rc.tcl
~ `prep_lefs` more or less rewritten
- Removed redundant RCX variables
- Removed `-order_wires` from various `read_def`s in OpenROAD- deprecated, apparently
+ `-verbose` flag added with multiple levels, replacing `-disable_output` (which is now the default behavior)
+ New command `puts_verbose` added, to be used for extra pieces of information
+ ./flow.tcl header now includes version, copyright and licensing information
+ Added `-last_run` flag allowing you to quickly resume the last run (useful with -interactive)
+ Added `open_in_klayout` command that lets you open the CURRENT_DEF in Klayout
~ `env.py issue-survey` now detects whether it's running inside the container and warns accordingly
~ RUN_KLAYOUT, RUN_KLAYOUT_DRC, RUN_MAGIC_DRC, RUN_LVS now only control noninteractive flows
~ Full git hash added to containers
~ Various Documentation Updates
~ Changed verbosity of various output messages
- Removed `-disable_output` (now the default behavior)
- Removed OpenLane ASCII art
- Removed various "chatty" messages, including things succeeding (shut up unless something fails)
+ Added an issue regression flow, allowing some post-run hooks to be executed to analyze issues that may not be captured by mere flow failure or metric regressions
~ `apply_def_template.py`: fix case sensitivity of arguments and use proper `defutil` command
+ Warnings now printed by flow_fail and at the end of noninteractive flow runs
+ Created warnings.log, errors.log with all warnings and errors
+ Get Tag now returns a dummy tag if you're on a branch that's not `main` or `master`
~ Tarballing moved to run_tests.py
~ Restored `-u` permissions to run_test.py.
~ Version mismatches now cause the flow to fail, straight up
~ flow_summary.log -> openlane.log
~ Various warning messages updated
~ Version checking moved to `prep`
~ change .bashrc CWD color to green (black was not readable)
~ `return -code error` added to flow_fail, removed after all flow_fail invocations
~ `make pdk` fixed
- Removed `--tar_list` from run_designs.py - do your own tarring
ECO flow starts from checking the report generated in the route step. As PT commands are not supported by OL, we use a python script to check the report, insert buffers, and do the resize. Inside the ECO loop, the python script, cts and route step are called sequentially. The reports are generated each time, and the loop stops until no hold time violations are found.
The flow can be enabled using ECO_ENABLE =1.
More documentation and enhancements to come in the future.
Co-authored-by: Ke-Haur Taur <khtaur@umich.edu>
Co-authored-by: Haolin Dong <haolind@umich.edu>
+ `RT_{MIN,MAX}_LAYER` added to the PDK, relies on layer names
+ `FP_IO_{H,V}LAYER` added to the PDK, relies on layer names
+ `DRT_{MIN,MAX}_LAYER` optional override variables added
~ Minimum layer set to `met1` in the PDK, you have to enable `li1` manually
~ `GLB_RT_LAYER_ADJUSTMENTS` was moved to the PDK
~ io_place.py API redone in click, now also uses layer names
- `FP_IO_{H,V}METAL` removed, will be translated to the new ones on-the-fly if they're in a user's config (for now.)
- `GLB_RT_{MIN,MAX}LAYER` and its clock equivalents deprecated, will automatically be changed to the new ones on the fly
All OpenROAD scripts are now called with `run_openroad_script`, a variant of `try_catch`, that upon detecting a failure will automatically invoke ./scripts/or_issue.py and create a reproducible within the run directory.
Also tweaks to how yosys is invoked.
~ CI now uploads each run tarball individually
~ Updated READMEs
~ `save_views` now always executed
- Removed `run_power_pins_insertion_step`: `write_powered_verilog` now run right before LVS
Local installs are now installed to a gitignored folder in the repo's file structure and use the same files as the repository.
This is a minimal flow change with no effect on the Dockerized environment. [skip ci]
The best thing to happen to OpenLane since OpenLane.
Variables related to output files: i.e. logs, results and reports, are becoming more uniform.
* Variables now point to folders
* Variables now called `{stage}_{type}s`
* All variables renamed to be tool-generic
* magic, klayout, cvc and lvs all unified, renamed "finishing"
* Better flow runtime calculation
* All step runtimes are now stored in a yaml file, which can easily be read by a human or parsed by a computer.
* Better step indexing
* You have to increment the step index explicitly using `increment_index`.
* Functions that take log arguments now require you to not use an indexed file, it's their responsibility to index them.
* Changed names for many logs to make more sense
* A plethora of files being moved and/or renamed
* Yosys scripts were moved into their own folder
* All references to OpenLANE that are not a published paper have been replaced with OpenLane
* Copyright dates updated on some files
* Non-fixed layer count for GLB RT adjustments
Remember this kids, nothing is more permanent than a temporary solution.
* GLB_RT_LX_ADJUSTMENT variables consolidated into GLB_RT_LAYER_ADJUSTMENTS, a comma-delimited set of values
* GLB_RT_LX_ADJUSTMENT will continue to be accepted but display a deprecation warning, and will be removed in a later version of OpenLane.
* GLB_RT_L1_ADJUSTMENT value from the PDK is now ignored.
* Bashrc fix (Line wrap problem), or_issue fix
* Only `read_verilog` if there's no CURRENT_DEF: see https://github.com/The-OpenROAD-Project/OpenROAD/issues/1305#issuecomment-968336079 (Practically didn't cause an issue as all DEFs are used without the standalone flag)
* or_issue now supports netlist inputs and no longer generates tarballs: encourages inspecting and running the code before uploading a tarball
* or_issue now also creates tcl, gdb and lldb files
* OpenROAD commit now sedded in instead of GITDIR-NOTFOUND: See last paragraph of https://github.com/Cloud-V/DFFRAM/issues/115
* Rewrite or_replace.tcl
That script used a lot of internal swig commands with an unstable API/unpredictable behavior. Resolves#697.
* Expose `max_displacement` flag for detailed placement
This was added at some point as a replacement to the diamond search height thing and is necessary for macros.
* Add OpenROAD GUI/Tcl Readline
Resolves#642. Note that this addition will be intentionally undocumented and is intended more for people who absolutely want it.
MISC:
* CI fast fail off/always push image
The CI will report failures still, but will still publish an image and create a tag. Additionally, other tests won't be killed on the first failure.
* Naming convention changes
* `docker_build/` -> `docker`: Just is more consistent with literally every other codebase that uses Docker ever.
* Removed `or_` prefix from OpenROAD scripts: redundant: They're all already under a folder called "openroad." The distinction no longer makes any sense as there are no separate scripts for the previously standalone utilities.