OpenLane is an automated RTL-to-GDSII flow built on open-source EDA tools. Write Verilog, run the flow, and get a manufacturable GDSII layout targeting the SkyWater SKY130 130nm open PDK — fully free, with the possibility to tape out a real chip.
Python-based rewrite with Nix for reproducible tool management. Best for new designs. Requires Python 3.8+ and Nix.
Tcl/Makefile-based flow, Docker image bundles all tools. Widely used in existing tutorials and the MPW shuttle.
Linux (Ubuntu 20.04+ recommended) or macOS. Docker Desktop for OL1. 8 GB RAM minimum; 16 GB for complex designs. ~20 GB disk space.
# 1. Install Nix (required for tool management) sh <(curl -L https://nixos.org/nix/install) --daemon # 2. Install OpenLane 2 pip install openlane # 3. Run the built-in SPM example to verify openlane --dockerized --run-example spm # 4. Or run your own design openlane --dockerized config.json
# 1. Clone and set up git clone https://github.com/The-OpenROAD-Project/OpenLane.git cd OpenLane make setup # pulls Docker image + PDK # 2. Start interactive Docker shell make mount # 3. Run the default spm example inside Docker ./flow.tcl -design spm # 4. Run your own design ./flow.tcl -design your_design -tag run1
Create a directory for your design with the Verilog file and a config.json:
module counter (
input wire clk,
input wire rst,
output reg [7:0] count
);
always @(posedge clk or posedge rst)
if (rst) count <= 8'b0;
else count <= count + 1;
endmodule
{
"DESIGN_NAME": "counter",
"VERILOG_FILES": ["src/counter.v"],
"CLOCK_PORT": "clk",
"CLOCK_PERIOD": 10,
"pdk": "sky130A",
"STD_CELL_LIBRARY": "sky130_fd_sc_hd"
}
# OpenLane 2 cd my_design openlane --dockerized config.json # OpenLane 1 (inside Docker mount) ./flow.tcl -design my_design
Translates RTL Verilog into a gate-level netlist using cells from the SKY130 standard cell library. Yosys performs RTL elaboration, optimization, and technology mapping. ABC handles logic optimization and cell selection.
SYNTH_STRATEGY, SYNTH_MAX_FANOUT, MAX_FANOUT_CONSTRAINTalways @(posedge clk)Defines the chip die area, places I/O pads, inserts power/ground rings and stripes, and creates the power delivery network (PDN). The core utilization ratio controls how much area is used for cells vs routing.
FP_CORE_UTIL (default 50%), DIE_AREA, FP_IO_MODEFP_CORE_UTIL = 40–50% to leave routing headroomPlaces standard cells inside the core area to minimize wire length and meet timing. Done in two passes: global placement finds approximate positions; detailed placement legalises them onto the grid.
PL_TARGET_DENSITY, PL_RANDOM_GLB_PLACEMENTPL_TARGET_DENSITY or increase die areaBuilds a balanced clock distribution network that delivers the clock signal to all flip-flops with minimal skew. Inserts clock buffers/inverters in a tree topology. Clock skew directly affects hold timing.
CTS_TARGET_SKEW, CTS_CLK_BUFFER_LISTConnects all placed cells with metal wires according to the netlist. Global routing assigns wire segments to routing regions; detailed routing assigns exact tracks. Uses the SKY130 metal stack (li1, met1–met5).
ROUTING_CORES, GLB_RT_MAX_DIODE_INS_ITERSDRC (Design Rule Check) — Magic verifies that the layout meets all physical manufacturing rules: minimum width, spacing, enclosure, via rules for the SKY130 PDK. Zero DRC violations required for tape-out.
LVS (Layout vs Schematic) — Netgen compares the extracted netlist from the layout against the gate-level netlist to ensure they match electrically. Any mismatch means a routing bug.
MAGIC_DRC_USE_GDS, LVS_INSERT_POWER_PINSDIODE_INSERTION_STRATEGY = 3Writes the final GDSII (Graphic Design System II) file — the industry-standard format for chip layout data sent to a fab. This file encodes all polygons for every metal/poly/diffusion layer on the chip.
runs/<tag>/results/final/gds/design.gds{
// Design
"DESIGN_NAME": "my_chip",
"VERILOG_FILES": ["src/*.v"],
"CLOCK_PORT": "clk",
"CLOCK_PERIOD": 10, // 10 ns = 100 MHz
// PDK
"pdk": "sky130A",
"STD_CELL_LIBRARY": "sky130_fd_sc_hd",
// Floorplan
"FP_CORE_UTIL": 45, // 45% utilisation
"DIE_AREA": "0 0 200 200", // microns
"FP_IO_MODE": 1, // 0=matched, 1=random equidistant
// Placement
"PL_TARGET_DENSITY": 0.55,
// Routing
"ROUTING_CORES": 4,
"DIODE_INSERTION_STRATEGY": 3, // antenna fix
// Sign-off
"MAGIC_DRC_USE_GDS": true,
"RUN_LVS": true
}
| Parameter | Default | Description |
|---|---|---|
| CLOCK_PERIOD | 10 | Target clock period in nanoseconds. Sets timing constraints for synthesis and STA. |
| FP_CORE_UTIL | 50 | Core utilization percentage. Lower values leave more room for routing; start at 40–50%. |
| PL_TARGET_DENSITY | 0.55 | Cell density target for global placement (0–1). Higher = denser, may cause routing congestion. |
| SYNTH_STRATEGY | AREA 0 | Synthesis optimization goal: AREA 0–3, DELAY 0–4. DELAY optimizes for timing; AREA for size. |
| MAX_FANOUT_CONSTRAINT | 10 | Maximum fanout per cell output before buffering. Reduce to 5 for high-speed designs. |
| DIODE_INSERTION_STRATEGY | 3 | Antenna rule violation fix strategy. 3 = insert diodes during global routing (recommended). |
| GLB_RT_ADJUSTMENT | 0 | Reduce routing capacity by this fraction (0–1) to leave margin. Try 0.1 if congested. |
| MAGIC_DRC_USE_GDS | true | Run Magic DRC on the final GDS (more accurate than DEF-based DRC). |
All outputs land in runs/<tag>/results/ and runs/<tag>/reports/:
Final chip layout in GDSII format. Open in KLayout. Submit this to MPW shuttle / foundry.
Library Exchange Format — abstract view of the cell with port locations and metal layers. Used by place-and-route tools.
SPICE netlist extracted from the final layout. Netgen uses this for LVS comparison against the gate-level netlist.
Gate-level netlist after Yosys synthesis. Contains only standard cells from the SKY130 library.
Cell count, number of wires, flip-flop count, and estimated chip area after synthesis.
Magic DRC report. Must show 0 violations for tape-out. Lists violation type, layer, and coordinates.
Netgen LVS report. "Circuits match" = layout is electrically correct. Any mismatch is a critical bug.
OpenSTA timing report at slow-slow corner, 100°C. Contains setup/hold slack for all paths.
Long metal wires accumulate charge during fab that can destroy gate oxide. Fix: set DIODE_INSERTION_STRATEGY: 3. This auto-inserts antenna diodes during routing.
Too many wires squeezed into a small area. Fix: lower FP_CORE_UTIL to 35–40%, or increase DIE_AREA. Also try GLB_RT_ADJUSTMENT: 0.1.
Negative setup slack after routing. Fix: try SYNTH_STRATEGY: "DELAY 1", increase CLOCK_PERIOD, or pipeline your design.
Layout netlist doesn't match schematic. Most often from a missing or shorted power net. Check that VDD/VSS are properly connected in the PDN and all cells have power pins.
sky130_fd_sc_hd, sky130_fd_sc_hs, etc.), SPICE models, DRC/LVS rules, and GDSII frames. OpenLane 2 also supports GF180MCU (GlobalFoundries 180nm). The SKY130 PDK was the first open-source PDK and enabled the Google/efabless MPW shuttle program..gds file from runs/<tag>/results/final/gds/. Use Ctrl+scroll to zoom. Layer colours correspond to different metal/poly/diffusion layers in the SKY130 layer stack (li1, met1–met5, poly, ndiff, pdiff, nwell, etc.).user_project_wrapper interface. Using Caravel means the chip I/O, power, and clock are already handled for you.ROUTING_CORES: 4 or more speeds things up significantly.