An integer-N, ring-oscillator phase-locked loop for the
SkyWater sky130 open PDK, designed
entirely in the open-source analog flow: xschem for schematic capture,
ngspice for simulation, and
klayout-tools (klt) for layout
work. It is a sky130 port of the sibling canary
gf180-pll — same block class, a second
PDK — so that "one PLL, two open PDKs" becomes the portability proof.
This block is built by AI agents. Not "AI-assisted" — agents do the schematic
capture, write the testbenches, run the PVT corner sweeps, argue the design
decisions out in written decision records, and open the pull requests. The
verification evidence in sim/ is the point of the repository: every claim this
project makes is meant to be backed by a testbench and a recorded corner sweep,
in a format designed so you can check that yourself.
This is a design canary, not a reverse-engineering one. Nothing here is recovered from an existing part, a competitor's netlist, or a decapped die. The PLL is designed forward from a target specification (ratified row by row), and the whole record — spec, decision records, evidence, dead ends — is original work. That distinction matters for what the repo is for:
- Dogfood for klayout-tools.
A real block drawn against the sky130 open-PDK decks is the forcing function
on the tool. Every time
kltis awkward, missing a capability, or the wrong shape for the job, that friction is filed as a generic issue against klayout-tools (see the friction protocol inCLAUDE.md). The fix benefits everyone using sky130, not just this repo. - Catalog inventory. This is one entry in the 2AM Logic canary catalog — one block, one PDK — building out the inventory of open-PDK analog/mixed-signal blocks the agent fleet can design end to end.
This repository is a work in progress, and this section is deliberately a pointer rather than a scoreboard: it says what kinds of evidence exist and where the verdicts live, so it does not have to be re-edited after every campaign. For current state, read the linked files, not this prose.
- Spec —
spec/target-spec.mdis partially ratified. Some rows are bound by decision records inspec/decision-records/; the remaining rows are still DRAFT starting points and are not binding. The spec file itself lists which rows are which. - Design — forward-designed xschem schematics and SPICE netlist snapshots
for the PLL blocks and a top-level closed-loop integration live in
design/. Design values there are design-time targets or estimates; a result only counts once asim/record backs it. - Simulation —
sim/holds PLL block and closed-loop testbenches, PVT corner sweeps, Monte Carlo campaigns, and the append-only records they produced, alongside the harness's own self-checks. - Layout —
layout/holds thekltDRC/LVS flow, a trivial proving cell, and a PLL layout record with its checking reports. - Rollup —
measurements/report.mdis the machine-rendered per-spec-row rollup of thesim/andlayout/evidence. It records misses (FAIL rows) as well as passes; the existence of evidence for a row is not the same as that row being ratified or met. - Silicon — none. Nothing here has been fabricated or measured on silicon.
Evidence existing, a spec row being ratified, and a requirement being met are three different things, and none of them means verification is complete.
Where the block stands against the T1 evidence checklist is not settled by
this prose. signoff/tier-report.json is this
block's T1 verdict of record: machine-rendered by klt signoff --manifest from
signoff/block-manifest.json and re-checked in CI on every push, so it cannot
go stale silently. signoff/README.md states what each
met row does and does not say. No file in this repository hand-maintains a
parallel met/unmet checklist; if a sentence here or anywhere else claims this
block does or does not clear a T1 item, that report settles it. In particular,
a met row for the characterization report means only that
measurements/report.md is the artifact that item names; it does not mean any
spec row is met.
This repository is private. It is a design canary that binds under the 2AM Logic invention firewall; whether and when it goes public is an operator decision, not an agent one — the visibility flip is an operator action. Even so, write every commit message, issue, and document here as if a stranger will read it, because one day one may. Nothing about business positioning, commercial terms, or the contents of other 2AM Logic repositories belongs in this one.
spec/ target spec (partially ratified) + numbered decision records (DR-NNN)
design/ xschem schematics/symbols + SPICE netlist snapshots (PLL blocks + top-level integration)
sim/ PVT corner harness, PLL block and closed-loop testbenches, append-only evidence records
layout/ klt-driven DRC/LVS flow, a trivial proving cell, and a PLL layout record with checking reports
measurements/ per-spec-row report aggregator and its rendered report (rolls up sim/+layout/ evidence); silicon characterization slot, empty until there is silicon
docs/ environment setup, plus docs/t1-gap.md — a pointer to signoff/ (the graded T1 verdict) and the detailed read of T1 item 11
signoff/ block manifest + machine-rendered T1 tier verdict (`klt signoff --manifest`), re-checked in CI
Start with spec/target-spec.md for what is being targeted, which rows are
ratified, and which are still DRAFT, and sim/README.md / layout/README.md
for how results are recorded and how to reproduce them.
Two rules govern the repository, and most of its structure follows from them:
- No claim without a testbench. A statement about the design is only admissible if there is a testbench that produces it, run across the PVT corner matrix (temperature, supply, and sky130 process corners), with the raw per-corner simulator logs committed alongside the summary.
sim/is append-only evidence. A record, once written, is never edited or deleted. Re-running — even to correct a mistake — mints a new record that names the record it supersedes. So the repository keeps its own mistakes, in order, with the corrections attached.
On a machine with bash, Node/npm and uv but no
system Python or klt, reproduce the PDK-free CI checks with one command from
any directory:
bash scripts/audit-headless.sh
The wrapper creates (or reuses) a Python 3.11 + klayout-tools==0.7.0
environment under ${XDG_CACHE_HOME:-~/.cache}/sky130-pll-audit-headless
(override with AUDIT_HEADLESS_CACHE), then runs npm run check:ci followed by
bash signoff/run-signoff.sh --check, and prints the commit, tool versions and
both statuses. An environment with the wrong versions is refused unless
AUDIT_HEADLESS_RECREATE=1. Exit codes: 0 pass, 1 check failure or
incompatible environment, 2 missing prerequisite, 3 provisioning failure. It
runs no simulation and does not need the PDK.
Apache License 2.0 — see LICENSE. Copyright 2026 2AM Logic.