Projects / SkyWater 130nm Guide

SkyWater 130nm PDK
& Magic VLSI

A complete installation guide for the open-source SkyWater 130nm Process Design Kit and Magic VLSI layout tool. Set up your environment to create and DRC-verify custom chip layouts using a fully open, production-grade semiconductor process.

Ubuntu / Debian Linux
~40–50 GB disk space
Magic 8.3+ · sky130A
// 01

Prerequisites

Operating System & Disk

  • Linux (Ubuntu 20.04+ / Debian 11+) — recommended primary environment
  • Windows — use WSL2 (Ubuntu) for full compatibility
  • macOS — possible via Homebrew but not officially supported by all PDK scripts
Disk space: The full SkyWater 130nm PDK requires 40–50 GB of free space. The volare enable step downloads several gigabytes — ensure you have a stable internet connection.

Install Dependencies

Update your system and install all required build tools and X11 libraries before attempting to compile Magic from source.

BASH · install dependencies
sudo apt update && sudo apt upgrade -y
sudo apt install -y \
  git build-essential flex bison m4 \
  tcsh csh libx11-dev tcl-dev tk-dev \
  libcairo2-dev libncurses-dev \
  libglu1-mesa-dev mesa-common-dev \
  python3 python3-pip
// 02

Step-by-Step Installation

2.1 Install Magic VLSI from Source

Install Magic directly from its GitHub repository — always use the latest source build rather than the package manager version, which is often several versions behind and may have DRC rule mismatches with the PDK.

BASH · build Magic VLSI
# Clone the Magic VLSI repository
git clone https://github.com/RTimothyEdwards/magic.git
cd magic

# Configure build
./configure

# Compile — use all available CPU cores for speed
make -j$(nproc)

# Install system-wide
sudo make install

# Return to home directory
cd ~
Verify Magic installed correctly: run magic --version. You should see Magic 8.3.x.

2.2 Install volare

volare is the official PDK version manager for open-source EDA PDKs. It handles downloading, versioning, and activation of specific PDK releases.

BASH · install volare
pip3 install --upgrade volare

Set the PDK_ROOT environment variable — this tells volare and all downstream EDA tools where to find the installed PDKs. Add it permanently to your shell profile.

BASH · set PDK_ROOT
# Set for current session
export PDK_ROOT="$HOME/pdk"
mkdir -p $PDK_ROOT

# Add permanently to ~/.bashrc
echo 'export PDK_ROOT="$HOME/pdk"' >> ~/.bashrc
source ~/.bashrc

2.3 Install SkyWater 130nm PDK

01
List available releases
Each release is identified by a Git commit hash with a date. Choose a recent stable hash.
BASH
volare ls-remote --pdk sky130
example output
Pre-built sky130 PDK versions
├── cd1748bb197f9b7af62a54507de6624e30363943 (2023.06.20)
├── e8294524e5f67c533c5d0c3afa0bcc5b2a5fa066 (2022.07.29)
└── 44a43c23c81b45b8e774ae7a84899a5a778b6b0b (2022.08.16)
02
Enable (download + install) a release
Replace the hash below with your chosen version. This downloads several GB — may take 10–30 minutes.
BASH
volare enable --pdk sky130 cd1748bb197f9b7af62a54507de6624e30363943
03
Confirm installation
Check the installed variant — you should see sky130A listed.
BASH
volare ls --pdk sky130
# Should show: sky130A (enabled)

ls $PDK_ROOT/sky130A/libs.tech/magic/
# Should show: sky130A.magicrc  sky130A.tech  etc.
// 03

Configure Magic for sky130A

Magic loads its technology configuration from a .magicrc file in the directory where it is launched. Create a project directory and link the PDK's rc file into it.

BASH · create project and link .magicrc
# Create your project directory
mkdir -p ~/sky130_designs/my_layout
cd ~/sky130_designs/my_layout

# Create symbolic link so Magic auto-loads sky130A tech
ln -s $PDK_ROOT/sky130A/libs.tech/magic/sky130A.magicrc .magicrc

