OpenLane is an automated RTL to GDSII flow based on several components including OpenROAD, Yosys, Magic, Netgen and custom methodology scripts for design exploration and optimization.
This is specified in picoseconds, and the SDC file automatically divides it by 1000, which is then set in nanoseconds. This is silly.
Proposal
There are two approaches, and I hate both of them:
Setting command units uniformly:
We decide on a set of units for OpenLane that are immutable, then ensure all invocations dealing with units call the appropriate set_units function for the tool utilized before utilizing any values with documented units.
While this is not an API break, it is very error prone. OpenROAD and OpenSTA will overwrite any units set at the beginning of the file whenever liberty files are read.
Redefine units to be in terms of the SCL utilized:
Instead of the units being explicitly in micrometers or similar, the units are SCL-defined. The documentation is to include units for popular SCLs in use.
This is an API break, but is relatively straightforward.
At any rate, the femtofarad variable has to be brought in line with the others.
Description
OpenLane and its invocation of tools makes too many assumptions about the library being used.
Preliminarily analysis shows that there are three units widely used by variables:
These happen to match sky130 and gf180mcu, but may not always match others.
Additionally, there exist some config variables that are even more egregious:
https://github.com/RTimothyEdwards/open_pdks/blame/d9f6d3870385a580b19bc800942eedb0d5df9848/sky130/openlane/sky130_fd_sc_hd/config.tcl#L37C61-L37C61
This is specified in picoseconds, and the SDC file automatically divides it by 1000, which is then set in nanoseconds. This is silly.
Proposal
There are two approaches, and I hate both of them:
set_units
function for the tool utilized before utilizing any values with documented units.At any rate, the femtofarad variable has to be brought in line with the others.