- Exposed Flow.start(overwrite=) as
--overwrite
, which removes a run directory before running the flow (if it exists)
-
Created
Odb.ManualGlobalPlacement
- Can create a global placement for instances. Intended for manually-instantiated buffers that require a certain regional placement or similar.
- Uses new variable
MANUAL_GLOBAL_PLACEMENTS
, a mapping from instance names to theInstance
class.
-
Created
Odb.CellFrequencyTables
- Creates a number of tables to show the cell frequencies by:
- Cells
- Buffer cells only
- Cell Function
- SCL
- Creates a number of tables to show the cell frequencies by:
-
OpenROAD.*
- All steps that modify views now update design cell metrics using OpenROAD's
report_design_area_metrics
- All steps that modify views now update design cell metrics using OpenROAD's
-
OpenROAD.ResizerTimingPostGRT
- Added
GRT_RESIZER_RUN_GRT
to control whether global routing is re-run after this step, which is usually required but may be redundant in some custom flows.
- Added
-
OpenROAD.RepairDesignPostGRT
- Added
GRT_DESIGN_REPAIR_RUN_GRT
to control whether global routing is re-run after this step, which is usually required but may be redundant in some custom flows.
- Added
-
OpenROAD.STA*
- New report
clock.rpt
created with information about each clock in a specific domain
- New report
-
OpenROAD.WriteViews
- Added
OPENROAD_LEF_BLOAT_OCCUPIED_LAYERS
with a default value oftrue
- Added
-
Yosys.*Synthesis
- ABC scripts used now created dynamically and dumped as a
.abc
file into the step directory. - Implemented many of the
suggestions by @ravenslofty
from YosysHQ, some behind flags:
SYNTH_ABC_DFF
: Adds-dff
toabc
invocations (except the ones insidesynth
)SYNTH_ABC_BOOTH
: Activates thebooth
pass as part ofsynth
SYNTH_ABC_USE_MFS3
: Usesmfs3
in all strategies before retimeSYNTH_ABC_AREA_USE_NF
: Attempts delay-based mapping with a really high delay value instead of area-based mapping.
- ABC scripts used now created dynamically and dumped as a
-
Yosys.JsonHeader
,Yosys.*Synthesis
- Internal: * Steps are no longer
TclStep
s: rewritten in Python and now uselibyosys
. While there are no functional changes, this enhances the codebase's consistency and helps avoid tokenization-related security issues.
- Internal: * Steps are no longer
Classic
- Emplaced
Odb.ManualGlobalPlacement
immediately precedingOpenROAD.DetailedPlacement
. - Emplaced
Odb.CellFrequencyTables
afterOpenROAD.FillInsertion
- Emplaced
-
OpenROAD ->
bbe940134bddf836894bfd1fe02153f4a38f8ae5
- OpenSTA ->
20925bb00965c1199c45aca0318c2baeb4042c5a
- Removed "stable" version of OpenSTA
- OpenSTA ->
-
Updated nix-eda to
0814aa6
: more orthodox approach to managing dependencies by overlaying them on top of nixpkgs, which fixes an occasional "repeated allocation" issue and helps make override behavior more consistent.- Yosys and first-party plugins ->
0.46
klayout
->0.29.4
magic
->8.3.489
netgen
->1.5.278
- OpenROAD now used with new
withPythonPackages
features to use Python packages specifically for the OpenROAD environment
- Yosys and first-party plugins ->
-
OpenLane itself no longer included in
devShells.*.dev
,devShells.*.docs
- These shells are intended to be actual dev shells, i.e. used to develop OpenLane, and needing OpenLane to pass tests to run these shells makes no sense.
-
Open PDKs ->
0fe599b
(Recommended for chipIgnite 2409/2411+ shuttles)
openlane.common.metrics
aggregate_metrics()
: Added support for aggregation of N-modifier levels
openlane.config.Config
- YAML 1.2 configuration files now accepted using
.yaml
or.yml
extensions, with the same featureset as JSON files. - The first configuration (file/dict) supplied no longer needs to be a complete configuration so long as any required variables are supplied in later configurations. Missing variables are only checked on the complete configuration.
- Internally reworked how config files and command-line overrides are parsed.
- YAML 1.2 configuration files now accepted using
- Fixed bug with deprecated variable translations of
{CLOCK,SIGNAL}_WIRE_RC_LAYERS
.
- Added info on YAML configuration files.
- Documentation for
Instance
dataclass generalized to include instances of cells and not macros.
-
OpenROAD.STA*PnR
- Fixed
timing__*_r2r__ws__corner
metrics reporting the wrong value
- Fixed
-
openlane.config.Variable
- Fixed an issue when strict type-checking is disabled where empty strings would crash iterable objects.
-
Fixed mypy to 1.9.0 to match NixOS 24.05.
-
Checked
poetry.lock
into version control to improve reproducibility.
-
OpenROAD.CheckAntennas
- Fixed table being printed to file with wrong width.
-
OpenROAD.STA*PnR
- Fixed table being printed to file with wrong width.
-
SynthesisExploration
- Fixed table being printed to file with wrong width.
-
OpenROAD.STA*PnR
- Fixed a bug in STA metrics where paths with exactly zero slack are counted as violations.
-
Odb.Remove*Obstructions
- Rework obstruction matching code to not use IEEE 754 in any capacity
- Fixed bug where non-integral obstructions would not be matched correctly (thanks @urish!)
-
Yosys.Synthesis
- Fixed bug where
hilomap
command was invoked incorrectly (thanks @htfab!)
- Fixed bug where
-
Odb.SetPowerConnections
- Fixed an issue introduced in
2.1.1
where modules that are defined as part of hierarchical netlists would be considered macros and then cause a crash when they are inevitably not found in the design database.- Explicitly mention that macros that are not on the top level will not be connected, and emit warnings if a hierarchical netlist is detected.
- Fixed an issue introduced in
- Updated macro documentation to further clarify how instances should be named and how names should be added to the configuration.
OpenROAD.STA*PNR
- New environment variable made accessible to SDC files used during
Multi-Corner STA steps,
OPENLANE_SDC_IDEAL_CLOCKS
, set to1
for pre-PnR. Band-aid until the SDC situation is properly discussed and addressed (in a potentially breaking change.) - Fixed issue where the clock was always propagated after
STAPrePNR
regardless the information in the SDC file. - For backwards compatibility,
STAPrePNR
unsets all propagated clocks and the rest set all propagated clocks IF the SDC file lacks the stringsset_propagated_clock
orunset_propagated_clock
.
- New environment variable made accessible to SDC files used during
Multi-Corner STA steps,
- Bundled an downgraded OpenSTA bundled with OpenLane to work around critical
bug for hierarchical static timing analysis:
parallaxsw/OpenSTA#82
- Version of OpenSTA linked against OpenROAD unchanged.
- CI now uses DeterminateSystems Nix Installer for all Nix installations as well as the Magic Nix Cache Action instead of the nonfunctional attempt at local file-based substituters
-
Installation documents now use the less-brittle Determinate Systems Nix installer, as well as adding warnings about the
apt
version of Nix. -
Added an OpenROAD Flow Scripts-inspired Diagram to the Readme.
-
OpenROAD.*
- Fixed an issue where the validation for
PDN_MACRO_CONNECTIONS
would partially match net names, unlike OpenROAD itself - Internal string escaping consistency
- Fixed an issue where the validation for
-
Odb.SetPowerConnections
- Internally reworked pin detection behavior so power pins are found in the LEF first then matched in the Verilog, fixing a corner-cases where unconnected buses would be candidates for power pins, then promptly cause a crash as they only exist in the layout as separate pins.
-
OpenROAD.IOPlacement
,OpenROAD.GlobalPlacementSkipIO
FP_IO_MODE
renamed toFP_PPL_MODE
: translation behavior for OpenLane 1-style FP_IO_MODE with integers added behind deprecated nameFP_IO_MODE
.
-
Yosys.*Synthesis
- Restored filtering of
defparam
from output netlists to avoid surprisingly still extant OpenSTA limitation.
- Restored filtering of
-
Added file to exclude step unit tests purely to speed-up turnaround time for PRs (as sometimes a test would need to be deleted/temporarily disabled without updating the submodule, see #475 for a similar situation)
-
Mac CI now uses an artifact of the PDK
- Unlike the Linux runners, Mac runners:
- Are disproportionately affected by rate-limiting: cannot pull from GitHub using Volare
- Do not support caches created on Ubuntu, even with
enableCrossOsArchive
- Unlike the Linux runners, Mac runners:
- Overhauled how the PDK commandline options work, using a decorator instead of doing everything in a callback
--smoke-test/--run-example
are now no longer callbacks, and--run-example
now supports more options (e.g. another PDK, another flow, etc.)- Docker subprocesses
- Are now always run interactively and can be interrupted.
- Are now run using
execlp
, replacing the Python interpreter altogether
-
Created
Checker.NetlistAssignStatements
- Outputs warnings or errors (depending on
ERROR_ON_NL_ASSIGN_STATEMENTS
) whenassign
statements are found in the netlist of the input state (assign statements cause some issues with some tools)
- Outputs warnings or errors (depending on
-
KLayout.OpenGUI
- Renamed
KLAYOUT_PRIORITIZE_GDS
toKLAYOUT_GUI_USE_GDS
to be consistent with the Magic steps. - Script no longer relies on the
click
library as the internal Python interpreter more often than not has trouble finding the site packages (and indeed the site packages includes its own pya/klayout which is its own headache.)
- Renamed
-
Magic.*
- All steps now use a new processor,
openlane.steps.magic.MagicOutputProcessor
, to capture and count errors - Fixed
magicrc
beingabspath
'd before command invocation (breaks reproducibles) _MAGIC_SCRIPT
is now set inprepare_env
instead ofrun_subprocess
(so it can be intercepted for reproducibles)
- All steps now use a new processor,
-
New step,
Magic.OpenGUI
, which opens either DEF files or GDS files in magic -
Magic.SpiceExtraction
:- A
feedback.xml
is now created, with the contents being the SPICE Extraction feedback in the KLayout marker database format - Created
MAGIC_EXT_ABSTRACT_CELLS
: a list of regular expressions that are matched against the design's cells names what are abstracted (black-boxed) during extraction.
- A
-
Netgen.LVS
:- Added
LVS_FLATTEN_CELLS
: A list of cells to flatten in LVS. - Added
LVS_INCLUDE_MARCOS_NETLIST
. If enabled macros' netlist are loaded when running LVS. Eitherpnl
ornl
orvh
views are selected. - Updated Netgen setup file to equate cells inside macros where the GDS is generated with blackbox macro option
- Added
-
Odb.ApplyDEFTemplate
: Thanks @smunaut- DEF template pin placement status (e.g.
PLACED
,FIXED
) now always propagated to work around PDN generation removing placed but unconnected power pins. - Fixed crashes when copying power pins from a template where the net name and the power pin name may be different (or one net may be connected to multiple power pins.)
- DEF template pin placement status (e.g.
-
Odb.ReportDisconnectedPins
- Disconnected dummy instances created during CTS, prefixed
clkload
, are now ignored.
- Disconnected dummy instances created during CTS, prefixed
-
Odb.SetPowerConnections
- Internal: Restructure
power_utils.py
to provide better error messages and use dictionaries instead of oddball iterator-based filtering
- Internal: Restructure
-
Created
OpenROAD.DEFtoODB
- Useful for custom flows, where the DEF is modified but the ODB needs to be updated to reflect these modifications
-
OpenROAD.*
- OpenROAD scripts now set
set_wire_rc
for the average values of the layers grouped by routing direction. All layers in the routing range are used if eitherSIGNAL_WIRE_RC_LAYERS
orCLOCK_WIRE_RC_LAYERS
are null. - Slight internal Tcl code reorganization.
- OpenROAD scripts now set
-
OpenROAD.Floorplan
- Added soft placement obstructions via new variable
PL_SOFT_OBSTRUCTIONS
.
- Added soft placement obstructions via new variable
-
OpenROAD.RepairDesignPostGPL
- Added new variable
DESIGN_REPAIR_REMOVE_BUFFERS
, which will instruct OpenROAD to remove synthesis buffers so there's more flexibility during design repair: see https://github.com/The-OpenROAD-Project/OpenROAD/blob/ad54bbe88b561d1c30451d8a3c85ad11c1692905/src/rsz/README.md?plain=1#L185
- Added new variable
-
Yosys.*
- Added new variable
YOSYS_LOG_LEVEL
, which controls the verbosity of Yosys output
- Added new variable
-
Yosys.*Synthesis
-
Moved the
rename
of top module to before selecting it. This fixes a problem DFFRAM where needed modules are optimised away and then synthesis fails. (Thanks @donnie-j!) -
Syntheses with
SYNTH_ELABORATE_ONLY
no longer report undriven nets as a check error (frequently for some top-level integrations, output pins are left undriven entirely to save space.)
-
- Created new mono-step flow,
OpenInMagic
, which runsMagic.OpenGUI
VHDLClassic
is now based onClassic
with appropriate `Substitutions
-
All tool nix derivations now have
rev
/version
andsha256
as one of their parameters, allowing them to be easily replaced with.override
. -
OpenLane 2 now uses nix-eda for some of its dependencies
nixpkgs
->24.05
klayout
->0.29.1
magic
->8.3.483
/291ba96
- now uses tk with X11 on macOS, to prevent crashes when attempting to use the GUI
netgen
->bf67d3c
forAllSystems
built intonix-eda
, now composes overlays for nixpkgs based on thewithInputs
field, allowing for easier overriding
-
volare
->0.18.1
-
ioplace_parser
->0.3.0
-
openroad
->b16bda7
- Removed OpenLane-specific patch for querying existence of antenna information
openroad-abc
->ef5389d
ABC_USE_NAMESPACE
now set, value also injected into header files
opensta
->e01d3f1
-
Python build tool changed from
setuptools
topoetry
, which properly verifies that all version ranges are within constraints- Updated wrong Python package version ranges that all happen to work
-
Nix devshells now use numtide/devshell, which creates an executable to enter the environment, allowing for easy repacking
-
Docker image creation now uses a Nix derivation based on that of the official Nix Docker image, which includes a full Nix installation in the image (so users may add tools and apps in the container at their leisure.)
-
mdformat
promoted from overlay topackages
.
-
openlane.flows.SequentialFlow
- Substitutions can now
- be done at the class level by assigning to
Substitutions
- be done in
config.json
files using a dictionary in the field.meta.substituting_steps
- emplace steps before or after existing steps, e.g.
+STEP
,-STEP
- be done at the class level by assigning to
- Step names for
from
,to
,skip
andonly
are now fuzzy-matched usingrapidfuzz
to give suggestions in error messages- If the environment variable
_i_want_openlane_to_fuzzy_match_steps_and_im_willing_to_accept_the_risks
is set to1
, the suggestions are used automatically (not recommended)
- If the environment variable
- Gating config vars are now simply removed if they do not target a valid step (so removed steps in a substituted flow do not cause a FlowException)
- Substitutions can now
-
openlane.common
DRC
: Work around a weird macOS-only bug where boxes in exported KLayout marker databases would not function properly: see KLayout/klayout#1550GenericDictEncoder
: Fixed crash when attempting to dump a Decimal of infinite value
-
openlane.common.config
- Trailing commas are now permitted when converting from a string format (which are necessary because of the ambiguity of lists of lists.)
-
openlane.steps.DefaultOutputProcessor
%OL_METRICS_F
now uses Decimals instead of Floats
-
openlane.steps.Step.create_reproducible
PDK_ROOT
now included if the PDK is included but not flattened so Magic steps can work
-
openlane.steps.TclStep
- Internal: Internal environment variables prefixed with
_
are no longer rerouted to_env.tcl
, instead being passed raw (to help with creating reproducibles)
- Internal: Internal environment variables prefixed with
-
Universal flow configuration variable
DATA_WIRE_RC_LAYER
renamed toSIGNAL_WIRE_RC_LAYERS
,CLOCK_WIRE_RC_LAYER
renamed toCLOCK_WIRE_RC_LAYERS
, with translation behavior and data type changed toList[str]?
- Universal PDK variables
SIGNAL_WIRE_RC_LAYERS
/CLOCK_WIRE_RC_LAYERS
no longer have default values for all PDKs (are null.)
-
Fixed new typing inconsistencies exposed by mypy.
-
Removed loop header genvar declaration from examples (limited compatibility with some tools)
-
Created a new document on writing plugins.
-
Updated the architecture document to reflect changes and clarify some elements.
-
Updated documentation of the
state
submodule. -
Updated Usage/Writing Custom Flows to document step substitution
-
Fixed a number of broken links.
- Fixed a deadlock in some situations because of
OpenROAD.STAPrePNR
using the global thread-pool for OpenLane, which may be used to run the step itself.
- Relaxed
rich
version range to allow Rich 13.- Matches Volare's version range and allows CACE and OpenLane 2 to be installed in the same Python environment.
- Fixed
--ef-save-views-to
saving tosignoff/<design>/openlane
instead ofsignoff/<design>/openlane-signoff
(which makes less sense but is the established convention at Efabless.)
-
OpenROAD.*
- Fixed environment contamination with deprecated variables that may be used by user-supplied PDN or SDC files.
-
OpenROAD.GeneratePDN
- Restored compatibility with some ancient OpenLane PDN config files.
- Updated
ioplace_parser
to0.2.0
- Fixes regressions in pin regular expression parsing.
Odb.DiodePortInsertion
,Odb.DiodesOnPorts
- Fixed bug where diodes were never inserted on outputs, and added unit tests to that effect.
- Overhauled Tcl configuration loading code to fix a number of bugs that may occur when a Tcl file sources another Tcl file, such as for TinyTapeout configs (thanks @htfab)
- Fixed a crash on Linux distributions where
/etc/lsb-release
includes comments.
- The flow warning summary now only shows the first instance of any warning emitted, instead showing two numbers for identical warnings in other steps and for similar warnings (e.g. same OpenROAD code.)
-
Odb.SetPowerConnections
- Fixed bug where instances with special characters in their name and power pins are not equal to those of the SCL would not get connected.
- Added assertion that exactly one pin is connected for every operation.
-
Yosys.GenerateJSONHeader
- Netlist is now flattened so
Odb.SetPowerConnections
can properly set pins for nested macros with power pin names not equal to those of the SCL.
- Netlist is now flattened so
- Updated OpenROAD to
d423155
, OpenSTA toa7f3421
- Addresses an antenna repair bug
- Updated a number of unit tests to reflect new OpenROAD error codes.
- Fixed failing design integration tests.
Odb.ReportDisconnectedPins
- Fixed table not being written to step directory
- Fixed bug where table widths were not being set properly
- Fixed bug where pins with
USE SIGNAL
would be considered power pins
OpenROAD.*
- Fixed alert about unmatched regexes in
PDN_MACRO_CONNECTIONS
not being properly marked as an[ERROR]
. - Fixed crash when steps that generate OpenROAD alerts that are suppressed by the flow experience a non-zero exit.
- Updated messaging to be a bit more consistent wrt OpenLane 1 vs OpenLane 2.
- Resolved bug causing nonexistent mounted volumes to be created as root when
using a non-rootless container engine with
--dockerized
. - Fixed issue where PIP versions of OpenLane would not be able to copy examples properly.
- Environment detection scripts no longer use
nix-info
, saving time.
-
OpenROAD.STAPrePnR
- Now performs multicorner STA pre-PnR according to
STA_CORNERS
; although if two corners have identical file lists the latter corner is skipped - Internally rearranged class structure so STA pre and post PnR share as much code as possible
- Now performs multicorner STA pre-PnR according to
-
Yosys.*
- Fixes a bug where synthesis checks were not passed properly when
SYNTH_ELABORATE_ONLY
is true. - Internal:
- Created new namespace,
yosys_ol
, to encapsulate a number of reusable functions for modularity and readability - Created two new functions
ol_proc
andol_synth
; to encapsulate our modifiedsynth
andproc
instead of them being strewn acrosssynthesize.tcl
- ABC script construction moved to standalone file
- Created new namespace,
- Fixes a bug where synthesis checks were not passed properly when
openlane.steps
Step
.start()
no longer prints logs at the beginning as it may not necessarily exist
openlane.steps
eject
*now overridespsutils.Popen()
instead ofrun_subprocess
, allowing it to run at a lower levelPATH
,PYTHONPATH
now excluded fromrun.sh
-
Checker.PowerGridViolations
- Fixed mistakenly added whitespace in
FP_PDN_CHECK_NODES
- Fixed mistakenly added whitespace in
-
Magic.WriteLEF
- Added new variable
MAGIC_WRITE_LEF_PINONLY
, which writes the LEF with with the-pinonly
option; declaring nets connected to pins on the same metal layer as obstructions and not part of the pin
- Added new variable
-
OpenROAD.*
,Odb.*
- Outputs now processed first by new class
OpenROADOutputProcessor
, which captures warnings and errors from OpenROAD into a data structure and emits them using OpenLane's logger
- Outputs now processed first by new class
-
OpenROAD.CTS
- Made
CTS_MAX_CAP
a non-PDK value, and also optional as the values in the PDK configuration are bad and OpenROAD does a better job without it - CTS no longer passes
MAX_TRANSITION_CONSTRAINT
, instead using a new variableCTS_MAX_SLEW
if it exists - Fixed issue where no arguments were passed to
configure_cts_characterization
- Fixed bug where an incorrect value was passed to the
-max_slew
option
- Made
-
Odb.ApplyDEFTemplate
- Added new variable,
FP_TEMPLATE_COPY_POWER_PINS
, that always copies power pins from the DEF template - Power pins are now filtered and exempt from placement otherwise, allowing the step to be runnable after PDN generation
- Added new variable,
-
Odb.CustomIOPlacement
- Power pins are now filtered and exempt from placement, allowing the step to be runnable after PDN generation
FP_IO_VLENGTH
,FP_IO_HLENGTH
are now both optional PDK variables- The values are now used properly instead of a taking the maximum of both for both kinds of pins
- For PDKs that do not specify them, the script calculates default values based on the layers' rules
QUIT_ON_UNMATCHED_IO
now migrates to new variableERRORS_ON_UNMATCHED_IO
, an enumeration of four variables that controls whether errors are emitted in:- no situation
- situations where pins in the design are missing from the config file (default, matching openlane 1)
- situations where pins in the config file are missing from the design (new)
- either situation
- Better error message for too many pins on the same side
-
OpenROAD.GlobalPlacement
- Added
PL_MIN_PHI_COEFFICIENT
,PL_MAX_PHI_COEFFICIENT
for when global placement diverges
- Added
-
OpenROAD.GlobalPlacementSkipIO
PL_TIMING_DRIVEN
andPL_ROUTABILITY_DRIVEN
no longer passed (useless with-skip_io
)
-
OpenROAD.IOPlacement
FP_IO_VLENGTH
,FP_IO_HLENGTH
,FP_IO_MIN_DISTANCE
are now all optional PDK variables- For PDKs that do not specify them, OpenROAD calculates default values based on the layers' rules
-
OpenROAD.ManualMacroPlacement
- API Break: Verilog names of macros are now considered instead of DEF
names in the event of a mismatch (e.g. for instances with
[]
or/
in the name.)
- API Break: Verilog names of macros are now considered instead of DEF
names in the event of a mismatch (e.g. for instances with
-
OpenROAD.STAPrePnR
,OpenROAD.STAPostPnR
- Added new configuration variable
EXTRA_SPEFS
ONLY for backwards compatibility with OpenLane 1 that should not otherwise be used
- Added new configuration variable
-
OpenROAD.STAPrePNR
- Unset clock propagation for this step (misleading as the clock should be ideal before CTS)
-
Verilator.Lint
- Now works with the preprocessor macro
VERILOG_POWER_DEFINE
being defined - justification is that most macros come with a powered netlist than a regular netlist CELL_BB_VERILOG_MODELS
is no longer used, with the blackbox models always getting generated (so power pins can be included)__openlane__
,__pnr__
,PDK_{pdk_name}
andSCL_{scl_name}
are all always defined as preprocessor macros- Fixed issue where the order of files may not be preserved for macros, causing linting to fail
- Internally adjusted how linter flags are set; a
.vlt
file is used to turn off certain linting rules for the black-box models instead of copying and wrapping the black-box comments in comments
- Now works with the preprocessor macro
-
Yosys.*
__openlane__
,__pnr__
,PDK_{pdk_name}
andSCL_{scl_name}
are all always defined as preprocessor macros
-
Yosys.JsonHeader
- Now reads generated black-boxed models of the standard cells with power pins instead of lib files, allowing power pins to be explicitly specified for hand-instantiated cells as well without issue
Classic
- Added
Odb.AddRoutingObstructions
before global routing - Added
Odb.RemoveRoutingObstructions
after detailed routing - Moved PDN generation steps before Global Placement
- Added
magic
->8.3.466
/bfd938b
- Addresses a bug with reading DEF files using generated vias
- Updated KLayout to
0.28.17-1
- Relaxes PIP version range to accept newer patches (not newer minor versions)
- Added an OpenLane 1-compatible configuration for
aes_user_project_wrapper
to test back-compat - Ensured
open_proj_timer
config matches OpenLane 1's as closely as possible - Updated unit tests because newer versions of flake8 hate
pytest.fixture()
for some reason - Updated step unit tests that look for OpenROAD alerts to use captured alerts instead of checking the log.
openlane.common
Toolbox
- New method,
get_timing_files_categorized
, returns the three design formats in, get this, three separate lists
- New method,
openlane.config
Config
- No longer attempts to migrate
EXTRA_SPEFS
toMACROS
because of side-effects (e.g. the dummy paths)
- No longer attempts to migrate
- PDK backwards-compatibility script now skips migrating
LIB_*
ifLIB
already exists- "Default" constraints made exclusive to
sky130
andgf180mcu
- "Default" constraints made exclusive to
openlane.steps.Step
run_subprocess
: New concept of "output processors"- classes that may do processing on the output of a step to parse it- Default output parsing behavior implemented as
DefaultOutputProcessor
run_subprocess
no longer returns just metrics, rather, metrics are returned under the keygenerated_metrics
when theDefaultOutputProcessor
is used along with the results of other output processors
- Default output parsing behavior implemented as
- Slightly adjusted widths of printed tables across the codebase for readability.
-
OpenROAD.ManualMacroPlacement
- Verilog names of macros are now considered instead of DEF names in the event
of a mismatch (e.g. for instances with
[]
or/
in the name.)
- Verilog names of macros are now considered instead of DEF names in the event
of a mismatch (e.g. for instances with
-
openlane.steps.Step
run_subprocess
no longer returns just metrics, rather, metrics are returned under the keygenerated_metrics
when theDefaultOutputProcessor
is used along with the results of other output processors
- Adapted timing closure guide by @shalan to
OpenLane 2
- Converted to MyST Markdown
- All images made dark-mode friendly
- References to variables all now resolve properly
- Fixed a number of inconsistencies and broken links.
- Fixed
--ef-save-views-to
not saving.mag
,.gds
views
Checker.*
- Created new
ERROR_ON
variables with the removedQUIT_ON
variables from theClassic
flow being added as deprecated names for these variables. - Disabling
ERROR_ON*
(previouslyQUIT_ON*
) no longer bypasses a step entirely. A warning will be generated and the flow will not quit.
- Created new
Checker.TimingViolations
TIMING_VIOLATIONS_CORNERS
renamed toTIMING_VIOLATION_CORNERS
- Now creates a new variable
<violation_type>_VIOLATION_CORNERS
for its subclasses. This allows for fine-grained control of the IPVT corners checked by each subclass. - Now generates errors for violations occuring at
TIMING_VIOLATION_CORNERS
(unless the subclass variable override is defined) and generates warnings for violations in the rest of the IPVT corners.
Checker.HoldViolations
- Added
HOLD_VIOLATION_CORNERS
which takes precedence overTIMING_VIOLATION_CORNERS
- Added
Checker.SetupViolations
- Added
SETUP_VIOLATION_CORNERS
acting similar toHOLD_VIOLATION_CORNERS
.
- Added
- Created
Checker.MaxCapViolations
- Reports maximum capacitance violations.
- Added
MAX_CAP_VIOLATION_CORNERS
. It defaults to[""]
which is the value for matching no corners (i.e. all violations are reported as warnings).
- Created
Checker.MaxSlewViolations
- Reports maximum slew violations.
- Added
MAX_SLEW_VIOLATION_CORNERS
. It defaults to[""]
which is the value for matching no corners (i.e. all violations are reported as warnings).
OpenROAD.GlobalPlacementSkipIO
- Fixed a bug where
PL_TARGET_DENSITY_PCT
is calculated base onFP_CORE_UTIL
in designs withFP_SIZING
set toabsolute
. The behavior now matchesOpenROAD.GlobalPlacement
.
- Fixed a bug where
Yosys.*
- Verilog files are now read with
-noautowire
. This changes the defaultdefault_nettype
tonone
, no longer tolerating implicitly declared wires unlessdefault_nettype
is explicitly set to something else in a particular source file.
- Verilog files are now read with
Classic
,VHDLClassic
- API Break: Removed all
QUIT_ON*
variables from the flow itself - Added
Checker.MaxSlewViolations
- Added
Checker.MaxCapViolations
- API Break: Removed all
- Updated
black
to23
+ matching formatting changes to the code - Makefile no longer creates venvs for most targets
- Default Nix shell no longer includes development-specific tools (jdupes,
alejandra, pytest…), new devShell
dev
includes these tools and more
- Created two coverage commands in the
Makefile
, one for infrastructure unit tests and the other for step unit tests
openlane.flows.Flow
:- All warnings captured are now printed at the end of the flow à la OpenLane 1.
openlane.flows.SequentialFlow
:- Deferred errors are now handled in the same way normal errors are.
- Various internal environment variables changed from
_lower_snake_case
to_UPPER_SNAKE_CASE
for (relative) consistency openlane.common.TclUtils
- Empty strings now escaped as
""
- Empty strings now escaped as
openlane.steps.Step
- Printing of last 10 lines of a file now uses a ring buffer instead of concatenating then splitting then joining
openlane.steps.TclStep
- Various handcrafted joins in subclasses now use
TclStep.value_to_tcl
orTclUtils.join
- API Break:
value_to_tcl
no longer converts dataclasses to JSON, rather, they're converted to Tcl dicts - API Break:
run_subprocess
now intercepts and passes most environment variables are now passed indirectly, i.e., a file is made and placed under the variable_TCL_ENV_IN
, which is then to be sourced by scripts. This helps avoid the 1 MiB args + env limit in macOS / 2 MiB args + env limit in Linux.
- Various handcrafted joins in subclasses now use
- API Break: Removed all
QUIT_ON*
variables from the theClassic
,VHDLClassic
per se, however they are not translated variables.
- Fixed bug with newcomer's guide (thanks @calvbore)
- Multiple configuration files now supported, incl. mixes of JSON and Tcl files
- Added new flag,
--show-progress-bar/--hide-progress-bar
, also self-explanatory - Added new flag,
--run-example
, which instantiates and runs one of the example designs - Added new flag,
--condensed
, which setslogging.options.condensed_mode
and changes the default for showing the progress bar toFalse
- Added new entry script,
openlane.config
, which allows configuration files to be interactively generated - Fixed bug where 0 config files causes a crash
- All steps:
- Change skipped-step
warn
s toinfo
if the skip should not necessarily be a cause for alarm - Suppressed warnings about dead processes when tracking subprocess resource usage
- Fixed crash when subprocesses emit non-UTF-8 output: Now a proper
StepException
is raised
- Change skipped-step
- Created
KLayout.DRC
- Only compatible with sky130 (skipped for other PDKs)
- Created
Checker.PowerGridViolations
- Raises deferred step error if
design__power_grid_violation__count
is nonzero
- Raises deferred step error if
- Created
Checker.SetupViolations
,Checker.HoldViolations
to check setup/hold timing violations- Add config variable
TIMING_VIOLATIONS_CORNERS
, which is a list of wildcards to match corners those steps will flag an error on.
- Add config variable
KLayout.OpenGUI
- Added a new boolean config var,
KLAYOUT_EDITOR_MODE
to that enables editor mode in KLayout - Added new variable
KLAYOUT_PRIORITIZE_GDS
, which as the name implies, prioritizes GDS over DEF if there's a GDS in the input state. cwd
for subprocess set to step directory for convenience- Fixed bug where viewer mode was not working
- Added a new boolean config var,
Odb.*
,KLayout.*
- Subprocesses now inherit
sys.path
inPYTHONPATH
which allowsnix run
to work properly
- Subprocesses now inherit
Odb.ApplyDEFTemplate
- Added
FP_TEMPLATE_MATCH_MODE
, with valuesstrict
(default) orpermissive
withstrict
raising an error if any pins are missing from either the template or the design. - Warn when the template DEF die area is different from the design die area.
- No longer copies the die area from the DEF template file-- floorplanning
needs to be executed correctly first.
DIE_AREA
- Added
Odb.CustomIOPlacement
- Completely re-implemented pin placement file parser in Antlr4 for more thorough syntax and semantic checking at https://github.com/efabless/ioplace_parser
- Formalized concept of annotations; documented three annotations:
@min_distance
,@bit_major
, and@bus_major
. - Rewrote
openlane/scripts/odbpy/io_place.py
to rely on the new parser + general cleanup
Odb.ManualMacroPlacement
- Instances missing placement information are no longer treated as errors and are simply skipped so it can be passed on to other steps (or if is information about a nested macro)
- Created new step
Odb.WriteVerilogHeader
- Writes a
.vh
file using info from the layout post-PDN generation and the Verilog header
- Writes a
OpenROAD.*
- Updated to handle
EXTRA_EXCLUDED_CELLS
- No longer trimming liberty files, relying on
set_dont_use
instead
- Updated to handle
OpenROAD.CheckAntennas
- Added new
antenna_summary.rpt
file with a summary table for antennas matching that of OpenLane 1
- Added new
OpenROAD.Floorplan
PL_TARGET_DENSITY_PCT
default calculation now prioritizes using metricdesign__instance__utilization
if available.- Fixed a crash where obstructions were passed as floats instead of database unit integers and caused a crash.
OpenROAD.GeneratePDN
- Renamed
DESIGN_IS_CORE
toFP_PDN_MULTILAYER
, which is more accurate to its functionality - Removed comments about assumptions as to the PDN stack config with regards to top-level integrations vs macros: macros can have two PDN layers and a core ring
- Fixed issue where a PDN core ring would still be created on two layers even
if
FP_PDN_MULTILAYER
is set to false- an error is thrown now - Fixed issue where
FP_PDN_VSPACING
is not passed toadd_pdn_stripe
whenFP_PDN_MULTILAYER
is set to false (thanks @mole99) - API Break:
FP_PDN_CHECK_NODES
is no longer a config variable for this step. The relevant checks are always run now, however, they do not cause the flow to exit immediately, rather, they generatedesign__power_grid_violation__count
metrics.
- Renamed
OpenROAD.GlobalPlacementSkipIO
- Updated to do nothing when
FP_DEF_TEMPLATE
is defined
- Updated to do nothing when
OpenROAD.IOPlacement
- Updated to do nothing when
FP_DEF_TEMPLATE
is defined.
- Updated to do nothing when
OpenROAD.IRDropReport
- Added
VSRC_LOC_FILES
for IR Drop, printing a warning if not given a value - Rewrote internal IR drop script
- Added
OpenROAD.Resizer*
,OpenROAD.RepairDesign
RSZ_DONT_USE_CELLS
removed, added as a deprecated name forEXTRA_EXCLUDED_CELLS
OpenROAD.STAPostPNR
- Added hold/setup reg-to-reg worst violation to STA summary table.
- Added hold/setup tns to STA summary table.
- Slack values of zero are now highlighted green instead of red.
- Changed summary table column header from
reg-to-reg
toReg to Reg Paths
for readability - Fixed slacks for
Reg to Reg Paths
only showing negative values.
Yosys.*
- Updated to handle
EXTRA_EXCLUDED_CELLS
- Internally replaced various
" ".join
s toTclUtils.join
- Implementation detail: "internal" variables to be lowercase and prefixed with an underscore as a pseudo-convention
- Turned
read_deps
into one sourced script that is generated by Python instead of a Tcl function (as was the case for.EQY
) - For maximum compatibility, priority of views used of macros changed, now, in
that order it's
- Verilog Header
- Netlist/Powered Netlist
- Lib File
- Fixed bug where Lighter would not be executed properly
- Updated to handle
Yosys.Synthesis
- Updated error for bad area/delay format to make a bit more sense
- Updated internal
stat
calls to Yosys to pass the liberty arguments so the area can be consistently calculated - Fixed bug where custom technology maps were not properly applied
- Removed
SYNTH_STRATEGY
valueAREA 4
-- never existed or worked
- All flows
- Added a
flow.log
, logging at aVERBOSE
log level - Properly implemented filtering for
error.log
andwarning.log
- Constructors updated to support multiple configuration files
- Added a
- Universal Flow Configuration Variables
- Created
TRISTATE_CELLS
, acceptingTRISTATE_CELL_PREFIX
from OpenLane 1 with translation behavior - Created new PDK variable
MAX_CAPACITANCE_CONSTRAINT
- Also added to
base.sdc
- Also added to
- Created new variable
EXTRA_EXCLUDED_CELLS
, which allows the user to exclude more cells throughout the entire flow - Renamed
PRIMARY_SIGNOFF_TOOL
toPRIMARY_GDSII_STREAMOUT_TOOL
with translation behavior - Renamed
GPIO_PADS_PREFIX
toGPIO_PAD_CELLS
with translation behavior - Renamed
FP_WELLTAP_CELL
toWELLTAP_CELL
with translation behavior - Renamed
FP_ENDCAP_CELL
toENDCAP_CELL
with translation behavior - Renamed
SYNTH_EXCLUSION_CELL_LIST
toSYNTH_EXCLUDED_CELL_FILE
with translation behavior - Renamed
PNR_EXCLUSION_CELL_LIST
toPNR_EXCLUDED_CELL_FILE
with translation behavior
- Created
SynthesisExploration
- Added new flow,
SynthesisExploration
, that tries all synthesis strategies in parallel, performs STA and reports key area and delay metrics
- Added new flow,
Classic
ApplyDEFTemplate
now takes precedence overCustomIOPlacement
, matching OpenLane 1- Added
Checker.PowerGridViolations
to the flow, gated byQUIT_ON_PDN_VIOLATIONS
(which has a deprecated name ofFP_PDN_CHECK_NODES
) for back-compat with OpenLane 1 configurations - Added
Checker.SetupViolations
,Checker.HoldViolations
to the end of the flow- Both gated by
QUIT_ON_TIMING_VIOLATIONS
- Each gated by
QUIT_ON_SETUP_VIOLATIONS
,QUIT_ON_HOLD_VIOLATIONS
respectively
- Both gated by
- Repository turned into a Flake with
openlane
as the default output package and the previous shell environment as the default output devShellflake-compat
used sonix-shell
continues to work as you'd expect for classic nix
- All package
.nix
files- Now follow the
nixpkgs
convention of explicitly listing the dependencies instead of takingpkgs
as an argument - Have a
meta
field
- Now follow the
- Reformatted all Nix code using alejandra
- Updated Open PDKs to
bdc9412
- Updated OpenROAD to
75f2f32
- Added some conveniences for manual compilation to the Nix derivation
- Updated Volare to
0.16.0
/4732594
- New class in API, the
Family
class, helps provide more meaningful error reporting if the user provides an invalid PDK variant (and resolves to a variant if just a PDK name is provided)
- New class in API, the
- Updated Yosys to
0.38
/543faed
- Added Yosys F4PGA SDC plugin (currently unused)
- Added KLayout's python module to the explicit list of requirements
- Added various IPM designs to the CI
- Added a full caravel user project example (wrapper + example) to the CI
- Greatly expanded unit tests for individual steps
- Created new folder in module,
examples
which contains example designs (of whichspm
is used as a smoke test) __main__
- Two new commandline flags added
--save-views-to
: Saves all views to a directory in a structure after successful flow completion usingState.save_snapshot
--ef-save-views-to
: Saves all views to a directory in the Efabless format/convention, such as the one used by Caravel User Project.
openlane.logging
LogLevels
is now an IntEnum instead of a class with global variables- Create a custom formatter for logging output instead of passing the formatting options as text to the logger
- Created new log level,
SUBPROCESS
, betweenDEBUG
andVERBOSE
, and made it the new default - Create a separate handler for logs with level
SUBPROCESS
that doesn't print timestamps, level, etc - New global singleton
options
created, which allows to configure both:condensed_mode
: boolean to make the logs terser and suppress messages withSUBPROCESS
level unconditionallyshow_progress_bar
: boolean, self-explanatory
- API Break: Removed
LogLevelsDict
, LogLevels[] now works just fine - Changed all instances of
WARN
toWARNING
for consistency - Fixed bug where
VERBOSE
logging in internal plain output mode simply usedprint
openlane.state
- Added new
DesignFormat
:VERILOG_HEADER
- Added new
openlane.common
Toolbox
- Objects no longer create a folder immediately upon construction
remove_cells_from_lib
now accepts wildcard patterns to match against cells (to match the behavior of OpenROAD steps)get_macro_views
can now take more than oneDesignFormat
forunless_exist
- New
click
type,IntEnumChoice
, which turns integer enums into a set of choices accepting either the enum name or value - New function
process_list_file
to process.gitignore
-style files (list element/comment/empty line)
openlane.config
- Updated to support an arbitrary number of a combination of Tcl files, JSON
files and python dictionaries (or any object conforming to
Mapping
) to create configuration files, each with their ownMeta
values design_dir
can now be set explicitly, but if unset will takedirname
of last config file passed (if applicable)- Internally unified how Tcl-based configurations and others are parsed
Instance
fieldslocation
,orientation
now optionalMacro
has two new views now,vh
andpnl
- New
DesignFormat
added: *openlane.config.DesignFormat
- Updated to support an arbitrary number of a combination of Tcl files, JSON
files and python dictionaries (or any object conforming to
openlane.steps
__main__
- Use default
--pdk-root
forrun
command
- Use default
Step
load()
's pdk_root flag can now be passed asNone
where it will default tocwd
- New method
load_finished()
to load concluded steps (which loads the output state and step directory) factory
- New method
from_step_config()
which attempts to load a step from an input configuration file- Reworked step-loading function to use
from_step_config()
where appropriate
- Reworked step-loading function to use
- New method
create_reproducible()
- Added
flatten
to public API, which flattens the file structure with the exception of the PDK, which is saved topdk/$PDK
- Modified behavior of flatten to allow including the PDK (which isn't flattened)
- Generated
run_ol.sh
now passes ARGV to the final command (backwards compatible with old behavior)- Primary use for this:
run
command now accepts--pdk-root
flag
- Primary use for this:
- Added
- Added runtime to
*.process_stats.json
openlane.flows
- Added new instance variable,
config_resolved_path
, which contains the path to theresolved.json
of a run - Flows resuming existing runs now load previously concluded steps into
self.step_objects
so they may be inspected
- Added new instance variable,
- Fixed an issue where Docker images did not properly have dependencies of
dependencies set in
PYTHONPATH
. - Fixed a corner case where some OpenLane 1 JSON configs that use Tcl-style dicts that include paths would fail conversion to a Python dict
- Fixed a bug with ejected reproducible scripts keeping some nix store paths.
- Fixed Docker images not having
TMPDIR
set by default - Updated Nix overlays to detect Darwin properly, added another fix for
jshon
- Updated Nix derivation to ignore
__pycache__
files - Suppressed tracebacks in more situations (too shouty)
- Removed
PYTHONPATH
fromdefault.nix
- OpenLane now passes itssite-packages
to subprocesses (less jank) (but still a bit jank)
- Universal Flow Configuration Variables
CTS_ROOT_BUFFER
,CTS_CLK_BUFFERS
andCTS_MAX_CAP
all moved toOpenROAD.CTS
IGNORE_DISCONNECTED_MODULES
moved toOdb.ReportDisconnectedPins
GPL_CELL_PADDING
moved toOpenROAD.GlobalPlacement
DPL_CELL_PADDING
moved to steps that have the rest of thedpl
variablesGRT_LAYER_ADJUSTMENTS
moved to steps that have the rest of the routing layer variables- Moved
GRT_OBS
toOdb.AddRoutingObstructions
as a deprecated name forROUTING_OBSTRUCTIONS
- Removed
FP_CONTEXT_DEF
,FP_CONTEXT_LEF
, andFP_PADFRAME_CFG
: To be implemented - Removed
LVS_INSERT_POWER_PINS
,RUN_CVC
,LEC_ENABLE
,CHECK_ASSIGN_STATEMENTS
- Moved
DesignFormat
,DesignFormatObject
fromopenlane.common
toopenlane.state
openlane.common.Toolbox.remove_cells_from_lib
no longer acceptsas_cell_lists
as an argument, requiring the use ofprocess_list_file
instead- Removed
LogLevelsDict
,LogLevels[]
now works just fine
- Added Glossary
- Added FAQ
- Added note on restarting Nix after configuring the Cachix substituter
- Added a first stab at (conservative) minimum requirements for running OpenLane- you can definitely get away with less at your own risk
- Added extensions to make the documentation better to write and use:
sphinx-tippy
for tooltipssphinx-copybutton
for copying terminal commandssphinxcontrib-spelling
so we don't write "Verliog"
- Custom extension so Flows, Steps and Variables can be referenced using custom MyST roles
- Added a new target to the
Makefile
,watch-docs
, which watches for changes to rebuild the docs (requiresnodemon
) - Separated the "Getting Started" guide into a tutorial for newcomers and a migration guide for OpenLane veterans
- Changed all
.png
files to.webp
(saves considerable space, around 66% per image) - Updated all Microsoft Windows screenshots to a cool 150% UI scale
- Updated generated documentation for steps, flows and universal configuration variable
- Updated Readme to reflect
aarch64
support - Updated docstrings across the board for spelling and terminology mistakes
- All:
- Changed type of
DIE_AREA
and andCORE_AREA
toOptional[Tuple[Decimal, Decimal, Decimal, Decimal]]
- Changed type of
KLayout.*
:- Propagated
venv
sitepackages toPYTHONPATH
- Rewrote scripts to use either the Python API or use arguments passed via
KLAYOUT_ARGV
instead of the weird-rd
pseudo-serialization
- Propagated
KLayout.XOR
:- Fixed threads not working properly
KLAYOUT_XOR_THREADS
is now optional, with the thread count being equal to your thread count by default- Added new variable,
KLAYOUT_XOR_TILE_SIZE
, which is the size of the side of a tile in microns (the tile size must be sufficiently smaller than the design for KLayout to bother threading) - Added
info
prints for thread count
Magic.*
:- Base
MagicStep
no longer overridesrun
, but does overriderun_subprocess
openlane/scripts/magic/common/read.tcl
is now a list of read-related Tcl functions used across all Magic scripts- Added new variable
MAGIC_CAPTURE_ERRORS
to best-effort capture and throw errors generated by Magic.
- Base
Magic.StreamOut
:- Internally set
MAGTYPE
tomag
- Change sequence as follows
- Old sequence:
- Read tech LEF
- Read macro LEF views (if applicable)
- Read design DEF
- Read macro GDS views (if applicable)
- Write final GDS
- New sequence:
- Read tech LEF
- Read PDK SCL/GDS
- Depending on the value of
MAGIC_MACRO_STD_CELL_SOURCE
, if applicable:- Read macro GDS views as a black-box
- Read macro GDS views, de-referencing standard cells (i.e. using PDK definitions)
- Write final GDS
- Rationale: The old flow triggers a bug where references for cells inside a
macro's GDS view were broken broken. A workaround was suggested by Tim
Edwards and the new flow was adapted from his workaround.
- Additionally, the new flow is just plain more explicit and straightforward.
- Old sequence:
- Updated to throw errors when
MAGIC_MACRO_STD_CELL_SOURCE
is set tomacro
and:- Multiple GDS files are defined per macro
- A macro's GDS file does not have a PR boundary
- Internally set
Odb.*
- Added
openlane/scripts/odbpy
toPYTHONPATH
- Propagated
venv
sitepackages toPYTHONPATH
openlane/scripts/odbpy/defutil.py
:- Added validation for obstruction commands
- Added exit codes for validation errors in obstruction commands
- Added a command to remove obstructions
- Enhanced obstructions regex matching to account for >5 items in an obstruction definition.
- Added
- Created obstruction-related steps
Odb.AddRoutingObstructions
: Step for adding metal-layer obstructions to a designOdb.RemoveRoutingObstructions
: Step for removing metal-layer obstructions from a design.- The preceding two steps, and their derivatives, should be used in tandem, i.e., obstructions should be added then removed later in the flow.
Odb.AddPDNObstructions
: A subclass ofOdb.AddRoutingObstructions
that adds routing (metal-layer) obstructions that apply only to the PDN, using the variablePDN_OBSTRUCTIONS
. Runs before PDN generation.Odb.RemovePDNObstructions
: A subclassOdb.RemoveRoutingObstructions
that removes obstructions added byOdb.AddPDNObstructions
.
Odb.DiodesOnPorts
,Odb.HeuristicDiodeInsertion
:- Now automatically runs DPL and GRT to legalize after insertion
- Old behavior kept using new steps:
Odb.PortDiodePlacement
andOdb.FuzzyDiodeInsertion
. - Updated underlying script to have some more debugging options/be more resilient
- Fixed a bug where attempting to insert another diode of the same name would cause a crash
OpenROAD.*
:- Added three new entries to set of DesignFormats:
POWERED_NETLIST_SDF_FRIENDLY
POWERED_NETLIST_NO_PHYSICAL_CELLS
OPENROAD_LEF
- Added
openlane/scripts/odbpy
toPYTHONPATH
- Propagated
venv
sitepackages toPYTHONPATH
- Added three new entries to set of DesignFormats:
OpenROAD.WriteViews
- Writes the aforementioned new design formats
OpenROAD.CTS
,CVCRV.ERC
(unused):- Replaced legacy calls to
Step.run
causing crashes in some situations
- Replaced legacy calls to
- Created
OpenROAD.CutRows
OpenROAD.CutRows
,OpenROAD.TapDecapInsertion
:- Renamed
FP_TAP_VERTICAL_HALO
toFP_MACRO_VERTICAL_HALO
,FP_TAP_HORIZONTAL_HALO
toFP_MACRO_HORIZONTAL_HALO
- Rationale: Halo doesn't only affect tap insertion, it also affects cut rows generated in the floorplan. This affects cell insertion and power rails and anything related to floorplan and std cell placement.
- Renamed
OpenROAD.DetailedRouting
:- Added
info
prints for thread count
- Added
OpenROAD.Floorplan
:- Added new variable
FP_OBSTRUCTIONS
to specify obstructions during floorplanning - Added a new PDK variable,
EXTRA_SITES
, which specifies additional sites to use for floorplanning (as overlapping rows) even when:- Cells without double-heights are not used
- Double-height cells with missing or mislabeled LEF
SITE
(s) are used
- Added new variable
- Part of
OpenROAD.GlobalRouting
spun off asOpenROAD.RepairAntennas
- Added
OpenROAD.RepairAntennas
toClassic
flow afterOdb.HeuristicDiodeInsertion
; gated byRUN_ANTENNA_REPAIR
(with a deprecated name ofGRT_REPAIR_ANTENNAS
for backwards compat)
- Added
OpenROAD.IOPlacement
,OpenROAD.GlobalPlacementSkipIO
- Added new value for
FP_IO_MODE
which places I/O pins by annealing
- Added new value for
OpenROAD.ResizerTiming*
:- Added
PL_RESIZER_GATE_CLONING
andGRT_RESIZER_GATE_CLONING
respectively, which control OpenROAD's ability to perform gate cloning while runningrepair_timing
(default:true
)
- Added
OpenROAD.STAPostPNR
- Added
timing__unannotated_nets__count
to record number of annotated nets reports during post-PnR STA - Added
timing__unannotated_nets_filtered__count
which filters the former's count based on whether a net has a wire. A wire indicates if a net has physical implementation. If a net doesn't have a wire then it can be waived and filtered out.
- Added
Verilator.Lint
:- Fixed bug where inferred latch warnings were not properly processed
Yosys.*Synthesis
:- Per comments from Yosys Team
(1)
(2)
- Replaced instances of ABC command
rewrite
withdrw -l
with new variableSYNTH_ABC_LEGACY_REWRITE
being set totrue
restoring the older functionality (false
by default) - Replaced instances of ABC command
refactor
withdrf -l
with new variableSYNTH_ABC_LEGACY_REFACTOR
being set totrue
restoring the older functionality (false
by default)
- Replaced instances of ABC command
- New variable,
USE_SYNLIG
, enables the use of the Synlig frontend in place of the Yosys Verilog frontend for files enumerated inVERILOG_FILES
(disabled by default) - New variable,
SYNLIG_DEFER
, enables the experimental-defer
feature (see this part of Synlig's readme) (disabled by default) - Underlying scripts reworked to unify how Verilog files, preprocessor definitions and top level parameters are handled
- Exempt SystemVerilog
"$assert"s
from "unmapped cells" - Metric
design__latch__count
renamed todesign__inferred_latch__count
- Fixed
SYNTH_NO_FLAT
not working.
- Per comments from Yosys Team
(1)
(2)
Classic
flowOdb.DiodesOnPorts
andOdb.HeuristicDiodeInsertion
now run afterOpenROAD.RepairDesignPostGRT
(as the latter may create some long wires) but still beforeOdb.ResizerTimingPostGRT
(as timing repairs take priority)OpenROAD.CheckAntennas
added afterOpenROAD.DetailedRouting
OpenROAD.CutRows
added beforeOpenROAD.TapDecapInsertion
OpenROAD.AddPDNObstructions
andOpenROAD.RemovePDNObstructions
now sandwichOpenROAD.GeneratePDN
- Internally updated implementation of
VHDLClassic
flow to dynamically create.Steps
fromClassic
docs/source/index
:- Changed markup language from RST to Markdown
- Better disambiguation between OpenLane 1 and OpenLane 2
- Removed reference to unused utilities
- Hid top-level
toctree
polluting the landing page - Fixed links to incorrect repository
- Corners and STA: Now indexed; details some violations
- Updated documentation of
openlane.config.Variable.pdk
to make it a bit clearer
- Nix:
- Upgraded Nix Package Pin to
3526897
- Added support for
aarch64-linux
andaarch64-darwin
- Created new overlays:
cbc
: Use c++14 instead of the default c++17 (register
declarations)lemon-graph
:sed
patchregister
declarationspdlog-internal-fmt
:spdlog
but with its internalfmt
as the externalfmt
causes some problemsclp
to supportaarch64-linux
cairo
: to enable X11 support on macOSor-tools
: to use a new SDK onx86-64-darwin
(see thisclp
to supportaarch64-linux
- Reworked Nix derivations for the OpenLane shell, OpenLane, and the Docker
image
- Made OpenLane 2's
src
derivation allowlist-based rather than gitignore-based (smallersource
derivations) - Added a new argument to
default.nix
,system
, asbuiltins.currentSystem
is not available when using nix flakes (where in documentation it is described as "non-hermetic and impure": see https://nixos.wiki/wiki/Flakes). This change allows passing the system as argument and thus restores compatibility with nix flakes.
- Made OpenLane 2's
- Upgraded Nix Package Pin to
- Completely revamp Notebook
- Rewrite Nix setup section to be more tolerant of non-Colab setups
- Rewrite OpenLane dependencies to use a better method of installing
OpenLane's dependencies/hack in
tkinter
if it's missing (as it will be on local environments) - Added descriptions for all steps used
- Added RCX, STAPostPNR, LVS and DRC
- Added Surelog to the included utilities
- Extended CI to handle Linux aarch64 builds
- Excluded yosys-ghdl plugin from ARM-based builds and from macOS - never worked
- Upgraded KLayout to
0.28.13
- Made KLayout derivation more orthodox- distinct configure, build and install steps
- Made KLayout Python modules available to all Python scripts
- macOS: All KLayout Mach-O binaries patched to find the correct dylibs
without
DYLD_LIBRARY_PATH
- Upgraded Magic to
83ed73a
- Enabled
cairo
support on macOS, which allows Mac users to use the Magic GUI - Removed
mesa_glu
on macOS
- Enabled
- Fixed Yosys plugins propagating Yosys, causing conflicts
- Updated unit tests to work with some env changes in Python 3.11
- Removed
StringEnum
- Updated OpenPDKs to
e0f692f
- Updated OpenROAD to
6f9b2bb
- OpenSTA is now built standalone just like
openroad-abc
for modularity purposes - Fixes issue where post-GRT resizing run-time and memory consumption got out of hand: see The-OpenROAD-Project/OpenROAD#4121 (comment) for one example
- OpenSTA is now built standalone just like
- Updated Verilator to
v5.018
to fix a couple crashes, including a persistent one withspm
on Apple Silicon - Updated Volare to
0.15.1
- OpenLane now doesn't attempt to
enable
when usingvolare
- it points theConfig
object to the specific version directory for said PDK
- OpenLane now doesn't attempt to
- Updated Yosys to
0.34
/daad9ed
- Added the Synlig Yosys SystemVerilog Plugin
openlane.steps.step.Step.load
: Argumentstate_in_path
renamedstate_in
, also takesState
objectsopenlane.config.Config
:- For JSON configurations using
meta.version = 2
,DIE_AREA
andCORE_AREA
can no longer be provided as strings, and must be provided as an array of four numeric elements. - Removed global state when
Config.interactive
is used,state_in
now explicitly required- Rationale: the little convenience offered is far outdone by the annoyance of most steps being non re-entrant, so trying to run the same cell twice is almost always a crash.
- For JSON configurations using
OpenROAD.CTS
:- Removed
CTS_TOLERANCE
: no longer supported by OpenROAD
- Removed
OpenROAD.Floorplan
:- Removed
PLACE_SITE_HEIGHT
andPLACE_SITE_WIDTH
: redundant
- Removed
OpenROAD.GlobalRouting
:- Removed
GRT_REPAIR_ANTENNAS
. See details above.
- Removed
Odb.DiodesOnPorts
,Odb.HeuristicDiodeInsertion
:- Updated
HEURISTIC_ANTENNA_THRESHOLD
to be a non-optional PDK variable with default variables added inopenlane/config/pdk_compat.py
- Updated
Magic.StreamOut
:- Removed
MAGIC_GDS_ALLOW_ABSTRACT
: Bad practice
- Removed
- Removed
openlane.common.StringEnum
: UseLiteral['string1', 'string2', …]
- Added exit code propagation when a
StepError
is caused byCalledProcessError
- Added default Toolbox when Toolbox is not defined for a step
- Created a
.process_stats.json
file for every subprocess that has general statistics about a process's total elapsed time and resource consumption - Created method
openlane.common.Path.startswith
- Expanded
openlane.common.copy_recursive
to support dataclasses openlane.state.State._repr_html_
to better handle recursive outputs.openlane.config.Config
- Fixed bug in private methods where
pdkpath
was not being set in some scenarios - Fixed
_repr_markdown_
to use correct syntax identifier for YAML in Markdown
- Fixed bug in private methods where
- Fixes and tweaks for step reproducibles:
openlane.steps create-reproducible
has new flag,--no-include-pdk
, which excludes PDK files from reproducibles and make any reference to them utilizepdk_dir::
- Slight internal rework for
openlane.steps.Step.create_reproducible
to support flattened file structures suitable for testing - Reproducibles now no longer include views of the design not explicitly
declared in step
.inputs
- Fixed tuple loading for config variables
- Fixed unit test for tuple loading for config variables
- Fixed missing orientations for MACRO variables
- Created step unit testing infrastructure, relying on specially-laid out
folders that provide input data with the ability to add a per-step input data
preprocessor and output
- Requires
--step-rx
flag to be passed topytest
- Created submodule to host step tests
- Added step to Nix build that utilizes the step unit testing infrastructure
- Some space/data duplication avoidance measures: Allow missing
state.json
for empty state and creation of.ref
files
- Requires
- Created a new internal subcommand,
openlane.steps create-test
, which creates a flat reproducible that can be more easily added as a step unit - Ported
aes_user_project_wrapper
from OpenLane 1 - Added
user_proj_timer
from https://github.com/efabless/openframe_timer_example/tree/main/openlane/user_proj_timer - Changed
manual_macro_placement_test
design to have a macro with orientationFN
as a test for the aforemention - Enable post-GRT resizer for
aes_core
,spm
andaes
- Disabled latch linting for
salsa20
- Added IcarusVerilog as a dependency to OpenLane, and GTKWave as a Nix shell dependency
- Added power metric reporting to OpenSTA-based steps
- Updated OpenROAD to
bdc8e94
- Updated Yosys to 0.33 /
2584903
- Changed Yosys build process to use an external ABC as ABC takes 8 billion years to build (estimate)
- Patched Yosys and dependent utilities to use BSD libedit
- Reimplemented how Yosys plugins work in Nix, so they're all loaded with
Yosys
- Added derivations for:
- Created
Yosys.EQY
, a step based on EQY that runs at the very end of the flow comparing the RTL inputs and outputs (disabled by default) - Modified
Yosys.Synthesis
to support Lighter, which greatly reduces power consumption by clock-gating D-flipflops (disabled by default, setUSE_LIGHTER
to true to activate) - Created new step,
VHDLSynthesis
- Created new experimental flow,
VHDLClassic
, incorporating said step and removing Verilog-specific steps
- Created new experimental flow,
- Latches without
always_latch
are now reported as a lint error if the variableLINTER_ERROR_ON_LATCH
is set toTrue
(which it is by default)- Added latch design to fastest test set for both supported PDKs
- Fixed a race condition with
openlane/steps/step.py::Step::run_subprocess
- Fixed a bug where
glob
introduced nondeterminism, as glob returns files in an arbitrary order on some filesystems: https://docs.python.org/3.8/library/glob.html?highlight=sorted- All
glob
results were simply sorted.
- All
- Fixed a bug where
openlane/common/toolbox.py::Toolbox::create_blackbox_model
constructs and uses an invalid Path. - Fixed
Checker.YosysSynthChecks
ID to match class name - Fixed
Odb.SetPowerConnections
missing from step factory - Fixed
OpenROAD.GlobalRouting
missingGRT_ANTENNA_MARGIN
from OpenLane 1 - Fixed
Verilator.Lint
incorrectly calling Verilator by appending the list of defines to the list of files - Renamed
SYNTH_DEFINES
toVERILOG_DEFINES
with translation behavior - Renamed
SYNTH_POWER_DEFINE
toVERILOG_POWER_DEFINE
with translation behavior - Removed
SYNTH_READ_BLACKBOX_LIB
, now always loaded
- Added
PNR_SDC_FILE
to all OpenROAD steps - Added
SIGNOFF_SDC_FILE
toOpenROAD.STAPostPNR
- Added
report_design_area_metrics
to OpenROAD scripts that potentially modify the layout - Added comprehensive documentation on PDKs
- Added documentation for migrating the Macro object
- Added validation for unknown keys for the Macro object
- Added testing for
openlane.common.toolbox::Toolbox::create_blackbox_model
,openlane.common.toolbox::Toolbox::get_lib_voltage
,openlane.flows.sequential::SequentialFlow::__init_subclass__
= - Updated OpenROAD to
0a6d0fd
: There is an API break in OpenDB APIs:odb.read_def
now takes adbTech
and a Path string instead of adbDatabase
and a Path string.- The
dbTech
object can be obtained via thegetTech
method ondbDatabase
objects:db.getTech()
, for example. - Liberty files without default operating conditions break in PSM-
libparse-python
added as a workaround until the PDKs are fixed
BASE_SDC_FILE
renamed toFALLBACK_SDC_FILE
with translation- Move
FALLBACK_SDC_FILE
to universal flow variables
- Move
- OpenROAD scripts internally now always read
SDC_IN
instead ofCURRENT_SDC
- SDC_IN set to either
PNR_SDC_FILE
orSIGNOFF_SDC_FILE
by the appropriate steps
- SDC_IN set to either
- Reimplemented I/O placement in the Classic flow based on the one in ORFS,
i.e.:
"We start the loop in ORFS by ignoring io placement while doing global placement, then do io placement, then re-run global placement considering IOs. Its not perfect but that's the use." - @maliberty
open_pdks
->dd7771c
- Volare ->
0.12.8
- Changed gf180mcu tests to use
gf180mcuD
, the new recommended variant of gf180mcu - Fixed bug with gating config variables with wildcards only affecting the first matching step
- Fixed detecting if
PL_TARGET_DENSITY_PCT
is not defined - Fixed antenna repair: now re-legalizes after repair which was missing
- Fixed failing designs in Extended Test Set
- Add Linting
- Added Nix derivation for: Verilator
- Added the following steps:
Verilator.Lint
Checker.LintTimingConstructs
Checker.LintWarnings
- Emplaced the three new steps at the beginning of the flow
- Added
Classic
flow variable:RUN_LINTER
w/ deprecated name (RUN_VERILATOR
)
- Added step variables:
QUIT_ON_LINTER_ERRORS
-w/ deprecated name (QUIT_ON_VERILATOR_ERRORS
)QUIT_ON_LINTER_WARNINGS
w/ deprecated name (QUIT_ON_VERILATOR_WARNINGS
)QUIT_ON_LINTER_TIMING_CONSTRUCTS
LINTER_RELATIVE_INCLUDES
w/ deprecated (VERILATOR_REALTIVE_INCLUDES
)LINTER_DEFINES
- Added metrics:
design__lint_errors__count
- Added support for
Flow
-specific configuration variables- Added a
config_vars
property toFlow
- Added a
gating_config_vars
property toSequentialFlow
, essentially replacingflow_control_variable
(breaking change) with deprecation warnings for the latter - Added more consistent runtime handling of "abstract class properties"
- Folded all OpenLane 1-style
RUN_
variables into Classic Flow
- Added a
- Added an undocumented CVC step- upstream no longer supporting CVC in flows
- open_pdks ->
1341f54
- yosys ->
14d50a1
to match OL1 - Restored ancient
{DATA,CLOCK}_WIRE_RC_LAYER
variables, with translation behavior fromWIRE_RC_LAYER
toDATA_WIRE_RC_LAYER
- Created new PDK variable
CELL_SPICE_MODELS
to handle .spice models of the SCLs instead of globbing in-step - Changed default value of
MAGIC_DRC_USE_GDS
- Fixed an issue where CI would fail when
vars.CACHIX_CACHE
is not defined (affected pull requests) - Fixed an issue with Nix in environment surveys
- Fixed an issue where
openlane/scripts/openroad/pdn.tcl
used a deprecated name for a variable - Fixed a bug where KLayout category names were lacking enclosing single quotes
- Fixed a number of broken links and entries in the documentation
- Added diode padding to
dpl_cell_pad.tcl
- Added
FULL_LIBS
toYosysStep
without any redactions - Moved all PDN variables to the the
OpenROAD.GeneratePDN
step as step-specific PDK variables - Updated PDN documentation to make sense and added an illustrated diagram of values
- Slightly reordered Classic Flow so detailed placement happens right after
Odb.HeuristicDiodeInsertion
- Fixed translation of
FP_PDN_MACRO_HOOKS
when a string is provided (only splitting if a,
is found) - Removed extraneous
check_placement -verbose
aftercommon/dpl.tcl
sources in OpenROAD scripts
- Added new
mag
format to design formats, populated byMagic.StreamOut
- Added support for
stdin
in reproducibles (mainly for Magic): ejected reproducibles now save the input and use it - Added three new PDK variables to all Magic-based steps:
MAGIC_PDK_SETUP
,CELL_MAGS
, andCELL_MAGLEFS
, which explicitly list some files Magic constructed fromPDK_ROOT
, as well as codifying a convention that variables must explicitly list files being used. - Added new variable to
Magic.SpiceExtraction
,MAGIC_EXT_ABSTRACT
, which allows for cell/submodule-level LVS rather than transistor-level LVS. - Changed SPEF file saving to only strip asterisks instead of underscores as well, matching the folders
- Fixed an issue where OpenLane's type-checking only accepted a single value for Literals in violation of "Shortening unions of literals," PEP-586
- Fixed an issue where command-line overrides were still treated as strict variables
- Fixed an issue where
rule()
would print a line even when log levels would not allow it - Fixed an issue where
PDK_ROOT
was of typestr
- Updated documentation to provide information on conventions for declaring
variables
- Deprecated
StringEnums
, now favoringLiteral['str1', 'str2', …]
- Deprecated
- Add new commandline options:
--docker-tty/--docker-no-tty
, controlling the-t
flag of Docker and compatible container engines which allocates a virtual tty - Convert CI to use
--dockerized
instead of a plaindocker run
Flow.start()
now registers two handlers, one for errors and one for warnings, and forwards them tostep_dir/{errors,warnings}.log
respectively- Created
CELL_SPICE_MODELS
as a PDK variable to handle .spice models of the SCLs instead of globbing in-step - Added a "dummy path" for macro translation purposes that always validates and
is ignored by
self.toolbox.get_macro_views
- Reduced reliance on absolute paths
- Special exception carved out for
STEP_DIR
,SCRIPTS_DIR
- Made KLayout scripts more resilient to relative pathing
- Special exception carved out for
- Created new "eject" feature, which would make reproducibles for steps relying
on subprocesses independent of OpenLane
scripts
directory copied in entirety into ejected reproducibles
- Updated Open PDKs to
e3b630d
- Updated Yosys to
14d50a1
- Updated CI to handle missing
vars.CACHIX_CACHE
- Updated Volare to
0.12.3
to use new authentication and user agent - Downgraded Magic to
0afe4d8
to match OL1 - Restored ancient
{DATA,CLOCK}_WIRE_RC_LAYER
variables, with translation behavior fromWIRE_RC_LAYER
toDATA_WIRE_RC_LAYER
- Fixed issue with
Step.load()
re-validating values, which affected reproducibles - Timing signoff no longer prints if log level is higher than
VERBOSE
- Use
parse_float=Decimal
consistently when loading JSON strings to avoid fun floating point errors - Removed dependency on State module from
odb
scripts - Removed custom PYTHONPATH setting from
OdbStep
(which was mostly to mitigate problems fixed in #86)
- Rename incorrectly-named metric rename
clock__max_slew_violation__count
todesign__max_slew_violation__count
- Fix clock skew metric aggregation by using
-inf
instead ofinf
- Internally reworked
Config
moduleVariable
objects now have a Boolean property,.pdk
, which is set toTrue
if the variable is expected to be provided by the PDK- List of common flow variables now incorporate both option config variables and PDK config variables, with the aforementioned flag used to tell them apart.
- Individual
Step
s may now freely declare PDK variable, with the implication that if aFlow
or one of its constituentStep
s has one or more variables not declared by the current PDK, theStep
(andFlow
) are incompatible with the PDK. - Mutable data structures are used during the construction of
Config
to avoid constant copying of immutable dictionaries- Multiple private instance methods converted to private
classmethod
s to deal with mutable data structures instead of constantly makingConfig
copies
- Multiple private instance methods converted to private
- Getting raw values from the PDK memoized to avoid having to call the Tcl interpreter repeatedly
- All
Step
objects, not just those used with an interactive configuration, can now be given overrides upon construction using keyword arguments.
- A number of previously-universal PDK variables are now declared by the
Step
s and made non-optional, i.e., theStep
can expect them to be declared by the PDK if the configuration is successfully validated. PDK
,PDK_ROOT
are no longer considered "PDK" variables as PDK variables depend on themPRIMARY_SIGNOFF_TOOL
now a PDK variable and a string so OpenLane is not limited to two signoff toolsToolbox.render_png()
now relies on a newStep
calledKLayout.Render
Config.interactive()
fixed, new Nix-based Colab notebook to be uploaded Soon™- Assorted documentation updates and bugfixes
- Added
Odb.ApplyDEFTemplate
toClassic
Flow - Added
RUN_TAP_DECAP_INSERTION
as a deprecated name forRUN_TAP_ENDCAP_INSERTION
- Added
refg::
to documentation - Fixed issue where "worst clock skew" metrics were aggregated incorrectly
- Fixed issue with referencing files outside the design directory
- Updated documentation for
run_subprocess
- Updated Volare to
0.11.2
- Fixed a bug with
Toolbox
method memoization - Unknown key errors only emit a warning now if the key is used as a Variable's name anywhere linked to OpenLane. This allows using the same config file with multiple flows without errors.
- Added ability to create reproducible for any step using instance method
Step.create_reproducible()
- Added ability to load and run Step from Config and State JSON files, working for both existing step folders and new reproducibles
- Added new CLI- under either the script
openlane.steps
orpython3 -m openlane.steps
, exposing the two functionalities above. - Added internal ability to load a Config without attempting to load the PDK configuration data- i.e., only rely on the user's input
- Extended
Meta
objects to support Step ID and OpenLane version. - Moved tests from source tree to
test/
folder, refactoring as necessary - Internal
utils
module folded intocommon
module, with elements publicly documented - Removed
tcl_reproducible
- Updated Magic to
952b20d
- Added new variable,
MAGIC_EXT_SHORT_RESISTOR
toMagic.SpiceExtraction
, disabled by default
- Added unit testing and coverage reporting for core infrastructure features (80%+)
- Added running unit tests in the CI for different Python versions
- Moved CI designs out-of-tree
- Various documentation improvements
- Common Module
- Created new TclUtils to handle common Tcl interactions, i.e., evaluating the environment and testing
- Made Tcl environment evaluation no longer rely on the filesystem
- Made Tcl environment evaluation restore the environment after the fact
- Moved
Path
from State module to common - Moved parsing metric modifiers and such from Toolbox
- Config Module
- Updated PDK migration script to be a bit more resilient
- Fixed bug where
meta
did not get copied properly withConfig
copies - Rewrote configuration dictionary preprocessor again
- Flow Module
- Sequential flows now handle duplicate Step IDs by adding a suffix
- Logging Module
- Logging rewritten to use Python logger with rich handler, the latter of which suppressed during unit testing
- State Module
State.save_snapshot()
now also saves a JSON representation of metrics- Fixed metric cloning
- Step Module
- Report start/end locii also end up in the log file
- Utils
- DRC module now uses
.
to separate category layer and rule in name
- Updated OpenROAD to
02ea75b
- Updated Volare to
0.9.2
- Added guide on updating utilities with Nix
- Updated Magic to
0afe4d8
:
Corrected an error introduced by the code added recently for support
of command logging, which caused the "select cell <instance>" command
option to become invalid; this command option is used by the
parameterized cell generator and makes it impossible to edit the
parameterized cells.
- Reworked Tcl unsafe string escaping to use home-cooked functions instead of "shlex"
- Added three designs to the gf180mcu test set
- Magic GDS writes now check log for
Calma output error
before proceeding further - Moved constraint variables to PDK
SYNTH_CAP_LOAD
renamed toOUTPUT_CAP_LOAD
- Deprecated names for variables now take priority: allows overriding PDK variables properly
- Updated Magic to
8b3bb1a
- Updated PDK to
78b7bc3
- Updated Volare to
0.8.0
to support zstd-compressed PDKs - Temporarily removed
manual_macro_placement_test
from the sky130 test set pending a weird bug
- Updated Netgen to
87d8759
- JSON configuration files with
meta.version: 2
and dictionary configurations now both subject to stricter validation- Strings no longer automatically converted to lists, dicts, numbers, Booleans, et cetera
- Numbers no longer automatically converted to Booleans
- Unrecognized keys throw an error instead of a warning
- Steps now only keep a copy of configuration variables that are either common
or explicitly declared
- Explicitly declare global routing variables for resizer steps
- Explicitly declare MagicStep variables for DRC step
CLOCK_PORT
type changed fromOptional[List[str]]
toUnion[str, List[str], None]
- JSON globs behavior adjusted, now always returns
List
- conversion handled after preprocessing - Rewrote
resolve.py
as a proper preprocessor- Proper recursion into Mappings and Sequences (so refs:: may be resolved in arbitrarily deep objects)
- Defer most validation and conversion to
Config
object
- Fixed internal issue where
some_of
of a Union with more than two variables of which one isNone
just returns the same Union - Fixed issue where
expr::
turns results into strings µ
niformity, now all useU+00B5 MICRO SIGN
- Removed default values that
ref::
/expr::
other variables - Removed unused variable
- Made designs synthesized by Yosys keep their name after
chparam
- Created
openlane.flows.cloup_flow_opts
, which assigns a number ofcloup
commandline options to an external function for convenience. - Moved handling of
last_run
insideFlow.start
- Moved handling of volare, setting log level and threadpool count to
cloup_flow_opts
- Update Magic, Netgen, and Yosys
- Made
SYNTH_ELABORATE_ONLY
functional - Minor internal rearchitecture of
common
and commandline options
- Start on API cleanup in preparation for beta
- Common and Logging isolated into own modules
- Improved documentation on various parts of the codebase.
- Delineated
public
,private
andprotected
class members:- If undocumented or starts with
__
, private - If decorated with
@openlane.common.protected
, protected - Else public
- If undocumented or starts with
- Class members renamed to reflect the above
- Adjusted documentation generation to use RST and proper titles
- Flow progress bar hooks encapsulated in new
FlowProgressBar
object- Old methods still exist, issue a
DeprecationWarning
- Old methods still exist, issue a
- Top level
import openlane
now only has the version. To get access toFlow
orStep
, tryfrom openlane.flows import Flow
Flow.get
/Step.get
no longer exist: useFlow.factory.get
/Step.factory.get
insteadopenlane.common.internal
decorator replaced withopenlane.common.protected
Step
objects no longer hold a reference to parent flowStep.start
now takesself.step_dir
as a required argument when running non-interactive flows- A faster migration method inside a Flow is
step.start()
->self.start_step(step)
- Made Magic DRC report parser more robust, handling multiple rules, etc
- Updated documentation for various related variables
- Fixed bug causing PNR-excluded cells being used during resizer-based OpenROAD steps
- Added support for multiple corners during CTS using the
CTS_CORNERS
variable - Added support for multiple corners during resizer steps using the
RSZ_CORNERS
variable - Internally reworked OpenROAD resizer and CTS steps to share a common base class
- Added
io_placer
andmanual_macro_placemnt_test
to CI - Fixed
MAGTYPE
forMagic.WriteLEF
- Fixed bug with reading
EXTRA_LEFS
in Magic steps
- Added support for instances to
RSZ_DONT_TOUCH_RX
- Added support for
RSZ_DONT_TOUCH_LIST
to resizer steps inverter
design used to configure the above two- Added ignore for
//
key in JSON config files - Added two new variables for
Yosys.Synthesis
;SYNTH_DIRECT_WIRE_BUFFERING
andSYNTH_SPLITNETS
- Fixed bug with Yosys report parsing
- Fixed issue in
usb_cdc_core
masked by aforementioned bug
- Updated Magic to
9b131fa
- Updated Magic LEF writing script
- Ensured consistency of Tcl script logging prefixes
- Fixed a bug with extracting variables from Tcl config files when the variable is already set in the environment
- Fixed a bug with saving lib and SDF files
- Fixed
check_antennas.tcl
being mis-named
- Added mechanism for subprocesses to write metrics via stdout,
%OL_METRIC{,_I,_F}
, used for OpenSTA - Added violation summary table to post-PNR STA
- Reworked multi-corner STA: now run across N processes with the step being responsible for aggregation
- Made handling
Infinity
metrics more robust - Fixed names of various metrics to abide with conventions:
magic__drc_errors
->magic__drc_error__count
magic__illegal__overlaps
->magic__illegal_overlap__count
- Removed splash messages from OpenROAD, OpenSTA
- Added full test-suite added to CI
- Like OpenLane 1, a "fastest test set" runs with every PR and an "extended test set" runs daily
- Added Nix building, intra-CI caching and installation as composite actions
- Nix derivation now cached intra-CI even if running without access to secrets
- Fixed issue where channel was mis-named
- Smoke test on all platforms using
nix-shell
- Docker image re-implemented: One layer with proper settings for PATH and
PYTHONPATH
- Docker image smoke-tested independently of Nix
- Fixed bug with Tcl configurations
- Fixed issue with
Yosys.Synthesis
producing false-positive checks - Updated various design configs
- Added
MAX_TRANSITION_CONSTRAINT
tobase.sdc
(if set) - Added
MAX_TRANSITION_CONSTRAINT
->SYNTH_MAX_TRAN
translation behavior inbase.sdc
- Removed attempt(s) to calculate a default value for
MAX_TRANSITION_CONSTRAINT
inall.tcl
,openroad/cts.tcl
andyosys/synth.tcl
- Added a commandline option
-j/--jobs
to add a maximum cap on subprocesses. - Added a global ThreadPoolExecutor object for all subprocesses to
common
.- Accessible for external scripts and plugins via
openlane.get_tpe
andopenlane.set_tpe
- Accessible for external scripts and plugins via
- Folded
--list-plugins
into--version
- Renamed
ROUTING_CORES
toDRT_THREADS
- Removed
RCX_CORES
, step now uses global ThreadPoolExecutor
- Revert magic to
a33d7b7
, last known-good version before a LEF writing bug
- Added ability to disable reproducibles on a per-class level
- Updated SDF to support N-corners
- Fixed bug with writing LIB/SDF views
- Bump supported PDK to
af34855
- Rename 3 PDK variables to match OpenLane 1
FP_PDN_RAILS_LAYER
->FP_PDN_RAIL_LAYER
FP_PDN_UPPER_LAYER
->FP_PDN_HORIZONTAL_LAYER
FP_PDN_LOWER_LAYER
->FP_PDN_VERTICAL_LAYER
- Better adherence to class structure and mutability principles
- Create
GenericDict
,GenericImmutableDict
to better handle immutable objects, i.e.State
,Config
State
,Config
made immutable post-construction- Various rewrites to accommodate that
Step
:.run
:- No longer has any default implementation
- Is expected to return a tuple of views updates and metrics
updates which are then applied to copies by
.start
to meet mutability requirements
.start
:- Handles input checking
- Handles creating new
State
object based on deltas
Flow
- Stateful variables for
.start
,.run
, and other internal methods made private .start
now only returns the final state object- Intermediate steps stored in
self.step_dir
self.step_dir
and other "mutations" to Flow object have no effect on future.start()
invocations, which are (more or less) idempotent
- Stateful variables for
- Remove
ConfigBuilder
and fold methods intoConfig
- Create
- Added
make host-docs
to Makefile
- Replace OpenSTA binary name check with an environment variable,
OPENSTA
- Added ability to use
--dockerized
without further arguments to drop into a shell - Reimplemented
--dockerized
- needs to be the first argument provided - Reimplemented
--smoke-test
to not use a subprocess--smoke-test
doesn't attempt to handle--dockerized
on its own anymore
- Fixed permissions bug when running a smoke test from a read-only filesystem
- Fixed race condition for temporary directories on macOS (and presumably Windows)
- Added run-time type checkers for
SequentialFlow
Substitute
dictionary - Folded
init_with_config
into constructor and deprecate it - Fixed
SequentialFlow
step substitution bug by moving variable compilation to instance instead of class
- Added missing macro orientations
- Added missing
PDN_CFG
configuration variable - Fixed crash when defining
SYNTH_READ_BLACKBOX_LIB
- Streamlined all
read
messages in OpenROAD scripts and macro-relatedread
messages in Yosys scripts. - Cleaned up
YosysStep
hierarchy - Cleaned up
synthesize.tcl
Thanks @smunaut for the bug reports!
- Added
cloup
library for better argument grouping/prettier--help
with click - Added ability to substitute steps with a certain
id
in aSequentialFlow
with other Step classes - Added
--only
,--skip
to commandline interface forSequentialFlow
s - Changed processing of how
--from
and--to
are done inSequentialFlow
s - Better delineation of class vs. instance variables in documentation
- Type checker now also checks functions without typed headers
- Fixed minor bugs with
Decimal
serialization and deserialization - Class/step registry now case-insensitive
- Moved documentation dependencies to separate requirements file
- Removed
jupyter
fromrequirements_dev.txt
- too many dependencies and can just be installed withpip install jupyter
- Various documentation improvements and fixes
- Yosys steps now read macro netlists as a black-box if applicable
- Renamed STA steps to avoid ambiguity
- Made optional/default handling more straightforward to fix issue where the default value of an Optional is not None.
- Fixed config var inheritance issue for
OpenROAD.ParasiticsSTA
- Add support for gf180mcuC to PDK monkey-patch procedure
- Update some PDK variables to be optional:
GPIO_PADS_LEF
,IGNORE_DISCONNECTED_MODULES
- Remove unused PDK variable:
CELL_CLK_PORT
- Added warning on multiple clocks in
base.sdc
- Added usage of translation hook for SDC scripts
- Folded
sdc_reader.tcl
intoio.tcl
- Folded
- Fixed calculation issue with I/O delays in
base.sdc
- Fixed SPEF read invocation to include instance path
- Renamed multiple functions in
io.tcl
for clarity and to avoid aliasing Tcl built-in functions - Tcl reproducibles now add entire environment delta vs. just "extracted"
variables
- Better handling of objects inside the design directory
- Fixed a bug with initializing configurations using dictionaries.
- Added exception message for
InvalidConfig
.
- Created a (very) rudimentary plugin system
- Add ability to list detected plugins with flag
--list-plugins
- Add ability to list detected plugins with flag
- Fixed a problem with reading SPEF files for macros
- Various documentation updates
- Created a
Macro
definition object to replace a litany of variables.libs
,spefs
andsdf
files now use wildcards as keys, which will be matched against timing corners for loading, i.e., a SPEF with keynom_*
will match timing cornernom_tt_025C_1v80
.- This has been applied to PDK lib files, RCX rulesets and technology LEF files as well.
Toolbox
object now has methods for matching the proper LIB/SPEF files.
- PDKs now list a
DEFAULT_CORNER
for picking LIB files as well as a list ofSTA_TIMING
corners. - Expanded the range of valid types for
Variable
: these new classes are supported, all with theoretically infinite nesting:Dict
Union
Literal
State
rewritten to support nested dictionaries and type annotations.- (Subclass of
Mapping
- Python 3.8 does not support subscriptingUserDict
. Yep.)
- (Subclass of
- Created a
config.json
for the caravel_upw example for testing purposes. - Updated Magic, add new patch for Clang
self.state_in
is now always a future for consistency, butrun()
now takes astate_in
which is guaranteed to be resolved.EXTRA_LEFS
,EXTRA_LIBS
, etc kept as a fallback for consistency.- Remove
STA_PRE_CTS
- STA now always propagates clocks
- Created new metric
synthesis__check_error__count
with a corresponding Checker, with said Checker being the new executor of theQUIT_ON_SYNTH_CHECKS
variable- Check report parser imported from OpenLane 1
- Created
SYNTH_CHECKS_ALLOW_TRISTATE
to exclude unmapped tribufs from previous metric. - Created new metric
design__xor_difference__count
with a corresponding Checker to flag a deferred error on XOR differences. - Fixed a few typos.
- Updated the smoke test to support PDK downloads to a different directory.
- Updated config builder to resolve the PDK root much earlier to avoid an issue where a crash would affect the issue reproducible.
- Updated
SYNTH_READ_BLACKBOX_LIB
to read the fullLIB
variable instead ofLIB_SYNTH
, which also fixes a crash when reading JSON headers. - Updated post-GRT resizer timing script to re-run GRT before the repair: see The-OpenROAD-Project/OpenROAD#3155
- Added a "yosys proc" to the JSON header generator (thanks @smnaut)
- Fixed a bug where random equidistant mode did not work for OpenROAD IO placer.
- Fixed a crash when the SCL is specified via command-line.
- Fixed a changelog merge nightmare.
- Reimplement DRC database using
lxml
- Makefile
venv
creation updated - Misc. aesthetic bugfixes for sequential flows
- Add steps to extract, preserve and check power connections:
Checker.DisconnectedPins
: Checker forReportDisconnectedPins
.Odb.ReportDisconnectedPins
: Report disconnected instance pins in a design.Yosys.JsonHeader
: RTL to a JSON Header.Odb.SetPowerConnections
: Uses JSON generated inYosys/JsonHeader
and module information in Odb to add global connections for macros in a design.
- Add
IGNORE_DISCONNECTED_MODULES
as a PDK variable, as some cells need to be ignored. - Rename
SYNTH_USE_PG_PINS_DEFINES
toSYNTH_POWER_DEFINE
. - Rename
CHECK_UNMAPPED_CELLS
toQUIT_ON_UNMAPPED_CELLS
. - Rename various metrics.
- Change various configuration variables for included
caravel_upw
design. - Fix
DIODE_INSERTION_STRATEGY
translations - Allow overriding from CLI when using Tcl configuration files.
- Built-in flows now have full generated documentation akin to steps.
- Built-in steps now document their inputs, outputs and each built-in step has a human-readable text description.
- Rewrite the RTL-to-GDS guides.
- Add an architectural overview of OpenLane 2+.
- Document pin config file format.
- Add guides on writing custom flows AND custom steps.
- Add a migration guide from OpenLane 1.
- Port contributor's guide from OpenLane 1.
- Removed default values from Jupyter Notebook.
Config
is now immutable,.copy()
can now take kwargs to override one or more values.TapDecapInsertion
->TapEndcapInsertion
(more accurate)- Dropped requirement for description to match between two variables to be "equal:" It is sometimes favorable to have a slightly different description in another step.
OpenInKLayout
/OpenInOpenROAD
turned into sequential flows with one step instead of hacks.- Fixed a bug where
OpenInKLayout
would exit instantly. - Updated and fixed
Optimizing
demo flow, as well as delisting it. - Port The-OpenROAD-Project/OpenLane#1723 to OpenLane 2.
- Remove
Odb.ApplyDEFTemplate
from default flow.
- Fixes a bug where if OpenLane is invoked from the same directory as the design, KLayout stream-outs would break.
- Update OpenROAD, Add ABC patch to use system zlib
- Adds SDC files as an input to
OpenROADStep
,NetlistSTA
andLayoutSTA
steps - Add
sdc_reader.tcl
: a hook script for reading in SDC files while handling deprecated variables - Replace deprecated variables in base.sdc
- Properly use TIME_DERATING_CONSTRAINT in base.sdc
- Properly use SYNTH_DRIVING_CELL in base.sdc
- Properly use SYNTH_CLK_DRIVING_CELL in base.sdc
- Add
wrapper.tcl
to capture errors in Magic scripts. - Fix instances of a deprecated variable was used in Magic scripts.
- Add port diode insertion script.
- Fix formula for calculating
FP_TARGET_DENSITY_PCT
.
- Update
volare
dependency. - Update
magic
version + makemagic
nix derivation more resilient.
- Add the custom diode insertion script as a
Step
(disabled by default). Flow
objects are now passed explicitly to childStep
objects, removing earlier stack inspection code.flow_config_vars
now only affect steps running inside a Flow.
- Add validation on step exit.
- Fix a small path resolution issue.
- Add basic CI that builds for Linux, macOS and Docker
- Various improvements to Dockerization so that
openlane --dockerized
can run on Windows
- Fixed an issue where KLayout scripts exited silently.
- Handle
PDK_ROOT
,PDK
andSTD_CELL_LIBRARY
environment variables. - Unify environment inspection by using
os.environ
- eliminated getenv - KLayout scripts no longer accept environment variables.
- Updated Docker images for consistency.
- Added ReadTheDocs configuration.
- Update smoke test
- Fix bug with default variables
log
->info
- Add mitigation for KLayout None variables.
logging
isolated fromcommon
into its own module- CLI now accepts either a value or a string for log levels.
- CLI now prints help if no arguments are provided.
- Fix issue where
rich
eats the cursor if it exits by interrupt.
- Multiple logging levels specified via CLI. Can also be set via
set_log_level
in the API. - Updated all
run_subprocess
invocations to create a log, named after theStep
'sid
by default. - Fixed issue with
ROUTING_CORES
not using the computer's total core count by default. - Fixed an issue with Tcl config files where
DESIGN_DIR
was resolved relatively, which greatly confused KLayout.
- Add ApplyDEFTemplate step.
- Update most
odbpy
CLIs to accept multiple LEF files.
- Cleaned up build system.
- Add support for OpenROAD with
or-tools
on macOS.
- Added
QUIT_ON_SYNTH_CHECKS
- Added
QUIT_ON_UNMAPPED_CELLS
- Added metric
design__instance_unmapped__count
- Allowed
MetricChecker
to raiseStepError
- Updated OpenROAD to
6de104d
and KLayout to0.28.5
. - OpenROAD builds now use system boost to cut on build times.
- Added new dedicated interactive mode to replace "Step-by-step" API: activated
by calling
ConfigBuilder.interactive
, which replacedper_step
.- State, Config and Toolbox for
Step
s all become implicit and rely on global variables. - On the other hand,
config=
must now be passed explicitly to non-interactive flows.
- State, Config and Toolbox for
- Added Markdown-based IPython previews for
Step
andConfig
objects.- Added an API to render
DEF
orGDS
files to PNG files to help with that.
- Added an API to render
- Changed API for KLayout Python scripts to be a bit more consistent.
- Renamed a number of variables for consistency.
- Tweaked documentation slightly for consistency.
- Moved
State
to its own submodule. - Fixed bug with loading default SCL.
- Added a step-by-step API for OpenLane.
- Involves new
ConfigBuilder
method,per_step
, which creates configuration files that can be incremented per-step. - This mode is far more imperative and calls may have side effects.
- Involves new
- Added an example IPython notebook to use the aforementioned API.
- Add a number of APIs to display
State
as a part of a notebook.
- Add a number of APIs to display
- Added various default values for
Step
so it can be used without too many parameters. (config
is still required, butstate_in
will become an empty state if not provided.) - Moved various documentation functions to the
Variable
object so they can also be used by IPython. - Updated documentation for
Variable
object. - Various documentation updates and fixes.
- More build fixes.
- Added magic builds to macOS
- Fixed KLayout builds on macOS
- Tweaks to Nix build scripts
- Removed hack to make KLayout work on macOS
- Removed NoMagic flow
- Fixed commandline
--flow
override. - Removed call-stack based inference of
state_in
argument for steps: a step initialized without astate_in
will have an empty in-state. - Changed signature of
Flow.run
,Flow.start
to return(State, List[Step])
, returning only the last state as the per-step states can be accessed viastep[i].state_out
. - Removed distinction between the
Step.id
and it factory-registered string: the ID is now used for the factory, in the formatCategory.Step
for the built-in steps. - Fixed
--from
and--to
, also add validation and case-insensitivity. - Various bugfixes to Tcl script packager.
- Fix
Optimizing
flow.
- Remove Mako as requirement, migrate relevant code.
- Updated installation instructions.
- Separated variables step-by-step.
- Various fixes to environment variables, especially when using OpenROAD Odb Python scripts.
- Add specialized steps to check and/or quit on specific metrics and/or variables.
- Rewrite OpenLane in Python using a new, Flow-based architecture.
- Add packaging using the Nix Package Manager to replace the Docker architecture.
- Added transparent Dockerization using
--dockerized
commandline argument, with images also built using Nix.