# Launch Magic — it will detect .magicrc automatically
magic
Always launch Magic from your project directory. The .magicrc symlink is directory-specific. Opening Magic from a different folder will fall back to the default "minimum" technology with no PDK layers.
// 04

Verification

After launching Magic, verify the PDK loaded correctly using these checks.

🖥
Console output on startup Magic prints the loaded technology on startup
check console
Expected: Using technology "sky130A", version X.X PDK loaded correctly
pass
Problem: Using technology "minimum" Magic couldn't find .magicrc — check symlink and PDK_ROOT
fix needed

Verify in Magic Tcl Console

In the Magic command console (bottom text field), type these commands:

TCL · Magic console commands
# Check current technology
:tech name
# Expected output: sky130A

# List available layers
:tech layers
# Should show: ndiff, pdiff, poly, li1, met1, met2 ... 

# Check DRC rules are loaded
:drc ruleset
# Expected: full ruleset name for sky130A
// 05

Basic Usage Example

The following Tcl script creates a minimal CMOS inverter layout using sky130A layers. It draws N-diffusion and P-diffusion regions, poly gates, contacts, and local interconnect, then runs extraction to produce a SPICE netlist.

Note on coordinates: All dimensions below are in Magic internal units (lambda). For sky130A, 1 lambda = 0.005 µm. The layout is schematic-level and not DRC clean — it is intended to demonstrate the API, not to tape out.

inverter.tcl

Save this file to ~/sky130_designs/my_layout/inverter.tcl

TCL · inverter layout script
# inverter.tcl — simple CMOS inverter in sky130A
# Run from Magic console: source inverter.tcl

# ── Layer aliases (sky130A names) ──────────────────────────
set NDIFF  "ndiffusion"
set PDIFF  "pdiffusion"
set POLY   "poly"
set CONT   "contact"
set LI1    "li"
set M1     "m1"
set MCON   "mcon"

# ── Create and load cell ───────────────────────────────────
load sky130_inv new
puts "Creating cell: sky130_inv"

# ── NMOS: N-diffusion region ───────────────────────────────
box 0 0 200 300
paint $NDIFF

# NMOS poly gate
box 80 -40 120 340
paint $POLY

# NMOS source contact (left of gate)
box 20 100 60 200
paint $CONT
paint $LI1

# NMOS drain contact (right of gate)
box 140 100 180 200
paint $CONT
paint $LI1

# ── PMOS: P-diffusion region (above NMOS, gap for N-well) ──
box 0 500 200 800
paint $PDIFF

# PMOS poly gate (same column as NMOS gate)
box 80 460 120 840
paint $POLY

# PMOS source contact
box 20 600 60 700
paint $CONT
paint $LI1

# PMOS drain contact
box 140 600 180 700
paint $CONT
paint $LI1

# ── Connect poly gates vertically (shared input) ───────────
box 80 340 120 460
paint $POLY

# ── Metal 1 rails and labels ───────────────────────────────

# GND rail (bottom)
box -20 -60 220 -20
paint $M1
label GND s 100 -40

# VDD rail (top)
box -20 820 220 860
paint $M1
label VDD n 100 840

# Output node (drain of both transistors — right side)
box 140 100 180 700
paint $LI1
box 140 380 220 420
paint $M1
label OUT e 210 400

# Input label on poly
box 80 390 120 410
label IN w -10 400

# ── Save cell ──────────────────────────────────────────────
save sky130_inv
puts "Saved: sky130_inv.mag"

# ── Fit view to layout ─────────────────────────────────────
view
puts "Done. Layout visible in Magic window."

Run from the Magic Tcl console:

TCL · Magic console
:source inverter.tcl

Run DRC & Extract Netlist

After creating your layout, run DRC to check design rules and extract a SPICE netlist.

TCL · DRC and extraction
# Run full DRC on current cell
:drc check
:drc why
# Lists DRC violations with rule names

# Extract parasitic netlist
:extract all
:extract do local
:extract write spice sky130_inv.spice
# Creates sky130_inv.spice in your project directory
The extracted SPICE netlist can be simulated with ngspice using the sky130A device models located at $PDK_ROOT/sky130A/libs.tech/ngspice/.