# Ensure OpenLane is installed and environment is set up
export OPENLANE_ROOT=/path/to/openlane
export PDK_ROOT=/path/to/skywater-pdkcd $OPENLANE_ROOT
make mount
# Inside the Docker container:
./flow.tcl -interactive
# Then execute step by step:
package require openlane 0.9
prep -design /project/openlane/counter
run_synthesis
run_floorplan
run_placement
run_cts
run_routing
run_magic
run_magic_spice_export
run_magic_drc
run_lvs
run_antenna_checkcd $OPENLANE_ROOT
make mount
./flow.tcl -design /project/openlane/counter- Tool: Yosys
- Input: RTL Verilog (
counter.v) - Output: Gate-level netlist using Sky130 standard cells
- Duration: ~30 seconds for simple designs
- RTL is parsed and elaborated
- High-level synthesis converts RTL to generic gates
- Technology mapping maps generic gates to Sky130 cells
- Optimization based on
SYNTH_STRATEGY - Generates
.vnetlist and synthesis reports
runs/<run_name>/results/synthesis/
├── counter.v # Gate-level netlist
└── counter.synthesis.v # Synthesis netlist
runs/<run_name>/reports/synthesis/
├── 1-synthesis.AREA_0.stat.rpt # Area report
├── 1-synthesis.AREA_0.chk.rpt # Check report
└── yosys_4.stat.rpt # Statistics
- ❌ Synthesis fails with timing violations
- Fix: Increase
CLOCK_PERIODor changeSYNTH_STRATEGYtoDELAY 0
- Fix: Increase
- ❌ Unmapped cells or missing primitives
- Fix: Check RTL for unsupported constructs (e.g., latches, tri-state buffers)
- ❌ Excessive area
- Fix: Optimize RTL or change
SYNTH_STRATEGYtoAREA 1or higher
- Fix: Optimize RTL or change
Parse synthesis reports to extract:
- Total cell count
- Critical path delay
- Area utilization
- Unmapped cells (errors)
- Tool: OpenROAD (TritonFP)
- Input: Gate-level netlist
- Output: Die area, core area, IO placement, power grid
- Duration: ~10-20 seconds
- Calculate die size based on
FP_CORE_UTIL - Place IO pins
- Generate power distribution network (PDN)
- Create placement blockages
- Define core and die boundaries
runs/<run_name>/results/floorplan/
└── counter.def # Floorplan DEF
runs/<run_name>/reports/floorplan/
├── 2-initial_fp.rpt # Floorplan report
└── 3-pdn.rpt # PDN report
- ❌ Die size too large
- Fix: Increase
FP_CORE_UTIL(more dense packing)
- Fix: Increase
- ❌ PDN generation fails
- Fix: Check
FP_PDN_VPITCHandFP_PDN_HPITCHvalues for Sky130
- Fix: Check
- ❌ IO pin placement conflicts
- Fix: Manually specify pin locations in
pin_order.cfg
- Fix: Manually specify pin locations in
Parse floorplan DEF to extract:
- Die dimensions
- Core area vs. die area ratio
- Power grid coverage
- IO pin count and distribution
- Tool: OpenROAD (RePlAce + OpenDP)
- Input: Floorplan DEF + netlist
- Output: Placed standard cells
- Duration: ~1-2 minutes
- Global Placement (RePlAce): Coarse placement, cells can overlap
- Detailed Placement (OpenDP): Legalize placement, remove overlaps
- Optimization: Buffer insertion, resizing for timing
runs/<run_name>/results/placement/
└── counter.def # Placed DEF
runs/<run_name>/reports/placement/
├── 5-global_placement.rpt
├── 6-detailed_placement.rpt
└── placement_utilization.rpt
- ❌ Placement fails with overflow
- Fix: Reduce
PL_TARGET_DENSITYby 0.05-0.1
- Fix: Reduce
- ❌ High congestion warnings
- Fix: Reduce
FP_CORE_UTILorPL_TARGET_DENSITY
- Fix: Reduce
- ❌ Timing violations after placement
- Fix: Enable
SYNTH_SIZINGandSYNTH_BUFFERING
- Fix: Enable
Parse placement reports to extract:
- Placement density
- Overflow metrics
- Congestion hotspots
- Timing slack (setup/hold)
- Tool: OpenROAD (TritonCTS)
- Input: Placed DEF + clock nets
- Output: Clock tree with buffers
- Duration: ~30 seconds
- Identify clock nets from
CLOCK_PORT - Build balanced clock tree to minimize skew
- Insert clock buffers
- Optimize for skew and latency
runs/<run_name>/results/cts/
└── counter.def # CTS DEF
runs/<run_name>/reports/cts/
├── 8-cts.rpt # CTS report
└── cts_skew.rpt # Skew analysis
- ❌ High clock skew
- Fix: Adjust
CTS_TARGET_SKEWorCTS_CLK_BUFFER_LIST
- Fix: Adjust
- ❌ Clock tree too large (area overhead)
- Fix: Relax skew constraints
- ❌ Setup timing violations after CTS
- Fix: Increase
CLOCK_PERIODor optimize critical paths
- Fix: Increase
Parse CTS reports to extract:
- Clock skew (min/max)
- Clock latency
- Number of clock buffers inserted
- Clock tree power consumption
- Tool: OpenROAD (FastRoute) + TritonRoute
- Input: CTS DEF
- Output: Fully routed design
- Duration: ~2-5 minutes (most time-consuming)
- Global Routing (FastRoute): Assign nets to routing tracks
- Detailed Routing (TritonRoute): Create actual metal geometries
- Optimization: Fix DRC violations, antenna violations
runs/<run_name>/results/routing/
└── counter.def # Routed DEF
runs/<run_name>/reports/routing/
├── 10-fastroute.rpt # Global routing
├── 11-tritonRoute.rpt # Detailed routing
├── drc_violations.rpt # DRC errors
└── antenna_violations.rpt # Antenna errors
- ❌ Routing fails with DRC violations
- Fix: Reduce
PL_TARGET_DENSITY, increaseGLB_RT_ADJUSTMENT
- Fix: Reduce
- ❌ Antenna violations
- Fix: Enable
DIODE_INSERTION_STRATEGY(already set to 3)
- Fix: Enable
- ❌ Routing congestion
- Fix: Reduce
FP_CORE_UTIL, increase die size
- Fix: Reduce
- ❌ Timing violations after routing
- Fix: Increase
CLOCK_PERIOD, re-run with timing-driven routing
- Fix: Increase
Parse routing reports to extract:
- DRC violation count by type
- Antenna violation count
- Wire length statistics
- Routing congestion map
- Timing slack (post-route)
- Tools: Magic (DRC, GDSII), Netgen (LVS)
- Input: Routed DEF
- Output: GDSII, DRC/LVS reports
- Duration: ~1-2 minutes
- Magic DRC: Design Rule Check on final layout
- Magic GDSII Export: Convert DEF to GDSII
- Magic SPICE Export: Extract SPICE netlist from layout
- Netgen LVS: Layout vs. Schematic verification
- Antenna Check: Final antenna rule verification
runs/<run_name>/results/signoff/
├── counter.gds # Final GDSII
└── counter.spice # Extracted SPICE
runs/<run_name>/reports/signoff/
├── drc.rpt # DRC report
├── lvs.rpt # LVS report
└── antenna.rpt # Antenna report
- ❌ DRC violations in final layout
- Fix: Manually edit layout in Magic or adjust routing parameters
- ❌ LVS mismatch
- Fix: Check for missing connections, shorts, or netlist mismatches
- ❌ Antenna violations
- Fix: Add more diodes or adjust routing
Parse signoff reports to extract:
- DRC violation count (should be 0)
- LVS status (PASS/FAIL)
- Antenna violation count
- Final area and power estimates
| Stage | Common Failures | Automation Target |
|---|---|---|
| Synthesis | Timing violations, unmapped cells | Parse .stat.rpt for timing/area |
| Floorplan | Die size issues, PDN failures | Extract die dimensions from DEF |
| Placement | Overflow, congestion | Parse congestion maps, density metrics |
| CTS | High skew, timing violations | Extract skew/latency from reports |
| Routing | DRC, antenna, congestion | Parse violation counts, suggest density reduction |
| Signoff | DRC/LVS failures | Parse final reports, flag non-zero violations |
See automation_proposal.py for a Python framework to automate report parsing and parameter tuning.