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.
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
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.
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
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.
# 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 ~
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.
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.
# 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
volare ls-remote --pdk sky130
Pre-built sky130 PDK versions
├── cd1748bb197f9b7af62a54507de6624e30363943 (2023.06.20)
├── e8294524e5f67c533c5d0c3afa0bcc5b2a5fa066 (2022.07.29)
└── 44a43c23c81b45b8e774ae7a84899a5a778b6b0b (2022.08.16)
volare enable --pdk sky130 cd1748bb197f9b7af62a54507de6624e30363943
sky130A listed.volare ls --pdk sky130 # Should show: sky130A (enabled) ls $PDK_ROOT/sky130A/libs.tech/magic/ # Should show: sky130A.magicrc sky130A.tech etc.
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.
# 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
.magicrc symlink is directory-specific. Opening Magic from a different
folder will fall back to the default "minimum" technology with no PDK layers.
Verification
After launching Magic, verify the PDK loaded correctly using these checks.
Using technology "sky130A", version X.X
PDK loaded correctly
Using technology "minimum"
Magic couldn't find .magicrc — check symlink and PDK_ROOT
Verify in Magic Tcl Console
In the Magic command console (bottom text field), type these 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
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.
inverter.tcl
Save this file to ~/sky130_designs/my_layout/inverter.tcl
# 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:
:source inverter.tcl
Run DRC & Extract Netlist
After creating your layout, run DRC to check design rules and extract a SPICE netlist.
# 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
$PDK_ROOT/sky130A/libs.tech/ngspice/.