Introduction
"If you wish to make an apple pie from scratch, you must first invent the universe." — Carl Sagan, Cosmos
The tower of trust
Between "my program ran correctly" and "electrons obey Maxwell's equations" stands a tower of trust: the instruction set means what its manual says; the processor implements the instruction set; the netlist computes what the RTL describes; the digital story the netlist tells is what the analog circuit actually settles to; the circuit is what the geometry realises; the geometry is what the fab printed; and the transistors do what the device models claim. Every program run in history has silently relied on every storey at once. Industrial practice verifies one or two of them and takes the rest on faith — reasonably, because the faith is grounded in decades of engineering discipline and billions of working chips, but the faith is unaudited: no one has ever written down, in one place, what exactly is being assumed at each storey and how the storeys compose.
This book is a scoping study for auditing all of it. The question it maps: what would it take to produce a machine-checked proof that one specific, physical, fabricable chip runs its programs correctly — starting from field equations over the silicon and ending at the instruction set? Not a chip designed to be verifiable, but a mainstream design produced by the ecosystem's own tools; not an idealised model of it, but the concrete artifacts the flow emits, distortions and datasheets and all.
It is not the proof. Carrying the proof out is a decade-scale project for a small group; the deliverable here is the map — for each layer of the tower, what the theorem is, how it would be proved, what it rests on, and what is genuinely unknown. The organising principle, adopted from the start: assume unbounded proof capacity, so that everything merely hard collapses to time. What survives that collapse — the claims no proof can reach, because they are empirical, or legislative, or genuinely probabilistic — is the result. The axiom register is the book's primary deliverable, and the six layer studies exist to justify its rows.
How correctness is established today
To see what is new here, it helps to know what the industry actually does — which is more, and less, than outsiders expect.
The overwhelming bulk of design verification is simulation: testbenches driving the RTL through billions of pseudorandom, coverage-steered cycles on server farms, with emulation hardware for the workloads simulation can't reach. It finds bugs with great efficiency and proves nothing. Formal methods entered the mainstream through a famous accident: the 1994 Pentium FDIV bug — missing entries in a division lookup table that shipped in silicon, cost Intel a $475M recall, and convinced the microprocessor industry that some properties are worth proving. The years after produced the field's industrial successes: floating-point units verified by theorem proving (AMD's division microcode in ACL2; Intel's FP algorithms in HOL Light), model checking — exhaustive state-space analysis of finite systems, the technique behind the 2007 Turing Award to Clarke, Emerson, and Sifakis — applied to protocols and control logic, and two formal-flavoured checks that became routine sign-off for every chip: equivalence checking, which proves the synthesised netlist matches the RTL, and static timing analysis, which covers all timing paths by construction. Below the netlist, no one proves anything: the geometric and physical storeys are governed by design-rule checking, layout-versus-schematic comparison, and manufacturing test — engineering disciplines with excellent track records and no theorems.
Academia has periodically tried to go end to end, and the history is instructive. The Viper microprocessor (UK Royal Signals and Radar Establishment, late 1980s) was fabricated and marketed for safety-critical use on the strength of a "proven correct" claim — and became the field's cautionary tale when Avra Cohn, who built the machine-checked proofs, published the sharpest analysis ever written of what such a claim can mean: the proofs related two formal models, neither of which was the physical chip; the verification was never completed down to the gates; and the storeys between the models and the silicon were exactly as unproved as anyone else's. Warren Hunt's FM8501 and FM9001 (1980s–90s, in the Boyer–Moore prover) verified real processor designs down to the netlist level — FM9001 was fabricated; the CLI verified stack (1989) composed a verified assembler, compiler, and processor into the first multi-storey artifact; Anthony Fox verified the ARM6 microarchitecture against the ARM ISA in HOL (the closest ancestor of this book's L3); the German Verisoft project (2003–07) verified the VAMP processor from ISA to gate level and built a verified software stack above it. More recently, the CakeML project's verified compiler runs on Silver, a processor verified in HOL4 down to its Verilog implementation and run on an FPGA — the vendor's Verilog-to-bitstream synthesis being the remaining trusted step — and Claire Wolf's riscv-formal brought bounded model checking to open-source RISC-V cores as an engineering practice. On the software side, CompCert and seL4 demonstrated that realistic compilers and OS kernels can be verified — and their experience with what a verification is conditional on shaped this book's ledger discipline.
Every one of these efforts stops at a storey boundary — the netlist, or an idealised gate-level model — and hands the rest to the fab's engineering. That is the gap this study is about: not any single storey, most of which have at least been attempted, but the composed statement about a physical object, with the physical storeys as theorems-with-hypotheses rather than background faith, and every surviving assumption in one auditable list. To our knowledge no one has stated that theorem before, let alone proved it.
The plan
The stance throughout is validation of an existing design, not design of a new one. The SoC at the centre was designed and is maintained by others — it is the mainstream of open hardware research, engineered to the ecosystem's best practices — and the job is to check that those practices delivered, not to re-engineer the artifact. This inverts the usual verified-hardware methodology — design for verifiability, then prove — and the inversion is the point: a theorem about a design anyone can regenerate, harden, and have fabricated says something a theorem about a bespoke academic core does not. Where a tool or an artifact cuts a corner, the finding is recorded (the register already holds several: two independent DRC engines return different verdicts on the same layout; a signoff step exhausts memory instead of reporting) and, if necessary, a minimal modification is priced. The proof architecture assumed is a hybrid one: a proof assistant hosting the statements and the glue, with untrusted industrial-strength tools — SAT solvers, synthesis tools, timing engines — admitted only through certificates their runs emit and small verified checkers replay. No tool is trusted; every tool is used.
One consequence of the stance is a rule about era: every artifact in the tower — RTL, netlist, constraints, layout, timing reports — is produced by one pinned flow, run by us, from sources we can modify. Nothing is inherited from a build that cannot be re-executed. The endgame of the study is tools that emit certificates as they run, and that requires tools that can be patched — which the layers below repeatedly cash in.
The target
The study is grounded in one artifact stack, chosen because it is the rare intersection of fully open and physically realisable. In 2020, Google and SkyWater Technology (a foundry in Bloomington, Minnesota, operating a former Cypress fab) released the SKY130 process design kit as open source — the first time the full design-side collateral of a commercial 130 nm process (design rules, device models, standard cells; the fabrication recipe itself stays in the foundry) was public. It remains the floor for open processes: no smaller node has an open PDK, so "modern" in this book means modern architecture and toolchain, never modern frequency. Merchant multi-project-wafer shuttles run against SKY130 continuously; the deliverable they accept is exactly the GDSII this book's flow emits, so the physical object at the bottom of the tower is a purchase order away rather than a hypothetical.
The design side sits on the stack that open hardware research has consolidated around. Chipyard (UC Berkeley) is the SoC framework: it composes a system — core, caches, interconnect, peripherals, debug — from parameterised generators written in Chisel, a Scala-embedded hardware language. Elaboration produces FIRRTL, an intermediate representation with a written specification, and CIRCT — the LLVM/MLIR hardware compiler — lowers it to SystemVerilog. The physical flow is Hammer, Chipyard's tool-abstraction layer, driving Yosys for synthesis and OpenROAD (a DARPA-funded academic effort) for place-and-route, with the venerable Magic layout editor — begun at Berkeley in the 1980s and still maintained — KLayout, and Netgen for the geometric and connectivity checks. On-chip memories come from SRAM22, an open SRAM generator for SKY130. Every input is pinned by commit and checksum; every artifact this book measures (RTL, netlist, GDS geometry, timing reports, constraint files) is regenerated by the flow in this repository.
The processor at the centre is Rocket — the original RISC-V implementation, begun at Berkeley alongside the ISA itself, the lineage core of the ecosystem (commercial RISC-V cores descend from it, and it has been fabricated dozens of times). The configuration is Chipyard's TinyRocketConfig, and the target follows the generated artifact exactly: a single 5-stage in-order RV32IMAC core with machine and user modes, physical memory protection, a 4 KiB instruction cache, a 16 KiB tightly-integrated data memory, a TileLink interconnect, a standard RISC-V debug module reached over JTAG, a CLINT and PLIC for interrupts, and a UART — with off-chip access carried by a serialised TileLink port at the pads. Simplicity is not the goal, realism is. The costs are recorded where they bite — machine-emitted SystemVerilog from a three-stage compiler pipeline, a pipeline and a cache in the refinement proof, generators whose semantics live in their implementation — and the study prices them rather than designing them away.
RISC-V, briefly
RISC-V is an open instruction-set architecture begun in 2010 at UC Berkeley (Krste Asanović, Yunsup Lee, Andrew Waterman, with David Patterson) — the fifth in the Berkeley RISC lineage that started with Patterson's RISC-I in 1981 and gave the reduced-instruction-set idea its name. Unlike x86 or ARM, the specification is freely implementable by anyone: stewardship passed to a foundation in 2015, now RISC-V International, and an ecosystem of open implementations grew around it — the ecosystem this book's processor comes from. Two features matter specifically for this project. The ISA is modular — a small base plus optional lettered extensions — so a small core can implement an honest subset rather than an apologetic fraction. And the standard did something this book leans on directly: RISC-V International adopted a machine-readable, executable formal specification (in Sail, a language purpose-built for ISA semantics) as its official golden model, which new extensions are required to extend as part of ratification. The spec this book verifies against is therefore not a private reconstruction from an English manual; it is the standard's own formal artifact, imported.
The six layers
The tower is cut into six layers. Each names an object — the abstraction at that altitude — and carries, as one of its subsections, the theorem that connects it to the layer above. Numbered by artifact altitude from physics up; bottom-up, since that is how the trust composes:
- L0 — physics. The device and field: from field equations and fitted transistor models to the electrical behaviour of the wires and transistors. Also the error model — what survives as genuine probability (particle strikes; almost nothing else). This is the one layer that carries ε; everything above it is deterministic.
- L1 — the electrical layer. The circuit as a space of transfer functions under a constraint system (this is where the old geometry and timing concerns merge). Two theorems live here: the drawn polygons, distorted within tolerances, still realise exactly the intended netlist with certified parasitics; and — the edge upward — timing closure, the combinatorial geometry/interference checks, and gain-based restoration together turn those transfer functions into a discrete synchronous machine (the bridge theorem everyone relies on and no one has stated). The layer trades ε for a constraint system.
- L2 — logic. The synchronous machine: flops plus combinational logic over a Boolean vector. Its edge upward is an equivalence, not an abstraction step — the hardened netlist and the source RTL denote the same machine, at gate and word granularity, by certificates rather than trust.
- L3 — RTL and microarchitecture. What the emitted SystemVerilog means: a formal semantics for the subset the design occupies (the same machine, word-level), and its edge upward — the theorem a computer architect would recognise, that the hardware refines the instruction set. The tower's irreducible proof.
- L4 — the ISA. The specification itself: the imported Sail standard, plus the parts that exist only as informal prose and must be formalised.
- L5 — the system. What the end-to-end claim is even about: the chip's observable behaviour at its pads, with the memory map, peripherals, and power in the specification where they belong.
Each layer names an object and, in one subsection, proves the theorem linking it upward; the layers compose along those seams into the top-level statement — the next chapter displays the whole chain. Two of those links are conditional on probabilistic events (a particle strike, an unresolved synchroniser), and those two conditions are exactly where the theorem's ε lives; everything else is deterministic. The book's chapters run top-down, L5 to L0, because the material gets progressively crunchier as you descend — and because reading the claim before its foundations mirrors how the trust is actually spent.
The overview that follows is the mathematical front door: the top-level statement, the objects at the seams, the dispatch of the proof into layers, and their prices. The appendices hold the ledgers — axioms, findings, the glossary, a reading list, and the bibliography. Everything else is the six layers.
Overview — the mathematical content
Background
The introduction set the scene — the tower of trust, how the industry establishes correctness today, the validation-not-design plan, the Chipyard/Rocket target, and the six layers in prose. This page is the mathematical front door: the statement the project is trying to establish, the named objects at the layer seams, and the dispatch of the proof into layers with their prices. Project structure and tooling live in the repository's root README; the flow's jargon is in the glossary, and textbook on-ramps for the fields the tower spans are in the reading list.
The top-level statement
Let d be a fabricated die, F a program image, E an environment (supply, clock, temperature, radiation, asynchronous inputs). Write obs(d,F,E) for the observable trace at the pads and Sys(F) for the pad-trace semantics of the system specification — both defined by L5, not primitive. (How F gets into the machine — resident boot ROM, the debug module, or the serial TileLink port — is part of L5's boundary decision, not an aside: every load path is a pad-trace prefix.)
Envelope(d, E) ← L0/04, V1–V7
∧ Axioms ← axioms.md
⟹ P[ obs(d,F,E) ⊑ Sys(F) ] ≥ 1 − ε(T)
ε(T) = λ·A·T·AVF particle strikes (P2)
+ N_sync·P_meta(T) unresolved synchronisers (P1)
+ P_droop supply excursions (P6)
(Symbols: λ is the particle flux and A the die area; AVF, the architectural vulnerability factor, is the fraction of raw bit-flips that matter architecturally; N_sync counts the synchroniser boundaries where the design meets unclocked inputs. All three ε-terms are derived, not decorative — each has its own chapter.)
Three features of this statement are deliberate and worth defending.
It is probabilistic, and irreducibly so. No amount of proof removes ε. P1 is irreducible by Marino's theorem — no continuous bistable escapes unbounded settling — and P2 is a Poisson process driven by an external flux. What proof can do is derive their coefficients rather than measure them, which is what shrinks P1 and P2 in the axiom register without eliminating them.
Both ends are slots filled by their own layers, and neither is a placeholder for something easy. Envelope is L0's, and is a genuine intersection of five structurally different constraint shapes (L0/04). Sys is L5's, its ISA core is L4's — which for the Rocket core must include the machine-mode privileged subset (CSRs, traps, interrupts, PMP) alongside the base ISA — and parts of the surrounding SoC's behaviour exist only as generated code, device-tree annotations, and de-facto register conventions, so the residual device/CSR semantics must be authored rather than imported (L4, L5).
⊑ is trace refinement up to stuttering, not equality. The implementation takes many cycles per architectural step; L3's obligation is a stuttering simulation with a measure function, not a cycle-accurate correspondence.
The spec tower
The named objects at the seams. Each is the node of some layer — the object that layer is. Every layer README opens with its node (the object) and its edge up (the theorem carrying that object to the next one): a node supplies an object; the edge above it is a theorem connecting two objects.
| object | what it is | supplied by |
|---|---|---|
Field(A) | trajectory space of the transient field problem on fabricated geometry A | L0/00 (definition) |
Contracts(N) | netlist N with each cell carrying its timed assume-guarantee contract (interval Liberty arc + regime classes + noise margin) and each net its RC enclosure | L0/07–05 + L0/09 |
Mealy(N) | the discrete machine induced by the cells' Boolean functions — a Mealy machine is a clocked finite-state machine over bitvectors, outputs computed from state and current input | derived — formerly axiom S1; falls out of L1/06's (A) + M5 |
⟦RTL⟧ | word-level transition system of the source text | L3 (definition) |
ISA | Sail-RV32(config, incl. machine-mode subset) ⊕ S4-choices ⊕ residual authored semantics ⊕ spec-UB clause | L4 (definition) |
Sys(F), obs | pad-trace semantics of the system spec; the physical observation map | L5 (definition) |
One identification is used silently everywhere and stated only here: N is a single shared object. The netlist that L1's LVS certifies the geometry against, the netlist L1's STA runs on, and the left-hand side of L2's equivalence are all ⟦ChipTop.mapped.v⟧ — the flow's hardened netlist — under one parse. X1's obligation, one parser, three consumers.
The organising principle
With unbounded proof capacity, the deliverable is the axiom list.
Everything merely hard collapses to time. What survives is what is not a theorem: specification fidelity, empirical models, physical facts, and genuinely probabilistic phenomena. So each layer is organised around what it discharges and what it introduces, and the running register is axioms.md — with the open mathematical questions (M1–M8) kept separate from the axioms, because effort could in principle remove them.
Notation. Lettered identifiers index the appendix registers: S/E/P/X+number are axioms, F+number are findings about the design and its flow (unestablished or false hypotheses), M+number are the open mathematical questions — all in Axioms. Layer-local check families are defined in their owning chapters: W1–W4 (netlist well-formedness, L2/01), G1–G6 (geometric checks, L1/12), V1–V8 (the operating envelope, L0/04), C1–C7 (spec choices, L4/02), B1–B3 (claim boundaries, L5/01). The spec-tower objects are introduced just below; the standalone value X — the untracked third logic value — is in the glossary. Reading top-down, these appear before their definitions; every mention is a link.
Backgrounds. No single reader arrives knowing all of the fields this book crosses — the required intersection (computer architecture ∩ EDA ∩ analog design ∩ device physics ∩ PDE theory ∩ formal methods) is empty. So every chapter after the introduction (which is background throughout) opens with a Background section written for a reader from outside its field: the concepts, mechanisms, and proof techniques the chapter is about to use, explained from scratch (the layer chapters' are brief orientations; the sub-chapters' do the real teaching). Experts in a chapter's home field should skip its Background; everyone else should not. The glossary is the quick-lookup complement; the reading list is the textbook-depth one.
The dispatch
Each layer's named obligations. This is the proof skeleton; the layer documents are the expansions.
Every layer is a node — an object at one abstraction altitude — and the theorem connecting it to the layer above is one subsection of it, its "edge up." Definitions live in nodes; theorems live between them, on the edges. The tower has six nodes (L0–L5) and five edges. Two of those edges are decisive crossings: the ε-crossing (L0→L1), where physics establishes the deterministic EE abstraction, and the digital crossing (L1→L2), where timing closure, the geometry/interference checks, and gain-driven restoration turn analog transfer functions into a Boolean machine. Below the ε-crossing the world is analog and probabilistic; between the two crossings it is deterministic-analog; above the digital crossing it is Boolean and architectural.
Nodes and edges fail differently, and the asymmetry is why they are marked. A wrong edge (theorem) will not prove — the kernel guards it. A wrong node (definition) yields a true theorem about the wrong object — only adequacy guards it, which is why the definition nodes (L4, L5, and the L3 node) carry adequacy machinery instead of proofs. Most crossing-constraints are discharged — established at the edge and then gone (timing, restoration, the interference budgets). One survives as a standing hypothesis of the node above: well-formedness (acyclic combinational logic, no shorts, no runaway) cannot be spent at the digital crossing, because L2's Boolean machine is only well-defined under it (W1–W4). (The table runs bottom-up, L0→L5, following the composition; the book's chapters run top-down, L5→L0 — start wherever suits.)
| node (object) | edge up (theorem = a subsection) | named obligations | effort |
|---|---|---|---|
L0 — Physics: Field(d), device models, the error model (ε lives here) | the electrical abstraction (ε-crossing): field sim over cell + wire geometry ⟹ Contracts(N)'s transfer functions; the error model is Poisson | M3 lumping/composition · M7 regime decomposition (I)(P)(A) · M1 device uniqueness · CCC cut discipline · M8 metastable eigenvalue | 1–3 yr |
L1 — Electrical: the EE circuit + constraint system (N + RC + timed contracts + SDC) | the digital crossing: timing closure + geometry/interference checks + restoration ⟹ Mealy(N), a Boolean machine | layout ⟹ N + RC ∀A in E7 · (H1)(H2)(H3) sandwich · M2 screening · G1–G6 · M5 the bridge theorem · M4 monotonicity · SDC exceptions | 3–5.5 yr |
| L2 — Logic: the synchronous machine (flops + comb logic over a Boolean vector) | the CEC — a horizontal equivalence, not an abstraction step: Mealy(N) ≈ρ ⟦RTL⟧ | W1–W4 well-formedness (the surviving hypothesis) · CEC with certificates · ρ, the register correspondence (F5) | 6–9 mo |
L3 — RTL / microarchitecture: ⟦RTL⟧, the word-level machine (definition node) | the invariant — the genuine abstraction step: ⟦RTL⟧ ⊑ ISA, stuttering simulation at a commit point | measured construct census · FIRRTL adequacy · the invariant | 3–6 mo + 1.5–3 yr |
L4 — ISA: Sail-RV32(config) ⊕ authored residue ⊕ S4-choices (definition node) | none of its own — L3 refines into it, and the ISA ⊕ devices composition is carried by L5 | S2 Sail fidelity (incl. the machine-mode subset) · S3 residual authored semantics · S4 underspecification choices | 6–9 mo |
L5 — System: Sys(F), obs (definition node, top of the tower) | none — the tower ends here | X4 device models · the bus contract · the boundary decision (core / SoC / device) | ~6 mo |
The effort accounting. Figures are for one competent person and are the sums of the subcomponent estimates — the two merged nodes (L1 = geometry + timing, L3 = RTL semantics + the refinement) show their two summands. The original per-layer figures — seeded before the decomposition at "a few years each" — ran roughly 2× higher; scoping the pieces is precisely what revised them, and the sums reflect the better understanding, so they replaced the anchors. One cross-cutting cost is priced separately because no layer owns it: shared infrastructure — the hybrid proof framework itself, bitvector automation, symbolic simulation, and the LRAT/PAC checker integrations — 1–2 person-years, consumed by every theorem edge. Naive sequential total: 8–15 person-years, before the FPGA alternative (which deletes L1's geometry half, 2–4 of them).
Note one deliberate inversion: L2's CEC edge consumes L3's object ⟦RTL⟧, so proof order is not tower order. The numbering is by artifact altitude — netlist below RTL — not by logical dependency.
How they compose
Each ≔ line is a node (an object supplied); each ⊨ line is that node's edge up (a theorem to the next object). ≔/⊨ alternate all the way up.
device d ∈ Envelope
≔ L0 Field(d), device models, ε [the physics node; E1, Poisson error model]
⊨ L0→L1 Field(d) ⊑ Contracts(N) [electrical abstraction; M3, M7; modulo E1] † ε-crossing
≔ L1 N and RC well-defined ∀A in the E7 family [the EE-circuit node; (H1)(H2) checked, E7 ⊨ (H3); M2]
⊨ L1→L2 Contracts(N) ⊑ Mealy(N) [digital crossing = timing+geometry+restoration; M5; F-series] †
≔ L2 Mealy(N) [the synchronous machine; W1–W4 standing]
⊨ L2→L3 Mealy(N) ≈ρ ⟦RTL⟧ [the CEC — horizontal equivalence; ρ = F5]
≔ L3 ⟦RTL⟧ = the microarchitecture [measured census]
⊨ L3→L4 ⟦RTL⟧ ⊑ ISA [the invariant — the genuine abstraction step]
≔ L4 ISA = Sail-RV32 ⊕ machine-mode subset [S2, S3, S4]
≔ L5 Sys(F) = ISA ⊕ memory map ⊕ devices [X4, bus contract — the ISA⊕devices composition]
────────────────────────────────────────────────────────
obs(d,F,E) ⊑ Sys(F) with probability ≥ 1 − ε(T)
† is where ε enters. The two marked lines hold on the event "no particle strike (P2) and no unresolved synchroniser read (P1) during [0,T]"; every line above them is deterministic conditional on that event, and ε(T) is exactly the probability of its complement (plus P6's droop term). The probability in the conclusion is not smeared across the chain — it is the measure of the conditioning event for two specific lines.
Interfaces
Each node exports a thin object, and each edge is one arrow up. The functional chain (L2→L5) and the physical chain (L0→L2, the two crossings) are nearly independent and meet only at the netlist:
L5 Sys(F): pad traces (memory map, serial TL, UART, obs) ← top node
↑ ISA ⊕ devices ⟹ Sys — composition at the chosen boundary
L4 ISA (Sail + the Rocket-specific parts authored) ← definition node
↑ the invariant — stuttering refinement, word-level ← THE WORK
L3 ⟦RTL⟧ = the microarchitecture (buses, arithmetic intact) ← definition node
↑ the CEC — horizontal equivalence, certificates
L2 the synchronous machine / gate netlist ←── meeting point ───┐
↑ DIGITAL CROSSING: timing + geometry checks + restoration │ annotations
L1 the EE circuit: extraction ⟹ N + RC, timed contracts, SDC │ (delay, RC)
↑ ε-CROSSING: field sim ⟹ deterministic transfer functions │
L0 devices/field: cells ⟹ Boolean functions, ε ────────────────┘
The refinement proof never touches RC. Electrical data exists solely to discharge the digital crossing's hypotheses. That is the cleanest seam in the stack and should be preserved deliberately — see L1 on keeping crosstalk out of the interface, and treating any net that would need a functional coupling constraint as a layout bug.
Note that geometry is not a layer — it splits by character. The continuous, field geometry (transistor and wire shapes, RC) lives in L0's edge up, the ε-crossing, where the field simulation runs on it to establish the transfer functions; it is analog. The combinatorial, relational geometry (tap density, min spacing, "≥ N apart" checks) lives in L1's edge up, the digital crossing, where each check discharges a budget L0 set — L0 states an analog budget ("interference < X ⟹ ε bounded"), and the layout check is the finite combinatorial proof the budget holds. So a safety condition is stated in one layer and discharged in another: L0/06 carries the dispatch table, and L0 owns the statement of every envelope condition but the check for only one.
The composition, machine-checked — and its seam ledger
The chain above is not only prose: it is a Lean theorem, chip_realises_isa (dieBeh = isaBeh), which says the physical die and the ISA reference produce the same pad-trace on every program, and it type-checks — the layer boundaries genuinely line up. Its content is entirely in what it assumes, and #print axioms reads that back exactly. One boundary is a real, sorry-free proof: the netlist ↔ RTL middle (trace_refines, composing the proved one-step l2_commutes across cycles). Every other arrow in the diagram is a named interface axiom, because the layers that would discharge it are still proof-phase.
Those interface axioms are the honest measure of "the layers connect formally": each is a seam the thesis claims but has not yet proved. They are the arrows of the diagram, and — this is the gap the Lean attempt surfaced — the per-layer scoreboards scored the layers' internal obligations but never scored the seams. So the seams are now a first-class section of the scoreboard (IF/*, generated by tools/check-interfaces.py), one row per arrow, and are described in full in the seams appendix: the M5 timing bridge (iface_L1_timing), extraction+grounding (iface_L1_L0, which composes the celltopo/routecheck/LVS islands nothing else joins), the RTL front-end (frontEndCommutes), matched reset (reset_corr), the L3 refinement invariant (iface_L3), and the ISA/system boundary (iface_L4_L5) — plus the one dischargeable trust anchor the equivalence certificates rest on (miterCNF_sound). Closing the tower is discharging those seven rows; until then, the end-to-end theorem is real but conditional, and says precisely on what.
Three structural facts that recur at every layer
These are why the edifice is possible, and they shape every proof in it.
1. Nothing accumulates. Every layer has a mechanism that resets the error budget: gate restoration kills noise accumulation across logic depth; the clock edge kills timing-error accumulation across cycles; local variation adds in quadrature (√n) rather than linearly along a path; ECC plus scrubbing converts a linear-in-time failure rate into a quadratic one. Consequently every proof here is inductive with a fixed invariant, never one tracking a growing quantity.
2. Continuous perturbations get discharged; discrete events get carried. The continuous mechanisms are suppressed by hundreds of orders of magnitude — thermal escape faces a ~7,500 kT barrier, giving ~10⁻³²⁸⁵ — and should be bounded away and deleted, not carried as epsilons. The discrete ones (particle strikes, manufacturing defects) are Poisson, do not shrink with margin, and are handled by redundancy or by test, never by better analysis. Confusing the two is the most common modelling error in this area, and the trap is that coupling capacitance looks like the first kind and behaves like the second: it is additive, so its far-field sum needs a genuine convergence argument (M2) rather than a smallness claim.
3. Amortisation is the whole game. The ~400 standard cells of the library, verified once, cover every design on the process — this design's hardened netlist draws its 51,359 instances from just 96 cell types. One SRAM macro proof covers every instance of that macro (the 2 KiB data array appears twice; the memory obligation is parametric in depth, so size costs area, never proof). And because the design is generated, its entropy is the configuration: a few dozen lines of Scala elaborate to 228 modules and 9.4 MB of SystemVerilog. The per-design content is far smaller than the artifact size suggests.
A pattern worth naming
Recurring often enough to be a heuristic rather than a coincidence:
A real physical instability, prevented by a design rule, which is therefore secretly a hypothesis of a well-posedness or boundedness claim rather than a manufacturing constraint.
Instances so far: min-width and min-spacing are the hypotheses of L1's topology-preservation theorem; tap coverage is what destroys latch-up's second PDE solution branch (M1), i.e. what makes "the transistor's I-V characteristic" well-defined; the voltage rating keeps impact-ionisation terms out of the model and hence keeps global existence available; tied metal fill is a precondition of M2's cascade, since floating conductors relay rather than screen.
Several DRC rules are the side conditions of theorems nobody has written, and recovering those theorems may be the cleanest way to say what a rule deck actually means.
The certificate archetypes
Every PASS obligation on the scoreboard is discharged the same way — a tool emits a witness an independent checker re-verifies — but the checkers are not equally trustworthy, and the ladder is worth naming. Ordered by distance to a self-checking proof:
-
Functional, re-checkable. The tool's output is verified over the full input space by a second, simpler program.
celltopoderives a cell's switch-level Boolean function from its transistors and checks it equals the Libertyfunctionover the whole truth table; the CEC trail (L2/04) dumps each synthesis pass's miter and a SAT refutation an independent solver replays. The anchor is a single checker-soundness line (the truth-table comparator; the DRAT checker) — nothing else is trusted. -
Independent witness. A structural property re-derived from scratch, independent of the tool that made the artifact.
routecheckre-verifies the router's no-opens/no-shorts from the routed DEF by union-find and a sweep-line — trusting the witness algorithm, not the router. -
Conservative bound over a trusted model. A monotone or interval argument that a specification number bounds a physical measurement.
spicecheckscreens each Liberty delay against an ngspice/BSIM4 simulation; the power-grid droop check reduces to a box-corner evaluation because the grid Laplacian is an M-matrix (monotone). Here a physical model (BSIM4, the Laplacian) enters the trust base, discharged only up to the model's fidelity. -
Oracle against a golden model. An execution checked instruction-by-instruction against a reference.
cosimruns the hardened RTL against spike and confirms every committed instruction's PC, writeback, and CSR. The golden model is trusted; this is the executable precursor to the L3 refinement proof, not a substitute for it. -
Structural census. A finite decidable predicate re-run over the artifact — W1–W4 on the netlist, the memory-map / boundary / interrupt checks against the device tree, the RTL construct census. The predicate itself is small and auditable; that is the whole trust.
The ladder is exactly where the remaining trust concentrates: (1)–(2) hand back something independently verifiable, while (3) rests on a physics model and (4) on a reference implementation — which is why the analog models and the ISA oracle sit next to the axiom register's EXTERN entries. The taxonomy is made precise in the project's Lean skeleton (lean/, Prelude/Certificates), where each archetype is a typed certificate whose soundness axiom is exactly its anchor, and every layer L0–L5 carries at least one certificate-backed, sorry-free leaf.
Status
Open mathematics (M1–M8 in axioms.md): M2 (the screening exponent) and M5 (the bridge theorem) are the two the project's structure most depends on; M1 (uniqueness for stationary drift–diffusion) is the only one that is open mathematics rather than open formalisation.
Established for this design — the parts that are not speculative:
- The full generation chain reproduces from pinned sources: Chisel elaboration through FIRRTL and CIRCT to SystemVerilog, synthesis to a netlist with zero unmapped cells, all memories resolved to three SRAM macro kinds. The artifacts the layers name exist and were produced here.
- Independent signoff engines are not interchangeable, and the register carries the measurement: on the same layout, one DRC engine reports clean while another reports violations — so a single engine's verdict is treated as one witness, and the geometric checks (G1–G6) are stated engine-independently.
Unestablished for this design (the F-series in axioms.md): the physical signoff — multi-corner timing, DRC, LVS on the final layout — is not yet closed by the flow, and until it is, the hypotheses of the bridge theorem are not established; the SDC exception set is unverified; register correspondence through synthesis is unknown. The checker suite that pins these rows is being re-anchored to the flow's artifacts, and the scoreboard tracks exactly which obligations have a running check.
See findings.md for the measured data behind all of it — and the scoreboard for the live checker verdicts of the commit this book was built from: every obligation as PASS, FINDING, TODO (with its blocker named), or EXTERN.
The chapters descend the tower from here: L5 first — the claim — down to L0, where it runs out of turtles.
The die explorer
Everything in this book is grounded in one physical artifact: the routed layout of the target chip. This page lets you look at it — the actual metal the detailed router placed, read straight from ChipTop.def and the cell GDS, rendered as vectors you can pan, zoom, and toggle.
↗ Open the explorer full-screen
What you're looking at, and where each layer proves it
The explorer is a zoom hierarchy, and each level is the subject of a layer of this book:
- The die — 3.59 × 2.99 mm, with the five SRAM macros (the caches) carved out as labelled boxes. The floorplan and the macro contracts are L2/02.
- The metal layers (met1–met5) — every wire the router placed, 559,285 segments. That two nets crossing on different layers don't connect, while same-layer overlap would be a short, is exactly the no-shorts half of the routing witness; the no-opens half is that each net's routing self-connects. Both are machine-checked — all 41,287 two-pin nets connect, zero shorts — by
tools/routecheck.py. - The vias — 554,469 of them, coloured by the layer pair they bridge (li1–met1 grey-blue, met1–met2 purple, up the stack). A via is the only place two layers connect; the grey-blue li1–met1 vias are where routing meets a cell pin — the pin geometry of L1/02.
- The cells — split into the 67,893 logic gates and flops and the 135,134 well-taps and fill. Taps carry no logic: they tie the wells to the rails to prevent latch-up (L0/06, the tap-coverage condition). Hover any cell to see what it is.
- The transistors — zoom past ~24 px/µm and the standard cells resolve into their real geometry: green diffusion, red poly gates (a gate crossing diffusion is a transistor), blue met1. This is the L0 device level — the bottom of the tower, where the digital abstraction meets the silicon. Every instance is one of only ~122 distinct cell layouts, drawn once and placed everywhere.
How it's built
tools/chipviz.py reads the routed DEF into a compact per-layer segment blob (gzipped uint16); tools/extract-cells.py pulls the ~122 used cell masters' polygons from the GDS with gdstk; tools/build-chipviz-html.py assembles a single self-contained page that decompresses the blobs in the browser (DecompressionStream) and draws them on a canvas with viewport culling — no rendered pixels served, resolution-independent at any zoom. It regenerates from the flow artifacts; see tools/build-book.sh.
L5 — The system specification
Node — the top of the tower:
Sys(F)andobs, the two objects the overview's top-level statement quantifies over (00–05);Sys(F) = ISA ⊕ memory map ⊕ devices, with theISA ⊕ devices ⟹ Syscomposition — the edge into this node from L4 — carried by 03. No edge up: this is where the tower ends. A definition node — specification authoring, not proof. Consumes:ISA(L4), device datasheet models (X4).
Background
This is the first layer of the book and the top of the tower, and it answers a question that sounds administrative but is foundational: what is the end-to-end theorem about? Not the ISA — an instruction set has no pins, and no statement about it mentions a physical object. The only interface a chip has with the world is its pads, the few dozen metal contacts the package's pins bond to, so the top-level specification must be a set of allowed pad-signal histories, and everything standing between the processor core and the pads becomes spec rather than scenery: the memory map, the boot ROM and the serial TileLink port the program arrives by, the UART the output leaves by, the JTAG debug port, and the power supply's arrivals, sags, and departures.
The chapters build exactly that. 00 defines the two top-level objects; 01 decides which physical object the claim is about (core, SoC, or the device you can hold); 02 writes the promises core and fabric exchange; 03 models the peripherals; 04 handles power, including brown-out; 05 fences off the configurations the theorems don't cover. Each chapter's own Background introduces its protocols and mechanisms from scratch.
Statement
This layer owns the map from architecture to observable behaviour — Sys(F) = ISA ⊕ memory map ⊕ serial TileLink ⊕ UART ⊕ debug/boot machinery, rendered as timed pad traces, and obs as the physical observation (00). The boundary test with L4: move the core to an FPGA and L4 survives byte-for-byte while this layer is replaced wholesale — L5 is this chip.
Subcomponents
| status | ||
|---|---|---|
| 00 | The two definitions; the physical trace alphabet (forced by epoch composition) with byte views derived | weeks; everything plugs in here |
| 01 | B1 core → B2 SoC → B3 device as successive theorems; X4 as a per-level dial | decision + the B3 smoke test |
| 02 | The bus contract: the TileLink assume-clauses and the load-bearing latency bound B(config); discharged at B2 | days to author |
| 03 | Memory map, IRQ map, UART, boot devices — the generator's sources consolidated, diffed against the RTL | months, wide |
| 04 | Epoch composition: V8, POR, X-elimination, boot promise, F-immutability, brown-out + supervisor | composition: weeks |
| 05 | The recommended-operating-conditions clause: register-reachable knobs (clock gating, tile reset, boot select), X-flood semantics of "unspecified" | days; the slot matters |
Interfaces
Consumes: ISA (L4), L3's configuration record, the SoC RTL and its generated device tree (as 03's raw material), X4's models per B-level. Exports: Sys(F) and obs to the overview; the bus contract and B to L3; the configuration objects to the operating-conditions clause; the epoch requirements to the board (supervisor, sequencing).
Axioms introduced
X4 (device datasheet models) — a scoping dial, not a monolith: B1 needs none, B2 the on-die batch, B3 all of it, including whatever agent sits across the serial TileLink port; each theorem conditional on exactly its batch (01).
The layer's shape
Two definitions and four consequences. 00 fixes the objects, with the alphabet choice forced from below (epochs need prefix closure, which only the physical level has). 01 fixes what the claim is about, in three widening rings. The remaining files are the composition's components: the interface half (02), the address-and-device half (03), time's outer structure (04), and the domain clause (05). The recurring find of the layer: the SoC's small control devices keep receiving their formal jobs here — the boot-address register (boot promise), the tile-reset setter (epoch structure), the clock gater (operating-conditions knob), the error device (the bus contract's failure clause) — continuing the pattern that nothing in this design is decorative.
Open problems
- Author the bus contract (02) — gates L3's refinement statement; days.
- The RTL-vs-generated-metadata diffs (03) — drift between RTL, device tree, and register maps is the expected finding.
- The UART framing-error decision and the rest of 00's derivation stack.
- The F-immutability check and the supervisor inequalities (04).
- Whether the pad ring and the serial-TileLink far end get behavioural models (B3) or the claim stops at B2 (01).
First experiments
- Write the B1 bus contract and check it against the tile's TileLink transactions in simulation (02) — unblocks L3.
- Extract the memory map from the RTL, diff against the generated device tree and register maps (03).
- State B3 for one hello-world image — "with F = this image in the boot path, the UART emits 'hello' at the configured baud" — fully formally, even unproven: it exercises every definition in the layer and will surface each one that is missing (01).
Effort
~6 months, definitional. The risk profile matches L4: errors here are invisible to every layer below and produce a true theorem about the wrong system.
Reading
The TileLink specification — the protocol 02's contract restricts. The RISC-V debug specification (the JTAG port is a pad-visible agent with its own protocol). The generated device tree and register maps — 03's provenance table maps them.
L5/00 — Sys(F) and obs: the two definitions
Background
A specification, in the sense used throughout this book, is a set of allowed behaviours, and a behaviour is a trace: a sequence of observations over time. To specify a machine you must therefore first answer a question that sounds trivial and is not: observations of what? A program's variables are not observable — they are an abstraction maintained by the processor. The processor's registers are not observable either — they are voltages on wires buried under many layers of metal. The only physical interface a chip has is its pads: the few dozen metal contacts around the die's edge that the package's pins bond to. Everything the chip will ever do to the world, it does by moving pad voltages; everything the world does to the chip arrives the same way. So the top-level specification must ultimately be a set of allowed pad-voltage histories, and this chapter defines both sides of that statement: Sys(F), the allowed set, and obs, the function that turns a physical run of the die into a trace that can be compared against it.
To see what has to go into Sys, look at what surrounds the processor core. This chip has no screen or keyboard; it talks to the world through a handful of serial interfaces, each of which is a small machine in its own right. Bulk data crosses the boundary over the serial TileLink port: on-chip bus transactions are cut into 32-bit phits and shifted across the pads under the link's own clock, so a single off-chip memory access takes dozens of core cycles — and the same port, driven from outside, is how a host can write a program image into the chip's memory before releasing it to run. Text output leaves over a UART (universal asynchronous receiver-transmitter), the simplest serial protocol there is: one wire, held high when idle, on which each byte is sent as a start bit (a 1→0 drop that announces "byte coming"), eight data bits, and a stop bit, each lasting one bit cell whose duration is set by the agreed baud rate. There is no shared clock — the receiver times the bit cells with its own clock, which is why clock accuracy (P6) will do real work in this chapter. A JTAG port reaches the standard RISC-V debug module — a five-wire agent that can halt the core, read its registers, and write memory, which makes it both a load path for F and a spec-visible actor. Finally, a custom_boot pin selects the boot behaviour, and a clock tap pin exports an observable copy of the internal clock. Pad functions in this design are fixed — there is no pin-multiplexing machinery — which removes a whole class of configuration-indexed observation problems before they start.
Two properties of trace sets do heavy lifting here and deserve their plain-language forms up front. Refinement (⊑) is the statement "every behaviour of the implementation is an allowed behaviour of the spec" — nothing more; where the spec offers several options (nondeterminism), the implementation may take any. Prefix closure is the property that if a trace is allowed, so is every initial segment of it — in other words, the spec never forbids stopping. That sounds like a technicality until you remember that this machine's power can vanish at any instant: a spec that promised "the UART will print hello" unconditionally would be falsified by pulling the plug mid-hell. Prefix-closed specs make power loss survivable by construction, and the price — the spec can never promise that anything will happen, only that whatever happens is right — is repaid by attaching an explicit time bound T to every liveness claim ("if powered through cycle N, the byte has appeared").
One more translation. The pad voltage is an analog quantity; calling it "0" or "1" is a claim, not a measurement. L0 defines the regimes — voltage-and-stability conditions under which a node counts as logic 0, logic 1, or neither — and obs classifies pad samples through those regimes. Where no regime applies (mid-transition, during power ramps), the trace records that honestly rather than rounding to a bit.
Statement
Define the two objects the overview's top-level statement quantifies over — the map from architecture to pad-level observable behaviour that, before this layer existed, the overview used while nobody defined it.
Sys(F) = traces at the pads of:
ISA (L4) the core's contract
⊕ SoC memory map what each address means [03]
⊕ serial TileLink bridge model off-chip traffic, phits [02, 03]
⊕ UART model the observable output channel [03]
⊕ boot machinery (ROM, boot-address the load paths for F, and
register, custom_boot, debug) the first fetch [03]
obs(d,F,E) = the physical trace: sampled pad voltages of die d,
classified through L0's regimes, at L1's clock granularity
Both are definitions; the theorem connecting them is the whole rest of the repository.
The trace alphabet — the load-bearing choice
obs is defined at the physical alphabet: timed, regime-classified pad samples. This is forced, not stylistic, by the epoch analysis (04): an epoch ends in valid-prefix · ramp-down-tail, and prefix closure — the property that lets a machine stop without violating anything — holds at the physical level only. A truncated byte is a prefix of a timed trace but not of any byte sequence, so abstract views (bytes, phits, transactions) are derived, never primitive, or epoch composition is unstatable. (The tail is demonic — adversarially unconstrained, the spec holding under every resolution — only without supervisor + fail-safe-pad discipline; with them it refines to a specified truncate-idle-decay shape — 04.)
Consequences worth pinning:
- The UART channel is a timed trace against the baud clock — bit cells, start/stop framing — with P6's clock-accuracy bound doing quantitative work in the derivation of the byte view. Where framing errors land (open problem: garbage byte vs. excluded-by-derivation) is a real spec decision.
- The serial TileLink channel is a timed trace against the link clock — its phit view and transaction view are two more floors of the same derivation stack, with the clock-domain crossing between link clock and core clock as the validity condition.
- Start of trace: from power-on reset; the boot window before reset release is spec'd by the pads' reset-state defaults and the boot machinery (04's boot-window promise), not demonic.
Refinement shape
obs(d,F,E) ⊑ Sys(F) is trace refinement up to stuttering at the physical alphabet, prefix-closed, with liveness expressed as bounded progress (every claim carries its T). The ε-conditioning lives at the overview's †-lines, not here — Sys itself is a deterministic-spec-with-nondeterminism object, never probabilistic.
Obligations
- The alphabet definition: sampling, regime classification, the per-pad fixed interpretations.
- The derivation stack: physical → bit-cell → byte → "the UART printed hello" (and physical → phit → TileLink transaction), each level with its validity conditions.
- The
Syscomposition operator itself — how ISA steps, memory-map reads, and device models join into one trace set (the fibred/synchronised product; small but must be written once).
Effort
Weeks; every other L5 file plugs into these two definitions.
L5/01 — The boundary decision
Background
"Verify the processor" is ambiguous in a way that matters enormously, because the thing you might mean by "the processor" comes in at least three sizes, and each size is a different theorem about a different object.
The smallest object is the core: the RocketTile, the generated module containing the pipeline, its caches, and its page of CSRs. A core is not a chip — it is a module with named ports (a clock input, a reset input, a TileLink memory interface, interrupt lines), the hardware analogue of a function that has parameters but has not been called. It cannot run anything on its own; it must be instantiated inside a larger design that connects its ports to actual memory and actual pins. The middle object is the SoC (system-on-chip): ChipTop, which wraps the tile together with the bus fabric, the boot ROM, the CLINT and PLIC, the UART, the debug module, the serial TileLink bridge, and the pad ring — the ring of large driver circuits around the die's edge that turn feeble internal signals into ones strong enough to drive the outside world, and protect the die from it. The SoC is the thing the flow hardens into a layout. The largest object is the device: the packaged chip soldered to a board, next to whatever agent answers the serial TileLink port, a voltage regulator, and a reset supervisor. Only the device is a thing you can hold, and only claims about the device are claims about a computer rather than about a description of one.
Each step outward drags more of the world into the theorem. A claim about the core can assume its memory port behaves (someone else's problem). A claim about the SoC must prove that the surrounding fabric actually delivers that behaviour — but may still assume the far end of the serial link works. A claim about the device must model that far end, the power supply, and the reset circuitry too — and for those parts, which are other people's silicon, no proof is possible even in principle: the best available model is the manufacturer's datasheet, the document stating what the part promises under what conditions. Datasheet-backed models are assumptions, and they are tracked in the axiom ledger under X4. The discipline this chapter establishes is that "the devices meet their datasheets" is never assumed as one blanket axiom, but in per-claim batches: each theorem names exactly which datasheets it stands on.
Statement
The defining scoping choice of the layer: which system the claim is about. Three candidate statements, strictly increasing in strength and in what they drag in:
| claim | needs | character | |
|---|---|---|---|
| B1 core | the RocketTile refines ISA at its TileLink interface | the bus contract only (02) | strongest per unit effort; not about a device |
| B2 SoC | ChipTop refines ISA ⊕ memory map | + SRAM macro models, ROM contents, fabric and peripherals (03) | about the netlist the flow hardens |
| B3 device | "the chip, with image F in the boot path, produces UART output O" | + X4 in full: the serial-link far end, pad-ring IO cells, POR, supervisor (04) | about a thing you can hold |
B3 is the honest end statement and the reason this project is about a computer rather than a core. The plan is B1 → B2 → B3 as successive theorems, each conditional on exactly its batch of X4 models — not one monolithic claim.
X4 as a dial, not a monolith
Each B-level's theorem is conditional on precisely its batch: B1 none; B2 the on-die models (the three SRAM macro kinds — whose own verification is parametric, one proof per kind — and the boot ROM's contents as data); B3 the off-die world (the serial TileLink agent's contract, pad-ring IO cells, the power-on-reset arrangement, the board supervisor). This batching is what keeps X4 honest in Axioms: "the devices meet their datasheets" is never assumed wholesale, only per claim.
What each step buys and costs
B1 is where L3 lands naturally — it is the refinement theorem re-stated at the tile's ports, and needs nothing from this layer except the contract. B2 is the first statement about the hardened netlist: it discharges the bus contract's assume-half against the actual fabric (the contract stops being an assumption), opens the SRAM holes, and pulls in the memory map with its small control devices — boot-address register, tile-reset setter, clock gater, error device. B3 adds the world: pads, the serial link's far end, power epochs, the supervisor — and is the only level at which obs (physical pad traces) rather than an internal interface is the observation.
The mid-level irony worth recording: B2 is about the artifact that gets verified, B3 about the artifact that comes back from the fab. The gap between them is exactly X4's off-die batch plus the pad ring — the part of the world no proof reaches, only datasheets and bench tests.
Obligations
- Fix the B-level for each publishable claim; never let a theorem's statement straddle levels implicitly.
- The B1→B2 discharge plan for the bus contract (02).
- The B3 instance experiment: one hello-world
F, the claim stated fully formally (00's derivation stack exercised end to end), even unproven — it will surface every missing definition in the layer.
Effort
The decision: immediate. The B3 instance statement: days, and the highest-value definitional smoke test available.
L5/02 — The bus contract
Background
A bus is the shared pathway over which a CPU reaches everything that is not itself: memories, peripherals, the outside world. "Reaching" something over a bus is a small protocol, not a single act. In this design the protocol is TileLink, the interconnect standard of the Rocket ecosystem: an agent issues a request on its A channel — opcode, address, size, a source ID tag — while a valid/ready handshake governs when the beat transfers; the fabric routes the request to the addressed device, and the response comes back on the D channel, tagged with the same source ID. Cycles spent waiting are called wait states. This channel pair is the entire vocabulary of the interface: everything the core ever learns about the outside world arrives as a D-channel beat with data attached.
The number of wait states varies wildly, and that variance is the crux of this chapter. The tightly-integrated data memory answers in a cycle or two. An instruction-cache refill from the boot ROM crosses the fabric — a handful of cycles. But an access to an address mapped behind the serial TileLink port leaves the chip: the transaction is serialised into 32-bit phits, clocked across the pads at the link's own (slower) clock, served by whatever agent sits on the far end, and returned the same way — easily dozens or hundreds of core cycles, with the exact count depending on the link clock ratio and the far agent. Academic verification work almost universally assumes memory answers instantly; that assumption is false of every real system, and a proof built on it says nothing about the fabricated chip.
The technique for handling an interface like this without verifying both sides at once is assume-guarantee reasoning, and it is used at every interface in this book, so it is worth stating carefully here at its first major appearance. Split the interface's obligations by direction: what the fabric promises the core (the assume half — requests get answered, answers are stable, fetches return the program's actual bytes), and what the core promises the fabric (the guarantee half — requests are well-formed, legal TileLink, source IDs managed, never exceeding the negotiated concurrency). The core's correctness proof (L3) assumes the first half and proves the second; the SoC-level proof (B2 in 01) then proves the first half about the actual fabric, at which point the assumption is discharged and the two proofs compose into an unconditional statement. Each side's proof is finite and local; neither ever has to look inside the other. The one danger in this style — a circularity where each side's promise is justified only by the other's — is avoided here because the split is by polarity: no clause is simultaneously assumed and guaranteed by the same party.
One promise in the assume half is quietly the most important: not that requests are answered, but that they are answered within a bound B. Without a bound, "the processor executes the program" degenerates into "the processor executes the program if the memory ever answers" — a statement with no liveness content at all. Producing that single number (really, a function of the configuration and, for off-chip addresses, the far agent's contract) requires knowing the worst case of everything between the core and the addressed device, and is where this chapter earns its place in the tower.
Statement
Author the contract at the tile's memory port — the formerly orphaned artifact L3 consumes. It is the interface half of Sys: what the fabric promises the core. Authored here, assumed by L3's refinement, discharged against the SoC RTL as part of B2.
Scope note. The tile's ports speak TileLink (L3/06 has the guarantee halves); the clauses below are written in a generic request/response idiom and must be instantiated over the TileLink channel signals — the contract's shape (assume/guarantee split, the latency bound
B, the off-chip worst case) is protocol-independent.
The contract
Over the A/D channel pair at the tile boundary:
Assume half (the fabric's promises, this file's content):
A1 every request is answered: an accepted A-beat gets its D-beat within B cycles
A2 D-channel data is valid and stable when the beat fires
A3 no spurious responses (every D-beat answers an outstanding A-beat,
matching source ID; no duplication, no invention)
A4 fetches from the boot region return F's contents; accesses to
serial-TileLink-mapped addresses behave per the far agent's contract
A5 reads/writes to memory-mapped devices behave per the memory map [03]
Guarantee half — the core's request discipline (legal TileLink: aligned addresses, permitted opcodes and sizes, source-ID management within the negotiated bounds) — is morally part of the core's external spec and is proved in L3/06; the contract is the assume-guarantee pair, split by polarity across the two layers.
The latency bound B is load-bearing
Without A1's bound, L3's measure does not exist and "instructions commit" silently weakens to "commit if the bus answers" — the refinement's liveness content hangs on this one number. B's worst case is the off-chip path: an access mapped behind the serial TileLink port becomes a phit-serialised transaction — dozens to hundreds of core cycles, set by the link clock ratio and the far agent's response time. So B is not a constant but a function of the configuration — clock gating state, link clocking, and for off-chip addresses the X4 contract of the far end — one more register-dependent hypothesis, resolved the same way as the other configuration knobs (05): either quantify over reachable configurations or declare the excess out of spec.
Most academic work assumes a magic single-cycle memory — a load-bearing cheat this file exists to avoid. The contract's entire point is that the fabric's real behaviour (wait states, arbitration among the tile, the debug module, and the inbound serial-link master; the DTIM's near-single-cycle path vs. the serial link's dozens) fits behind five clauses and one bound.
Discharge at B2
Against the SoC RTL: the fabric between tile, memories, and peripherals is ordinary synchronous logic, so A1–A5 become invariant-style lemmas about it — with A4's off-chip side remaining conditional on the far agent's model (X4's B3 batch) while the bridge's serialisation behaviour is B2-provable RTL. The split point (bridge proved, far agent assumed) should be marked in the clause itself.
Obligations
- The five clauses stated over the channel alphabet, with
B(config)explicit. - Check against the tile's TileLink transactions in simulation (days — the L5-unblocking experiment).
- The B2 discharge lemmas; the A4 split point marked.
- Arbitration: whether an inbound serial-TileLink master or the debug module can starve the tile (an
A1threat — if the fabric's arbitration admits starvation,Bis conditional on those agents' quiescence, which must then be a recorded spec condition).
Effort
Days to author; the discharge is B2 work. The arbitration check (4) is the one place a surprise could hide.
L5/03 — The memory map
Node: this file is the object — the memory map, IRQ/pad tables, and the RTL-vs-metadata diff that pins them. The device models that compose with the ISA into Sys are the edge, 06.
Background
A CPU core has no instructions for "print a character" or "read a pin." It has loads and stores, and nothing else — so systems are built on a convention called memory-mapped I/O: regions of the address space are wired not to memory but to devices, and a store to such an address flips wires in a peripheral rather than writing a byte to RAM. A store to the UART's data register starts a byte transmitting; a load from the CLINT's mtime registers reads the running timer; a store to the tile-reset setter holds the processor in reset. The memory map is the table saying which address ranges mean what — and since the CPU's view of the entire world is filtered through it, a verification effort that gets the memory map wrong is proving theorems about a different machine.
The devices behind those addresses each need a formal model — a small transition system saying how register writes translate into behaviour. For the UART that means the divisor register (the programmable number that sets the baud rate by dividing the bus clock) and the framing sequence: on a write to the transmit register, the TX wire emits start bit, eight data bits, stop bit, each lasting divisor clock cycles. Interrupts are the other direction of device communication: rather than the CPU polling devices in a loop, a device raises a dedicated wire when it wants attention, and the CPU suspends the program to run a handler. In this design the wiring is the RISC-V standard shape: the CLINT drives the core's software and timer interrupt lines, and the PLIC funnels device interrupts (here just the UART) into the external-interrupt line, with a claim/complete protocol replacing ad-hoc pending registers.
There is also a fact about where this information lives that deserves a newcomer's attention: the map is generated. The SoC is elaborated from parameterised Chisel generators, and the address assignments come out of the elaboration (the framework's diplomacy layer negotiates them); the same run emits the decode logic in the RTL, a device tree describing every device and its range, and per-device register-map JSON files. Agreement among these artifacts is claimed by construction — they are renderings of one elaboration — and that is precisely the kind of claim this book checks rather than assumes: the diff of the RTL's actual decode against the emitted metadata is this chapter's first deliverable, and any drift is an elaboration bug worth a finding.
Statement
The remaining components of Sys: what each address means, what each device does, and which pad carries what — consolidated from the generated sources into one formal object, diffed against the RTL rather than trusted.
Where the information lives today
| content | authoritative source | rendered in |
|---|---|---|
| memory map | the elaboration (diplomacy) — realised as decode logic in the generated SystemVerilog | the generated device tree (.dts); per-device regmap.json files |
| IRQ map | the elaboration — CLINT→(msip, mtip), PLIC→meip, PLIC source 1 = UART | interrupts-extended / interrupt-parent annotations in the device tree |
| pad list | ChipTop's port list — 18 signals: UART pair, custom_boot, JTAG ×5, reset, clock in, clock tap, serial TileLink (32-bit phits + link clock) | the generated top-level module |
| pad electrical behaviour | sky130_fd_io (PDK) — black-box IO macros | PDK io documentation |
| boot devices | boot ROM (with its baked-in contents), boot-address register, custom_boot pin semantics | generated RTL + ROM image |
| serial TileLink | the bridge RTL (phit serialisation); the far agent is outside the chip (X4 proper) | testchipip documentation |
| UART, CLINT, PLIC | generated RTL | device tree + regmap.json |
| electrical envelope | — | PDK operating conditions — P6/Envelope material as prose |
The concrete map, from the generated device tree of this configuration:
| base | size | device |
|---|---|---|
0x0000_0000 | 4 KiB | debug module (JTAG-reached) |
0x0000_1000 | 4 KiB | boot-address register |
0x0000_3000 | 4 KiB | error device |
0x0001_0000 | 64 KiB | boot ROM |
0x0010_0000 | 4 KiB | clock gater |
0x0011_0000 | 4 KiB | tile-reset setter |
0x0200_0000 | 64 KiB | CLINT |
0x0C00_0000 | 64 MiB | PLIC |
0x1002_0000 | 4 KiB | UART |
0x8000_0000 | 16 KiB | data memory (DTIM) |
The hole semantics matter to 02's contract and are better-behaved than most systems: the fabric routes accesses to unmapped space to the error device, which answers with a TileLink denied response, and a denied response to a load raises an access fault in the core — so a stray pointer produces a precise architectural exception, not a hang or a silent 0xFFFF_FFFF. The address-decode model must say so, and the error device is thereby a spec component, not scenery.
The device models that turn these addresses into behaviour — UART, IRQ/CLINT/PLIC, boot, serial TileLink — and their composition with the ISA into Sys are the edge that this map carries, 06.
Obligations
- The RTL-vs-metadata diff for map, IRQ wiring, and the port list — re-anchoring the layer's checker to the generated artifacts; agreement is expected, and drift is a finding about the generator.
- Track the elaboration-emitted map against the hardened netlist's decode — the elaboration is authoritative for intent, the netlist for the artifact; synthesis must not have changed the table.
Effort
Weeks, mechanical; the map is the extracted table plus the two diffs that pin it. The device models that compose it into Sys are the edge, 06.
L5/04 — Power epochs
Background
Nothing in an ISA manual says what happens when you turn the computer off, because from the software's point of view nothing can happen — there is no software anymore. But a theorem about a physical chip has no such luxury: power arrives, wanders, sags, and vanishes on the environment's schedule, and the spec must be true through all of it. This chapter is about the machinery — physical and logical — that makes that possible, and it uses a vocabulary of small analog circuits that deserve introduction.
Start with what actually happens at power-on. The supply voltage does not appear; it ramps, over milliseconds, through every value between 0 and 1.8 V. During the ramp the chip's logic is in no valid state — flip-flops wake up holding arbitrary values, and below operating voltage the gates cannot even be trusted to compute. The standard remedy is a power-on reset (POR) circuit: a small analog block that holds the chip's reset line asserted from the moment any power exists until the supply has been stable for a while, then releases it once, cleanly. On release, every register with a reset connection loads its defined initial value, the program counter points at the boot address, and execution begins. One continuous run — from that release until power goes away — is what this book calls an epoch; the chip's lifetime is a concatenation of epochs separated by dark gaps, and the top-level theorem, which covers one epoch, must be composed across them.
The genuinely nasty case is not power loss but power sag — a brown-out. Flip-flops retain their state down to a voltage well below the minimum at which logic operates correctly. Between those two thresholds lies a gray band: a supply excursion that dips into it and recovers leaves the machine with silently corrupted state, still running, having triggered nothing — neither a clean death nor a valid continuation. The standard industrial defence is a brown-out reset (BOR) or supervisor: a cheap, self-contained part (on-board or on-die) that watches the supply rail with an analog comparator and asserts reset the moment the rail leaves the valid range, holding it until the rail has recovered and settled. Whether such a part actually closes the gray band — including the awkward regress that the watcher is powered by the rail it watches — is the substantive question this chapter answers.
Two more pieces of bench vocabulary. The decoupling capacitors ("decaps") scattered across the die in their tens of thousands are small charge reservoirs that smooth the supply against fast demand spikes; here they acquire a third formal job, as the energy store that guarantees the supervisor wins its race against a collapsing rail. And a hold-up capacitor is the same idea writ large at board level: a bulk capacitor storing enough energy that, when the input power fails, the chip has a known number of milliseconds of clean supply left — enough, if a warning signal fires, to finish the byte in flight and park somewhere quiet instead of dying mid-symbol.
Statement
The top-level statement covers one powered epoch: POR-released reset through T in-envelope cycles. The lifetime claim is a concatenation — obs = boot·trace₁ · gap · boot·trace₂ · … — and this file owns its composition: the per-boundary requirements, how power meets the ISA, and the brown-out resolution.
Per epoch boundary
- V8 (L0/04): supply ramps follow the sequencing/rate constraints — the transitions between U and powered are trajectory conditions the steady-state envelope does not cover (multi-rail bring-up can forward-bias junctions and reach latch-up's branch while the wells are not yet protected).
- The POR contract (X4-class): this design carries no analog POR block of its own — the arrangement lives in the pad-frame harness or on the board — so the contract is assumed, in its standard shape: reset asserted from power-good to supply-stable, released synchronously with a running clock, once.
- Per-epoch X-elimination, refined by the spec: reset drives definite only what
Sys(F)claims definite (pc, FSM, reset-defined state); elsewhere implementation-X is matched by the ISA's reset nondeterminism (L3/03's three-way split). The proof quantifies from all-X ⊇ arbitrary garbage, so brown-out recovery and SEU-recovery reset share this one obligation. - The boot-window promise: the pads have fixed functions and reset-defined drive states, so
obsduring boot is spec'd by hardware defaults, not demonic — the obligation is to extract and check those defaults from the RTL (UART TX idle-high, the serial link's valid lines deasserted, JTAG TDO passive). - How F persists. This chip has no writable persistent store: the boot ROM's contents are fixed at mask time (immutable by construction — the strongest possible answer to the F-evolution question), the data memory is volatile, and anything beyond the pads is X4's business. So the epoch-composition theorem carries one of two hypotheses:
Fis ROM-resident (immutability free), orFis loaded each epoch over the debug module or serial link — in which case "the same F arrives every epoch" is an explicit assumption on the environment, exactly the kind of clause that belongs in the composition rather than in anyone's intuition. Crash consistency, the deep problem writable persistence forces, simply does not arise on-die. - ε sums over powered time; aging (electromigration, NBTI, thermal cycling) scopes P4/P5 to the die's rated lifetime — the honest horizon of the whole theorem.
One power domain. The design has a single core rail — no mid-epoch domain switching, no power islands — which deletes the partial-cycling containment obligations that multi-domain chips carry. (The gap between core rail and IO rail still exists, and returns below as the partial-rail fault.)
How this meets the ISA — which is rightly silent
The ISA's two hooks suffice: its reset section is the power-on hook, and prefix-closed small-step refinement is the power-off hook — a machine that stops violates nothing. Three consequences with teeth:
- The epoch's end is
prefix · demonic-ramp-down-tail · U(a dying UART TX can glitch a start bit), so prefix closure must hold at the physical alphabet with byte views derived — the constraint that forced 00's alphabet choice. - All liveness is bounded progress ("if powered through cycle N, O by N") — power persistence becomes a per-claim P6 assumption, delivered free by the explicit
Tevery statement already carries. - Crash consistency is out of scope on-die (no writable persistence); whatever sits across the serial link owns its own persistency model (X4).
The brown-out gray band, and its resolution
Sudden full loss is the easy case. The epoch model is unsound against a slow sag below operating minimum but above state retention, recovering without reset — corrupted state, continued execution, neither epoch end nor valid continuation. An RC-ramp POR does not cover the band. The discharge is a supervisor (on-board, X4-class, jellybean part): (A) reset-clamp BOR — assert throughout the excursion, release on hysteresis + timeout — or (B) forced full discharge — load switch + bleed drains the die below retention on any sag, deleting the gray band from the reachable states rather than guarding it.
Rail faults do not go into ε — by category. ε's terms share one shape: continuation despite corruption (SEU, unresolved reads, evading droop) — the machine keeps running with traces that look valid but aren't. A rail fault is terminal, and termination is already free: prefix closure + the specified backstop tail make a fault death ⊑ Sys(F) with probability 1; adding a λ_fault·T term would pay probability for behaviour the spec can admit. (The claim is conditional correctness — while it runs, and however it stops, the trace is in-spec — not availability; component MTBF is a different document.) Three corner checks: the fast-collapse garbage burst (a short crossing the gray band faster than t_detect) is energy-bounded, hence deterministic — the tail admits "≤ t_burst of sub-symbol activity," filtered by the byte-view derivation, rate-independent; recovering transients that evade the BOR are exactly P_droop, which the supervisor shrinks rather than adds to; and the one real gap is the partial-rail fault (core dead, IO alive — level shifters float, output stages still driving): neither terminal nor bounded, engineered away by the fail-safe-IO property in its literal datasheet sense (pads hold safe state with the core unpowered) — an X4-class per-cell property of the sky130_fd_io macros — else it alone would genuinely need a component-FIT ε term.
The apparent regress (the detector is powered by the failing supply) terminates by range stacking + fail-safe polarity: the analog detector's validity range strictly contains the logic's gray band, and below the detector's own floor, deasserting reset requires drive headroom that no longer exists — a passive pull holds reset asserted. The requirement is "output monotone-safe in Vdd," one-sided, an easier computer-assisted-proof target than the oscillator (DC maps + latency bound; M8's interval machinery). Two checkable inequalities close it: traversal — t_detect + t_reset_prop < C·(V_thresh − V_fail)/I_max with C the decap total (the decaps' third formal job) — and hold — reset held past state-death or POR stabilisation. Residue: async-reset assertion effective at degraded voltage (one-sided DC-drive argument, not a timing race).
Hold-up energy makes the common death graceful. One rung above the tamed tail: a bulk capacitor plus an upstream power-fail warning (watching the input, before the storage — the BOR stays on the die rail as backstop) buys a bounded epilogue on stored energy: finish the symbol in flight, refuse new work, park at a quiescent state, then decay. The governing inequality t_holdup(C, I, ΔV) ≥ t_epilogue^max has its right-hand side derived from L3's exported WCET table (L3/08's quantitative reading of the measure): worst-case cycles over the epilogue path with IRQs masked, times a clock-period upper bound valid over the decaying-rail trajectory — the clock source slows as the supply sags, so the seconds-per-cycle factor is taken at the worst voltage the epilogue traverses (V8's temporal sibling). The refinement's own progress bound thus prices the capacitor (µF-scale at this design's draw; a UART byte at 9600 baud ≈ 1 ms ≈ tens of µF), and "we can finish the job in time" is a theorem, not a characterisation. Epilogue routes: warn→IRQ→firmware (drags firmware into the claim) or a hardware quiesce — gate issue at the next commit and drain — bounded by construction; a minor design modification of the kind the project's framing permits. The epoch end then refines once more, warn · epilogue · quiescent-end · decay: a spec event, not a truncation — B3 strengthens to "the last accepted byte is always fully emitted." Structurally this is the boundary ladder's move in the power domain: stored energy converts an asynchronous environmental event into a bounded-latency protocol event, price paid in board space instead of ε. Honest limit: gracefulness is conditional on the failure mode — upstream loss (the common case) goes graceful; a rail fault discharges the hold-up instantly, so the spec keeps a two-tier ending with the truncate-idle-decay tail as the rail-fault backstop.
Good BOR also tames the demonic ramp-down tail. The tail's demonic-ness came from one scenario — the core executing garbage in the gray band while driving pads — and the BOR threshold sitting above that band deletes it: normal operation ends at BOR assertion (in the valid band, pads driven to reset defaults correctly), and below the valid band the chip is already in reset with fail-safe polarity holding. The tail refines to (≤1 truncated symbol) · idle^k · monotone decay — specified, not demonic — under two pad-side conditions: (i) reset defaults are non-hazardous — to be checked in the RTL, with the expected answer that no output pad actively drives a hazardous level at reset (UART TX idles high, so the worst case is one framing error, never a spurious start bit); (ii) the IO cells are fail-safe under collapse — a constant-input driver must not glitch as rails die, with the core-before-IO level-shifter float as the known hazard — an X4-class per-cell property, plus V8 extended to the down-ramp rail ordering. Under architecture (B) even the decay profile is board-controlled (the bleed sets dV/dt). Irreducible residue: truncation timing (environmental), the analog decay (specifiable, not digital), and the fail-safe-IO property itself. The B3 payoff: "under power loss at any point, at most one framing error and never a spurious character" becomes provable rather than caveated.
Obligations
- The epoch-composition theorem over 00's alphabet: per-epoch refinement + the boundary requirements ⟹ the lifetime claim.
- The F-persistence hypothesis: state the ROM-resident and reloaded-per-epoch variants, and for the latter the environment clause that carries it.
- The supervisor's two inequalities, computed from datasheet + decap numbers; the monotone-safe property as a CAP target.
- The pad reset-default check against the RTL (the boot-window promise's evidence).
Effort
The composition theorem: weeks once 00 exists. The checks: days each. The supervisor CAP proof: optional depth, L0-machinery.
L5/05 — The operating-conditions clause
Background
Every datasheet has a table called recommended operating conditions: supply voltage between here and here, temperature between here and here, clock no faster than this — and every other promise in the document is implicitly conditional on that table. This chapter builds the formal analogue of that table, and the reason it is needed is a fact about modern chips that surprises outsiders: software can reconfigure the hardware out from under its own correctness proof.
The mechanism is configuration registers: memory-mapped registers whose bits are wired to physical knobs. The sharpest instance on most chips is the clock — a software-programmable PLL whose settings can shrink the clock period below what the timing proof covered. This design does not have one: the core clock arrives at a pad from the board, unmultiplied, so the most dangerous knob of all is simply absent, and "the clock is in range" moves out of the register table entirely — it becomes a condition on the environment (the board's promise, P6's family), not on reachable software states. What remains software-reachable is tamer but real: a clock gater that can stop the clock, a tile-reset setter that can hold the processor in reset, the UART's divisor register on which the byte view's validity depends, and the debug module, an external agent with the authority to halt the core at any time.
So hypotheses of lower-layer theorems turn out to depend on register state, which makes them reachability conditions: either prove the hypothesis for every register value the software can actually reach, or draw a line — inside the line, the spec's promises; outside it, explicitly no promises. The second option is what this chapter constructs, and it must also say precisely what "no promises" means. The answer deliberately falls short of the C programmer's "undefined behaviour" (where the spec permits literally anything): here, out-of-condition operation floods the machine's state with unknowns, but the electrical safety envelope still holds — a misconfiguration computes garbage or stalls, it does not damage the die — and a reset restores the machine to the specified regime. Garbage, bounded, recoverable: weak enough to be true, and deliberately too weak for anything safety-critical to lean on.
Statement
Sys(F) must take a stance on every software-reachable knob that can invalidate a lower layer's hypotheses — the theorem-shaped version of a datasheet's "recommended operating conditions" table. An S4-class authored choice; deciding it early keeps the overview's metatheorem free of design-specific side conditions on F.
The pattern, and its known instances
Register-dependent hypotheses of lower-layer theorems become reachability conditions. Per knob, exactly two discharge routes: prove the hypothesis over every reachable setting, or declare the excess unspecified in the spec.
| knob | hypothesis threatened | status |
|---|---|---|
| clock gater | every liveness bound — a gated clock stalls all progress | to classify: quantify (progress claims conditional on ungated) or declare |
| tile-reset setter | same shape: a held reset is a liveness hole | same resolution family |
| UART divisor | the byte view's bit-cell timing (00's derivation) | validity condition on the derivation, per configured baud |
| debug-module halt authority | the latency bound B and every WCET-flavoured claim | the debug spec's halt semantics as a spec actor; claims conditional on "not halted" |
Notably absent from the table, by design rather than by luck: a clock multiplier (none exists — the board owns clock safety), pad function muxing (pad functions are fixed), and persistent-store write paths (there is no writable persistent store — 04). The table is expected to grow one row per discovered knob; the file exists so the later instances are filing operations, not rediscoveries.
What "unspecified" means — precisely, and deliberately weakly
Not C-style undefined behaviour. Per L1/03's value lattice: the state floods with X — envelope-bounded demonic nondeterminism. The damage tier (L0/04's V-conditions) is still excluded — an out-of-spec configuration computes garbage, it does not burn the die — and recovery is provable: restore the configuration, reset, and X-elimination re-enters the tracked fragment. So the clause's semantics is: outside recommended operating conditions, Sys(F) constrains obs only to the electrically safe trace set, until the next reset re-anchors.
This weakness is a feature twice over: it is true of the physics (the envelope genuinely still holds), and it keeps the UB clause from ever being load-bearing for safety-critical reasoning — nothing above may assume out-of-spec behaviour is absent, only that it is recoverable. The same layered-UB pattern appears one level down in L4/03's spec-UB clause for reserved instruction encodings: at every layer, "undefined" means undefined at this layer's alphabet, bounded by all the layers below — no knob and no instruction is a halt-and-catch-fire.
Obligations
- The clause itself, as a component of
Sys: the recommended-conditions predicate over configuration state, and the X-flood semantics outside it. - Per-row resolution: the gating/reset liveness conditioning, the divisor's validity condition, the debug-halt actor model.
- The audit discipline shared with L4/02: no lower-layer proof may consume a register-dependent hypothesis without a row here.
Effort
Days for the clause; the rows resolve at their owning layers. The value is the slot: every future knob lands in a named place.
L5/06 — The device models
Edge: this file is the theorem the node carries — the device models (UART, IRQ/CLINT/PLIC, boot, serial-TileLink) that compose with the ISA into Sys (ISA ⊕ devices ⟹ Sys), the composition edge. The memory-map object they attach to is the node, 03.
The models to write
Memory map: an address-decode function addr → (region, device, offset) — extracted from the RTL's decode logic and diffed three ways against the device tree and the register maps; then cast as the formal decode component, including the error-device routing on holes, exported to 02's A5 and to L3's load/store lemmas. The extracted table itself and its RTL-vs-metadata diff are the node's, 03; here it enters the composition.
The IRQ map: which physical event drives which line of L4/01's interrupt array — the system half of interrupts, deliberately not in the portable spec. The shape is standard RISC-V: CLINT compare drives mtip, CLINT software-interrupt register drives msip, and the PLIC drives meip, with the UART as PLIC source 1. Where an interrupt persists is the PLIC's gateway-and-pending machinery (level-triggered gateways, claim/complete, priority threshold) — L4/01's pending CSR is a live view — so the PLIC model is a required component of Sys, carrying the no-lost-interrupts half of L3/07's delivery obligation.
UART: the observable channel — divisor register semantics, bit-cell generation against the bus clock, transmit/receive FIFOs and watermark interrupts, the TX trace feeding 00's derivation stack; RX's synchroniser is L1/11's business, its byte semantics here.
Boot machinery: the ROM's contents as data, the boot-address register, and the custom_boot pin — together they determine the first fetch address and hence what "with image F" means in every end-to-end statement; the load paths (resident ROM, debug-module writes, serial-link writes) are each a spec-level way for F to arrive.
Serial TileLink bridge: phit serialisation and clock crossing on the chip side — the piece that turns 02's B(config) into a function of the link clock ratio; the far side is X4.
Obligations
- The five models above as components of
Sys's composition (00 obligation 3) — for the map, that is the extracted table plus the error-device semantics on holes, as a formal decode function. The extraction and diff of that table are the node's, 03.
Effort
Months, wide and mechanical; the models are small individually and the composition into Sys is the deliverable. The memory-map object and its diff live in the node, 03.
L4 — The ISA specification
Node — the ISA:
ISA = Sail-RV32(config, incl. machine mode) ⊕ authored residue ⊕ S4-choices(00–03) — the transition system L3's invariant refines into, and the core of L5'sSys(F). Edge up: none of its own — L3 carries the refinement up into this node, and L5 carries theISA ⊕ devices ⟹ Syscomposition out of it. A definition node — specification authoring, not proof; the place where being wrong is least detectable, because a wrong definition yields a true theorem about the wrong machine. Consumes: the RISC-V standard, the configuration record.
Background
An ISA — instruction set architecture — is the contract between hardware and software: the instructions, their encodings, and their exact effects on architectural state. This layer fixes that contract as a mathematical object, because L3's refinement theorem is only as meaningful as the spec it refines against. The object has three components with three different levels of trust: RISC-V's official formal model is imported — the base ISA and, because the shipped core implements the standard machine-mode trap machinery, the ratified machine-mode subset of the privileged architecture with it (00); the small pieces of behaviour that live outside the ratified model — the generated core's custom extension and the platform interrupt controllers' register conventions, chiefly — must be authored or imported from de-facto documents (01); and where the standard is deliberately loose, the choices this implementation embodies are recorded rather than silently assumed (02). A totality sweep (03) then makes the spec answer for all 2³² instruction words, not just the meaningful ones.
Statement
What L3's theorem is stated against: Sail-RV32(config) ⊕ authored residue ⊕ S4-choices ⊕ spec-UB clause — the last assigning the reserved encoding space unspecified behaviour (03) — its authored components carrying the three fidelity axioms — S2 (the official model's small residue, now covering the machine-mode subset as well as the base), S3 (the authored residue: the custom extension and anything else outside the ratified model), S4 (the recorded choices). It is not the top of the tower — the pad-level system spec is L5's — and the boundary test is portability: the same core in a different SoC keeps this layer's spec while L5's is replaced wholesale.
Subcomponents
| status | ||
|---|---|---|
| 00 | How RISC-V is structured (volumes, base + extension letters, formats, encoding space) and how Sail specifies it — with addi/beq worked; the machine-mode subset; S2 and the import path | weeks |
| 01 | S3 — the authored residue: the custom extension, the performance-counter event space, the debug exclusion; the anchor methodology against circularity | weeks; the thinking |
| 02 | S4 — the choice register: pick, record, flow down; mid-proof stalls become filing operations | days to seed; discipline thereafter |
| 03 | The encoding sweep: implemented ↔ Sail clauses, everything else ⟹ traps-correctly — across both the 32-bit space and the compressed 16-bit space | months of mechanised typing |
Interfaces
Consumes: the standard, sail-riscv, the configuration record (which derives the subset boundary), the RTL + generator sources + test software as S3's anchors. Exports: ISA to L3 (refinement target) and L5 (core of Sys); the partition of the encoding space to L3/10; the choice register to L3's lemmas.
Axioms introduced
S2 (Sail faithful — small: the model is the standard's official golden model; residue is fidelity to the ratified manuals plus the pinned translation path — now covering the machine-mode subset too), S3 (the authored residue is what was intended — unfalsifiable, anchored), S4 (the recorded choices are acceptable — legislative by nature). X4 lives in L5.
The layer's shape
Entropy sorted by kind: 00 receives the bulk for free (official golden model, structured encoding space — and, for this core, the trap machinery too), 03 turns the remaining width into independent SAT-shaped typing, and the thinking is deliberately concentrated into two small artifacts — 01's authored residue and 02's choices — because those are the two places an error is invisible downstream. The honest end statement this layer serves: not "the core is correct" but the device refines this specification, modulo these axioms — with unbounded proof capacity the axiom list is the achievement, which is why axioms.md precedes any proof.
The ISA is rightly silent about power: its reset section is the power-on hook (X ⊑ reset nondeterminism), prefix-closed small-step refinement is the power-off hook; everything else power-shaped is L5's epoch model. Resist adding power events here — the layering is doing its job.
Open problems
- Author the residue (01) — gates L3/07; the highest-risk specification work left in the layer.
- Seed and enforce the S4 register (02) before L3's proofs start.
- The Sail→prover translation's trust status, pinned and stated (00) — now including the privileged-subset clauses.
First experiments
- Import
sail-riscvat a pinned commit, carve the configuration's subset, and run the architectural compliance suite against the imported model (00) — the only handle on S2. - Draft the custom-extension residue from the generator source first, then diff against the emitted RTL's behaviour; log every discrepancy (01).
- Generate the encoding partition from the configuration record (03).
Effort
6–9 months. Small in proof content, disproportionate in consequence: an error here is invisible to every layer below and produces a true theorem about the wrong machine.
Reading
sail-riscv and the Sail language papers. The RISC-V unprivileged spec (Volume I) and the machine-mode chapters of the privileged spec (Volume II) — both short and readable, and 00's tour is a map into them. ARM's CHERI/Morello work — the best existing example of an ISA-level property proved against a shipping architecture spec.
L4/00 — RISC-V's structure, and its Sail formalisation
Background
An ISA — instruction set architecture — is the contract between hardware and software: the complete list of instructions a processor executes, what state they act on (registers, the program counter, memory), and exactly what each one does to that state. It is the one interface in computing with different vendors on each side — compilers target it, processors implement it, and neither party ever sees the other's internals. RISC-V, the ISA of this project, is distinctive in being an open standard: its specification documents are public, governed by a nonprofit, and implementable by anyone without a license — which is why open-source cores like Rocket can exist at all.
For most of computing history, ISAs were specified in English. An instruction's behaviour would be given as a page of prose plus a register-transfer sketch, and the thousands of edge-case questions (what does a shift by 32 do? what happens to the upper bits? in what order do a trap and a pending interrupt resolve?) were settled by tribal knowledge, reference implementations, and vendor errata. A refinement proof cannot consume prose. It needs the ISA as a mathematical object — a transition system: a set of states and a step relation, in which "execute one instruction" is a defined function of the current state. Producing that object by hand from the manual would itself be a large, error-prone authoring job, and any mistakes would be specification errors — the kind no downstream proof can catch, since the proof would faithfully verify the processor against the wrong contract.
This is what Sail exists to fix. Sail is a programming language purpose-built for writing ISA specifications: a spec written in it is precise (every bitfield, every corner case forced to a decision), executable (you can run programs against the spec and compare with real hardware), and mechanically translatable into the input languages of proof assistants. The RISC-V organisation took the further step that matters most here: it adopted a Sail model, sail-riscv, as the standard's official formal specification — the "golden model" against which conformance is judged, with new extensions required to extend it for ratification. (The ratified prose manuals remain the normative documents; the model is the standard's own executable reading of them.) This chapter's job is to import that model, pin down what "import" means (which translation, which version, what is trusted about it), and carve out exactly the fragment this small core implements.
One structural fact to hold on to before the details: a RISC-V instruction is a 32-bit word, and the specification of the ISA has two separable halves — the encoding (which bit patterns denote which instructions, with operand fields at fixed positions) and the semantics (what each instruction does). Keeping the halves separate is what makes it possible to say, later, that the compressed extension adds new encodings but no new semantics, and that the decoder and the executor generate independent proof obligations.
Statement
Import Sail-RV32(config) — the base ISA and the machine-mode subset of the privileged architecture — as the received core of ISA. First, fix what the object being imported is, since the standard's structure is what makes the import modular and the subsetting principled.
How RISC-V is structured
Two volumes. The unprivileged spec (Volume I): the instructions a program sees. The privileged spec (Volume II): machine/supervisor modes, CSRs, traps, virtual memory. This core implements Volume I's base and extensions plus Volume II's machine-and-user-mode fragment — the trap/interrupt CSRs, PMP, and their semantics, declared by the elaboration and to be confirmed by the configuration record — and nothing above it: no supervisor mode, no virtual memory. So the import cuts inside Volume II, at the machine-mode boundary, and the subset must be carved by CSR rather than by volume.
Base + extension letters. A base ISA (RV32I: ~40 instructions — integer ops, loads/stores, branches, jumps) plus optional extensions, each a letter with its own ratification: M (multiply/divide), C (compressed 16-bit re-encodings), Zicsr/Zicntr (CSR access / counters), and many more (A, F, D, V…). The letters are the configuration vocabulary, and this core's string — declared by the elaboration itself — is rv32imac_zicsr_zifencei_zihpm_xrocket: the base plus multiply/divide, atomics, and the compressed re-encodings, plus CSR access, fence.i, and the performance counters — with the trailing x marking the custom fragment that 01 owns. Every absent letter (F, D, V, S-mode…) is spec the import does not carry and the coverage sweep must instead prove traps.
The encoding space. 32-bit words with [1:0] = 11 (the other three values are the compressed quadrants); major opcode in [6:2]; then six formats fixing where operands live:
R: funct7 | rs2 | rs1 | funct3 | rd | opcode register-register
I: imm[11:0] | rs1 | funct3 | rd | opcode register-immediate, loads
S/B: imm split around rs2|rs1, funct3, imm|opcode stores / branches
U/J: imm[31:12] | rd | opcode lui, auipc / jal
The immediates in S/B/J are bit-scrambled — deliberately, so that register fields sit at fixed positions and the sign bit is always bit 31: the standard is shaped for cheap decoders, and the scrambling is spec content the decode lemmas must get right. The space reserves custom-0/custom-1 major opcodes for vendor instructions; the shipped core uses none of them — its custom behaviour lives entirely in CSR address space (the two external-interrupt array registers, 01), which is the tamer kind of custom: no new encodings, no new step relation, just two more registers with authored semantics.
How Sail specifies it — a worked example
sail-riscv organises each instruction as three clauses: an AST constructor, a bidirectional encode/decode mapping, and an execute function clause. For addi (I-format, major opcode OP-IMM, funct3 000), lightly abridged:
union clause ast = ITYPE : (bits(12), regidx, regidx, iop)
mapping clause encdec =
ITYPE(imm, rs1, rd, RISCV_ADDI) <-> imm @ rs1 @ 0b000 @ rd @ 0b0010011
function clause execute (ITYPE(imm, rs1, rd, RISCV_ADDI)) = {
let result : xlenbits = X(rs1) + sign_extend(imm);
X(rd) = result;
RETIRE_SUCCESS
}
Three properties of this shape matter to the project. The encdec mapping is bidirectional, so decode totality/injectivity are properties of the clause set — exactly what L3/10's decode bijection is checked against. execute is a state transformer over X (the register file, with X(0) hard-wired zero) and PC — the transition system L3's α lands in. And RETIRE_SUCCESS vs. trap outcomes is the retirement event RVFI observes — the three-way agreement (Sail retirement, RVFI, α's commit points) is one object seen three ways.
A branch (beq, B-format) adds the two remaining ingredients: the scrambled immediate reassembled in encdec, and a conditional PC update in execute — together with addi it exercises every structural feature the other ~40 instructions repeat.
Why the base is real, and the import path
sail-riscv is the standard's official golden model — adopted by RISC-V International, with extensions required to extend it for ratification — which makes S2 smaller than it looks: its residue is the model's fidelity to the ratified manuals plus the translation path. Mitigation: run the official architectural compliance suite against the imported model (post-translation, in our prover), not against upstream. The Sail→prover translation (which backend, which version, deep vs. shallow, how Sail bitvector primitives map) is conventionally trusted; state it as S2's ledger line and pin it like the toolchain.
Subset by configuration, not by hand: the implemented/unimplemented boundary is derived from the configuration record and exported to 03 — a hand-maintained list would drift. The machine-mode carve is part of the same derivation: exactly the measured CSR set, with reads of absent CSRs (mscratch, misa, the counters) landing in the trap sweep.
Deliberately out of scope
The memory model (RVWMO — axiomatic↔operational equivalence plus a multicore RTL refinement, unattempted at any scale), virtual memory, floating point, supervisor mode, and PMP. The shipped core has none of them, and the import cuts at the machine-mode boundary — everything of Volume II above that line stays out.
Obligations
- The pinned import with the translation's guarantees written down.
- The compliance-suite harness against the imported model.
- The configuration-derived subset boundary.
- The
addi/beqworked pair as the first end-to-end spec objects — cheap, and they template the rest; a trap-entry/mretpair from the machine-mode subset alongside them, since the privileged clauses are new to the import.
Interface (up). The imported model is one half of the S-isa seam (iface_L4_L5, archBeh = isaBeh): the reference isaBeh the microarchitecture must equal at the pad boundary, bundled with the L5 memory map and devices. Its fidelity to the ratified standard is the specification-side axiom S2.
Effort
Weeks to import and pin; the compliance harness is the substantive piece.
L4/01 — The authored residue (S3)
Background
Almost everything the core does is covered by the ratified formal model: the base instructions, the M/A/C extensions, the machine-mode CSRs, trap entry and mret are all imported spec (00). But no real chip sits entirely inside a standard, and the parts that poke out must have their specification authored — written here, by this project, with no external document to defer to. Authoring a spec for hardware you can inspect carries a well-known trap: the natural move — read the RTL, write down what it does — produces a spec that agrees with the implementation by construction, and a refinement proof between them verifies nothing at all; bugs get transcribed into the spec and then formally certified. The field calls this "verifying the implementation against itself," and the defence is discipline about evidence: gather every description of intended behaviour that is independent of the RTL — generator sources, documentation, conventions, software written against them — formalise those first, and treat every point where the RTL disagrees as a finding to adjudicate deliberately, never a detail to silently copy.
For this core the residue is smaller than a custom design would carry, and its members are declared rather than hidden: the ISA string the elaboration emits — rv32imac_zicsr_zifencei_zihpm_xrocket — ends with a custom extension marker, and that x is precisely where the authored spec lives. Around it, the residue inventory:
- The
xrocketfragment. The generated core carries implementation-control state outside any ratified document — custom CSRs of the "chicken bit" family (feature-disable and implementation-control registers) and any custom instructions the generator emits. The first obligation is an enumeration: diff the RTL's CSR and instruction decode against the ratified set; every hit is residue to author, from the generator source first. - The performance-counter event space (Zihpm). The counters themselves are ratified; which event each selector value counts is implementation-defined by the standard — an authored table, extracted from the generator's event wiring.
- The debug module (RISC-V Debug specification, v0.13 family) can reach architectural state out of band. Its own register model is imported from the debug spec — a de-facto-standard document rather than the ISA manuals — and it is excluded from
ISAproper by the debug-inactive conditionality (L3/06) rather than specified here. - Interrupt sources are not residue — a genuine simplification worth recording. The software, timer, and external interrupt pending bits are all live and all standard; what drives them (CLINT compare, CLINT software-interrupt register, PLIC claim/complete) is device behaviour behind the memory map, specified as L5/03's models. The core-side interrupt spec is imported intact, and dispatch beyond
mcause's external-interrupt code is software's business via the PLIC. - The reset vector is a constant (the boot ROM's entry), matching the standard's platform-constant expectation — the software-visible "boot address" indirection is an ordinary device register (L5/03), not a parameterisation of the spec's reset section.
The ⊕-extension mechanism must still support override, not just extension: wherever measurement shows the implementation deviating from the imported model's ratified behaviour, the spec must either record the deviation explicitly as an override (making it S3-authored content with its own evidence trail) or treat it as a bug to fix upstream. No such deviations are currently pinned for this core — the ratified trap surface (access faults from denied bus responses included, misaligned loads and stores trapping, ebreak raising cause 3) is the expected answer — but "expected" is exactly what the diff exists to check, and the deviation log starts empty rather than assumed empty.
Statement
Author the residue: the spec fragments for exactly the behaviours outside the ratified model, composed with the Sail import as ⊕-extensions (with override capability). S3 is the axiom that this authored fragment is what was intended — unfalsifiable in the same sense as any specification-fidelity claim, and priced in the register.
State. The custom-CSR file of the xrocket fragment (enumerated, then specified register by register) and the Zihpm event-selector table.
Steps / invariants — the discipline the RTL diff must settle rather than assume:
- Custom CSR accesses obey the standard CSR access rules (privilege, read/write legality) with the authored per-register semantics.
- Implementation-control CSRs may change performance, never architecture: the authored spec must say explicitly that every reachable setting preserves the refinement (or name the settings that do not, which then become operating-conditions rows — L5/05).
- The event-selector table is total over the selector values software can write, with unmapped selectors counting nothing.
Authoring methodology: breaking the circularity
The spec and the implementation cannot share their evidence. The anchors, in order of independence:
- The generator source: the Chisel CSR file and decode are the design intent — formalise the custom fragment from them first, then diff the formalisation against the emitted SystemVerilog's behaviour (a generator bug would surface as exactly that diff).
- The ecosystem's software: the standard test suites and the framework's own bring-up code are written against the intended semantics; the spec must make observed, working behaviour correct.
- RVFI-style retirement checking (riscv-formal's discipline): prior art for what "an instruction retired correctly" observably means at a trace interface, applicable to the custom fragment as much as the base.
Discrepancies between anchors and RTL are results; choices the anchors leave open go to 02's register, not improvised here.
Obligations
- The enumeration: every CSR address and instruction encoding the decode accepts beyond the ratified set, from the RTL, mechanically.
- The generator-first draft of the custom fragment, the RTL diff, and the discrepancy log (each entry an S3-fidelity data point).
- The Zihpm event table, extracted and stated.
- The deviation log for the imported model — expected empty, checked not assumed.
Effort
Weeks, thinking-dominated — and less than a custom interrupt scheme would cost: the trap machinery, all three standard interrupts, and the debug register model are imported; what is left is an enumeration, a table, and however many custom control registers the enumeration finds. The fidelity risk is priced in axioms as S3 and cannot be engineered away, only anchored.
L4/02 — The choice register (S4)
Background
A standard written for many implementers cannot pin everything down, and does not want to. If the RISC-V spec dictated the reset value of every register, the handling of every misaligned access, and the priority of every simultaneous event, it would outlaw legitimate design choices and burden every implementation with someone else's decisions. So standards deliberately underspecify: "the contents of registers after reset are unspecified"; "a misaligned load may trap, or may be handled"; "pending interrupts are taken eventually." Each such sentence licenses a family of behaviours, and any member of the family is conformant. This is a feature — for implementers.
For a refinement proof it is a complication with a precise shape. Refinement (⊑) says every implementation behaviour is among the spec's allowed behaviours, so spec-side freedom is fine in principle — nondeterminism in the spec is exactly how "unspecified" is expressed formally. The problem is practical: a proof about this chip constantly needs to know which member of the family it is facing. When an L3 lemma about the trap handler needs to know whether a misaligned load traps, "the standard permits either" is not an answer the proof can use; the proof needs the answer for the generated core, and that answer is not derivable from the standard — only from the implementation and its configuration. It is a choice: a decision that narrows the standard's family down to the one behaviour this implementation exhibits.
Choices of this kind are epistemically different from theorems, and that difference is why they get their own register in the axiom ledger (S4). That the RTL agrees with a recorded choice is checkable — a lemma. That the choice itself is the right reading of the standard's freedom is not checkable by anything; it is legislative, like an editor resolving an ambiguity. The danger is not making choices — that is unavoidable — but making them invisibly: a proof that silently assumes registers reset to zero has narrowed the spec without anyone deciding to, and the narrowing is now load-bearing and unrecorded. Hence the discipline of this file: every choice is written down before it is used, with what the standard left open, what was picked, and which proof consumes it. (One instance of the pattern has a standard name worth knowing: WARL fields — "write any, read legal" — register bits where software may write anything and the hardware is free to read back any legal value, the standard's own idiom for per-field underspecification.)
Statement
Where RISC-V is deliberately underspecified, conformance is not a statement — the spec admits many behaviours, and a refinement proof needs one. This file is the register of choices: each entry picks a refinement of the standard, records that the pick is a choice, and becomes part of what ISA means. Deciding them before L3's proof starts is the discipline; discovering them mid-proof converts each into a stall.
The known entries
Rows marked elaborated carry values the generator itself declares (they appear in the emitted device tree); rows marked to record await the RTL extraction of the re-anchored configuration record.
| # | underspecified in the standard | the choice (= what this core does) |
|---|---|---|
| C1 | reset state of general registers | unspecified by the standard — and used: L3/03's X-matching refines into exactly this nondeterminism (the register file powers up unwritten) |
| C2 | misaligned loads/stores | expected: trap, cause 4 (load) / 6 (store), no side effect on the suppressed access — to record from the RTL, not assumed |
| C3 | illegal/unimplemented encodings | expected: trap with cause 2, mtval = the faulting word — feeds 03's sweep; to record |
| C4 | interrupt timing ("eventually") | taken at the next retirement boundary when enabled — L3/07's preemption obligation makes this precise; to record |
| C5 | mtvec writability and mode bits (WARL) | whether vectored mode is implemented, and every WARL readback — to record |
| C6 | trap-value details (mtval on each cause) | per-cause mtval sourcing — to record |
| C7 | LR/SC reservation granularity and forward-progress conditions (A extension) | the standard constrains but does not fix them; the core's reservation behaviour — to record |
| C8 | wfi latitude (may be a stall, may be a nop) | to record |
| C9 | PMP configuration | elaborated: 8 regions, granularity 4 bytes; per-field WARL readbacks to record |
| C10 | hardware trigger/breakpoint count | elaborated: 1 — consumed by the debug conditionality (L3/06) |
| C11 | the custom-CSR fields (01) | follows 01's enumeration |
The table is expected to grow; its shape is the point. Every entry has the same three fields: what the standard leaves open, what we fix, and where the fix is used. An entry whose third field is empty is a choice nobody needed — delete it rather than carry it.
One boundary to police as the rows get measured: this register only holds picks the standard's freedom licenses. If measurement ever shows behaviour the standard does not offer — a deviation rather than a choice — it lands in 01's deviation log instead, with its own evidence trail.
Two disciplines
Choices are S4-axioms, not theorems. "The choice is acceptable" is unfalsifiable in the same sense as S3's fidelity — the standard blesses the whole family, and picking is legislative. What is checkable: that the RTL agrees with the pick (an L3 lemma per entry, and for the measurable rows a configuration-record extension now), and that no lemma silently depends on an unrecorded pick (reviewable by grepping proofs for appeals to behaviour not derivable from Sail ⊕ S3 ⊕ this table).
Choices flow down, never up. A pick is made here and consumed by L3/L5; an L2 proof discovering it needs a behaviour fixed must stop and file the entry, not embed the assumption. The register is what makes "the spec" a single referent across three layers.
Relation to L5's clauses
L5's operating-conditions clause (out-of-envelope configuration → X-flood) and boundary decisions are the system-level analogue of this file — same S4 character, different layer's objects. Keep them separate: this register fixes meanings of architectural behaviours; L5's fixes the domain of the system claim.
Obligations
- Measure the to record rows from the RTL (the re-anchored configuration record / layer checker) and pin them.
- The per-entry agreement lemmas, handed to L3/10.
- The grep-shaped audit: no proof appeals to un-registered behaviour.
Effort
Days to seed; the cost is the discipline, not the writing — and the payoff is that mid-proof stalls become filing operations.
L4/03 — Coverage: the encoding sweep and the cheap bulk
Background
A processor's decoder is not consulted only on the instructions the programmer meant to use. Every word that arrives from memory — a mistyped jump target landing in data, a corrupted image, a deliberately hostile input — goes through the same decode hardware, and the hardware will do something with it. An ISA therefore has to be a total specification: it must say what happens for all possible words, not just the meaningful ones. For the meaningless remainder the standard's answer is the illegal-instruction trap — the processor must recognise the word as invalid and transfer control to a handler, rather than executing whatever the decoder's don't-care logic happens to compute. A refinement claim that only covered the valid words would be false as stated: refinement quantifies over all executions, and executions containing garbage words exist.
This sounds like it demands 2³² proof obligations, and the reason it does not is worth understanding because it recurs everywhere in verification. The decoder does not treat words individually; it examines a few fields — the major opcode bits, the function-code bits — and the valid/invalid boundary is expressible as a modest set of regions of the encoding space, each region either matching one instruction's pattern or falling outside all of them. Checking a region is one query to a SAT solver ("does there exist a word in this region that decodes without raising the illegal flag?" — a question over a few dozen boolean variables, mechanical to answer). So the sweep is a few hundred solver queries, generated by a program, none requiring human thought.
That phrase — no human thought per case — is the point of this chapter's title. The project distinguishes obligations that are numerous but mechanical ("cheap bulk": generate, solve, count) from obligations that are few but deep (authoring the custom-extension spec, inventing the L3 invariant). Coverage is the model case of the first kind, and the chapter's closing advice is a useful heuristic for the whole book: the moment an individual coverage case starts to require judgment, it has been misfiled, and belongs with the thinking-dominated chapters instead.
Statement
The wide, shallow obligations that make ISA total over the instruction space: every encoding is either implemented (and matched to its Sail clause) or unimplemented (and proven to trap). Skip the second half and the refinement is simply false — a claim about all executions cannot ignore the words a program might contain.
The partition
From the configuration — rv32imac_zicsr_zifencei_zihpm_xrocket — the space partitions across two widths, because the C extension makes this a variable-length ISA:
implemented RV32I base ⊕ M (multiply/divide) ⊕ A (atomics: lr/sc, amo*)
⊕ ALL of C (the 16-bit quadrants 00/01/10, minus reserved holes)
⊕ Zicsr (csrr* against the implemented CSR set, incl. machine-mode,
PMP, counters, and the xrocket custom CSRs)
⊕ Zifencei ⊕ ecall / ebreak / mret / wfi
unimplemented F/D (no floating point), supervisor-mode CSRs (no S-mode),
reads of absent CSRs, reserved regions of both the 32-bit
space and the 16-bit quadrants
Each implemented encoding gets the decode-equivalence + execute lemma pair (L3/10, templated by 00's addi/beq example). Each unimplemented encoding gets traps-correctly: the decoder raises the illegal-instruction exception and the machine takes the imported spec's trap step — mcause/mtval included, per the S4 rows. Two subtleties the sweep must partition alongside opcode space: a csrrw to an absent CSR is a legal instruction encoding whose execution traps — CSR address space is part of the sweep — and the 16-bit space's reserved holes (including the all-zeros word, defined illegal by the standard precisely because erased memory decodes to it) are regions of their own.
The measured half is an obligation, not yet a result. The spec side comes from the official riscv-opcodes tables at a pinned commit, so the patterns rest on the standard's own machine-readable encodings, not hand transcription. The implementation side — the decoder's own legality cubes, extracted from the generated RTL and compared exactly against the spec patterns — is the checker to re-run against this core (scoreboard). Decoders routinely accept a few reserved words via minimisation don't-cares, which is why the partition is designed three-way, with the third class a deliberate piece of spec design:
implemented the spec patterns — matched to their Sail clauses
trapping words the decoder REJECTS — proven to take the illegal-instruction
trap step (a sweep against the measured rejected set)
spec-UB any reserved words the decoder ACCEPTS — the spec assigns them
UNSPECIFIED architectural behaviour; the measured set is
expected small, and the clause survives any size
Spec UB, and why it is safe to say. For the UB class the ISA transition relation simply permits any successor architectural state (a demonic havoc step); refinement on those words is then trivial — which is exactly the point: the theorem deliberately claims nothing about them, instead of claiming something false. What makes this honest rather than a cop-out is the layering: UB at the ISA layer is still bounded by every layer below it. The invariant I still holds (the machine stays a coherent pipeline), the bus guarantees still hold (no malformed transaction), retirement still happens within the measure's bound, the electrical envelope is untouched — no instruction is a halt-and-catch-fire. This is the same move as L5/05's operating-conditions clause one level down: out-of-spec behaviour is not "anything may happen" but "anything may happen to the architectural state, within a machine that keeps functioning and can be re-anchored by trap or reset." The practical corollary: an execution that never fetches a UB word gets the full correspondence theorem — and for a fixed image, "contains no UB word" is a checkable property of F, to be enforced by an image checker over the partition once the decoder extraction lands. The checker earns its result by discriminating rather than by always agreeing — it must distinguish a UB word (accepted-reserved) from an unimplemented word (trapping), which is the distinction the three-way partition exists to make.
Why this is the model case of cheap entropy
The implemented patterns and the unimplemented complement: high raw spec entropy, zero invariant entropy — each obligation is one SAT-shaped query, independent of all others, because L3's interlocks cut every cross-instruction dependency at the register file. A lot of typing, almost no thinking; the thinking concentrated in S3 (01) and S4 (02). Most of L4 has this character, and the layer's effort estimate is dominated by it.
The sweep is also where encoding-space structure pays: the partition is decided by major opcode and format fields, so the unimplemented half is a small set of regions, not 2³² cases. The custom fragment adds CSR addresses (and possibly custom opcodes — 01's enumeration settles which), handled as further rows of the same sweep.
Obligations
- Generate the partition — opcode regions across both widths and CSR addresses — from the configuration record; publish it as the single source both L3/10 and the compliance harness consume.
- The decoder extraction and exact comparison against the spec patterns (the re-anchored checker; any accepted-reserved words land in the spec-UB class and the findings).
- The traps-correctly sweep, mechanised (regions, not words).
- The absent-CSR cases (F/D, S-mode, unimplemented counters) as explicit rows of the sweep.
Effort
Months of mechanised typing once L3/10's harness exists; near-zero marginal thought per encoding — by design, and worth preserving: any coverage case that starts requiring thought belongs in 01 or 02 instead.
L3 — RTL semantics = the microarchitecture
Node — RTL semantics, which is the microarchitecture:
⟦RTL⟧, the word-level transition system of the source text, defined for the synthesisable subset this design actually uses (00–04) and toured as the generated Rocket core it elaborates to (05–07). Used on both sides of the tower: L2's CEC compares against it, and this layer's own edge refines from it. Edge up — the ISA refinement (the genuine abstraction step):⟦RTL⟧ ⊑ ISA, a stuttering simulation(I, α, m)— carried by the refinement statement (08), the invariant (09), and the per-instruction obligations (10). The node is a definition (its risk is inverted: a wrong definition yields a true theorem about the wrong object, so its obligations are well-definedness and adequacy, not proof); the edge up is the tower's one irreducible theorem — the ← THE WORK arrow no tool produces and no measurement substitutes for.
This layer is the merge of two: defining what the RTL means, and proving that what it means implements the ISA. They are the same object at two depths of description — a clean synchronous transition system, which when you look at what it computes is a five-stage pipeline. The node fixes the object; the edge up is the refinement.
Background
Before anything can be proved about the RTL, the RTL must mean something. Verilog's official semantics is an event-driven simulator with deliberately loose scheduling — unusable as a proof object — so the node defines the design's meaning directly, as a clean synchronous transition system, for exactly the subset of the language this design occupies, with membership mechanically checked rather than assumed (00, 01). The two conditions that make combinational logic actually combinational are checked in 02; the treatment of unknown values and reset in 03; and the question no proof can answer — whether the definition captures what the artifact really means — is made detectable, since it cannot be made provable, in 04.
That same transition system, read for its structure rather than its semantics, is the layer a computer-architecture course would recognise: a processor implementing its instruction set. The edge up proves exactly that, and it is the tower's irreducible theorem — the one piece no tool produces. The proof technique is the simulation: an abstraction function reads architectural state out of the hardware at commit points, an invariant describes the machine's in-flight state well enough to survive induction, and a measure bounds how long any instruction can take — all introduced from scratch in 08's Background, with the machine's anatomy toured in 05. The invariant (09) is where the thinking concentrates; the rest is wide, shallow, and largely mechanisable (10, 06–07).
The node: RTL semantics
A semantics for the synthesisable subset this design actually uses — not for Verilog: the simple synchronous semantics (two-phase non-blocking commit over an acyclic combinational pass), with the relationship to the LRM's event scheduler isolated as the scheduler-independence claim — probed by adequacy checks, stateable as a theorem. The subset is measured over the emitted design: one level-sensitive block (the clock-gate primitive), one X-idiom (23 memory-read don't-care sites), one initializer idiom, and the worst of the language's categories absent by construction.
Read structurally, that object is the generated Rocket core: a five-stage in-order pipeline with a 4 KiB instruction cache, a full bypass network, three ratified extensions (M, A, C), and standard machine-mode trap machinery, with its buses and debug port as assume-guarantee interfaces (05–07). Defining the object and touring the microarchitecture are the same act at two granularities — which is exactly why the old "RTL semantics" and "microarchitecture" layers are one node here.
The edge up: the ISA refinement
⟦RTL⟧ ⊑ ISA: a stuttering simulation (I, α, m) — invariant, abstraction read at retirement, measure — conditional on the bus contract (L5) and stated over the configuration record. Displayed in full in 08; inventing the invariant I is the one thing in the entire project no tool produces (09). ⊑ is trace refinement up to stuttering, not equality: the implementation takes many cycles per architectural step, so the obligation is a stuttering simulation with a measure function, not a cycle-accurate correspondence. This is the genuine abstraction step of the tower — unlike the horizontal CEC below it, which is an equivalence between two descriptions of the same machine.
Subcomponents
| status | ||
|---|---|---|
| 00 | ⟦·⟧ : Config → RTL → TransitionSystem; the simple semantics; scheduler independence stated; the shipped configuration as part of the object | weeks |
| 01 | The construct census of the emitted design; the admissible-subset move (third instance); the enforced boundary | census measured |
| 02 | Completeness (latch inference — the check that changes the circuit if missed); RTL-level acyclicity; the clock-gate primitive carved out | days |
| 03 | The two-valued strengthening, split three ways: X-elimination where the spec claims definiteness, refinement into spec nondeterminism where it doesn't, value-independence for the residue | weeks |
| 04 | Differential simulation; the CEC cross-check (disagreement with Yosys is detected, not silent); the FIRRTL anchor | weeks; mostly inherited |
| 05 | What the machine actually is — the arch-class tour of the generated core: pipeline, I-cache, bypassing, extensions, CSRs, debug; presence and absence priced | declared by elaboration; re-measurement pending |
| 06 | The TileLink ports as assume-guarantee pairs (burst refill on the fetch side, the tile's master port); the debug module and its conditionality | weeks |
| 07 | Traps and interrupts against the standard machine-mode spec; CLINT/PLIC delivery through the fabric as the system half | months |
| 08 | The statement: (I, α, m), retirement as the commit point, the core's trace port as the designer-declared α anchor, trap steps in the diagram; the measure read quantitatively = retirement-gap bounds, hard real time | weeks; do first |
| 09 | The invariant: entropy argument, the per-stage clause sketch, IC3 calibration plan | the heart of the estimate |
| 10 | Wide-shallow per-instruction lemmas: the generated decoder vs Sail, ALU, the iterative mul/div, load/store/atomics, CSR ops, the trap sweep | months; harness-dominated |
Interfaces
Consumes: the emitted SystemVerilog design cone (~230 modules) and its FIRRTL ancestor; the elaborated configuration record; the licence to reason discretely (L1); the bus contract and its latency bound B (L5); the Sail import including the machine-mode subset (L4). Exports: ⟦RTL⟧ to L2 (the CEC's right-hand side) and back to this layer's own edge; the configuration record to L4 (ISA subset) and L5; the reset/X story to L5's epoch model; and the refinement theorem — the tower's ← THE WORK arrow — plus the retirement-gap bounds (the measure read quantitatively, 08), consumed by L5/04's epilogue sizing.
Axioms introduced
None. The node is a definition (it once mirrored the netlist-semantics axiom S1, but S1 is now derived by the stack below; ⟦RTL⟧ has no such derivation, which is exactly why 04's checks matter — the failure mode is detected by the CEC cross-check and differential simulation rather than silent). The edge up introduces none of its own either; it is where the others are cashed in, its conditionality explicit: on B (L5), on S2/S3's spec fidelity (L4's ledger), on the configuration record, and on debug-inactive (05, 06).
The layer's shape
The node is the admissible-subset move plus its receipts. 01 fixes the boundary and proves the awful constructs absent; 00 gives the clean semantics that is correct for that subset — with scheduler independence as the honest statement of why the LRM can be ignored; 02 checks the two conditions without which the semantics is undefined; 03 reconciles the two-valued idealisation with physical power-up; 04 makes definitional error detectable. The node stays small because the subset is small — the target-selection decision, and the census is its receipt.
The edge up then rides on the machine's own structure. 05 fixes what is being verified; the pipeline's stage structure organises everything: retirement at WriteBack defines the commit points (08), the inter-stage register banks organise the invariant per stage (09), and the bypass/interlock discipline is precisely what restores the cross-instruction independence the per-instruction obligations need (10). The ports where the world enters are assume-guarantee pairs, the debug port quarantined behind a conditionality (06); the interrupt machinery is checked against the imported standard spec, with the small custom residue isolated (07).
Open problems
- The invariant (09) — irreducible; the IC3 calibration decides how much of it is tedium vs. thought.
- Prove scheduler independence for the subset (00) — bounded, genuine, severable from the critical path.
- The
fence.i/ I-cache agreement story (05, 09) — small state, real content. - The register power-up story against the hardened netlist (03).
- The residual authored semantics — the custom control CSRs (L4/01) — decide and record before proving.
First experiments
For the node:
- Extract and record the elaborated configuration (gates three other layers' scoping — cheapest high-value item in the layer).
- The completeness and RTL SCC checks (02) — an afternoon each, and both are hard failures the front end should enforce thereafter.
- The differential harness on the design's own testbenches (04).
For the edge up:
- Write the refinement statement and α before any proof (08) — against the core's own trace port (the retirement interface the ecosystem's co-simulation uses), checked on simulation traces as a cheap oracle.
- Extract the stall/flush/bypass structure from the emitted RTL and derive the retirement-gap bounds (05, 08).
- The IC3 calibration on the structural clauses (09) — cheap, and it sizes the layer's real cost.
Effort
3–6 months for the node — the smallest definitional piece in the tower, unusually well-bounded because the scope was measured rather than assumed; the only cost beyond the subcomponent sum is the elaborator front end, shared with X1's parser work. Then 1.5–3 years for the edge up: the pipeline, the bypass network, and three live extensions put this machine several rows up the effort-multiplier table from a multicycle core, but the mitigations are real — no data-cache miss machinery (the data side is a scratchpad), no speculation in this configuration, no virtual memory, no FPU, and a designer-declared trace port as a ready-made α anchor. The irreducible content remains plausibly a few hundred lines of clauses plus glue; the rest is the project-wide infrastructure item (symbolic simulation, bitvector automation, the stuttering framework).
Reading
Lööw's HOL4 Verilog semantics — the existing deep embedding, and the reference point for how much of the language one actually needs. The FIRRTL spec — the IR the design actually descends through, and the node's long-term anchor (04). The rocket-chip repository — the generator source is the design intent. Burch & Dill on flushing, and Manolios on WEB refinement — the two standard α constructions for pipelined machines. Sawada & Hunt on intermediate abstractions. Fox's ARM6 verification — a pipelined commercial ISA against a real microarchitecture, the closest existing analogue. riscv-formal's RVFI discipline — the retirement-interface prior art α should stay comparable with.
L3/00 — The elaborated object
Background
Hardware is designed by writing code. SystemVerilog, the language of this design's emitted RTL, is a hardware description language (HDL): a file that looks superficially like a C program but describes a circuit — its variables are wires and registers, and its statements describe logic that all exists, and all runs, simultaneously. The level of description is called RTL, register-transfer level: the design is expressed as a set of registers (state that updates on clock edges) plus the combinational logic computing, from current register values and inputs, what each register's next value will be. An RTL design has two essential statement forms. assign and always @* blocks describe combinational logic — outputs that are pure functions of current inputs, recomputed "instantly." always @(posedge clk) blocks describe clocked logic — assignments that take effect only at the clock edge, which is how registers are expressed.
The subtlety that makes Verilog semantics a research topic in its own right is what the language definition actually says these constructs mean. The official definition (the LRM — language reference manual) does not define a circuit; it defines a simulator: an event-driven scheduler that maintains a queue of value-change events and repeatedly picks one — in an order the standard deliberately leaves loose — and propagates it. Well-written synthesisable code is insensitive to that ordering; badly-written code is legal, simulates, and means different things under different conforming simulators. The one language mechanism to understand concretely is the two assignment operators: a blocking assignment (=) takes effect immediately, so later statements in the same block see the new value — sequential, program-like; a non-blocking assignment (<=) only schedules its update, and all scheduled updates commit together at the end of the time step. Non-blocking assignment in clocked blocks is what makes a bank of registers update simultaneously from the pre-edge values, the way physical flip-flops do — and it is why the discipline "clocked blocks use <=" is near-universal — and machine-kept here: the emitted design cone has no exceptions.
This chapter's task is to define what the RTL means for proof purposes: a function ⟦·⟧ assigning the design a transition system — a state set (the registers' values) and a step function (one clock cycle). The strategy is to skip the event-driven scheduler entirely and define the clean synchronous semantics a hardware designer has in mind anyway — evaluate all combinational logic, then commit all register updates at once — and separately establish (by check, and eventually by theorem) that for the disciplined subset this design lives in, the LRM's scheduler freedom cannot produce anything else. One more piece of jargon: elaboration — here it happens a storey earlier than in classic Verilog flows: the Chisel generator elaborates to FIRRTL, and the SystemVerilog arrives already parameter-free and unrolled, one module per elaborated instance shape. The semantics is taken of that already-elaborated design.
Statement
Define ⟦·⟧ : Config → RTL → TransitionSystem — the word-level transition system that is L2's right-hand side and L3's left-hand side. A definition, not a theorem; its correctness notion is adequacy (04).
The semantics, directly — not via the LRM
The Verilog LRM defines an event-driven scheduler with delta cycles and nondeterministic event ordering. We do not formalise it. ⟦·⟧ is defined as the simple synchronous semantics directly:
State = declared regs (as bitvectors) ∪ memories
Input = input ports
step = 1. evaluate all combinational blocks/assigns to a fixpoint-free
valuation (acyclic — [02](02-comb-blocks.md))
2. evaluate every non-blocking RHS in the pre-state
3. commit all non-blocking assignments simultaneously
Two-phase non-blocking commit is what makes always @(posedge) blocks order-independent among themselves; the acyclic combinational pass is W3's analogue one level up.
The implicit theorem this definition rides on — scheduler independence: for programs in 01's subset (non-blocking in clocked blocks, complete and acyclic combinational blocks, no delays/UDPs/triggers), every LRM-conformant scheduling computes exactly this semantics — the event-order nondeterminism is unobservable. This is what "semantically tame" formally means, and it is the content that 04's cross-checks probe empirically instead of proving: we define the clean semantics, and validate that the tools' LRM interpretations agree with it on this design. Proving scheduler independence for the subset would upgrade the adequacy story from tested to derived — a real (and bounded) formalisation target, but not on the critical path.
The two known deviations from "order doesn't matter" are exactly the flagged sites: the 2 clocked blocks using blocking = (order-dependent within the block — either model the intra-block sequencing explicitly or rewrite-and-prove-equivalent) and latch inference (02).
Word-level from the start
wire [31:0] is one declaration, so State is over bitvectors: SMT bitvector theory applies directly to L3's proof, arithmetic is +/* rather than carry chains, and the netlist-side structure of arithmetic is entirely L2/05's business (generic templates + trail). The word/bit boundary is crossed exactly once, at ρ (L2/03), and never inside this layer.
Configuration is part of the object
The generator is heavily parameterised — the whole SoC is a Scala configuration (core count, cache geometry, extensions, bus topology, peripherals) — and ⟦·⟧ takes the elaborated configuration as an argument. The emitted SystemVerilog arrives with parameters already resolved, so the configuration lives one storey up: the record extracted from the elaboration (the ISA string, the memory geometry, the device tree) determines which ISA subset L4 must cover and which structures L3's tour prices. Recording it exactly is a deliverable, not bookkeeping, and re-running the elaboration from the pinned generator is the check that the record describes the design rather than one build.
Obligations
- Write the semantics for the subset (small — the step function above plus expression evaluation over bitvectors).
- Extract and record the elaborated configuration from the generator run.
- State scheduler independence precisely, even if its proof is deferred — the statement is the layer's honesty about what the LRM relationship is.
Interface (down to L2). The S-frontend seam is the still-open factor of L2's l2_commutes: that the Yosys front-end (proc/techmap/flatten) producing the synthesis trail's head s0 from this ⟦RTL⟧ preserves the cone functions. The trail s0 → … → N is certificate-checked pass by pass; this first hop, from the elaborated object to the trail head, is not — the last trusted step inside an otherwise-proved equivalence.
Effort
Weeks for the definition; the deferred scheduler-independence proof is the only open-ended item and is severable.
L3/01 — The subset, measured
Background
Verilog (and its superset SystemVerilog) is really two languages sharing a syntax. One is for describing hardware; the other is for writing testbenches — simulation-only code that pokes the design with stimuli, and may freely use constructs with no physical counterpart: #10 ("wait ten simulated nanoseconds"), force (reach in and override a wire), fork (spawn parallel processes), DPI calls into C. Synthesis tools accept only the first language — the synthesisable subset — and even that subset has dark corners the standard leaves loose: casex's treatment of unknown values is a famous source of simulation/synthesis mismatch, and an explicit 'bx literal drags the simulator's "unknown" value into design semantics. A formal semantics for all of the language would be enormous, contested, and mostly spent on constructs that describe no hardware.
The move this chapter makes — the same one the book makes at every layer where a messy industrial format appears — is to refuse the general problem. Instead: choose a well-behaved subset, give the semantics for exactly that subset, and mechanically check that the design lies inside it, so that every dark corner becomes a parse error rather than a semantic question. Nobody has to formalise what force means if a checker proves force never occurs. What makes this cheap here is that the RTL is compiler output: the SystemVerilog is emitted by CIRCT's firtool from FIRRTL, and a compiler back end emits a small, rigid idiom — the same handful of construct shapes, thousands of times.
Statement
A semantics for the synthesisable subset this design actually uses — not for SystemVerilog. The target source is the emitted design cone: ~230 modules of machine-generated SystemVerilog (80 K lines across the emitted collateral, which also carries the simulation harness — excluded from the cone by the synthesis file list). The census, measured over the emitted files:
| construct | count | consequence |
|---|---|---|
# delays | 0 in the design cone | no scheduling games (3 sites in DPI harness files, outside the cone) |
casex / casez | 0 | — |
force / release / deassign | 0 | — |
UDPs, fork/join, events | 0 | — |
| DPI imports | 0 in the cone (harness only) | — |
always @(posedge …) | 303 | the clocked bulk — uniformly non-blocking |
blocking = in clocked blocks | 0 in the cone (4 sites, all in one harness file) | the order-dependence class is absent |
always @* | 1 — the clock-gate wrapper | a deliberate latch: the ICG primitive (02) |
X literals ('bx) | 23, all one idiom | read_data = en ? mem[addr] : 'bx — memory-read don't-cares (03) |
initial | 212, all simulation-only | the register-randomization initializer and SYNTHESIS-guarded sim hooks; synthesis-visible content empty (03) |
assert and monitor modules | 3,938 mentions in 85 files | simulation-guarded verification collateral — an adequacy asset (04) |
The numbers say something structural: a compiler back end has already done the subset-discipline work. There is exactly one level-sensitive block in the entire design, one X-idiom, one initializer idiom — because one code generator emitted everything. The dark-corner constructs are not rare; they are absent, and absent by construction rather than by an author's care.
The admissible-subset move, third instance
This is the same manoeuvre as L1/00 (GDS: forbid pathtype 1, self-intersection, non-90° SREF) and L2/00 (structural Verilog: ~20 productions): define the semantics for a well-formed subset chosen to match what production artifacts actually contain, and check membership rather than assuming it. The subset boundary is enforced by the front end — a construct outside it is a rejection, not a guess. The pattern's value is that the semantics' hard cases become parse errors: nobody has to decide what force means because the checker proves it never occurs.
The discipline that follows: write the semantics for exactly what appears. Every construct in the subset gets its meaning from 00's simple semantics; every construct outside it is rejected; there is no third category of "handled approximately."
The generated-source situation
The target source is machine-emitted, and — unlike most generated RTL — its generator has a written-down input semantics: the design exists as FIRRTL, an intermediate representation with a specification, before firtool lowers it to SystemVerilog. The consequences cut both ways. Per construct, the emitted code is easier than hand-written RTL: one idiom per construct class, no dark corners, no author styles. Per meaning, the SystemVerilog is the output of a compiler nobody has verified — so the layer carries two anchors instead of one: the emitted-subset semantics defined here, and the FIRRTL-level semantics one storey up, with the lowering between them as a checkable seam (04). That second anchor is what a hand-written design can never have.
Obligations
- Re-run the census as an enforced boundary over the synthesis file list (the design cone, mechanically separated from the harness collateral); pin it as a regression — a construct appearing after a generator bump must fail loudly.
- Freeze the subset grammar as the front end's acceptance language.
- The clock-gate wrapper's primitive contract (02) — the one construct that is not combinational-or-clocked.
Effort
Days — the census is measured; the work is promoting it from measurement to enforced boundary.
L3/02 — Combinational blocks: completeness and acyclicity
Background
Combinational logic — the half of RTL that computes rather than remembers — is only combinational if two conditions hold, and Verilog enforces neither. This chapter is about checking them, and the failure modes are worth seeing concretely because both are classic ways real designs go wrong.
The first condition is completeness. An always @* block is meant to describe a pure function: for any inputs, compute the outputs. But consider a block that assigns out inside if (sel) out = a; and forgets the else. When sel is low, the block assigns nothing — and Verilog's semantics says out then keeps its previous value. Keeping a previous value is memory: the "combinational" block now describes a storage element, and synthesis tools dutifully build one — a latch (a level-sensitive storage element, transparent while its enable is high, as opposed to the edge-triggered flip-flops of clocked logic). This "latch inference" is silent, legal, and changes the circuit's state space: a state element exists in the netlist that the RTL's author never intended, no reset touches, and no proof about the intended design accounts for. The fix is a per-block check that every control path assigns every output — mechanical, and worth its weight in gold.
The second condition is acyclicity. Combinational blocks read each other's outputs, and if the read-dependency graph contains a cycle — block A computes x from y while block B computes y from x — there is no well-defined order to evaluate them in, and "evaluate all combinational logic" stops being a definition. (In physical hardware the same cycle is a feedback loop that may oscillate or settle unpredictably; the netlist-level version of this check is L2's W3.) The check is a standard graph computation: build the dependency graph, find its strongly connected components (maximal sets of nodes mutually reachable from each other — the canonical algorithm is Tarjan's, linear time), and demand every component be a single node. The one wrinkle at RTL level is apparent cycles that never realise because the two directions occur on disjoint control paths — where the honest options are a conservative syntactic rejection or a finer per-path analysis, and conservatism wins unless it actually fails.
Statement
The two well-formedness conditions on the combinational sublanguage, without which 00's step function is not defined. These are W1–W4's analogues one level up, and one of them is the single most consequential check in the layer.
Completeness: one level-sensitive block, by design
An always @* block that fails to assign an output on some control path makes that output hold its previous value on that path — the language silently infers a latch, and the block is no longer combinational. The formal condition:
∀ block B, ∀ output v of B, ∀ control path π through B: π assigns v
The emitted design makes this almost a non-event: the compiler expresses combinational logic as assign expressions, so the design cone contains exactly one always @* block — and it is a latch on purpose. EICG_wrapper, the integrated-clock-gate model, latches its enable while the clock is low (if (!in) en_latched = en || test_en) and gates the clock with the latched enable — the textbook glitch-free clock gate, mapped to a dedicated clock-gate library cell in hardening. The right treatment is not to "fix" the incomplete block but to remove it from the combinational sublanguage entirely: the wrapper is a primitive with its own contract (enable sampled while the clock is low; the gated clock equals clk ∧ en_latched), consumed by L1's clock analysis. The completeness check then quantifies over the remaining blocks — expected to pass vacuously — and its standing job is to catch any unintended latch a future generator bump might introduce, the failure that changes the circuit: a phantom state element appears, ρ (L2/03) has no RTL counterpart for it, and the refinement is false, not merely harder.
Acyclicity: the RTL-level W3
Combinational blocks and assigns read each other's outputs; the read-depends-on graph must be acyclic for the fixpoint-free valuation to exist. Verilog permits combinational loops (the language would give simulation nontermination or oscillation; hardware would give L3/W3 violations). The check is the same SCC computation as W3, over RTL signal dependencies instead of nets — to be re-run over the emitted cone by the layer's checker (yosys's scc pass), with zero SCCs the expected verdict for compiler-emitted code and any hit a generator finding.
The same elaboration answers a third question for free — wires that are read but never driven, which are X sources. Most such reports are artifacts of reading a module whose drivers live in an absent macro (here, the SRAM macros), so the discriminator is whether the unit under check is a closed hierarchy; the sweep must therefore run with the macro behavioural models in place, and any genuinely undriven wire is a finding whose harmlessness must be established, never assumed.
One subtlety absent at netlist level: apparent cycles through a block that never realise (block A reads x, writes y; block B reads y, writes x; but on disjoint control paths). The netlist after synthesis resolves this through mux structure; at RTL the honest options are the conservative syntactic check (reject apparent cycles — likely sufficient here) or a per-path refinement. Take the conservative check unless it fails.
The blocking-assignment residue
There is none in the design cone: the emitted clocked blocks are uniformly non-blocking (the census's four blocking sites are DPI harness collateral outside the cone). 00's two-phase semantics therefore applies without a normal-form rewrite — one whole class of order-dependence obligations deleted by the compiler's discipline.
Obligations
- The completeness check over the cone's blocks, as a front-end hard failure (shared with L2's naive-netlist well-definedness), with the clock-gate wrapper carved out as a primitive.
- The RTL-level SCC check, conservative version.
- The clock-gate primitive contract, stated once and exported to L1.
Effort
Days. Small, sharp, and everything downstream assumes it silently — which is precisely why it gets its own file.
L3/03 — X and initialisation
Background
When a chip powers up, its flip-flops hold arbitrary values — physically, whichever way each bistable circuit happened to tip as the supply ramped. Hardware practice represents this ignorance with a third logic value, X, meaning "unknown: could be 0, could be 1." A freshly powered design is all-X, and a reset sequence exists precisely to fight X: registers with a reset connection get driven to definite values, and definiteness then propagates as the machine runs. But not every register has a reset connection — adding one costs area and wiring, so designers deliberately leave uninitialised any register whose value provably doesn't matter until first written (a register file is the classic case: garbage in a register you haven't written yet is harmless, because reading it was never meaningful). The result is that a real design's early life is a mixed X-and-definite state, converging toward definiteness at a rate the designer controlled by choosing which resets to pay for.
Reasoning about this uses ternary simulation (industrially, "X-propagation" or X-prop analysis): run the design's logic over the three-valued domain {0, 1, X}, where each gate maps unknown inputs to unknown outputs except where a known input forces the answer (0 AND X = 0 — the X never mattered). A ternary run of the reset sequence starting from all-X computes, conservatively, exactly which bits are guaranteed definite afterward — and because it starts from all-X, its conclusion holds from arbitrary pre-reset garbage, which is what lets one proof serve power-on, brown-out recovery, and post-upset reset alike.
The chapter's actual subject is a mismatch this creates. The semantics defined in 00 is two-valued — every register always holds a definite bitvector — because two-valued semantics is vastly more tractable for the refinement proof above. That is a strengthening of reality, and unjustified strengthenings are how proofs come to be about the wrong machine. The resolution below splits the gap three ways — prove X is eliminated where the spec claims definiteness, match X against the spec's own reset nondeterminism where the standard itself says "unspecified," and prove the residue never influences anything observable — with the second arm being the elegant one: the ISA's deliberate underspecification (choice C1 in L4/02) turns out to be exactly shaped to absorb the hardware's uninitialised registers.
Statement
⟦RTL⟧ as defined is two-valued — every register holds a definite bitvector — which is a strengthening of reality: power-up state is all-X (L1/03's value lattice), and real cores deliberately leave registers unset. The obligation is to justify the strengthening exactly where it is used and refine it where it is not justifiable.
The resolution, in three parts
Where the spec claims definiteness, prove X-elimination. pc, the FSM state, and reset-defined CSRs must be definite after reset. The obligation: the reset sequence, run in ternary semantics from the all-X state, drives these bits definite. This is checkable by ternary symbolic simulation (industrial "X-prop" verification), and its quantification over the all-X start state means it covers arbitrary pre-reset garbage — so brown-out recovery and SEU-recovery reset ride on the same proof (L5's epoch model consumes exactly this).
Where the spec permits nondeterminism, refine into it. RISC-V leaves general registers unspecified at reset. Implementation-X on those bits is not eliminated but matched: the refinement maps untracked implementation state into the spec's own reset nondeterminism. The register file simply never needs an X-elimination argument — a large saving discovered by aligning the obligation with what the spec actually claims.
Where neither applies, prove value-independence. Any remaining uninitialised bit must never flow to an observation before being written. In ternary terms: X from that bit never reaches a definite-claimed output. These are the classical value-independence lemmas, now stated as X-flow properties — per-bit, mechanical, and expected few after the first two parts have consumed the bulk.
The initial blocks and the X idioms
The census found 212 initial blocks — overwhelmingly one machine idiom, the compiler's register-randomization initializer, whose entire body sits behind simulation-only macro guards. With those macros undefined (every synthesis run), the blocks are empty: no register in the design carries a power-up value, which is exactly the all-X starting point this chapter's ternary story wants, stated by the emitter itself. The idiom exists so that simulation can start from randomized rather than zeroed state — the ecosystem's own defence against code that accidentally relies on uninitialised registers reading zero, i.e. a fuzzer for precisely this chapter's third obligation.
The design's 23 'bx literals are also one idiom: behavioural memory models yield X on a read with the enable low (read_data = en ? mem[addr] : 'bx). Per site, that is a declared don't-care — the generator asserting that disabled-read data is never consumed — which converts directly into a value-independence obligation: X from a disabled read never reaches a definite-claimed output. (In the hardened netlist these models are replaced by SRAM macros whose disabled-read behaviour is the macro contract's business — the RTL X-site and the macro contract must agree, a small cross-layer check.)
Interfaces
This file is where three layers meet, deliberately thin: L1/03 supplies the value lattice and the claim that reset is an X-elimination event; L2/03's ρ requires the reset-state correspondence this file establishes; L5's epoch model consumes "X-elimination from arbitrary state" as its per-epoch base case. The proof lives once, here.
Obligations
- The ternary reset simulation for the definite-claimed set (pc, FSM, CSRs).
- The spec-nondeterminism matching clause in the refinement statement (with L3/L4: which architectural state is reset-unspecified).
- The residual value-independence sweep.
- The disabled-read value-independence sweep over the 23 memory X-sites, and its agreement with the SRAM macro contracts.
Effort
Weeks, mostly tooling for the ternary simulation; the conceptual work was done when the obligation was split three ways.
L3/04 — Adequacy: how a definition can be wrong
Background
Theorems are checked by proof; definitions are checked by nothing. When 00 defines what the SystemVerilog means, no downstream proof can catch an error in the definition itself — if the semantics says an operator does the wrong thing, every theorem built on it remains perfectly valid about the wrong machine, and the proof assistant will never complain. This is the deepest kind of gap in any formal verification project: it lives in the correspondence between a mathematical object and the informal thing it claims to formalise, where proof cannot reach. The property wanted is called adequacy — that the formal semantics faithfully captures what the artifact actually means — and since it cannot be proved, the engineering question becomes: how do you make inadequacy detectable?
The general answer is triangulation against independent interpretations, and its cheapest instrument is differential testing: run the same design under your semantics and under independently-written simulators, on the same inputs, and compare outputs cycle by cycle. Any disagreement pinpoints a construct whose meaning is contested. The method's power comes from independence and its weakness is coverage: it only tests behaviours the test inputs exercise. This design adds a structural instrument most projects lack: the RTL is not the top of its own derivation. It is compiler output — the design exists first as FIRRTL, an intermediate representation with a written specification, and CIRCT's firtool lowers it to the SystemVerilog the flow consumes. A specified IR one storey above the RTL means the semantics can be cross-anchored: define the meaning of the emitted subset, define (or import) the meaning of the FIRRTL, and check that firtool's lowering relates them. Disagreement at any triangle edge is a detection.
Statement
⟦·⟧ is a definition, so nothing downstream can prove it right — a wrong semantics yields a true theorem about the wrong object, and no checker catches it. Adequacy is established by making disagreement with independent interpretations detectable, four ways with different coverage.
The four checks
Differential simulation. Elaborate under ⟦·⟧, run the ecosystem's own test programs, compare cycle-by-cycle against Verilator (the framework's native simulation path) and a second independent simulator. Cheap, catches the crude failure modes (wrong operator semantics, wrong commit order), coverage limited to what the tests exercise — and this design ships an unusual asset here: thousands of generator-emitted assertions (the TileLink monitors alone are 85 files of them), which run inside the differential harness as behaviour probes written by the design's own authors.
The CEC cross-check — the strong one. L2's equivalence compares ⟦RTL⟧ against a netlist produced by Yosys's interpretation of the same source. If our semantics differs from Yosys's anywhere the design's logic depends on, the CEC fails — the mismatch surfaces as a cone that won't prove, pointing at the construct responsible. Two independent implementations of the subset agreeing on a 50-thousand-cell design is real evidence, and crucially the failure mode is detection, not silence. This converts the scariest definitional risk in the top-down architecture into checked-on-this-instance.
The IR anchor — the structural one. The FIRRTL file the design passes through has a specification independent of any simulator, and the elaboration that produced it is deterministic and re-runnable from the pinned generator. Two uses, increasing in strength. Today: re-elaboration — regenerate the FIRRTL and the SystemVerilog from the pinned sources and diff, which separates properties of the design from properties of one build. Eventually: a semantics for the FIRRTL subset the design occupies, with the lowering checked — at which point L3's SystemVerilog semantics stops being load-bearing and becomes a checked artifact of the flow, the "shrink to nearly nothing" this layer's architecture aims at. The obligation between here and there is honest: firtool is a large unverified compiler, and until the lowering is checked per-design (CEC between FIRRTL semantics and emitted-SV semantics), the IR anchor detects drift without certifying the lowering.
Scheduler independence, if proved (00) would upgrade the story from "agrees with two schedulers on this design" to "agrees with every LRM-conformant scheduler on every program in the subset." Bounded, genuine, deferred.
Honest limit shared by the first two: coverage is this design's constructs and behaviours. That is exactly the right scope for a validation project — the semantics needs to be right about the generated core, not about SystemVerilog — and the subset boundary (01) is what makes "right about this design" a closed question rather than an open-ended one.
Why this layer is small here
The classic version of this chapter, for a hand-written design, carries the whole weight of "what does this Verilog mean" with only simulators to triangulate against. Here the design descends through a specified IR emitted by a disciplined compiler: the subset is one generator's idiom (01), the dark corners are absent by construction, and the IR gives the semantics a second, independent anchor with a specification document. The layer's long-term shape is exactly the IR route: put the semantic weight on FIRRTL, check the lowering per design, and let the SystemVerilog semantics be the small, checked bridge it deserves to be. That is also where the project's certification endgame naturally lands — a lowering that emits an equivalence certificate per module would discharge this layer's residue as a by-product.
Obligations
- The differential harness (elaborate, run, compare — days), with the emitted assertion collateral enabled.
- Wire semantics-mismatch triage into L2's CEC failure reporting, so a non-proving cone distinguishes "synthesis did something" from "our semantics disagrees with Yosys."
- The re-elaboration check: regenerate FIRRTL + SystemVerilog from the pinned generator and diff against the artifacts of record.
- (Deferred) scheduler independence for the subset; the FIRRTL-subset semantics and the per-design lowering check.
Effort
Weeks for the harness; the cross-check comes free with L2. This file is small because the strategy is to inherit adequacy evidence from work other layers do anyway — which is the correct shape for a definition layer.
L3/05 — What the microarchitecture actually is
Background
The ISA says what the processor does; the microarchitecture is how — the actual arrangement of registers, adders, multiplexers, and control logic that carries each instruction out. The distinction is the deepest one in computer architecture: dozens of wildly different microarchitectures implement the same ISA, from a chip executing one instruction over several clock cycles to a server core juggling hundreds at once, and software cannot tell them apart except by speed. This chapter is the guided tour of the core's microarchitecture, and since the tour uses the standard vocabulary of a computer-architecture course, here is the minimum of it.
The core is pipelined: instead of finishing one instruction before starting the next, the machine is an assembly line of stages, each doing one phase of the work — fetch the instruction, decode it, execute the arithmetic, access memory, write the result back — with several instructions in flight at once, one per stage. The price of the overlap is hazards: instruction B may need a register value that instruction A, two stages ahead, has computed but not yet written back. The two standard remedies are interlocks (stall B until A's result lands — simple, slow) and forwarding/bypassing (route A's result sideways into B's stage — fast, more wiring and more invariant); this machine has a full bypass network, so the forwarding-correctness clause family is part of the price of realism here. Branches add a second complication: by the time a branch's direction is known, younger instructions have already entered the pipe on the fall-through path and must be flushed — squashed as if they never happened — which is why serious cores add branch prediction, and why its absence in this configuration matters. A cache is the third piece: a small on-chip memory holding recently-used contents of a larger, slower one, consulted first on every access — here an instruction cache on the fetch side, while the data side is a tightly-integrated memory (a scratchpad at a fixed address) rather than a cache, which deletes the entire miss/refill/writeback machinery from the data path.
Everything else on the big-core menu is absent — no data cache, no store buffer, no out-of-order execution, no MMU, no floating point — and the presence/absence table below prices each item either way.
Statement
The concrete anatomy of the generated core — Rocket in the framework's tiny configuration, as declared by the elaboration (the device tree carries the headline numbers) and to be re-measured from the emitted RTL by the layer's checker. The tour is organised as the standard computer-architecture walk, with each present structure priced alongside each absence. Facts marked to record await the re-anchored configuration record.
The pipeline
Rocket's classic five stages:
Fetch (icache, RVC expansion) → Decode → Execute (ALU, branch) → Memory (DTIM, atomics) → WriteBack
Roughly five instructions in flight, with bypass paths routing results backwards from Execute/Memory/WriteBack into younger instructions' operand reads. The control bundle rides the pipe with each instruction, so the invariant's "decode coherence" clause becomes a per-stage family: what each stage's control bits must say about the instruction they travel with.
The tour
Fetch and the I-cache. A 4 KiB, direct-mapped instruction cache (64 sets × 64-byte blocks — the elaboration's own numbers), read and hit-checked in the front end, with a miss triggering a TileLink refill burst. Because the C extension is implemented, fetch groups are 16-bit aligned and an RVC expander rewrites compressed instructions to their 32-bit forms before decode — an extra function to verify, with the standard's own expansion table as its spec. The cache brings the fence.i obligation — the ISA's synchronise-instruction-stream operation: stores land in the DTIM immediately, but the I-cache can hold stale code until flushed.
Decode. A generated decoder (elaborated from the instruction table in the generator source) producing the control bundle. Exhaustiveness/exclusivity obligations attach to the decoder function itself, per L4's coverage sweep.
Hazards. Full bypassing with interlocks where bypassing cannot help (load-use, mul/div in flight, CSR side effects) — so the invariant carries both clause families: forwarding-correctness ("the value routed sideways equals the value that will be written back") and stall-correctness ("no reader advances past an unresolvable writer").
Execute. ALU and address generation; branch resolution with no predictor in this configuration (to record: the tiny config elides the branch-target buffer) — a taken branch flushes the younger pipeline contents, the flush a spec-visible stutter burst, "flushed instructions have no architectural effect" an invariant clause with real content. The multiply/divide unit is iterative (small-configuration parameters — to record), a classic loop-invariant obligation.
Memory. The data side is the 16 KiB DTIM — a scratchpad, not a cache: fixed address window, no tags, no misses, near-single-cycle. The A extension lives here: an atomic ALU performs the amo* read-modify-writes at the memory, and an LR/SC reservation tracks the conditional pair (its granularity and progress conditions are S4 rows — L4/02's C7).
WriteBack. The register-file write and the retirement point — the natural commit point for α. Rocket exposes a designer-declared instruction trace port (the retirement interface the ecosystem's co-simulation uses), which is the α anchor: architectural effects are read where the design itself says instructions retire.
CSRs and interrupts. The CSR file implements the standard machine-and-user-mode subset: the trap/interrupt CSRs (mstatus/mie/mip/mtvec/mepc/mcause/mtval/mscratch), the counters (Zihpm), PMP (8 regions, granularity 4), and the custom xrocket control CSRs (L4/01's enumeration). All three standard interrupt lines are live — software and timer from the CLINT, external from the PLIC — so the trap machinery is imported spec end to end, with the custom CSRs as the only authored residue. The reset vector is a constant (the boot ROM base).
The debug module. The standard RISC-V debug architecture, reached over JTAG: halt, step, abstract commands, out-of-band access to architectural state. The refinement must be stated conditional on debug-inactive (the same move as scan chains in L2/05's contingency table), with the debug session itself specced separately via the debug spec's own register model.
The presence/absence table — both directions priced
| structure | status | what it costs the proof |
|---|---|---|
| pipeline (5 stages) | present | per-stage invariant families; flushing- or WEB-style α at retirement |
| forwarding/bypass network | present | forwarding-correctness clauses — the priced cost of a real pipeline |
| instruction cache (4 KiB, direct-mapped) | present | a set-indexed agreement invariant; fence.i correctness; a miss-bounded fetch-timing term |
| RVC expansion (C extension) | present | the expansion function vs. the standard's table |
| iterative mul/div (M extension) | present | one loop invariant per operation family |
| atomics + LR/SC (A extension) | present | the AMO read-modify-write lemmas; the reservation invariant |
| PMP | present | the permission-check lemma on every access path |
| debug module | present | conditional refinement under debug-inactive |
| branch prediction / speculation | absent (this config) | "any prediction is recoverable" clauses — avoided |
| data cache / store buffer | absent (DTIM instead) | pending-write deltas in every load lemma — avoided |
| OOO | absent | WEB + ROB invariant — avoided |
| MMU/TLB | absent | walker-vs-page-tables, privileged VM spec — avoided |
| FPU | absent | FP correctness — avoided |
| multicore | absent | RVWMO — avoided |
The configuration sits deliberately in the middle of the ladder: a real pipeline with real bypassing and three ratified extensions, but with the data-side miss machinery, speculation, and virtual memory all absent — each absence a clause family the proof never pays for.
Obligations
- The stall/flush/bypass structure and per-instruction pipeline-occupancy bounds, extracted from the emitted RTL (the re-anchored stage-graph checker).
- The retirement/α story instantiated for this pipe (08) and the invariant's per-stage clause sketch (09).
- The I-cache agreement invariant and the
fence.iobligation, stated. - The debug-inactive conditionality, stated once and threaded.
- The to record rows (BTB absence, mul/div parameters) pinned by measurement.
Effort
Days — descriptive, measured from source. What it feeds — the invariant and the per-instruction sweep — is priced in the layer README.
Reading
The rocket-chip generator source — the Scala is the design intent the generated SystemVerilog implements. Burch & Dill and Manolios (WEB) for the α constructions. Hennessy & Patterson for the pipeline/hazard/cache vocabulary at textbook depth.
L3/06 — The buses and the debug module
Node: this file is the object — the tile's TileLink ports and the debug module as structure. The request-discipline guarantees the core proves (the interface half of the refinement edge) are the edge, 11.
Background
This chapter proves the core's half of the bargains struck at its external ports. The general story — what a bus is, why memory latency varies, and how assume-guarantee reasoning splits an interface proof into promises proved by each side separately — is introduced in L5/02's background, worth reading first; L5 authors the fabric's promises to the core, and here the core proves its own request discipline in return.
The protocol at the tile's ports is TileLink: requests on the A channel (opcode, address, size, source ID), responses on the D channel tagged with the matching source ID, valid/ready handshakes per beat, multi-beat bursts for transfers wider than the bus. The fetch side issues cache-line refill bursts — a line-aligned read streamed over consecutive beats; the data side issues the accesses the DTIM and the memory map serve, including the A extension's atomic operations, which TileLink carries as first-class opcodes rather than as read-modify-write sequences improvised by the master.
One more port exists that most tours omit: the debug module, through which an external agent over JTAG can halt the core, single-step it, and run abstract commands — reaching architectural state without going through the program. For refinement purposes it is a side door, and the standard treatment is the one L2/05 gives scan chains: state the theorem conditional on the door staying shut, and spec the door separately via the RISC-V debug specification's own register model when it is used.
Statement
The tile's TileLink masters and the debug module, as contracts: what the core guarantees about its requests (proved here), what it assumes about responses (L5's contract, with its latency bound B), and the debug-inactive conditionality stated once.
The instruction port
The I-cache's refill master. Its request-discipline guarantees — Gi1–Gi3, provable as invariant clauses (09 clause 7) — are stated with the other obligations in 11. Assumed in return: the D-beat within B per beat, data valid at the beat, boot-region reads return F's contents (L5's A4, with the split between bridge-proved and far-agent-assumed marked there).
The data port
The data-side master; its guarantees Gd1–Gd4 are stated in 11, and the assumed half mirrors the instruction port's.
The debug module
The standard debug architecture: a debug module on the peripheral bus, driven by a debug transport module that terminates the JTAG pins, with halt-request/resume/abstract-command machinery reaching the core. Two facts shape the treatment. First, the module's register model is imported — the RISC-V debug specification defines dmcontrol, abstractcs, and friends — so unlike a bespoke debug unit there is a document to be faithful to rather than semantics to author. Second, the module is also a bus master: system-bus access lets the external agent read and write memory directly, which is one of the load paths for F (L5/03). The refinement is stated conditional on debug-inactive (no halt request in flight, no abstract command executing); the conditionality is one hypothesis, threaded once through 08's statement. The hardware-side obligation that discharges it — inactive means invisible — is the non-interference lemma stated in 11.
What the absences buy
No coherence protocol in flight (the tiny configuration's bus topology is incoherent by construction), no store buffer, no miss queues beyond the single refill: the memory system is a small set of masters with static discipline, and the whole arch-class topic "memory hierarchy" reduces to the contracts above plus one latency bound. The counterfactual — caches with miss queues, store buffers with forwarding, a coherence protocol — is priced in 05's table; this file is the demonstration that the generated machine stays on the cheap side of it.
Effort
Days; the structural description is small — the two masters and the debug side door as objects, plus what their absences buy. The proof weight is in the guarantee clauses and the non-interference lemma, which are the edge, 11.
L3/07 — Traps and interrupts
Node: this file is the object — the trap/interrupt mechanism (the imported machine-mode machinery, the interrupt sources, the synchronous surface). The proof that it refines the machine-mode ISA is the edge, 12.
Background
An interrupt is the mechanism by which the outside world interrupts a running program: a device raises a wire, and the processor — at a suitable boundary — suspends the program, saves enough state to resume it, and jumps to a handler. RISC-V specifies this machinery in its privileged architecture: on a trap (an interrupt, or a synchronous exception like an illegal instruction), the machine saves the interrupted pc to mepc, records the reason in mcause, stacks the interrupt-enable bit inside mstatus, and jumps to the handler address in mtvec; the handler returns with mret, which unstacks and resumes. Interrupt delivery is governed by two CSRs — mip (which interrupts are pending) and mie (which are enabled) — gated by the global enable bit mstatus.MIE. The core implements exactly this machine-mode machinery, so the specification is imported — the Sail privileged subset, ratified standard — not authored.
The system side is the standard shape as well, which is worth appreciating as a cost that didn't materialise: all three standard interrupt lines are live. The CLINT drives the software-interrupt and timer-interrupt pending bits (msip from its software-interrupt register, mtip from the mtime/mtimecmp compare), and the PLIC drives the external-interrupt bit, funnelling its device sources (the UART) through gateways, priorities, and a claim/complete protocol. Both devices sit behind the memory map, so their register semantics are device models — L5/03's business — while the core-side delivery machinery is entirely the imported spec. What remains authored at the core is only the custom control CSRs (L4/01), and their spec must say they never alter delivery semantics.
The synchronous side is the standard's full surface: illegal instruction, misaligned load/store, access faults (a denied TileLink response does arrive as a precise access-fault trap — the error device makes even unmapped addresses well-behaved, L5/03), breakpoint, and the environment calls. The exact per-cause behaviour is the choice register's to record (L4/02); this chapter's lemmas consume it.
The proof that this machinery refines the machine-mode spec — the six proof obligations, the anchors against spec-side error, and the delivery split — is the edge this mechanism carries, 12.
Effort
Short; the mechanism is imported standard machinery — the Sail privileged subset plus standard interrupt sources. The refinement proof and its cost (mostly standard months, with the S3 residue) are the edge, 12.
L3/08 — The refinement statement
Background
How do you prove that one machine correctly implements another? The two machines don't even step at the same rate: the ISA executes one instruction per step, while the hardware spreads each instruction across pipeline stages, retiring one per cycle at best and pausing for stalls, cache misses, and flushes — with the in-flight remainder corresponding to no ISA state at all. The technique that bridges this — the central proof technique of the entire book, used here at full strength — is the simulation proof, best understood as a picture before formulas. Here it is, for a run in which one instruction retires, the pipe then stalls twice (an interlock, then a cache miss), and a second instruction retires:
ISA ····▶ A ────step────▶ B ······························▶ B ────step────▶ C ▶ ····
▲ ▲ ▲ ▲
α │ α │ α │ α │
RTL ····▶ s₀ ──cycle───▶ s₁ ──cycle───▶ s₂ ──cycle───▶ s₃ ──cycle───▶ s₄ ▶ ····
(retire) (stall) (miss refill) (bubble) (retire)
The struts are the abstraction function α, which reads the architectural state (register file, program counter, CSRs) out of a hardware state at the retirement boundaries — the cycles where the WriteBack stage completes an instruction and the machine's committed state is architecturally clean. Between retirements the hardware is mid-flight everywhere at once; those cycles are stutters, and they are characterised not by α but by the invariant I — the description of the reachable in-flight states, 09's subject and the layer's real work — together with the measure m, a counter that strictly decreases across every stutter and thereby forces the next retirement within bounded time. (Without it, a machine could stall forever, implementing nothing while never being caught.) The trailing arrows continue the ladder in both directions. The proof obligation is local, one cell at a time; induction tiles the cells into the global statement: every run of the hardware, viewed through α, is a legal run of the spec. A global claim about infinite behaviours is bought with finite, checkable, per-cell facts — that trade is the whole magic of the method.
Statement
⟦RTL⟧ ⊑ ISA: a stuttering simulation whose shape is fixed now, even though its invariant is future work —
∃ I ⊆ States(⟦RTL⟧) the invariant [02]
∃ α : I → States(ISA) abstraction, read at retirement
∃ m : I → ℕ the measure
init: reset states ⊆ I ∧ α maps them into ISA reset states
(X ⊑ spec reset nondeterminism — L3/03)
step: s ∈ I, s →_rtl s' ⟹ s' ∈ I ∧
either α(s') = α(s) ∧ m(s') < m(s) (stutter)
or α(s) →_isa α(s') (retire / trap / interrupt)
conditional on the bus contract (authored in L5, assumed here), on debug-inactive (06), and stated over the configuration record (L3).
Commit points, α's domain, and the trace port
Retirement is where the pipeline is architecturally honest: when WriteBack completes an instruction, the register file, CSRs, and committed pc are exactly what the ISA says after that instruction. α reads them there. Flushed instructions never reach WriteBack, so a flush is — automatically — a stretch of stutters, and "flushed work has no architectural effect" lands in the invariant rather than in α. (For pipelines generally, constructing α is the famous hard part — Burch & Dill's flushing builds it by symbolically draining the pipe; Manolios's WEB refinement is the standard alternative when flushing fails. An in-order pipe with in-order retirement sits at the tractable end of that spectrum: draining is well-defined and short, with the bypass network priced in the invariant rather than in α.)
α's domain is a choice, and the statement above made it. The lean formulation leaves α partial — defined at retirement boundaries only, with mid-flight states described by I plus "within m cycles of the last retirement" and no architectural readout of their own; this is the form a retirement interface matches (RVFI's discipline), and the one to author. The statement's total α : I → States(ISA) is its completion along the run — α of a mid-flight state is α of its last retirement — well-defined as a function only when nothing architectural is destroyed mid-instruction; on a machine where that fails, the completion exists only as a simulation relation R ⊆ States(⟦RTL⟧) × States(ISA), and the per-cycle cell reads R-preservation instead of α-equality. The two forms prove the same refinement; which is available for this pipe (in-order retirement, writes only at WriteBack) is settled when α is actually written — the first experiment below.
The trace port is the designer-declared anchor. The core exposes retirement events (valid, instruction word, pc, exception status) on its own instruction-trace port — the interface the ecosystem's co-simulation flows check against a golden model. α should be defined to agree with the trace port's semantics: it inherits intent instead of guessing, and it makes trace-based co-simulation runs directly comparable evidence.
The measure is a retirement-gap bound
m bounds cycles-to-next-retirement, and every source of stutter is enumerable and individually bounded:
| stutter source | bound |
|---|---|
pipeline refill after flush (taken branch, trap, mret, fence.i) | pipe depth |
| hazard interlock | writer's remaining stages (≤ pipe depth) |
| iterative shift in flight | ≤ 32 cycles |
| I-cache miss | one burst refill = f(B) — the bus contract's latency bound |
| dBus transaction | f(B) |
Two of those rows are now measured on a real execution (run-sim.sh, which runs the shipped core on a built image and records the retirement-gap distribution at the writeBack commit point). Over 200,000 cycles and ~50,000 retirements the observed gaps are: 3 cycles overwhelmingly — the taken-branch refill of the startup code's idle loop, i.e. the "pipeline refill" row at pipe depth — a small tail at 4–7 for the store sequence, and a handful of large gaps that are I-cache misses. And the cache row's f(B) is not just a shape but a law: sweeping the memory's wait states gives a worst gap that is exactly affine, gap_max = 24 + 8·B, whose slope is the 8-word cache line measured independently in the configuration record — each word of the burst refill pays the bus latency once. The measure's shape and the cache geometry corroborate each other from different directions. (Measured bounds are lower bounds on the true worst case: this is one execution, not a proof. What they establish is that the table's form is right.)
The last two rows are why the bus contract must carry a latency bound: with an unbounded response channel the measure does not exist and the refinement silently weakens from "instructions retire" to "instructions retire if the bus answers." State it conditionally: m exists given the contract's bound B; the SoC proof (L5/B2) discharges B for the actual fabric, with the off-chip serial-link path as the worst case.
Read quantitatively, the table is a worst-case execution time story with one honest complication and one honest mercy. The complication: fetch timing is history-dependent through the cache, so per-instruction bounds do not add exactly. The mercy: the cache is two lines, so the pessimistic miss-every-line bound is nearly tight, and a sound program-level bound is Σ w(i) with w charged at miss-inclusive rates — still literal addition, just of slightly larger constants; the interlock stalls depend only on the adjacent instruction pair, so they compose pairwise. Program-level bounds carry the same three side conditions as any WCET claim: B(config), trap-freedom along the path, and interrupts — handled by masking (mie, exact, the right mode for critical sections) or by response-time analysis on top. The load-bearing consumer is L5/04's graceful death: t_holdup ≥ t_epilogue^max prices a physical capacitor off the worst-case cycles of the quiesce path (IRQs masked) times a clock-period upper bound taken over the decaying-rail trajectory — the oscillator slows as the supply sags, so the seconds-per-cycle factor uses the slowest clock the epilogue traverses.
Traps and interrupts enter the statement, not just the proof
The commit case is a disjunction over the spec's step kinds: an ordinary retirement, or a trap/interrupt step of the machine-mode spec (L4) — mepc/mcause/mstatus updated and control redirected to mtvec, atomically. Preemption points are retirement boundaries: an instruction in flight is either retired or flushed, never half-committed — itself an invariant clause (07). Interrupt arrival is environmental; the measure's decrease is unconditional because a pending interrupt forces a trap step, not a stall.
What is deliberately not in the statement
No timing (L1 discharged it), no probabilistic terms (conditioning happened at the overview's †-lines), no bus implementation (contract-abstracted), no netlist (L2 licensed the RTL view). The statement is purely a relation between two transition systems — which is the payoff of the entire tower below it.
Obligations
- Write α against the trace-port definition; check it on simulation traces before any proof (cheap oracle).
- Settle α-total vs. R-relational for this pipe by writing the completion.
- The stutter-source table's bounds, extracted from the emitted RTL (with 05's stage-graph extraction), and the conditional-on-
Bformulation withBnamed as an L5 deliverable. - The miss-inclusive
w(i)table, validated against simulation; exported for L5/04's epilogue sizing.
Effort
Weeks to state precisely; stating it first is the layer's own first experiment, since every downstream choice (invariant clauses, IC3 targets) types against it.
L3/09 — The invariant
Background
The simulation cell of 08 is stated "from any state satisfying I" — and that qualifier is not a convenience, it is load-bearing. From a truly arbitrary state the cell is false: a state where the Execute stage's payload says "branch" while its control bits say "store" will step to something no ISA transition explains. Such states can never actually arise — but "can never arise" is a claim about all reachable states, and the reachable set of a machine with thousands of flip-flops is beyond any computation. The escape is one of the oldest ideas in program verification, due in essence to Floyd and Hoare: don't compute the reachable set — describe a superset of it that maintains itself. An inductive invariant is a predicate I such that (a) all initial states satisfy it, and (b) any single step from a state satisfying it lands in a state satisfying it. Induction then gives reachable ⊆ I for free, and the simulation cell only ever needs to be proved from I-states.
The catch — and the reason this chapter is flagged as the irreducible heart of the project — is that I must be invented, and the invention is forced to encode genuine understanding of the design. The property you want is almost never inductive by itself: "the retired state matches the ISA" says nothing about a half-finished shift or a mid-refill cache line, so a step from such a state cannot be shown to preserve it. To close the induction you must strengthen the invariant — add clauses describing every piece of in-flight machinery precisely enough that each clause's preservation follows from the others. Every stage register the generator emitted, every interlock corner, every implicit assumption in the RTL must be named in a clause. That is why proof effort tracks what this book calls invariant entropy — the number of independent design decisions I must describe — rather than gate count or spec size.
Invention is not entirely unaided, though, and calibrating the aid is this chapter's practical plan. Model checkers are tools that try to prove properties of finite-state systems automatically; the classical kind explores states exhaustively (dead on arrival here), but the modern kind — IC3 is the standard algorithm name — works by guessing and repairing invariant clauses: it accumulates small clauses, checks inductiveness with a SAT solver, and refines on failures. On the shallow, structural parts of an invariant (pipeline control sanity, handshake discipline) such engines routinely succeed unaided; on clauses expressing what a stage payload means, they mostly fail — that content is semantic, and no amount of clause search recovers it. The economics are favourable either way, because an inductive invariant is a certificate: whatever untrusted engine produced it, checking it means checking three entailments, each a SAT query with a machine-checkable proof. Let the engines mine the tedium, pay trust only at the checker, and measure where the boundary actually falls — that measurement, not any estimate, determines this layer's true cost.
Statement
Invent I — the irreducible content of the whole project, the one artifact no tool, decision procedure, or amount of compute produces. Everything else in the stack is either mechanical, certified, or measured; this is the part that is thought.
Invariant entropy, the governing quantity
Proof work is proportional to neither spec size nor gate count but to invariant entropy — the number of independent design decisions I must name. The operational test: a decision is free if the proof is generic over it or its consequence is recoverable by running the machine; expensive if I must describe it. Free here: datapath width, adder topology, decoder encoding. Expensive, and present: the pipeline's occupancy discipline, the interlock rule, the flush protocol, the two cache lines. Expensive and absent — forwarding networks, speculative state, miss queues, TLBs (05's table) — is what keeps the total moderate: the machine's entropy concentrates in one in-order pipe with the simplest possible hazard rule.
The clause sketch
What I must actually say, per the anatomy:
- Pipeline control sanity: the stage valid/stall/flush arbitration bits are mutually coherent (no stage simultaneously firing and flushed; stalls propagate upstream contiguously).
- Per-stage payload coherence: each stage's control bundle equals the decode of the instruction it travels with — the generated decoder's output, replayed. Wide, shallow, per stage.
- In-flight semantics, per station: the iterative mul/div unit's accumulator holds the partial result with its counter consistent; a mid-flight memory transaction's address/data registers hold what the retiring instruction requires; an open LR reservation is consistent with the reserving instruction; the fetch front end's pc chain is consistent with the committed pc plus in-flight redirects.
- Bypass/interlock correctness: every value routed sideways through the bypass network equals the value its producer will write back; where bypassing cannot serve (load-use, mul/div in flight, CSR effects), no reader advances past the unresolved writer.
- Flush correctness: instructions younger than a taken redirect never reach WriteBack; the redirect target is the one the retiring step computed.
- I-cache agreement: every valid line equals backing memory at its tag — modulo the
fence.iwindow, whose obligation is exactly that software cannot observe the staleness. - TileLink transaction coherence: channel legality, source-ID bookkeeping, refill-burst accounting on the fetch side (06).
- CSR coherence:
mstatus.MIE/mie/mipconsistent with the spec state; the PMP configuration consistent with the checks the access paths apply (07). - α-well-definedness: at retirement boundaries, the architectural readout is total.
Clauses 1, 4, and 7 are exactly the local control invariants IC3-class engines find unaided; 2 is wide but mechanical; 3, 5, 6 carry the semantic content the human supplies; the glue — that the clauses jointly imply the retirement step matches the ISA — is human work.
The automation calibration
An inductive invariant is a certificate: init ⊆ I, I ∧ T ⊆ I', I ⊆ P — three queries, each LRAT-checkable. So untrusted engines may invent clauses and we pay only for checking. The plan: build the invariant-checking path first, throw IC3 at clauses 1/4/7 phrased as safety properties, and measure the hit rate before hand-authoring anything. Expect the engines to clear the structural majority and die on clauses 3/5/6 — but measure, because the split determines the layer's real cost.
The state space forbids the alternative outright: reachability and model checking over the full machine are dead on arrival; refinement plus induction is the only game (L2/02 said the same from below).
Structure of the work
The pipe seams the authoring naturally: clause families attach to stages and to plugins (05's tour is the index), so the invariant parallelises across stations in a way a monolithic state machine would not. The per-instruction quantification lives in 10; this file owns the machine-wide skeleton those obligations plug into.
Obligations
- Phrase the clause sketch as machine-checkable predicates over
⟦RTL⟧'s state. - The IC3 calibration run; record the found/failed split.
- The glue lemma:
I+ retirement transition ⟹ the ISA step (with 08).
Interface (up). This invariant is the S-refine seam (iface_L3, rtlBeh = archBeh): the arrow from RTL to ISA. L3/08's cosim oracle — 1631 instructions matched against spike — is its executed precursor, and the gap between that oracle and the theorem is exactly the invariant α developed here.
Effort
The heart of the layer's estimate — yet the volume is small: the genuinely irreducible content is plausibly a few hundred lines of clauses plus the glue lemma. The years are the surrounding machinery (symbolic simulation, bitvector automation, the stuttering framework), not the thinking.
L3/10 — The per-instruction obligations
Background
With the invariant (09) holding the machine's global coherence, what remains is to check each instruction individually: that the hardware's handling of add matches the spec's add, the hardware's beq matches the spec's beq, and so on through the instruction set. The technique that discharges each one is symbolic execution: instead of running the hardware on particular values, run it on variables. Start from an invariant state with the instruction at a known station and symbols in the registers, walk the machine to the instruction's retirement, and the final state comes out as a formula — "register rd now holds x + y, the committed pc advanced by 4." The obligation is then that this formula equals what the Sail clause computes, which is a question about fixed-width integers (bitvectors) that SMT solvers — SAT solvers extended with built-in theories of arithmetic — answer mechanically. One symbolic run covers all 2⁶⁴ concrete operand pairs at once; that is the entire trick.
The reason this chapter can promise "a lot of lemmas, almost no thinking" is a structural dividend from the invariant: the bypass/interlock clauses cut every dependency between instructions at the operand read. Whatever ran previously, an instruction's sources equal the committed (or correctly-forwarded) values — so each per-instruction lemma starts from the same characterised conditions, independent of its neighbours, and the set of lemmas is embarrassingly parallel. The cost structure follows: build the symbolic-execution harness once (the real expense), then each additional instruction is a template instantiation. Per-case thought reappears only where an instruction contains an internal loop — the iterative multiplier/divider — in the form of a small loop invariant, the classic Floyd–Hoare pattern in miniature.
Statement
The wide-shallow quantification: for each instruction of the configuration record, the retirement case of 08's cell — from an invariant state with this instruction in flight, the retiring effect equals the Sail step. High spec entropy, near-zero invariant entropy: a lot of lemmas, almost no thinking, and most of it plausibly automatable per instruction.
The obligation classes
Decode — the bridge between L4's Sail decoder and the generated decoder of the emitted core (with the RVC expander composed in front: a 16-bit word's obligation goes through the expansion function first, checked against the standard's own table):
∀ word w: the control bundle produced for w = image of Sail-decode(w)
(exhaustive: every word decodes or raises the illegal trap;
exclusive: one instruction class per word)
Per-encoding, SAT-shaped, across both instruction widths, plus the trap sweep: every word the decoder rejects must reach the illegal-instruction trap step (F/D, the S-mode space, and the reserved regions minus the UB set), and absent-CSR reads trap at execute. The words in L4/03's spec-UB set — reserved encodings the decoder accepts — generate no obligation at all: the spec's havoc step is refined by anything, which is precisely why the UB clause exists.
ALU and comparisons — word-level lemmas per operator: the Execute-stage result equals the Sail arithmetic — bitvector identities, discharged by SMT; the netlist structure of the adder was L2/05's business and never appears here. Branches: the comparison drives the redirect exactly as Sail's branch semantics, with the flush obligation carried by the invariant's clause 5.
Multiply/divide — the place 09's clause 3 has real content: the iterative unit's loop needs the invariant acc = partial(x, y, counter) with the measure ticking; the lemma composes the loop to the Sail mul/div/rem semantics, division-by-zero and overflow cases included (the standard fixes both — no traps, defined results).
Loads/stores/atomics — address generation, byte-lane select and sign/zero extension vs. the Sail memory access, alignment traps per the spec's choice, the PMP check on every access, and the bus's role contract-abstracted — the lemma says "the value the contract returns for this address," never what RAM did. The A extension adds the AMO read-modify-write lemmas (the atomic ALU's operation table vs. Sail's) and the LR/SC pair against the recorded reservation choice (L4/02).
CSR instructions — csrrw/csrrs/csrrc and immediates against each implemented CSR's semantics: the machine-mode registers, PMP, and counters from the Sail import, and the custom control CSRs against the residual authored spec (L4/01). Reads of the absent CSRs belong to the trap sweep.
Fences — fence is a no-op on this single-hart, in-order machine (a lemma, not an assumption — and it must survive the device-memory ordering question at the TileLink port); fence.i invalidates the I-cache and refetches — the obligation pairs with the invariant's cache-agreement clause.
Why this class is cheap per element
Each lemma is: symbolic execution of one instruction's pipeline transit from an I-state, compared against one Sail clause — bounded, automatable, independent of every other lemma, with the interlocks supplying the independence. The cost is proportional to the number of instructions, not to any interaction between them.
Obligations
- The decode equivalence + the unimplemented sweep (gated on the configuration record and L4's Sail import).
- Per-class lemma templates: one worked instance each (an ALU op, a shift, a load, a CSR op), then mechanise the remainder.
- The
fence.ilemma, jointly with the invariant's cache clause.
Effort
Months, dominated by building the symbolic-execution harness once; per-instruction marginal cost should approach mechanical. If it does not, something is wrong with the harness, not the instructions.
L3/11 — The bus and debug obligations
Edge: this file is the theorem the node carries — the request-discipline guarantees the core proves, entering 09's invariant as clauses, the interface half of the L3→L4 refinement edge. The ports and debug module as structure are the node, 06.
The core's half of the port bargains, as the clauses it guarantees. What the ports are — the instruction and data masters, the debug side door, and what their absences buy — is the node, 06; here are the promises those masters prove.
The instruction-port guarantees
The I-cache's refill master. Guarantees, provable as invariant clauses (09 clause 7):
Gi1 refills are well-formed: line-aligned base, legal size, a single
source ID per outstanding refill, beats accepted per the handshake
Gi2 a refill, once started, is not abandoned (except by reset)
Gi3 fetch addresses are execute-region addresses (no device-region fetches)
The data-port guarantees
The data-side master:
Gd1 requests are legal TileLink: aligned to their size, permitted opcodes,
source IDs within the negotiated set, stable until accepted
Gd2 byte masks well-formed and consistent with the retiring access width
Gd3 no speculative writes: a store's request issues only for a retiring store
Gd4 atomic requests carry the correct AMO opcode and operand; an SC issues
only against its own valid reservation
Gd3 is where the pipeline meets the memory: flushed instructions must not have touched the bus.
The debug non-interference lemma
The hardware-side obligation for the debug module is only that inactive means invisible — a non-interference lemma of the same shape as 07's masked-interrupt one. It discharges the debug-inactive hypothesis (no halt request in flight, no abstract command executing) that the node (06) threads once through 08's statement.
Obligations
- Gi1–Gi3 and Gd1–Gd4 as invariant clauses, with the simulation oracle re-run against this core first (execute a real image with the clauses asserted continuously; a clause that survives a real run is worth stating, and one that does not is found here rather than in a proof attempt).
- The debug non-interference lemma, and the debug-inactive hypothesis threaded through the statement.
- The burst-length/line-size agreement between the cache and the refill master (one constant, two readers — pin it in the configuration record).
Effort
Weeks; the protocol clauses are IC3-shaped. The value is in the statement discipline — every later surprise about "what does the bus promise" lands here or in L5, never diffusely.
L3/12 — The trap and interrupt obligations
Edge: this file is the theorem the node carries — the proof that the trap/interrupt machinery refines the machine-mode ISA, part of the L3→L4 refinement edge. The trap/interrupt mechanism as an object is the node, 07.
Statement
Prove the trap and interrupt machinery refines the machine-mode spec: the imported Sail subset for everything standard. The mechanism itself — the CSRs, the CLINT/PLIC wiring, the synchronous surface — is the node, 07. The proof obligations:
- Trap-entry atomicity:
mepc/mcause/mstatusupdate and the redirect tomtvechappen as one spec step — no observable intermediate, no partially-retired instruction underneath (08's disjunction stays clean). mretunstacks and redirects exactly per the spec.- Preemption only at retirement boundaries: an instruction in flight is either retired or flushed, never half-committed — an invariant clause (09), and the reason the simulation cell needs no third case.
- Delivery gating: a trap step is taken exactly when
mstatus.MIE ∧ (mip ∧ mie) ≠ 0at a boundary (or a synchronous exception retires); no lost interrupts — the persistence of a source lives in the CLINT and the PLIC's gateway/pending machinery (a device-model property plus software's claim/complete discipline), hence aSys(F)-level claim, split explicitly. - Precise exceptions on the memory path: a faulting access (denied response, misaligned, PMP-refused) traps with the correct cause and no side effect — the lemma family where the memory system meets the trap machinery.
- Non-interference: with
mstatus.MIEclear and no traps raised, behaviour is exactly the trap-free machine — the lemma that lets every other L3 file ignore this one, quarantining the risk.
Anchors against spec-side error
The imported half is anchored by the standard's own artifacts: the riscv-arch-test suite run against the imported model, and RVFI-style retirement checking for what "an interrupt retired correctly" observably means. The device half (CLINT/CLINT-compare semantics, PLIC claim/complete) is anchored by the de-facto and ratified documents those devices implement, formalised first and then diffed against the generated RTL. The working-software corpus — the ecosystem's own interrupt-handling code and test suites — is what the composed spec must make correct; extracting the interrupt-facing paths and running them against the draft spec is the standing check.
Obligations
- The six proof obligations above, non-interference (6) first.
- The delivery split stated precisely: core-side gating proved here, source-side persistence delegated to L5/03's CLINT/PLIC models by name.
- The software corpus: extract interrupt-facing code paths from the ecosystem's test programs; run each against the draft spec.
Effort
Months, but mostly standard months: the imported half rides the Sail model and existing compliance machinery, and the interrupt sources are standard devices with documents. The open-ended risk — spec fidelity for the small authored residue — is priced in the ledger as S3.
L2 — Netlist ↔ RTL equivalence
Node — the synchronous machine: flops plus combinational logic over a Boolean vector,
Mealy(N)(00), well-defined only under the standing well-formedness hypothesis that survives the digital crossing (01). Edge up — the CEC (a horizontal equivalence, not an abstraction step):Mealy(N) ≈ρ ⟦RTL⟧— the netlist machine equals the RTL machine under a register correspondence ρ, via licensed deletions (02), ρ (03), the equivalence certificates (04), and the hard cones (05). Note the proof-order inversion: this edge consumes L3's object⟦RTL⟧, so it is proved after L3 despite sitting below it in the tower — numbering is artifact altitude, not logical dependency. (The book's top-down reading order happens to agree: L3's chapters precede these.)
Background
Synthesis compiled the emitted RTL into the netlist the flow hardens: 51,359 standard-cell instances (drawn from 96 cell types) with mangled names and aggressively restructured logic, growing further in place-and-route as clock trees, hold buffers, and physical cells are inserted. This layer proves the compilation preserved meaning — not by trusting the tool, but by checking certificates the tool's run can be made to emit. The route: define the netlist's semantics (00), check it is electrically sane (01), delete the instances that compute nothing under explicitly licensed theorems (02), extract the register correspondence from the flow's own run (03), and prove per-register-boundary equivalence by certificate, with exploratory SAT confined to where no certificate exists (04, 05).
Statement
There is a register correspondence ρ — a bijection between RTL state elements and netlist flops, up to opt_dff-eliminated constants and resizer cloning (its existence is exactly F5) — such that, after the three licensed deletions,
Mealy(N) / (delete PHYSICAL · collapse clock to the global tick · collapse buffers)
is bisimilar under ρ to ⟦RTL⟧, from matched reset states.
Established by certificates, with exploratory SAT confined to where no certificate exists. The N here is the shared object of the overview's tower: one parse of ChipTop.mapped.v (and its post-P&R successor) serves L1's LVS target, L1's STA subject, and this theorem's left-hand side.
Subcomponents
| status | ||
|---|---|---|
| 00 | N and Mealy(N) — ~20-production format, ~30-line semantics, S1 derived not posited | weeks; build first |
| 01 | W1–W4 — the semantics' preconditions, measured on the hardened netlist | checker to re-run |
| 02 | The physical/clock/buffer deletions, each with its licence; the SRAM macros as holes with open collateral | weeks |
| 03 | ρ and F5; reproduce-the-synthesis as the decision procedure | the project's first experiment |
| 04 | CEC by certificate: ABC's trail instrumented, NPN library verified once, LRAT residue | months |
| 05 | Arithmetic by width-generic template theorems, PAC demoted to trail-loss fallback; the contingency table → certificate-of-absence | template inductions: weeks |
Interfaces
Consumes: the hardened netlist, RTL, ⟦·⟧ (L3), the synthesis flow, per-cell Boolean functions (L0). Exports: to L1, N with identified registers/clock/reset; to L3, the licence to reason about ⟦RTL⟧ instead of the netlist.
Axioms introduced
None surviving. S1 (netlist semantics) is derived — per-cell Boolean shadows (L1/06) + the bridge theorem (M5) + LVS (L1) yield it as a conclusion (00) — and X1 (parser fidelity) is an ordinary verified-parser obligation; both are in Axioms' Discharged table. F5 (does ρ exist?) is the layer's load-bearing unknown, decidable by 03's experiment.
The layer's shape
Everything reduces to the register boundary. Only ports and state elements need correspondence — internal restructuring is exactly what CEC absorbs — so the RTL-to-netlist gap is the question "do the flops correspond?" (F5), and every other file supports answering or exploiting it: 00–01 make the two sides comparable objects, 02 shrinks the problem 13×, 04 checks the cones between corresponded registers, 05 handles the cones where checking needs a different calculus. The methodological corollary: never reconstruct word structure from bits — words live on the RTL side of ρ; and never compare against an independently-written model — structural similarity is what makes any of this tractable.
The proof, structured
Take one tiny sequential circuit — a flop q whose next value is ¬((a·b)+c) — and follow that object down through the layers: a behavioural expression, then a cell netlist, then transistors.
Definitions.
R,I,O— the RTL register bits, input bits, output bits.⟦RTL⟧(from L3) — a Mealy machine on states𝔹^R: a next-state functionδ_r : 𝔹^R × 𝔹^I → 𝔹for eachr ∈ R, and output functionsλ_o.N— the hardened netlist;Fits flip-flops. Each cell instance denotes a Boolean function, its Liberty entry.N_f : 𝔹^F × 𝔹^I → 𝔹— the function of flopf’s combinational fan-in cone (cell functions composed along the nets). These defineMealy(N).ρ : R → F— a bijection;ρ(r)is the flop holding bitr. For a netlist states ∈ 𝔹^F,s∘ρ ∈ 𝔹^Ris the RTL state read off the flops.s0, …, s7— the intermediate networks at the boundaries of the synthesis (ABC) script, the eight snapshotscec/trail-cec.shrecords. Flops are mapped (dfflibmap) before ABC, so everys_kis a combinational network over the same flop boundaryF— this is the no-retiming fact.s0= the front-end output (proc/flatten/memory/opt/techmap); thens1afterfx,s2aftermfs,s3afterstrash,s4after the rewrite/refactor/balance block,s5after thefraigsweep,s6afteramap,s7after&dch/&nf. Eachs_kthus defines a cone function per flop;s_k ≡ s_{k+1}means these agree for every flop.
Goal. for every r ∈ R (write f = ρ(r)) and all (s, i) ∈ 𝔹^F × 𝔹^I: N_f(s, i) = δ_r(s∘ρ, i) (and N_o = λ_o under ρ, for outputs). A combinational identity — the one-step ρ-commutation; the lift to trace equivalence is L3’s (foot of proof).
Each leaf (▸) is a tool run whose output is a certificate we can independently check, or a checker we assert correct. Status: ● holds · ◐ partial · ○ open.
Proof.
- 1.
Mealy(N)is well-defined — eachN_fis total. ◐- 1.1 · 00 each cell denotes its Liberty function (this fixes the cone composition; call it S1). ▸
celltopoderives each library master’s function from its transistor switch-network and asserts equality to Liberty; the derivation is the certificate (the conducting-path formula), independently checkable. ● 311/437 masters · ○ flops, tristate. - 1.2 · 01
N’s combinational graph is acyclic and single-driven (W1–W4), so composing 1.1 along the nets terminates in a totalN_f. ▸ the W1–W4 checker — finite structural checks onN; checker asserted correct. ◐
- 1.1 · 00 each cell denotes its Liberty function (this fixes the cone composition; call it S1). ▸
- 2.
ρis a bijectionR → F(F5). ▸ 03 the flop→name table read from the Q-nets; certificate checkable as injective and ontoR. ● 10,873/10,915. Figure:DFF≙ registerq. - 3.
N ≡ N′cone-wise, whereN′drops the physical / clock / buffer cells. ▸ 02 per class: physical cells drive no logic net; buffer/clock cells have function = identity (by 1.1) — one checkable certificate each. ◐ - 4.
N′_f(s, i) = δ_r(s∘ρ, i)— via the pass trail. Figure: theAOI21cone computes¬((a·b)+c).- 4.1 adjacent snapshots are cone-equal,
s_k ≡ s_{k+1}. ▸ 04 their miter as CNF, UNSAT byminisat(modules) / ABCcec(die); exact passes one miter each,mfs6,172. The CNF is the certificate; correctness = an independent solver’s UNSAT (miter polarity falsification-tested). ●s0 … s7. - 4.2 hence
s0 ≡ s7(4.1, transitivity); ands7 ≡ N′, since the trailingbuffer/upsize/dnsizeare function-preserving and the P&R inserts are exactly step 3’s deletions. ● - 4.3
s0’s cones equalδ(the front endRTL → s0:proc/techmap/opt). ▸ no certificate yet. ○ - ⇒ 4.2 gives
N′_f =(s0-cone); with 4.3,= δ_r. Conditional on 4.3. - 05 arithmetic cones (mul / div) take the same 4.1 equalities via width-generic template theorems, where SAT starves. ◐
- 4.1 adjacent snapshots are cone-equal,
- 5. Goal.
N_f =(by 3)N′_f =(by 4)δ_r(·∘ρ); well-defined by (1), quantified over all ofRby the bijection (2). ∎ Sound modulo the open leaves 4.3 (front end) and the 1.1 master-coverage gap.
Lift (L3, not here). With the reset-bit certificate reset_f = reset_r (03, ○; the IBuf unreset residual is its failure mode), the Goal lifts to Mealy(N) ≈ρ ⟦RTL⟧ by one cycle-induction step in L3 — trivial because ρ shares the state.
Open problems
- F5 — run 03's reproduction; both outcomes are results.
- The ABC trail patch and checker (04) — the cheapest site anywhere in the project for the congruence-certificate architecture.
- The mul/div parameter check (05) — confirms the multiplier stays iterative, keeping the hard problem class away.
First experiments
Instrument the synthesis (03) — the flow is ours to re-run, so ρ is logged, not excavated. Alongside: promote W1–W4 to lemmas (01), and state the SRAM macro contracts (02).
Effort
6–9 months; the most likely place for an early concrete result after L1's SDC work. Cost scales with the certificate trail length, not the design size.
Reading
Kuehlmann/Brand lineage on SAT sweeping; ABC's rewrite/refactor/resub. Kaufmann & Biere on PAC certificates for multipliers. CompCert for the verified-pass vs validated-pass calculus — they validated register allocation for exactly the reasons 04 validates the rewrite trail.
L2/00 — The netlist object and its Mealy semantics
Background
Between the RTL a human wrote and the geometry the fab printed sits the netlist: the design expressed as a list of gates and the wires connecting them. It is produced from the RTL by synthesis — a compiler, in every meaningful sense: it parses the Verilog, maps the described logic onto a fixed vocabulary of available gates, and optimises hard along the way, restructuring the logic beyond recognition while (one hopes) preserving its function. The gate vocabulary is the standard cell library: a catalog of a few hundred pre-designed, pre-characterised primitive circuits — NAND gates, inverters, flip-flops, multiplexers, each in several drive strengths — provided with the fabrication process. Everything computational on the die is an instance of one of these cells; this design's synthesis netlist has 51,359 of them, drawn from just 96 cell types, and place-and-route adds more (clock buffers, hold-fix buffers, physical cells) before the netlist is final.
The netlist's file format is structural Verilog — the same language as the RTL, but stripped of everything programmatic: no always blocks, no assignments, no control flow, just instance declarations ("here is a NAND2 named _04531_, its pin A connects to net _1234_...") repeated a few hundred thousand times. Where the RTL is a program, the netlist is a parts list with a wiring diagram, and its semantics is correspondingly simpler to define — which is why this chapter is the cleanest formal artifact in the book.
That semantics is a Mealy machine: the classical mathematical form of a clocked circuit, consisting of a state (here, one bit per flop — flip-flop, the library's storage cell), a next-state function, and an output function. Reading a Mealy machine off a netlist works because the netlist separates cleanly into its sequential cells (the flops — which cells those are is declared in the library, a lookup rather than an inference) and everything else, the combinational cells, which form a DAG — a directed graph with no cycles — from flop outputs and input ports to flop inputs and output ports. One clock cycle means: evaluate the DAG in dependency order, each cell applying its little Boolean function; then update every flop simultaneously with the value at its data pin. The preconditions that make this well-defined (no cycles, exactly one driver per wire, nothing floating) are precisely the well-formedness checks of 01.
Statement
Define N and Mealy(N) — the shared object of the overview's spec tower and the left-hand side of this layer's theorem.
One parse, three consumers
N = ⟦ChipTop.mapped.v⟧ (and, for the physical layers, its post-P&R successor) under a single parser. The same object is: L1's LVS target (N_intended), L1's STA subject, and this layer's left-hand side. That identification is used silently everywhere and must be established once — it is X1's obligation, a verified parser for a deliberately tiny language.
Structural Verilog is a file format, not a programming language: module instantiations, wire declarations, port connections — ~20 productions, no always, no assignments, no scheduling, no delta cycles, no X literals. The admissible-subset move from L1/00 (GDS) applies again: parse exactly what production output uses, reject the rest.
The semantics, in outline
State = Flop → 𝔹 (5,774 bits at this hierarchy level)
Input = Port_in → 𝔹
δ, λ = topological evaluation of the combinational DAG through
each cell's Boolean function (L1/06's (A)), then flop update
~30 lines of definition. Its preconditions are exactly 01's checks: acyclicity (W3) makes the topological evaluation well-defined; one-driver-per-net (W1) makes net values functions; no floating reads (W2) closes the evaluation; inertness (W4) lets the physical cells drop out of State entirely.
Registers are lookup, not inference. The library declares which cells are sequential and which pin is clock/data/reset/enable — identifying State is a table join, not pattern recognition. Clock and reset network identification is mechanical reachability (L1/10's cleanliness check).
What this semantics is, epistemically
Two facts that took the project a while to get right:
S1 is derived, not posited. "The netlist's Mealy semantics is the right semantics" was originally an axiom; it is now the conclusion of the physical stack — per-cell Boolean shadows (L1/06) + the bridge theorem (M5) + LVS (L1) yield it. This layer consumes that conclusion; nothing here assumes it.
The two-valued semantics is the tracked fragment. Mealy(N) over {0,1} describes the machine only inside the bridge theorem's hypotheses; the honest ambient object is the ternary machine over {0,1,X} (L1/03's value lattice), and the two-valued view is entered by X-elimination at reset and maintained by timing closure. Where the RTL deliberately leaves state uninitialised, implementation-X refines the spec's own reset nondeterminism rather than being eliminated — the bisimulation of 03 is stated from reset-reachable states for exactly this reason.
Bits, not words. Mealy(N) is over individual nets; the word structure lives only on the RTL side, and 03 explains why it must never be reconstructed from below.
Obligations
- X1: the verified parser — CompCert-style validated front-end for a 20-production grammar. Standard work, no empirical content.
- The ~30-line semantics, written once, with its four preconditions imported from 01 as hypotheses rather than assumptions.
- The pin-direction table (43 names, declared not inferred —
tools/netgraph.py's table is the prototype) promoted into the semantics as the library signature.
Interface (below). This object is where the physical chain hands off to the functional chain. The S-extract seam is the theorem that the extracted layout — celltopo-grounded cells (L0), routecheck connectivity (L1), LVS device-match — actually is this theNetlist. It composes three certificates that each pass on the scoreboard but that no obligation here joins into one behaviour equality; that composition, not any single check, is the open work.
Effort
Weeks. This is the cleanest formal artifact in the entire stack — the reason the bottom-up route was attractive before L3's census tax was measured — and it should be built early since every other file in L2 types against it.
L2/01 — Well-formedness: checked, not assumed
Background
The Mealy semantics of 00 presumes the netlist is electrically sane, and each sanity condition has a concrete physical failure behind it. A net (wire) is driven by the gate output connected to it; if two outputs drive one net and ever disagree, the result is contention — one transistor pulling the wire toward 1.8 V while another pulls it toward ground, a fight that produces an invalid intermediate voltage and, sustained, a damaging short-circuit current. A gate input attached to a net with no driver is floating: its voltage is set by nothing, drifts with whatever charge leaks nearby, and reads as an arbitrary, possibly time-varying bit. And a combinational cycle — a loop of gates with no flop breaking it — has no settled value to compute; physically it is a feedback loop that may oscillate forever. The checks W1 (one driver per net), W2 (no floating reads), and W3 (acyclicity) rule these out; W4 (inertness) verifies that the cells about to be deleted in 02 genuinely touch nothing logical.
Two pieces of circuit vocabulary appear in the results and deserve a sentence each. A tri-state driver is a gate output with an enable pin: enabled, it drives its value; disabled, it electrically disconnects (the "third state," high-impedance or Z). Tri-states are the legitimate way for several drivers to share one wire — legitimate exactly when the enables guarantee at most one driver is on at a time, which is the question W1 must settle for each shared net it finds. And a ring oscillator is a loop of an odd number of inverters — a deliberately built combinational cycle whose value can never settle, so it oscillates at a frequency set by the gates' delays. It is the standard way to generate a clock on-chip, it lives inside this design's PLL, and it is supposed to violate W1 and W3: it is the one part of the die whose job is to be unstable. The satisfying result below is that the violations found are exactly the ring oscillator and nothing else — the analog island is precisely where the structural checks say it is.
Statement
The four preconditions of 00's semantics, decidable on the hardened netlist by the layer's checker (to be re-run against this flow's output). The tool discipline carries over unchanged: every pin name classified explicitly, and the checker exits non-zero on an unknown pin rather than guessing a direction, since a misclassified output silently turns real contention into a clean bill of health.
| check | meaning | result |
|---|---|---|
| W1 | one driver per net | 26 multi-driver nets — all tri-state, all in pll.ringosc; 0 static contention |
| W2 | no floating reads | 1,609 — all at hierarchy/macro boundaries |
| W3 | combinational acyclicity | exactly 1 SCC, 64 nets, entirely in pll.ringosc |
| W4 | physical cells inert | 0 violations |
W1 discharges structurally — and the discharge is idiom-dependent
The contended nets are einvp/einvn pairs with the same enable net on TE and TE_B — complementary polarity, so exactly one conducts, by construction. It is the oscillator's delay-trim multiplexer; no functional reasoning needed. The luck should be recognised as luck: a decoded tri-state bus ("at most one select high") would need a reachability proof over the decoder's state space — L5-difficulty work leaking into a well-formedness check. The general rule: tri-state sharing discharges structurally iff the enables are complementary by wiring; anything else escalates.
W3's expected verdict, and what a hit would mean
This design has no on-die oscillator, so the expected W3 verdict is zero cycles and zero contention outright — there is nothing that should violate the synchronous discipline. Any hit is therefore a finding, not an excision candidate: a cycle would be a generator or synthesis defect, and a multi-driver net a mapping bug. The check's value inverts from delimiting a known analog region to certifying there isn't one.
W2 is a hierarchy artifact with a real residue
Undriven-read reports localise to macro boundaries — nets fed by the SRAM macros' outputs, whose drivers are not standard cells in this file (the unused second-port outputs of the memory macros are the expected bulk). Reducing the raw report to genuine floats needs the macro interface list; expect ~0 residue. It must be discharged rather than waved at: a real floating read is a node with no restoring driver, hence permanently X — outside L1/06's invariant sets, not merely untracked.
W4 caught the tool
First run: 118 violations, all conb_1 — a constant generator (drives HI/LO) misfiled as inert filler. Correcting the classification gave 0 and brought the physical total to exactly 235,566, independently matching Findings' census. The inertness check catching a misclassification of its own configuration is the argument for having it: 02's 85.5% deletion rests entirely on this property.
What W1+W2 buy beyond the semantics
They are the licence to work three-valued rather than four-valued (L1/03): HDL logic's fourth value Z (undriven) is structurally excluded — every net has exactly one driver and every read is driven — so Z is deleted from the value lattice rather than modelled.
The within-cell half of the no-contention condition (PUN/PDN duality) is not checkable at this level — it needs transistor netlists; see L0/06.
Open problems
- Reduce W2 against the macro interface list (an afternoon, given the LEF or module ports).
- Promote the checks from tool runs to lemmas against 00's formal netlist — same computations, checked once inside the proof.
Effort
Done, at tool level. The promotion to proof-level lemmas is days once 00 exists.
L2/02 — The licensed deletions
Background
A newcomer's mental image of a chip — gates computing things — describes a modest fraction of one. The finished layout's instance census tells the real story: alongside the logic sit physical cells, present for electrical and manufacturing reasons — decaps (decoupling capacitors, smoothing the power supply against demand spikes), tap cells (connecting the transistors' silicon wells to the rails to prevent latch-up), fill cells (spacers keeping the fabricated layer densities uniform), and antenna diodes (protecting gates from charge build-up during fabrication) — usually outnumbering the logic outright once fill is inserted. Another large class is the clock tree: the clock signal cannot physically drive thousands of flops from one wire, so it is distributed through a tree of buffers — carefully balanced so every flop sees its edge at nearly the same moment, and including thousands of pure delay buffers inserted only to fix hold timing (this flow's hold repair alone inserts several thousand). Add ordinary signal buffers and inverter pairs, and the logic that L3's semantics actually describes is a minority of what gets fabricated.
For the equivalence proof, all of this must go — the RTL has no counterpart for a decap — but the book's discipline is that nothing is deleted by classification convention. "It's a fill cell, ignore it" is an assumption; "its pins touch only power rails, therefore it cannot affect any logic net" is a theorem, checkable per cell. Each deletion class below carries its licence: the physical cells go by the measured W4 property, the clock tree collapses into the sentence "all flops update together" — a licence that is exactly as good as L1's timing theorem, and conditional on it — and buffer chains collapse by library lemmas (buf is the identity; two inverters cancel).
One more object appears here: the macro. Not everything on the die is standard cells — larger pre-built blocks are placed as opaque units. In this design there are exactly five macro instances of three kinds, and all are the same thing: SRAM arrays (the two data-memory banks, the two instruction-cache data arrays, and the tag array). These are not deleted but become holes in the netlist, each closed by a contract: the macro's promised behaviour (a synchronous memory with the port discipline its datasheet states), assumed by this layer and discharged elsewhere. What makes these holes unusually honest is that the macros come from an open generator: their transistor-level netlists, layouts, and characterisation are all published, so the contract is checkable-by-effort — at transistor level, by L0's machinery — rather than a foundry black box that no analysis can enter. And the obligation is parametric: one proof per macro kind covers every instance and every depth the generator emits, which is why memory size costs area, never verification.
Statement
Reduce the hardened netlist to the instances that carry logical content, with each deletion licensed by one named obligation rather than by classification convention. The synthesis netlist starts at 51,359 cells (10,416 sequential); place-and-route adds the clock tree, hold buffers, and physical cells, and the exact census of the final layout is a measured deliverable of the flow (findings). The classes and their licences:
| class | licence to delete |
|---|---|
| PHYSICAL (decap/tap/fill/diode) | W4: pins touch only rails — purely structural, measured per netlist |
| CLOCK (buffers, gates, delay buffers) | cleanliness (L1/10) + timing closure (M5) ⟹ collapse to the global tick; the clock-gate cells additionally carry L3/02's primitive contract |
| BUF/INV | buf = id, inverter pairs cancel, polarity folds into the consumer's function — library lemmas only |
| LOGIC + SEQ | kept — this is Mealy(N) |
| SRAM macros (5 instances, 3 kinds) | not deleted: holes, closed by parametric contracts |
Two remarks on the big rows. The physical deletion is the largest single simplification in the project and rests entirely on W4's one property. The clock deletion is the bridge theorem's payoff made concrete: the entire tree — including every delay buffer that exists purely to shape the arrival function — vanishes into the sentence "all flops update together," conditional on L1's hypotheses; the deletion is exactly as sound as timing closure is. One genuinely new entry versus a flat design: this netlist's clock tree contains clock gates (the ICG cells L3/02 carved out as primitives), so the collapse must carry the gating condition — "all flops whose gate is enabled update together" — which is the gated-clock soundness obligation L1 owns.
The macro contracts
Per kind, the contract states: a synchronous memory of the given geometry — one read-write port (the second, read-only port of the generator's interface is tied off and its outputs unused, a fact W-checks must see rather than assume), byte write masks where present, one-cycle read latency, disabled-read data unconstrained (matching L3/03's X idiom). Three kinds, three contracts, five instances covered. The discharge routes, in increasing ambition: assume with the published characterisation as evidence (X4-class, the starting point); simulate the published transistor netlist against the contract (the generator's own regression, replayed); prove at L0's level from the published layout — open-collateral analogues of the standard-cell obligations, amortised exactly like them.
What remains
|State| = 2^10416 at the synthesis netlist alone. That number settles methodology once and for all: refinement plus induction with a supplied invariant; never reachability, never model checking. Every plan that begins "enumerate the reachable states" is dead on arrival, which is why L3's invariant is the project's irreducible content.
Obligations
- State each deletion as a theorem over 00's semantics:
Mealy(N) ≃ Mealy(N ∖ PHYSICAL)given W4; the clock collapse given L1 (with the gating condition); buffer collapse given the library lemmas. - The three macro contracts, stated; the tied-off second ports verified structurally; the discharge route per kind decided and recorded in the ledger.
- The BUF/INV collapse must respect 03's ρ — inverter absorption flips polarity, and the register mapping must record per-bit polarity or the CEC will chase phantom mismatches.
- The final-layout census, measured and pinned when the flow closes.
Effort
Weeks for the deletion theorems; the macro contracts are days to state, with their deeper discharge routes priced as optional depth.
L2/03 — The register correspondence ρ (F5)
Background
To compare the netlist against the RTL at all, you must first say which netlist flop corresponds to which RTL register bit — and synthesis has done its best to obscure the answer. The RTL declares reg [31:0] reg_op1; the netlist contains flops named _04531_, _04532_, … with every trace of the word structure flattened away, the names mangled into meaningless serial numbers, and the optimiser having possibly removed some flops entirely (one whose input is provably constant needs no storage), duplicated others (a heavily-loaded flop cloned so each copy drives half the fanout), or absorbed a nearby inverter so the flop stores the logical negation of its RTL bit. The mapping that survives all this — RTL bit to netlist flop, up to those enumerated deviations — is called ρ here, and whether it exists in clean form is this layer's central empirical question.
Why does the whole equivalence effort hang on the registers specifically? Because state elements are where a sequential comparison can be cut. If every RTL register bit is matched to a netlist flop, then proving the two designs equivalent for all time reduces to proving, once, that between corresponding register boundaries the two compute the same combinational function — a finite, per-cone check (04). Without the matching, the comparison is between two arbitrary state machines whose states don't align, which is a vastly harder problem (equivalence would need its own invariant, L5-style). Commercial equivalence-checking flows depend on this so completely that commercial synthesis tools emit a hint file recording exactly what they did to every register; the open-source flow emits nothing, which is why ρ must be recovered.
The recovery strategy here is structural, not archaeological: the build is ours. The netlist of record is produced by a flow this repository runs, from pinned sources, and synthesis is essentially deterministic — so ρ need not be reverse-engineered from an artifact at all: re-run the flow with instrumentation, log every register-affecting optimisation as it happens, and the mapping falls out as a byproduct of the run. This is the reproducible-build discipline that software supply-chain security relies on, pointed at a proof obligation — with the advantage over any inherited artifact that there is no provenance gap even in principle: the netlist and its witness are two outputs of one run.
Statement
Exhibit ρ: a mapping between RTL state elements and netlist flops — a bijection up to opt_dff-eliminated constants and resizer cloning (1→many) — such that 04's bisimulation can be cut at register boundaries. Whether ρ exists is F5, the layer's single load-bearing unknown, and it is decidable by experiment rather than by argument.
Resolved: ρ is readable straight off the netlist (F5)
The experiment was run, and it did not need the instrumentation the plan below anticipated. The premise "synthesis mangles the names into meaningless serial numbers" is true of the flop instance names (_04531_) but false of what carries the register's identity: the flop's Q-net. yosys anonymises the instance but names the net the flop drives after the RTL hierarchical signal — \system.tile_prci_domain.…frontend.icache.refillError, \buf_pc[3], and so on. Measured on the netlist of record, 10,873 of 10,915 flops (99.6 %) carry the RTL register name on their Q-net. So ρ is not archaeology and not a tool patch: it is a hypothesis readable from the shipped artifact, and the 42-flop residue (plus any constant-folded or merged register) is exactly the enumerated-deviation set, settled by the equivalence check that consumes ρ.
And it is not merely readable but usable: 04's equivalence run matched RTL to netlist by name alone, with no hint file, and the matcher paired cones only where a name on each side corresponds — which is ρ recovered and consumed in one step. This was confirmed at two scales: on a carved-out cone (IBuf, where all 53 flops matched by Q-net: buf_pc, buf_data, nBufValid, …) and on the whole chip (equiv_make paired 642 cones by name across the 61k-cell design). The check is rho-recoverable in check-l3.
This downgrades F5 from the layer's load-bearing unknown to settled in the affirmative. What remains open is not ρ's existence but the equivalence proof that rides on it (04), and the 42-flop residue's per-flop justification. The instrumentation programme below is no longer the primary route — the Q-nets already are the witness — but it survives as the way to certify the 42 anonymous flops and the polarity/constant deviations without leaning on the naming convention.
Why only registers (and ports) need correspondence
The equivalence needs bit-level correspondence at exactly two places: ports (preserved by construction — synthesis cannot rename or drop them) and state elements. Internal nets need none — internal restructuring is precisely what combinational equivalence checking absorbs, and it is where ABC does all its work. So the entire gap between RTL and netlist reduces to one question: do the flops correspond?
The corollary that saves the project from a research problem: do not recover buses. Synthesis flattened every word into unrelated single-bit nets named _1234_; bit-level→word-level lifting is genuinely hard and entirely unnecessary — the word structure comes from the RTL side of ρ, and the netlist side stays bits forever.
What ρ must record
- The bijection, modulo the two legal deviations: constants (
opt_dffremoves a flop whose input is provably constant — the RTL bit maps to a constant, and the proof that it was constant is part of the certificate) and clones (resizer fanout duplication — one RTL bit, several netlist flops, all provably equal). - Per-bit polarity — 02's inverter absorption can leave a netlist flop storing the negation of its RTL counterpart.
- Reset correspondence: the bisimulation is stated from reset-reachable states, so ρ must map RTL initial states to netlist post-reset states — with deliberately-uninitialised bits on both sides refining the spec's reset nondeterminism (00) rather than demanding equality of X.
What threatens ρ
Yosys's opt_dff/opt_merge can remove constant-driven flops and merge duplicated ones, and Yosys emits no SVF-equivalent — the commercial flow's hint file recording exactly the register transformations, absent here. The flow's configuration is favourable (retiming off — the one transformation that destroys register boundaries wholesale — and SYNTH_BUFFERING 0), but favourable is not known.
The decision procedure: instrument the synthesis
Do this before anything else in the project. Versions are pinned exactly (the toolchain manifest in findings); Yosys is single-threaded and essentially deterministic; ABC's seeds are fixed by default. Because the flow is re-runnable at will, the experiment is direct: instrument it to dump ρ as it runs — log every opt_dff/opt_merge action, emit the name mapping before mangling — and the witness is an output of the same run that produces the netlist of record. This is also the first concrete instance of the project's endgame — tools patched to emit certificates — arriving early because it needs only logging, not proof.
The nondeterminism concentrates in P&R (multithreaded routing, placement seeds, hash order, floating point), which is function-preserving — a different placement is harmless, and one verifies the layout the flow produced rather than demanding reproducibility of it. Synthesis, the stage that would actually hurt, is the deterministic one. Fortunate, and worth stating as the reason the witness is expected clean.
A determinism check (same run, twice, same netlist) is still worth pinning as a regression: it is what makes "the netlist of record" a well-defined phrase.
Obligations
- Run the instrumented synthesis; extract ρ; pin the determinism regression.
- Define the ρ format (bijection + constants-with-proofs + clone classes + polarity + reset map) as the interface 04 consumes.
- If reproduction fails: fall back to inference — name-hint matching plus simulation-based candidate pairing, then per-pair verification. Strictly worse (the witness becomes a search result), but the verification step is the same either way.
Interface (base case). The reset map recorded in ρ is the S-reset seam: the base case of L3's temporal lift, rename ρ resetF = resetR (reset_corr). It is the one sorryAx in the end-to-end theorem's axiom base — the induction anchor without which the two machines could agree step-for-step yet start from unrelated states. L3/03's "no flop carries a power-up value" is the necessary precursor, not the ρ-image equality itself.
Effort
The experiment: days to weeks of flow wrangling. It is the highest information-per-effort action available in the entire project, which is why the repository README's "where to start" lists it first.
L2/04 — Equivalence by certificate
Background
The question "do these two circuits compute the same function?" — combinational equivalence checking, CEC — is the workhorse problem of hardware verification, and this chapter leans on thirty years of its technology, so the technology needs introducing. The foundation is the SAT solver: a program that takes a Boolean formula and either finds an assignment making it true or reports that none exists. SAT is the canonical intractable problem in theory, but modern solvers (the architecture is called CDCL — conflict-driven clause learning: search, hit a contradiction, learn a clause recording why, never repeat that mistake) routinely dispatch industrial instances with millions of variables. Equivalence reduces to SAT by the miter construction: wire the two circuits to the same inputs, XOR their outputs, and ask the solver whether the XOR can ever output 1. "Unsatisfiable" means no distinguishing input exists — the circuits are equivalent.
Two refinements turn this from possible into practical. First, equivalence tools do not attack the miter whole; they exploit the fact that the two circuits being compared are usually versions of the same design, littered with internal wires that compute identical functions. SAT sweeping finds them: simulate both circuits on random inputs, group internal nodes whose simulated values always agree (candidates), prove each candidate pair equivalent with a small local SAT call, and merge them — so the two circuits progressively fuse from the inputs forward, and no solver call is ever large. (The circuits are held in a normal form called an AIG — and-inverter graph, everything expressed as two-input ANDs plus inverters — which makes structural sharing cheap and mergers mechanical.) The crucial corollary runs backwards: sweeping starves without structural similarity, which is why this chapter insists the right comparand is the RTL that generated the netlist, never an independently written reference model.
Second — and this is the book's recurring trust move, stated here at its origin — a solver's "unsatisfiable" verdict need not be taken on faith. Solvers can emit a proof log (the standard formats are DRAT and its checkable-in-linear-time refinement LRAT): a step-by-step derivation of the contradiction that a small, simple, independently verified checker can replay. The solver stays a wild, heuristic, untrusted search engine; trust resides only in the checker. This search-vs-certificate split is how every SAT-shaped result in the project enters the proof, and this chapter pushes the same idea one level further: the synthesis optimiser's own rewrites are drawn from a finite, pre-verifiable library (the "222 NPN classes" below are the 4-input Boolean functions up to negating/permuting inputs and negating output — a complete catalogue), so if the tool is patched to log which rewrite it applied where, the entire optimisation trail becomes a checkable certificate and search at verification time disappears.
Statement
Given ρ (03) and the deletions (02): for every register/port boundary pair, the combinational cone in the reduced netlist computes the same function as the corresponding cone in the elaborated RTL — established by checking certificates, with exploratory SAT confined to where no certificate exists.
Per-cone equivalence + ρ + matched reset then compose into the bisimulation Mealy(N) ≈ρ ⟦RTL⟧.
Why CEC scales, and why that dictates the architecture
SAT sweeping works by proposing candidate-equivalent internal nodes via random simulation and proving each with a small local SAT call, using previously proven equivalences as rewrites. The candidates exist because both sides are the same design through one tool — structural similarity is the fuel. Two consequences:
- An independent reference model is the wrong architecture. Comparing a hand-written model against a synthesised netlist destroys the internal equivalence points; the miter becomes one enormous SAT problem. (This is quite apart from the register-mapping problem an independent model creates.) The RTL that generated the netlist is the right comparand.
- Register boundaries bound every miter. With ρ in hand, each proof obligation is one cone — an in-order core's are shallow — so even certificate-free fallback SAT stays tractable per cone.
Unmap rather than map: substitute each SKY130 cell's verified Boolean function (L1/06) to bring the hardened netlist down to generic gates, instead of technology-mapping the RTL side up. Free — L0 already produced the functions — and it removes tech mapping from the comparison entirely.
The certificate architecture: instrument ABC's trail
ABC's optimisations are local rewrites drawn from a finite precomputed library — the 222 NPN classes of 4-input functions for rewrite, plus refactor/balance/resub. Every application is a table lookup plus a structural substitution; the justification already exists as a table entry — ABC just doesn't write it down.
The plan, enabled by 03's reproduction of the flow (we control the run, so we can patch the tool):
- Verify the NPN library once, exhaustively — 222 lemmas over 4-input functions, trivially checkable.
- Log the trail:
(cut, before, after, library-entry)per rewrite — a modest patch to an open-source tool. - Check the trail: each step is congruence (substitution at a cut, pointer-level if the representation is a hash-consed AIG (And-Inverter Graph — the two-input-AND-plus-inverter normal form equivalence tools operate on)) plus one library lemma. No search at check time.
- Residual cones — anything the trail doesn't cover as a pure library rewrite:
proc/techmapstructural expansion, and ABC'smfs, the flow's only don't-care-licensed pass (measured below). Formfsthe trail records each resubstitution with its don't-care condition, discharged by checking that condition or by a windowed SAT-with-DC-assumption; other residue falls back to per-cone SAT with LRAT proofs, checked not trusted.
This is the K(G₁) = K(G₂) congruence architecture the project sketched from the start, landing at its cheapest available site: local rewrites, precomputed justifications, open tool. It is the best available answer to avoid poorly-specified exploratory obligations.
Measured: the don't-care footprint of this flow
The certificate architecture above splits every synthesis rewrite into two bins: exact (a full-input-space Boolean identity over a bounded cut — certifiable locally, by composition, against the finite rewrite library) and don't-care-licensed (the rewritten cut equals the original only on the inputs that can occur (satisfiability DCs) or that are observed (observability DCs) — not certifiable by local pin-projection, because the licensing condition is a non-local property of the surrounding circuit). Only the second bin is the hard residue. So the operational question is: how big is it, on this design? We instrumented the flow and measured it.
The flow's ABC script, classified. The synthesis step hands ABC a script (runs/*/06-yosys-synthesis/AREA_0.abc) of eighteen passes. Every one is exact-equivalence except a single don't-care pass:
- exact —
fx(algebraic factoring),strash(structural hashing),drw/drf(rewrite/refactor from the 222-NPN 4-input library),balance(associativity), thefraig_store/fraig_restoresweep (SAT-proven node merges),amapand&nf(technology covering — implement the AIG function by construction),&dch(structural choices — invoked bare, so proven-equivalent snapshots only, no don't-care merge),buffer/upsize/dnsize(function-preserving sizing); - structural no-ops —
retime -M 5,scleanup, and the sequential&get -npath. Yosys runsdfflibmapbefore ABC, so ABC receives a purely combinational network: its own stats reportlat = 0. There are no latches to retime. Flop boundaries — ρ — are fixed before ABC touches anything; the flow performs no retiming at all. This is not a configuration we chose; it is visible in the log (ABC: Error: The network is combinationalwhenretimeruns) and it removes register-level non-locality from the problem entirely. - don't-care-licensed —
mfs(and onlymfs): SAT-based resubstitution and redundancy removal using satisfiability and observability don't-cares. This is the whole of bin two.
So the design-wide don't-care residue is exactly one pass, and mfs reports its own footprint. Instrumenting it (cec/dc-instrument.sh, cec/dc-fullchip.sh — the flow's script with mfs -v, run pass-by-pass) gives:
| network | logic nodes | mfs reduced | of which observability-DC (-W 0 A/B) |
|---|---|---|---|
AMOALU (comb. cone) | 640 | 29 (4.5%), 28 resubs | 0 (-W 0 identical) |
IBuf (seq. cone) | 1,311 | 232 (17.7%), 380 resubs | ~10 nodes (~0.8pp) — inflated by module carving |
ChipTop (full chip) | 52,775 | 4,249 (8.05%), 6,172 resubs | 8 nodes (~0.015%) |
Two things fall out. First, the footprint is small and self-reported: mfs names the exact nodes it changed, so the certificate does not have to discover the don't-care residue — the tool hands it over. Every node mfs did not touch is reached by exact rewrites alone and certifies locally.
Second, the genuinely non-local part is almost nothing. mfs's -W flag is the observability (transitive-fanout) cone depth; -W 0 leaves only satisfiability don't-cares, which are a property of a node's fan-in — still non-local, but input-side and bounded by the cone the local cut already sees. Re-running the whole flow with -W 0 reduces the full chip by 4,241 nodes versus 4,249 with observability on: the observability don't-cares — the ones whose licensing truly depends on what the rest of the circuit ignores, and which no enlargement of the local window can ever capture — account for 8 nodes in the entire design. The full 8% is satisfiability-DC. AMOALU shows the same (-W 0 identical, all 28 resubs satisfiability-based). IBuf looks larger (~10 nodes, ~0.8pp) precisely because it is carved out: a module observed only at its boundary has artificial observability don't-cares that vanish once it is wired into the closed chip — the same free-boundary effect as the IBuf reset residual in the Executed runs below, and the reason the honest number is the full-chip one. Observability don't-cares and unobserved boundary state are the same phenomenon seen from two sides, and in the closed design there is almost none of it.
Consequence for the certificate. The trail checker discharges every exact pass locally. For mfs, the trail records each resubstitution with its don't-care condition; the checker either verifies that condition or falls the cut back to a windowed SAT-with-DC-assumption. The measurement says that fallback is invoked on ~8% of nodes — and of those, all but a handful carry a satisfiability condition (which input patterns reach the cut: a bounded fan-in property the windowed check already has in scope), while the observability-dependent part, the only kind that resists any local window whatsoever, is 8 nodes in 52,775. The die-wide CEC does not merely factor into local checks in principle; on this design the non-local remainder is one instrumented pass, over 99.9% of it input-side and windowable, with a hard core of eight nodes.
Executed: re-checking mfs's don't-care SAT calls outside ABC
The measurement says the don't-care residue is one pass and it names its own footprint. The next step is to make that pass hand over the proof obligation it discharged, and re-check it without trusting ABC. We patched ABC to do exactly this (cec/abc-mfs-dclog.patch, ~50 lines; cec/DC-CERT-NOTES.md).
To license each reduction, mfs builds a two-copy care-aware miter (Abc_MfsCreateSolverResub): two copies of the window, tied on the candidate divisors, with the node's output forced to disagree. UNSAT means no two care-set inputs agree on the divisors yet differ on the node — the node is determined by those divisors on the care set — so the reduction is valid; ABC then reads the replacement function off that same refutation by Craig interpolation. The refutation is the certificate. The patch, gated by an environment variable, dumps the complete CNF of that miter (assumptions baked in as unit clauses) for every applied reduction, plus a manifest tying each to its node and window support. An off-the-shelf solver re-deriving UNSAT removes ABC's SAT engine from the trust base for the whole don't-care step.
Run through the flow via abc -exe, then discharged by minisat and z3 (cec/dc-log.sh, cec/dc-check.py):
| network | applied reductions dumped | remove / replace | independently UNSAT |
|---|---|---|---|
AMOALU | 28 | 0 / 28 | 28 / 28 (minisat and z3) |
IBuf | 380 | 206 / 174 | 380 / 380 |
ChipTop (full chip) | 6,172 | 2,917 / 3,255 | 6,172 / 6,172 |
Coverage is exact at every scale: the dumped remove/replace counts equal mfs's own Remove/Resub accounting to the unit — IBuf 206/174, and the whole chip 2,917/3,255 — so all 2,917 observability-based removes, the genuinely non-local reductions, are among them. Every don't-care SAT call the flow made is reproduced by a solver outside ABC, and every one is UNSAT (a SAT here would be an ABC soundness bug; none occurred).
This discharges the "re-do the don't-care SAT calls" obligation. Two layers remain, and the manifest is built to reach them: emitting a DRAT/LRAT proof from the external solver upgrades each verdict to a checked proof; and mapping the dumped window variables back to netlist nets (the manifest records the support net ids) closes the "faithful window" obligation — that the dumped miter models the real netlist's don't-cares — against 00's semantics. What is already true is the sharp part: the die-wide don't-care residue is one pass, its every reduction is logged as a bounded local refutation, and those refutations check outside the tool that produced them.
The exact passes: per-pass equivalence, checked outside ABC
mfs is the only pass that needs a don't-care argument; every other pass in the script — fx, strash, the rewrite/refactor/balance block, the fraig sweep, amap, &dch/&nf — preserves the function on all inputs, so each is a plain equivalence with no care set. That invites the obvious check: verify each pass against the one before it.
Why per-pass rather than one shot: the monolithic RTL≡netlist miter is exactly the compute-bound object from the runs above — the two sides are dozens of passes apart, structurally dissimilar, so SAT sweeping starves. Consecutive networks are one pass apart and nearly identical, so the same sweeping collapses each adjacent miter in milliseconds. Snapshotting the network after every pass and checking neighbors turns the one hard CEC into a chain of trivial ones — precisely the "trail of intermediate netlists" the certificate architecture calls for, at its cheapest.
cec/trail-cec.sh does this: it snapshots after each pass (&get -n for uniform signal names; s0 via non-destructive write_blif, since fx needs an SOP network), exports each adjacent miter (miter -c, whose single output can be 1 exactly when the two circuits differ), and discharges it with minisat — outside ABC — keeping ABC's own cec as a cross-check. The polarity is falsification-tested (an AND-vs-OR miter yields SAT), so a false "equivalent" cannot pass.
For AMOALU and IBuf, every boundary is independently UNSAT and ABC's cec agrees:
s0_start -> s1_fx : UNSAT (equivalent) | abc: are equivalent
s1_fx -> s2_mfs : UNSAT (equivalent) | abc: are equivalent
s2_mfs -> s3_strash : UNSAT (equivalent) | abc: are equivalent
s3_strash-> s4_rewrite : UNSAT (equivalent) | abc: are equivalent
s4_rewrite->s5_fraig : UNSAT (equivalent) | abc: are equivalent
s5_fraig -> s6_amap : UNSAT (equivalent) | abc: are equivalent
s6_amap -> s7_nf : UNSAT (equivalent) | abc: are equivalent
For the whole ChipTop, all seven boundaries are equivalent too, each in 0.06–64 s (~3.3 min total) — tractable exactly where the monolithic RTL≡netlist miter is not. The chain composes: s0 ≡ s1 ≡ … ≡ s7, so the pre-ABC network equals the final mapped netlist. The mfs boundary (s1→s2) passes this whole-network check too — it is output-preserving — while its internal don't-care reductions get the finer, per-reduction certificate of the previous section.
One honest scaling seam. On the modules the external solver discharges each boundary; on the full chip the boundaries are checked by ABC's own cec, because a plain external solver does not scale on the raw die-wide miter — minisat exceeds two minutes on a 69k-variable boundary, for want of the structural node-sharing that cec's fraig sweeping supplies and a bare CNF discards. So at full-chip scale this step still trusts ABC's checker (not its optimiser). Closing that — a structure-aware CEC that emits a DRAT/LRAT proof a small checker can replay — is the remaining hardening; the decomposition has already done the hard part, cutting the die-wide problem into seven individually-tractable steps.
So the ABC trajectory is covered end to end: the exact passes by adjacent-miter equivalence (external on modules, ABC-cec in minutes on the die), and the one don't-care pass by both this whole-network check and its 6,172 externally-replayed SAT refutations. What remains is the front end — s0 back to the RTL (proc/techmap structural expansion, the "naive netlist" of the next section) and, above it, L3's elaboration semantics. The ABC middle — historically the heuristic, untrusted part — is now a chain of small equivalence checks anyone can replay.
The naive netlist: useful oracle, wrong comparand
read_verilog; hierarchy; proc; memory_map; techmap — no opt, no abc — produces a "naive" netlist whose function is fixed by the language and whose structure is fixed by Yosys's techmap.v, a small readable rule library one could formalise. Caveats: proc is not a no-op (proc_rmdead prunes unreachable branches), and well-definedness is conditional on L3's 15 always @* latch-inference checks — the obligation is shared between layers.
But as a CEC comparand it is the worst case: its ripple-carry adders share nothing structurally with ABC's output, so sweeping starves. Its role is differential testing and semantics cross-validation (L3's CEC cross-check), not the equivalence proof itself. The trail architecture makes this moot: with the trail, the comparand is each intermediate netlist against the next, and structural similarity is maximal at every step.
Executed: the equivalence check as run
Ahead of the instrumented-trail endgame, the equivalence was run with off-the-shelf machinery (eqy and yosys equiv_*), matching by name via ρ (03) with no hint file, to find out what the obligation actually costs on this design. Three results, one coherent picture.
A cone closes cleanly. AMOALU — the atomic-memory-op ALU, a purely combinational Rocket cone — synthesised standalone to SKY130 cells and checked against its RTL yields Equivalence successfully proven, all 32 output bits. The whole pipeline runs end to end: slang elaboration → standalone synthesis → cells read against Liberty → equiv_make name-match → SAT → proven. This is scoped-cec in check-l3, and it is the proof that the pipeline itself is sound — no confound, a real PASS on real Rocket logic.
A sequential cone exposes the reset issue, not a bug. IBuf (instruction buffer, 53 flops) matched every flop by Q-net and proved 198 of 212 cones on the first pass. The residual is not a logic discrepancy: 115 of the unproven cells are primary outputs driven by the unreset data registers buf_pc/buf_data, whose two copies start at independent free values, so every output that reads them differs at cycle 0. A carved-out module observed at its boundary from an arbitrary state genuinely is not output-equivalent; the correct statement is equivalence under matched initial register state — ρ as an assumed initial condition, standard SEC practice — which needs the reset sequence modelled. The matching (F5) is untouched; what is open is a clean whole-module sequential verdict.
The whole chip confirms matching but not a clean verdict — by either route. eqy's per-flop partitioning matched ~10,900 cones by name (ρ at full scale) but its serial combine is a multi-hour grind. The yosys-native single-miter route (equiv_make/equiv_simple/equiv_induct) matched 642 cones by name, but equiv_simple proved only 6 of them — the same free-register-init wall as IBuf, dominating even the combinational check when the whole design's registers start free — and equiv_induct exhausted memory without closing. So a clean full-chip number needs either the per-partition route run to completion (compute) or reset-sequence modelling (the IBuf lesson at scale). The scoped AMOALU pass remains the standing evidence the pipeline is correct; the full-chip verdict is cec-fullchip, still open, and blocked on compute/reset-modelling rather than on any doubt about the method.
The lesson for the architecture below: matched-reset (the ## Statement's hypothesis, and 03's reset-correspondence clause) is not a formality — it is exactly what these runs show is needed to turn per-cone combinational equivalence into a whole-design verdict. The certificate route inherits the same requirement; the trail proves the cones, and the reset correspondence composes them.
Obligations
- The NPN library verification (one-time, mechanical).
- The ABC patch and trail format; the trail checker against 00's semantics.
- The composition theorem: per-cone equivalences + ρ + reset correspondence ⟹ bisimulation.
- LRAT checking for residual cones — standard machinery, imported not built.
Interface (trust anchor). The soundness of these certificates is the S-miter seam (miterCNF_sound): that the miter CNF faithfully encodes inequivalence, so a refutation proves the machines equal. It is the one seam that is not an inter-layer arrow but a trust anchor — every PassCert and l2_commutes rest on it — and the one dischargeable outright: a verified Tseitin encoding turns it from axiom into theorem.
Effort
The patch and checker: months. The composition theorem: weeks once 00/03 exist. The certificate route's cost scales with the trail length, not the design size — which is the point.
L2/05 — Hard cones and the transformation contingency table
Background
Equivalence checking has one famous nemesis: the multiplier. For most logic, the SAT-based machinery of 04 is robust, but comparing two structurally different multiplier implementations — say, a naive shift-and-add against a Booth–Wallace array (the standard fast architecture: recode the multiplier digits to halve the partial products, then sum them through a tree of carry-save adders) — is provably brutal: the XOR-rich structure of binary arithmetic is exactly what the resolution proof system underlying SAT solvers handles exponentially badly, so the miter that "should" be easy runs forever. The field's dedicated answer is algebraic rather than Boolean: model each gate as a polynomial equation and verify, by systematic polynomial reduction (computer algebra, not SAT), that the circuit's output polynomial equals a·b; the PAC format packages such reductions as certificates a small checker can replay, SAT's LRAT story transplanted to polynomial arithmetic.
This chapter's actual claim is that the famous problem does not arise here — for a structural reason worth spelling out. The wall is triggered by comparing structurally alien endpoints with no shared derivation. But the hardened netlist's arithmetic was not conjured from nothing: Yosys elaborates the RTL's + into a width-generic template — a recursive circuit definition parameterised by bit-width, the "circuit generator" of this project's earliest design discussions — and ABC then only massages that structure through small local rewrites, each logged in 04's trail. So the proof splits into one induction over the template ("for every width n, the template computes addition" — a textbook induction on the carry recurrence, proved once for all instances) plus the per-rewrite trail checks, and no alien-endpoint comparison ever happens. The PAC machinery stays shelved as a fallback.
The chapter's second half guards a different flank: synthesis transformations that would break the register correspondence ρ wholesale. Retiming is the canonical one — moving flops across combinational logic to balance delays, perfectly sound and perfectly destructive of any flop-to-register mapping. Others (re-encoding an FSM's states, merging equal registers, inserting scan chains — the test-mode circuitry that threads all flops into a shiftable chain for factory testing) each break a different assumption the equivalence proof rests on. This flow has all of them switched off; the table's job is to convert "switched off" from a configuration hope into a checked property of the reproduced build, with a named certificate ready should any of them ever appear.
Statement
Two residual categories where 04's architecture needs reinforcement: cones where SAT structurally blows up (arithmetic), and synthesis transformations that break register boundaries (absent from this flow, but each needs a named certificate so their absence is a verified configuration, not luck).
Arithmetic: generic theorems, not SAT
The plan for arithmetic cones is width-generic structural proof, with per-instance checking confined to the local peepholes on top. The emitted cone descends from the RTL operator with full structural continuity:
RTL +/* —elaborate→ $add/$mul —techmap→ template structure —ABC→ hardened cone
└─ width-GENERIC theorem ─┘ └─ 04's local trail ─┘
The middle step is Yosys's techmap.v / alumacc instantiating a width-generic template — a recursive structure over n. ∀n. ⟦template_add(n)⟧ = bvadd_n is a textbook induction on the carry recurrence, proved once, covering every instance at every width; likewise the other $alu/$macc templates. We do not own the generator, but the generator is small, fixed, pinned Verilog — the generic-generator proof from the project's original design discussions, in validation form. Identifying which templates the pinned Yosys uses is a deliverable of 03's reproduction. The final step is ABC's cut-local rewrites — 04's trail; each check is a 4-input peephole, never a multiplier.
The "multiplier wall" is not intrinsic to arithmetic — it is intrinsic to endpoint-vs-endpoint comparison of structurally alien implementations (bit-blasted * against a derivation-free Booth–Wallace array: exponential resolution, sweeping starves). With template theorem + trail, that comparison never occurs. PAC (Kaufmann & Biere) — polynomial-calculus certificates with a small verified checker — is therefore the fallback, earning its place only on trail loss or on a structurally alien vendor block with no derivation history; this flow has neither.
The multiplier case factors completely: this core's multiply/divide unit is iterative (the tiny configuration's M implementation), so correctness splits into an RTL-level loop invariant (standard, L4/L5's world) plus a step-function cone that is an adder: generic theorem + trail. The scary version of this problem belongs to cores with single-cycle combinational multipliers, not to this one — and the configuration parameter that keeps it iterative is pinned in the configuration record precisely so a change is noticed as a re-budgeting event.
The contingency table: boundary-breaking transformations
The flow's configuration avoids every transformation that destroys register correspondence (Findings: retiming off, SYNTH_BUFFERING 0, no sequential optimisation flags). Under unbounded proof capacity none of them are forbidden — each admits a certificate — and the table's job is to make "we don't need this machinery" a checked property of the reproduced flow rather than an assumption:
| transformation | breaks | certificate if ever needed |
|---|---|---|
| retiming | register boundaries wholesale | integer node-labelling; check the linear constraints per edge |
| FSM re-encoding | state encoding | the state bijection, checked on the transition relation |
| sequential don't-care opt | equivalence off reachable states | care-set + an unreachability invariant (IC3-shaped) |
| clock gating | unconditional flop update | enable equivalence + unobservability-when-gated |
| register merging | ρ's bijectivity | the merge witness: proof the merged flops were equal |
| scan insertion | adds a mode | conditional refinement under scan_en = 0 |
Each row is a known technique with literature behind it; none is exploratory. The point of writing them down is asymmetric risk: discovering mid-proof that the flow did apply one of these without a witness would invalidate ρ silently — so 03's instrumented reproduction should also assert the absence of each row (grep the flow's pass list), converting the table from contingency to certificate-of-absence.
Obligations
- Identify and generically prove the pinned Yosys arithmetic templates (
techmap.v,alumacc) — one induction per template, the load-bearing item of this file. - Confirm the mul/div unit's iterative parameters from the configuration record; state the loop invariant and check the step cone reduces to the adder template.
- Emit the certificate-of-absence for the six rows from the reproduced flow's logs.
- Import a PAC checker (Pacheck-class) rather than building one — same policy as LRAT — and keep it shelved unless the trail is lost.
Effort
Weeks, dominated by wiring the PAC checker to 00's cone extraction — needed only if the template-plus-trail route fails somewhere.
L1 — The electrical circuit and its constraint system
Node — the EE circuit and its constraint system: the extracted netlist
Nwith per-net RC enclosures (00–02), the timed contract model (03), the SDC constraint set (04), and the crosstalk/IR budgets (05); at this nodeεhas been traded for a deterministic constraint system. Edge up — the digital crossing: timing closure, the combinatorial geometry/interference checks, and gain-driven restoration together turn the transfer functions into a Boolean machineMealy(N)— the digital abstraction (06), the bridge theorem (07), verified STA (08), corners (09), the clock (10), boundaries (11), and the geometric checks (12). This edge carries the second of the overview's two † conditioning marks (P1).
This layer is the merge of two bodies of work that share one object. The geometry half (00–02, and its continuous-field enclosures, which live in L0's electrical-abstraction edge) is what defines the EE circuit: the drawn polygons realise exactly the intended netlist, for every chip in the tolerance family, and extraction reads the circuit back out with certified RC. The timing half (03–12) is the digital crossing: given that circuit, the synchronous discipline lifts it to a discrete machine. The node is the circuit; the edge up is the crossing.
Background
The design is a stack of 2D polygon layers; the chip is what a fab printed from them — imprecisely, but within published tolerances. The first job of this layer is to connect the two: the drawn geometry realises exactly the intended circuit, for every chip in the tolerance family rather than the ideal one. The sandwich theorem (01) is what makes design-rule checking on the drawing sound for the fabricated silicon; extraction and LVS (02) read the circuit back out of the polygons; the capacitance enclosures (09) turn geometry into certified electrical intervals; the screening argument (10) is the open problem that makes any of that computable at all; and the geometric checks (12) discharge safety conditions that other layers can only state. 00 opens with how a chip is physically built and what a layout formally is.
The second job is the digital crossing. Everything above this layer treats the chip as a discrete machine stepping once per clock; the circuit this layer defines is a continuous system in which signals race through gates at analog speeds and arrive when they arrive. The synchronous discipline — storage elements that sample only at clock edges, given a full period for the racing to settle — is what connects the two pictures, and the edge up proves that it does: the bridge theorem (07) turns "the design meets timing" into "the discrete abstraction is sound," checked by a verified static timing analysis (08) over certified delay tables (09), conditional on the human-asserted path exceptions being justified (04). The edges of the story get their own chapters: the clock's generation and distribution (10), the boundaries where the world's timing meets the chip's (11) — one of the two places genuine probability enters the project — and the analog interference terms kept out of every interface (05).
The node: the EE circuit
One theorem with three faces defines the circuit, decomposed in the geometry subcomponents:
- The layout implements the netlist.
Ext(M(A)) ≅ Nfor allAin the family — the sandwich theorem (01) plus extraction/LVS (02). - The layout determines RC enclosures, valid over the whole family (09, 10).
- DRC rules are the hypotheses, not an unstructured pile of manufacturing constraints — (H1)(H2), (D1)–(D3), G1–G6.
On top of that geometric netlist sits the constraint system that replaces ε with something deterministic: each cell carries its timed contract (03), the design carries an SDC — the human-asserted timing exceptions (04) — and the analog residue (crosstalk, IR drop) is absorbed as budgets with a single entry point (05). This is the largest and least-charted node in the tower. On the FPGA alternative the geometry half disappears entirely; the timing half remains.
The edge up: the digital crossing
The bridge theorem. If every cell stays inside its contract's domain, STA certifies setup and hold at every flop at every corner, every excluded path carries a justified exception, the combinatorial geometry checks discharge L0's interference budgets, and no fault event or unresolved synchroniser read occurs in [0,T] — then over [0,T] the physical circuit implements Mealy(N). Full statement and proof sketch in 07; the hypotheses are not yet established for this design — the flow's multi-corner signoff is the F-series' live frontier (axioms).
The crossing has three ingredients, all of the same "combinatorial check over an analog budget" flavour: timing closure (clean sampling instants), the geometry/interference checks (12, discharging L0's budgets), and restoration (gain > 1 collapses each cell's transfer function to a Boolean function — the digital abstraction, 06, which migrates up from the physics). Everything above L1 presupposes this edge and nobody has written it down. It is the highest value-per-effort novel contribution in the project.
Subcomponents
| status | ||
|---|---|---|
| 00 | The layout as a formal object; admissible GDS | small, prerequisite |
| 01 | The sandwich theorem — stated precisely | months; the most tractable substantial result in the geometry half |
| 02 | Extraction and LVS; devices as rectangle intersections | small |
| 03 | The timed model — bounded-delay semantics of Contracts(N), the flop window rule, the metastability escape hatch | scaffolding; everything types against it |
| 04 | SDC exceptions and constraint completeness — the generated file is minimal, and the missing domains are the audit | the project's entry point — weeks |
| 05 | Crosstalk and the power grid — both absorbed at this layer, and the red line that keeps them absorbed | design-conditional; feasible at 130 nm |
| 06 | Restoration, noise margins → Boolean function — the digital abstraction, migrated up from the physics | settled, unformalised |
| 07 | The bridge theorem (M5) — statement, per-cycle induction, where the shape breaks | the centrepiece; a paper, not a decade |
| 08 | Verified STA — the soundness statement, and three places standard practice is subtly unsound | ordinary verified-algorithm work |
| 09 | Corners and correlation (M4) — when finitely many parameter assignments bound the continuum | open: production data violates the premise |
| 10 | The clock — the imported board-clock contract, jitter, clock gating, CTS as an active participant, the arrival function | checks are weeks; the contract proof is L0's |
| 11 | Boundaries — the ladder of clock relationships; synchronisers; multi-domain composition; the P1 ledger | records what was previously only discussed |
| 12 | G1–G6: the finite, decidable geometric obligations that discharge L0's budgets | weeks each |
The continuous-field enclosures the geometry face depends on — the two-sided capacitance bounds (09) and the screening exponent (10) — now live in L0's electrical-abstraction edge, because they are analog field arguments; L1 consumes their intervals.
Interfaces
Consumes: GDS, process stack, DRC deck; from L0, the per-cell interval Liberty contracts and the RC enclosures + coupling graph that make up Contracts(N); from L2, the netlist with registers/clock/reset identified; the generated SDC. Exports: the netlist N — the shared object of the overview's tower, the same N this layer times and L2 compares — with per-net RC enclosures and a sparse coupling graph plus one aggregate ε; and, from the edge up, the licence to reason discretely — for the multi-domain design a network of Mealy machines with gadget-bounded channels (11) that collapses to nearly one machine here. Nothing numeric propagates upward except one outward artifact: the derived AC-timing table handed to L5.
The refinement proof never touches RC. Electrical data exists solely to discharge the digital crossing's hypotheses — the cleanest seam in the stack, preserved deliberately: any net that would need a functional coupling constraint is a layout bug, because it would entangle the noise argument with L3's invariant (05).
Axioms introduced
From the geometry face: E7 (as-fabricated geometry within the tolerance family — now also carrying the sandwich's (H3)), P4 (variation within corners), P5 (defect coverage), X3 (T→theorem: retires when M2 lands). From the edge up: P1 (synchronisers resolve — the per-boundary ledger is 11's), P6 (environment — now carrying the whole clock-generation contract, since the clock is board-supplied, 10). Formerly also E3 (discharged — the capacitance enclosures are its route), E6 (retired: yield, not per-die correctness), E4 (split: empirical half → P4, mathematical half → M4), and E5 (subsumed by E2's and E3's discharge routes); see Axioms. The F-series rows are unestablished hypotheses of the bridge theorem, not axioms.
Two things precisification turned up
The sandwich theorem needs a third hypothesis. With only "erosion connected" and "dilations disjoint" it is false: the fabricated set may contain a spurious island inside N ⊕ B_r that meets no eroded net, i.e. a net that does not exist in the drawn layout. The missing hypothesis (H3) — every component of Cond(A) meets Cond(D) ⊖ B_r — is not checkable, since it quantifies over A. It is an assumption about the process and belongs to E7. (No dual hypothesis is needed for voids: extra material creates nets, missing material cannot destroy them, because the eroded net is already connected.)
01's conclusion overclaims. Its statement says the net bijection preserves device-terminal incidence, but its proof handles only nets. Devices are components of poly ∩ active and perturb under their own sandwich; the missing device-level hypotheses (D1)–(D3) are stated in 02. (D3) — terminals stay attached — is exactly where line-end pullback bites, so the enclosure rules are its hypotheses, not the net-level theorem's.
Established during scoping (the geometry face)
The right model of a layout is a coloured image plus a fixed z-extrusion.
d = F(L) derived layers; F = booleans + morphology
c : ℝ² → 2^Layer pointwise colour
M : ℝ³ → Material, M(x,y,z) = Z(c(x,y), z)
This is literally what DRC/extraction decks compute (gate = poly AND diff). Two refinements: the algebra is booleans plus morphology (grow/shrink), because self-alignment and diffusion mean the doped extent is the boolean then sized; and the vertical stack is a process constant, which is exactly why a finite extraction pattern library is possible at all. If z varied per design, no library would exist.
The model is exact for interconnect, lossy for devices. BEOL is conductors and dielectrics in fixed geometry — R and C are functionals of M via Laplace, nothing lost. FEOL doping is a continuous 3D concentration profile; the colour only identifies that there is an NMOS here, and (W,L) come from geometry while behaviour comes from a fitted compact model. So verified extraction is available for interconnect and not for devices.
The morphological sandwich, and why DRC is a theorem's hypotheses.
∀ mask m: erode(D_m + d_m, r_m) ⊆ A_m ⊆ dilate(D_m + d_m, r_m), |d_m| ≤ overlay_m
r_m = bias_m(density) + k·σ_m
(a) ∀ nets n: erode(D_n, r) connected [min width, neck/notch rules]
(b) ∀ n≠n': dist(D_n,D_n') ≥ r + r' + overlay [colour-aware spacing rules]
(c) ∀ vias: enclosure ≥ pullback + overlay [enclosure rules]
⟹ connectivity_graph(A) = connectivity_graph(D)
Proof is one line each way (erosion spans the net ⟹ connected; dilations disjoint ⟹ no shorts). Min-width and min-spacing rules are precisely (a) and (b). This is self-contained computational geometry — no PDEs, no Sobolev spaces — and converts a large fraction of a DRC deck from folklore into hypotheses. If one piece of the geometry face is formalised first, it should be this.
Caveats: bias is density-dependent so r = r(x); line-end pullback and corner rounding are systematic and are why (c) exists; vias are the dominant open mechanism and are not bounded in-plane at all; multiple patterning makes overlay a rigid per-mask displacement, a different perturbation class, hence colour-aware spacing.
Sub-resolution mask features do not transmit — lithography is a low-pass filter. A gap much smaller than the resolution limit prints as a slight narrowing or nothing. Proof that this is real: sub-resolution assist features work precisely by not printing. So the geometry family to propagate is band-limited, not arbitrary polygon perturbation. Another restoration-like property.
LER does not sever wires; defects do. Severing requires roughness to consume the full width — Gaussian-tail suppressed. The sandwich with r = bias + 4σ is effectively deterministic. Topology changes are Poisson defects handled by test (P5). Same continuous/discrete split as L0.
Extraction is pattern matching against a field-solver-characterised library — template matching on cross-sectional images, with the rule deck as a trained model. The replacement is rigorous enclosures: Dirichlet principle gives upper bounds from any trial potential, Thomson's principle gives lower bounds from any trial flux field, so any pair of trial fields yields a two-sided bracket. Verified-numerics machinery for elliptic BVPs is mature (Nakao, Plum, Watanabe). And the accuracy requirement is soft: ~5% vs field solver, against 10–20% derates already carried — so crude-but-rigorous bounds suffice, which is unusual and makes this viable.
2D may be exactly solvable. Schwarz–Christoffel mapping gives closed-form multiconductor capacitance for piecewise-linear 2D cross-sections in terms of elliptic integrals; verified numerics then only handles the 3D corrections. Better decomposition than treating everything as a 3D PDE.
Corner singularities are the real obstacle. Charge density diverges like r^(−1/3) at a right-angle conductor corner, exactly where the capacitance concentrates. Exponents are analytically known, so graded meshes work — but verified quadrature must handle integrable singularities.
You want enclosures over a geometry family anyway. As-fabricated ≠ drawn (etch bias, LER, CMP). So the right object is "∀ geometries within tolerance, C ∈ [lo,hi]" — which interval methods give naturally and which is arguably more faithful than the point-geometry field solve it replaces.
Below extraction it becomes image processing for real: DRC is polygon booleans; LVS is extraction + graph isomorphism; OPC is literal inverse imaging (simulate partially-coherent image formation, iteratively adjust mask polygons); fracturing is rasterisation, and multi-beam mask writers take a bitmap. Note E7 sits between LVS and the fab: the mask is deliberately not the drawn layout, so LVS-verified geometry is not what prints.
GDS is a clean formal object with dirty corners. A finite set of layer-tagged integer-coordinate polygons plus a hierarchy — far cleaner than Verilog. But: layer numbers are semantically empty (need an external layer map); PATH endcap type 1 is a semicircle so the format isn't purely polygonal; self-intersecting polygons and same-layer overlap semantics are unspecified. Restrict to a well-formed subset. Encouragingly, OpenROAD-era routing streams out as BOUNDARY polygons — so production output lives in a much cleaner subset than the format permits (pinned per layout by the checker).
The geometric combinatorial obligations
L1 owns a set of finite, decidable checks — the discharge points for conditions L0's operating envelope only states (L0/06 has the dispatch table). These are the combinatorial, relational geometry (spacing, taps, "≥ N apart") that make up the geometry ingredient of the digital crossing, as opposed to the continuous field geometry that stays in L0's edge. Stated precisely as G1–G6 in 12: tap coverage, ECC interleaving, antenna ratio, width/spacing/enclosure, shielding coverage, and tied fill.
Two of the six are not properties of the geometry alone — interleaving needs the ECC word structure from L3/L5, and the antenna check quantifies over prefixes of the process order rather than over the finished layout. That is worth carrying as a general caution: some geometric obligations need inputs a layout tool does not record.
The recurring structure, seen from this layer
Three of the project's global patterns surface here in their sharpest forms. The clock edge is a restoration point in time — the induction invariant is fully re-established every cycle, so nothing accumulates (07). The boundary gadgets are phase restorers — the window hypothesis is manufactured on-die, never imposed on the world (11). And the analog residue is confined to single entry points: the power grid enters once as an impedance bound, coupling enters once as an interval widening plus a geometric rule (05) — with the red line that any net needing a functional coupling constraint is a layout bug.
Open problems
From the geometry face:
- The screening exponent — the load-bearing open problem of the geometry face. The far-field coupling sum does not obviously converge: the count of nets at distance d grows polynomially while unscreened coupling decays only logarithmically. Truncation is justified not by "distant things are small" but by screening making the decay fast enough. The mechanism is a mesh of apertures in series, giving multiplicative attenuation and hence
C_far(d) ≲ C_adj · α^(d/p)— exponential in grid cells traversed. The rigorous object is harmonic measure of the aperture set, bounded via the maximum principle (complete enclosure ⟹ exactly zero; this case is topological, not metric, and so combinatorially checkable). Deriving α is a genuine analysis problem and everything in local extraction depends on it (10). - Formalising the variational characterisations of capacity — Sobolev machinery, well outside current Mathlib-scale infrastructure.
- Verified quadrature with r^(−1/3) singularities.
- Whether metal fill must be tied rather than floating: floating conductors do not screen, they relay, shortcutting an aperture chain. Should be a requirement, not an option.
From the edge up:
- Write the bridge theorem (07) — bounded-delay model, window rule, per-cycle induction, multi-domain composition (11).
- A verified STA engine with the three soundness deviations (08): four-corner interpolation, slew intervals, in-pass domain checks.
- Prove the constraint set complete — every domain declared or its absence a named finding (04).
- The monotonicity census and the tier model (09) — decides whether M4 is a footnote or a project.
First experiments
This layer holds the whole project's tractable entry point — 04's work plan: census the domains, diff against the generated constraints, and complete or record each gap. Weeks, needs only the flow's own artifacts, and either outcome is worth having. Alongside it, two mechanical censuses that other files consume: library-wide table monotonicity (08/09) and the clock-network cleanliness check (10).
On the geometry face:
- Formalise the sandwich theorem. Self-contained, no analysis, converts DRC into hypotheses. Highest value per effort in the geometry face by a wide margin.
- Run
magic/netgenLVS oninv_1and check the extracted netlist against the intended one; measure what a per-cell LVS obligation costs. - Sanity-check the screening claim numerically on a toy 2D mesh before committing to open problem 1.
Effort
3–5.5 years for the merged layer: 2–4 years for the geometry face (the widest error bars in the project — open problem 1 could be six months or could be a thesis; the FPGA alternative deletes it entirely) plus 1–1.5 years for the edge up (the theory concentrated in the bridge theorem and the digital abstraction, the rest verified-algorithm work and measurement). The entry-point experiments are weeks.
Reading
Pólya & Szegő, Isoperimetric Inequalities in Mathematical Physics (1951) — rigorous capacity bounds. Nakao, Plum, Watanabe, Numerical Verification Methods and Computer-Assisted Proofs for PDEs. Driscoll on Schwarz–Christoffel. Lööw's HOL4 Verilog semantics and the Silver/Lutsig stack — closest prior art for a verified path from RTL to netlist; note it stops short of the bridge statement. Standard STA texts for the algorithm — none state the soundness bridge. McGeer & Brayton for the false-path/viability criterion (04). Zgliczyński, Galias, Demir–Mehrotra–Roychowdhury for 10's oscillator contract; Marino for why 11's ε is irreducible.
L1/00 — The layout as a formal object
Background
A chip is built, not carved: it starts as a blank silicon wafer and grows upward through a few dozen processing steps, each one adding, doping, or removing material across the whole wafer at once. The repeating move is photolithography: coat the wafer with a light-sensitive resist, project a pattern onto it through a mask (a stencil, one per patterned step), develop away the exposed resist, and then let the step's real action — etching material away, implanting dopant atoms, depositing metal — act only where the resist is gone. Repeat per layer: first the transistor-forming layers (doped wells in the silicon, the active/diffusion regions, the polysilicon gate material), then, above them, an alternating stack of insulating oxide and patterned metal wiring — met1 through met5 on this process — with vias (small holes filled with metal) connecting one metal level to the next.
The consequence for formalisation is happy: since every step is controlled by a 2D stencil, the entire design content of a chip is a finite stack of 2D polygon sets — one set per layer. That is literally what the design file contains: GDS, the format handed to the mask shop, is a list of polygons with integer coordinates (in database units of 1 nm here), tagged by layer number, organised in a hierarchy of reusable cells. The third dimension is not in the file, because it is not the designer's to choose — the vertical structure (layer thicknesses, what material ends up where when layers overlap) is fixed by the fabrication recipe, identical for every design on the process.
The formal picture this chapter builds is therefore: a drawn layout is a map from layers to polygon sets; a point of the plane has a "colour" — the set of layers covering it; and the process turns colours into materials via a fixed vertical profile, yielding the 3D material distribution that the physics layers below actually analyse. Two further wrinkles the definitions must carry. Some process layers are not drawn directly but derived from drawn ones by boolean combinations and small resizings (the rule deck — a program, supplied by the foundry, that this chapter must treat as part of the spec). And connectivity — which metal shapes form one electrical net — is genuinely three-dimensional, established through vias, so it can only be computed on the assembled stack, never per layer.
Statement
Fix the objects every other L1 theorem quantifies over: what a layout is, what the process turns it into, and which GDS files are admissible.
Nothing here is deep. It is written out because every subsequent statement — the sandwich theorem, LVS, the capacitance enclosures — is a claim about these objects, and they are currently defined only by the behaviour of tools.
Definitions
Layers. A finite set 𝓛, with a distinguished mask assignment col : 𝓛 → Masks (multiple patterning; singleton in the SKY130 case).
Drawn layout. D : 𝓛 → 𝒫(ℝ²), each D_ℓ a finite union of simple polygons with vertices in (δ·ℤ)² where δ is the database unit (exactly 1 nm in SKY130 — measured, Findings). Obtained from GDS by flattening the SREF/AREF hierarchy.
Colour. c_D : ℝ² → 2^𝓛, c_D(x) = {ℓ : x ∈ D_ℓ}. Finitely many values, and only a small subset of 2^𝓛 is realised — the "sparse colouring" of the coloured-image model.
Derived layers. d = F(D) where F is generated by boolean operations and morphology (⊕ B_s, ⊖ B_s). Morphology is not optional: self-alignment and diffusion mean a doped region is a boolean expression then sized. F is the rule deck; it is a program, and formalising L1 means formalising the fragment of it the design uses.
Material distribution. With a process z-profile Z : 2^𝓛 × ℝ → Material,
M(D) : ℝ³ → Material, M(D)(x,y,z) = Z(c_{F(D)}(x,y), z)
This factorisation is the whole reason L1 is tractable: Z is a process constant, identical for every design on the node, so the extraction pattern library is finite and the design variable is purely the 2D colouring. If Z varied per design, no library could exist. (Second-order caveat: CMP makes thickness density-dependent, so Z carries a correction term depending on local pattern density — see 12.)
Conductive set. Cond(D) = M(D)^{-1}(conductor) ⊆ ℝ³. Nets are its connected components — note this is genuinely 3D connectivity, through vias; the per-layer 2D picture does not determine it.
Admissible GDS
The format permits objects with no agreed meaning. Restrict to a well-formed subset and say so, rather than inheriting tool-specific conventions:
| construct | issue | restriction |
|---|---|---|
| layer numbers | semantically empty — an external layer map is required | the map is an explicit parameter of every statement |
PATH pathtype 1 | endcap is a semicircle — the format is not purely polygonal | forbid, or fix a polygonalisation tolerance |
| self-intersecting polygons | undefined | forbid |
| same-layer overlap | union or XOR? unstated | fix: union |
SREF non-90° rotation, magnification ≠ 1 | rounding on integer coordinates | forbid |
Encouragingly the restriction is expected to cost nothing in practice: OpenROAD-era stream-out emits BOUNDARY polygons for routing, so production output lives in a much cleaner subset than the format allows — a claim the layer's checker pins per layout. The hand-drawn library cells do use PATH (2 in inv_1), so the polygonalisation question is confined to ~400 small files.
What is not determined by D
Worth listing, because these are the inputs to every later theorem and each is an axiom or a separate model:
Z, the z-profile — process constant, empirical (part of E7's context).r_ℓ, the perturbation radii — bias + roughness, density-dependent (E7).d_m, the per-mask overlay — rigid displacement per mask (E7).ε, the permittivity field — a material property, measured (feeds 09).- The process order — which matters for the antenna check, which quantifies over prefixes of the build sequence rather than over the finished layout.
Obligations
O1 (flattening). Hierarchy flattening is correct: c_D computed from the flattened polygon set equals the one computed compositionally. Mechanical, but note that abutted cells' wells and implants deliberately merge — inv_1's bbox is 1.760 × 3.100 µm against a 1.380 × 2.720 µm cell boundary — so the colouring of a row is not the disjoint union of its cells' colourings. Composition needs a merging lemma, not conjunction.
O2 (rule-deck fragment). F restricted to the operations the deck actually uses is well-defined and monotone where claimed.
O3 (finiteness). c_D takes finitely many values and each level set is a finite union of polygons — so all downstream quantification is over finite structures.
Effort
Small, and it is the prerequisite for everything else in the layer. Weeks for the definitions; the rule-deck fragment (O2) is the only part that could surprise.
L1/01 — Topology preservation (the sandwich theorem)
Background
The fabricated chip is not the drawn one. Printed features come out with rounded corners and shifted edges: optical diffraction blurs the pattern (at 130 nm the features are already smaller than the light's wavelength), etching eats slightly under the resist (bias), the edges are rough at the nanometre scale (LER, line-edge roughness), and each mask is aligned to the layers below it only within a mechanical tolerance (overlay). None of this is failure; it is the process working as specified, with every effect bounded by numbers the foundry publishes. The question with everything riding on it: under exactly these bounded distortions, does the printed chip still have the same circuit — the same nets, connected the same way, touching the same transistors — as the drawn one? A distortion that merely moves capacitances slightly is absorbed by analysis intervals; one that severs a wire or bridges two nets produces a different machine.
Industry's protection is the design rules: the foundry's rulebook of geometric minima — wires no narrower than this, no two shapes closer than that, this layer overhanging that one by so much — mechanically checked over the whole layout by DRC (design rule checking), with a clean run required before fabrication. The unstated belief connecting the two: pass DRC on the drawing, and the printed version is topologically identical to the drawing. That belief is a theorem nobody has written — the book's flagship instance of "a design rule is secretly a hypothesis of a theorem nobody wrote" — and this chapter writes it.
The mathematics that fits is mathematical morphology, the calculus of dilating and eroding shapes. Dilation (X ⊕ B_r) grows a shape by radius r — everything within distance r of X; erosion (X ⊖ B_r) shrinks it — the points still inside X even after retreating r from every boundary. These two operators turn "the fab prints imprecisely, but by at most r" into a clean two-sided containment — the fabricated shape is sandwiched between the drawn shape eroded and the drawn shape dilated — and turn the design rules into statements with exact roles: minimum spacing guarantees dilated shapes of different nets cannot meet (no bridging), minimum width keeps eroded shapes from vanishing (no severing) — though, as the proof discovers, width alone is not quite enough, and the humble notch/neck rules turn out to be load-bearing. The theorem's payoff is the licence the entire industry already uses daily without stating: geometric checking performed on the drawn polygons soundly certifies the fabricated chip.
Why this one first
It is the only major L1 result that is self-contained computational geometry — no PDEs, no Sobolev spaces, no empirical models — and it is what licenses the entire geometric verification flow: run LVS and DRC on the drawn layout, conclude about the fabricated one. Every EDA flow relies on that inference and none states it.
Writing it precisely turned up a missing hypothesis. See the island problem.
Notation
Minkowski operations on X ⊆ ℝ³, with B_r the closed ball:
erosion X ⊖ B_r = { x : B(x,r) ⊆ X }
dilation X ⊕ B_r = ⋃_{x∈X} B(x,r)
Two facts do the work. Dilation distributes over unions, (⋃Xᵢ) ⊕ B_r = ⋃(Xᵢ ⊕ B_r) — this drives separation. Erosion does not; it distributes over intersections — which is exactly why connectivity is a hypothesis and not a consequence.
The perturbation model
D drawn (00), A as-fabricated. Per mask m: a rigid overlay displacement d_m and a radius r_m = bias_m(density) + k·σ_m.
(P) ∀m: (D_m ⊕ d_m) ⊖ B_{r_m} ⊆ A_m ⊆ (D_m ⊕ d_m) ⊕ B_{r_m}
Write r = max_m r_m and let Cond(·) be the conductive subset of the induced material distribution, so (P) lifts to Cond(D) ⊖ B_r ⊆ Cond(A) ⊆ Cond(D) ⊕ B_r.
Theorem
Let
N₁,…,N_kbe the connected components (nets) ofCond(D). Assume
- (H1) ∀i:
Nᵢ ⊖ B_ris nonempty and connected- (H2) ∀i≠j:
dist(Nᵢ, Nⱼ) > rᵢ + rⱼ + |d_{m(i)} − d_{m(j)}|- (H3) every connected component of
Cond(A)meetsCond(D) ⊖ B_rThen for every
Asatisfying (P) there is a bijectionνfrom nets ofCond(D)to nets ofCond(A)withNᵢ ⊖ B_r ⊆ ν(Nᵢ) ⊆ Nᵢ ⊕ B_r, andνpreserves incidence with device terminals.
Proof
- By (H2) the dilations
Nᵢ ⊕ B_rare pairwise disjoint. Cond(A) ⊆ Cond(D) ⊕ B_r = ⋃ᵢ(Nᵢ ⊕ B_r)by distributivity. Since the parts are disjoint, every connected component ofCond(A)lies wholly inside exactly oneNᵢ ⊕ B_r.- By (H1),
Nᵢ ⊖ B_ris nonempty, connected, and contained inCond(A); so it lies in a single component, call itν(Nᵢ), and by 2 that component is insideNᵢ ⊕ B_r. - Injective: distinct
igive components in disjoint dilations. - Surjective: by (H3) each component of
Cond(A)meets someNⱼ ⊖ B_r; by 2 it lies in a uniqueNᵢ ⊕ B_r; disjointness forcesi = j; so it isν(Nⱼ). ∎
The island problem
Without (H3) the theorem is false. Steps 1–4 go through and give an injection, but not a surjection: A may contain a component sitting inside Nᵢ ⊕ B_r \ (Nᵢ ⊖ B_r) — a sliver of spurious material — which is a net that does not exist in the drawn layout. The sandwich (P) does not forbid it, because it constrains only containment, not the boundary's shape.
Two ways to repair, and the choice matters:
- (i) Assume (H3). Clean, and honest about what it is: a claim that the process does not create spurious material. It is not checkable — it quantifies over
A, which you do not have. So it belongs to E7, and this is a genuine sharpening of E7's content. - (ii) Strengthen (P) to an edge-displacement model —
∂Ais a graph over∂D, each boundary point moved along the normal by ≤ r. This implies (H3) and is physically the right model (etch and litho move edges; they do not nucleate islands). Cost: it needs a normal field, hence regularity of∂D, which polygons with corners do not have without care.
Recommendation: take (i), and cite (ii) as the physical reason (i) is true.
No dual hypothesis is needed for voids. A spurious hole cannot disconnect ν(Nᵢ), because ν(Nᵢ) ⊇ Nᵢ ⊖ B_r, which (H1) already makes connected. The asymmetry is real: extra material creates nets, missing material cannot destroy them.
Which DRC rules are which hypothesis
Sharper than the README's earlier claim that "min-width and min-spacing are precisely (a) and (b)":
| hypothesis | rule | relationship |
|---|---|---|
| (H2) | min spacing, colour-aware | rules ⟺ hypothesis, essentially exactly |
| (H1) | min width | necessary, not sufficient |
| (H1) | notch / neck rules | supply the missing part |
| (H3) | — | no rule; it is an assumption (E7) |
(H1) is not min-width. Erosion of a connected set need not be connected — a dumbbell erodes to two blobs. Min-width w > 2r makes the erosion locally nonempty; it does not keep it connected across a neck. Notch and neck rules are exactly the missing content, and this is the precise sense in which they are load-bearing rather than cosmetic.
(H2) explains colour-awareness for free. The overlay term is |d_{m(i)} − d_{m(j)}|, which vanishes when the two features share a mask — same-mask features move together. Different-mask pairs need the full overlay budget. That is precisely why multiple-patterning decks carry colour-aware spacing rules, and here it falls out of the statement rather than being a separate convention.
Checkability
| on the drawn layout? | cost | |
|---|---|---|
| (H1) | yes — erode per net, test connectivity | polygon morphology + union-find, near-linear with a scanline |
| (H2) | yes — min-distance between distinct nets, colour-aware | near-linear |
| (H3) | no — a claim about A | assumption → E7 |
So the theorem has two checkable hypotheses and one assumed one, and it is worth stating in exactly that form: conditional on E7, geometric checking on D is sound for A.
Caveats
Vias are not covered, and they are where the failures are. The theorem is 3D so vias participate in Cond, but the perturbation model (P) is an in-plane edge displacement. A via failure is a fill/void phenomenon in z — not an edge moving — so it is outside (P) entirely. Incomplete via fill is the dominant open mechanism in real chips. A separate model for vias is the largest gap in this document.
r is not a constant. Etch bias depends on local pattern density (loading), so r = r(x). The theorem is unaffected — take r pointwise and the containments still hold — but the checks must use the local value, which means the density computation feeds the DRC check rather than sitting beside it.
Line-end pullback and corner rounding are systematic and directional, not captured by an isotropic ball. They are why enclosure rules exist, and a faithful model needs a structuring element that is not a ball. The theorem generalises to any convex structuring element without change; the checks get more expensive.
What it buys
Composed with 02:
LVS(D) ≅ intended ∧ (H1) ∧ (H2) on D ∧ E7 ⊨ (H3)
⟹ LVS(A) ≅ intended
That is the soundness of running LVS on drawn geometry — the inference the whole flow makes silently, now with its hypotheses named and two of the three mechanically checkable.
First experiments
- Implement (H1) and (H2) on
data/pdk/inv_1.gdswith a plausibler. One cell, small, and it exercises the whole pipeline: flatten, derive, erode, component-test. - Then a row of abutted cells, to exercise the merging lemma (L1/00 O1) — recall
inv_1's nwell and implants overhang the cell boundary by design, so a row's colouring is not the disjoint union of its cells'. - Check whether SKY130's published notch/neck rules are strong enough to give (H1), or only min-width. If only min-width, (H1) has a gap in the deck itself — which would be a real finding.
Effort
The most tractable substantial result in L1: months, not years, and it needs no analysis. If one piece of the layer is formalised first, this is it.
Reading
Serra, Image Analysis and Mathematical Morphology, for the Minkowski calculus. Grisvard for what corner geometry does to the regularity that route (ii) would need.
L1/02 — Extraction and LVS
Background
A layout is polygons; a netlist is transistors and wires. Extraction is the map between them — the recognition procedure that reads a circuit back out of geometry — and its key fact is a beautiful economy of the CMOS process: a transistor is not drawn; it happens. Wherever a polysilicon shape crosses an active (diffusion) region, the crossing is a MOSFET: the poly strip over the crossing is the gate, insulated from the silicon by the thin oxide grown between them; the two pieces of active region on either side are the source and drain; and the surrounding well determines whether it is the N-type or P-type flavour. Even the transistor's electrical parameters are geometric readings — channel length L is the width of the poly strip, channel width W the extent of the active region it crosses. Wires, likewise, are just the connected clumps of metal-and-via material. So extraction is: intersect two layers to find the devices, compute 3D connected components to find the nets, record which touches which.
LVS — "layout versus schematic" — is the industrial check built on extraction: extract the circuit from the drawn polygons and compare it, as a graph, against the intended netlist. The comparison is graph isomorphism, which is notoriously hard in general and easy here for a concrete reason the chapter explains: the graph's nodes are richly labelled (device types, W/L values, port names), and the labels shatter the graph into tiny equivalence classes before any search begins. A clean LVS run is the flow's certificate that what was drawn is the circuit that was meant — which, chained with 01's sandwich theorem ("what is printed is topologically what was drawn"), yields the layer's full conclusion: what is printed is the circuit that was meant.
This chapter also owns a piece of honesty about 01: writing the composition revealed that the sandwich theorem as stated covers nets but not devices — a printed distortion could in principle sever a transistor or detach a terminal without violating any net-level hypothesis — so the device-level analogues (D1)–(D3) are added here, and the enclosure/extension design rules find their formal role as exactly those hypotheses.
Statement
The layout implements the intended netlist: Ext(M(A)) ≅ N_intended, an isomorphism of labelled graphs.
Place and route, and the certificate that replaces monolithic LVS
The statement above is LVS as an independent oracle: throw away how the layout was made, read the circuit back out of the polygons, and compare. That is the right picture when the layout is an inherited artifact of unknown provenance. Here it is not — the layout is generated from the netlist by a program this repository runs — and that changes the cheapest sound architecture. For the stages of the generator that are deterministic we validate the program once; for the stages that search we extract a certificate from the check the search already performs on the configuration it accepts. Re-deriving the whole circuit from silicon to compare against the netlist is redundant work when the netlist is the generator's own input.
What place and route are. The netlist is a graph — cells, and which pins share a net — with no geometry. Two stages give it geometry.
Placement assigns every cell instance a location and orientation in the standard-cell rows: the netlist's 203,027 instances become 203,027 COMPONENTS in the DEF, each stamped with (x, y, orient). It changes nothing logical — same instances, same nets, same incidence — placement only decorates the graph with coordinates. It is a search (minimise wirelength and congestion, meet timing) but a connectivity-preserving one.
Routing assigns every net a set of metal wires and vias that physically join its pins: the netlist's nets become 67,449 NETS in the DEF, each carrying geometry. This is where connectivity is genuinely decided — the router chooses which metal, on which layer, through which vias, realises the net — and its acceptance criterion is exactly two properties: every net's pins connected (no opens), no two nets' metal touching (no shorts).
A single net makes it concrete. In the routed DEF:
- _000000_ ( _111026_ D ) ( _053306_ X ) + USE SIGNAL
+ ROUTED met1 ( 2169590 1965370 ) ( 2174190 * )
NEW li1 ( 2174190 1965370 ) L1M1_PR_MR
NEW li1 ( 2169590 1965370 ) L1M1_PR_MR ;
The netlist says only "net _000000_ joins the output pin X of cell _053306_ to the input pin D of cell _111026_" — an edge, no geometry. Placement put _053306_ near (2.1696, 1.9654) mm and _111026_ about 4.6 µm to its right. Routing then chose the physical wire: a li1→met1 via at each pin (L1M1_PR_MR), and a met1 segment from x = 2.16959 to x = 2.17419 mm at y = 1.96537 mm joining them. That three-shape path is the connection. The NETS section is 67,449 such witnesses (coordinates are integer nanometres).
The decomposition. Read this way, RTL → GDS is a pipeline of stages, each with its own certificate:
| stage | kind | certificate |
|---|---|---|
| RTL → netlist (synthesis) | search | combinational equivalence (L2/04) |
| netlist → placement | search | connectivity-preservation (a deterministic invariant: same instances, same nets) + placement legality |
| placement → routing | search | connectivity + isolation — the routed-DEF NETS, re-verifying no-opens and no-shorts |
| (place + route) → GDS | deterministic | validate the streamout program: GDS = f(DEF, cell masters) |
| cell masters ⊨ function | finite library | L0/06 + per-master cell-LVS |
Monolithic LVS — re-extract the whole 362 MB GDS and isomorphism-check it — is then unnecessary, and the extraction machinery of this chapter narrows to where it is still load-bearing: the finite cell library (each master's polygons ⊨ its CDL, amortised once — the extraction theory below), and the validation of the streamout program (which assembles the GDS deterministically from the DEF and the placed masters). The only genuinely decided connectivity in the whole flow is the routing, and the router already computed its witness and checked it — the flow runs checker-disconnectedpins (no opens) and checker-trdrc (no shorts; ChipTop.drc is empty). Passing those is the connectivity certificate; the L1 obligation becomes to re-verify that witness with a small independent checker rather than to re-derive the circuit from silicon.
This is the same search-vs-certificate split L2/04 makes for SAT — the tool stays an untrusted heuristic search; trust lives in a small checker of the witness it emits — pushed down to place and route. The extraction map that follows is now scoped to the two places it is genuinely needed, not to the chip.
Measured: the routing witness re-verified
tools/routecheck.py reads the routed DEF (ChipTop.def: COMPONENTS 203,027 placed, NETS 67,449 routed) and re-derives both acceptance properties from the routing geometry alone; check-l1 carries it as routing-witness.
No-shorts. Over all 559,285 wire segments, zero pairs of distinct nets have intersecting centerlines — a sound short-detector (crossing centerlines are a guaranteed short, independent of wire width), run by a sweep-line across each layer. This re-verifies trdrc independently of the router.
No-opens. Each net's segments and vias are unioned into connected components (endpoints, via layer-crossings, T-junctions where a via lands mid-segment, and segment crossings). All 41,287 two-pin nets self-connect — and for a two-pin net the routing is the entire connection, so this is the complete no-opens check for the 61% of nets that are two-pin. The 11 unrouted nets are exactly the 11 one-pin nets (nothing to route). The residual 3,762 multi-piece nets are all large-fanout nets whose routing additionally connects through the pin metal shapes — visible only with the cell pin geometry (LEF + placement), which is the extraction half of this chapter, not an open: the router's own disconnectedpins already certified none. Closing them is the cell-master obligation below, not a defect.
So the connectivity content of LVS is obtained here as a witness-check of the router's output — no re-extraction of silicon — with the residual precisely delimiting where the cell-library extraction is still needed.
The extraction map
Given a material distribution M (00):
Devices. Connected components of poly ∩ active. Each is one MOSFET: the component is the gate, the two active regions it separates are source and drain, the surrounding well fixes the type. This is the sense in which a transistor is the intersection of two rectangles — visible directly in inv_1, where poly (0.430 µm wide) crosses diff (0.670 × 2.250 µm).
Parameters. L = the poly dimension across the channel, W = the active dimension along it. Both are read off the geometry, which is why the geometry family propagates into device parameters and hence into E1's enclosure. (On FinFET these quantise to fin counts — a strictly easier map, since the parameter is an integer.)
Nets. Connected components of Cond(M) — 3D, through vias.
Incidence. Which device terminals meet which nets.
Ext(M) is the resulting labelled bipartite graph.
Theorem
Under 01's hypotheses (H1)–(H3), plus a device-level analogue (D1)–(D3) below:
Ext(M(A)) ≅ Ext(M(D)) for every A in the sandwichso checking
Ext(M(D)) ≅ N_intendedon the drawn layout settles the fabricated one.
That composition is the soundness of LVS as actually practised, and it is the point of having 01 at all.
A gap in 01, found by writing this
01's stated conclusion includes "ν preserves incidence with device terminals", but the proof as given does not deliver it. The proof handles nets — components of Cond — and says nothing about devices, which are components of poly ∩ active and perturb under their own sandwich.
What is needed is a device-level analogue:
- (D1)
(poly ∩ active) ⊖ B_rhas the same number of components aspoly ∩ active, each nonempty and connected — i.e. no device is severed or split. - (D2) distinct devices stay separated:
distbetween components exceeds the summed radii plus overlay. Note this is a different rule from net spacing — it is poly-over-active spacing, and it is why gate-to-gate and poly-extension rules exist. - (D3) incidence is stable: a terminal that meets net
NinDmeetsν(N)inA. This does not follow from (D1)+(D2); it needs the source/drain active region to remain attached to its net under perturbation, which is what enclosure and extension rules supply.
(D3) is the interesting one: it is precisely where line-end pullback bites, since a poly line end that retracts can expose channel, and a contact that pulls back can detach a terminal. So the enclosure rules flagged in 01 as "systematic and directional" are the hypotheses of (D3), not of the net-level theorem.
Action: 01's theorem statement should be weakened to nets only, with (D1)–(D3) added here. Left as-is in 01 with a pointer, so the gap is visible rather than silently patched.
Why the isomorphism check is easy
Graph isomorphism is hard in general and trivial here, for a specific reason: label diversity. Devices carry (type, W, L); nets carry names when they survive synthesis, and port nets carry them always. Refinement by labels partitions the graph into tiny cells before any search begins. Production LVS tools exploit exactly this and scale to hundreds of millions of devices.
So the difficulty is not the isomorphism. It is that Ext must be well-defined.
The real obligations
E1 (well-definedness). Ext(M) picks out finitely many devices and nets, with unambiguous terminal assignment. Non-obvious cases that must be decided rather than inherited from tool behaviour:
- a poly shape crossing active twice ⟹ two devices sharing a gate net;
- poly over field oxide (no active beneath) ⟹ no device — this is why
npcand field-poly layers exist; - abutted diffusion: two devices sharing a source/drain region with no contact between, which is a normal and space-saving idiom, not an error;
- a device whose "two sides" are actually one connected active region (a poly ring) — must be excluded or given a convention.
E2 (parameter tolerance). Real LVS compares W/L up to a tolerance, so the statement is isomorphism up to parameter windows — and the windows must contain the whole geometry family, linking directly to 01's r.
E3 (computability). All predicates are polygon boolean operations plus connected components: near-linear with a scanline.
First experiments
The generator decomposition reorders these. The chip-level connectivity certificate is the routing witness, not a re-extraction, so the first build is a checker over the routed DEF's NETS: per net, build the segment+via adjacency graph, confirm it is one connected component touching exactly the net's pins (re-verifying checker-disconnectedpins), and confirm no two nets' geometry abut (re-verifying checker-trdrc), cross-checked against the netlist's net membership. Then the two lighter obligations: the placement connectivity-preservation invariant (the DEF's instances and nets are identical to the synthesis netlist — a diff; note COMPONENTS 203027 already equals the post-route netlist's cell count), and the streamout validation (GDS = f(DEF, masters)).
The extraction theory then applies only to the library, where it is cheap and finite:
- Extract
inv_1from its shipped GDS against its CDL. Two devices expected; checkW,Lagainst the measured geometry (poly 0.430 wide over diff 0.670 × 2.250). This is the cell-master half of the decomposition, and it composes with L0/06's switch-level certificate on the same 437 cells. - Enumerate which of E1's edge cases occur in the SKY130 HD library. If none do, well-definedness shrinks to a short list of excluded patterns.
- Attempt (D1)–(D3) on the same cell to size the device-level sandwich.
Effort
Small relative to the rest of L1, and smaller than the monolithic framing suggested: the chip-level check is a witness-verifier over 67,449 routed nets (near-linear, no isomorphism search), and the extraction algorithms run only on the finite library. The cost is in E1's conventions and the (D1)–(D3) gap above, neither deep, both of which must be decided rather than discovered.
L1/03 — The timed model
Background
The Mealy-machine picture of L2 — evaluate the logic, tick, update all flops at once — is a fiction about time. Physically, a gate's output does not change when its input changes; it changes afterward, by a delay that depends on how strongly the gate can drive its output wire, how much wire and how many listening inputs hang on it (the load), and how sharp the incoming transition was (the slew — the transition's rise time; a sluggish input edge makes the gate respond more sluggishly still, which is why slew must be tracked and propagated just like the values themselves). Signals racing through different paths of the logic arrive at different moments, and mid-race the wires hold a churn of transient values with no logical meaning.
The synchronous discipline is the design style that tames this — it is the foundational idea of digital design. Storage elements (flops) capture their inputs only at the clock edge; between edges, the combinational churn is deliberately ignored, given a full clock period to play out and settle. Correctness then rests on one local requirement per flop, in two halves. Setup: the flop's data input must have reached its final, settled value some margin before the clock edge — so every path from the previous flops must be fast enough to finish within the period. Hold: the input must then stay unchanged for a margin after the edge — so no path may be too fast, delivering the next cycle's new value while the flop is still capturing the old one. A flop whose input moves inside this forbidden window around the edge may capture garbage — including the genuinely strange failure called metastability, treated properly in 11; for now the model simply declares such a flop's output unconstrained. If every flop's window is respected at every edge, the settled values are exactly what the Boolean semantics computes, and the fiction becomes a theorem — that implication is this layer's bridge theorem (07), and the present chapter builds the model it is stated over.
One modelling decision needs flagging because everything downstream inherits it: delays in this model are intervals, not numbers. A physical gate's delay varies with manufacturing luck, voltage, and temperature; no single number is true of it. So each delay is a certified range [d_min, d_max], and every theorem quantifies over all behaviours consistent with the ranges — the same universally-quantified, worst-case style ("possibilistic," in contrast to probabilistic) used at every layer below. A theorem in this style is immune to where in its range each delay actually falls; probability enters only later, and only through the explicitly named escape hatches.
Statement
Fix the object the bridge theorem quantifies over: what "the physical circuit" means at L1's altitude. Everything in this layer is a statement about this model; its adequacy is not L1's problem — it is the conclusion of L0/07–05 and L0/09, delivered as Contracts(N).
The model
A network of components with typed terminals, driven by a clock arrival function.
Combinational cells. Each instance computes its Boolean shadow f under a bounded-delay rule: if the inputs are stable (in valid regimes) from time t, the output is stable at f(inputs) from some t' ∈ t + [d_min, d_max], where [d_min, d_max] is the cell's contract arc evaluated at the actual (input slew, output load) — an interval-valued function with an explicit domain, not a constant. Outside the domain the contract says nothing (this is where F2 bites). Output slew is likewise an interval function, because it is the next stage's input.
Wires. Each net delays and degrades: an RC enclosure from L0/09 gives interval wire delay and slew degradation per (driver, receiver) pair.
Flops. The window rule: if the data input is stable throughout [t_edge − t_su, t_edge + t_h], the output becomes that value within [t_cq_min, t_cq_max] after the edge. Otherwise the output is unconstrained — an arbitrary signal for an arbitrary time. This nondeterministic escape hatch is deliberate: it is metastability's slot in the model. Probability enters nowhere in the model itself; it enters only when 11 bounds how often the unconstrained case arises (P1).
Clock. A realised edge sequence (t_n) — the edges as they actually occur, not n·T_nom — with an arrival function arr_n : Flop → interval per edge covering tree skew. All hypotheses are per-interval: T_n = t_{n+1} − t_n ≥ T_min, plus pulse-width bounds. This coordinate choice is load-bearing: the oscillator's phase random-walks unboundedly (X5's diffusion — Var[t_n] ∝ n), but its increments are stationary with tiny variance, so event-indexed semantics with per-interval hypotheses quotients the divergent mode out entirely. Absolute time exists only at L5's interface claims, each carrying its own accuracy term. Supplied by 10; consumed by everything.
Semantics. A run assigns each net a signal (a function from time to regime-classified values) consistent with all component rules. The model is possibilistic: every downstream theorem quantifies over all runs, which is what makes interval delays sound and is the same universal-quantification move L0/00 made over field solutions.
The value lattice: 0, 1, X
Between L1/06's physical regimes and Mealy(N)'s Booleans sits a three-valued logical layer, and naming it resolves several loose ends at once. X is the untracked value: in abstract-interpretation terms γ(X) = the entire safe region of regime space, with γ(0), γ(1) the definite subregions. X covers settled-but-unpredicted values (a flop that violated its window and resolved cleanly to some rail), mid-swing transients, genuine saddle metastability, and unpowered — reserve the word "metastable" for the saddle phenomenon specifically; X is epistemic, not physical.
Three properties carry the weight:
- X is drive-recoverable. A controlling definite input forces a definite output (
AND(0,X)=0); a flop capturing a definite value exits X. This is what distinguishes untracked from broken, and it is why reset works: power-up is all-X, and L3's initialisation obligation is precisely an X-elimination proof — the reset sequence, run in ternary semantics, reaches definiteness on every bit the invariant reads. Checkable by ternary symbolic simulation. - Reading X is demonic beyond "some fixed unknown Boolean." During an unresolved window the same mid-rail wire can be read 0 by one receiver and 1 by another (thresholds differ), so the fresh-Boolean-variable model is unsound (it proves
x∧¬x=0); Kleene ternary is sound becauseX∧¬X=X. The timed model is consistent with this for free: the escape hatch is at waveform level — one voltage, disagreement in the readers. - Z is deleted, not modelled. Classical HDL logic is four-valued; W1/W2 (one driver per net, no floating reads — measured clean) are exactly the licence to drop the undriven value and work ternary. The unpowered case inside
γ(X)matters less here than on multi-domain chips — this design has one core power domain (L5/04) — but it remains load-bearing at the pad ring, where core and IO rails differ.
This layer also gives hypothesis violations their honest meaning: an overclocked core stays physically healthy — combinational wires are ordinary late transients — but mass window violations flood the captured state with X. Mealy(N) over {0,1} stops describing the chip; the ternary machine over {0,1,X} still soundly does; the envelope still holds; recovery (restore the clock, reset, re-drive definiteness) remains provable. L5's operating-conditions clause should define "unspecified" as exactly this: envelope-bounded demonic nondeterminism — far weaker than C-style undefined behaviour.
Why this level exists at all
One could state the bridge theorem directly over Contracts(N)'s dynamical semantics. The bounded-delay model is the right intermediate because it is exactly what STA computes over — the theorem "STA pass ⟹ closure hypothesis" (08) is only crisp if the model's delay vocabulary and STA's coincide. The model is the standard one from the asynchronous-circuits literature (bounded-delay), specialised with contract-valued rather than constant delays.
Obligations
- Adequacy is inherited, and the seam must be stated: every run of L0/08's contract-network semantics projects to a run of this model. This is a lemma against L0, not an axiom — but it must be written, because the two models' notions of "stable" (regime membership vs. voltage band) must be aligned once.
- Well-formedness inputs: combinational acyclicity and one-driver-per-net (L2's W1/W3, to be measured on the hardened netlist).
- The domain conditions (
max_transition,max_capacitance) are part of the model: a run that exits a contract's domain satisfies the model vacuously, so the theorems above it say nothing. Cf. F2.
First experiments
- Write the model formally (signals, component rules, runs) for a three-cell circuit and check the flop escape hatch composes correctly — an unconstrained output must be absorbable by a downstream window hypothesis, not contagious by fiat.
- Prove the projection lemma (obligation 1) for a single inverter against L1/06's regime semantics.
Effort
Small — weeks of definition work. It is scaffolding, but every other file in L1 types against it.
L1/04 — SDC exceptions, and constraint completeness
Background
STA's great virtue — it checks every path — is also a problem, because some paths should not be checked. A signal crossing from an external pin with no timing relationship to the internal clock can never satisfy a setup deadline stated against that clock; a configuration wire written once at boot will never transition during operation; a path through logic that no reachable input combination can actually activate imposes a phantom constraint. Left in place, such paths either fail the analysis spuriously or force the clock slower to accommodate journeys that never happen. The industry's mechanism for handling them is the SDC file (Synopsys Design Constraints — the de facto standard format): alongside defining the clocks, it lists timing exceptions, of which the important kinds are set_false_path ("do not check this path — I assert it doesn't matter"), set_case_analysis ("analyse with this pin frozen at this constant — we are in the mode where it is"), and set_multicycle_path ("this path is allowed N clock periods rather than one").
Read those glosses again with a verifier's eye: every exception is a human assertion that removing a check is sound — and no tool anywhere validates any of them. The STA engine obeys the SDC as commanded. An exception wrongly omitted merely costs frequency; an exception wrongly added deletes a real check, and the resulting chip carries a timing violation that no analysis ever saw. Exception inventories are one of the largest unaudited trust surfaces in industrial flows — hand-maintained chip-level SDCs routinely carry hundreds of assertions in a Tcl program whose evaluation is itself a task.
This design's constraint file makes the opposite trade, and the audit inverts with it. The flow generates the SDC, and what it generates is minimal: one declared clock (the external core clock, with an uncertainty margin), default driving-cell and load models, and zero exceptions — no false paths, no case analysis, no multicycle paths. There is nothing over-asserted to audit. The trust surface moves to what is missing: the design has more clock domains than the SDC declares — the JTAG port clocks the debug transport logic from its own pin, and the serial TileLink bridge clocks its pad-side half from the link clock — and a path in an undeclared domain is not excepted, it is simply unanalysed. Unconstrained-is-unchecked is more dangerous than excepted-with-a-claim, because no assertion exists to audit.
Statement
Every path STA skips carries a claim that skipping is sound — whether the skip is an explicit exception or a silent gap in the constraints. This file audits both directions: the (empty) exception inventory, and the completeness of the constraint set against the design's actual clock-domain structure.
The measured inventory (the generated ChipTop.mapped.sdc plus the clock fragment): 1 create_clock (clock_uncore, 50 ns, 2 ns uncertainty), 1 trivial set_clock_groups, 0 set_false_path, 0 set_case_analysis, 0 set_multicycle_path.
Step zero: what the constraints do not say
The audit's first deliverable is the diff between the declared clock set and the netlist's clock-domain census (10's machinery):
| domain | source | in the SDC? | consequence |
|---|---|---|---|
| core clock | clock_uncore pad | yes | the analysed domain |
| JTAG | jtag_TCK pad | no | debug-transport paths unanalysed; crossings to the core domain unconstrained |
| serial link | serial_tl_0_clock_in pad | no | the bridge's pad-side half unanalysed; the link-to-core crossing unconstrained |
| async reset | reset_io pad | n/a (not a clock) | reset-recovery/removal checks need their own constraint |
The gaps are not necessarily unsound — the crossings in question land in synchroniser structures (11's inventory), and the domains are low-speed — but "necessarily" is exactly what an audit refuses to assume. Each row must end in one of: a declared clock plus analysed crossings; a justified exception with its discharge; or a recorded finding that the flow's signoff does not cover the domain.
The claim classes, kept ready
The four-way classification the audit framework carries (from designs whose files do have exceptions), because rows will appear here as the constraint set is completed:
| class | claim | discharge |
|---|---|---|
| logically false | no transition can propagate along the path | 2-vector SAT on the netlist |
| asynchronous | the endpoint tolerates unconstrained data | structural synchroniser check + P1 (input-side); exported interface guarantees (output-side) |
| static | the source cannot change during operation | sequential reachability |
mode (set_case_analysis) | the pin is constant in this mode | mode-coverage over reachable configurations |
Logically false carries one classical trap worth keeping in view: the correct criterion is about transitions, not values. Static (one-vector) sensitisation is both unsound and incomplete for delay — the honest query is "no input/state pair propagates a transition along the path" (the false-path/viability literature, McGeer–Brayton). The safe direction for justifying an exclusion is the two-vector unsatisfiability, which is a well-defined SAT obligation on the netlist plus a reachability assumption on the state.
Asynchronous is where the undeclared domains will land when the set is completed: declaring a crossing false does not make the interface safe; the actual claim is that the receiving endpoint treats the data as unconstrained, i.e. a synchroniser stands behind it — a structural netlist predicate (two-flop chain, no combinational fanout from the first flop, single-domain clocking) plus P1's residue — 11's machinery, not SAT.
Multicycle, for the record, asserts two things (destination not enabled on intervening edges; source held stable throughout) plus a hold-side adjustment that defaults wrong. This design declares none — a genuine simplification, noted so its absence is recognised as load-bearing.
The work plan
- The clock-domain census against the netlist (10); the domain/SDC diff table pinned by the layer's checker.
- Per gap: complete the constraint (declare the clock, constrain the crossing) or record the finding — with the flow re-run under the completed set, since new constraints can surface new violations.
- The synchroniser predicate over the crossing endpoints (11), replacing assumption with structure.
- The reset-recovery constraint question settled explicitly.
Obligations
- A formal semantics for the flat constraint set (what a declared clock, an uncertainty, and any future exception mean to 08's plumbing).
- The completeness theorem shape: every sequential element's clock pin traces to a declared clock, or its absence is a named finding.
- The two-vector sensitisation query, stated against
Mealy(N), held ready for the first real exception. - The synchroniser predicate, shared with 11.
Effort
Weeks, needing only the flow's own artifacts. The audit is smaller than a hand-written chip's — the generated file has nothing to elaborate and nothing over-asserted — and the completeness half is the part with teeth.
L1/05 — Crosstalk and the power grid
Node: this file is the object — the two interference budgets (crosstalk and power-grid droop) absorbed at L1. The combinatorial theorem that discharges the droop budget is the edge, 13.
Background
Two wires running side by side for any distance form a capacitor: charge moved on one induces charge movement on the other, through nothing but proximity. On a chip whose routing layers are packed with parallel wires at minimum spacing, this coupling capacitance makes every net a potential radio: when an aggressor net switches, a neighbouring victim feels it. The interference — crosstalk — takes two forms, one for each state the victim can be in. If the victim is switching at the same moment, the aggressor's motion effectively changes how much capacitance the victim must charge (the "Miller factor" of the analysis below: an opposing transition can as much as double the effective coupling, an assisting one cancel it), which shifts the victim's delay — a timing effect. If the victim is sitting still, the aggressor's edge injects a glitch — a transient voltage bump that the victim's driver must fight down before any listening gate mistakes it for a real transition.
The defence against glitches is the digital abstraction's own noise margin: a gate does not respond to small wiggles — its input can move some hundreds of millivolts off the rail before the output does anything — so a glitch provably smaller than the margin is nothing, absorbed as if it never happened. (This restoration-by-indifference is the voltage-domain sibling of the restoration patterns met elsewhere in the tower.) The proof obligation is then a per-net inequality — worst-case sum of all aggressors' injections stays under the margin — and, at this design's generous 130 nm voltages, the inequality can be made to hold by routing rules alone: bounded parallel run lengths, spacing, or a grounded shield wire between critical nets. Geometry, checked once, and no trace of the phenomenon survives to any higher layer.
The chapter's second subject is the power grid. Supply voltage is not a given constant: every switching gate draws a current spike through a resistive metal mesh, and the resulting sags (IR droop) locally slow every gate — a potential back-door coupling between activity and timing that could entangle everything with everything. The design's counterweight is the decap army (the 125k+ decoupling capacitors of L2/02's census — local charge reservoirs that supply the spikes so the grid doesn't have to), and the verification strategy is to compress the entire phenomenon into a single impedance bound: the grid, decaps included, presents a low enough impedance across the relevant frequency band that no cell's supply leaves a stated window. Inside that window, supply variation is already covered by the voltage tier of 09's corners; beyond it lives the small residual probability P_droop, the third and last summand of the project's ε.
Statement
The two analog phenomena that could force their way into the discrete interface — coupling between nets, and supply variation — and the arguments that keep them out. Both are absorbed at this layer: nothing above L1 sees either, and preserving that is a design constraint, not an accident.
Crosstalk: two effects, two absorptions
Coupling capacitance C_x between a victim and an aggressor (L1's coupling graph) acts twice:
Delay shift (victim switching). The classical model: effective coupling ranges over {0, 1, 2}×C_x by relative transition direction — the coupling Miller factor, named for the feedback-capacitance multiplication of Miller (1919). Absorb it by widening the victim's load interval — C_eff ∈ [C_g, C_g + 2C_x] for setup, [C_g, ...] floor for hold — and the coupling graph disappears into the per-net RC interval. Honesty note: the 2× ceiling is a fact about equal-slew ramp models, not a theorem — Chen, Kirkpatrick & Keutzer showed the factor needed for worst-case delay exceeds the naive range with mismatched slews. The rigorous version derives the factor from the contract network (slew-dependent), which is exactly the kind of lemma L0/08's machinery exists for — assume the classical bound only until then, and say so.
Glitch (victim quiet). An aggressor transition injects charge; the victim's driver fights it. The check: worst-case over all aggressors switching together,
Σ_aggressors (C_x / C_total) · ΔV · f(driver strength, slews) < NM
with NM from L1/06. If this passes per net, nothing is exported at all — a glitch that never leaves the noise margin never becomes a logical event.
The discharge is geometric. Both absorptions reduce to routing-rule checks: maximum parallel run length at minimum spacing, spacing or shielding on the exceptions. Structurally identical to tap coverage — a layout predicate, checked once (L1/G-machinery), never seen again. Feasible at 130 nm/1.8 V precisely because the margins are wide; at 7 nm the worst-case sum fails routinely and industry prunes by timing-window intersection instead — which still preserves the layering (no functional information flows downward), but couples the noise check to 08's arrival windows. Levers if a net fails, best first: shielding (topological, exactly zero — L0/10's Step 1), spacing, run-length limits, slower edges.
The red line: treat any net needing a functional coupling constraint as a layout bug. "These two nets never switch together because the FSM forbids it" entangles the noise argument with L3's invariant — the one dependency direction this project's layering exists to prevent. Fix the layout instead; the option always exists at this node.
The power grid: enters exactly once
The grid could contaminate everything — every delay depends on V. It is kept to a single entry point:
The equipotential bound. The grid's impedance to the rails, over the frequency band set by the design's edge rates, is below the threshold making supply excursions at any cell ≤ ΔV_grid. Established by the ~225k decaps (the impedance bound is why they exist); discharged once as a frequency-domain claim.
Downstream of this single bound: (i) the voltage tier of 09's corners covers V ± ΔV_grid — supply variation becomes corner content, not a new mechanism; (ii) L0/10's screening theorem gets its Dirichlet hypothesis — the grid is a shield only if it is an equipotential, so the decaps are doing double duty (delay stability and shield quality); (iii) the residual — droop beyond the bound under worst-case simultaneous switching — is P_droop in the overview's ε, a P6-class environment/design bound.
Slower edges relax the band over which the impedance bound must hold and shrink both crosstalk effects — one more independent way a conservatively-clocked design is cheaper to verify, and by now the third such coincidence (cf. the slew-limit domain conditions, the serial link's relaxed link-clock budget).
The equipotential bound above states what the grid must satisfy; how it becomes checkable without a full-chip network solve — the M-matrix monotonicity and lattice Green's-function collapses that turn the droop residual into a sound combinatorial verdict — is the edge that carries this budget, 13.
Obligations
- The Miller-factor lemma from the contract network (or the explicit assumption, flagged, until then).
- The glitch check as a per-net computation over L1's coupling graph + L0's NM — plus the routing-rule predicate that makes it pass by construction (L1/G5-adjacent).
- The grid impedance bound: state it, and identify what discharges it (decap census + package model — partially X4/P6 territory). The combinatorial droop certificate and the di/dt piece that discharge this bound are the edge's obligations, 13.
First experiments
- Extract the coupling graph for the worst few nets from the flow's SPEF and run the glitch sum against SKY130's noise margins. If the worst net passes with margin, the whole absorption strategy is confirmed cheap for this design.
- Census the parallel-run lengths in the routed DEF against a candidate rule — is the geometric discharge already true of the flow's layout, or does it need the timing-window fallback anywhere?
Effort
Months, mostly tooling over DEF/extraction data; the two lemmas (Miller, equipotential) are the only theory, and both lean on machinery other files already need.
L1/06 — The digital abstraction as a regime decomposition
Background
This is the chapter where "the voltage is a 0" gets its definition, and the mathematics that hosts the definition is dynamical systems — the study of states evolving under fixed laws — so its basic furniture is worth setting out. The circuit's state (all node voltages together) is a point in a high-dimensional state space, moving along a trajectory determined by the device equations and the inputs. A fixed point is a state that maps to itself — the circuit at rest; an attracting fixed point pulls nearby trajectories in, so small displacements die out. An invariant set is a region trajectories cannot leave; robust invariance means they cannot leave even when the dynamics are perturbed by bounded disturbances — noise, supply wobble, coupling. The digital abstraction, properly stated, is a claim of exactly this shape: the state space decomposes into named regimes ("this node denotes 0," "this node is mid-transition"), the denoting regimes are robustly invariant and attracting, and transitions between them complete in bounded time. The chapter's (I)/(P)/(A) triple is that claim made precise.
The textbook version of this story — every electronics course tells it — is the static noise-margin argument: plot a gate's output voltage against a slowly-swept input (the DC transfer curve), observe gain > 1 in the middle, conclude the rails are attracting and there is a margin of input error each stage absorbs. True, and insufficient: it is a statement about equilibria, and a computing circuit is almost never at equilibrium. Upgrading "the steady states are attracting" to "trajectories with bounded disturbances stay in the regime tube and progress through it on schedule" is precisely the gap between the textbook and a theorem, and it is the real content here.
Fortunately, robust invariance is a developed engineering discipline with certificate-shaped tools. A Lyapunov function is the classic one: a scalar "energy-like" function that provably decreases along every trajectory, so the system must descend toward its minimum — exhibiting one is a proof of convergence, no trajectory enumeration needed. A barrier certificate is its safety sibling: a function separating the good region from the bad whose gradient condition shows no trajectory can cross the dividing surface. Both are found in practice by sum-of-squares programming — a method that searches for polynomial certificates by convex optimisation, writing "this polynomial is nonnegative" as "it is a sum of squares," a form both machine-findable and, crucially for this project, machine-checkable after the fact. The search is numerical and untrusted; the found certificate is algebra a proof assistant can verify — the same search-versus-certificate split the SAT world uses, transplanted to continuous dynamics.
One preview of a profound consequence. The progress claim (P) — transitions complete in bounded time — provably cannot be made unconditional: a classical theorem (Marino, 1981) shows any bistable device with continuous dynamics can be driven to sit arbitrarily long between its states. That failure mode is metastability, already met from the consumer's side in L1/11; here it appears as it really is — not an engineering blemish but a topological necessity, the one permanently unclosable hole in the digital abstraction, and the reason the axiom ledger carries P1 forever.
Statement
The physical state is a field configuration evolving in time — potentials and carrier densities over the domain, driven by environmental inputs. The digital abstraction is a decomposition of that state space into regimes, plus three claims:
regimes: U unpowered / at rest
Z₀ⁿ, Z₁ⁿ node n denotes 0 / denotes 1
Tⁿ node n transitioning
(I) INVARIANCE starting in a valid regime with bounded inputs, you stay in the
union of valid regimes — you never escape to "undefined"
(P) PROGRESS from Tⁿ you reach the appropriate Z regime within bounded time
(A) ABSTRACTION the induced discrete transitions are exactly the Boolean/Mealy semantics
The digital state is a tuple over nodes, so the regime structure is a product; the decomposition is a covering of an infinite-dimensional state space, not a partition of a scalar.
Tⁿ is not a single set but a family parameterised by transition time: delay and crowbar current depend on the input trajectory, not its endpoints, so "transitioning" carries its slew with it. This is why the per-component contract (07, 08) is stated on trajectory classes rather than voltage regions — a static region cannot support the composition.
Why the static story was wrong
The textbook argument — DC transfer characteristic, gain > 1 in transition, rails as attracting fixed points, V_OL < V_IL — establishes only that the steady states are attracting. It says nothing about trajectories, and a circuit spends much of its life not at a steady state.
The static picture is the equilibrium slice of (I): it characterises the invariant sets but not the invariance, and not (P) at all.
What the correct framing buys
Several things I had scattered across documents turn out to be the same object:
- Noise margin is not a static gap. It is the robustness radius of the invariant set — how large a disturbance the region tolerates while (I) still holds.
- Restoration is the contraction that makes the invariant set attracting, i.e. it is what proves (I) and (P), not a separate phenomenon.
- Metastability is exactly the failure of (P). From
Tⁿyou may not reach aZregime within bounded time; the exponential tailexp(−t/τ)is the reachability-time distribution. It is not a separate pathology bolted onto the model — it is the one place the model's progress claim has no bound. And this is a theorem, not an engineering observation: Marino (IEEE Trans. Computers 1981) proved by a connectedness/continuity argument that any bistable device with continuous dynamics admits inputs driving it to arbitrarily long settling — no clever circuit escapes it. So (P) provably cannot be made unconditional, which is the formal justification for carrying P1 as an axiom rather than filing it as an open problem. - The setup/hold window is the condition under which (P) holds for a flop. Which is precisely why L1's bridge theorem needs it as a hypothesis.
- The switching window is where no
Zregime holds — so it is unsurprising that disturbances get amplified there rather than attenuated.
The mathematics
This is a robust invariance problem for a controlled dynamical system with bounded disturbances. Standard tools apply:
- Barrier certificates for (I): find
B(state)withB ≤ 0on the initial set,B > 0on the bad set, andḂ ≤ 0on{B = 0}. Constructive and checkable, and the standard method in hybrid-systems verification (Prajna & Jadbabaie). - Lyapunov functions for (P): a functional decreasing along trajectories toward the target regime, with a decrease rate giving the time bound.
Both are found in practice by sum-of-squares programming (Parrilo; SOSTOOLS as the front-end, an SDP solver underneath), and — importantly for this project — the checking side is already formalised: a numeric SOS certificate can be rounded to a rational identity and verified in a prover, which is exactly what Harrison's HOL Light SOS procedure and Martin-Dorel & Roux's ValidSDP (Coq) do. So the pipeline "search numerically, certify formally" exists end to end for polynomial dynamics; the work is getting an interval-valued device model into polynomial (or polynomial-envelope) form.
There is a natural candidate at the field level. The van Roosbroeck system has a free-energy functional that decreases along trajectories — this is the structure Gajewski and Gröger used to prove global existence and asymptotic behaviour for the transient system. That is exactly a Lyapunov functional, and it is the physical basis for "the circuit settles."
Caveat: the free energy decreases toward thermal equilibrium, i.e. toward the unpowered regime U. For a driven circuit the relevant statement is convergence to a boundary-driven steady state, so the working functional is a relative free energy with respect to that steady state rather than the equilibrium one. That adaptation is where I would expect the real work to be.
Environmental bounds are hypotheses, and you named the right ones
(I) and (P) are conditional on the inputs staying in range. Concretely:
| input | bound | axiom |
|---|---|---|
| supply voltage | Vdd within spec, droop bounded | P6 |
| temperature | within corner range | E4 |
| clock | present, frequency/jitter bounded | P6 (board-supplied; X4's oscillator row) |
| primary inputs | stable outside their windows | L1 |
| radiation | Poisson, rate λ | P2 |
So the theorem is robust invariance: invariance under all disturbance signals within these bounds. The unbounded ones (P2's particle strikes) are exactly the ones that can kick you out of the invariant set — which is the correct formal statement of why SEU is the only surviving probabilistic term.
Finite-dimensional reduction
Doing this in the infinite-dimensional field setting is PDE stability theory. Doing it on the lumped model is finite-dimensional and tractable — barrier certificates over a few state variables per cell.
L0/08 is what licenses the reduction, so the dependency is: well-posedness (00) → quasi-static reduction (01) → lumping (04) → this document in the lumped world, with (04)'s error term entering as a disturbance the invariance must be robust against. That last point is worth stating explicitly: the lumping error is not a separate approximation to be apologised for, it is a disturbance signal, and robust invariance already has the machinery to absorb it.
Handoff
L1/06 establishes that transitions complete. It does not say how fast — that is L1, which quantifies the time bound (delay), checks it against the clock period, and turns (P) into the setup/hold constraints. So:
L1/06 : (P) holds with SOME bound
L1 : the bound is ≤ T_clk − setup − skew, and the design meets it
The bridge theorem is the composition of the two.
Reading off the Boolean function
Given (I), (A) reduces to a finite check per cell: for each of the 2ⁿ input regime combinations, the output's invariant regime is f(inputs). Standard cells have few inputs, so this is exhaustive and cheap once the invariant sets exist — the work is all in (I).
Note this needs only a coarse device model: you need the regimes to be separated, not accurate currents. That materially weakens what E1 must assert.
Where the abstraction is not in force
- During switching — no
Zregime holds; this is (P)'s domain and metastability's home. - Tri-state / pass-transistor nodes — a floating node has no driver, so there is no attracting invariant set; the value is held by charge and decays. Needs separate treatment, and L2's one-driver-per-net well-formedness condition is the structural counterpart.
- Below the design point —
ΔE/kT = ½C(ΔV)²/kTis not scale-invariant. At the 1.8 V design point the noise-margin barrier (ΔV ≈ 0.25 V, C ≈ 1 fF) is ~7,500 kT; near-threshold it falls to ~10³ kT. Still uncrossable, but 2,800 orders of magnitude vanish quietly. The abstraction is robust because designers keep it robust, so the noise margin must be a checked quantity, not an assumed one.
Open problems
- State (I), (P), (A) formally for the lumped model, with the regime sets explicit. This is the honest form of "the digital abstraction", and I do not know of it being written down anywhere for real CMOS.
- Construct barrier certificates for a standard cell from an interval-valued device model. If this works for
inv_1it plausibly works for the library. - Adapt the free-energy Lyapunov functional to the boundary-driven steady state. The equilibrium version is established; the driven version is what circuits need.
- Time bounds from the Lyapunov decrease rate, and their relationship to the Liberty tables — these ought to be the same quantity derived two ways, which is a strong consistency check on L0/07.
- Tri-state and pass-transistor cells: does the shipped configuration use any?
First experiments
- Write (I)/(P)/(A) for a single inverter in the lumped model, with explicit regime sets and disturbance bounds. Small, concrete, and it will immediately show whether the framing survives contact with a real device model.
- Attempt a barrier certificate for that inverter (SOS programming is the standard route).
- Check whether the Lyapunov time bound and the Liberty delay agree in order of magnitude.
Effort
The single-inverter (I)/(P)/(A) instance: weeks. The driven-steady-state Lyapunov adaptation (M7) is the open-ended piece.
Reading
Gajewski & Gröger on existence and asymptotics for van Roosbroeck, and the free-energy functional. Prajna & Jadbabaie on barrier certificates; Parrilo on SOS relaxations; Harrison and Martin-Dorel & Roux (ValidSDP) for prover-checked certificates. Blanchini on set invariance in control; Lohmiller & Slotine for contraction. Marino, "General theory of metastable operation" (IEEE Trans. Computers 1981) — the unavoidability theorem; Kinniment, Synchronization and Arbitration in Digital Systems, for the engineering side. Standard hybrid-systems abstraction literature for the (I)/(P)/(A) pattern — this is a well-worn shape, just not usually applied this far down.
L1/07 — The bridge theorem (M5)
Background
Every layer above this point reasons about the chip as a clocked state machine: state now, one step, state next. That picture is not physics — it is a theorem-shaped claim that industrial practice believes, acts on, and has never stated. Designers say the design "meets timing" or "closes timing" (timing closure), meaning the checking tools report that every flop's setup and hold requirements are satisfied at the intended clock period; and everyone proceeds as if closure implies the discrete abstraction is sound. The implication is almost surely true. It is also nowhere written down as mathematics — with its hypotheses enumerated, its conclusion stated over a defined model, and its edge cases forced into the open. Writing it down is this chapter, and the exercise is the book's central specimen of the pattern "a design rule is secretly a hypothesis of a theorem nobody wrote."
The proof shape is worth previewing in words because it explains why the synchronous discipline works, not just that it does. It is an induction over clock cycles, and the invariant is simply "at the start of each cycle, every flop stably holds the state the Mealy machine says it should." Given that, the settled combinational values are the right ones by the time the setup margin requires (the fast enough half); the newly-launched values of the next cycle cannot corrupt the capture (the not too fast half, hold); so the edge captures exactly the Mealy machine's next state, and the invariant is re-established — fully, every cycle. That last point is the profound one: the clock edge is a restoration point in time. Nothing carries over; timing error does not accumulate across a trillion cycles any more than voltage noise accumulates across a chain of restoring gates. The tower's recurring motif — every layer has a mechanism that resets its own error to zero — appears here in its temporal form.
The asymmetry between the two halves also deserves plain statement, because it drives real engineering behaviour. The clock period appears in the setup inequality only: a setup-slow chip can always be rescued by clocking it slower, which is why vendors can sell slower parts from an imperfect batch ("binning"). Hold contains no period at all — it is a race between two paths launched by the same edge — so a hold-violating chip is broken at every frequency, forever, in silicon. Hold bugs are the ones that kill tapeouts, and the reader will see hold appear as the sharp edge in several findings below.
Statement
Over the timed model of 03:
Let
Nbe the hardened netlist, partitioned into clock domains with declared asynchronous boundaries (11). Suppose:
- (domain) every cell's load and input slew lie inside its contract's domain —
max_capacitance/max_transition— an F-series row until the flow's signoff closes it;- (closure) setup and hold hold at every flop, at every corner, with respect to the clock arrival function — certified by STA (08) — likewise an F-series row until multi-corner closure is achieved and pinned;
- (constraints) the constraint set is complete — every domain declared, every excluded path justified (04);
- (conditioning) no fault event (P2) and no unresolved synchroniser read (P1) occurs in
[0, T].Then every run of the timed model over
[0, T]agrees withMealy(N): at each clock edgen, every flop holdss_n, ands_{n+1} = δ(s_n, i_n).
Everything above L1 presupposes this, and nobody has written it down. It is the highest value-per-effort novel contribution in the project.
Proof sketch
Induction on clock cycles with invariant "at the start of cycle n, all flops hold s_n stably."
- Propagation. From the invariant, the combinational DAG settles: max-delay bounds along every path (hypothesis 2's setup half) give all flop inputs stable at
δ(s_n, i_n)-consistent values byarr(f) − t_sufor every flopf. - No early corruption. Min-delay bounds (the hold half) give that no flop input changes before
arr(f) + t_h— the new values racing through short paths cannot violate the just-captured state. - Capture. The window rule fires deterministically at every flop; outputs become
s_{n+1}withint_cq, re-establishing the invariant. ∎
Three structural remarks that carry more weight than the induction itself:
The clock edge is a restoration point in the time domain. The invariant is fully re-established every cycle, so timing error does not accumulate — the same mechanism, in time, as gate restoration in voltage. There is no drift mode: a violated constraint fails immediately and deterministically, not gradually.
Setup and hold are asymmetric, and only one is negotiable. T_clk appears in the setup inequality and is absent from the hold inequality. Setup failure is a performance property (clock slower); hold failure is unfixable at any frequency, post-silicon. Corollary: CTS is not logically neutral — hold depends on skew, and useful skew makes the clock tree an active participant in correctness (10).
Cycles are already cut. Every feedback loop passes through a flop (W3, measured: exactly one exception, excised). Cutting at flops turns the cyclic sequential graph into a DAG of combinational segments, each with one max- and one min-delay obligation — which is why STA is a graph traversal and the induction needs no fixed point.
Where the theorem's shape breaks
Each of these violates a hypothesis structurally, not numerically:
| construct | what breaks | status here |
|---|---|---|
| combinational loops | the DAG cut | expected none (no on-die oscillator); W3's check enforces it |
| latch-based time borrowing | no clean capture edge; windows span stages | absent as a design style; the clock-gate ICG latches are primitives with their own contract (10) |
| wave pipelining | multiple waves in flight per segment | absent |
| multicycle paths | capture skips edges; two extra claims (destination not enabled between; source held throughout) plus a hold adjustment | zero declared — a genuine gift |
| clock gating | the arrival function becomes data-dependent | see 10 |
The conditioning is the theorem's honest edge
Hypothesis (4) is not a technicality: it is where ε enters the whole project (the overview's † marks). The theorem is deterministic on the event "no strike, no unresolved read"; 11 and L0/03 bound the event's complement. Stating M5 unconditionally would be false; smearing the probability through the induction would be unworkable. The conditional form is the correct interface.
Open problems
- Write it. Bounded-delay model, window rule, per-cycle induction — a solid paper, not a decade. Its absence is a fact about nobody working at the boundary, not about difficulty. Lööw's stack is the closest prior art and stops short of this statement.
- The multi-domain version: the theorem above is per-domain; the composition across declared boundaries is 11's.
- Whether hypothesis (1) can be weakened from "in domain" to "in domain or provably unobservable this cycle" — domain violations on dead nets would then not falsify the hypothesis; worth stating before the first signoff report is adjudicated.
First experiments
- State and prove the single-domain theorem for a toy: two flops, three gates, interval delays. Every structural feature (both window halves, the escape hatch, slew propagation) already appears at this size.
- When the flow's signoff reports slew/cap violations, check whether the violating nets are functionally dead (open problem 3) — cheap, and it decides how each report adjudicates.
Interface (up). This theorem is the S-timing seam of the end-to-end composition (iface_L1_timing, dieBeh = timedBeh): the arrow by which every layer above L1 earns the right to reason discretely. The whole L1 board discharges its hypothesis — closure with margin at every corner — while the reduction itself is the open content here.
Effort
Months for the single-domain statement and proof; the multi-domain composition rides on 11.
L1/08 — Verified STA
Background
How does anyone check setup and hold across a design with hundreds of thousands of paths? Not by simulation — no test could exercise every path at its worst — but by static timing analysis (STA): a tool that never runs the design at all. It treats the netlist as a graph whose edges are annotated with delay ranges, and computes, for every node, the earliest and latest possible moment a signal transition can arrive there — a longest-path/shortest-path computation over a DAG, polynomial and fast. Comparing each flop's latest arrival against its setup deadline and earliest arrival against its hold requirement yields a per-flop slack (margin: how much room is left, negative meaning violated), and a design "meets timing" when no slack is negative. Because it covers all paths by construction rather than the exercised ones, STA is the industry's sign-off instrument — the analysis whose verdict is the go/no-go for fabrication.
Where do the edge delays come from? From the Liberty file, the cell library's timing characterisation: for each cell, each arc (this input to this output), the library vendor ran analog circuit simulations across a grid of operating points and tabulated the results. A delay is looked up, in a table indexed by the two context quantities that L1/03's background introduced — the input's slew and the output's load — and since the arguments rarely land exactly on grid points, the tool interpolates between samples. That one word carries this chapter's hardest problem: interpolation is an estimate, not a bound, and the measured tables are not even monotone (a slower input edge occasionally yields a smaller tabulated delay — an artifact of how "delay" is anchored to waveform midpoints; the physics behind it is 09's subject). A verified STA must replace every such convenience with something that is actually sound, and the three deviations catalogued below are where standard practice and soundness part ways.
"Verified" here means the strong sense established elsewhere in the book: not a carefully-written reimplementation, but an engine accompanied by a machine-checked theorem that if the pass reports no violation, then hypothesis (2) of the bridge theorem holds in the timed model. The algorithm is textbook; the content is the soundness statement — and, as so often in this project, the places where proving soundness forces the discovery that the standard practice being formalised quietly isn't.
Statement
If the STA algorithm, run over the contract arcs and the clock arrival function, reports no violation on any non-excepted path at any corner, then hypothesis (2) of the bridge theorem holds.
STA is a decidable, polynomial graph algorithm — longest/shortest path on a delay-annotated DAG. Verifying an implementation of it is ordinary work; the content of this file is the soundness statement connecting the algorithm to the model, and three places where standard practice is subtly unsound and the verified version must deviate.
The algorithm
Forward pass over the flop-cut DAG, per corner:
arr(n) = max over fanin edges e of [ arr(src e) + cell_delay_e(slew_in, load) + wire_delay_e ]
slew(n) = slew table of the winning/merged arc ← propagates WITH arrival
then backward required times from each flop's window (arr_clk(f) − t_su for setup at the slow corner, arr_clk(f) + t_h for hold at the fast corner), and slack = required − arrival. Hold uses min-delay arcs and the early/late clock split; CPPR credits the shared clock-path prefix once (09).
Composition is a traversal, not a sum: both table arguments are context-dependent (load from L1's extraction, slew from the upstream cell), so per-cell delays cannot be precomputed. Setup/hold constraints are themselves 2-D tables of (data slew, clock slew).
Three unsoundnesses in standard practice
The verified version is not a transcription of an industrial engine; these must be done differently.
1. Interpolation must use the enclosing box, all four corners. cell_fall is non-monotone in input slew at two grid points of the simplest cell in the library (measured — Findings). Bilinear interpolation between samples is a model choice, not a bound; the sound rule is the max/min over all four surrounding grid points, and even that is a bound only given an inter-sample variation assumption, which E2's discharge route (L0/07) must supply as a derivative bound on the table.
2. Worst-slew merging is conservative only under monotonicity. Graph-based STA propagates a single merged (worst) slew at reconvergence. "Worst slew ⟹ worst delay" is exactly the monotonicity that the measured tables violate. The sound options: propagate slew intervals, or fall back to path-based analysis on the paths where the table is non-monotone. This is M4 surfacing inside the algorithm, not just in the corner methodology.
3. Negative delays are legitimate, but causality bounds them — check it. A delay entry is the difference of two 50%-anchor labels, and at light load / slow slew the output's label can precede the input's (conduction starts at V_th, below the anchor — 09's mechanism), so d < 0 is bookkeeping, not back-propagation. But the output cannot respond before the input starts moving, so d ≥ −(t₅₀ − t_start) ≈ −O(slew) with the coefficient set by the library's trip-point conventions. An entry below that bound is a characterisation error. This is a mechanical table-validity sweep, and it matters doubly for hold: negative min-delay entries shorten short paths, so an erroneously negative entry manufactures phantom hold violations — or masks real ones if clamped to zero, which some tools do and which is exactly the kind of silent repair a verified engine must not perform.
4. Domain checking is part of the pass, not a lint. Every table lookup must assert its arguments lie inside the characterised region (max_transition, max_capacitance). Outside it the industrial tool extrapolates and the result is vacuous rather than wrong — max-slew and max-cap violations, which real runs of this flow do produce, are exactly reports that parts of the design sat outside the characterised region (the F-series tracks them). In the verified engine an out-of-domain lookup is a failed hypothesis, reported as such.
Plumbing to the exceptions
STA does not decide which paths matter; the SDC does. The soundness statement is therefore conditional: the pass certifies closure on non-excepted paths, and every excepted path must carry a justification per its class (04). The verified engine's job includes emitting the exact excluded-path set, so that (3)'s obligation is discharged against what was actually skipped rather than against what the Tcl was believed to mean.
Obligations
- The soundness theorem above, against 03's model — the real content; the traversal itself is textbook.
- The interpolation enclosure with the derivative-bound side condition (from L0/07).
- Slew-interval propagation or a per-arc monotonicity certificate (with 09).
- Re-derive the flow's timing verdict with the verified rules and compare against its own STA reports — agreement is evidence, disagreement is a finding either way.
First experiments
- Run the interpolation enclosure over the full SKY130 HD library: for every cell, arc, corner, check monotonicity in both table arguments and measure how wide the four-corner enclosure is versus bilinear. Mechanical; directly sizes how much pessimism soundness costs, and produces the M4 violation census as a by-product.
- Reproduce one path's arrival time by hand from the tables against the signoff report's value.
Effort
The engine: months (it is a few hundred lines plus the table machinery). The soundness proof: the larger half, and it depends on 03 being written first.
L1/09 — Corners and correlation (M4)
Background
No two copies of this chip are identical. Fabrication is a statistical process — dopant counts, oxide thicknesses, and etch widths all vary — so transistors on one die are a few percent faster or slower than on another, and even neighbouring transistors on the same die differ slightly. On top of manufacturing variation, delay depends on operating conditions: a gate at 1.6 V and 100 °C is markedly slower than the same gate at 1.9 V and −40 °C. A timing verdict must therefore hold not for one circuit but for a whole family of circuits, indexed by a parameter space: the process outcome, the supply voltage, the temperature — P, V, T in the trade's abbreviation.
Industry's answer to "how do you check a continuum?" is the corner: a small set of consistent worst-case parameter assignments. The library ships each cell's timing characterised at points like ss_1.60_100 — slow-NMOS/slow-PMOS process, 1.60 V, 100 °C — and its mirror ff (fast/fast) at high voltage and low temperature; run STA at every corner, and if all pass, declare the whole box covered. Note the structure of the move: rather than treating every gate's delay as independently uncertain (which double-counts the shared physics and compounds into hopeless pessimism — a die where alternate gates came out fast and slow is not a thing fabrication produces), corners evaluate correlated extremes, all gates slow together or fast together. Setup is checked where everything is slow, hold where everything is fast.
The logical leap in this practice is the reason this chapter exists. Checking the box's vertices covers its interior only if delay responds monotonically to each parameter — a function that peaked somewhere in the middle of the voltage range would evade every corner. Monotonicity is physically plausible, universally assumed, and never stated as the hypothesis it is; this book files it as open mathematics (M4). And the plot thickens on contact with data: the measured library tables are not monotone (the census below found genuine sign changes), for a reason that turns out to be an artifact of how "delay" is defined rather than of the physics — the resolution, which involves distinguishing the monotone waveform-level truth from its non-monotone tabulated shadow, is the heart of the chapter.
The remaining vocabulary of the trade, in one breath: OCV ("on-chip variation") is the per-cell random component left after die-wide correlation is accounted for — it accumulates down a path as √n, not n, because independent random errors partially cancel; a derate is the industry's flat percentage margin approximating that effect; and CPPR ("common path pessimism removal") is the correction that stops a shared clock-distribution prefix from being counted as slow for the launching flop and simultaneously fast for the capturing flop — the same physical wire cannot be both.
Statement
Delays are not numbers but functions of process, voltage and temperature parameters. The question this file owns: when is it sound to check finitely many parameter assignments? Corner methodology — the entire industry's answer — assumes yes; the assumption is M4, and production data already violates its usual justification.
The problem naive intervals have
Propagating per-cell delay intervals independently is sound and useless: the same physical uncertainty is counted independently at every use site, admitting assignments no die realises — this cell slow, its neighbour fast, the first slow again. The pessimism compounds along paths and closure becomes impossible at any frequency.
Corners fix this by evaluating consistent assignments: all cells slow together (ss), one voltage, one temperature. The library ships 17 of them. But finitely many consistent points bound the continuum only under a monotonicity premise:
(M4) If the response (path delay, slack) is monotone in each parameter over the box, its extremes over the box are attained at vertices — so checking the corners is checking the box.
Status: the premise is not free
cell_fall(inv_1) is non-monotone in input slew at two grid points (measured). Slew is not itself a corner parameter, but it is the composition variable through which corner parameters act on downstream delays — so the clean argument "everything is monotone in P/V/T, therefore corners suffice" has a hole in its transfer step.
Where the non-monotonicity comes from — the physics is monotone, the abstraction is not
The derivative of cell_fall in slew across the load columns runs −15.0, −6.2, +15.0, +53.5, +118.5, +226.9, +335.5 ps (measured, slew step 0.65→1.5 ns) — a smooth zero crossing between 1.3 and 3.6 fF, i.e. two competing deterministic terms, not noise. The mechanism: delay is anchored at the input's 50% crossing, but the NMOS conducts from V_th ≈ 25–30% VDD, so a slow ramp gives the output a head start proportional to slew; at light load the discharge is nearly instantaneous and the head start wins (delay decreases, eventually going negative — real Liberty tables contain negative delays); at heavier load the slew-degraded discharge time dominates and the usual sign returns.
At the waveform level there is a genuine monotonicity theorem by scalar ODE comparison: with C·dV/dt = −I(V_in(t),V) and I increasing in V_in (a property E1's interval model must state), pointwise-ordered input waveforms give pointwise-ordered outputs, hence monotone crossing times for every threshold. The non-monotonicity is manufactured by the quotient to (t₅₀, slew): raising slew with the anchor fixed moves the waveform earlier below the anchor and later above it — the two ramps are incomparable in the pointwise order, light loads read the below-anchor part, heavy loads the above-anchor part. The abstraction fails to respect the order the physics preserves.
Consequently a faithful recomputation (L0/07's DAE enclosure) will and must reproduce the non-monotonicity — it is a property of the defined quantity, not of simulation noise — and the repair is one of:
- Enclosure over the quotient (current plan): four-corner interpolation, slew intervals in 08. Sound, mildly pessimistic, no new theory.
- Per-arc sign certificates from the library census; interval fallback only on flagged cells. The smooth zero crossing suggests the flagged region is small and characterisable.
- Waveform-envelope STA: propagate earliest/latest waveform bounds instead of
(arrival, slew)scalars — monotone by the comparison lemma at every composition step, with the scalar tables as a lossy abstraction. Industry's CCS/ECSM models are a gesture in this direction; for a verified engine it is arguably the principled foundation, and it dissolves the timing half of M4, leaving only the genuine P/V/T-parameter monotonicity question.
The correlation structure
The parameter space is not one box. A sound model distinguishes three tiers, because they compose differently:
| tier | varies | composes as |
|---|---|---|
| global (process corner, V, T) | per die | one consistent assignment — the corner |
| local (OCV: per-cell random variation) | per cell, independent | quadrature: a 20-stage path sees √20 ≈ 4.5× the per-stage σ, not 20× |
| shared-path (clock prefix) | common to launch and capture | counted once — CPPR removes the double-debit |
Getting these tiers wrong in either direction is the classic failure: linear accumulation of local variation makes deep paths unclosable (the √n is what rescues them — the same nothing-accumulates pattern as everywhere else in the stack); ignoring shared clock prefixes double-charges skew and fails hold checks that actually pass.
The formal object: Θ = Θ_global × Πcells Θ_local, delay arcs as functions on Θ, and P4 as the axiom "the fabricated die's parameters lie in Θ" — which absorbs what E4's empirical half used to say. The soundness theorem quantifies over Θ and the corner check plus quadrature bound plus CPPR must jointly dominate it.
Derates, honestly
Industrial OCV derates (flat ±% margins) are an engineering approximation of the quadrature bound — a linearisation applied uniformly. In a verified setting they are either derived (from the local-σ data, D3/D4) or replaced by the quadrature computation itself. Advanced-node POCV/statistical timing is this file's content done properly by industry — at 130 nm the simpler tiered model suffices, which is one more way the node choice keeps L1 tractable.
Obligations
- The vertex theorem with per-arc monotonicity certificates, and the measured fallback set.
- The three-tier composition theorem: corner ∘ quadrature ∘ CPPR dominates
Θ. - The seam with 08: slew merging interacts with tier 2 (merged slews across differently-derated paths), which is where graph-based analysis quietly loses soundness.
First experiments
- The library-wide monotonicity census (shared with 08) — it decides how big the fallback set is, i.e. whether M4 is a footnote or a project.
- Compute one real path's slack three ways — flat derate, quadrature, full interval — and compare the pessimism. This is the number that tells you what soundness costs at this node.
Effort
Months, gated on the census. The mathematics is elementary; the work is stating the tier model so that P4's axiom content is exactly the empirical residue and nothing more.
L1/10 — The clock: generation and distribution
Background
Everything in this layer is measured against clock edges, so something must make them. On many chips the making is on-die and analog — a ring oscillator disciplined by a PLL — which drags a deliberately non-synchronous circuit into the netlist and forces an excision-and-contract treatment. This design keeps the analog problem off the die: the core clock arrives at a pad, generated by the board (a crystal oscillator module or an FPGA host), and the chip only distributes it. The generation contract still exists — edges must keep coming, within a stated period interval, with bounded jitter — but it moves wholesale into the environment's promises (P6's family, a board-level X4-class datasheet claim), where a purchased oscillator module's numbers are exactly the evidence the contract wants. What remains on-die is the distribution problem, plus one new participant most flat designs lack: clock gates.
The jitter physics is worth keeping in view even with generation off-die: an oscillator has no sense of absolute time. Amplitude disturbances die out, but a disturbance along the cycle — arriving a femtosecond early stays a femtosecond early forever — is never corrected, so thermal noise accumulates in the phase as a random walk. The model downstream is built to be immune to this (it indexes by edge number and constrains only edge-to-edge intervals, so the divergent absolute phase never appears in any hypothesis), and the residue appears wherever the chip must agree about time with the outside world — the UART's baud budget, chiefly.
The distribution side has its own vocabulary. The clock reaches thousands of flops through a clock tree of buffers, built by a synthesis step called CTS (clock tree synthesis); insertion delay is the source-to-flop travel time through the tree, and skew is the difference in insertion delay between two flops — the quantity the hold check consumes, since a race between two flops is run against their relative edge timing. The trap this chapter defuses: it is tempting to file the clock tree under "plumbing that preserves function," and it is not — modern flows deliberately unbalance the tree ("useful skew") and insert thousands of pure delay buffers to fix hold; the tree is a load-bearing participant in correctness, and the arrival function it realises is a first-class object of the proof.
Statement
Produce the clock arrival function arr : Flop → interval that 03 presupposes, with the generation contract imported from the environment and the gating conditions made explicit.
Generation — imported, not excised
The clock source contract, stated at the pad:
- Frequency: consecutive rising edges are separated by a period in a stated interval — the board oscillator's datasheet promise (X4-class), plus the pad and receiver path's contribution.
- Jitter: cycle-to-cycle deviation bounded, accumulated phase unconstrained — consumed only by L5's absolute-time interfaces (the UART budget; the start-bit resync re-anchors each frame).
No on-die oscillator means no excision, no limit-cycle proof on the critical path, and no software-reachable frequency knob — the sharpest configuration threat most chips carry is absent by construction (L5/05). The clock_tap output pad closes a loop most chips leave open: the internal clock is observable, so the generation contract is bench-checkable against the die itself.
Distribution
The clock network is CTS output: buffers, inverters, delay buffers for hold repair (the flow inserts thousands — the measured census lands in findings when the flow's layout is final), and — new relative to a flat design — integrated clock-gate cells, one per generated gating domain, driven by the RTL's gating wrappers (L3/02's primitive).
Cleanliness. Every flop's clock pin is reachable from a clock source through clock-cell types only, with no data-dependent logic except declared gating. A mechanical reachability check on the netlist, and the licence for L2's deletion of the entire network into the sentence "all flops whose gate is enabled update together." The check enumerates the gating cells rather than assuming them absent, because they are present by design here: each adds a conditional-arrival term and an enable-stability check — the gate's enable must be stable across the clock's high phase, which is precisely what the ICG's internal latch guarantees if the latch's own timing is met; the obligation composes the cell-level contract with tree-level arrival.
Arrival enclosure. STA over the clock network's own arcs yields per-flop insertion delay intervals; arr(f) is that interval widened by the imported jitter bound. Skew — the difference between two flops' arrivals — is what the hold inequality consumes, and CPPR (09) exists precisely because launch and capture share a tree prefix whose variation cancels.
CTS is not logically neutral. This deserves its own emphasis because the L1-era intuition "place-and-route preserves function" fails here: hold correctness depends on skew, useful-skew methodology deliberately unbalances the tree, and this flow's hold repair inserts delay buffers by the thousand — cells that exist purely to shape arr.
What arr's width is made of
arr(f) = nominal insertion delay
± tree variation (corner + OCV tiers, 03)
± imported source jitter (the pad contract, above)
± duty/pulse-width effects for the flop's min-pulse checks
(+ the gating condition, for flops behind a clock gate)
Recovery/removal checks on asynchronous set/reset pins, and minimum-pulse-width checks, are the same window rule as setup/hold with different table entries — they ride along in 08 once arr is available; no new theory.
Ordinal time, and where the period claim actually lands
03 indexes the semantics by the realised edge sequence, so phase diffusion is quotiented out and the per-interval deviation T_n − T_nom splits three ways with three fates:
- Stochastic period jitter: picoseconds against a 50 ns period — a Gaussian-tail term, discharged P3-style, not carried.
- Accumulated jitter over bounded horizons: enters only L5's absolute-time interface claims (the UART frame budget — negligible; the start-bit resync re-anchors each frame).
- Deterministic period offset: the SDC's
create_clock -periodis a claim about the board's oscillator that nothing on the die enforces. Closure is valid only if the delivered period ≥ the signoff period — an environment condition (P6/V-family), stated in L5's operating conditions as the board's obligation, not a software-reachability question, because no on-die register can change the frequency.
Obligations
- The cleanliness check as a tool run against the hardened netlist, including the gating-cell census and per-gate enable-stability obligations.
arras a derived object: clock-network STA + imported jitter, with the CPPR-relevant tree structure preserved rather than flattened.- The pad-clock contract statement — period interval + jitter bound — as the formal import boundary, with the board oscillator's datasheet as its X4 evidence.
- The secondary clock pins (
jtag_TCK, the serial link clock) each get the same treatment at lower stakes — their domains' trees, gates, and contracts (04's completeness table).
First experiments
- Run the cleanliness reachability check; count and locate the gating cells. Cheap, and it converts "clock network clean" from assumption to measurement — the same upgrade W1–W4 made for well-formedness.
- Extract per-flop insertion delays from the flow's timing reports and plot the skew distribution — the shape of the hold-repair problem made visible.
Effort
The checks: weeks. The gating obligations are the one genuinely new piece relative to a flat ungated design, and they are cell-contract compositions, not new theory.
L1/11 — Boundaries: the window hypothesis at the edge
Background
The setup/hold guarantee rests on a shared clock: every flop's input settles in time because the launching flop was tripped by a related edge one period earlier. A signal arriving from outside — a button press, a byte from a device on its own oscillator — has no such relationship. It changes whenever it changes, which will sooner or later be exactly inside some flop's forbidden window. This is the clock-domain crossing (CDC) problem, and it cannot be engineered away, because it is not an engineering defect — it is a small impossibility theorem. A circuit asked to decide, in bounded time, which side of an edge an arbitrarily-timed event fell on is being asked for a discontinuous function of a continuous input; some input must land on the boundary of the decision. Physically, a flop capturing a transitioning input can be caught metastable: balanced at the unstable equilibrium between 0 and 1 — the ball on the top of the hill — its output hovering at an invalid middle voltage for an unbounded time before restoration finally tips it to a rail.
Unbounded, but not unpaid-for: the escape probability is exponential in the settling time allowed (e^{−t/τ}, with τ a few gate delays). The standard gadget exploiting this is the two-flop synchroniser: the first flop takes the hit — it is permitted to go metastable — and its output is given a full clock period to settle before the second flop samples it; the residual probability that metastability survives that long is astronomically small per event, and summed over events it becomes a quantified failure rate — the industry's MTBF (mean time between failures) calculation, and the origin of the N_sync · P_meta(T) term in the project's top-level ε. This is one of the two places in the entire tower where correctness is genuinely probabilistic rather than certain (the other is particle strikes), which is why the synchroniser gets a precise treatment below rather than a nod.
The chapter's organising idea is that "no clock relationship at all" is only the worst rung of a ladder. Interfaces come with graded degrees of timing relationship — same clock; clock travelling alongside the data (source-synchronous, how SPI works); same frequency but unknown phase (mesochronous); nominally-same frequency with drift (plesiochronous, from Greek "close in time"); nothing (asynchronous) — and each rung supports a cheaper gadget, with a weaker assumption about the world, at a lower price. (The mid-ladder gadgets are FIFOs — first-in-first-out buffer queues that absorb phase or rate mismatch at a cost in latency.) Placing each of the chip's real interfaces on its correct rung, and paying each rung's exact price and no more, is the discipline this chapter enforces.
Statement
The bridge theorem's input-stability hypothesis is stated against the CPU's clock, and the world is not on that clock. The hypothesis is never projected outward — it is weakened at the boundary and re-manufactured inside: every interface has a gadget that accepts a strictly weaker assumption about the world and produces signals satisfying the window hypothesis internally, at a price.
This file owns the multi-domain composition of 07 and the P1 accounting.
The ladder
What can be assumed depends on how much clock relationship exists. Each grade has its gadget, its residual external assumption, and its price:
| relationship | external assumption | gadget | price |
|---|---|---|---|
| synchronous (same clock, bounded skew) | window relative to the shared edge | ordinary IO flop | none — STA extended across the boundary |
| source-synchronous (clock travels with data) | window relative to the transported edge | capture flop in received domain + FIFO | latency; a CDC moved inside |
| mesochronous (same frequency, unknown phase) | frequency identity | phase-compensating FIFO | latency |
| plesiochronous (nominal frequency, drift) | frequency ratio within tolerance | FIFO + slip compensation | occasional stall |
| asynchronous (no relationship) | rate only — min pulse width, bounded arrival rate | synchroniser | P1's ε, 1–2 cycles |
Reading down: the assumption weakens phase → transported phase → frequency → tolerance → rate, and the price climbs latency → throughput → probability. Note that "same nominal frequency from a different oscillator" is not synchronous — independent oscillators drift unboundedly in phase; only clocks derived from one source give windows.
This is the restoration pattern's third instance. Gates restore levels, clock edges restore time, boundary gadgets restore phase: the invariant is re-established at the boundary instead of the error propagating. It is why the window hypothesis never has to leave the die.
The synchroniser, precisely
The bottom rung deserves its formal statement because it is where determinism ends:
First flop: deliberately exempted from the window hypothesis; on violation its output is unconstrained (03's escape hatch) but restoration drives it to a rail with
P(unresolved after t) ≈ (T₀/T_c)·e^{−t/τ}, τ the metastable saddle's unstable eigenvalue (M8, an enclosure modulo E1). Second flop: its window hypothesis is established by ordinary STA on the flop-to-flop path — a full period of settling.
No assumption about the input's phase survives. The irreducible external assumptions are rate: pulses shorter than a period can be missed outright, and the arrival statistics enter the MTBF. Both are P6-class environment facts, which is exactly where P1's residue was already filed. N_sync · P_meta(T) in the overview's ε is the sum of these per-boundary terms.
Per-frame clock recovery (UART RX) is a hybrid rung: synchronise once on the start edge (paying P1 once per frame), then rely on frequency tolerance — ±2–3% over ~10 bit periods — rather than phase. This is where P6's clock-accuracy bound does quantitative work.
Multi-domain composition
The per-domain bridge theorem composes across declared boundaries:
Partition the flops by clock domain. If each domain satisfies 07's hypotheses internally, and every inter-domain net crosses through a ladder gadget whose external assumption holds, then the composite implements a network of Mealy machines communicating through nondeterministic-latency channels — with the channel nondeterminism bounded by the gadget contracts, and ε summing the P1 terms.
The abstraction above L1 is therefore not one Mealy machine but this network; for this design it collapses back to nearly one machine because the secondary domains (the JTAG port's TCK domain and the serial link's clock domain) are low-speed control and transport paths, each meeting the core through generated synchroniser structures.
The outward direction
Symmetric, and easy to forget: the world's flops need our outputs stable in their windows. For each interface the proof exports a guarantee in the same graded vocabulary — a derived AC-timing table (clk-to-out min/max from STA) for synchronous peers, a frequency-accuracy bound for the UART TX, minimum pulse widths for async consumers. B3's composition at L5 is precisely matching our exports against the peers' assumptions and vice versa. The datasheet AC-timing page is the theorem-shaped version of this, derived rather than characterised.
The boundary inventory
| interface | rung | notes |
|---|---|---|
| serial TileLink | own link clock (serial_tl_0_clock_in) | the generated async-FIFO crossing into the core domain — the design's main CDC, mid-ladder |
JTAG (jtag_TCK) | own clock domain | the debug transport's crossing to the core domain (the debug spec's DMI boundary) |
| UART RX | clock recovery | synchronise once per start edge, then frequency tolerance — the budget below |
custom_boot, interrupts-at-pads | asynchronous | synchroniser predicate per pin |
reset (reset_io) | async assert, synchronised release | the generated reset synchronisers (the AsyncResetSynchronizerShiftReg family — the emitted RTL names them) |
A structural gift of the generated design: the crossings are library instances — the framework's async queues and reset synchronisers, named as such in the emitted RTL — so the inventory is an enumeration of known module types rather than a hunt for hand-rolled patterns, and the synchroniser predicate checks instances of three shapes instead of arbitrary flop pairs.
Obligations
- The synchroniser predicate (structural: two-flop chain, no fanout from the first flop, one domain) — shared with 04's asynchronous class.
- The multi-domain composition theorem above.
- The per-boundary P1 ledger: enumerate every crossing (this list is P1's scope) and its
N_synccontribution. - The exported AC-timing table as a derived artifact, handed to L5.
First experiments
- Enumerate every inter-domain net and every async input; check each lands on one of the framework's synchroniser shapes. This is simultaneously 04's completeness discharge and the P1 ledger's seed — one experiment, two deliverables.
- Compute the UART tolerance budget from the configured divisor and check it against the board oscillator's spec (P6/X4).
Effort
Weeks for the inventory and predicate; the composition theorem is months and leans on 07's form.
L1/12 — The geometric checks
Background
This chapter collects the layer's finite, mechanical checks, and three of them guard against physical phenomena that have not yet been introduced. Each is a classic chip-killer with a geometric cure.
Latch-up is CMOS's oldest self-destruct mode. The wells and diffusions that form a chip's transistor pairs also, unavoidably, form a parasitic four-layer PNPN structure — a thyristor, a device whose defining property is that once triggered it conducts hugely and latches on, held by its own feedback until power is removed. Triggered (by a voltage transient or a particle strike), the parasitic thyristor shorts the supply rails through the silicon, and the chip either browns out or cooks. The cure is well taps: frequent, low-resistance connections tying each well solidly to its supply rail, which starve the parasitic structure of the voltage drop it needs to trigger. "A tap within distance d of every device" is the design rule; the deeper reading — developed in L0 — is that tap coverage removes a second solution branch of the device equations, making the transistor's nominal behaviour the only one available.
Multi-cell upsets concern memory protected by ECC (error-correcting codes — extra check bits stored alongside each data word, enough to correct any single flipped bit). The code's mathematics assumes at most one bit of a word fails at a time; but a single particle strike ionises a region, and can flip several physically adjacent cells at once. The cure is interleaving: place the bits of one logical word physically far apart, so one strike's radius covers at most one bit per word. Note what kind of fact this is — a coding-theory assumption discharged by placement geometry, checkable in neither the netlist (which has no positions) nor the code's algebra (which has no particles), only in the layout.
The antenna effect is the strangest of the three: a defect mechanism of the unfinished chip. During fabrication, plasma etching deposits electric charge on whatever metal is exposed; a long wire connected, at that mid-fabrication moment, only to a transistor gate funnels all its collected charge into the gate's few nanometres of oxide and punctures it — destroying the transistor before the chip is even complete. Whether this happens depends on the order layers are built: the wire's eventual connection to a protective diode may not exist yet when the charge arrives. Hence the oddity flagged below: the antenna check quantifies over prefixes of the build sequence — it is a property of the fabrication history, not of the finished geometry, and the finished layout alone cannot express it.
Statement
The finite, decidable obligations L1 owns. These are the discharge points for conditions other layers only state — see L0/06's dispatch table. All are near-linear; none needs a PDE. They are gated on extraction and on having placement data, not on difficulty.
The checks
G1 — tap coverage (discharges V5)
∀ device d. ∃ well tap t. dist(d, t) ≤ d_max (same well)
Nearest-neighbour query over device and tap positions; O(n log n) with a k-d tree. A finished layout carries tap cells by the tens of thousands (the flow places them on a fixed grid), so the tap set is large and the query is the whole cost.
This is a hypothesis of well-posedness, not a reliability rule. Latch-up is a second solution branch of the stationary device PDE (M1); tap coverage destroys the parasitic thyristor and hence the branch. Filing it under reliability is the field's convention; it is what makes "the transistor's I-V characteristic" well-defined at all.
G2 — ECC bit interleaving (discharges X2)
∀ ECC word w. ∀ bits b ≠ b' ∈ w. dist(cell(b), cell(b')) > R_MCU
where R_MCU is the measured multi-cell-upset radius — a D3/D4-class empirical input, not something derivable.
The sharpest cross-layer obligation in the project. ECC's independence assumption is discharged by layout geometry: the netlist cannot see placement, the code's algebra cannot see particles, and the obligation lives in the GDS where neither can look. Needs the ECC word structure as an input, which comes from L3/L5, so it is the one check here that is not self-contained.
Applicable only if the design has ECC — the SRAM macros and the tile configuration should be examined before assuming so (the tiny configuration elides ECC).
G3 — antenna ratio
∀ net n. ∀ layer ℓ. ∀ prefix P of the process order.
area(metal(n) ∩ P) / area(gate(n) ∩ P) ≤ ratio_max
∨ ∃ protection diode connected to n within P
The odd one out: it quantifies over prefixes of the build sequence, not over the finished layout. Charge accumulated on floating metal damages a gate oxide during processing, and only until the protecting diode's layer is deposited. So the finished layout carries no record of whether the check passes — the process order is an input.
It is why this design carries 44,541 antenna diodes (diode_2), and it is the clearest case in L1 of a rule that cannot be phrased as a property of M alone.
G4 — min width, spacing, enclosure
Exactly hypotheses (H1), (H2) of 01 and (D1)–(D3) of 02. Polygon morphology plus connected components; near-linear with a scanline.
Recall the sharpening: min-spacing ⟺ (H2), but min-width is necessary and not sufficient for (H1) — the notch and neck rules supply the rest, because erosion of a connected set can disconnect at a neck.
G5 — shielding coverage (the design-side hypothesis of M2)
∀ net pairs (n,m) beyond the truncation radius.
grid metal is interposed, with aperture parameter ≤ a and pitch ≤ p
The combinatorial half of 10: the analysis supplies α(a/p), this check supplies that the geometry really provides the barriers the cascade assumes. Sparsely-gridded regions would fail it locally, and nobody currently looks.
G6 — fill is tied, not floating
∀ metal fill shape f. f is connected to a rail
Floating conductors relay rather than screen — they couple in and out, shortcutting 04's aperture chain. So this is a precondition of the locality argument, not a manufacturing nicety. Trivial to check; potentially expensive to fix if it fails.
Summary
| discharges | input needed | complexity | self-contained? | |
|---|---|---|---|---|
| G1 tap coverage | V5 / M1 | device + tap positions | O(n log n) | yes |
| G2 interleaving | X2 | placement + ECC word structure | linear | no (needs L3/L5) |
| G3 antenna | — | layout + process order | linear per layer | no (needs the recipe) |
| G4 width/spacing | (H1),(H2),(D1)–(D3) | drawn layout | near-linear | yes |
| G5 shielding | M2's hypothesis | layout + grid | near-linear | yes |
| G6 tied fill | M2's hypothesis | layout + connectivity | linear | yes |
Two of the six need inputs from outside L1, and both of those inputs are things a layout tool does not record: the ECC word structure and the process order. Worth noting because it is the same pattern as the antenna rule generally — some geometric obligations are not properties of the geometry.
First experiments
- G6 on the flow's layout: is the metal fill tied? A single connectivity query, and the answer determines whether 04's argument needs its harder version.
- G1 on the extracted device positions, once L1/02's extraction runs.
- Establish whether the design has ECC at all before investing in G2.
Effort
Weeks each, gated on extraction and placement parsing rather than on the algorithms. This is the cheapest part of L1 and a reasonable place to start building infrastructure the rest of the layer needs anyway.
L1/13 — The combinatorial droop check
Edge: this file is the theorem the node carries — the combinatorial check (M-matrix monotonicity + lattice Green's function) that discharges 05's power-grid droop budget as an "N-apart"-style layout computation, the digital-crossing edge.
Making the droop check combinatorial: two collapses
The equipotential bound in 05 states what must hold; this section is how it becomes checkable without a full-chip network solve. Verifying "the supply at every cell stays within ΔV_grid under the worst workload" looks like two intractable searches — over all input workloads, and over all ~200k grid nodes. Both collapse, one to physics, one to the lattice, and what remains is combinatorial.
The current bound is structural, not statistical. The residual was written in 05 as "droop under worst-case simultaneous switching," and the honest worry is that a statistical activity estimate is unsound: logic is correlated, and an adversary (a power virus) can drive far more coincident switching than any average. The escape is to bound switching by circuit structure rather than activity. Per clock cycle each flop transitions at most once — and this bound is reachable, since a data pattern toggling every flop on one edge is a legal input, so for the sequential contribution it is not even pessimistic. Each combinational node transitions at most g times, g a structural glitch bound (distinct input arrival times ≤ logic depth). The per-cycle charge is then additive and workload-independent:
Q_cell ≤ Σ_nodes (transitions · C_node · V) , transitions_flop = 1 , transitions_comb ≤ g
with the C_node the same L1 parasitics timing already uses. No activity model appears.
Collapse 1 — monotonicity removes the workload dimension. The DC grid is G·v = i, with G the mesh Laplacian plus the pad tie-downs to VDD — a symmetric M-matrix, whose inverse is entrywise non-negative. So the drop at any node, Δv_k = Σ_j R_kj i_j with every transfer resistance R_kj ≥ 0, is monotone in every current source, and the worst case over the admissible box 0 ≤ i_j ≤ i_j^max sits at the corner: every cell at its structural maximum, simultaneously. The exponential space of correlated workloads collapses to a single current vector — and this is the formal statement that the power virus, not a statistical peak, is the object to bound. There is nothing to search.
Collapse 2 — periodicity removes the spatial dimension. Evaluating R·i^max is still a 200k-node solve, until the tap/rail lattice is used: in the bulk G is translation-invariant, so R is a convolution and Δv = 𝒢 ⊛ i^max, with 𝒢 the discrete lattice Green's function of the mesh — for a 2-D resistor mesh a closed form (transfer resistance growing like (ρ_sheet/2π)·ln d). It is computed once on the fundamental domain (one pad's catchment cell, tens of nodes) and lifted by translation — the same quotient-by-the-lattice move that reduces tap coverage to a unit cell. Because the kernel decays, the drop at a point splits into a local term (the max current in that cell's neighbourhood — the dense-datapath worst case) and a slowly varying background (total current × a smaller effective resistance), two additive sums.
The resulting certificate is O(unit cell + defects), not O(200k), and it is sound:
- certify the grid is a periodic mesh and read its parameters — per-layer sheet resistance, via resistances, pad pitch — a finite set from the DEF + tech LEF + extraction;
- sum the structural
Q_cellper unit cell (additive, from Liberty + the switching bound above); - evaluate the unit-cell Green's-function bound
≤ ΔV_grid— a closed form or a tens-of-nodes solve, not a full-chip simulation; - enumerate defects — SRAM holes, die boundary, met4/met5 strap-pitch changes — as a finite list of special cells with edge corrections.
What this changes for P_droop. If step 3 passes under the structural (worst-case) current, the droop residual is not a probability at all — it is discharged deterministically, and P_droop leaves ε. If it fails, the honest reading is that the grid was sized for a statistical peak and the design is only conditionally safe — exactly the power-virus exposure — which is a finding, not a modelling gap. Either way the probabilistic P_droop is replaced by a sound verdict.
Two caveats, stated plainly. Monotonicity is a DC fact; it discharges static IR-drop cleanly. The transient droop (L·dI/dt from package inductance, decap ringing) is not monotone — inductance overshoots — so it needs the unit-cell RLC response and an energy/damping bound, with the shared package L entering as a single global L·dI_total/dt term and the decap density as a lattice parameter. And the whole argument is conditional on the extracted parameters being trustworthy and the periodicity being verified rather than assumed. So: DC drop is fully combinatorial; di/dt is a small per-unit-cell dynamical bound plus one global inductive term.
Obligations
- The combinatorial droop certificate (the two-collapses section): the M-matrix monotonicity lemma (worst case = all-cells-max), the lattice Green's-function reduction (unit cell + defect list), the structural switching bound (flops ≤ 1/cycle, comb ≤
g), and the parameter extraction (sheet/via resistances, pad pitch). Together these replace the probabilisticP_droopwith a sound verdict — a pass, or a power-virus finding. - The transient (di/dt) piece: the unit-cell RLC bound plus the global
L·dI_total/dtterm — the one part that is not a pure DC sum.
Effort
Months, mostly tooling over DEF/extraction data; the two lemmas here — M-matrix monotonicity and the lattice Green's function — are the theory, and both lean on the lattice machinery (L0/06) other files already need. The node's equipotential bound (05) is what this certificate discharges combinatorially.
L0 — Physics: the device, the field, and ε
Node — the field/material, where
εlives:Field(A), the trajectory space of the transient field problem (00), the device models (02), and the error model (03); the analog, probabilistic bottom of the tower. Edge up — the electrical abstraction (the ε-crossing): within the envelope, field simulation over the cell and interconnect geometry establishesContracts(N)'s transfer functions — carried by per-cell enclosures (07), lumping/composition (08), the interconnect capacitance enclosures (09), and screening (10) — andεis bounded within L0's budgets, modulo E1.
Background
The bottom. Below the netlist there are no bits — only charge, fields, and dopant atoms — and this layer manufactures the digital abstraction out of that material: per-cell contracts certifying that each standard cell computes its Boolean function, within noise margins and delay intervals, under stated operating conditions. The route runs through the governing PDE's well-posedness (00), the reduction from Maxwell's equations to circuit theory (01, 08), the fitted device models carrying the project's deepest empirical axiom (02), validated per-cell numerics (07), the regime decomposition that is the digital abstraction stated as a theorem (06), the error model deciding what survives as probability (03), the envelope outside which none of it holds (04), what the whole tower bottoms out on (05), and the transistor-level cut discipline (06). This is the crunchiest material in the book; the per-chapter Backgrounds assume no physics beyond curiosity.
Statement
Two things, and they are different in kind:
- A transistor network implements its contract. For each of the ~400 standard cells: geometry → devices → interval device model → a timed assume-guarantee contract (interval Liberty arc + regime classes, 07/06), whose untimed shadow is the cell's Boolean function. Verified once per process, amortised over every design forever.
- The error model is Poisson, not Gaussian. Continuous perturbations are suppressed below any threshold of interest and are discharged; discrete events are carried.
The L0 / L1 boundary — resolved
There is one physical problem: Maxwell plus carrier transport over the whole die. The layer split is not "L0 = devices, L1 = wires" — it is a split by abstraction target, and both layers solve instances of the same PDE.
ONE field problem over the die
│
┌─────────────────────┴─────────────────────┐
L0: on cell interiors L1: on the complement
nonlinear (transport) linear (electrostatics)
→ terminal I-V → Boolean function → per-net RC enclosures
└─────────────────────┬─────────────────────┘
│
L0/08: the LUMPING + COMPOSITION theorem
"you may glue these two and get a circuit"
L0 owns both instances of the field problem — well-posedness, the quasi-static reduction, device models, the per-cell enclosures, and the linear interconnect enclosures (09, 10) — and, critically, the composition theorem that licenses gluing them into a circuit (08); all of this is the electrical-abstraction edge that lifts into L1. L1 owns the drawn geometry that defines the domain (the coloured image and its extrusion) and reads the circuit back out of it (extraction/LVS).
The four-step factoring
The proof plan, in order of logical dependence (which is not document order — notably it puts the envelope before the per-component work, as a precondition):
- Existence, circuit-independent. The transient system has global-in-time solutions for any geometry, within the model's validity — established (Gajewski–Gröger). Uniqueness is not required: every downstream claim is an enclosure quantified over all solutions, which converts stationary non-uniqueness (M1) from a blocking assumption into a reachability obligation — see 00. "Within reasonable physical bounds" means model validity, not solution bounds: the theorem is unconditional for the model; the envelope justifies the model. [00, 01]
- Coarse invariance, near-circuit-independent. Every solution stays in a broad safe set: bounded potentials (maximum principle) and carrier densities, no runaway — a theorem within the model, since the omitted terms (impact ionisation, electrothermal coupling) are exactly where the feedback dangers live. Excluding those is 04's envelope, whose side conditions are computable but not all structural (thermal is workload-conditional). The safe set is honest-broad: it contains U, 0, 1, transitioning, metastable, and the latched states — which step 3 must show unreachable, not assume absent. [07, 00, 02]
- Fine regime decomposition, per component. Pin regions "0" / "1" / "transitioning", with "transitioning" a family parameterised by slew — the component's behaviour is an assume-guarantee contract on trajectory classes (an interval Liberty arc with an explicit domain): guaranteed output class given input classes, load, and a bounded local disturbance budget. Established numerically with rigorous enclosures, once per library cell. The disturbance budget's discharge is nonlocal (L1's screening) and must cover Miller feedthrough through the component. [02, 03, 05]
- Composition = combinatorics + side conditions. Components plug together by finite checking: each edge's load / slew / coupling within the contracts' domains (not vacuous — the shipped design fails these, F2). Cuts are licensed only at restoring, near-unidirectional boundaries (channel-connected components), so every bistable loop is internal to a component. Three globals do not factor through pins — supply, clock, temperature — and need their own aggregate arguments. Conclusion: the network emulates a state machine, except at Poisson fault events and unresolved synchroniser reads, which are carried as P1/P2, never proved away. [04, 06]
The overall deliverable, restated: every solution of the field problem lies within the enclosure that the lumped semantics predicts, established by component contracts + PDE bounds + an abstract composition argument.
Subcomponents
| status | ||
|---|---|---|
| 00 | The field problem and its well-posedness | partly open — see below |
| 01 | Maxwell → elliptic, with an error bound | settled maths, unformalised |
| 02 | Devices: the nonlinear part, and where uniqueness fails | open |
| 07 | Per-cell field bounds → terminal behaviour | hard, mechanical |
| 08 | Distributed field → lumped network; Kirchhoff as a theorem | the key one |
| 06 | Restoration, noise margins → Boolean function | settled, unformalised |
| 03 | Thermal / SEU / metastability / the ECC interface | settled, unformalised |
| 04 | The side conditions under which everything above is valid | mostly structural |
| 05 | What lies below drift–diffusion; where the tower bottoms out | scope-fixing — no new axiom |
| 06 | Where the network may be cut: CCCs, PUN/PDN duality, bistables internal | gated on cell extraction |
On the existence question. For the linear electrostatic problem it is classical — Lax–Milgram on H¹ with bounded measurable coefficients — and not open at all. For the device problem (drift–diffusion) existence is established but uniqueness is not known in general, and the non-uniqueness is physically real: latch-up and snapback are second solution branches. See 00 and 02. The industry's answer is to not solve the PDE at all, which relocates the question into an empirical claim about compact models.
Interfaces
Consumes: cell layouts and the material stack (L1's geometry), an interval device model (E1). Exports: per-cell timed contracts — interval Liberty arcs with explicit domains (07) — and their Boolean shadows (06); the composition licence (08, 06); a per-cycle upset rate λ and the noise margin NM (03). The timed contracts are what L1's STA composes; omitting them from this list was the seam mismatch the 2026-07 review caught.
Axioms introduced
E1 (the tower's one physical axiom) and P2 (SEU). Formerly also E2, P3 and X2 — all discharged or rerouted in the reassessment (Axioms): 07 is E2's discharge route, 03 P3's, and X2's check moved to L1's G2 with its empirical residue (the upset radius) into P2.
Effort
1–3 years — the swing is exactly the per-cell cost that 07's first experiment prices. Dominated by 07 and 08. The Boolean-function-per-cell result is the load-bearing output; the error model is smaller but needs probabilistic machinery nothing else in the project requires.
Reading
von Neumann, Probabilistic Logics and the Synthesis of Reliable Organisms from Unreliable Components (1956). Bryant on switch-level (MOSSIM). Melham, Higher Order Logic and Hardware Verification. Markowich, The Stationary Semiconductor Device Equations.
L0/00 — The field problem and its well-posedness
Background
At the bottom of the tower, the chip is a lump of structured matter with voltages applied to its edge, and its "behaviour" is a solution to partial differential equations — equations constraining how quantities (potential, charge density) vary jointly across space and time, the mathematical form all field physics takes. Two systems matter here. In the insulating regions between conductors, the electric potential φ obeys the classical electrostatics equation ∇·(ε∇φ) = 0 — in words: no charge accumulates anywhere in the dielectric — with the conductors pinning φ to their voltages along the boundaries. This is a boundary value problem: the equation plus boundary data determine (one hopes) the field everywhere. In the semiconductor itself, where the action is, the governing system is drift–diffusion (the van Roosbroeck system): the potential is coupled to two populations of mobile charge carriers — electrons, and holes (the absence-of-an-electron, which moves and conducts like a positive particle) — each drifting under the field and diffusing down its own concentration gradient, with the carriers' charge feeding back into the potential. Nonlinear, coupled, and the actual content of "how a transistor works" at this level of description.
Why does a proof need to begin by asking whether these equations have solutions — a question no physicist or engineer ever asks? Because every downstream statement in this book has the form "the physical behaviour lies within this enclosure," and such a statement is about the solution. If no solution exists, the statement is vacuous; if several exist, the statement must hold for all of them or say which. Well-posedness — the standard label for existence + uniqueness + stable dependence on the data — is the property that makes "the field of this chip" a definite noun phrase. For the linear electrostatic problem this is classical mathematics with an off-the-shelf answer (the Lax–Milgram theorem, the workhorse existence result for such problems, applied to weak solutions — the integrated-against-test-functions notion of solution that modern PDE theory uses precisely because it is the one for which existence can be proved on rough geometry). For drift–diffusion the answer is genuinely incomplete — and, remarkably, the incompleteness is physical: the mathematical possibility of multiple stationary solutions corresponds to real chip failure modes (latch-up), and the design rules that prevent those failures turn out to be the missing uniqueness hypotheses. That correspondence is this chapter's payoff.
One more expectation to set. The reader may anticipate Navier–Stokes-style horror — nonlinear PDEs with famous open regularity problems, spontaneous singularities. The situation here is much kinder, for reasons the chapter makes precise: the linear problem is bounded by the maximum principle (the potential can never exceed the applied voltages anywhere — no spontaneous concentration), and drift–diffusion possesses a dissipative structure (a free energy that only decreases) that rules out finite-time blowup. The genuine dangers — avalanche breakdown, thermal runaway — are physical phenomena at the edge of the operating envelope, handled as explicit side conditions in 04, not lurking mathematical surprises.
Statement
Identify the PDE that the chip actually satisfies, and establish that it has a solution — so that "the field" in every downstream enclosure statement denotes something.
This is prior to every other document in L0 and L1. If the solution does not exist or is not unique, "the RC of net n" is not a well-defined quantity and the enclosures bound nothing.
The hierarchy of problems
From most faithful to most used:
| level | system | existence | uniqueness |
|---|---|---|---|
| full | Maxwell + van Roosbroeck transport | hard | not known |
| transient quasi-static + transport | Poisson + 2 parabolic continuity eqns | established (Gajewski–Gröger) | limited |
| stationary quasi-static + transport | Poisson + 2 continuity eqns | established | NOT in general |
| quasi-static, linear | ∇·(ε∇φ) = 0, Dirichlet on conductors | classical | classical |
| lumped | RC network / compact models | trivially | trivially |
The transient row is the one the digital abstraction actually needs. Electrons flow; the circuit is a dynamical system, not a sequence of static solutions. The stationary rows characterise the invariant sets; the transient row is what makes "you stay in the regime and move according to the abstraction" a statement at all. See 06, which is built on it.
The transient system is elliptic–parabolic — Poisson as an algebraic constraint coupled to two parabolic transport equations, so a PDAE rather than a PDE. Global existence is established, and the proof route is worth knowing about: the system carries a free-energy functional that decreases along trajectories, which is exactly the Lyapunov structure the regime-decomposition argument needs. It decreases toward thermal equilibrium, though, so adapting it to a boundary-driven steady state is the open piece.
Each row is an abstraction of the one above with an error that ought to be bounded. L0/01 handles row 1→2, this document handles row 2 and row 3, L0/02 handles the device side of row 2, and L0/08 handles row 3→4.
The top row is already a model. Drift–diffusion is not first principles: it is the diffusion limit of semiclassical Boltzmann transport, which in turn coarse-grains quantum transport — the hierarchy continues upward through energy-transport and hydrodynamic models (Markowich–Ringhofer–Schmeiser; Jüngel). The upward error terms are asymptotic, not bounded. At 130 nm drift–diffusion sits comfortably inside its validity window — channel lengths well above the carrier mean free path, quasi-ballistic corrections negligible — but that is an empirical adequacy claim about the node, and it should be recorded as part of E1's content: E1 asserts both "the fit matches the device" and, implicitly, "the PDE the fit dodges would itself have been adequate." There is no row you can point to and say this one is physics all the way down; there is only a row whose error is negligible for the question asked. 05 works out where the tower actually bottoms out and why E1 is the right place to cut it.
Row 3: the interconnect problem is settled
For ∇·(ε∇φ) = 0 with Dirichlet conditions on conductors, take the bilinear form
a(u,v) = ∫ ε ∇u · ∇v
If 0 < ε_min ≤ ε ≤ ε_max (bounded measurable — dielectric jumps are fine), then a is bounded and, by Poincaré–Friedrichs, coercive on the subspace of H¹ vanishing on the Dirichlet part of the boundary — which requires that part to have positive measure, true here since the rails are everywhere. Lax–Milgram gives existence and uniqueness of the weak solution. Equivalently by the direct method: the Dirichlet energy is coercive and weakly lower semicontinuous so a minimiser exists, and strict convexity gives uniqueness — which is also exactly the variational characterisation L1 uses for its two-sided capacitance bounds.
So this is not an open problem. It is classical, and the work is formalisation, not mathematics.
What does bite is regularity, not existence:
- Bounded measurable coefficients give only De Giorgi–Nash–Moser Hölder continuity. Higher regularity needs smoother coefficients, which dielectric interfaces do not provide. The sharp results for piecewise-constant ε are the transmission-problem estimates going back to Kellogg (1974).
- Reentrant corners: ∇φ blows up. Charge density diverges like
r^(−1/3)at a right-angle conducting corner — precisely where the capacitance concentrates. - Mixed boundary conditions (Dirichlet on conductors, Neumann on symmetry planes) are worse at corners than either alone. The right regularity framework here is Gröger's
W^{1,p}theory for mixed problems on nonsmooth domains (1989). - Unbounded domain: the die is finite but the field is not. Needs a decay condition at infinity, or a truncation with a bound — which is L1's screening argument again, from the other side.
The weak solution exists in H¹ on Lipschitz domains regardless. But numerics converge at degraded rates near singularities, so verified quadrature must handle integrable singularities of known exponent. Since the exponents are analytically known, graded meshes work; it is engineering, not research. The relevant machinery exists in pieces: Arb-style ball arithmetic for rigorous quadrature (Johansson), and — more to the point for enclosures — guaranteed a posteriori FEM error bounds with fully computable constants via equilibrated flux reconstruction (Ern–Vohralík). The latter is the natural route to "the true field is within δ of this computed one" as a machine-checkable statement rather than an asymptotic convergence rate.
Row 2: the device problem is genuinely open
The van Roosbroeck system — Poisson coupled to continuity equations for electrons and holes with Einstein relations — is nonlinear elliptic/parabolic.
- Existence for the stationary system is established (Mock, Gajewski, Markowich).
- Uniqueness is known only under near-equilibrium / smallness conditions, and in general it is not known and does not hold.
The non-uniqueness is not a mathematical artifact. Latch-up and snapback are real physical second solution branches — a parasitic thyristor in the CMOS well structure has a genuinely bistable I-V characteristic. Which is why tap cells and guard rings exist: they are there to destroy the second branch, not merely to bias the wells.
So the honest statement is:
The device-level PDE does not have a uniqueness theorem, and "the transistor's I-V characteristic" is therefore not obviously well-defined from first principles. Where it fails, the failure is a real device phenomenon that designers actively engineer against.
This is the sharpest genuinely-open mathematical question in the project.
Enclosures quantify over solutions — uniqueness may be bypassable
Every downstream statement has the form "the behaviour lies within this set." Stated universally — every weak solution from the given initial data remains in the enclosure — no statement ever selects "the" solution, and stationary non-uniqueness stops being a blocking assumption. What replaces it is a reachability obligation: from the unpowered initial state, under tap coverage, show that no solution enters the latch branch's basin.
The dynamics make this the physically correct formulation anyway: the transient initial-value problem is deterministic in a way the stationary problem is not — latch-up in real silicon is a triggered event (an injection transient kicks the state across a basin boundary), not an ambiguity about which I-V curve the device "has." The bistability lives in the stationary picture; the trajectory picture sees one history per disturbance signal.
The method also fails safe: if the second basin is reachable by some weak solution, the universal enclosure is forced to include it, the per-cell contract of 07 cannot be established, and verification stops — it does not silently certify the good branch. Uniqueness for the transient problem (known in 2D, partial in 3D — Gajewski) then becomes an optimisation that tightens enclosures, not a foundation the argument stands on.
Genericity: existence does not depend on the layout being sensible
For the linear problem, Lax–Milgram does not care about the geometry. Coercivity comes from Poincaré and boundedness of ε; neither mentions the shape. So the weak solution exists for essentially any measurable die drawing, sensible or not.
What degrades with bad geometry is regularity and the constants, not existence: a thin neck gives a large resistance, a sharp corner a stronger singularity, a bad aspect ratio a worse Poincaré constant. The solution is still there.
So the honest summary is: existence is generic in the geometry; uniqueness and useful bounds are not. Which is convenient, because it means well-posedness is not something to re-establish per design — it is a once-and-for-all theorem about the class.
No blowup — and this is where the Navier–Stokes analogy breaks
Linear electrostatics cannot blow up, by the maximum principle. Solutions of divergence-form elliptic equations attain their extrema on the boundary, so
|φ(x)| ≤ max |boundary data| = Vdd
everywhere, always. There is no mechanism for spontaneous energy concentration: superposition holds, and focusing requires either nonlinearity or wave propagation. Quasi-static (01) has removed the waves, and the equation has no nonlinearity. The field is bounded by the applied voltages, full stop.
The only singularities are geometric — r^(−1/3) field crowding at reentrant conductor corners. These are static, integrable, analytically characterised, and engineered against (they matter for oxide breakdown and electromigration). They are not spontaneous and they are not blowup.
Drift–diffusion has global existence, so no finite-time blowup there either. The reason is structural and better than the Navier–Stokes situation: the free energy is a genuine Lyapunov functional, and the dissipative structure gives a priori bounds strong enough to continue solutions globally. Navier–Stokes lacks exactly this — its energy does not control enough to prevent vortex-stretching concentration.
So there is no analogue here of the NS regularity problem. The nonlinearity is dissipative rather than energy-concentrating.
The two genuine runaway mechanisms are physical, not mathematical, and both are engineered against rather than proved away — see 04:
- Avalanche / impact ionisation. High field → carriers gain energy → create pairs → more current. Real positive feedback, and adding impact-ionisation terms is precisely what can destroy the global existence results above.
- Thermal runaway. Dissipation heats the die; leakage rises with temperature; more leakage means more dissipation. Real, and it destroys real chips (second breakdown).
Neither is spontaneous: both require the operating point to leave a design envelope, which is why they become side conditions rather than open problems.
How the industry dodges it
By not solving the PDE. Compact models (BSIM, PSP) are fitted algebraic relations between terminal voltages and currents — hundreds of parameters calibrated against measured silicon. The existence/uniqueness question never arises because no PDE is solved.
That relocates rather than removes the problem: it becomes the empirical claim E1, "the compact model adequately describes the device," which is unfalsifiable in principle and validated by measurement in practice.
Two consequences worth stating plainly:
- A verified switch-level cell model rests on a fitted device model. L1/06's clean restoration argument bottoms out in E1. There is no first-principles route to a Boolean function that does not pass through either drift–diffusion (no uniqueness) or a fitted model (no derivation).
- The tap-coverage rule is a hypothesis about uniqueness. "Every device within d of a tap" is what makes the single-branch assumption valid. It is normally filed as a layout rule; it is really the side condition on a well-posedness claim.
Open problems
- Uniqueness for the stationary drift–diffusion system under operating conditions, or a characterisation of when the second branch is reachable. Genuinely open; a solution would be a contribution to semiconductor mathematics independent of this project. Note the enclosure formulation above may sidestep the uniqueness half entirely — what it needs is the reachability half: unreachability of the second basin from the unpowered state.
- Formalise Lax–Milgram / the direct method over
H¹with bounded measurable coefficients. Settled mathematics, substantial Sobolev-space infrastructure, well beyond what current prover libraries support. - Rigorous treatment of the unbounded-domain truncation, shared with L1's screening bound.
- Whether tap-coverage rules can be turned into a proved sufficient condition for single-branch operation rather than an empirical design rule.
First experiments
- Write the four-row abstraction hierarchy as formal statements with explicit error terms between rows, before attempting any of them. This alone will reveal which rows have bounds and which currently have only folklore.
- Survey what Mathlib-scale libraries actually have: weak solutions,
H¹, Lax–Milgram, Poincaré. Determines whether row 3 is a year or five. The prior art to calibrate against: Boldo–Clément–Filliâtre–Mayero–Melquiond–Weis verified a full numerical wave-equation solver in Coq (method error + rounding error, end to end); Immler's HOL-ODE-Numerics in Isabelle does rigorous ODE enclosures inside the prover (used to check Tucker's Lorenz computation). Nothing comparable exists for elliptic problems, which is exactly the gap.
Effort
Statement work: weeks. The row-3 formalisation (Lax–Milgram over H¹) is Sobolev-library-scale, shared with L0/09's obligation 1 rather than owned here.
Reading
Markowich, The Stationary Semiconductor Device Equations (1986). Mock, Analysis of Mathematical Models of Semiconductor Devices (1983) — stationary existence. Gajewski & Gröger, "On the basic equations for carrier transport in semiconductors" (J. Math. Anal. Appl. 1986) — transient existence and the free-energy structure. Markowich–Ringhofer– Schmeiser, Semiconductor Equations (1990) and Jüngel, Transport Equations for Semiconductors (2009) — the model hierarchy above drift–diffusion. Grisvard, Elliptic Problems in Nonsmooth Domains — corner singularity exponents. Kellogg (1974) on interface regularity; Gröger (1989) on mixed boundary conditions. Ern & Vohralík on guaranteed a posteriori bounds. Any graduate elliptic PDE text for Lax–Milgram and De Giorgi–Nash–Moser.
L0/01 — Quasi-static reduction
Background
The full laws of electromagnetism are Maxwell's equations: four coupled field equations in which changing electric fields beget magnetic fields and vice versa, so that disturbances propagate — as waves, at the speed of light. Circuit theory knows nothing of this. When a circuit diagram says a node has "a voltage," it asserts that the whole node agrees on one value now; when Kirchhoff's current law says currents into a node sum to zero, it ignores the travel time of influence entirely. The gap between these pictures closes only because chips are small and their signals slow: if the time light needs to cross the structure is utterly negligible against the time anything meaningful changes, then every part of the field has already "caught up" at every instant, and the field configuration is just the static solution for the present boundary voltages, gliding through time. This is the quasi-static approximation, and it is the step at which "the circuit" — nodes, voltages, capacitances — comes into existence as a concept. The comparison is of feature size against wavelength (the distance a wave travels per oscillation period); at this chip's size and speed they are five orders of magnitude apart, which is as comfortable as approximations get.
Quasi-statics splits into two sub-regimes by which half of Maxwell survives. Electroquasistatics (EQS) keeps charge and capacitance and drops magnetic induction — the regime of everything L1 computes. Magnetoquasistatics (MQS) is the complementary half: current loops, inductance — the effect by which a changing current induces opposing voltage around its own loop. Inductance is the awkward one for this project's methods, for a reason worth understanding: capacitance is between nearby things (and screened — L0/10), but inductance belongs to current loops, and a loop is only closed through the signal's return path, which may run anywhere in the power grid — so there is no locality argument for it, and its extraction is a genuinely global problem. The honest treatment at this design's tens-of-MHz clock is to bound the inductive contribution and show it negligible — a checked side condition, rather than a modelling burden.
The chapter's remaining content is the shape of the error statement. Physics folklore says the quasi-static error is "second order in size-over-wavelength"; a verification needs that folklore as an inequality with a computable constant on this geometry, so it can be added to the margin budget like every other error. The mathematical form is a perturbation expansion — solve the equations as a power series in the small parameter, bound the discarded tail — and theorems of exactly this shape exist in the applied-analysis literature; what is missing is only the explicit-constant version. That gap (M6) is a fair sample of what this whole layer is: no new physics, no controversy, just the difference between "everyone knows it's fine" and a bound.
Statement
Maxwell's equations reduce to a sequence of elliptic problems, with an error bound. This is the first abstraction step and it is where "the circuit" becomes a meaningful concept at all — before it, there are only fields.
Why it is needed
Every downstream statement (RC enclosures, delay, Kirchhoff's laws) presupposes that propagation can be ignored and that charge and current are instantaneously related to potential. That is an approximation, and nobody in the flow states its error.
The content
The criterion is scale separation: feature size L ≪ λ = c/(f√ε_r).
At 130 nm in SiO₂ (ε_r ≈ 3.9), λ is roughly 1.5 m at 100 MHz and 15 mm at 10 GHz. The die is a few mm. So at this design's tens-of-MHz operating frequency the separation is five orders of magnitude and the approximation is excellent; at multi-GHz on global nets it starts to bind, which is exactly when on-chip inductance became an industry concern.
Two sub-regimes, and only one matters here:
- Electroquasistatic (EQS) —
∇×E ≈ 0, capacitance dominates. This is the interconnect regime and the one L1 solves. - Magnetoquasistatic (MQS) — inductance, current loops. Relevant for long global nets and clock distribution at high frequency. Not local: there is no screening argument for inductance because return paths can be distant, which is why inductance extraction is much harder than capacitance extraction — the engineering response is the partial inductance formalism (Ruehli's PEEC; FastHenry is the reference extractor), which assigns loop-free per-segment values and recovers physical loop inductance only in closed sums. At this design's frequency it is negligible; that should be a stated and checked condition, not an assumption.
What the error bound should look like. Expand in the small parameter L/λ (equivalently ωL/c). The leading correction to the EQS solution is O((L/λ)²), so a rigorous statement has the form
‖φ_Maxwell − φ_EQS‖ ≤ C · (L/λ)² · ‖source‖
with C depending on the geometry. Theorems of exactly this shape exist, on the MQS side: Ammari–Buffa–Nédélec justified the eddy-current approximation of Maxwell with error bounds in powers of the small parameter (SIAM J. Appl. Math. 2000), and Raviart–Sonnendrücker did the same programme for the Darwin model (the combined EQS+MQS, radiation-free intermediate). The EQS analogue is easier and essentially folklore. What does not exist is the version this project needs: an explicit, computable C over realistic multi-material Lipschitz geometry, stated as a verification hypothesis rather than an asymptotic order. So the open problem is sharpening constants in a known theorem, not inventing the theorem.
Kirchhoff's laws are consequences of this reduction, not axioms. KCL is ∇·J = 0 integrated over a surface enclosing a node; KVL is ∇×E = 0 integrated around a loop. Both are exact in the quasi-static limit and carry the O((L/λ)²) error otherwise. This is worth stating explicitly because circuit theory is normally introduced axiomatically, and here it needs to be derived — see 08.
Status
Settled physics, standard asymptotic analysis, entirely unformalised in this context. The mathematics is a regular perturbation expansion; the work is stating it with explicit constants over realistic domains.
Open problems
- An explicit, geometry-dependent constant in the
O((L/λ)²)bound — i.e. the Ammari–Buffa–Nédélec-style result with the constants made computable. Without it the reduction is qualitative and the error cannot be folded into the margin budget. - A checkable side condition for when MQS may be dropped — i.e. a bound on the inductive contribution to delay, given the design's frequency and net lengths.
- Whether the expansion is uniform near the corner singularities of 00, where
‖source‖in the bound above is itself unbounded.
First experiments
- Compute
L/λfor the actual design: die size, longest net, clock frequency,ε_r. Confirm the separation is as comfortable as it appears, and record it as a checked side condition rather than folklore. - Estimate the inductive contribution on the longest global net and the clock spine, to justify dropping MQS.
Effort
Weeks for the statement; M6's explicit constant is the open-ended part.
Reading
Haus & Melcher, Electromagnetic Fields and Energy — the standard careful treatment of the EQS/MQS split. Ammari, Buffa & Nédélec, "A justification of eddy currents model for the Maxwell equations" (SIAM J. Appl. Math. 2000). Raviart & Sonnendrücker on the Darwin model. Alonso Rodríguez & Valli, Eddy Current Approximation of Maxwell Equations — book-length treatment of the MQS side. Ruehli on PEEC / partial inductance; Kamon–Tsuk–White (FastHenry) for what inductance extraction actually computes. Any asymptotic-analysis text for the regular perturbation structure.
L0/02 — Device models: the nonlinear part
Background
The MOSFET — the transistor of which this chip contains tens of millions — is, to first approximation, a voltage-controlled switch: voltage on the gate terminal creates or removes a thin conducting channel in the silicon between the source and drain terminals. Below a threshold voltage, (almost) no channel and (almost) no current; above it, a conducting path whose strength grows with gate drive. CMOS logic wires these switches in complementary pairs — for every input combination, either a path to the high rail or a path to the low rail, never both — so a gate's output is always actively driven to one rail.
The property that makes digital computation possible is gain: in its transition region, a small change in a MOSFET's input produces a larger change in its output. Gain greater than one is what lets each gate clean up its input — an input at 90% of the rail voltage produces an output at 99.9% — making the rail values attracting fixed points of the gate dynamics. This is the restoration that every layer above has been invoking: noise does not accumulate through a million-gate chain, because each stage snaps its signal back toward the rails. The interconnect, being linear, could never do this; all restoration in the machine comes from the devices, which is why this file calls them "the reason the digital abstraction exists" and why their model bears more epistemic weight than their share of the delay numbers would suggest.
How is the device's current-voltage behaviour actually known? Not by solving the drift–diffusion PDE — the chapter walks through why that route is barred (no uniqueness theorem, hopeless cost). Industry's answer is the compact model: a large fitted formula — BSIM4, the standard used by this process, has hundreds of parameters — calibrated against measured silicon until it reproduces the terminal currents across the operating range. It is an excellent description and in no sense a derivation, and the assumption "the fitted model faithfully describes the physical device" is the project's deepest empirical axiom (E1) — the one 05 later argues is irreducible no matter how deep one digs. Above the compact model sits one more abstraction this chapter needs: the switch-level model (Bryant's MOSSIM tradition), where the transistor is just a switch with a strength and the analysis tracks which nodes get driven, fought over, or left floating — the coarse level at which "this cell computes NAND" is actually read off. The load-bearing chain is switch-level resting on compact model resting on measurement, and the chapter's job is to make each link an explicit enclosure rather than a point-value trust.
A crash course in Bayesian inference
One tool the later sections lean on deserves its own introduction, because it is what turns "a model fitted to measurements" from a hand-wave into a bounded statement: Bayesian inference, the arithmetic of updating belief with data.
The setup is always the same. There is an unknown you care about — here, the device's physical parameters θ (a doping profile, a few mobility and recombination coefficients), fixed but unmeasured. You have data D — terminal I–V and C–V curves, a SIMS trace — each reading carrying measurement noise. And you have a forward model that, given parameters, predicts what those measurements should read. Three ingredients combine:
- The prior
p(θ): what is known about θ before this data — physical constraints, not guesses. Doping is positive; it varies smoothly on the scale of a Debye length; mobilities sit in a known band. The prior is where physics that isn't in the data enters. - The likelihood
p(D | θ): how probable the observed data is if θ were the truth — the forward model's prediction compared against D through the measurement-noise model (a reading many σ off nominal is exponentially unlikely). This is where the data pulls. - The posterior
p(θ | D) ∝ p(D | θ)·p(θ): belief about θ after the data, by Bayes' rule — the prior reshaped by the likelihood, sharpened wherever the data is informative, left at the prior wherever it is silent.
The normaliser (the integral of the numerator over all θ, the evidence) is what makes this a probability, and computing the posterior it defines is the whole practical difficulty: for a few parameters with conjugate structure it is a formula, but for a PDE forward model it is a high-dimensional integral, done either by sampling (MCMC — draw θ's in proportion to the posterior; cheap, but the answer carries Monte-Carlo error) or, when you need a bound rather than an estimate, by validated integration over θ-space (rigorous, expensive).
The payoff is the credible interval: for any quantity Q(θ) you actually want — a delay, an I–V at an unmeasured bias, a stress response — push the posterior through Q and read off a region that holds it with posterior probability ≥ 1 − δ ("the true delay lies in [a, b] with probability 0.999"). That is the object the reforged E1 below produces, and it is why a fitted model can say something bounded about points it never measured: the forward model carries belief from the measured points into the unmeasured ones, and the prior keeps the extrapolation honest. Two cautions travel with it, developed below — the answer depends on the prior, so it must be declared; and the likelihood silently assumes the forward model is correct, so an approximate model needs an explicit discrepancy term or its posterior will be confidently wrong. (The one place the project already needs probabilistic machinery — ECC sufficiency, 03 — is a cousin of this; the reasoning layer is shared.)
Statement
Give each transistor a terminal I-V relation valid over the operating range, as an enclosure rather than a point value, and identify what that relation rests on.
This is where the nonlinearity lives, where restoration comes from, and where the project's deepest empirical axiom sits.
Why devices are special
The interconnect is linear: superposition applies, the network has a rational transfer function, model order reduction is exact, and rigorous enclosures are available (L1).
Devices are nonlinear, and they are the reason the digital abstraction exists — gain
1 in the transition region is what makes the rails attracting fixed points. So they carry disproportionate importance relative to their contribution to the numbers (which is smaller than interconnect's at any modern node).
Three routes, and their costs
Route A — solve drift–diffusion. The van Roosbroeck system. Existence established; uniqueness not known in general and genuinely false where latch-up or snapback occur (see 00). Even setting that aside, a per-device PDE solve is computationally hopeless at 400 cells × operating range × corners.
Route B — compact models (what industry does). BSIM or PSP: fitted algebraic relations with hundreds of parameters, calibrated against measured silicon. Deterministic, fast, composable. Cost: axiom E1, unfalsifiable in principle, and it gets thicker at smaller nodes as quantum confinement, quasi-ballistic transport and self-heating are folded into the fit.
Route C — switch-level abstraction. Model the MOSFET as a bidirectional switch with strength and charge sharing (Bryant's MOSSIM lineage; Melham's HOL CMOS work). This is the target abstraction for producing Boolean functions, and it is far coarser than either of the above.
The chain actually used is C resting on B: the switch abstraction's justification is the device's I-V characteristic, which comes from a fitted model. There is no route to a Boolean function that avoids either a non-unique PDE or an underived fit.
With foundry-level control there is a fourth option worth noting: define the cell library at transistor level and prove cell → Boolean via switch-level modelling, pushing the axiom down to "the switch-level MOSFET abstraction is sound." That covers the whole library at once instead of per-cell characterisation, and is a strictly better axiom. Not available for validating someone else's shipped design.
What must actually be proved
For each cell, the obligation is not "the device model is right" but:
Given the device model as an enclosure over the operating range and corners, the cell's terminal behaviour lies within a region from which the Boolean function can be read off with positive noise margin.
Two things follow. First, the device model enters as an interval, so E1's fidelity claim is "the true I-V lies in the enclosure," which is weaker and more defensible than "the model is correct." Second, the switch-level abstraction only has to be valid coarsely — you need the ON/OFF distinction and enough gain, not accurate currents.
For the interval representation itself, plain intervals will be too loose — terminal currents share the same underlying parameters, and naive intervals count that uncertainty independently at every use. The standard remedies are affine arithmetic (de Figueiredo & Stolfi), which tracks first-order correlations, and Taylor models (Makino & Berz) for higher order; both are mature and both have validated implementations.
Route A, reconsidered — and E1 as a credible enclosure
"Three routes" filed Route A under barred, on two objections; both are softer than they look, and what remains reshapes E1 rather than forbidding it.
The uniqueness objection is already handled — one level up. 00 does not assume the device PDE has a unique solution; it quantifies every downstream claim over all solutions, converting non-uniqueness from a blocking assumption into a reachability obligation. An enclosure that holds for every solution branch does not need uniqueness. (The parasitic branch — latch-up — is then excluded not by a uniqueness theorem but by the tap-coverage side condition below.) So the first objection bites only if you demand a single trajectory; for the enclosure it is a red herring.
The data objection is dischargeable by measurement. Route A is "blocked by data" (axioms.md, D4) because the doping profiles are unpublished. But you do not need the foundry's numbers — you identify them from the fabricated die: C–V profiling for net doping versus depth, I–V families across geometries for channel doping and V_th, SIMS for the chemical profile on a sacrifice, and standard TCAD inverse calibration to fit the model's parameter fields to that data. This is the project's own per-die stance applied to the device: measure the object, don't trust the spec sheet. The data floor becomes bulk material data measured on this process — exactly where 05 already places it.
Why you would want it, not merely tolerate it. This is the argument that makes Route A worth its cost, and it is 07's own argument moved down a level. A compact model fit to measurements is a point cloud with an interpolant: it asserts values where it was characterised and whatever its basis functions invent between, and goes vacuous outside the box (finding F2). A drift–diffusion solve over identified parameters is a physically-constrained continuum: once a handful of physical fields (doping, mobility, recombination) are fixed, the model's value at an unmeasured bias, corner, or disturbance is a consequence of Poisson-plus-transport, not a choice of spline. That is a low-capacity, well-validated prior, and evaluating it everywhere is principled generalisation — the same reason 07 prefers a derived interval-Liberty with an inter-sample derivative bound over the shipped point .lib, which "asserts values at the sample points and nothing in between." Points cannot bound between samples; a model can. The project already stakes this for the cell DAE; consistency demands it for the device. And it is the only vehicle for the disturbance response the envelope now quantifies over — no measurement visits every mechanical stress (04, V9) or every injected forcing (V10), so bounding those requires a model that carries the physics into regions no probe reaches.
What actually remains is validated numerics: rigorous enclosures for the nonlinear van Roosbroeck system at device scale (harder than L1's linear elliptic enclosures, and genuinely frontier), plus a conservative interval identification of the feasible parameter set. Hard, partly open — but mathematics, not a barred door.
E1, reforged. The inverse problem is ill-posed: many parameter fields fit the same terminal data and may disagree off-sample. So the honest object is not one trajectory but a set — one physical solution per parameter field consistent with the measurements — and the enclosure is their envelope. Two ways to close it, and the second is the natural one here:
- Deterministic (interval). Take the union of DD solves over the whole measurement-consistent parameter set: a guaranteed hard enclosure, no probability, as loose as the feasible set is wide. Composes with E1 in its present "the true I–V lies in the enclosure" form.
- Bayesian (credible). Put a posterior
p(θ | D)on the parameters — a physical prior times a likelihood built from the forward model and the measurement-noise model — and push it through the (validated) DD solve. Every downstream quantity gets a credible enclosure: "the true I–V lies in this interval with posterior probability ≥ 1 − δ." Tighter than the worst-case union, and — the point — it composes with a conclusion that is already probabilistic. The tower ends inobs ⊑ Sys with probability ≥ 1 − ε(T); a credible E1 stops being a hard axiom propping up a probabilistic conclusion and becomes one more term in ε (the epistemic term of 03). The silent "modulo E1" asterisks become a number.
Rigour here is more than running a sampler, and each requirement drags a hidden assumption into the open — which is the gain:
- The prior is declared. Credible sets depend on it. State the physical prior as an explicit, tunable assumption (positivity and smoothness of the doping field, physical ranges) — an honest replacement for the brute "BSIM contains the truth" — or robustify: imprecise-prior Bayes over a set of priors gives interval-valued posteriors, and conformal calibration gives distribution-free coverage with no prior at all.
- Model discrepancy is mandatory. Calibrate an approximate model without a discrepancy term and the posterior is overconfident (the Kennedy–O'Hagan trap): tight, wrong intervals. So 05's "DD is only regime-valid" residue reappears here as an explicit, quantified discrepancy prior — small at 130 nm, but carried, and bounding it is the honest quantitative form of "how good is drift–diffusion here."
- The posterior is computed with validated numerics, not sampled. MCMC yields an estimate with Monte-Carlo error; a theorem needs validated posterior integration or a rigorous coverage bound (PAC-Bayes), composed with the validated forward enclosure. This is the frontier piece.
None of this eliminates the axiom; it relocates E1 to a smaller, better-structured base — the drift–diffusion regime (cheap at 130 nm, 05), the measured material closures, and a declared prior-plus-discrepancy — and turns it from a deterministic hedge into a quantified, composable, data-shrinkable contribution to ε(T). That is 05's thesis — the axiom relocates, it does not vanish — made probabilistic and honest about its size.
The uniqueness side condition
Latch-up is a second solution branch of the device PDE, and the design rule that eliminates it is tap coverage: every device within a bounded distance of a well tie.
So the layout rule normally filed under "reliability" is really the side condition making the single-branch assumption valid — i.e. a hypothesis of well-posedness, not a manufacturing constraint. It belongs in the same category as L1's min-width rules, which turned out to be hypotheses of a topology-preservation theorem.
This is worth stating as a general pattern: several DRC rules are secretly the side conditions of theorems nobody has written.
Open problems
- Uniqueness for stationary drift–diffusion under operating bias, or a characterisation of when the parasitic branch is reachable. Genuinely open.
- Turn tap-coverage rules into a proved sufficient condition for single-branch operation.
- Formalise a switch-level model with strengths and charge sharing, and prove it sound with respect to an interval-valued compact model. Nobody has done this for a real library.
- Self-heating: at advanced nodes it enters the functional path. Absent at 130 nm; record as a scope boundary.
First experiments
- Take
inv_1: extract its transistor netlist (magic/netgen), attach an interval-valued device model, and derive the terminal enclosure. This is the unit that gets multiplied by 400 — measuring it decides where in its one-to-three-year range L0 lands. - Check how coarse the device enclosure can be while still yielding positive noise margin. If the margin is large (it should be, at 1.8 V), E1's precision requirement is weak, which materially reduces what must be assumed.
Effort
The inv_1 experiment: days — and it prices the whole layer (see 07). The switch-level formalisation (route C): months.
Reading
Markowich, The Stationary Semiconductor Device Equations. Bryant, "A switch-level model and simulator for MOS digital systems" (IEEE Trans. Computers 1984) — the MOSSIM II model: strengths, charge sharing, and the ternary algebra. Melham, Higher Order Logic and Hardware Verification (1993) — transistor-level CMOS in HOL, the closest existing formalisation of Route C. The BSIM4 technical manual (Berkeley) for what E1 actually asserts — the SKY130 PDK models are BSIM4, evaluated under ngspice; Gildenblat et al. for PSP, the surface-potential alternative. de Figueiredo & Stolfi on affine arithmetic; Makino & Berz on Taylor models.
L0/03 — The error model
Background
Everything below a certain scale jiggles. Thermal noise — the random motion of charge carriers at any temperature above absolute zero — makes every node voltage a fuzzy quantity, fluctuating around its nominal value with a spread set by kT/C (Boltzmann's constant times temperature over capacitance: a couple of millivolts on a femtofarad node). Since a proof cannot pretend the fuzz away, the first question of any honest error model is: with trillions of transistors switching trillions of times, why doesn't randomness simply win? The chapter's answer turns on the shape of the Gaussian tail: the probability of a fluctuation reaching k standard deviations falls as exp(−k²/2) — quadratically in the exponent — while exposure (device count × cycle count) grows only linearly. A noise margin a hundred standard deviations wide gives a per-event failure probability around 10⁻³²⁵⁷; multiply by every transistor-cycle in the universe's lifetime and it stays, for every purpose, zero. The chapter's discipline — discharge, don't carry — is to prove such exponents once and delete the term, rather than dragging an ε through ten thousand theorems. (The escape-over-a-barrier calculation behind this is Kramers' theory, the standard treatment of noise-driven escape from a potential well.)
The deleted term must be distinguished from the two that genuinely survive, and the distinctions are the chapter's spine. Particle strikes survive because they are not thermal: a cosmic-ray neutron or an alpha particle from package contamination deposits, in one hit, a hundred thousand times the energy the noise barrier holds back — the event is drawn from a different distribution than the one the margin was built against, so no margin argument touches it. Its statistics are Poisson (the mathematics of independent random arrivals — fixed rate per area per time), its consequence is the SEU (single-event upset: a flipped bit that the circuit then processes as happily as a real one), and it enters the top-level theorem as the rate λ in ε's leading term. Clock phase drift survives for a subtler reason developed in L1/10: the oscillator's phase is the one direction in the whole system with no restoring force, so thermal noise there accumulates instead of being suppressed — not a failure probability but a growing uncertainty, carried as a jitter budget.
Against the surviving bit-flips stands ECC — error-correcting codes, the digital regime's own defence. The idea, due to Hamming: store, alongside each data word, a few extra check bits computed so that any single flipped bit leaves a distinctive fingerprint (the syndrome) identifying exactly which bit to flip back. The standard memory variant, SECDED (single-error-correct, double-error-detect), corrects one and detects two; combined with scrubbing — a background process that periodically reads, corrects, and rewrites every word, so single errors don't linger long enough to meet a partner — it converts a failure rate linear in the upset rate into one quadratic in it, with the scrub interval as a tuning knob. The mathematics splits cleanly: the code's correctness is finite algebra (among the cheapest proofs in the project), while the sufficiency bound ("with rate λ and this scrub interval, uncorrectable loss is this improbable") is the one place the whole tower needs genuinely probabilistic reasoning machinery.
Statement
Determine what survives as a probabilistic term after the digital abstraction is established, and hand it upward in a form the rest of the project can consume.
Result: exactly one failure term survives at the physical layer, and it is Poisson. One disturbance also survives — clock phase diffusion — but it enters as a budget line, not a failure probability; see below.
The central distinction
Two kinds of ε get confused, and they behave completely differently:
- Probabilistic ε — exponentially suppressed by a mechanism, multiply by scale freely, discharge and forget.
- Additive-physical ε (capacitance, IR drop, skew) — accumulate linearly, need a convergent decay argument, and the bound must be on the aggregate, not per element.
Confusing them is the most common modelling error in this area. Thermal noise is the first kind; coupling capacitance is the second (see L1/X3).
A third kind: epistemic ε
Both kinds above are aleatoric — frequencies of real random events (a thermal fluctuation, a particle arrival) that a die actually draws over its life. E1's Bayesian form (02) introduces a third, epistemic: our uncertainty about the fixed but unknown device parameters given finite characterisation. It is a different animal from either aleatoric kind and must be tracked apart:
- it is a credence, not a frequency — the doping is what it is; we are uncertain about it;
- it shrinks with more measurement (more C–V/I–V/SIMS tightens the posterior), which no aleatoric term does; and
- it is prior-dependent, so it carries its modelling assumptions on its face.
Sum it into the headline ε if you like, but keep the decomposition visible, because the knobs differ. ε_aleatoric(T) — the Poisson λ, the metastability rate — is bought down only by ECC, synchronisers, and shielding; ε_epistemic(D, prior, δ) is bought down by taking more data. Collapsing them hides which lever moves which term, and hides that the epistemic part is, in principle, driven to zero by characterisation while the aleatoric part never is.
Corners are a crude shadow of the same posterior. PVT variation is filed below as "distribution over dies → yield, caught by test" — an aleatoric spread handled by a conservative box. The principled object is hierarchical: process hyperparameters φ (epistemic, from characterisation) generating per-die draws θ (the variation), p(θ | φ)·p(φ | D). The corner box is then a conservative outer bound on that predictive posterior — which is why corner methodology works, and where a principled posterior could show it loose in some directions and tight in others. The same hierarchy separates cleanly from E7 (as-fabricated geometry), a different draw in the same model. So the tower's final 1 − ε(T) carries two genuinely distinct uncertainties — the world's randomness and our ignorance — and honesty is naming both, not blending them.
Mechanisms sorted by functional form
| mechanism | form | scaling | verdict |
|---|---|---|---|
| thermal / kT/C | Gaussian tail, 40–125σ | area × time | discharged |
| oscillator phase drift | Wiener, σ² ∝ t | the one non-restoring mode | carried as jitter budget (P6) |
| timing variation (PVT) | distribution over dies | → yield | caught by test |
| metastability | exp(−t/τ) | localised to synchronisers | design-controlled |
| particle strikes (SEU) | Poisson | linear in area × time | carried |
Thermal noise: discharge it, do not carry it
Kramers escape from a basin goes as exp(−ΔE/kT). The barrier is
ΔE/kT = ½(ΔV/v_n)², v_n = √(kT/C) ≈ 2 mV at C ≈ 1 fF
ΔV ≈ 0.25 V ⟹ ΔE ≈ 7,500 kT ⟹ P ≈ exp(−7500) ≈ 10⁻³²⁵⁷
Ten trillion transistors at 10 GHz for the age of the universe is ~10⁴⁰ opportunities. Not close — and the exponent is quadratic in the margin while the scale factor is only linear in count, so no amount of scale reaches it.
A formal model should prove the barrier exceeds N·kT and then delete the term, not carry an epsilon around. Full rail-to-rail (½C·Vdd² at 1.8 V) is ~4×10⁵ kT.
The one escape from the discharge: the oscillator's phase mode
The Kramers argument requires a restoring force — it bounds escape from a basin. There is exactly one deliberately non-restoring direction in the whole system: the phase of the clock oscillator. Time-translation symmetry of a limit cycle forces a zero Floquet exponent along it, so thermal noise projected onto phase is not suppressed at all — it accumulates as a Wiener process, variance linear in time (Demir–Mehrotra–Roychowdhury is the standard theory). Jitter is thermal noise made visible by the absence of restoration. The PLL's feedback bounds the drift relative to its reference; the per-cycle residue is Gaussian with picosecond-scale σ against a much larger timing margin, so its exceedance is discharged like every other Gaussian tail — but the σ itself is a real, surviving, derivable quantity, and it is where X5's genuinely physical content lives (see M8). The discharge above is therefore correct for every regime-holding node and would be unsound applied to the clock generator.
Why particles are different in kind
A 10 MeV neutron carries ~4×10⁸ kT against a 7,500 kT barrier — about 10⁵× the energy needed. It is not a rare fluctuation of the thermal distribution; it is an energy injection from outside the bath. So the probability is not exp(−barrier/kT) but simply (arrival rate) × (cross-section) × (fraction depositing more than Q_crit).
General lesson worth carrying to every layer: in a well-designed restoring system, the tail of the distribution you modelled is never what kills it. What kills it is events drawn from a different distribution.
Rates: JEDEC's sea-level reference is ~13 neutrons/cm²/hr above 10 MeV; historical SRAM figures are ~10⁻³–10⁻⁴ FIT/bit. At 10⁹ bits that is ~10⁶ FIT ≈ one upset per thousand hours. Observable, which is why ECC exists.
Metastability breaks the abstraction in time, not in value
Restoration guarantees the flop reaches a rail — there is no steady-state half-bit. But the time is unbounded: P(unresolved after t) ≈ (T₀/T_c)·exp(−t/τ). During the unresolved window, different downstream gates can read the same mid-rail voltage differently. The signal is not a boolean, because observers disagree.
That is strictly worse than a random bit, and it is why P1 is permanent. The mitigation is to localise it: enumerate every asynchronous input and clock-domain crossing (L1), and make the theorem explicitly conditional on resolution.
Calibration note: the ~10⁻⁴³/cycle figures assume a correctly designed synchroniser with a full period of settling. A grossly violated path has percent-level rates.
Masking is computable, not merely measurable
Not every upset becomes an error. Four derating layers, three of them derivable:
- Electrical — the induced pulse attenuates through gates (restoration working for you).
- Logical — the flipped node does not affect the output. A Boolean question about the netlist.
- Temporal — the glitch misses every setup/hold window. A timing question.
- Architectural — dead register, wrong-path instruction, predictor state. The "prove it irrelevant" category from L3.
Together these knock the raw rate down by one to two orders of magnitude (AVF commonly 10–30%). Industry measures this by fault injection. All four are in principle derivable from artifacts this project already formalises — deriving derating factors rather than measuring them is a plausible novel contribution, and it is unusually well-positioned because L2 gives the netlist, L1 the timing, and L3 the architectural irrelevance argument.
The ECC interface
What L0 hands upward is a discrete channel — occasional bit flips at Poisson times. Everything above is coding theory, which is why ECC is a digital-regime object.
Two obligations of very different character:
- Functional correctness — encoder/decoder, minimum distance over GF(2): distance 3 suffices for correct-one (Hamming 1950), but SECDED requires distance 4 (the extended Hamming code) — the extra parity bit is what makes double errors detected rather than miscorrected. A finite algebraic fact, exhaustively checkable. Among the cheapest obligations in the project.
- Sufficiency — given λ, a scrub interval, and word size, bound P(uncorrectable). A renewal/Markov argument, and the only place the project needs a probabilistic reasoning layer alongside the deterministic refinement. The model is small enough for a probabilistic model checker (PRISM, Storm) to compute the bound exactly, and the in-prover route exists too — Hölzl's Markov-chain formalisation in Isabelle, or Mathlib's probability library — so this layer is tooling choice, not research.
The payoff is structural: raw upsets give failure probability linear in λ·N·T; SECDED plus scrubbing means failure needs two errors in one word within a scrub interval, so the rate goes as (λ·T_scrub)² — quadratic, with a tunable coefficient. (Two errors is a detected-uncorrectable loss; silent miscorrection needs three. The sufficiency statement should distinguish the two, since they have different consequences upstream.) That is how the abstraction survives a real, nonzero, measurable upset rate.
X2 — the sharpest cross-layer obligation in the project
ECC's independence assumption ("errors within a word are independent") is discharged by bit interleaving in the layout — physically adjacent cells assigned to different ECC words, because one particle can upset several neighbours. Multi-cell upsets are a measured, growing fraction of events as cells shrink (Ibe et al. have tracked the scaling across nodes), so the required interleaving distance is node-dependent — the hypothesis has a number in it, not just a topology.
The netlist cannot see geometry. The code's algebra cannot see particles. The obligation lives in the GDS and is invisible to every level one would naturally formalise. It is the clearest example of a correctness argument spanning from geometry to coding theory with nothing in between able to see both ends.
Open problems
- The probabilistic reasoning layer and its interface to deterministic refinement.
- Deriving AVF/derating from the formalised netlist and timing model.
- Formalising X2 — stating an interleaving property over the layout and connecting it to the code's independence hypothesis.
First experiments
- Write the four-mechanism model formally, with the thermal term explicitly discharged, and check the layering composes into a single statement of the form
P(T-cycle execution refines spec) ≥ 1 − (λ·A·T·AVF + N_sync·P_meta + …). - Check whether the design has ECC at all (the tiny configuration elides it), and if not, what the raw FIT budget is and whether it matters for the claim being made.
- Enumerate every asynchronous input and CDC in the design — this list is P1's scope, and L1 needs it anyway.
Effort
Weeks for the formal model; the probabilistic reasoning layer it needs is machinery no other layer requires.
Reading
von Neumann (1956). Hamming (1950) for the code. Mukherjee et al. (MICRO 2003) on architectural vulnerability factor. JEDEC JESD89A for the standard terrestrial flux reference. Ibe et al. on multi-cell upset scaling — the empirical content behind X2. PRISM / Storm for the renewal-model computation; Hölzl's Isabelle Markov chains for the in-prover version. Demir, Mehrotra & Roychowdhury, "Phase noise in oscillators: a unifying theory" (IEEE TCAS-I 2000) — the phase-diffusion structure behind the jitter exception.
L0/04 — The operating envelope
Background
Chips can destroy themselves, and the ways they do it are the hypotheses of this chapter, so each deserves a plain description. Avalanche breakdown: in a strong enough electric field, a charge carrier gains enough energy between collisions to knock new carriers loose on impact, which are themselves accelerated — a chain reaction (impact ionisation) that multiplies current explosively. Thermal runaway: silicon's leakage current rises steeply with temperature, and leakage dissipates power, which raises temperature — a feedback loop that, past a tipping point, cooks the die. Electromigration: a sufficiently dense electron current physically drags metal atoms along with it, so a wire carrying too much current for too long literally erodes, thinning until it opens. Latch-up was introduced in L1/12's background — the parasitic thyristor lurking in every CMOS well structure. And crowbar current: during a gate's input transition, its pull-up and pull-down transistors are both momentarily partly conducting, forming a brief rail-to-rail short — harmless when transitions are sharp, a real dissipation term when they are slow.
None of these is exotic; the reason a working chip exhibits none of them is that its design keeps the operating point inside a safe operating area — a region of voltage, temperature, current density, and slew inside which every feedback loop above is starved. Datasheets draw this region as the "absolute maximum ratings" table; this chapter's job is to state it as mathematics — the disturbance bounds under which 06's invariance claims hold — and to observe that its enforcement mechanisms are, once again, humble design rules (current-density limits, slew limits, tap spacing) that are secretly the hypotheses of boundedness theorems nobody wrote. Those five are the chip's internal self-destruction modes; two environmental axes — mechanical stress and external electromagnetic forcing — round out the same envelope, and are taken up in their own section once the internal ones are stated.
One technical idea in the chapter needs advance introduction: mollification, the smoothing of a field by averaging over a small ball. It is forced by an awkward fact: at a perfectly sharp conductor corner, the idealised electric field is mathematically infinite (a mild power-law singularity), so a naive constraint "field below breakdown threshold everywhere" is violated by every geometry containing a right angle — the constraint would be unsatisfiable while real chips sit happily unbroken. The resolution is that physical corners are atomically rounded and every physical breakdown mechanism averages over a finite volume anyway, so the honest constraint bounds the field averaged at a stated physical scale. Choosing that scale is a modelling decision with real content — too small and the constraint is unsatisfiable, too large and it is vacuous — the kind of decision a formalisation must make explicitly where engineering practice makes it tacitly.
Statement
Collect the conditions under which every bound in L0 and L1 is valid, and establish that the design and its environment stay inside them.
These are the disturbance bounds of 06's robust invariance claim. Without them (I) and (P) are unconditional statements that are simply false: every one of these mechanisms does leave the invariant set, and the design's job is to make them unreachable.
The pattern
Each entry has the same shape, and it recurs enough to be worth naming:
A real physical instability, prevented by a design rule, which is therefore secretly a hypothesis of a well-posedness or boundedness claim rather than a manufacturing constraint.
This is the third time this pattern has appeared in the project. L1's min-width and min-spacing rules are the hypotheses of a topology-preservation theorem. Tap-coverage rules are the hypothesis that kills latch-up's second solution branch. And now the whole envelope. Several DRC and design rules are the side conditions of theorems nobody has written.
The envelope
| # | condition | prevents | how established |
|---|---|---|---|
| V1 | No low-resistance Vdd→GND path in steady state | short-circuit current, melting | structural — CMOS complementary logic guarantees it by construction; contention is a netlist property |
| V2 | Transient crowbar current bounded | excess dynamic power | timing/slew limits (L1's max_transition) |
| V3 | Terminal voltages below avalanche | impact-ionisation runaway | voltage rating; supply bound (P6) |
| V4 | Junction temperature within range | thermal runaway, second breakdown | thermal design; corner range (E4) |
| V5 | Every device within d of a well tap | latch-up — the second PDE solution branch | tap-coverage rule (L1 geometry) |
| V6 | Current density below electromigration limits | wearout opens | EM design rules (L1) |
| V7 | No manufacturing short or open | arbitrary behaviour | LVS + DRC + test (P5) |
| V8 | Supply ramps follow the specified sequencing and rate | latch-up during power transitions — wrong rail order forward-biases junctions in a multi-rail bring-up (the 3.3 V IO rail vs the 1.8 V core rail), reaching M1's second branch during the ramp, when the wells are not yet at their rails and tap coverage does not yet protect | board design + the POR arrangement (X4-class); a trajectory condition (type D) on the transitions between U and powered operation — V1–V7 constrain powered states, V8 the paths between them |
| V9 | Mechanical stress within the characterised / qualified range | (static) uncharacterised parameter drift · (gross) fracture, delamination, bond-wire lift · (cyclic) CTE-mismatch fatigue | three kinds, three existing homes: static stress is a coordinate of the device box E1 is quantified over — strained-Si and layout-dependent stress are already in the characterised model; gross failure is a d ∈ Envelope hypothesis established by package qualification (JEDEC JESD22), the mechanical twin of V3/V4's "only outside the envelope"; cyclic fatigue is a type-D wearout, sibling to electromigration (V6) |
| V10 | Exogenous EM forcing bounded at the boundary | (in-band) noise-margin erosion, false switching · (transient) ESD / latch-up damage · (timing) clock jitter, metastable capture | the noise margin (06) rejects the in-band part by construction — it is the environmental share of the disturbance budget the per-cell contract already carries; the transient part is clamped by the ESD/pad network and bounded by the absolute-max ratings (a designed boundary structure, the EM twin of V3/V4); the timing part enters L1's jitter budget and the P1 term. The radiated→conducted (V/m → pin) map is board-dependent (X4-class), not a die property |
Notes on the interesting ones
V1 is structural and cheap. Static CMOS is designed so that no conducting path from Vdd to GND exists in any steady state — that is what complementary logic means. So V1 is a property of the netlist, checkable by the same machinery L2 already needs. The failure modes are bus contention (two drivers fighting) and pass-gate paths, both of which are netlist properties, not physics.
V2 is why the transient version is separate. During switching both devices are momentarily partly on, so there genuinely is a Vdd→GND path — the crowbar or short-circuit current, a real and non-trivial fraction of dynamic power. It does not threaten the abstraction because it is brief and bounded, and what bounds it is the input slew. So max_transition is doing double duty: it keeps you inside the Liberty table's domain (L0/07) and it bounds crowbar current. A slow input violates both.
V3 and V4 are the genuine runaway mechanisms, and they are the reason the answer to "can the chip destroy itself" is yes-but-only-outside-the-envelope. Both are positive feedback loops:
V3: field ↑ → impact ionisation ↑ → carriers ↑ → current ↑ → (field ↑)
V4: power ↑ → temperature ↑ → leakage ↑ → power ↑
Neither is spontaneous. Both require the operating point to leave the envelope first, which is why they are side conditions rather than open problems. Note that adding impact-ionisation terms is exactly what can destroy the global-existence results in 00 — so V3 is not merely a device-reliability condition, it is what keeps the mathematics in the well-behaved regime.
V5 is uniqueness, wearing a layout rule's clothing. Latch-up is a second solution branch of the stationary device PDE (M1). Tap coverage destroys the parasitic thyristor, hence destroys the branch. So a rule normally filed under reliability is the side condition that makes "the transistor's I-V characteristic" well-defined at all.
V4 also couples layers unpleasantly. Thermal behaviour depends on power, which depends on switching activity, which depends on the workload — so strictly the envelope is workload-dependent. At 130 nm with a small core this is comfortable; it is one of the things that gets much worse at advanced nodes, where self-heating enters the functional path.
The environment: mechanical stress and exogenous forcing
The envelope so far is a box in (V, I, T, slew) with two combinatorial side conditions. Two more environmental axes belong in it — mechanical stress and exogenous electromagnetic forcing — and the reason they earn a section is that neither adds an open problem or a seam. Each is a new coordinate of a box a stated problem already quantifies over, or a new source term in the disturbance budget a stated contract already carries — the L0 README's step 3, "guaranteed output class given input classes, load, and a bounded local disturbance budget." Writing them down is honesty about what that budget and that box already range over.
Interference is a second claimant on the disturbance budget. 06's invariance is robust — it holds under any disturbance below a budget — and that budget's discharge was already called nonlocal, because L1's screening is what bounds the internal coupling (crosstalk, Miller feedthrough). External EM interference is simply a second claimant on the same budget, sourced from the environment rather than from neighbours, and rejected by the same restoration (L1/06) that rejects crosstalk — provided the environment keeps the boundary disturbance below the budget. That proviso is V10, and it is stated where the tower already cuts: at the pins. The die is a poor antenna at these scales; the coupling that matters is into cables, board, and package, then conducted in through the pins — a system property. So the provable chip statement is conducted (a bound on pin-referred disturbance); a radiated level (V/m, or a documented HEMP waveform) maps into it only through a board-dependent coupling model, which is X4-class environment data, not a die theorem. This is the honest, well-posed form of "survives interference below a documented level": bound the pin-referred forcing, and let the board own the field-to-pin factor.
Stress comes in three kinds, and each has an existing home (V9). Static stress is already inside the characterised model: silicon is deliberately strained (mobility engineering since ~90 nm), and layout-dependent effects — STI-edge stress, well proximity — make a cell's parameters depend on its neighbours' geometry, the mechanical analogue of crosstalk, a static nonlocality discharged the same way: characterise the cell in a representative stress context, or carry the effect as a parameter of the device box E1 ranges over. Gross stress — fracture, delamination, bond-wire lift — is not something the tower survives; it is a d ∈ Envelope hypothesis, the mechanical twin of "the chip can destroy itself, but only outside the envelope" (V3/V4), established by package qualification rather than proved. Cyclic stress — CTE-mismatch fatigue under thermal cycling — is a wearout over a trajectory, type D beside electromigration (V6): in the envelope at every instant, while the envelope's validity is bounded to a rated cycle count.
The enclosure statement generalises, without a new problem. Exogenous forcing enters L0/07's per-cell DAE as a source term, so "bound the terminal behaviour over the operating range" becomes "bound it over the operating range and over every admissible forcing below the budget" — a disturbance-reachability enclosure (a reachable tube under a bounded input) rather than a parameter/quasi-static-input one. This is the same interval-DAE integrator (07's Open Problem 1), strictly harder but not a new obligation, and it decomposes the way the rest of the tower does: the nonlinearity that matters is at the boundary — the ESD/pad structures, where the large excursions live and where the clamp must be shown to bound the excursion below its thermal limit (the CW-power limit, not the transient ESD rating) — while the interior is a linear victim, its induced excursion bounded by a peak-gain times the budget and composed per-cone. Boundary-nonlinear, interior-linear: the same "die is not the antenna" fact, now as proof architecture. Because the linear and energy bounds are monotone in the forcing magnitude, "survives level L" gives "survives everything weaker than L" for free; the nonlinear upset part needs an explicit monotonicity lemma, a sibling of the corner-monotonicity the enclosure already leans on.
So the ledger is entirely modifications: E1's box gains a stress coordinate and an EM-forcing budget, its residue absorbed as calibration (D5); L0/07's enclosure statement gains a forcing quantifier; L1/06's disturbance budget gains an environmental share that L1 consumes exactly as it already consumes the internal one; and the envelope gains V9/V10 with one more type-D wearout. No new open problem, no new seam — the environment was always a hypothesis of design + environment ∈ envelope; this only names two coordinates it always had.
The shape of the boundary
Worth working out, because the constraints are not all the same kind of object and a naive "bound the field and its derivatives" formulation is not satisfiable.
What is free and what is not
|φ| ≤ Vdd everywhere is free — it is the maximum principle (00), a theorem rather than a constraint.
|∇φ| is not free, and is genuinely unbounded: the r^(−1/3) singularity at reentrant conductor corners. Note however that the total energy is finite — energy density goes as r^(−2/3), and near an edge ∫ r^(−2/3)·r dr converges. So:
The solution lives in
H¹automatically. The safe region needsW^{1,∞}-type control, which the idealised geometry does not provide.
Consequence: every constraint below must be stated on a mollified quantity. Pointwise field values at geometric singularities are not physical — real corners are rounded at the atomic scale, and every breakdown criterion involves a finite volume and time scale anyway. So the right form is
‖ G_δ * ∇φ ‖_∞ < E_crit
with δ a physical length (oxide thickness, mean free path). Mollified constraints are satisfiable; the idealised pointwise ones are not. This is a modelling decision that has to be made explicitly, and getting δ wrong is the difference between a vacuous constraint and a false one.
Five shapes
| type | constraint | functional form | convex? |
|---|---|---|---|
| A pointwise | oxide breakdown: ‖∇φ‖_∞ < E_ox on oxide regions | L^∞ ball on ∇φ, restricted to a subdomain | yes |
| B nonlinear line integral | avalanche: `∫ α( | ∇φ | ) ds < 1` along field lines, α = A·exp(−B/E) |
| C smoothed quadratic | thermal: `(G_th * σ | ∇φ | ²) < T_max` |
| D time-integrated | electromigration `∫ | J | ⁿ dt < threshold` (Black, n≈2); mechanical CTE-fatigue over thermal cycles (V9) |
| E structural | latch-up (V5), rail contention (V1) | property of the operator/domain, not of any solution | — |
Three observations:
Avalanche is not a pointwise field bound. The ionisation coefficient is exponential in 1/E, and the criterion is that the integral along a field line reaches unity. Sharper and weaker than |∇φ| < E_crit: a brief high-field region is tolerable, a sustained moderate one may not be.
Thermal is not local. The temperature is a nonlocal response — the power density σ|∇φ|² convolved with a thermal Green's function. So a small hot spot is tolerable while a diffuse but large dissipation is not. The constraint is on a smoothed quantity, and the smoothing length is set by the thermal diffusion length, not by anything electrical.
D and E are not state constraints at all. Electromigration is a wearout criterion over a trajectory; latch-up and contention are properties of the operator (does a second solution branch exist, is there a conducting rail-to-rail path). Neither can be phrased as "the field is in this set", which is why they need combinatorial rather than analytic treatment.
So your conjecture — field bounded, derivatives bounded, energy density bounded — captures A and C. Energy density bounded is equivalent to |∇φ| bounded, so it is A restated. B, D and E are genuinely different.
Structural properties of the safe set
Two facts that make it tractable:
It is star-shaped about the unpowered state. Scale φ → λφ for λ ∈ [0,1]: the field scales by λ, power density by λ², and the ionisation integral decreases monotonically. Every constraint is preserved. So you can always retreat to safety by lowering the supply — which is exactly what thermal throttling and dynamic voltage scaling do, and it means the safe set is connected and contains a path to the origin from any interior point.
Convexity is inherited through the linear map, for A and C. For the electrostatic part the map from applied boundary voltages to the field is linear, so a convex constraint in field space pulls back to a convex constraint in input space. A and C are convex; hence the safe operating region in applied-voltage space is convex apart from the avalanche term.
That matches engineering practice — safe operating areas are specified as boxes and trapezoids in (V, I, T) space — and it explains why: the box is a conservative inner approximation of a convex set, and the corner cuts are the non-convex avalanche term.
Both structural facts share the same caveat: the star-shapedness argument scales the field configuration, and the retreat-to-safety reading ("lower the supply") transfers to applied-voltage space only through linearity of the input-to-field map. For the nonlinear device problem that map is not linear, so there both convexity and the supply-scaling argument degrade from theorem to physically-motivated heuristic (lowering Vdd does shrink the fields, but not proportionally, and the safe set in supply space inherits neither property automatically). So the clean statement holds for interconnect and degrades at devices.
What this means for verification
The envelope should be stated as an intersection of mollified sublevel sets, with δ explicit for each, plus two combinatorial side conditions (E) that live outside the analytic framework entirely. Star-shapedness gives a cheap sufficient check — verify at the worst corner of the operating box and scale down — and convexity means the A and C constraints can be checked at box vertices rather than swept.
What this buys
With the envelope in hand, the chain of statements is honest:
design + environment ∈ envelope [this document]
⟹ single solution branch, bounded fields, no runaway [00, 02]
⟹ robust invariance (I) and progress (P) hold [05]
⟹ the Boolean/Mealy abstraction is sound [05, L1]
Without it, 06's claims are false as stated, because the disturbance set is unbounded.
Open problems
- Formalise V1 as a netlist property and prove static CMOS satisfies it. Should be easy, and it is a genuine precondition rather than an assumption.
- Turn V5 into a proved sufficient condition for single-branch operation, rather than an empirical distance rule. This is the concrete form of attacking M1 from the engineering side rather than the analysis side.
- Bound crowbar current from the slew limit (V2), and check the shipped design's
max_transitionviolations (finding F2) do not breach it — currently these are treated as a timing issue only. - A workload-independent thermal bound, or an explicit statement that the envelope is workload-conditional.
First experiments
- Check V1 structurally on the shipped netlist. Enumerate every net with more than one driver and every pass-gate/tri-state structure. Cheap, mechanical, and it either confirms the assumption or finds something interesting. L2 needs the same analysis for one-driver-per-net well-formedness, so it is shared work.
- Confirm the design's operating voltage sits comfortably below the process's avalanche rating, and record the margin.
- Check whether any net violating
max_transition(F2) is in a high-activity region, where the crowbar-current consequence would actually matter.
Effort
The structural checks: days each (V1 shared with L2). The mollified-constraint formalisation: weeks.
Reading
Sze & Ng, Physics of Semiconductor Devices — avalanche breakdown, the ionisation-integral criterion, and Chynoweth's α(E) = A·exp(−B/E); also second breakdown. Troutman, Latchup in CMOS Technology: The Problem and Its Cure (1986) — the standard monograph on the thyristor structure and the role of taps and guard rings. Black (1969) for the electromigration law behind V6. Note that these are normally presented as reliability engineering, and the reframing as side conditions of well-posedness is this project's angle rather than the field's.
L0/05 — The quantum floor
Background
Every layer so far has rested on the one below it; this chapter asks what the bottom layer rests on, and the answer requires a tour of the physics tower beneath drift–diffusion. Reading upward: the deepest available description of electrons and light is QED (quantum electrodynamics), a quantum field theory — the framework in which particles are excitations of fields and can be created and destroyed. Above it sits ordinary many-body quantum mechanics: a fixed roster of electrons and nuclei interacting by Coulomb attraction, no creation or annihilation — the description in which chemistry lives. Above that, band structure: in a crystal's periodic potential, the electron energy levels organise into bands, and the material's electronic character (metal, insulator, semiconductor) is read off from how the bands fill — the single most important organising idea in solid-state physics. Above that, semiclassical transport: treat carriers as classical particles with band-modified properties, colliding randomly with lattice vibrations, governed by the Boltzmann equation of kinetic theory. And its slow-scale limit is drift–diffusion, where L0/00 came in.
The chapter's question is whether this tower can be made into an unbroken chain of theorems — and the honest answer needs a distinction the reader may not have met: between a physical theory's predictive success and its mathematical existence. QED is the most precisely confirmed theory in science; it is also, as mathematics, not known to exist — its calculations are manipulations of divergent series about which no one has constructed the underlying object. ("Constructive quantum field theory," the discipline that builds QFTs rigorously, has succeeded only for simplified models in reduced dimensions; for the full theories the construction problem is worth a Clay million, and for QED specifically the expectation is that no construction exists — the theory is meaningful only as an approximation with a built-in cutoff.) A chain of theorems cannot be anchored to an object that does not mathematically exist, so the chain must be cut somewhere, and the chapter's argument is about where: one level up, at the many-body Coulomb Hamiltonian, which is a theorem-grade object — its good behaviour (the "stability of matter": why bulk material doesn't collapse, why energy is proportional to particle count) is celebrated rigorous mathematics.
Two more pieces of vocabulary for the middle rungs. The reductions between levels are scaling limits — theorems of the form "in the limit of weak coupling / long times / many particles, the finer description converges to the coarser one" — and several of the tower's rungs have genuine theorems of this type, with the honest caveat that they are asymptotic statements in idealised settings, not effective bounds on real silicon. And decoherence is the mechanism by which quantum superposition becomes irrelevant at chip scale: a node's charge state is coupled to a hot, messy environment of lattice vibrations that continuously "measures" it, destroying any superposition of logic states in femtoseconds. It is the reason the chapter can answer "what about quantum weirdness in the logic?" with a bounded argument rather than a shrug.
Statement
Fix what the bottom row of 00's hierarchy rests on, and answer a question the factoring invites: can one prove that a QFT solution exists whose divergence from the statistical approximation is negligible at this scale?
Answer: no — and the structure of the "no" is the content of this document. No new axiom is introduced. The document exists to justify where the tower's one empirical residue sits — the adequacy of the device model class, which is what remains after E1 the axiom is discharged into measured data + inference (02) — and to preempt "but what about quantum effects" with a precise scope statement.
Why the question is not well-posed at the bottom
QED in 3+1 dimensions has no nonperturbative construction. Constructive QFT stops at superrenormalisable models; Yang–Mills existence is a Clay problem; and for QED the expectation is worse than "hard" — the Landau pole suggests it exists only as an effective theory with a cutoff, and the Aizenman–Duminil-Copin triviality theorem for φ⁴ in exactly four dimensions (2021) is the rigorous version of that suspicion for the simplest analogous theory. So "a QFT solution of the chip" is not currently a mathematical object one could prove things about. This is not a gap this project could close or should try to.
The rigorous anchor is one level up
The nonrelativistic many-body Coulomb Hamiltonian — every electron and nucleus in the die, pairwise Coulomb interaction — is a well-defined mathematical object: self-adjoint (Kato 1951), bounded below with the right extensivity (stability of matter, Dyson–Lenard, then Lieb–Thirring; book treatment in Lieb & Seiringer). Everything in this project could in principle be anchored there.
Below the anchor, the QM ↔ QED gap is an effective-field-theory power-counting statement, validated by the most precisely tested predictions in science (electron g−2 agrees with experiment to parts in 10¹²). That is an empirical claim, not a theorem, and it can never become one from above.
The structural consequence, in this project's terms: the physics tower contributes exactly one empirical axiom no matter how deep you dig — digging deeper only relocates it. So the position of the axiom is a free choice, and the rational choice is the level where the empirical validation is strongest and the mathematics above it is theorem-dense. That is the many-body / semiclassical boundary — i.e. essentially where E1 already sits. Pushing E1 downward buys epistemically nothing and costs open mathematics.
One distinction this argument must not blur, because 02's Route-A discussion turns on it: the choice of anchor level (how deep) is separate from the choice of representation at that level (how E1 is stated there). "Digging deeper buys nothing" is about the first — going below the semiclassical anchor toward the Boltzmann equation, band structure, QED. It says nothing against the second. At the anchor level the device physics can be represented either as a fitted compact model (BSIM — a point cloud with an interpolant) or as a solved drift–diffusion system over parameters identified from measurement — and those are not the same object even though they rest on the same measured inputs and the same regime. The DD representation is a lateral move to more structure, not a descent, and it does buy something the compact fit cannot: principled continuum enclosures with inter-sample bounds, honest extrapolation beyond the characterised box, and a physics-carried disturbance response (04, V9/V10). So E1's position is fixed here by this chapter's argument, but its form is open — and 02 argues the drift–diffusion form, cast as a Bayesian credible enclosure, is the better one at the same floor.
What is a theorem above the anchor
The reductions between the anchor and drift–diffusion, with status:
| reduction | status | who |
|---|---|---|
| many-body → band structure / one-particle | mean-field settings only | Catto–Le Bris–Lions (crystals); Cancès–Deleurence–Lewin (defects) |
| one-particle in random medium → linear Boltzmann | theorem (weak-coupling limit) | Erdős–Yau 2000; beyond kinetic time Erdős–Salmhofer–Yau |
| semiclassical limit machinery | theorem (Wigner measures) | Gérard–Markowich–Mauser–Poupaud |
| Boltzmann → drift–diffusion | theorem (diffusion limit) | Poupaud; Golse–Poupaud; Ben Abdallah–Degond (energy-transport) |
| nonlinear collision terms (e–e, Pauli exclusion; phonons in full) | open | — |
Two honest caveats. Every "theorem" above is an asymptotic scaling limit over idealised settings with non-explicit constants — the same status as M6, the quasi-static constant. And the two open rows mean there is no unbroken theorem-chain from the anchor to van Roosbroeck; the chain is theorem-dense, not theorem-complete.
The ideal theorem could not say "negligible" anyway
Suppose every link were proved. The statement still could not be "the physical behaviour diverges negligibly from the drift–diffusion (DD) solution," pointwise, for a physical reason: the statistical approximation's fluctuations are observable at this node.
A logic 1 at 1.8 V on ~1 fF is ~10⁴ electrons. Central-limit-theorem-scale fluctuations around the mean field are therefore ~1%, and they have names: shot noise (carrier granularity), random telegraph noise (single trapped charges modulating a transistor's current — individually visible; Kirton & Uren), discrete dopant fluctuation (a channel holds thousands, not 10²³, dopant atoms; Asenov's atomistic simulations quantify the resulting threshold scatter). None of these is negligible pointwise; all are bounded by margins and corners (E4) — the correct theorem has the P3 shape: P(deviation > margin) bounded by something astronomically small, then discharged. Fluctuations are bounded against margins, never proved absent.
Quantum effects already inside E1
At 130 nm, quantum mechanics is not a correction waiting to be bounded — parts of it are first-order device physics already folded into the compact model:
- Gate tunnelling. BSIM4 carries explicit gate-current models. At SKY130's ~4 nm oxide direct tunnelling is still small (it becomes first-order below ~3 nm), but the model content is there and the leakage budget should cite it rather than ignore it.
- Quantum confinement in the inversion layer shifts the threshold voltage (Ando–Fowler–Stern is the classic treatment); BSIM4 has the correction terms.
- Band-to-band tunnelling / GIDL — likewise modelled.
So the E1 clause added in 00 — "the PDE being dodged would itself have been adequate" — should be read as: adequate with these quantum channels routed around the PDE and into the fit. The semiclassical transport picture itself is comfortable here: the thermal de Broglie wavelength in silicon is ~8 nm against a ≥150 nm channel.
Why the digital state is classical at all
Two things a physicist should say once, then discharge:
Decoherence. A node voltage is a collective coordinate of ~10⁴ electrons coupled to a dissipative lattice at 300 K; superpositions of logic states decohere on femtosecond scales (Zurek's einselection — the charge on a node is about as robust a pointer observable as exists). There is no coherent-superposition failure mode to model; whatever quantum noise survives is already inside the thermal and RTN terms.
Macroscopic quantum tunnelling of a logic state. The quantum analogue of the thermal Kramers term: rate ~exp(−S/ħ) with S the action of a collective many-electron tunnelling path — larger-than-astronomically suppressed, far beyond even P3's exp(−7500). (MQT is real physics, observed in Josephson junctions at millikelvin — Caldeira–Leggett theory, Devoret–Martinis–Clarke experiments — which is exactly the regime a logic node is not in.) Same verdict as P3: prove the exponent is enormous, delete the term.
Conclusion
- No additional axiom. The quantum floor is absorbed into the device model's adequacy residue (the reshaped, discharged E1), and this document is the argument that the many-body / semiclassical level is the right place for the tower to bottom out.
- "Prove a QFT solution exists and diverges negligibly" fails three ways: the object does not exist mathematically (QED), the reduction chain has open links (band structure beyond mean field, nonlinear collisions), and the true statement is probabilistic with observable fluctuations bounded by margins, not negligible divergence.
- What is available, and matches the project's pattern everywhere else: a rigorous anchor (stability of matter), a theorem-dense chain of scaling limits above it, and P3-style discharge of the residual quantum terms.
- The data-side consequence (axioms.md, "Empirical inputs"): the practical data floor is bulk material data, not fundamental constants — ab initio methods reach percent accuracy at best on the quantities that matter, so material parameters remain measured even if the whole reduction chain were proved. Fundamental constants themselves are exact (2019 SI) or known to ~10⁻¹⁰, and enter L0's arguments directly only through kT, e, and ε₀.
Open problems
None blocking. Optional, in descending value:
- Explicit-constant versions of the kinetic and diffusion limits (parallel to M6) — contributions to mathematical physics independent of this project.
- A stated numeric bound, from the SKY130 model cards, on gate leakage + RTN + discrete- dopant scatter against the noise-margin budget — turning "inside E1" into a checked number.
- Model hygiene: verify DD-with-BSIM4-corrections does not double-count any quantum channel (the corrections were fitted, not derived, so overlap is possible in principle).
First experiments
- Pull the gate-current and threshold-correction parameters from the SKY130 BSIM4 model cards and compare their contribution against the noise margin — this is open problem 2 and is an afternoon, not a year.
- Estimate discrete-dopant σ(V_t) for the SKY130 device geometry from Asenov-style scaling and check it is comfortably inside the corner spread (E4) — i.e. that variability corners already carry the granularity of the statistical approximation.
Effort
Days to state — this file exists to prevent effort, not to consume it.
Reading
Lieb & Seiringer, The Stability of Matter in Quantum Mechanics (2010); Kato (1951) for self-adjointness. Glimm & Jaffe, Quantum Physics, for what constructive QFT can and cannot do; Aizenman & Duminil-Copin (Ann. of Math. 2021) for φ⁴₄ triviality. Erdős & Yau (CPAM 2000) — linear Boltzmann from random Schrödinger; Erdős–Salmhofer–Yau (Acta Math. 2008). Gérard–Markowich–Mauser–Poupaud (CPAM 1997) on Wigner measures. Poupaud (1991) and Ben Abdallah & Degond on diffusion and energy-transport limits; Markowich–Ringhofer– Schmeiser, Semiconductor Equations, ties the chain together. Ando, Fowler & Stern (Rev. Mod. Phys. 1982) on inversion-layer quantisation. Kirton & Uren (Adv. Phys. 1989) on RTN; Asenov (IEEE Trans. Electron Devices, 1998 onward) on random dopant fluctuation. Zurek (Rev. Mod. Phys. 2003) on decoherence and einselection. Caldeira & Leggett on dissipative MQT; Devoret, Martinis & Clarke for the experiments.
L0/06 — The cut discipline
Background
Lumping (08) cuts the die into components and composes their contracts — but where may one legally cut? The answer lives in the transistor-level structure of a CMOS cell, and turns on the MOSFET's fundamental asymmetry: the gate terminal is (almost) purely an input — it controls the channel through a capacitor, drawing no steady current and pushing (almost) nothing back — while the source and drain are the channel's two ends, through which current flows bidirectionally, with no inherent notion of which side drives which. A signal path through gates is one-way; a path through source/drain terminals is a two-way electrical continuum.
This asymmetry induces a canonical decomposition of any transistor network, due to Bryant: partition the circuit's nodes by connectivity through source/drain terminals only, and call each part a channel-connected component (CCC). Within a CCC, everything is bidirectionally coupled — charge can slosh both ways, nodes can fight, and analysis must treat the component as one analog lump (this is where charge sharing lives: a driven node connected through a pass transistor to an undriven one redistributes its charge, possibly corrupting both). Between CCCs, all influence flows through gate terminals — unidirectional and restoring. So CCC boundaries are exactly the places where cutting is sound: a contract stated at a gate input composes forward without any fixed-point argument about mutual feedback, because there is none.
The chapter's other two obligations are also best previewed in circuit terms. PUN/PDN duality: a static CMOS gate is built as two complementary switch networks — a pull-up network of PMOS transistors to the high rail and a pull-down network of NMOS to ground — designed as logical duals (series in one ↔ parallel in the other), so that for every input exactly one network conducts: output always driven, rails never shorted. That "exactly one" is a checkable graph property of the cell's transistor network, and it is the within-cell half of the no-contention condition V1. And the bistable containment condition: a storage element is electrically a feedback loop (two inverters tail-to-head), and the discipline requires every such loop to live inside one declared sequential cell — a feedback loop straddling a cut boundary would be a latch the composition never modelled, exactly the kind of surprise the cut discipline exists to exclude.
Statement
The per-cell transistor-level combinatorics that license 08's composition: where may the network be cut, and why is every bistable inside a component rather than spanning components?
This is a narrow document. An earlier draft collected all the combinatorial obligations here, which was a scoping error — most of them are about artifacts L0 does not own. See the dispatch table for where they went.
The object: channel-connected components
Bryant's decomposition (Bibliography). Partition nodes by connectivity through source/drain terminals; transistor gates are unidirectional inputs and therefore the boundaries.
inside a CCC : bidirectional; needs full switch-level analysis; charge sharing possible
between CCCs : unidirectional (through gates); restoring
This is exactly why cuts are legitimate only at CCC boundaries: only there is signal flow unidirectional, so a component's terminal contract composes without a fixed-point argument. It is the transistor-level counterpart of 06's restoration property — the same fact about where information flows one way.
The three obligations, per cell (×~400)
C1 — CCC structure. Compute the partition: each cell's CCCs, and the graph they form under gate-terminal edges.
C2 — PUN/PDN duality. For static CMOS the pull-up and pull-down networks are series/parallel duals, so for every input assignment exactly one conducts. This is V1(a) — the within-cell half of "no conducting path from Vdd to GND" — and it is the half genuinely about transistors rather than about netlist topology. Checking it is a graph-duality test on the transistor network, not a simulation.
C3 — bistables are CCC-internal. Every cycle in the cell's CCC graph must lie inside one declared sequential element. A cycle spanning CCCs is an unintended latch or oscillator. This is what makes 08's claim — "every bistable loop is internal to a component" — a checked fact rather than a hope.
All three need transistor netlists for the library. The chapter long assumed this meant extraction (recover the netlist from each cell's GDS) and treated that as the gating cost. It does not: the PDK ships the transistor netlists directly — sky130_fd_sc_hd.cdl, one .SUBCKT per cell, the same schematic LVS checks the layout against. C1–C3 read that file; no extraction stands between the obligation and the data.
Measured: C1–C3 over the whole library
tools/celltopo.py runs the three checks over all 437 cells, and check-l0 carries the result as ccc and v1a-tristate.
C1 (CCC structure) is computed by union-find over source/drain edges with the power rails excluded as connectors — each channel-connected component is one switching island, and the islands form a DAG under gate-terminal edges (for combinational cells) or contain a cycle (for storage).
C2 (PUN/PDN duality) is checked not as an abstract graph-duality test but against the Liberty function the digital tools actually trust. For each input assignment the checker evaluates the switch network at the level of individual transistors (nMOS closed when its gate is 1, pMOS when 0), asks whether the output node is pulled to exactly one rail, and compares the resulting truth table to the cell's function attribute. "Exactly one rail for every input" is duality made operational; agreement with Liberty ties it to what synthesis assumed. 311 of the 437 cells are CERTIFIED this way, with zero function mismatches — the transistor topology provably computes the Boolean function named in the library.
C3 (bistables are CCC-internal) falls out of C1's island graph: a cycle in the CCC-dependency graph is feedback, hence storage. 98 cells are so classified — every flop and latch family (dfxtp, dlclkp, sdfrtp, …) plus the physical fillers that carry transistors but no logic — and in each the feedback lives inside the one cell, never spanning a cut. This is exactly what 08 needs made a checked fact.
The remaining 28 cells FLOAT — for some input no rail drives the output — and this is not a failure but the detection of Open Problem 3 below: they are precisely the non-static families (einvn/einvp/ebufn tri-states, the *kapwr always-on power-gated clock cells with a second rail, and conb/probe/spare specials). The partition is clean and exhaustive: 311 certified + 98 bistable + 28 non-static = 437, with no cell mis-sorted into the certified set (no certified cell carries a sequential or tri-state name). Classification is topological — from the CCC graph — not from the cell's name, so it is a check rather than a restatement of the library's own labelling.
Where the other conditions are discharged
04's envelope is L0's, but most of its conditions are discharged against artifacts other layers own. The envelope states them; the owning layer checks them.
| condition | discharged at | how |
|---|---|---|
| V1(a) no Vdd→GND path within a cell | L0/06 (here) | C2, PUN/PDN duality |
| V1(b) no contention between cells | L2 | one driver per net — 26 nets, all tri-state, all in pll.ringosc |
| — acyclicity, no floating reads, inertness | L2 | netlist well-formedness; 1 SCC, all in pll.ringosc |
| V2 crowbar current bounded | L1 | max_transition, which also bounds Liberty's domain |
| V3 below avalanche | L0/04 | analytic (type B — ionisation integral) |
| V4 thermal | — | not combinatorial: workload-dependent |
| V5 tap coverage | L1 | nearest-neighbour query on device positions |
| V6 electromigration | L1 + activity model | combinatorial only once activity is fixed |
| V7 no manufacturing defect | — | P5, statistical, not checkable |
| X2 ECC bit interleaving | L1 | per-word adjacency check on placement |
| — antenna area | L1 | order-dependent: quantifies over prefixes of the process sequence |
Two things this makes visible. The envelope is a genuinely cross-cutting concern: L0 owns the statement of every safety condition but the check for only one of them. And the checks cluster in L1 and L2 — where the geometry and the netlist actually live — which is what one would want, and is the argument that the layer split is by artifact rather than by topic.
Open problems
- Formalise the cut licence: signal flow between CCCs is unidirectional, therefore composition at CCC boundaries is sound. This is the theorem 08 needs and currently assumes — and the only remaining L0/06 obligation of substance, since C1–C3 now run. The switch-level checker establishes the premise (the islands and their gate-edge DAG) that this theorem quantifies over.
Extract transistor netlists and run C1–C3.Done — over all 437 cells, from the shipped CDL (see Measured). The assumed extraction dependency was illusory.Non-static-CMOS cells break C2.Resolved into a closed, checked list. The 28 FLOAT cells are exactly the non-static families, andv1a-tristateasserts that set is closed — every logic cell is covered by the static-CMOS certificate and every exception is named, not assumed away. Each still wants its own terminal contract (a tri-state has a high-Z output state the digital model must carry), which is the remaining bounded work here.
What is left
The switch-level function certificate does not touch the analog side: it establishes that the transistor topology computes the right Boolean function, not that the physics stays in the digital regime (that the pulled rail actually wins, with margin, under the operating envelope). That is E1 / 07's job, and the two compose — 07's enclosure gives the voltages, this chapter gives the switching function they realise.
Effort
The per-cell problems are tiny and near-linear, and they now run in seconds over the whole library, because the transistor netlists were shipped rather than extracted. What remains is the cut-licence theorem (open problem 1) and the per-cell tri-state contracts (open problem 3) — both bounded.
Reading
Bryant on switch-level simulation and the channel-connected-component decomposition — the source of the cut discipline. Melham for transistor-level CMOS in HOL.
L0/07 — Per-cell field bounds and terminal behaviour
Background
This chapter is where the physics gets computed, so it needs two pieces of context: what the computation is, and what discipline makes a computation trustworthy inside a proof.
The computation. A standard cell — an inverter, a NAND gate — is a handful of transistors plus a little internal wiring, and simulating its behaviour means solving a small system of differential equations: each node's voltage changes at a rate set by the currents flowing onto it, currents given by the device model. (Strictly a DAE — differential-algebraic equations, the flavour where some equations are instantaneous constraints rather than rates; circuit equations always come out this way, and it changes which solvers apply.) Industry does this with SPICE, the venerable analog simulator: give it the transistor netlist, it integrates the equations numerically and reports waveforms. The foundry has already done exactly this, thousands of times, to produce the Liberty file that L1 consumes — each cell's delay and output slew simulated across a grid of (input slew, output load) pairs and tabulated. So the object this chapter must produce is not novel in shape at all: it is the Liberty table again. What changes is the epistemic status of the numbers.
The discipline is validated numerics (interval computation). An ordinary numerical solver returns a number that is close to the answer, with error estimated by heuristics; a validated solver returns an interval together with a proof that the true solution lies inside it, by doing all arithmetic on intervals with outward rounding and bounding every truncation term. This costs looseness — the intervals are wider than the likely error — but yields statements a proof assistant can consume. Validated integration of small ODE/DAE systems is a mature specialty (the chapter's reading list names the standard tools), and a logic gate's equation system is small; the genuinely new thing here is only scale and interface — running the machinery over a whole cell library, against an interval-valued device model, with a Liberty-shaped table of certified bounds as output.
What makes this chapter the layer's centre of gravity is amortisation. Everything on the die is one of ~400 library cells; a cell verified once is verified for every one of its hundred thousand instances, and for every other design ever fabricated on this process. The unit of work — one cell, one corner, end to end — is measurable in days, and the first experiment below is precisely to measure it, because unit × 400 cells × 17 corners is the number that decides where in its estimated range the whole layer lands.
Statement
For each of the ~400 standard cells, bound the terminal behaviour over the operating range:
cell × (input slew, output load, corner) ⟼ enclosure on (delay, output slew, output level)
This deliverable is a Liberty table — an interval-valued, derived one. The shipped .lib is exactly this object (NLDM — pure table lookup, no current-source model at this node), produced by SPICE and asserted; L0/07's version is produced with bounds and a stated derivation.
Two coordinates the operating range must include — both statement-modifications, not new obligations (see 07/V9–V10). First, the device box the enclosure is quantified over carries a mechanical-stress axis, not only (slew, load, corner): silicon is deliberately strained and layout-dependent stress (STI, well proximity) shifts a cell's parameters, so E1's interval model — and hence this table — must hold over the stress range the process and package impose. Second, the enclosure must hold not merely for quasi-static inputs but under a bounded exogenous forcing — the environmental share of 06's disturbance budget — which enters the DAE as a source term. That turns Open Problem 1 into a disturbance-reachability enclosure (a reachable tube under bounded input) rather than a parameter/input one: the same integrator, harder. The tractable decomposition — nonlinear enclosure at the ESD/pad boundary, linear peak-gain propagation in the interior — is in 04.
Why it factorises this way
The cell is the right unit for three independent reasons:
- Amortisation. ~400 cells, verified once, cover every design on the process forever. This is the single largest leverage point in the project.
- The DAE is confined here. The nonlinear solve involves a handful of transistors. At chip scale it would be hopeless; at cell scale it is small. See 08 for why this confinement is legitimate.
- The domain is bounded and known. One cell's geometry, from L1's coloured image.
The problem to solve
Per cell, the domain is the cell's own geometry and the fields within it:
- Devices at each poly∩diff intersection, with interval-valued I-V from 02.
- Intra-cell parasitics — the local li1/met1 routing inside the cell. Small but not zero, and linear, so L1's variational enclosure machinery applies unchanged on this small domain.
- Boundary conditions at the pins, parameterised by input slew and output load.
Then solve the resulting nonlinear DAE with enclosures rather than point values, and tabulate.
What makes this hard
Verified DAE integration with enclosures. Taylor models, CAPD, VNODE-LP-style validated integration exist and are mature for small ODE systems. A CMOS gate is small. The DAE structure is also understood: modified nodal analysis yields index ≤ 2, with a topological characterisation of when it is index 1 (Estévez Schwarz & Tischendorf 2000), and Pryce's Σ-method gives the structural analysis that Taylor-series DAE solvers (Nedialkov & Pryce, DAETS) are built on. There is even a formal-verification-of-analog-circuits lineage at single-circuit scale: Greenstreet & Mitchell's projection-based reachability (a verified toggle element), Dang–Donzé–Maler's hybridization (a ΔΣ modulator), Althoff & Krogh's zonotope reachability for nonlinear index-1 DAEs, surveyed by Zaki et al.; the reachability toolboxes (CORA, Flow*, JuliaReach) are the living descendants. What nobody has done is run any of this at library scale, against an interval-valued device model, with a Liberty table as the output object. The gap is industrialisation and the interval-model interface, not the existence of the mathematics.
The table's extent is a hypothesis, not a convenience. The measured data is decisive here: max_transition = 1.5 is exactly index_1's largest value, and max_capacitance = 0.181284 is exactly index_2's largest. Beyond the characterised region the consumer extrapolates and the numbers become vacuous rather than wrong. So L0/07 must export the domain along with the values, and L1 must check the design stays inside it. Cf. finding F2 — the shipped design does not.
Interpolation must be an enclosure, and the obvious shortcut is unsound. Real (slew, load) pairs fall between grid points. Take the enclosing grid box and the extremes over it — but cell_fall is non-monotone in slew at two grid points (an artifact of the 50%-crossing delay definition with slow ramps and light loads). So take the max over all four corners of the enclosing cell, never the largest-index corner.
And be precise about what that bounds: the corner-max encloses the bilinear interpolant (which always lies within the corner range), not the underlying function — a non-monotone function can peak strictly inside a grid box, above every corner. The shipped table asserts values at the sample points and nothing in between, so no sound enclosure of the physical delay can be extracted from it alone. The derived table can close this gap because a DAE enclosure yields a derivative (or modulus-of-continuity) bound between samples; that bound is part of the deliverable, not an optional extra.
That non-monotonicity is worth dwelling on: it is evidence in production data that the monotonicity assumptions underlying corner-based methodology are not free, which matters for 08.
Corners multiply. 17 corner files in the SKY130 HD library. Each is a separate solve.
Measured: the SPICE screen (the point-value precursor)
The enclosure is not yet built, but its first experiment is — as a screen rather than a proof, and the distinction is the whole point of this chapter. tools/spicecheck.py runs ordinary (point-valued, not interval) ngspice on each single-input cell at the tt/1.8 V/25 °C corner the shipped .lib was characterised at: it translates the cell's CDL transistors into a deck, ramps the input at the Liberty slew, loads the output at the Liberty capacitance, measures the 50 %-to-50 % delay, and compares against the cell_rise/cell_fall table. It is exactly the oracle relationship this chapter's first experiment describes — "if your enclosure does not contain SPICE's value, something is wrong on one side" — run in the direction that is cheap today: point SPICE against the asserted table.
Over the inverter/buffer/clock-driver ladder (13 cells, 130 grid points) every ratio lands in 0.23–1.14×, and — the direction that matters — not one point has Liberty under-reporting the delay by more than the noise: the worst optimism is 1.14× (inv_1), so no cell's shipped timing model is optimistic against SPICE. Liberty is uniformly conservative, which is the safe direction for setup timing. This is spice-screen in check-l0.
Two things the screen earns beyond the numbers. First, it is a screen with teeth: it caught two real modelling bugs while being built — a seconds-versus-nanoseconds unit error, and a dropped m= device multiplier that made the ×8 inverter read 5.77× slow until the parallel fingers were restored — precisely the gross discrepancies a screen exists to surface. Second, it independently reproduces this chapter's own warning about non-monotonicity: at the extreme-slow-input grid corner the naive 50 %–50 % delay goes negative, because the output crosses its 50 % point before the input reaches its own — the inverter switches at the device threshold, well below the midpoint. The screen samples interior grid points to avoid the artifact; the artifact itself is the measurement-definition subtlety §"What makes this hard" flagged, now observed rather than predicted.
What the screen is not is the enclosure. It samples where the interval version must bound: it replaces the true device response with a single ngspice run, not with an interval that provably contains it over the operating box, and it covers single-input cells at one corner, not the ×400 × 17 obligation. It validates the setup, the oracle, and the absence of gross error; the enclosure (Open Problem 1) remains the layer's centre of gravity. The screen is the precursor that de-risks it.
Relationship to L1
L0/07 and L1's extraction solve the same linear problem on complementary domains — inside cells and between them. The machinery should be shared: one verified elliptic solver with enclosures, applied to two families of domains. Building it twice would be a mistake.
The difference is that inside a cell the problem is coupled to nonlinear boundary conditions at the devices, and outside it is purely linear.
Open problems
- Verified DAE enclosure integration at cell scale. The mathematics exists; the application does not.
- How coarse can the device enclosure be while still yielding a usable delay bound? If the answer is "quite coarse", E1's precision requirement drops and the whole layer gets cheaper.
- Whether the 17 corners can be reduced by proving monotonicity in the corner parameters — and the Liberty non-monotonicity above suggests the answer is "not universally."
First experiments
- The oracle direction — done (as a screen). Point SPICE against the shipped
.lib, over the single-input ladder: Liberty conservative to within 1.14×, no optimism, the non-monotonicity artifact reproduced. See Measured above. This confirms the oracle and the setup that the enclosure will reuse. inv_1, end to end (the enclosure). The remaining step turns the point SPICE into an interval: interval device model → intra-cell parasitics → DAE enclosure → an interval that provably contains the shipped.libentry rather than merely landing near it. The screen's decks and corner include are the scaffolding.- Measure the cost. This is the unit multiplied by 400 × 17 corners, and it decides where in its one-to-three-year range L0 lands.
- Check whether the enclosure width is dominated by the device model, the parasitics, or the integration — that tells you where to spend effort.
Effort
The dominant item of L0: the per-cell unit × ~400 cells × 17 corners. Its first experiment prices it, and the answer sets where in its one-to-three-year range the layer lands.
Reading
Rump's INTLAB and the validated-numerics literature. CAPD / VNODE-LP (Nedialkov) for validated ODE integration; Nedialkov & Pryce (DAETS) and Pryce's Σ-method for the DAE structural side; Estévez Schwarz & Tischendorf for the MNA index results. Greenstreet & Mitchell, Dang–Donzé–Maler, Althoff & Krogh, and the Zaki et al. survey for formal analog verification; CORA / Flow* / JuliaReach for current reachability tooling. Liberty format documentation for exactly what the shipped tables assert.
L0/08 — Lumping and composition
Background
Circuit theory is a claim, not a given. The field picture of 00 knows nothing of "components" — there is one connected electromagnetic system spanning the die, every point coupled to every other. The circuit picture — discrete components with terminals, wires that are equipotential nodes, Kirchhoff's two laws — is an abstraction of that field, and the passage between them is called lumping: choosing surfaces at which to cut the continuum into pieces, assigning each piece a terminal behaviour, and asserting that the pieces' behaviours compose through the connection graph to predict the whole. Every engineer uses this abstraction from the first week of training; introductory texts axiomatise it (the honourable exception, Agarwal & Lang, states it as the "lumped matter discipline" — explicit assumptions before use); and this chapter has to derive it, error bounds included, because L0/07's per-cell enclosures and L1's per-net enclosures are worthless until a theorem says small pieces compose.
Two failure modes of naive composition organise the chapter. The first is the interval dependency problem, a classic trap of interval arithmetic: if the same underlying uncertainty (say, the die's process corner) enters an interval computation independently at every use site, the computation admits impossible combinations — this gate slow, its neighbour fast, from the same wafer spot — and the composed bound explodes into uselessness while remaining perfectly sound. The remedies (affine arithmetic, Taylor models, zonotopes — representations that carry which uncertainty each interval came from, so correlated uses cancel) exist off the shelf; the chapter's task is to identify where they are needed.
The second is accumulation: even with dependencies tracked, why doesn't uncertainty compound along a twenty-gate chain until the enclosure covers everything? The rescue is the restoration property of 06 — each gate's gain pulls its output back toward the rails, shrinking incoming analog uncertainty rather than passing it on — and the chapter's contribution is recognising this as a known theorem shape from control theory: a small-gain argument. That field studies feedback systems where each component amplifies disturbances by some factor ("gain"); when the gains around every loop multiply to less than one, disturbances die out instead of building up, and stability of the whole network follows from the components' gains alone. Stated in those terms, per-stage restoration composes to chip-scale stability by citation rather than by invention — one of several places where this project's job is to recognise which existing mathematics a piece of engineering folklore has been, unknowingly, all along.
Statement
The abstract argument that licenses gluing. Given per-cell terminal enclosures (07) and per-net RC enclosures (L1), conclude that the true physical field lies within the enclosure the lumped circuit model predicts.
This is the document that makes L0 and L1 add up to something, and it is the one with the least existing prior art.
The four steps of lumping
1. Terminals. Choose surfaces where V and I are measured — for a cell, its pins. Definitional, but the choice must be consistent between L0/07's characterisation and L1's extraction, or the enclosures compose to nothing. And a cut is not licensed everywhere: it is legitimate only where the boundary is restoring and near-unidirectional — a MOS gate input is capacitive, with Miller feedthrough (C_gd back-injection into the driving net) as the bounded exception; a drain/source terminal is neither. Equivalently, components must be unions of channel-connected components (Bryant's partition — the one switch-level simulators compute), so that every bistable feedback loop is internal to some component. Cut inside a latch and no side condition saves the contract.
2. Conductors are equipotential. Each net is assigned one potential. Error is the IR drop within the conductor, bounded by R·I. Negligible for signal nets; not negligible for power, which is why the supply grid gets its own treatment and why decaps exist.
This is the same condition as L1's screening hypothesis, used for a different purpose. Worth noticing: the equipotential assumption is load-bearing twice.
3. The capacitance matrix exists. For N conductors in a linear electrostatic problem the map from potentials to charges is linear, Q = C V, and C exists precisely because the solution operator is linear and bounded — i.e. because of Lax–Milgram in 00. The dependency is direct: no well-posedness, no capacitance matrix, no RC enclosures, nothing above.
4. Kirchhoff's laws are theorems, not axioms. KCL is ∇·J = 0 integrated over a surface enclosing a node; KVL is ∇×E = 0 integrated around a loop. Both are exact in the quasi-static limit and carry 01's O((L/λ)²) error otherwise. Circuit theory is normally introduced axiomatically; here it must be derived, and the derivation is where the field-to-circuit error enters. The cleanest existing formulation is Bossavit's: on a discrete de Rham complex (Whitney forms), KCL and KVL are the exactness of the complex — the network is a coarse cochain model of the field, and the two Kirchhoff laws hold exactly at the discrete level while all approximation error lives in the constitutive (Hodge) map. That separation — topology exact, metric approximate — is precisely the structure a formalisation should copy.
The composition theorem
The actual content. Given component enclosures and a topology, bound the network's solution.
∀ cells c: terminal_behaviour(c) ∈ Encl_c [L0/07]
∀ nets n: RC(n) ∈ Encl_n [L1]
topology = the netlist [L2]
──────────────────────────────────────────────────────────
circuit_behaviour ∈ compose(Encl_c, Encl_n)
This is where it gets hard, because you are composing enclosures through a nonlinear DAE, and naive interval propagation explodes: the same uncertainty is counted independently at every use site, admitting physically impossible combinations (this cell slow, its neighbour fast, the first one slow again). Sound, but potentially so pessimistic as to be useless. This is the interval dependency problem, and the standard remedies — affine arithmetic (de Figueiredo & Stolfi), Taylor models (Makino & Berz), zonotopes (Girard; Althoff's CORA) — exist precisely to track which uncertainties are the same variable.
Two structural properties rescue it, and they are the real content of this document:
Monotonicity ⟹ corners suffice. If the network response is monotone in the uncertain parameters, the extremes occur at parameter corners, and you evaluate finitely many consistent assignments instead of propagating intervals. This is exactly why corner-based STA works, and it is universally assumed and never proved.
It is also not universally true: cell_fall is non-monotone in input slew at two grid points of the simplest cell in the library. So the theorem needed is not "the response is monotone" but a characterisation of where it is, plus a fallback where it isn't.
Restoration ⟹ no accumulation across stages. 06's contraction property means a chain of gates does not compound uncertainty — each stage pulls back toward a rail. So composition along a combinational path is well-behaved even though each stage carries an enclosure. Without this, a 20-deep logic cone would have a useless bound.
This has a name in control theory, and the theorem should be stated in its terms rather than reinvented: it is a small-gain / contraction argument. Each stage viewed as an input-to-state-stable (ISS) map with gain < 1 in the disturbance channel composes to a network-level invariant by the ISS small-gain theorem (Jiang–Teel–Praly for two systems; Dashkovskiy–Rüffer–Wirth for arbitrary interconnections), and Lohmiller–Slotine contraction analysis is the differential version. The lumping error from this document then enters not as a separate apology but as one more bounded disturbance input, which the same machinery absorbs.
The factorisation this licenses
The practical payoff, and the reason the whole stack is computable:
Confine the nonlinear DAE solve to inside a cell. Compose at chip scale using a linear network plus a DAG traversal.
SPICE solves the nonlinear DAE directly and cannot scale to a chip. The flow instead: characterises cells once by DAE solve (L0/07), treats interconnect as linear (L1), and composes by forward traversal (L1). L0/08 is what says that factorisation is sound and what the error term is.
Note the consequence for L1: its forward traversal — arrival time and slew propagating through a DAG — is not merely an algorithm, it is the chip-scale instance of this composition theorem. The two documents are describing the same thing at different granularity.
What composition is not
"Plug together" is combinatorics plus per-edge arithmetic: each connection discharges finitely many side conditions — output load within the driver contract's domain (max_capacitance), input slew within the receiver's (max_transition), coupling within the local disturbance budget. Finite and decidable, but not vacuous: the shipped design currently fails exactly these checks (finding F2). The right formalism for the per-component object is an assume-guarantee contract (Benveniste et al.): guaranteed output trajectory classes given input trajectory classes, load, and disturbance budget, with an explicit domain of validity — which is precisely what an interval-valued Liberty arc is.
And three quantities thread through every component without factoring through pins: the supply rails (equipotential fails exactly there — IR drop is a global property of the grid), the clock tree, and temperature (a global field sourced by aggregate activity). Each needs its own aggregate argument before any per-component contract's assumptions hold. They are the non-combinatorial residue of composition, and pretending they are edges in the graph is how power-integrity bugs escape verification.
Open problems
- The composition theorem itself. As far as I can tell nobody has stated "lumped circuit model is sound with respect to the field problem, with this error bound" in a form usable as a verification hypothesis. Everyone assumes it.
- Characterise where monotonicity holds, given that production data violates it. This is the hypothesis under corner-based methodology across the entire industry.
- Interval dependency: correlation-aware propagation, distinguishing global (process corner) from local (OCV) from shared-path (CPPR) uncertainty. Shared with L1.
- The equipotential error bound for power nets, where it is not negligible.
First experiments
- State the composition theorem formally with explicit error terms, before attempting a proof. The statement alone would be a contribution; several people would recognise it as the thing they have been assuming.
- Test monotonicity empirically across the shipped Liberty library: for all cells, all arcs, all corners, check monotonicity in each argument. We found violations in
inv_1; a survey would show whether they are rare pathologies or systematic. Cheap, mechanical, and directly informs how much of corner methodology is sound. - Build a small end-to-end instance: two inverters and a wire, field solve vs lumped model, and check the lumped enclosure actually contains the field solution.
Effort
Months for the statement and the monotonicity survey; as the other dominant item (with 07), its depth sets the layer total.
Reading
Haus & Melcher for the field-to-circuit derivation of Kirchhoff. Bossavit, Computational Electromagnetism — Whitney forms and network models as discrete Maxwell; Tonti on the classification diagrams behind it. Bryant (1984) for channel-connected components. Benveniste et al., Contracts for System Design (Foundations and Trends in EDA, 2018) — the assume-guarantee formalism the per-component contracts instantiate. Jiang–Teel–Praly and Dashkovskiy–Rüffer–Wirth on ISS small-gain; Lohmiller & Slotine, "On contraction analysis for non-linear systems" (Automatica 1998). de Figueiredo & Stolfi (affine arithmetic), Makino & Berz (Taylor models), Girard and Althoff (zonotopes, CORA) for the dependency problem. Note that circuit-theory texts almost universally start from Kirchhoff, so the derivation direction needed here is unusual.
L0/09 — Capacitance enclosures
Background
Timing needs numbers out of the geometry: every wire's delay is set by its resistance and its capacitance — the amount of charge that must be moved to swing its voltage, determined by the wire's shape and its proximity to every neighbouring conductor. Computing capacitance is a problem in electrostatics: the electric potential in the insulating material between conductors obeys a partial differential equation (Laplace's, generalised for varying dielectrics), with the conductors imposing boundary values, and the capacitance matrix is read off from the resulting field's energy. Industrial extraction tools do not solve this PDE per wire — they pattern-match against a precomputed library of solved geometries — and their accuracy target is a few percent. This chapter asks for something different in kind: not better accuracy, but certified bounds — numbers with a proof that the truth lies between them — and its opening observation is that the accuracy bar for certified bounds is unusually low here, because the timing flow already tolerates 10–20% margins. Crude-but-rigorous is enough, which is rarely true in verified numerics.
The classical route to two-sided bounds is a pair of variational principles, and the intuition is worth having. The true potential field is the laziest one — among all fields matching the boundary voltages, it minimises stored energy (the Dirichlet principle). So take any trial field satisfying the boundary conditions, compute its energy, and you have provably overshot: an upper bound, no PDE solved. The complementary (Thomson) principle runs the same trick from the dual side — any divergence-free trial flux gives a provable undershoot. Squeeze the truth between a decent trial of each kind, and the gap between your bounds even tells you how good your trials were. The trials in practice come from the finite element method (FEM — carve the domain into small cells, approximate the field by simple polynomials per cell, solve the resulting linear system), run once and post-processed into both a valid trial field and a valid trial flux; the machinery for the second half ("equilibrated flux reconstruction") exists off the shelf in the numerical-analysis literature, with computable constants.
Two honest difficulties shape the rest of the chapter. Where a conductor has a sharp corner, the true field diverges (integrably — like r^(−1/3) at a right angle), and rigorous integration must handle that known singularity rather than stepping in it. And the object actually needed is not the capacitance of the geometry but bounds valid across the whole family of geometries the fab might print — 01's sandwich — which turns out to cost nothing extra, by choosing the trial fields once for the whole family. The heavy cost sits elsewhere, and the chapter is frank about it: the functional-analysis machinery (Sobolev spaces, the well-posedness theory) that everything rests on is beyond what today's proof-assistant libraries provide, and formalising it is the single largest cost in L1.
Statement
Replace the pattern-matched extraction deck (E3) with rigorous two-sided bounds on the capacitance matrix, valid over the whole as-fabricated geometry family.
The viability argument, stated up front because it is unusual: the accuracy requirement is soft. Industrial extraction targets ~5% against a field solver, and the flow already carries 10–20% in derates and OCV margin. So crude but rigorous bounds are enough — unlike most verified-numerics applications, where loose bounds are useless.
Setup
Ω ⊆ ℝ³ bounded; disjoint closed conductors K₀ (ground), K₁,…,K_n; dielectric Ω_d = Ω ∖ ⋃Kᵢ; permittivity ε ∈ L^∞, 0 < ε_min ≤ ε ≤ ε_max (bounded measurable — dielectric jumps are fine).
For V ∈ ℝⁿ, let φ_V ∈ H¹(Ω_d) solve
∇·(ε∇φ) = 0 in Ω_d, φ = Vᵢ on ∂Kᵢ, φ = 0 on ∂K₀
Existence and uniqueness are Lax–Milgram — classical, see L0/00. The energy E(V) = ½∫_{Ω_d} ε|∇φ_V|² is a positive quadratic form, and
E(V) = ½ Vᵀ C V defines the capacitance matrix C.
The existence theorem is what makes C a well-defined object at all — no well-posedness, no capacitance matrix, no RC enclosures, nothing above.
Theorem (two-sided enclosure)
For any admissible potential
u ∈ H¹(Ω_d)withu = Vᵢon∂Kᵢ,u = 0on∂K₀, and any admissible fluxj ∈ H(div, Ω_d)with∇·j = 0, writingQᵢ(j) = ∮_{∂Kᵢ} j·n:Σᵢ Vᵢ Qᵢ(j) − ½∫ |j|²/ε ≤ E(V) ≤ ½∫ ε|∇u|²Both bounds are attained simultaneously iff
j = ε∇φ_Vandu = φ_V.
Evaluating at a basis of V and polarising gives a bracket on C in the Loewner order: C_lo ⪯ C ⪯ C_hi.
Proof hints
Convex duality. The upper bound is the Dirichlet principle: φ_V minimises the energy over the admissible affine set, so any trial u overestimates. The lower bound is the complementary (Thomson) principle, the Fenchel dual, with ∇·j = 0 as the constraint dualising the Dirichlet condition. The gap between the two is the duality gap, which is zero at the solution — so the bracket tightens automatically as the trial fields improve, with no separate convergence argument.
The practical route: one FEM solve gives both sides
The upper bound is easy — any conforming FEM solution is an admissible u. The lower bound needs a divergence-free j, which a raw FEM gradient is not.
Equilibrated flux reconstruction (Ern–Vohralík) is built for exactly this: it post-processes a FEM solution into a certified H(div)-conforming, divergence-free flux, with fully computable constants and no unknown interpolation factors. So a single solve yields both an admissible u and an admissible j, hence the bracket.
This is the concrete answer to "how would this actually be computed", and it is why the lower bound — usually the hard half — is not an obstacle.
Corollary: bounds over the geometry family
The theorem is for one geometry; what is needed is a bracket valid for every A in 01's sandwich. Both trial fields can be chosen family-uniformly:
u: setu ≡ Vᵢon the dilated conductorKᵢ ⊕ B_r. SinceAᵢ ⊆ Kᵢ ⊕ B_r, thisusatisfies the boundary condition for every member of the family. Well-defined precisely because the dilations are disjoint — which is hypothesis (H2).j:∇·j = 0means the flux through any surface enclosingKᵢ(A)is the same, soQᵢ(j)is independent of whichAin the family is meant, providedjis divergence-free throughout the annulus(Kᵢ ⊕ B_r) ∖ (Kᵢ ⊖ B_r).
So the enclosure over the family costs nothing extra, and (H2) is doing double duty — it separates nets in 01 and it makes the uniform trial potential constructible here. Worth noting as a real dependency between the two documents rather than a coincidence.
This also means the right object was never a point geometry: "∀ geometries within tolerance, C ∈ [lo,hi]" is more faithful to the physics than the point-geometry field solve it replaces, since as-fabricated ≠ drawn regardless.
The obstacle: corner singularities
∇φ diverges like r^(−1/3) at a right-angle conductor corner — precisely where the capacitance concentrates. Consequences:
- Total energy is finite (
|∇φ|² ~ r^(−2/3), and∫r^(−2/3)·r drconverges near an edge), so the variational framework is intact;φ ∈ H¹regardless. - But convergence rates degrade, and verified quadrature must handle integrable singularities of known exponent. The exponents are analytic (Grisvard), so graded meshes or singular enrichment work. Engineering, not research — but it must be done, because the naive quadrature bound is infinite exactly where the answer lives.
A cheaper decomposition: 2D may be exact
Much of extraction reduces to 2D cross-sections with 3D corrections. For 2D multiconductor configurations with piecewise-linear boundaries, Schwarz–Christoffel mapping gives closed-form capacitance in terms of elliptic integrals. The SC parameter problem is finite-dimensional root-finding, where validated numerics is routine.
That suggests attacking the layer as (exact 2D) + (verified 3D correction) rather than as one 3D PDE — a materially better decomposition, and one that puts the hard verified-numerics work only on the correction term.
Obligations
- Formalise the two variational principles. Sobolev-space machinery, well beyond current prover-library scale — this is the single largest formalisation cost in L1.
- Verified quadrature with
r^(−1/3)singularities. - The family-uniform trial construction above (small, given 01).
- Whether multi-conductor capacitance is monotone under conductor inclusion — would give the family bound directly by evaluating at erode and dilate. True for single-conductor capacity; the multi-conductor case needs checking rather than assuming.
First experiments
- Two parallel plates, then two parallel wires over a ground plane: compute both bounds by hand, confirm the bracket contains the analytic answer, and measure how loose a trial pair can be while still landing inside a 20% budget.
- Run Ern–Vohralík reconstruction on a small FEM solve and check the certified gap.
- Compare a Schwarz–Christoffel 2D result against a field solver on one SKY130 cross-section.
Effort
Years, dominated by obligation 1. But the accuracy requirement being soft means the numerical side is unusually forgiving; the cost is formalisation, not computation.
Reading
Pólya & Szegő, Isoperimetric Inequalities in Mathematical Physics — rigorous capacity bounds by exactly this method. Nakao, Plum, Watanabe for verified elliptic numerics. Ern–Vohralík for the equilibrated flux.
L0/10 — Screening and locality (M2)
Background
Electrostatics has no built-in locality: every pair of conductors in the universe has a nonzero capacitance between them, however far apart. Yet every extraction tool, when computing a wire's couplings, looks only a few wire-pitches away and ignores the other sixty thousand nets on the die. What makes that truncation sound cannot be "distant couplings are individually small" — the chapter's opening computation shows the sum over all distant conductors diverges if nothing intervenes, because the count of conductors grows faster with distance than pairwise coupling shrinks. The truncation is sound, if it is, for a different reason: screening — grounded metal in between blocks the field.
The physics is the Faraday-cage principle. A conductor held at a fixed potential terminates electric field lines: whatever field arrives on one side induces surface charge that exactly cancels its influence on the other side. A wire fully enclosed in grounded metal couples to the outside world not weakly but not at all — and a chip's power-distribution grid, a dense mesh of supply metal on every routing layer held at fixed voltage (that "held at" being the decap army's job, a hypothesis to be tracked, not assumed), approximates exactly such an enclosure around every signal wire. Approximates: a mesh has holes, and field leaks through them. The chapter's mathematical task is to quantify the leakage, and the tools are two classical pillars of potential theory. The maximum principle says a harmonic function (which the potential is, away from charges) attains its extremes on the boundary — no interior bumps — so bounding a potential on a surrounding surface bounds it everywhere beyond. Harmonic measure refines this into an accounting of where the boundary's influence comes from: the potential at a point is a weighted average over the boundary, and the weight of the holes-in-the-mesh portion is exactly the factor by which one layer of mesh attenuates the field.
The structure of the conjectured answer explains why a mesh works where a single barrier would not: one layer of holes attenuates by some fixed factor α < 1, and a distant net sits behind many layers in series, so the attenuation compounds exponentially in the number of grid cells crossed — which beats the polynomial growth in the number of distant conductors and makes the discarded sum genuinely negligible. Every capacitance number in this book — and in every industrial flow — rests on this argument existing; it is the widest-error-bar open problem in the layer, and nobody has written it down.
Why this is the load-bearing open problem
Every practical extraction truncates: only conductors within a few tracks are considered. The justification is not "distant things are small". Without screening the far-field sum diverges.
The count of conductors at distance d grows polynomially (~d in a quasi-2D die), while unscreened coupling between two thin parallel wires decays only logarithmically, C ~ 1/ln(d/a). So Σ_d count(d)·C(d) has no chance of converging. Local extraction is sound only because intervening grounded metal screens, and quantifying that is this document.
Everything in 09 is computed on a truncated window. If M2 is false, those numbers bound nothing.
The conjecture
Let
nbe a net,W_d(n)the conductors within distanced, andC_dthe capacitance matrix computed with all conductors outsideW_d(n)grounded. Suppose the power grid is a mesh of pitchpwith aperture parametera, held at a fixed potential, and every intervening conductor is either grounded or driven with impedance bounded byZ_maxover the band of interest. Then there existKandα < 1, depending only on(p, a, ε_max/ε_min), withΣ_{m ∉ W_d(n)} |C(n,m) − C_d(n,m)| ≤ K · α^{d/p}
Two features of the statement are deliberate.
The bound is on the aggregate, not per pair. There are ~61,000 nets; a per-pair bound |C(n,m)| ≤ ε would give 61000·ε, which is not small. The sum is the object that must be controlled.
The decay is exponential in d/p — cells traversed, not distance. That is what beats the polynomial count and makes the series converge. A power law would leave convergence marginal and dependent on the exponent.
Proof route
Step 1 — the exact case is topological
If a grounded conductor
Gseparatesnfromm— every path from one to the other meetsG— thenC(n,m) = 0exactly.
Proof: the boundary value problem decouples. Solve inside and outside G independently with G's Dirichlet condition; neither solution sees the other's data.
This is worth isolating because the hypothesis is topological, not metric, hence combinatorially checkable — and because it is what deliberate shielding (grounded wires alongside a critical net) buys: exactly zero, not a bound. It also gives the base case for what follows.
Step 2 — one-cell attenuation via harmonic measure
Real grids are meshes, not solid planes, so the field leaks through apertures. Take a closed surface S of grounded conductor plus apertures; let φ be the potential from n with all else grounded, φ ≤ M on the apertures, φ = 0 on the conductor. By the maximum principle, for x beyond S:
φ(x) ≤ M · ω(apertures, x)
where ω is the harmonic measure of the aperture set seen from x. Complete enclosure gives ω = 0, recovering Step 1.
The lemma to prove is the one-cell bound: for a periodic aperture array of pitch p and aperture size a, ω ≤ α(a/p) < 1 at distance ≳ p beyond the barrier. Explicit for simple geometries; the general estimate is the technical core.
Step 3 — cascade
Between n and a net at distance d lie roughly d/p mesh cells in series. Iterating Step 2 multiplies the attenuation:
φ beyond k barriers ≤ α^k · φ at the source
by induction on k, each step an application of the maximum principle to the region between consecutive barriers. Converting a potential bound to a capacitance bound is then a surface integral of ε∇φ over the far conductor.
Cascaded apertures are the whole mechanism. A single aperture gives only a power law; the exponential comes from having many in series, which is exactly what a dense power mesh provides.
Hypotheses that must be stated, not assumed
The grid must be an equipotential over the band of interest. The maximum-principle argument needs φ = 0 on the shield. A wobbling shield is a source, not a boundary condition. This is exactly what L1's ~225,000 decaps establish — a frequency-domain impedance bound, discharged once. So the decaps do double duty: supply integrity and shield quality, and removing them degrades this theorem, not just the power delivery.
Floating conductors relay rather than screen. A conductor not held at a potential does not terminate field lines — it couples in and out, shortcutting an aperture chain and destroying the cascade. Consequence: metal fill must be tied, not floating. This should be a requirement on the design, not an option; a design with floating fill has no valid locality argument at all.
Driven signal nets screen only partially. A driven net is low-impedance through its driver's output resistance, which rises with frequency; digital edges carry content well above where the drivers are stiff. So "grounded" is an idealisation and the honest hypothesis carries Z_max over the band, which is why the conjecture states it that way.
What follows if it holds
- The coupling graph has support bounded by the truncation radius — each net has O(10) neighbours instead of O(61,000). That sparsity is what makes L1's crosstalk treatment and 09's per-window solves possible at all.
- X3 stops being an axiom. It is currently the assumption standing in for this theorem.
- Truncation radius becomes a derived quantity: choose
dso thatK·α^{d/p}fits the margin, rather than choosing 2–3 tracks by convention.
What is actually at stake
Read this carefully, because the naive reading is wrong. The property — the aggregate coupling converges — is not in doubt: working silicon establishes it, and every industrial extractor already truncates at a fixed window and matches measured chips, which is the empirical certificate that the far field is negligible (it is the content of axiom E3, the calibrated rule deck). So screening is the mechanism and it is present — the divergence of the unscreened sum is elementary, so something must supply convergence, and a grounded mesh is the only candidate. What M2 buys is not the property but its a-priori proof: without it, the far-field truncation stays an empirically calibrated step (E3 trusted, not derived) and only the industrial capacitance numbers — calibrated, not proved — are available; with it, the truncation radius becomes a derived quantity with a certified error bound, and E3's far-field part discharges into a theorem. The open problem is the rate that licenses cheap local extraction over the empirical deck, never whether the coupling is bounded.
Obligations
- The one-cell harmonic-measure bound — the technical core, and the piece I would treat as genuine analysis rather than engineering.
- The cascade lemma: iterated maximum principle across successive barriers.
- Potential bound → capacitance bound (surface integral; routine given 1–2).
- A checkable shielding-coverage predicate on the layout: the design-side hypothesis that there really is grid metal interposed. Combinatorial, and it belongs with 12.
First experiments
- Numerically test the cascade before committing. A 2D mesh of grounded strips with a source on one side: measure attenuation per cell, check it is geometric in the number of cells, and extract an empirical
α(a/p). Cheap, and it either supports the exponential form or kills it early. - Compute the shielding coverage actually present in the flow's layout between representative net pairs — is there grid metal interposed, or are there sparsely-gridded regions where the hypothesis fails locally?
- Check whether the flow's metal fill is tied or floating. If floating, the locality argument needs the harder version.
Effort
Unknown, and the widest error bars in the project — obligation 1 could be six months or a thesis. It is also the highest-leverage single result in L1, since everything in local extraction depends on it.
Reading
Pólya & Szegő for capacity comparison methods. Standard potential-theory texts for harmonic measure and the maximum principle; Garnett & Marshall, Harmonic Measure, for the estimates Step 2 needs.
Glossary
The jargon net for the whole book — hardware-flow terms first (in the order a design passes through the flow), then verification, timing, physics/mathematics, and reliability/test vocabularies. Terms are used throughout the layer documents without re-explanation; textbook-depth treatments are in the reading list.
Design description
| RTL | Register Transfer Level — the behavioural Verilog a human writes (always blocks, buses, arithmetic) |
| netlist | the same design as a flat graph of library cells and wires, after synthesis. Also "gate-level" |
| ISA | Instruction Set Architecture — the programmer-visible contract the whole project is proving the chip meets |
| SoC | System on Chip — core plus memory and peripherals on one die |
The cell library and process
| PDK | Process Design Kit — everything the foundry supplies about a process: cell layouts, timing, DRC rules, device models |
| standard cell | a pre-drawn logic gate (inverter, NAND, flip-flop) of fixed height, ~400 of them; designs are assembled from these |
Liberty (.lib) | per-cell timing/power tables — delay as a 2-D function of input slew and output load, one file per PVT corner |
| BSIM | the fitted compact model giving a transistor's current from its terminal voltages. Once the project's one physical axiom (E1); now discharged — the device enclosure is derived from measurement data by Bayesian inversion (L0/02), leaving a thin model-class-adequacy residue |
| PVT corner | a (process, voltage, temperature) extreme the design must work at; SKY130 HD ships 17 |
Physical implementation
| pad / IO cell | the chip's physical interface: the bond pad is a bare metal square (~60 µm) on the die perimeter that a bond wire attaches to; the IO cell behind it is a large circuit doing level shifting (1.8 V core ↔ 3.3 V world), ESD protection, drive-strength output staging, input buffering, and direction control. Here these are sky130_fd_io macros — at tens of thousands of polygons each, individually bigger than most logic blocks. obs is defined at the pad metal: the last point that is still "the chip" |
| P&R | Place and Route — choosing where each cell sits and how wires connect them |
| LEF / DEF | the abstract views P&R works in: cell outlines and pin locations (LEF), placements and routes (DEF) |
| GDS / GDSII | the layout interchange format — layer-tagged polygons; what goes to the mask shop |
| CTS | Clock Tree Synthesis — building the buffer tree that distributes the clock |
| OPC | Optical Proximity Correction — deliberately distorting the mask so the printed shape matches intent |
| fill / decap / tap / antenna diode | non-logic cells inserted for density, supply stability, well biasing and process protection. ~85% of instances |
Checks
| DRC | Design Rule Check — geometric rules (min width, min spacing, enclosure) the layout must satisfy |
| LVS | Layout Versus Schematic — extract a netlist from the geometry and check it matches the intended one |
| STA | Static Timing Analysis — exhaustive longest/shortest-path delay analysis; no simulation |
| setup / hold | the two timing constraints. Setup is a performance limit (fixable by slowing the clock); hold is a correctness limit, unfixable at any frequency |
| SDC | the timing-constraint file. Also carries exceptions — human claims that a path need not be checked, which no tool verifies |
| CEC | Combinational Equivalence Check — proving two netlists compute the same function |
Physics and reliability
| SEU | Single Event Upset — a particle strike flipping a stored bit. Poisson, does not shrink with margin |
| metastability | a flip-flop sampled mid-transition settles after an unbounded time; the one failure that breaks the digital abstraction rather than giving a wrong value |
| X | the third logical value: untracked — the wire is somewhere in the electrically safe region but the abstraction has lost its value (settled-but-unpredicted, mid-swing, saddle, unpowered). Drive-recoverable, which is what distinguishes untracked from broken; reset is an X-elimination procedure |
| ECC | Error Correcting Code — redundancy that repairs upsets, at the cost of a layout-level independence assumption |
| latch-up | a parasitic thyristor turning on — a second solution branch of the device equations, which tap cells exist to destroy |
| electromigration | current gradually voiding a wire; a wearout criterion over a trajectory, not a state |
| POR | Power-On Reset — the circuit that holds the chip in reset from power-good until the supply is stable, supplying each power epoch's initial state. this design carries none on-die — the arrangement is board/harness territory (X4), and an RC ramp detector catches rise-from-zero, not sags |
| BOR | Brown-Out Reset — a supervisor that asserts reset whenever the supply sags below operating minimum, closing the gray band between "logic misbehaves" and "state is lost" that a ramp-only POR leaves open. Fail-safe by construction: below its own validity range, reset is the passive default |
| MCU | microcontroller — a commodity single-chip computer (STM32, AVR). Cited here as precedent: every MCU ships a BOR, so the gray-band fix is a solved industrial problem, not a research item |
Verification and refinement
| refinement (⊑) | "every behaviour of the implementation is a behaviour the spec allows" — this project's notion of correctness; concretely, trace inclusion up to stuttering |
| transition system | states plus a step relation — the common shape of every spec-tower object |
| Mealy machine | a clocked finite-state machine whose outputs depend on state and current input — what a synchronous netlist is |
| bisimulation | two systems matching each other step-for-step in both directions; the equivalence L2 proves under the register map ρ |
| stuttering / measure | the implementation takes many steps per spec step; a measure function — a counter that strictly decreases — proves the stalling terminates. Read quantitatively (this core's measure components are constants), it yields per-instruction cycle bounds — see WCET |
| UB, layered (spec UB) | behaviour a spec leaves unspecified at its own layer while every layer below still holds: a reserved instruction (L4/03) havocs architectural state but the pipeline, bus, and envelope stay sound; an out-of-range knob (L5/05) floods X but the die stays safe. Never C-style anything-goes |
| WCET | worst-case execution time — a hard upper bound on how long code takes; an entire analysis discipline on cached/pipelined cores, literal addition of per-instruction bounds on this one (L3/08), and the input to L5/04's hold-up sizing |
| (inductive) invariant | a property true at reset and preserved by every step — the certificate form of "always true", and the one artifact no tool invents (L3/09) |
| assume-guarantee | contract style: the component guarantees G while its environment maintains A; the bus and PCPI ports are specified this way |
| demonic nondeterminism | unresolved choices read adversarially — the claim must hold under every resolution |
| prefix closure | every initial segment of an allowed trace is allowed — what makes stopping (power loss) spec-conformant for free |
| SAT / SMT | propositional satisfiability solving, and its extension with theories (bitvectors, arrays) — the workhorse decision procedures |
| BMC | bounded model checking: unroll k steps, hand to SAT; complete only to depth k |
| IC3 | the model-checking algorithm that invents inductive invariants incrementally; used here as an untrusted generator whose output is cheaply checked |
| DRAT / LRAT | proof formats a SAT solver emits; LRAT is checkable by a small verified program — how "the solver said so" becomes a theorem |
| PAC | polynomial-calculus certificates over circuit polynomials — the algebraic proof format for multipliers, where SAT resolution provably blows up |
| miter | two circuits joined output-against-output through XOR; "always 0" ⇔ equivalent — the standard reduction of equivalence to SAT |
| AIG | And-Inverter Graph: the two-input-AND-plus-inverter normal form equivalence tools operate on; hash-consing makes shared structure pointer-equal |
| NPN class | Boolean functions up to input/output negation and permutation; the 4-input functions fall into 222 classes — a finite rewrite library |
| ternary / X-prop | simulation over {0,1,X}; sound for unknownness precisely because X∧¬X=X — it never asserts consistency between two reads of the same unknown |
| symbolic simulation | running a circuit on symbolic expressions rather than values; the outputs are theorems over all inputs at once |
Tools and artifacts of this design
| Yosys / ABC | the open-source synthesis tool and its logic-optimisation engine — the pair that produces the hardened netlist |
| Verilator / Icarus | independent open-source Verilog simulators — L3's differential-testing oracles |
| Sail | the ISA-description language; its RISC-V model is the officially ratified one and exports to proof assistants |
| trace port / RVFI | RTL ports announcing each instruction retirement (the core's trace interface; RVFI is riscv-formal's version of the same discipline) — the designer's own commit-point map (L3/08) |
| Rocket / Chisel / Chipyard | the design stack: Rocket is the original RISC-V core generator, written in Chisel (a Scala-embedded HDL); Chipyard is the Berkeley framework that composes it with buses, devices, and harnesses into the SoC |
| FIRRTL / CIRCT / firtool | the specified intermediate representation Chisel elaborates to, the LLVM hardware-compiler project, and its FIRRTL-to-SystemVerilog compiler — the storey above the RTL (L3/04) |
| SRAM22 | the open SRAM generator whose sky130 macros carry this design's memories — hard macros with published transistor-level collateral, so their contracts are checkable-by-effort rather than foundry-opaque (L2/02) |
| serial TileLink | the off-chip port: on-chip bus transactions serialised into 32-bit phits under the link's own clock — the load path for programs and the source of the bus latency bound's worst case |
| JTAG / UART | two of the chip's serial interfaces: JTAG is the five-wire debug port reaching the standard debug module; UART is asynchronous and baud-framed (the observable output channel) |
| TileLink | the on-chip interconnect protocol of the Rocket ecosystem: request/response channel pairs with source-ID tags — the bus contract's alphabet (L5/02) |
| CSR / WARL | RISC-V's control-and-status registers; WARL fields ("write any values, read legal values") are where the standard deliberately leaves behaviour implementation-defined (S4) |
| CLINT / PLIC | the standard RISC-V interrupt sources: the core-local interruptor (software + timer interrupts) and the platform-level interrupt controller (device interrupts, claim/complete) — device models in L5/03 |
| LRM | the Verilog Language Reference Manual — the event-driven semantics this project deliberately does not formalise (L3/00) |
| Tcl | the scripting language EDA tools embed; an SDC file is a Tcl program, which is why it must be elaborated before it can be analysed |
Timing, in more detail
| slew | the transition time of a signal edge; delay tables are indexed by it, so it propagates through timing analysis like a value |
| skew | the difference in clock arrival between two flops — consumed directly by the hold constraint |
| jitter | cycle-to-cycle wobble of the clock edge — the oscillator's phase noise, integrated |
| arrival / required / slack | STA's three numbers per node: when the signal gets there, when it needed to, and the margin between them |
| CPPR | common-path pessimism removal: launch and capture clocks share a tree prefix whose variation cannot differ between them — credit it once |
| OCV / derate | on-chip variation (per-cell randomness) and the flat percentage margins that industrially stand in for its proper statistics |
| false path | a graph path STA can see but logic can never activate; declaring one is an unchecked human claim — the subject of L1/04 |
| FSM / one-hot | finite-state machine; one-hot encoding gives each state its own bit, exactly one set |
| tri-state | a driver that can disconnect (high impedance) as well as drive 0/1 — the one legitimate way two drivers share a net |
| latch inference | Verilog silently converting an incomplete combinational block into a state element — the classic way RTL grows unintended memory (L3/02) |
| blocking / non-blocking | Verilog's = vs <=: immediate sequential update vs two-phase simultaneous commit; the distinction that makes clocked logic order-independent |
Physics and mathematics
| weak solution / Lax–Milgram | the PDE framework where fields live in energy spaces; Lax–Milgram is the short existence-and-uniqueness theorem for coercive linear problems (L0/00) |
| Sobolev space (H¹) | functions whose derivatives are square-integrable — the natural home of finite-energy fields |
| maximum principle | harmonic-type fields attain their extremes on the boundary — why |φ| ≤ Vdd everywhere is a theorem, not an assumption |
| harmonic measure | how much of a boundary region is "visible" to a point through the field — the rigorous form of screening leakage (M2) |
| drift–diffusion / van Roosbroeck | the standard semiconductor PDE system: Poisson's equation coupled to electron and hole transport |
| Kramers escape | thermally activated barrier crossing at rate ~exp(−ΔE/kT) — the mechanism whose ~7,500 kT barrier makes thermal upsets a 10⁻³⁰⁰⁰-class event |
| Lyapunov function | a quantity decreasing along every trajectory — the standard tool for proving that things settle |
| Floquet exponent | the per-cycle contraction rate of a periodic orbit; the zero exponent along an oscillator's phase is why jitter accumulates unboundedly |
| Wiener process | the continuous random walk; what an oscillator's phase performs |
| noise margin | the input range a gate tolerates while still emitting a valid output level — the robustness radius of the digital abstraction (L1/06) |
| erosion / dilation | shrinking or growing a shape by a radius — the morphological operations DRC decks and L1's sandwich theorem are built from |
| LER / overlay | line-edge roughness (random edge wiggle) and mask-to-mask misalignment — two of the three terms in the fabrication tolerance radius |
| CMP | chemical-mechanical polishing, which planarises each layer; its sensitivity to pattern density is why fill cells exist |
| Poisson, twice | the equation (electrostatics — L0, L1) and the process (random arrivals — SEU, defects) are unrelated results by the same mathematician; both are load-bearing here, and context always disambiguates |
Reliability and test
| FIT | failures in time — expected failures per 10⁹ device-hours; the unit SEU rates are quoted in |
| AVF | architectural vulnerability factor: the fraction of raw bit-flips that matter architecturally — the masking discount inside ε |
| SECDED / scrubbing | single-error-correct double-error-detect coding; scrubbing rewrites memory periodically so single errors cannot age into uncorrectable doubles |
| RTN | random telegraph noise — single trapped charges switching a transistor's current on and off; individually visible at this node's scale |
| ATPG / stuck-at | automatic test-pattern generation against the stuck-at fault model — how a fabricated die is actually screened (P5) |
| scan chain | flops stitched into a shift register in test mode, making internal state controllable and observable from the pins |
| SPEF | the standard exchange file for extracted parasitic RC values |
The axiom register
The primary deliverable. With unbounded proof capacity everything else is time; this list is what the result would actually be.
Each entry: what is assumed, which layer introduces it, whether it is testable, and what it would take to push it further down.
Reassessment pass (2026-07). Test applied to every entry: is this a fact about the world outside the mathematics — fabrication, environment, intent — or merely an unproven theorem? Entries failing the test are marked T→theorem with a named discharge route (they remain assumptions only until that route is executed), retired (R), or moved to the Discharged section. The result is summarised in The irreducible core.
Update (2026-09). E1 — "the compact model contains the true device" — is discharged. The device enclosure is not assumed; it is derived from the measurement data (the data register, now the tower's actual physical input) by a drift–diffusion solve plus Bayesian inversion (L0/02), leaving only a thin model-class-adequacy residue and a declared prior. The name "E1" now denotes that derived enclosure, so "modulo E1" throughout reads as modulo the derived device model. The physical content of the bottom layer has moved from an axiom ("trust the fit") to an input (the data) — which is where a category of measured data belongs.
Status key —
- A unfalsifiable in principle (specification fidelity)
- E empirical, testable
- P physical/probabilistic, no deterministic statement exists
- T→theorem removable, discharge route named
- R retired — not needed for the per-die validation claim.
Specification-side (errors here are silent)
| # | axiom | layer | status | notes |
|---|---|---|---|---|
| S2 | The Sail RISC-V model faithfully captures the standard | L4 | A (small) | Smaller than it looks: sail-riscv is the standard's official golden model — adopted by RISC-V International, and new extensions must extend it for ratification. Residue: the model's fidelity to the ratified manuals, plus the Sail→prover translation's trust status (L4 open problem 4). Mitigate by running the official compliance suite against the imported model. |
| S3 | The residual authored semantics are what was intended | L4 | A (small) | The core uses the standard machine-mode CSR/trap/interrupt machinery and the standard debug architecture, so the bulk of what a custom design would force into S3 dissolves into S2's import (the Sail privileged subset) and the debug spec. What remains authored: the xrocket custom-CSR fragment, the performance-counter event table, and the platform devices' register conventions (CLINT's de-facto document, the PLIC instance) — small, but the same unfalsifiable character; the generator-source-first-then-diff discipline applies. |
| S4 | Where RISC-V is underspecified, our chosen refinement is acceptable | L4 | A | Interrupt timing ("eventually"), WARL field choices, some PMA behaviour. Conformance to an underspecified spec is not a statement. |
Empirical models (testable, calibrated, never derived)
The row that once headed this section — E1, "the compact device model contains the true device" — is discharged (see the Discharged table): the device enclosure is now derived from measurement data by Bayesian inversion, not assumed, so the physical content of the bottom layer moved to the data register — the actual input — and only a thin model-class-adequacy residue remains. What survives in this table are the geometry and process claims.
| # | axiom | layer | status | notes |
|---|---|---|---|---|
| E4 | Corner models bound the actual PVT distribution | L1 | merged | No independent content: the empirical half ("actual dies lie within the corner parameter ranges") is P4; the mathematical half ("box extremes are attained at corners") is M4 — an obligation, not an axiom. |
| E6 | DRC rules imply manufacturability | L1 | R | Retired: a yield claim, not a correctness claim. For validating an existing, fabricated, tested die, manufacturability is moot. What the proof needs — as-fabricated geometry within tolerance — is E7's restated content; per-die escapes are P5's. |
| E7 | The as-fabricated geometry lies within the stated tolerance family of the drawn layout | L1 | E | Restated (absorbing what E6 actually contributed): litho + etch + CMP + overlay keep this die's geometry inside the family over which L1's enclosures and sandwich theorem are quantified. Sits between LVS and the fab — the mask is deliberately not the drawn layout (OPC), so LVS-verified geometry is not what prints. Scales worst as features shrink relative to wavelength. Irreducible: it is a claim about a physical object, checked only statistically (process control) and indirectly (test). Data: D3 — the partially unpublished class; provenance via the DRC-deck inversion (see the register). Now carries L1/01's hypothesis (H3) — no spurious material: the sandwich alone permits the fabricated set to contain an island that meets no eroded net, i.e. a net absent from the drawn layout, and the topology-preservation theorem is false without it. Not checkable (it quantifies over A); the physical reason it holds is that etch and litho displace edges rather than nucleate islands, so an edge-displacement process model would imply it. |
Physical / probabilistic (no deterministic theorem exists)
| # | axiom | layer | status | notes |
|---|---|---|---|---|
| P1 | Synchronisers resolve | L1 | P (shrunk) | Irreducible in principle — Marino's theorem (L1/06): no continuous bistable escapes unbounded settling. But the rate becomes a theorem: τ is the unstable eigenvalue at the metastable saddle, derivable as an enclosure from E1's interval model (M8), and the settling-time distribution follows. Surviving axiom content: the asynchronous-input arrival process is bounded (environmental — P6-class). |
| P2 | No single-event upsets outside the ECC budget | L0 | P (shrunk) | Poisson, linear in area×time, does not shrink with margin. But most of its parameters are derivable modulo E1: Q_crit and collection cross-section from device physics, masking/AVF from netlist + timing (L0/03), interleaving from layout (X2's route). Irreducible core: the flux (JEDEC JESD89A) and the measured multi-cell upset radius — environmental and empirical facts. Data: D5 (flux); the upset radius is a D3/D4-class measurement. |
| P4 | Process variation stays within corners | L1 | P | Absorbs E4's empirical half: as-fabricated device and interconnect parameters of produced dies lie within the corner ranges. Becomes yield, caught by test, not a runtime failure. Fluctuation granularity (discrete dopants, RTN — L0/05) enters here as part of the corner spread. Data: D3 + D4 (corner ranges). |
| P5 | The fabricated die is defect-free on the tested faults | L1 | P | Per-die assurance is statistical: ATPG coverage (~99% stuck-at), not proof. A far larger hole than anything in the proof. Irreducible for existing silicon; the only shrink available is better coverage accounting, which is computable. Data: D3 (defect density D₀) + the measured coverage of the actual test set. |
| P6 | Environment within spec | L1 | P | The collector for every bound the world must supply: supply voltage and droop, temperature, clock-reference accuracy, asynchronous-input arrival rates (P1's residue), radiation flux (P2's residue), jitter budget (X5's residue). Irreducible by nature — no theorem constrains the environment. Data: D5. |
Structural / interface
| # | axiom | layer | status | notes |
|---|---|---|---|---|
| X3 | Coupling beyond the extraction window is bounded in aggregate | L1 | T→theorem (on M2) | The assumption standing in for the screening theorem. Removable the day M2 is proved; not justified by per-pair smallness — the naive far-field sum over ~61k nets diverges without screening. |
| X4 | The off-die parts meet their datasheets — the board oscillator, the serial-link far end, the UART peer, the pad-ring IO cells, the POR/supervisor arrangement | L5 | A/E | A scoping dial, not a monolith: L5's boundary decision (B1 core / B2 SoC / B3 device) determines exactly which batch of it each theorem is conditional on — B1 needs none, B2 adds the SRAM macro contracts (with open collateral behind them — checkable by effort), B3 the rest. Required in full only for the claim about the device you can hold. |
| X5 | (retired for this design) The on-die clock generator meets its frequency contract | L1 | R | This design has no on-die oscillator: the clock arrives at a pad from the board, so the generation contract relocates wholesale to the environment (P6's period/jitter bounds) with the board oscillator's datasheet as X4-class evidence — and the excision-and-contract machinery this row once carried is not needed. The mathematics stays available (M8's Floquet/Poincaré programme) for any future configuration that adds a PLL; the netlist-side expectation becomes zero combinational cycles, enforced by W3 as a defect check rather than a boundary delimiter. |
Empirical inputs (the data register)
With E1 discharged (above), this register is the tower's primary physical input. The device I–V is no longer trusted as a fitted formula; it is inferred from these measurements by Bayesian inversion (L0/02), so the device and material data (D4, D2) are the input to that inference — the actual physical content of the bottom layer — not the calibration of an assumed model. The remaining axiom tables above are residual model-adequacy claims; this table is the measured data they and the inference consume. Discipline: every number enters a proof as an interval with stated provenance, never a point value. Per number the axiom is "the true value lies in the stated interval"; the proof determines the required width (from the margin budget), metrology determines the available width, and the health metric is the ratio.
| # | class | examples | required vs available | consumed by |
|---|---|---|---|---|
| D1 | fundamental constants | k_B, e, h — exact since the 2019 SI redefinition; ε₀, α at ~10⁻¹⁰ relative | ~2 digits vs exact — free | P3's discharge (kT), charge counting (e, Q_crit), capacitance (ε₀) — these enter L0's own arguments directly, independent of E1 |
| D2 | bulk material data (Si, SiO₂, metals) | ε_r(SiO₂) ≈ 3.9, ε_r(Si) ≈ 11.7, E_g = 1.12 eV, n_i(300 K) ≈ 10¹⁰ cm⁻³; mobility and ionisation vs dopant concentration (Caughey–Thomas, Masetti fits); v_sat; Chynoweth coefficients; metal resistivities; thermal conductivities | ~10% needed vs ~1% available | L1's enclosures consume ε_r and ρ directly, not via E1; L0/04's avalanche and thermal criteria; the rest via E1's fit |
| D3 | process / facility metrology | layer thicknesses, t_ox, sheet resistances ± corners (published in the PDK); overlay σ, CD-control σ, LER amplitude and correlation length, etch bias vs density, defect density D₀ (not published) | the binding class — required ≈ available | E7's tolerance family — these are literally the r_m = bias + k·σ + overlay of L1's sandwich theorem; P4's corner ranges; P5's defect statistics |
| D4 | device calibration | the SKY130 BSIM4 model-card parameters per device flavour, with corner spreads (published); the doping profiles behind them (not published) | interval width set by the noise margin — L0/02 argues coarse suffices | E1 — this is E1's data |
| D5 | environmental reference | JEDEC JESD89A flux spectrum; ambient temperature range; supply tolerance; reference-oscillator accuracy; the mechanical qualification limits (JEDEC JESD22 shock / vibration / thermal-cycling) and EM immunity levels (IEC 61000-4, the IC-level IEC 62132 DPI) — the field→pin scaling that turns these into pin-referred disturbances is board-dependent (X4-class) (datasheet / qual-level) | datasheet-level | P2's λ; P6's bounds; X4; L0/04's V9/V10 |
Three notes:
- The unpublished half of D3 has an observable shadow: the DRC deck. Spacing and enclosure values encode the foundry's own margin arithmetic (
rule ≈ f(overlay, CD σ, …)), so the tolerance family can be inferred from rules the foundry publishes and stakes its yield on, rather than assumed. This inversion should be performed explicitly and recorded as the provenance of E7's intervals — it is the same move as reading DRC rules as theorem hypotheses, applied to data. - Why the data floor is D2, not the standard model. The most optimistic anchor — fundamental constants only — is blocked by L0/05's chain gaps: ab initio methods reach percent accuracy at best on the quantities that matter (the DFT bandgap problem), no better than measurement. D1 still enters directly where L0 uses it, but everything material is measured, and would remain measured even with the reduction chain proved.
- Liberty tables and extraction decks are deliberately absent from this register: after E2's and E3's discharge routes they are derived objects, not inputs. D4's unpublished doping profiles are why Route A (solving the device PDE) is blocked by data availability as well as by mathematics.
Discharged and retired
Kept for the record; identifiers remain valid where other documents cite them.
| # | was | verdict |
|---|---|---|
| E1 | The compact device model (BSIM) contains the true device | Discharged (reforged) — removed from the trusted-axiom list. The device I–V enclosure is derived, not assumed: the measurement data (the data register — now the actual physical input) + a validated drift–diffusion forward solve + Bayesian inversion (L0/02) produce a credible enclosure. "The fit contains the truth" is gone; what stays in the trusted base is (i) the measurement data itself, (ii) a thin model-class-adequacy residue — the DD/semiclassical description is valid in this regime with a bounded discrepancy term (L0/05, cheap at 130 nm) — and (iii) a declared prior. The name E1 now denotes this derived enclosure and its residual base, so "modulo E1" throughout the book reads as modulo the derived device model — coherent, since an enclosure is exactly what a proof is conditional on. What was once "the tower's one physical axiom" is now an input (data) plus a much thinner adequacy claim, contributing a data-shrinkable epistemic term to ε(T) (L0/03). The mechanical-stress (V9) and EM-forcing (V10) coordinates and their system-dependent field→pin residue ride along on the enclosure as before. |
| S1 | The netlist semantics is the right semantics | Discharged — In this project the netlist's Mealy semantics is derived, not posited — per-cell Boolean functions (L1/06's (A)) + the bridge theorem (M5) + LVS (L1) yield it as the conclusion of the physical stack. |
| P3 | Thermal noise does not cross the noise margin | Discharged — a theorem modulo E1: barrier ≈ 7,500 kT ⟹ ~10⁻³²⁵⁷ (L0/03); the quantum-tunnelling analogue is smaller still (L0/05). One caveat is load-bearing: the discharge requires restoration, and fails on the oscillator's phase mode — that residue is X5/P6's jitter, not a level-noise failure. |
| X1 | The netlist printer / file parser is faithful | Obligation, not axiom — a verified parser/printer for a ~20-production format is standard work (CompCert-style validated front-ends). Route known, no empirical content; it was never a claim about the world. |
| E2 | Standard-cell Liberty tables match SPICE match silicon | Discharged — Route: L0/07 derives interval-valued tables (with inter-sample derivative bounds) from E1's interval device model by verified DAE enclosure. The PDK .lib then exits the trusted base and is demoted to an oracle for cross-checking. |
| E3 | The extraction rule deck (pattern library) is accurate | Discharged — Route: L1's variational enclosures — Dirichlet/Thomson two-sided bounds, Nakao–Plum–Watanabe machinery. Accuracy target ~5% against 10–20% carried margin, so rigorous-but-loose suffices. The far-field part additionally needs M2. |
| E5 | The delay model (cell + interconnect) matches physical behaviour | Discharged — Subsumed: cell part by E2's route (L0/07), interconnect part by E3's route (L1), composition by M3/M5. Not a separate assumption once those land. |
| E6 | DRC rules imply manufacturability | Retired — yield economics, not per-die correctness. Needed content restated into E7. |
| X2 | Errors within an ECC word are independent | Route: "cells of one word are pairwise ≥ r apart" is a decidable layout check (L1 machinery); the empirical content — the upset radius r, growing with scaling (Ibe et al.) — moves into P2's parameter set. Still the clearest cross-layer obligation in the project: the check lives in the GDS, invisible to both the code's algebra and the netlist. |
Unestablished or false for this design (the F-series)
Not axioms — open defects in the assumption set, discovered during scoping and measurement. Rows close by flow work, checker work, or design modification; each carries its current evidence.
| # | claim | layer | status |
|---|---|---|---|
| F2 | All loads/slews lie within the Liberty characterisation range | L1 | AT RISK, measured — the independent hardening run reported thousands of max-slew and hundreds of max-cap violations on stretched nets; outside the table the tool extrapolates, so affected timing numbers are vacuous rather than merely wrong. The primary flow's verdict is pending; the row closes only with a clean domain check. |
| F3 | The constraint set is complete and its exceptions justified | L1 | FAILS as generated, sharply — the emitted SDC declares one clock; the JTAG and serial-link clock domains are absent, so their paths and crossings are unanalysed, not excepted (L1/04). No false-path or case-analysis assertions exist to audit — the whole risk is the gap. Closure: complete the set, re-run signoff, discharge the crossings against the synchroniser inventory. |
| F5 | Register correspondence ρ survives synthesis | L2 | ρ RECOVERABLE FROM THE NETLIST, measured — the flop instance names are anonymised (_NNNNN_), but the register's identity lives in its Q-net name, and 10,873 of 10,915 (99.6%) carry the RTL hierarchical name of the register they implement. So ρ is a checkable hypothesis readable from the existing artifact — no synthesis instrumentation or tool patch needed (an earlier reading of the instance names wrongly concluded 100% anonymised). The 36 anonymous Q-nets plus any constant-folded/merged registers are the residue (the opt_dff/opt_merge deviations L2/03 names), settled by the CEC that verifies the whole ρ. Open only in that the verifying CEC has not yet run. |
| F8 | Independent signoff engines agree | L1 | FALSE, measured — on the same layout, Magic DRC reported 0 violations while KLayout reported 4 (met4 width/spacing); LVS meanwhile caught a real power short the geometric engines disagreed about (findings). Consequence: no single engine's verdict is treated as the verdict — G-checks are stated engine-independently, and agreement is a claim to measure per layout. |
(F1 — timing closure — dissolved: the nine-corner run is a passing check (L1/nine-corner) at the conservative clock, and a passed check is not a finding. Its only caveat — that out-of-domain lookups are vacuous — is F2, and a claim "holds conditional on another finding" carries no independent open content, so it collapses into F2. F4 — mode coverage — merged into F3: the generated constraints declare no modes, so completeness is the whole question. F6 — reachable clock configurations respect closure — retired: no software-reachable clock knob exists on this design; the clock-frequency condition is the board's obligation, filed under P6/X4. F7 — one design across the artifact chain — dissolved: it holds by construction on this target, since every artifact descends from one pinned elaboration, and a property that holds is not a defect; its standing check is the re-elaboration diff, tracked as L3/re-elaboration.)
Open mathematical questions
Not axioms — things that might be theorems, that the project needs, and that nobody has. Distinguished from the tables above because effort could in principle remove them. Note the T→theorem routes above land here: executing them is what shrinks the register.
| # | question | layer | notes |
|---|---|---|---|
| M1 | Uniqueness for stationary drift–diffusion under operating bias | L0/02 | Existence is established; uniqueness is known only near equilibrium and genuinely fails where latch-up or snapback occur — a parasitic thyristor is a real bistable device. So "the transistor's I-V characteristic" is not well-defined from first principles. Industry dodges this by not solving the PDE (→ E1). Tap-coverage rules are secretly the side condition that kills the second branch. May be bypassable: state all enclosures universally over weak solutions of the transient problem; what is then needed is unreachability of the second basin from the unpowered state under tap coverage, and the method fails safe if that cannot be shown (L0/00). |
| M2 | The screening exponent α | L1 | Convergence of the far-field coupling sum is empirically certain — silicon works, and industrial extraction truncates at a fixed window and matches it — but its a-priori proof is open: net counts grow polynomially in distance while unscreened coupling decays only logarithmically, so convergence rests on the cascaded mesh apertures giving C_far(d) ≲ C_adj·α^(d/p). M2 is not a missing certificate (the calibrated deck, E3, is the certificate industry uses); it is the sub-lemma that discharges E3's far-field part — deriving α from a harmonic-measure estimate is what turns cheap local extraction from empirically-calibrated into proved, and X3 retires when it lands. |
| M3 | The lumping/composition theorem | L0/08 | "The lumped circuit model is sound with respect to the field problem, with this error bound." Universally assumed, never stated in a form usable as a verification hypothesis. The right formal frame is ISS small-gain / contraction (L0/08). |
| M4 | Where monotonicity holds | L0/08, L1 | Corner-based methodology is sound iff the response is monotone in the corner parameters — otherwise the extremes are not at the corners. Assumed industry-wide. Production data violates it: cell_fall is non-monotone in input slew at two grid points of inv_1. Absorbs E4's mathematical half. Diagnosed (L1/09): the violation is an artifact of the (t₅₀, slew) quotient — the 50% anchor vs. conduction from V_th — while the waveform-level map is monotone by ODE comparison (given E1 states I increasing in V_in). So M4 splits: the timing half dissolves under waveform-envelope propagation; the genuinely open residue is monotonicity in the P/V/T parameters proper. |
| M5 | The bridge theorem | L1 | Timing closure ⟹ the discrete Mealy semantics is sound. Everything above L1 presupposes it, and S1's discharge route runs through it. Tractable — a paper, not a decade. |
| M6 | An explicit constant in the quasi-static error bound | L0/01 | ‖φ_Maxwell − φ_EQS‖ ≤ C·(L/λ)²·‖source‖ with C geometry-dependent. The theorem shape exists (Ammari–Buffa–Nédélec); the explicit constant over realistic geometry does not. Without it the reduction is qualitative. |
| M7 | The regime decomposition: robust invariance + progress | L1/06 | The honest form of "the digital abstraction". Not a static noise-margin claim but (I) you never leave the union of valid regimes under bounded disturbances, (P) transitions complete in bounded time, (A) the induced discrete map is the Boolean function. Needs barrier certificates for (I) and a Lyapunov functional for (P). The van Roosbroeck free energy is the natural candidate, but it decreases toward equilibrium — adapting it to a boundary-driven steady state is the open piece. Metastability is precisely the failure of (P). |
| M8 | The metastable-saddle eigenvalue (τ) | L1/06 | For this design M8 is one problem, not two: the synchroniser's settling rate τ — the unstable eigenvalue at the metastable saddle — an eigenvalue-enclosure over the interval device model, the same machinery as L0/07. Discharging it converts P1's rate bound into a theorem modulo E1. Prior art: interval Poincaré maps (Zgliczyński, Galias). (The oscillator-phase mode — the frequency and phase-diffusion coefficient of an on-die limit cycle, Demir–Mehrotra–Roychowdhury — is generality-only here: the clock is board-supplied, so there is no on-die oscillator to analyse, the same reason X5 retired.) |
M2, M3, M5 and M7 are the four where the project's structure genuinely depends on the answer. M1 is the only one that is open mathematics rather than open formalisation — and the enclosure formulation may sidestep it. M8 is the ledger-shrinker: it exists purely to convert axioms into theorems.
Note M7 subsumes what a static "noise margin" argument was doing: the margin is the robustness radius of the invariant set, and restoration is the contraction that makes the set attracting — not separate phenomena.
The irreducible core
If every T→theorem route is executed and every M is proved, the register collapses to:
| cluster | entries | why no proof reaches it |
|---|---|---|
| specification fidelity | S3, S4, S2's residue | intent is not a mathematical object |
| the physical model | the device measurements (D-register) + model-class adequacy + a declared prior | the device enclosure is inferred from data (E1 discharged into these); no proof reaches the measurements themselves, the adequacy of the DD model class (L0/05), or the prior |
| this particular die | E7, P4, P5 | fabrication is sampling and test is statistical; no theorem reaches the object itself |
| the environment | P6 (absorbing P1's arrival bound, P2's flux, and the board clock's period/jitter contract) | no theorem constrains the world |
| surviving randomness | P1, P2 residues | Marino's theorem; Poisson arrivals — irreducible in principle, quantified by theorems |
| scope | X4 | a choice, not a claim |
Twenty-two entries reduce to roughly eleven, and every survivor is a statement about the world — fabrication, environment, intent — rather than about mathematics. Each survivor's numerical content is an interval-containment claim over the data register (D1–D5) above — so the fully reduced trusted base is: the intent claims, the D-intervals with their provenance, and the Poisson/Marino residues. The middle of the stack becomes theorem all the way through: the only assumptions below the netlist are the device measurements and a thin model-class-adequacy residue (E1 the axiom discharged into them), plus the die/environment cluster; and the only assumptions above it are the three specification-fidelity claims at the very top. That shape — empirical floor, unfalsifiable ceiling, theorems in between — is the honest form of "the chip is verified."
Findings — measured data
Everything in this appendix was measured on the artifacts this repository generates, by the tools in tools/ and the flow runs under flow/ — never transcribed from documentation. Each finding names its instrument. Statuses use the scoreboard's vocabulary; rows the re-anchored checker suite has not yet re-measured are listed in the scoreboard as TODO rather than duplicated here.
The generation chain
The chain reproduces from pinned sources. Chisel elaboration (Chipyard, pinned by commit) → FIRRTL → SystemVerilog (firtool, pinned release, checksum-verified) → synthesis (Yosys under Hammer) → place-and-route (OpenROAD) → signoff (Magic, KLayout, Netgen). Every stage runs from this repository; the data-provenance appendix carries the pins.
The elaboration declares the design's headline facts. From the emitted device tree: ISA rv32imaczicsr_zifencei_zihpm_xrocket; one Rocket core; 4 KiB instruction cache (64 sets × 64 B); 16 KiB data memory at 0x8000_0000; PMP with 8 regions at granularity 4; 1 hardware breakpoint; debug module at 0x0 (JTAG); CLINT at 0x200_0000; PLIC at 0xC00_0000 with one device source; UART at 0x1002_0000; 64 KiB boot ROM at 0x1_0000. The ChipTop boundary is 18 signals: UART pair, custom_boot, JTAG ×5, reset_io, clock_uncore, clock_tap, and the serial TileLink port (32-bit phits + link clock).
The RTL, measured (L3)
Census over the emitted SystemVerilog (322 files, 80 K lines including simulation collateral; the design cone is ~230 modules):
- Zero
casex/casez,force-class constructs, UDPs,fork, negedge blocks, delays-in-design. - 303
always @(posedge …)blocks, uniformly non-blocking; the census's blocking-assignment sites are in one DPI harness file outside the design cone. (An earlier count of 608 also swept firtool'send // always @(posedge)closing comments — the census now strips comments, and the checker regression pins the honest number.) - One
always @*block in the entire design —EICG_wrapper, the clock-gate model, a deliberate latch (the ICG primitive, L3/02). - 23
'bxliterals, all one idiom: behavioural memory models yielding X on a disabled read. - 212
initialblocks, every one simulation-only (SYNTHESIS/RANDOMIZE-guarded or the initializer idiom) — no register carries a power-up value. (The earlier 425 double-counted closing comments, as above.) - 3,938 assertion mentions across 85 files (the TileLink monitors and friends) — generator-emitted verification collateral, an adequacy asset (L3/04).
Synthesis (L2)
From the Hammer/Yosys run of the tiny Rocket configuration:
- 51,359 standard-cell instances drawn from 96 cell types; 10,416 flops; zero unmapped cells; 228 modules, 9.4 MB mapped netlist.
- Three SRAM macro kinds, five instances: 2 ×
sram22_2048x32m8w8(data memory banks), 2 ×sram22_512x32m4w8(icache data), 1 ×sram22_64x32m4w8(icache tags). All memories resolved to macros; the behavioural*_extmodels appear nowhere in the mapped netlist. - A flop-mapping interaction worth its own line: sky130 has no synchronous-reset or enable flop, so the synthesis script must let Yosys synthesise those flop types from what exists. A
-map-onlydiscipline (correct for pad libraries, which carry no flops) leaves thousands of abstract$_SDFFE_*cells in the netlist, and the failure surfaces only at P&R ("LEF master not found"). The corrected mapping adds ≈ 6,900 cells of reset/enable gating — cells that were previously "free" only because they were placeholders that could never have been placed.
The constraint set (L1)
The generated SDC, measured: one create_clock (clock_uncore, 50 ns, 2 ns uncertainty), one trivial clock group, zero false paths, zero case analysis, zero multicycle paths. The JTAG (jtag_TCK) and serial-link (serial_tl_0_clock_in) clock domains are absent — their paths are unanalysed, not excepted. This is F3's content: for a generated constraint set the audit's weight falls on completeness, there being no assertions to audit.
The independent hardening run
The same RTL was also hardened through a second, independently configured flow (librelane driving the same underlying tools, with the PDK's OpenRAM-family macros — 20 instances banked behind hand-written muxes — in place of SRAM22). It ran end to end and produced a GDS, and its value is exactly that its results are independent measurements of the same design under different physical decisions:
- Timing risk concentrates at the fast corners. Setup passed at all nine corners with 3–10 ns of margin while hold failed at the six fast and typical corners (−0.05 … −0.09 ns worst slack), the slow corners passing — the corner where this design's risk concentrates, measured rather than guessed. (The rocket-sram22 run then closed all nine corners at the conservative 100 ns clock; the domain-validity caveat is F2.)
- Domain violations are real. 6,186 max-slew, 526 max-cap, 185 max-fanout violations on stretched nets in the loose floorplan — F2's evidence that "inside the characterisation range" is a hypothesis that fails in practice and must be checked, not assumed.
- Fill dominates the census. Fill insertion took the instance count from 271,473 placed cells to 3,564,849 — a 13× multiplication by cells that compute nothing, L2/02's deletion classes made vivid.
- The met4 story. Detailed routing settled at 14 violations, all on the layer carrying the PDN straps (9 spacing, 5 shorts); LVS independently caught one of the shorts electrically (one net of 84,586 mismatched, all 84,051 devices matching — a slew-repair buffer chain extracted onto the power rail). Congestion, DRC, and LVS told one consistent story from three directions.
The flow of record (rocket-sram22)
The layout the book's physical layers name: upstream's floorplan (3588 × 2992 µm ≈ 10.73 mm², five rotated SRAM22 macros) hardened through librelane. Measured on run gds3:
- Detailed routing: 0 violations — the first fully clean route of this design in any configuration; the floorplan (rotated macros, real channels) is what changed.
- Timing: all nine corners pass at the 100 ns clock — hold +0.05…+0.26 ns, setup +25.6…+28.3 ns. The clock is the conservative-verification choice made concrete: at 50 ns, hold passes everywhere and setup fails on unrepaired high-fanout nets (worst path ≈ 83 ns).
- The F2 rows stay open: 19,110 max-slew, 1,145 max-cap, 1,817 max-fanout violations — the priced cost of skipping OpenROAD's
repair_design, which is unrunnable on 32 GB hardware: it retains ~600 KB per iteration (independent of repairs performed) and was OOM-killed at the same iteration in four runs across two flows, once taking the machine with it. Every flow launch now runs underulimit -v. - BEOL DRC (KLayout, tiled): 150 flow-owned violations, all at macro interfaces. The raw report says 90,081 — of which 89,931 sit strictly inside the SRAM macros: bitcell geometry checked against logic rules it was never meant to satisfy, because the deck's
sram_excludeguards FEOL only and SRAM22's GDS carries noareaidwaiver markers. Coordinate clustering against the macro boxes separates the two classes in minutes and belongs in the layer checker. - DRC needed deck surgery to run at all: the PDK deck's monolithic deep mode wants >14 GiB and 5–16 h (died twice in the 16M-polygon
mconblock); enabling the deck's own commented-out tiling (500 µm tiles,deepoff) runs the same rules in 1 h 44 m at 2.5 GB peak. The tiled deck is inflow/rocket-sram22/. - LVS is blocked on this design: Magic cannot read the SRAM22 GDS at all (
sky130_fd_bd_sramcells, unknown layer 64/44) — which also explains why upstream's own flow setsdrc.magic.generate_only: true. Connectivity signoff needs a non-Magic extraction route; until then the row is TODO, not green.
The signoff-coverage summary this adds to F8: for macro-bearing sky130 designs, open-tools signoff is one engine deep exactly where it claims to be redundant — Magic hard-stops on the macros, KLayout needs surgery and has no bitcell waiver mechanism, and LVS inherits Magic's limits.
Instruction-for-instruction against the golden model
Spike co-simulation closes the L3 oracle gap: tools/run-sim.sh cosim runs the design with every committed instruction checked against spike, the RISC-V golden ISA model, per commit — PC, register writeback, CSR effects. A pure-compute RV32IMAC image (sim/cotest.c) runs to a tohost pass with 1,631 committed instructions and zero mismatches — the same 1,631 every time it clears the boot window. The RTL the flow hardens refines the ISA, verified instruction-by-instruction — the executable precursor to L3's refinement proof, with the core's own trace port as the α anchor.
Two boundaries fell out, both diagnosed rather than papered over (COSIM-NOTES): ISA co-simulation ends at MMIO — a UART poll loop diverges because the golden model has no UART, the fundamental scope of core-level co-sim — and the boot/wake window needs deterministic Verilator reset init (+verilator+rand+reset+0) to escape X-propagation nondeterminism.
The cosim tooling itself is a finding: cospike is written and CI'd for 64-bit out-of-order cores, and took eight portability patches to run RV32/in-order/custom-extension (cospike-rv32.patch) — the ISA-string custom-extension strip, an RV64 page-level assert, the xlen-1 interrupt bit, sign-vs-zero-extension in the PC and writeback compares, and the pre-boot X-cause guard. Each is a real incompatibility, of a piece with F8's theme: the ecosystem's verification tooling assumes the mainstream target.
The design executes
The functional gap is closed: the generated SoC runs programs. Chipyard's Verilator harness (tools/run-sim.sh) simulates the full ChipTop with the SimTSI host model driving the serial TileLink port — L5/03's load path exercised literally — and the UART adapter echoing TX:
- A bare-metal image (built with stock clang:
--target=riscv32, freestanding, lld — no riscv-gcc needed) is loaded over the serial link into the DTIM at0x8000_0000; the core boots from the ROM, takes the TSI wake interrupt, jumps, and runs it. - The image prints
hello from rocketover the UART and exits through the riscv-teststohostprotocol — pass signalled,$finish, exit 0. ~1 ms of simulated time, ~80 s of wall clock. - The B3 statement of L5/01 is thereby instantiated end to end (load path → execution → observable output → clean exit), and the scoreboard row
L5/b3-smokeruns the simulation itself — the check is the execution.
The harness rested on three small portability findings, recorded in tools/run-sim.sh: Spike v1.1.0 needs -include cstdint under GCC 13 and does not install libriscv.a (the simulator links it for trace disassembly); the radiance generator's make hook unconditionally injects GPU collateral from un-checked-out submodules into every config's simulator build; and Verilator bakes $RISCV include paths at Verilation time, so the env must be right before Verilating, not just at link.
Signoff engines disagree (F8)
On one and the same layout: Magic DRC reported 0 violations; KLayout DRC reported 4 (2 × met4 minimum width, 2 × met4 minimum spacing). Netgen LVS meanwhile flagged the power short the geometric engines split on. Additional engine-behaviour findings from the same runs: Magic's GDS stream-out emitted the SRAM macro's internal subcells as 13 top-level cells (breaking any consumer that resolves a single top; KLayout's stream-out of the same design has exactly one), and the flow's nine-corner STA step runs all corners in parallel against the fill-expanded netlist — exhausting a 31 GB machine and dying on SIGKILL, with each corner completing cleanly when run alone. The register's conclusion (F8): a single engine's verdict is one witness, never the verdict.
Upstream flow drift
The framework's own physical-flow path (Hammer with its sky130 plugin, the documented tutorial configuration) did not run as shipped against current components: ten distinct interface breakages stood between the documented invocation and a result — a PDK workaround that crashes once the bug it patches is fixed upstream; four SRAM-collateral mismatches (lib-file naming, gzipped GDS, six of thirteen cache entries naming macros that no longer exist, a stale generated memory mapping whose make rule cannot rebuild it); the flop-mapping discipline above; and four OpenROAD command-interface changes (source flags, place_cell → place_inst, place_pins -random obsoleted — the last warning and placing nothing, so the failure surfaced three steps downstream as an unplaced-port error). All ten fixes are small patches to open Python; the finding is not that the flow is broken but that pinned-flow reproducibility decays by default, and only patchable flows can be walked forward — the property the toolchain was chosen for.
Memory macro placement
The physical-design facts that constrain any floorplan of this configuration, measured across both hardening runs: the SRAM22 macros bring the memory to 5 instances (the OpenRAM alternative needs 20 banked instances at 0.142 mm²/KiB); macro power pins sit on met2 while a met4/met5 strap plan connects macro grids at met3→met4 by default — a mismatch that yields an empty macro power grid unless the grid is built from the pin layers up; and a packed central macro block fails global routing where edge-pinned banks with wide channels route. The upstream reference floorplan places ChipTop in 3588 × 2992 µm ≈ 10.7 mm² with rotated macros — comfortably inside a ~15 mm² pad-frame budget.
Category-1 scoping pass: the checks we could run
A sweep over the per-instance-checkable side conditions we had not yet run — the point of the scoping pass being to have run the check for each category-1 tool, on the assumption (generous, this pass) that a passing check means the tool did its job on this instance. Four results:
- L3 comb-checks — PASS. Yosys-elaborating the design cone (via the slang plugin) finds exactly one inferred latch —
EICG_wrapper, the deliberate clock-gate primitive — and zero combinational cycles over the ~230-module cone. The L3/02 side conditions hold, and the "naive netlist" oracle L2 shares is well-defined. (tools/combcheck.ys.) - G6 tied-fill — PASS. The routed DEF has no
FILLSsection and the flow ran no metal-density-fill step: the only fill is standard-cell (decap/fill/tap), rail-tied by construction (L2 W4). No floating conductor exists to relay coupling, so M2's tied-fill precondition holds and the grounded screen (PDN + tied cell fill) is present by construction. The harder half — G5, shielding coverage between coupled nets — still needs the coupling graph. - G3 antenna — FINDING, and a correction. The librelane flow does run antenna checks (steps 39 and 45; the earlier "check skipped" note was about the Hammer flow's
CheckDesignAntennaProperties, a different step). Pre-repair: 1,197 net / 1,817 pin violations; 1,178 protection diodes inserted; post-repair residual: 1 net / 7 pin. So G3 is enforced and checked, with a small unconverged residual — the same family as the 150 DRC violations and F2, the repair steps' incomplete closure. - CEC / F5 — ρ is recoverable from the artifact. The synthesis certificate (CEC) is the category-1 check for L2. A first look at the flop instance names (all anonymised
_NNNNN_) suggested ρ was lost — but that is the wrong object: the register's identity lives in its Q-net name, and 10,873 of 10,915 (99.6%) carry the RTL register's hierarchical name (\system.…output_chain_3.sync_1). So ρ is a checkable hypothesis readable from the existing netlist — no synthesis instrumentation, no tool patch. The 36 anonymous Q-nets plus any constant-folded/merged registers are the residue (theopt_dff/opt_mergedeviations L2/03 names). Feeding the Q-net names as eqy's register matching (a one-linerename) leaves only the per-cone SAT run at 61k cells — an afternoon of eqy-tuning, not the "instrument the synthesis" effort first assumed. F5 downgrades to "ρ recoverable; only the verifying CEC is unrun."
The pass's shape matches the methodology: the runnable category-1 checks either pass (L3 comb, G6) or surface a priced residual (G3), and the one that can't be run cheaply (CEC) turns out to be blocked not by tooling but by the anonymisation the book predicted — so its discharge is genuine L2 proof work, not a check we skipped.
Interpretation discipline
Three habits these findings enforce, recorded so they survive the people who learned them:
- A green single-engine verdict is one witness (F8). Signoff claims are stated engine-independently and measured per layout.
- "By construction" is a claim to check. The one-elaboration property (which made the old F7 dissolve, since it holds by construction) is real and valuable, and the re-elaboration diff is what keeps it a fact rather than a memory.
- Absence of constraints is not absence of risk (F3). A minimal generated SDC moves the audit from exceptions to completeness; unconstrained-is-unchecked is the sharper failure mode.
IF — the seams between layers — what one end-to-end theorem must compose
| obligation | detail | |
|---|---|---|
| TODO | IF/l2-timing — the timed silicon reduces to a discrete Mealy machine (dieBeh = timedBeh) | lean: EndToEnd.iface_L1_timing. The M5 bridge theorem — setup/hold met on every path (L1 STA, nine-corner PASS) licenses the two-phase synchronous model as EXACT. Precursor: the whole L1 board bounds the analog margins; [blocked on: M5 (open mathematics) — turning the metric-timing margins into a behaviour-preservation statement about the discrete abstraction] |
| TODO | IF/l1-l0-extraction — the discrete machine IS denote(theNetlist): extraction + cell grounding (timedBeh = netBeh) | lean: EndToEnd.iface_L1_L0. Composes THREE island certificates that no row currently joins: celltopo (L0/ccc PASS — cells compute their Liberty function), routecheck (L1 — the layout's connectivity), and LVS device-match. The pieces pass; nothing scores their composition into 'the extracted layout denotes netM'. [blocked on: an LVS device+connectivity match against theNetlist, then the lemma 'extracted = theNetlist ∧ celltopo ⇒ dieBeh_comb = netBeh'] |
| TODO | IF/frontend-commute — the RTL front-end preserves cone functions: ⟦RTL⟧ commutes with ρ at the trail head (s0) | lean: L3.frontEndCommutes — the single still-open factor of the proved l2_commutes. The ABC trail (s0→s7, seven PassCerts) is checked; the yosys front-end proc/techmap/flatten that PRODUCES s0 from ⟦RTL⟧ is trusted, not CEC'd. This is the L3↔L2 seam, currently assumed inside the L2 goal. [blocked on: a CEC of ⟦RTL⟧ (the naive-netlist oracle, L3/comb-checks PASS) against ⟦s0⟧] |
| TODO | IF/reset-corr — matched reset: the RTL reset state is ρ's image of the netlist reset (the L5 induction base) | lean: L3.reset_corr — the sorryAx in #print axioms chip_realises_isa, and the one open leaf of L3's trace_refines. L3/x-idiom + L3/init-idiom (PASS — no flop carries a power-up value) is the precursor, but the ρ-image equality of the two reset states is not itself scored. The IBuf residual shows an unreset flop breaks it. [blocked on: reset-state extraction from both sides + the ρ-image check] |
| TODO | IF/l5-refine — ⟦RTL⟧ refines the microarchitecture→ISA abstraction (rtlBeh = archBeh) | lean: EndToEnd.iface_L3. The inductive invariant — L3's irreducible content. Precursor: L3/cosim PASS (1631 instructions vs spike, zero mismatches) is the executable oracle; the interface THEOREM (α, the invariant) is proof-phase. [blocked on: proof-phase start (L3/invariant, L3/invariant-alpha)] |
| TODO | IF/l6-l7-isa — the microarchitectural behaviour equals the ISA reference at the observable boundary (archBeh = isaBeh) | lean: EndToEnd.iface_L4_L5. Bundles the sail-riscv model (L4), the memory map (L5/memmap PASS), and the boot/observation contract (L5/boundary PASS, L5/b3-smoke PASS). The observables are scored; their equality to the sail reference at the pad boundary is not. [blocked on: L4/sail-pin (import the model) + L5-refine + the L5 device models (L5/sys-models)] |
| EXTERN | IF/miter-faithful — the miter construction faithfully encodes cone-inequivalence (the CEC/trail anchor) | lean: miterCNF_sound. Every PassCert's equiv rests on it, as does l2_commutes. Currently trusted (polarity was falsification-tested in trail-cec, not proved). UNLIKE E1/M-series it is dischargeable: a real Tseitin encoding would make it a theorem, not an axiom — the clearest 'promote an assumption to a proof' target. |
7 obligations — EXTERN:1 TODO:6
L5 — the system
| obligation | detail | |
|---|---|---|
| FINDING | L5/memmap — the memory map: device tree vs per-device register maps | device tree absent (regenerate: tools/build-rocket.sh): /project/thinking-sand-tools/chipyard/vlsi/generated-src/chipyard.harness.TestHarness.TinyRocketConfig/chipyard.harness.TestHarness.TinyRocketConfig.dts (0.0s) |
| FINDING | L5/boundary — the ChipTop port list is the book's 18-signal boundary | ChipTop.sv absent (regenerate: tools/build-rocket.sh) (0.0s) |
| FINDING | L5/irq-map — the interrupt wiring from the device tree | device tree absent (0.0s) |
| FINDING | L5/b3-smoke — the B3 instance: an image executes and the UART emits its message | simulator or image absent (tools/run-sim.sh build; tools/run-sim.sh hello) (0.0s) |
| TODO | L5/rtl-decode-diff — the RTL's actual address decode diffed against the dts | [blocked on: a decode extractor over the TL fabric modules (the third leg of the diff)] |
| TODO | L5/pad-defaults — the reset drive state of every output pad | [blocked on: reset-state extraction from the IOCell/serializer RTL] |
| TODO | L5/b-config — the latency bound B per configuration | [blocked on: the serializer FSM analysis + link-clock ratio] |
| TODO | L5/sys-models — the device models (UART, CLINT, PLIC, boot, serial-TL) as Sys components | [blocked on: spec-phase authoring] |
| EXTERN | L5/X4 — external devices meet their datasheets (per B-level batch) | the board oscillator, the serial-link far end, the pad-ring cells, the POR arrangement — modelled from datasheets, never checked from artifacts |
9 obligations — EXTERN:1 FINDING:4 TODO:4
L4 — the ISA
| obligation | detail | |
|---|---|---|
| FINDING | L4/isa-scope — the elaboration's ISA string fixes the partition scope | device tree absent (regenerate: tools/build-rocket.sh) (0.0s) |
| FINDING | L4/xrocket-surface — the custom fragment's structural surface in the emitted core | RTL cone absent (regenerate: tools/build-rocket.sh) (0.0s) |
| TODO | L4/sail-pin — import sail-riscv at a pinned commit; record the translation/trust line (S2's ledger) | [blocked on: adding sail-riscv to the fetch script with a pinned SHA (cheap)] |
| TODO | L4/compliance — run the architectural compliance suite against the imported model | [blocked on: sail-pin + the riscv-arch-test harness] |
| TODO | L4/spec-pin — the spec patterns from riscv-opcodes at a pinned commit, both widths | [blocked on: regenerating the pattern tables for the full extension set (I/M/A/C + Zicsr/Zifencei)] |
| TODO | L4/partition — the encoding partition vs the generated decoder's legal set | [blocked on: decoder legality-cube extraction from the emitted Rocket decode (yosys-based)] |
| TODO | L4/c-register — the measurable choice-register rows extracted from the core | [blocked on: the C2–C8 extractions (trap behaviour needs simulation or careful RTL reading)] |
| TODO | L4/ub-free-image — a real boot image contains no spec-UB instruction word | [blocked on: partition; then per-image, mechanical] |
| EXTERN | L4/S3-fidelity — the authored residue is what was intended | unfalsifiable; anchored by generator source and ecosystem software — never checked |
| EXTERN | L4/S4-choices — the recorded choices are acceptable readings of the standard | legislative by nature; what IS checkable (RTL agrees with each pick) lands in L3's lemmas |
10 obligations — EXTERN:2 FINDING:2 TODO:6
L3 — RTL and microarchitecture
| obligation | detail | |
|---|---|---|
| FINDING | L3/census — the construct census of the emitted design cone | RTL cone absent (regenerate: tools/build-rocket.sh): /home/runner/work/thinking-sand/thinking-sand/flow/rocket-sram22/src (0.0s) |
| FINDING | L3/x-idiom — every 'bx literal is the memory disabled-read idiom | RTL cone absent (regenerate: tools/build-rocket.sh) (0.0s) |
| FINDING | L3/init-idiom — every initial block is simulation-only (empty-or-absent under synthesis) | RTL cone absent (regenerate: tools/build-rocket.sh) (0.0s) |
| FINDING | L3/comb-checks — no unintended latch + RTL-level SCC over the cone | RTL cone absent (regenerate: tools/build-rocket.sh) (0.0s) |
| TODO | L3/re-elaboration — regenerate FIRRTL+SV from the pinned generator; diff against the cone | [blocked on: wiring build-rocket.sh output into a byte-diff (the chain-consistency check; F7 dissolved into this)] |
| TODO | L3/diff-sim — differential simulation with the emitted assertions enabled | [blocked on: the semantics side existing; Verilator harness] |
| TODO | L3/semantics — the two-phase synchronous semantics for the measured subset | [blocked on: proof-phase start] |
| EXTERN | L3/scheduler-independence — every LRM-conformant scheduling computes the simple semantics | stateable as a theorem for the subset; deferred, not assumed — the adequacy checks probe it empirically |
| FINDING | L3/config-declared — the elaboration-declared configuration record | device tree absent (regenerate: tools/build-rocket.sh) (0.0s) |
| FINDING | L3/config-confirmed — the declared record confirmed structurally from the emitted RTL | RTL cone absent (regenerate: tools/build-rocket.sh) (0.0s) |
| FINDING | L3/cosim — the trace-oracle: committed instructions match the golden ISA model | cosim simulator absent (tools/run-sim.sh cosim-build — needs the RV32 cospike patch) (0.0s) |
| TODO | L3/stage-graph — the pipeline stall/flush/bypass structure and occupancy bounds | [blocked on: a SystemVerilog front end over Rocket.sv (shared with L4)] |
| TODO | L3/wcet-table — the retirement-gap bounds (the measure read quantitatively) | [blocked on: stage-graph] |
| TODO | L3/bus-guarantees — Gi/Gd clauses asserted over a real execution (simulation oracle) | [blocked on: wiring the TileLink monitor assertions into the now-working harness (tools/run-sim.sh)] |
| TODO | L3/invariant-alpha — α as the formal abstraction (beyond the cosim oracle), toward the refinement proof | [blocked on: proof-phase start; the cosim oracle is the executable precursor] |
| TODO | L3/invariant — the inductive invariant (the project's irreducible content) | [blocked on: proof-phase start] |
16 obligations — EXTERN:1 FINDING:7 TODO:8
L2 — logic
| obligation | detail | |
|---|---|---|
| FINDING | L2/W-syn — W1–W4 on the synthesis netlist | synthesis netlist absent (rerun the flow): /home/runner/work/thinking-sand/thinking-sand/flow/rocket-sram22/runs/gds3/06-yosys-synthesis/ChipTop.nl.v (0.0s) |
| FINDING | L2/W-routed — W1–W4 on the post-route netlist | post-route netlist absent (rerun the flow): /home/runner/work/thinking-sand/thinking-sand/flow/rocket-sram22/runs/gds3/43-openroad-detailedrouting/ChipTop.nl.v (0.0s) |
| FINDING | L2/macros — the SRAM macro census: five instances of three kinds | synthesis netlist absent (rerun the flow) (0.0s) |
| FINDING | L2/deletion-classes — the physical/clock/logic deletion fractions of the routed netlist | post-route netlist absent (rerun the flow) (0.0s) |
| FINDING | L2/rho-recoverable — is the register correspondence ρ recoverable post-hoc from the netlist? (F5) | synthesis netlist absent (rerun the flow) (0.0s) |
| FINDING | L2/scoped-cec — RTL ≡ netlist on a real cone, by name-matching (the L3 pipeline, run) | CEC ran but did not report a clean prove: — ### synthesising AMOALU standalone -> /home/runner/work/thinking-sand/thinking-sand/flow/rocket-sram22/cec/work/AMOALU/AMOALU.nl.v (0.0s) |
| TODO | L2/macro-contracts — the three SRAM contracts stated; tie-offs verified structurally | [blocked on: authoring the contract format; the macro Verilog is the draft source] |
| TODO | L2/cec-fullchip — the whole-ChipTop verdict (the scoped pipeline already closes — see scoped-cec) | [blocked on: compute. Two routes, both matching by name (ρ) with no hint file. (a) eqy partitions per flop and re-flattens the whole design per partition — ~10,900 partitions, serial combine ran ~95% (21,329 flatten passes) before a 2h cap, ahead of the parallel SAT sweep. (b) cec/fullchip-equiv.sh: ONE miter via yosys-native equiv_make/equiv_simple/equiv_induct (async2sync is load-bearing — the netlist has async-reset flops equiv's SAT can't model; SRAM macros boxed). equiv_simple's coverage (how many cone functions are proven identical) is the meaningful L3 number; equiv_induct's base case cannot close from ARBITRARY state because of unreset data registers (see CEC-NOTES.md / IBuf). RAN (route b): equiv_make matched 642 cones by name at full scale (ρ confirmed), but equiv_simple proved only 6/642 — the free-register-init wall dominates even the combinational check at 61k cells, and equiv_induct exploded past 10GB without closing (killed to protect the sandbox). So the native single-miter route does NOT yield a clean full-chip verdict; the eqy per-partition route (which cuts combinationally at register boundaries) or reset-sequence modelling is needed. The scoped-cec AMOALU pass remains the proof the pipeline itself is sound] |
| TODO | L2/cec-sequential-clean — a CLEAN sequential-cone pass (IBuf: register match by Q-net, all cones) | [blocked on: equiv_induct + don't-care pruning. run-cec.sh IBuf IBuf.sv RVCExpander.sv reproduces the ρ signature (53 flops, buf_pc/buf_data/nBufValid preserved on Q-nets) and proves 198/212 cones first pass; the residual is the cost of carving a module out of its parent (unreset-flop init freedom + boundary observability don't-cares, e.g. equiv_make matching a gold bit against literal 1'x), not a logic bug — the AMOALU clean pass confirms the flow. Closing it cleanly needs the in-context full-chip run or don't-care handling] |
9 obligations — FINDING:6 TODO:3
L1 — the electrical layer
| obligation | detail | |
|---|---|---|
| FINDING | L1/drc-triage — BEOL DRC verdict, macro-internal hits separated by coordinate clustering | DRC database absent (rerun the tiled deck): /home/runner/work/thinking-sand/thinking-sand/flow/rocket-sram22/runs/gds3/58-klayout-drc/reports/drc.klayout.beol2.lyrdb (0.0s) |
| FINDING | L1/routing-witness — the router's own no-opens/no-shorts witness, re-verified from the routed DEF | routed DEF absent (rerun the flow): /home/runner/work/thinking-sand/thinking-sand/flow/rocket-sram22/runs/gds3/43-openroad-detailedrouting/ChipTop.def (0.0s) |
| TODO | L1/gds-admissible — the admissible-GDS subset check on the streamed layout (no PATH type 1, no self-intersection, 90-degree SREFs) | record-level scan; gdsdump.py already walks the records — promote it to a verdict. Cheapest L1 item and the front end for everything below. |
| TODO | L1/h1h2-inv1 — (H1)/(H2) — erode-connectivity and colour-aware spacing on inv_1, then a cell row | [blocked on: polygon morphology (erosion/dilation + union-find over scanline geometry)] |
| TODO | L1/lvs-inv1 — extraction + LVS of inv_1 against its schematic; (D1)-(D3) sized on the same cell | [blocked on: magic/netgen in the environment, or a minimal extractor over the flattened colouring. This is the CELL-MASTER half of the L1/02 decomposition — the routing-witness check already covers chip connectivity; extraction is now needed only on the finite library (composes with L0/06 celltopo on the same cells) plus the deterministic streamout validation] |
| TODO | L1/g1-taps — G1: every device within d_max of a well tap (discharges V5/M1's side condition) | [blocked on: parsing placement from caravel_core.def (398,259 COMPONENTS) + the extraction for device sites] |
| FINDING | L1/g3-antenna — G3: antenna ratios after diode repair | no antenna-check step found in the run (0.0s) |
| FINDING | L1/g6-fill-tied — G6: no floating fill — the screen is grounded by construction | routed DEF absent (rerun the flow) (0.0s) |
| TODO | L1/g5-shield — G5: shielding coverage — grid metal actually interposed between coupled nets | [blocked on: the coupling graph (extraction window per net); the design-side half of M2's hypothesis] |
| TODO | L1/density-map — pattern-density map (feeds the CMP thickness correction and local-bias r(x)) | windowed area sums over the GDS — mechanical once the polygon front end exists |
| EXTERN | L1/E7-H3 — as-fabricated geometry within tolerance; no spurious islands (H3) | quantifies over the fabricated set A — no program over shipped data reaches it |
| FINDING | L1/sdc-inventory — the constraint file: declared clocks and (absent) exceptions | SDC absent (rerun the flow): /home/runner/work/thinking-sand/thinking-sand/flow/rocket-sram22/runs/gds3/43-openroad-detailedrouting/ChipTop.sdc (0.0s) |
| FINDING | L1/domain-census — every sequential clock pin traces to a declared clock (F3's table) | netlist/SDC absent (rerun the flow) (0.0s) |
| FINDING | L1/gating-census — the clock-gate cells enumerated (the ICG primitive's instances) | netlist absent (rerun the flow) (0.0s) |
| FINDING | L1/nine-corner — the flow's multi-corner STA closure verdict | STA reports absent (rerun the flow) (0.0s) |
| FINDING | L1/domain-violations — table lookups inside the characterised region (F2's instrument) | STA reports absent (rerun the flow) (0.0s) |
| TODO | L1/verified-sta — re-derive the timing verdict with verified interval rules | [blocked on: proof-phase machinery] |
| TODO | L1/sync-inventory — every crossing lands on a framework synchroniser shape; the P1 ledger | [blocked on: enumerating AsyncQueue/AsyncResetSynchronizer instances against the domain census] |
| EXTERN | L1/P6 — environment within spec — now carrying the board clock's period/jitter contract | no theorem constrains the world; the clock_tap pad makes the contract bench-checkable |
19 obligations — EXTERN:2 FINDING:9 TODO:8
L0 — physics
| obligation | detail | |
|---|---|---|
| FINDING | L0/ccc — every combinational cell's transistors compute its Liberty function (C1–C3) | PDK cell CDL/Liberty absent (persistent PDK root); the check is tools/celltopo.py (0.0s) |
| FINDING | L0/v1a-tristate — the FLOAT set is exactly the closed non-static-CMOS exception list | PDK cell CDL/Liberty absent; the check is tools/celltopo.py (0.0s) |
| FINDING | L0/spice-screen — Liberty delays agree with a BSIM4 SPICE eval at the tt corner (analog screen) | ngspice not built (tools/install-toolchain.sh, or build from the SF git mirror to $TS_SCRATCH/ngspice-inst); the screen is tools/spicecheck.py (0.0s) |
| TODO | L0/inv1-enclosure — the RIGOROUS enclosure: conservative interval BSIM4 evaluation bounding Liberty | [blocked on: an interval DAE integrator wired to an interval BSIM4 evaluation (the layer's central build). The spice-screen check is the empirical precursor — it point-samples agreement; the enclosure must BOUND, replacing the point SPICE with an interval that contains the true device response over the operating box — now including a mechanical-stress coordinate and a bounded exogenous forcing (a disturbance-reachability tube; L0/04 V9/V10)] |
| TODO | L0/envelope-num — numeric envelope margins: operating voltage vs avalanche, F2 slew vs crowbar, mechanical-stress and EM-forcing bounds (V9/V10) | [blocked on: the PDK device ratings, and the package/EM qualification limits (JESD22; IEC 61000-4 / 62132), at pinned SHAs] |
| TODO | L0/noise-exponent — the thermal-discharge arithmetic as a checked computation (barrier / kT per node class) | pure arithmetic over C, V, T once node capacitances are extracted; cheap after L1 extraction exists |
| TODO | L0/quantum-budget — gate leakage + RTN + dopant scatter vs the noise-margin budget (L0/05 open problem 2) | [blocked on: the SKY130 BSIM4 model cards at pinned SHAs] |
| EXTERN | L0/E1 — the compact-model enclosure contains the true device | the tower's one physical axiom; validated by measurement, not checkable from shipped data |
| EXTERN | L0/M1-M8 — the open mathematics (uniqueness, screening, lumping, monotonicity, bridge, constants, regimes, eigenvalue) | proof-phase material by definition; listed so the scoreboard is the complete census |
9 obligations — EXTERN:2 FINDING:3 TODO:4
Scoreboard — checker results
Generated by tools/check-all.py --md from commit 5a24f5e on 2026-09-02 09:26 UTC, against the flow-generated artifacts of data provenance — the same run that built this book. Every obligation the book states appears exactly once; the README documents the suite.
PASS — the check ran and the obligation holds of the generated artifacts. FINDING — the check ran and confirms an adverse fact recorded in Findings (expected). FAIL — the shipped data contradicts the record; a bug in artifact, record, or checker. TODO — not yet checkable; the stub names its blocker. EXTERN — axiom-register material no program over shipped data can reach.
The seams — where the layers meet
The tower's thesis is that the layers connect formally: each layer's conclusion is the next layer's hypothesis, so a single theorem should say the physical die realises the ISA. That theorem exists and type-checks —
-- lean/ThinkingSand/EndToEnd.lean
theorem chip_realises_isa : dieBeh = isaBeh := by
rw [iface_L1_timing, iface_L1_L0, middle, iface_L3, iface_L4_L5]
where dieBeh is the physical die's pad-trace behaviour and isaBeh the ISA
reference's, both of type List (Val (Fin nIn)) → List (Val (Fin nOut)) — an input
pad-trace to an output pad-trace. It type-checks because the abstraction targets line
up: that is what "the layers connect" means, made mechanical. Its content is entirely
in what it assumes, and #print axioms on chip_realises_isa reads that back exactly.
One boundary is a real proof; the rest are the seams. The middle —
netBeh = rtlBeh, the netlist and RTL agreeing on every pad-trace — is sorry-free:
it lifts the proved one-step commutation l2_commutes
across cycles (trace_refines). Every other arrow is a named axiom, because the layer
that would discharge it is still proof-phase. Those axioms are this page. Each is a
seam: a theorem the tower needs and does not yet have, sitting exactly at a layer
boundary. They are scored on the scoreboard as the IF/* section
(tools/check-interfaces.py), and this appendix is their long form.
Building the composition is what surfaced the seams as first-class objects. The
per-layer boards score each layer's internal obligations; none scored the arrows
between layers. Two of the seven were nowhere at all before this page — the
extraction-composition (iface_L1_L0) and the front-end commutation
(frontEndCommutes) — while the other five had a home inside a layer's TODO list but
were not marked as the load-bearing composition step.
The ledger
The composition, bottom-up (die → timed → netlist → RTL → arch → ISA), with the one
proved link in bold:
| seam | statement | Lean | status |
|---|---|---|---|
| S-timing | dieBeh = timedBeh | iface_L1_timing | TODO — open math (M5) |
| S-extract | timedBeh = netBeh | iface_L1_L0 | TODO — new, composes three passing islands |
| S-frontend | ⟦RTL⟧ ≈ρ ⟦s0⟧ | frontEndCommutes | TODO — open factor of l2_commutes |
| middle | netBeh = rtlBeh | trace_refines | proved, modulo S-frontend + S-reset |
| S-reset | rename ρ resetF = resetR | reset_corr | TODO — the sorryAx in the base |
| S-refine | rtlBeh = archBeh | iface_L3 | TODO — proof-phase (the invariant) |
| S-isa | archBeh = isaBeh | iface_L4_L5 | TODO — proof-phase |
| S-miter | miter faithfully encodes inequivalence | miterCNF_sound | trusted, dischargeable |
Each seam below records: what it connects, what is proved below it and assumed above, the executable precursor on a layer board (the empirical version, where one exists), and the discharge route — what turns the axiom into a theorem.
S-timing — the timing bridge
iface_L1_timing : dieBeh = timedBeh— the real, continuous-time silicon has the same observable behaviour as a discrete two-phase synchronous machine.
Connects L1 (timing) to the discrete world every layer above L1 lives in. It is the book's M5 bridge theorem: if static timing closes — every path meets setup and hold at every corner — then the clocked circuit's sampled behaviour is exactly a Mealy machine's, with no metastability inside the operating event.
Below: the entire L1 board — nine-corner STA (PASS), the SDC completeness audit, the crosstalk and IR-drop bounds — establishes the hypothesis (closure with margin). Above: every functional layer silently assumes the discrete model is faithful.
Precursor: L1's checkers bound the analog margins but do not state the reduction; they are the empirical evidence that M5's hypothesis holds for this die.
Discharge route: M5 is open mathematics — turning metric timing margins into a behaviour-preservation statement about the discretisation. It is a general theorem about synchronous circuits, not specific to this design; see L1/07 and the axiom register's M5.
S-extract — extraction and grounding
iface_L1_L0 : timedBeh = netBeh— the discrete machine the silicon implements isdenote theLib theNetlist: the gate graph the book reasons about.
Connects L1 (geometry) and L0 (devices) up to the netlist object L2 consumes. This seam is the one the composition newly forced into the open: three certificates each pass on their own, but nothing joined them into a single behaviour equality.
- celltopo (L0/ccc, PASS): each cell's transistors compute its Liberty function —
so
theLibis grounded. Archetype ①. - routecheck (L1, PASS): the layout has the connectivity the netlist claims — no opens, no shorts. Archetype ②.
- LVS device-match (L1/02, no checker yet): the extracted devices and nets are
exactly
theNetlist.
Below: the three certificates. Above: L2 takes theNetlist as the object of
record. Precursor: celltopo and routecheck are the passing islands.
Discharge route: an LVS device-and-connectivity match producing the extracted
netlist, then the lemma extracted = theNetlist ∧ celltopo ⇒ timedBeh combinationally
equals netBeh. See L2/00 (S1) and
L1/02.
S-frontend — the RTL front-end
frontEndCommutes : CommutesM (denote theLib s0) rho— the front-end that produces the trail heads0from the elaborated RTL preserves the cone functions, so ρ- commutation transports from⟦RTL⟧to the start of the synthesis trail.
Connects L3 (⟦RTL⟧) to the head of L2's equivalence trail. The trail itself —
s0 → s1 → … → s7 = N, seven per-pass PassCerts against miterCNF — is checked.
What is not checked is the step that builds s0: Yosys proc/techmap/flatten
turning elaborated RTL into the first gate netlist. It is the single still-open factor
of the otherwise-proved l2_commutes.
Below: L3's construct census (PASS) makes ⟦RTL⟧ a well-defined object; the ABC
trail (L2) carries s0 to N. Above: L2's one-step goal quantifies over ⟦RTL⟧.
Precursor: L3/comb-checks (PASS) shows the naive-netlist oracle ⟦s0⟧ is well-
defined (no combinational cycles). Discharge route: a CEC of ⟦RTL⟧ against ⟦s0⟧
— the same certificate machinery as the trail, applied to the front-end. See
L3/00.
S-reset — matched reset
reset_corr : Val.rename rho resetF = resetR— the netlist's reset state maps, under the register correspondence ρ, onto the RTL's reset state.
Connects L2's register correspondence to L3's temporal lift: it is the base case
of the induction in trace_refines. Without it, the one-step commutation never anchors,
and the two machines could agree step-for-step yet start from unrelated states. In the
axiom base of chip_realises_isa it is the anonymous sorryAx — a theorem := sorry
rather than a named axiom.
Below: ρ itself (L2/03, F5); L3's X/init idioms (PASS) show no flop carries a
power-up value. Above: the whole trace_refines lift and everything it feeds.
Precursor: L3/x-idiom + L3/init-idiom (PASS) — the necessary condition (no stray power-up values), but not the ρ-image equality itself. The IBuf residual (an unreset flop) is the concrete way this seam fails when it fails.
Discharge route: reset-state extraction from both sides and the ρ-image check; mechanical once ρ is pinned. See L2/03.
S-refine — RTL refines the ISA
iface_L3 : rtlBeh = archBeh— the RTL's observable behaviour refines the microarchitecture-to-ISA abstraction.
Connects L3 (RTL) to L4 (ISA) through L3's refinement. This is the work the book names: the inductive invariant relating pipeline state to architectural state, the project's irreducible content.
Below: the RTL object (L3). Above: the ISA (L4). Precursor: L3/cosim
(PASS) — 1631 committed instructions matched against spike instruction-by-instruction,
zero mismatches. That is the oracle: strong evidence, executed, but not the theorem.
The gap between the oracle and iface_L3 is exactly the invariant α.
Discharge route: proof-phase — the stage graph, the WCET/occupancy bounds, and the invariant proper. See L3/08, L3/09.
S-isa — the ISA and system boundary
iface_L4_L5 : archBeh = isaBeh— the microarchitectural behaviour equals the ISA reference at the observable pad boundary.
Connects L4 (the ISA specification) and L5 (the system: memory map, devices, boot)
up to the top-level observable isaBeh. It bundles the Sail-RISC-V model, the memory
map, and the boot/observation contract into a single behaviour on pad-traces.
Below: the refinement (S-refine). Above: the top-level statement. Precursor: L5/memmap, L5/boundary, L5/b3-smoke (all PASS) — the observables are scored (the map is consistent, the boundary is the documented 18 signals, an image boots and the UART emits). What is not scored is their equality to the Sail reference at the boundary.
Discharge route: import sail-riscv at a pin (L4/sail-pin), the L3 refinement, and the L5 device models (L5/sys-models). See L4/00, L5/00. Rests on the specification-side axioms S2–S4.
S-miter — the certificate anchor
miterCNF_sound : Unsat (miterCNF lib A B) → MealyEq (denote lib A) (denote lib B)— the miter CNF faithfully encodes inequivalence of two netlists, so a refutation of it proves the machines equal.
Not an inter-layer arrow but the trust anchor every equivalence certificate rests
on: each equiv is miterCNF_sound ∘ checkRefutation_sound, and l2_commutes
(hence the whole middle) depends on it. Currently a trusted axiom.
Unlike E1 or the M-series, it is dischargeable: it is a statement about a Tseitin
encoding, provable outright. The polarity of the emitted miter was falsification-tested
in trail-cec (a wrong-polarity miter is satisfiable, so a dropped clause would show up
as a spurious SAT), but that is evidence, not a proof.
Discharge route: a verified Tseitin encoding of denote into CNF, making
miterCNF_sound a theorem — the clearest single "promote an assumption to a proof"
target in the stack. See L2/04;
in the axiom register it is the paradigm T→theorem entry.
Closing the tower
chip_realises_isa is real but conditional, and it now says precisely on what:
closing the tower is discharging these seven rows and nothing else. Four are proof-phase
layer work already priced in the dispatch (S-timing = M5,
S-refine and S-isa = the L3/L4/L5 theorems); two are mechanical once their upstream tool
exists (S-extract's LVS, S-reset's extraction); and one, S-miter, is a self-contained
encoding proof that needs no artifact at all. There is no eighth, hidden seam: the
composition is exhaustive by construction, because a missing arrow would leave
chip_realises_isa failing to type-check, not silently unsound.
Reading list — getting up to speed
Introductory and canonical textbooks for the fields this project spans. The Bibliography cites specific results with verified identifiers; this list is pedagogy. Entries link to a registered DOI, the publisher's page, or the book's own site where one could be verified; the unlinked remainder are equally canonical and easily found. Where a work is also cited as a reference, it links to its Bibliography entry. Each entry says what it is for here, tagged by layer.
The project's centre of gravity for a reader arriving from formal methods is the hardware and the physics; for a reader arriving from hardware, it is the opposite. The first four sections are the important ones.
Computer architecture (L3–L5)
- Harris & Harris, Digital Design and Computer Architecture (RISC-V edition) — the single best on-ramp: gates → HDL → a working microarchitecture, in the project's own ISA. Read this and L3/05 becomes familiar territory.
- Patterson & Hennessy, Computer Organization and Design (RISC-V edition) — the standard first course, ISA-centric; the background for L4.
- Hennessy & Patterson, Computer Architecture: A Quantitative Approach — the graduate text; caches, pipelines, speculation, OOO. Read it to understand what L3/05's presence/absence table is pricing — each row of that table is a chapter of this book.
Electrical engineering (L0, L1)
- Agarwal & Lang, Foundations of Analog and Digital Electronic Circuits — uniquely apt here: it states the lumped-matter discipline as explicit assumptions before using it, which makes it the informal ancestor of L0/08's composition theorem. The rare intro text that admits where circuit theory comes from; the MIT course built on it is on OCW.
- Horowitz & Hill, The Art of Electronics — the practical canon; what real circuits do in the space between the theorems. The supervisor/BOR/decoupling material of L5/04 is bench knowledge from here.
- Sedra & Smith, Microelectronic Circuits — the standard devices-to-amplifiers course; the MOSFET-as-circuit-element background for L0/02.
Classical electromagnetism (L0/00–01, L1)
- Griffiths, Introduction to Electrodynamics — the undergraduate canon; everything L1's electrostatics needs, readably.
- Purcell & Morin, Electricity and Magnetism — the relativity-first treatment; the best answer to why magnetism is inevitable, and the right intuition for L0/01's EQS/MQS split.
- Jackson, Classical Electrodynamics — the graduate reference; boundary-value problems at the strength L0/09's enclosures actually require.
- Haus & Melcher, Electromagnetic Fields and Energy — the careful quasistatics treatment L0/01 leans on directly.
Quantum theory and solid state (L0/02, L0/05)
For this project the solid-state route is the load-bearing one — the QFT that matters for devices is many-body condensed-matter theory, not particle physics.
- Griffiths, Introduction to Quantum Mechanics — the standard first course.
- Ashcroft & Mermin, Solid State Physics — the canon: band structure, effective mass, semiclassical transport — the physical content behind E1, and most of what L0/05's tower actually rests on.
- Kittel, Introduction to Solid State Physics — the lighter alternative.
- Zee, Quantum Field Theory in a Nutshell — the friendliest QFT entry point.
- Peskin & Schroeder, An Introduction to Quantum Field Theory (or Schwartz, Quantum Field Theory and the Standard Model) — the standard course, either one.
- Altland & Simons, Condensed Matter Field Theory — field theory pointed at solids; the QFT that is actually adjacent to device physics.
Semiconductor devices (L0/02)
- Pierret, Semiconductor Device Fundamentals — the introductory device course.
- Taur & Ning, Fundamentals of Modern VLSI Devices — the modern MOSFET in depth; what BSIM is a fit of.
- Sze & Ng, Physics of Semiconductor Devices — the reference; avalanche and breakdown for L0/04.
VLSI and the physical flow (L1–L2)
- Weste & Harris, CMOS VLSI Design — the whole industrial flow in one book: layout, DRC, timing, clocking, the cell library. The layers' industrial counterpart, and the fastest way to see what L1–L2 are formalising.
- Rabaey, Chandrakasan & Nikolić, Digital Integrated Circuits — devices → gates → wires; its interconnect and delay chapters are L1's background.
- Bhasker & Chadha, Static Timing Analysis for Nanometer Designs — the industrial practice that L1/08 makes sound.
Mathematics of the lower layers (L0/00, L0/09)
- Evans, Partial Differential Equations — the standard graduate text; weak solutions and Lax–Milgram as L0/00 uses them.
- Brezis, Functional Analysis, Sobolev Spaces and Partial Differential Equations — the toolkit behind row 3 and L0/09's variational bounds.
- Tucker, Validated Numerics — a short introduction to rigorous computation; L0/07's method in miniature.
- Moore, Kearfott & Cloud, Introduction to Interval Analysis — the interval-arithmetic foundation under every enclosure in the book.
- MacKay, Information Theory, Inference, and Learning Algorithms — for L0/03's coding half; freely available and a pleasure.
Formal methods (for the hardware reader)
- Nipkow & Klein, Concrete Semantics — operational semantics and machine-checked proof, hands-on; the mindset of L3–L3.
- Kroening & Strichman, Decision Procedures — SAT, SMT, bitvectors; L2's engine room.
- Biere, Heule, van Maaren & Walsh (eds.), Handbook of Satisfiability — the SAT canon in depth; the CDCL and proof-logging (DRAT/LRAT) chapters are the trust story behind every certificate in L1–L2.
- Avigad, de Moura, Kong & Ullrich, Theorem Proving in Lean 4 — an interactive-theorem-prover on-ramp, free online; the working style that every "formalise X" in this book assumes, whatever system the project ultimately inhabits.
- Pierce et al., Software Foundations — machine-checked program verification from zero (Coq, free online); volumes 1–2 are the discipline's boot camp, and CompCert is the flagship artifact showing where it leads — the verified-vs-validated-pass calculus L2/04 borrows comes from there.
- Clarke, Grumberg, Kroening, Peled & Veith, Model Checking — the standard text for the technique this project explicitly cannot use at scale (2^5774 states — L2/02) but borrows ideas from everywhere (IC3, invariants as certificates).
- Melham, Higher Order Logic and Hardware Verification — the historical centre of transistor-level formal verification; L0/06's ancestor.
Bibliography
One reference list for the whole project. Author mentions in the layer documents link here; each entry carries an anchor (#key) for that purpose. Organised by topic, roughly in stack order.
On the identifiers. Every entry carries a link. DOIs were resolved against the DOI registry and their returned metadata — title, container, year — checked against the entry rather than recalled; a plausible-looking DOI pointing at the wrong paper is worse than none. Where a DOI names a reissue rather than the original printing, the entry says so. Two works have no DOI (Mock's Boole Press monograph; Makino & Berz's IJPAM paper, whose journal predates DOI registration) and are linked to a catalogue or index record instead. Software and standards link to their project or issuing-body page.
Semiconductor device equations
- Markowich, P. A. (1986). The Stationary Semiconductor Device Equations. Springer. doi:10.1007/978-3-7091-3678-2
- Markowich, P. A., Ringhofer, C. A. & Schmeiser, C. (1990). Semiconductor Equations. Springer. doi:10.1007/978-3-7091-6961-2
- Jüngel, A. (2009). Transport Equations for Semiconductors. Lecture Notes in Physics 773, Springer. doi:10.1007/978-3-540-89526-8
- Mock, M. S. (1983). Analysis of Mathematical Models of Semiconductor Devices. Boole Press. (Stationary existence; earlier results in Comm. Pure Appl. Math. 25, 1972.) Open Library
- Gajewski, H. (1985). "On existence, uniqueness and asymptotic behavior of solutions of the basic equations for carrier transport in semiconductors". ZAMM 65(2), 101–108. doi:10.1515/9783112547182-007
- Gajewski, H. & Gröger, K. (1986). "On the basic equations for carrier transport in semiconductors". J. Math. Anal. Appl. 113(1), 12–35. (Transient existence; the free-energy structure.) doi:10.1016/0022-247x(86)90330-6
Elliptic problems and regularity
- Grisvard, P. (1985). Elliptic Problems in Nonsmooth Domains. Pitman; reissued as SIAM Classics in Applied Mathematics 69 (2011). (Corner singularity exponents.) doi:10.1137/1.9781611972030
- Kellogg, R. B. (1974). "On the Poisson equation with intersecting interfaces". Applicable Analysis 4(2), 101–129. (Transmission problems with piecewise-constant coefficients.) doi:10.1080/00036817408839086
- Gröger, K. (1989). "A W¹,ᵖ-estimate for solutions to mixed boundary value problems for second order elliptic differential equations". Math. Ann. 283, 679–687. doi:10.1007/bf01442860
- Ern, A. & Vohralík, M. (2015). "Polynomial-degree-robust a posteriori estimates in a unified setting for conforming, nonconforming, discontinuous Galerkin, and mixed discretizations". SIAM J. Numer. Anal. 53(2), 1058–1081. (Guaranteed a posteriori FEM bounds via equilibrated flux.) doi:10.1137/130950100
- Nakao, M. T., Plum, M. & Watanabe, Y. (2019). Numerical Verification Methods and Computer-Assisted Proofs for Partial Differential Equations. Springer. doi:10.1007/978-981-13-7669-6
- Pólya, G. & Szegő, G. (1951). Isoperimetric Inequalities in Mathematical Physics. Princeton University Press. (Rigorous capacity bounds.) doi:10.1515/9781400882663
- Driscoll, T. A. & Trefethen, L. N. (2002). Schwarz–Christoffel Mapping. Cambridge University Press. doi:10.1017/CBO9780511546808
Electromagnetics and quasistatics
- Haus, H. A. & Melcher, J. R. (1989). Electromagnetic Fields and Energy. Prentice-Hall. (The careful EQS/MQS treatment.) MIT OpenCourseWare (full text)
- Ammari, H., Buffa, A. & Nédélec, J.-C. (2000). "A justification of eddy currents model for the Maxwell equations". SIAM J. Appl. Math. 60(5), 1805–1823. doi:10.1137/s0036139998348979
- Raviart, P.-A. & Sonnendrücker, E. (1996). "A hierarchy of approximate models for the Maxwell equations". Numer. Math. 73, 329–372. (The Darwin model justified.) doi:10.1007/s002110050196
- Alonso Rodríguez, A. & Valli, A. (2010). Eddy Current Approximation of Maxwell Equations. Springer. doi:10.1007/978-88-470-1506-7
- Bossavit, A. (1998). Computational Electromagnetism: Variational Formulations, Complementarity, Edge Elements. Academic Press. (Whitney forms; networks as discrete Maxwell.) doi:10.1016/B978-0-12-118710-1.X5000-4
- Tonti, E. (2013). The Mathematical Structure of Classical and Relativistic Physics. Birkhäuser. (The classification diagrams behind the cell method.) doi:10.1007/978-1-4614-7422-7
- Ruehli, A. E. (1974). "Equivalent circuit models for three-dimensional multiconductor systems". IEEE Trans. Microwave Theory Tech. 22(3), 216–221. (PEEC / partial inductance.) doi:10.1109/tmtt.1974.1128204
- Kamon, M., Tsuk, M. J. & White, J. K. (1994). "FASTHENRY: a multipole-accelerated 3-D inductance extraction program". IEEE Trans. Microwave Theory Tech. 42(9), 1750–1758. doi:10.1109/22.310584
Device physics, compact models, and variability
- Sze, S. M. & Ng, K. K. (2007). Physics of Semiconductor Devices, 3rd ed. Wiley. doi:10.1002/0470068329
- Miller, J. M. (1919). "Dependence of the input impedance of a three-electrode vacuum tube upon the load in the plate circuit". Scientific Papers of the Bureau of Standards 15(351), 367–385. (The Miller effect: feedback-capacitance multiplication; commonly cited as 1920.) doi:10.6028/nbsscipaper.024
- Chen, P., Kirkpatrick, D. A. & Keutzer, K. (2000). "Miller factor for gate-level coupling delay calculation". IEEE/ACM ICCAD 2000. (The coupling switching factor for delay, and the correction to the naive 0–2× range.) doi:10.1109/iccad.2000.896453
- Chynoweth, A. G. (1958). "Ionization rates for electrons and holes in silicon". Phys. Rev. 109, 1537–1540. doi:10.1103/physrev.109.1537
- Troutman, R. R. (1986). Latchup in CMOS Technology: The Problem and Its Cure. Kluwer. doi:10.1007/978-1-4757-1887-4
- Black, J. R. (1969). "Electromigration — a brief survey and some recent results". IEEE Trans. Electron Devices 16(4), 338–347. doi:10.1109/t-ed.1969.16754
- Gildenblat, G. et al. (2006). "PSP: an advanced surface-potential-based MOSFET model for circuit simulation". IEEE Trans. Electron Devices 53(9), 1979–1993. doi:10.1109/ted.2005.881006
- Caughey, D. M. & Thomas, R. E. (1967). "Carrier mobilities in silicon empirically related to doping and field". Proc. IEEE 55(12), 2192–2193. doi:10.1109/proc.1967.6123
- Masetti, G., Severi, M. & Solmi, S. (1983). "Modeling of carrier mobility against carrier concentration in arsenic-, phosphorus-, and boron-doped silicon". IEEE Trans. Electron Devices 30(7), 764–769. doi:10.1109/t-ed.1983.21207
- Ando, T., Fowler, A. B. & Stern, F. (1982). "Electronic properties of two-dimensional systems". Rev. Mod. Phys. 54, 437–672. (Inversion-layer quantisation.) doi:10.1103/revmodphys.54.437
- Kirton, M. J. & Uren, M. J. (1989). "Noise in solid-state microstructures: a new perspective on individual defects, interface states and low-frequency (1/f) noise". Adv. Phys. 38(4), 367–468. (RTN.) doi:10.1080/00018738900101122
- Asenov, A. (1998). "Random dopant induced threshold voltage lowering and fluctuations in sub-0.1 µm MOSFETs: a 3-D 'atomistic' simulation study". IEEE Trans. Electron Devices 45(12), 2505–2513. doi:10.1109/16.735728
- Demir, A., Mehrotra, A. & Roychowdhury, J. (2000). "Phase noise in oscillators: a unifying theory and numerical methods for characterisation". IEEE Trans. Circuits Syst. I 47(5), 655–674. doi:10.1109/81.847872
Kinetic theory, many-body theory, and quantum foundations
- Kato, T. (1951). "Fundamental properties of Hamiltonian operators of Schrödinger type". Trans. Amer. Math. Soc. 70, 195–211. doi:10.1090/s0002-9947-1951-0041010-x
- Dyson, F. J. & Lenard, A. (1967). "Stability of matter. I". J. Math. Phys. 8, 423–434. doi:10.1063/1.1705209
- Lieb, E. H. & Thirring, W. E. (1975). "Bound for the kinetic energy of fermions which proves the stability of matter". Phys. Rev. Lett. 35, 687–689. doi:10.1103/PhysRevLett.35.687
- Lieb, E. H. & Seiringer, R. (2010). The Stability of Matter in Quantum Mechanics. Cambridge University Press. doi:10.1017/cbo9780511819681
- Glimm, J. & Jaffe, A. (1987). Quantum Physics: A Functional Integral Point of View, 2nd ed. Springer. (What constructive QFT can and cannot do.) doi:10.1007/978-1-4612-4728-9
- Aizenman, M. & Duminil-Copin, H. (2021). "Marginal triviality of the scaling limits of critical 4D Ising and φ⁴₄ models". Ann. of Math. 194(1), 163–235. doi:10.4007/annals.2021.194.1.3
- Erdős, L. & Yau, H.-T. (2000). "Linear Boltzmann equation as the weak coupling limit of a random Schrödinger equation". Comm. Pure Appl. Math. 53(6), 667–735. doi:10.1002/(sici)1097-0312(200006)53:6<667::aid-cpa1>3.0.co;2-5
- Erdős, L., Salmhofer, M. & Yau, H.-T. (2008). "Quantum diffusion of the random Schrödinger evolution in the scaling limit". Acta Math. 200, 211–277. doi:10.1007/s11511-008-0027-2
- Gérard, P., Markowich, P. A., Mauser, N. J. & Poupaud, F. (1997). "Homogenization limits and Wigner transforms". Comm. Pure Appl. Math. 50, 323–379. doi:10.1002/(sici)1097-0312(199704)50:4<323::aid-cpa4>3.0.co;2-c
- Poupaud, F. (1991). "Diffusion approximation of the linear semiconductor Boltzmann equation: analysis of boundary layers". Asymptotic Anal. 4(4), 293–317. doi:10.3233/asy-1991-4402
- Golse, F. & Poupaud, F. (1992). "Limite fluide des équations de Boltzmann des semi-conducteurs pour une statistique de Fermi–Dirac". Asymptotic Anal. 6(2), 135–160. doi:10.3233/asy-1992-6202
- Ben Abdallah, N. & Degond, P. (1996). "On a hierarchy of macroscopic models for semiconductors". J. Math. Phys. 37(7), 3306–3333. (Energy-transport limits.) doi:10.1063/1.531567
- Catto, I., Le Bris, C. & Lions, P.-L. (1998). The Mathematical Theory of Thermodynamic Limits: Thomas–Fermi Type Models. Oxford University Press. doi:10.1093/oso/9780198501619.001.0001
- Cancès, É., Deleurence, A. & Lewin, M. (2008). "A new approach to the modelling of local defects in crystals: the reduced Hartree–Fock case". Comm. Math. Phys. 281, 129–177. doi:10.1007/s00220-008-0481-x
- Zurek, W. H. (2003). "Decoherence, einselection, and the quantum origins of the classical". Rev. Mod. Phys. 75, 715–775. doi:10.1103/revmodphys.75.715
- Caldeira, A. O. & Leggett, A. J. (1981). "Influence of dissipation on quantum tunneling in macroscopic systems". Phys. Rev. Lett. 46, 211–214. doi:10.1103/physrevlett.46.211
- Devoret, M. H., Martinis, J. M. & Clarke, J. (1985). "Measurements of macroscopic quantum tunneling out of the zero-voltage state of a current-biased Josephson junction". Phys. Rev. Lett. 55, 1908–1911. doi:10.1103/physrevlett.55.1908
Dynamical systems, control, and certificates
- Prajna, S. & Jadbabaie, A. (2004). "Safety verification of hybrid systems using barrier certificates". HSCC 2004, LNCS 2993, 477–492. doi:10.1007/978-3-540-24743-2_32
- Parrilo, P. A. (2003). "Semidefinite programming relaxations for semialgebraic problems". Math. Program. 96, 293–320. doi:10.1007/s10107-003-0387-5
- Prajna, S., Papachristodoulou, A. & Parrilo, P. A. (2002). "Introducing SOSTOOLS: a general purpose sum of squares programming solver". CDC 2002. doi:10.1109/cdc.2002.1184594 · SOSTOOLS
- Harrison, J. (2007). "Verifying nonlinear real formulas via sums of squares". TPHOLs 2007, LNCS 4732, 102–118. doi:10.1007/978-3-540-74591-4_9
- Martin-Dorel, É. & Roux, P. (2017). "A reflexive tactic for polynomial positivity using numerical solvers and floating-point computations". CPP 2017. (ValidSDP.) doi:10.1145/3018610.3018622
- Blanchini, F. (1999). "Set invariance in control". Automatica 35(11), 1747–1767. doi:10.1016/s0005-1098(99)00113-2
- Lohmiller, W. & Slotine, J.-J. E. (1998). "On contraction analysis for non-linear systems". Automatica 34(6), 683–696. doi:10.1016/s0005-1098(98)00019-3
- Jiang, Z.-P., Teel, A. R. & Praly, L. (1994). "Small-gain theorem for ISS systems and applications". Math. Control Signals Syst. 7, 95–120. doi:10.1007/bf01211469
- Dashkovskiy, S., Rüffer, B. S. & Wirth, F. R. (2007). "An ISS small gain theorem for general networks". Math. Control Signals Syst. 19, 93–122. doi:10.1007/s00498-007-0014-8
- Benveniste, A., Caillaud, B., Nickovic, D., Passerone, R., Raclet, J.-B., Reinkemeier, P., Sangiovanni-Vincentelli, A., Damm, W., Henzinger, T. A. & Larsen, K. G. (2018). Contracts for System Design. Foundations and Trends in EDA 12(2–3). doi:10.1561/9781680834031
- Marino, L. R. (1981). "General theory of metastable operation". IEEE Trans. Computers C-30(2), 107–115. (Metastability provably unavoidable.) doi:10.1109/tc.1981.6312173
- Kinniment, D. J. (2007). Synchronization and Arbitration in Digital Systems. Wiley. doi:10.1002/9780470517147
Validated numerics and computer-assisted proof
- Rump, S. M. (1999). "INTLAB — INTerval LABoratory". In Developments in Reliable Computing, Kluwer, 77–104. doi:10.1007/978-94-017-1247-7_7 · INTLAB
- Johansson, F. (2017). "Arb: efficient arbitrary-precision midpoint-radius interval arithmetic". IEEE Trans. Computers 66(8), 1281–1292. doi:10.1109/tc.2017.2690633
- Kapela, T., Mrozek, M., Wilczak, D. & Zgliczyński, P. (2021). "CAPD::DynSys: a flexible C++ toolbox for rigorous numerical analysis of dynamical systems". Commun. Nonlinear Sci. Numer. Simul. 101, 105578. doi:10.1016/j.cnsns.2020.105578 · CAPD
- Nedialkov, N. S. (2006). VNODE-LP — a validated solver for initial value problems in ordinary differential equations. Tech. Rep. CAS-06-06-NN, McMaster University. VNODE-LP
- Nedialkov, N. S. & Pryce, J. D. (2005). "Solving differential-algebraic equations by Taylor series (I): computing Taylor coefficients". BIT 45, 561–591. (DAETS.) doi:10.1007/s10543-005-0019-y
- Pryce, J. D. (2001). "A simple structural analysis method for DAEs". BIT 41(2), 364–394. (The Σ-method.) doi:10.1023/a:1021998624799
- de Figueiredo, L. H. & Stolfi, J. (2004). "Affine arithmetic: concepts and applications". Numerical Algorithms 37, 147–158. doi:10.1023/b:numa.0000049462.70970.b6
- Makino, K. & Berz, M. (2003). "Taylor models and other validated functional inclusion methods". Int. J. Pure Appl. Math. 4(4), 379–456. Semantic Scholar (author copy at bt.pa.msu.edu)
- Tucker, W. (2002). "A rigorous ODE solver and Smale's 14th problem". Found. Comput. Math. 2, 53–117. doi:10.1007/s002080010018
- Immler, F. (2018). "A verified ODE solver and the Lorenz attractor". J. Autom. Reason. 61, 73–111. (HOL-ODE-Numerics.) doi:10.1007/s10817-017-9448-y
- Boldo, S., Clément, F., Filliâtre, J.-C., Mayero, M., Melquiond, G. & Weis, P. (2013). "Wave equation numerical resolution: a comprehensive mechanized proof of a C program". J. Autom. Reason. 50(4), 423–456. doi:10.1007/s10817-012-9255-4
- Zgliczyński, P. (1997). "Computer assisted proof of chaos in the Rössler equations and in the Hénon map". Nonlinearity 10, 243–252. (Covering relations; interval Poincaré maps.) doi:10.1088/0951-7715/10/1/016
- Galias, Z. (2001). "Interval methods for rigorous investigations of periodic orbits". Int. J. Bifurcation Chaos 11(9), 2427–2450. doi:10.1142/s0218127401003516
Reachability and formal analog verification
- Girard, A. (2005). "Reachability of uncertain linear systems using zonotopes". HSCC 2005, LNCS 3414, 291–305. doi:10.1007/978-3-540-31954-2_19
- Althoff, M. (2015). "An introduction to CORA 2015". ARCH 2015, 120–151. doi:10.29007/zbkv · CORA
- Althoff, M. & Krogh, B. H. (2014). "Reachability analysis of nonlinear differential-algebraic systems". IEEE Trans. Autom. Control 59(2), 371–383. doi:10.1109/tac.2013.2285751
- Chen, X., Ábrahám, E. & Sankaranarayanan, S. (2013). "Flow*: an analyzer for non-linear hybrid systems". CAV 2013, LNCS 8044, 258–263. doi:10.1007/978-3-642-39799-8_18 · Flow*
- Bogomolov, S., Forets, M., Frehse, G., Potomkin, K. & Schilling, C. (2019). "JuliaReach: a toolbox for set-based reachability". HSCC 2019, 39–44. doi:10.1145/3302504.3311804 · JuliaReach
- Greenstreet, M. R. & Mitchell, I. (1999). "Reachability analysis using polygonal projections". HSCC 1999, LNCS 1569, 103–116. (Verified toggle element; projectagons.) doi:10.1007/3-540-48983-5_12
- Dang, T., Donzé, A. & Maler, O. (2004). "Verification of analog and mixed-signal circuits using hybrid system techniques". FMCAD 2004, LNCS 3312, 21–36. doi:10.1007/978-3-540-30494-4_3
- Zaki, M. H., Tahar, S. & Bois, G. (2008). "Formal verification of analog and mixed signal designs: a survey". Microelectronics Journal 39(12), 1395–1404. doi:10.1016/j.mejo.2008.05.013
- Estévez Schwarz, D. & Tischendorf, C. (2000). "Structural analysis of electric circuits and consequences for MNA". Int. J. Circuit Theory Appl. 28(2), 131–162. (Index of MNA DAEs.) doi:10.1002/(sici)1097-007x(200003/04)28:2<131::aid-cta100>3.0.co;2-w
Reliability and probabilistic verification
- von Neumann, J. (1956). "Probabilistic logics and the synthesis of reliable organisms from unreliable components". In Automata Studies (Shannon & McCarthy, eds.), Princeton University Press, 43–98. doi:10.1515/9781400882618-003
- Hamming, R. W. (1950). "Error detecting and error correcting codes". Bell Syst. Tech. J. 29(2), 147–160. doi:10.1002/j.1538-7305.1950.tb00463.x
- Mukherjee, S. S., Weaver, C., Emer, J., Reinhardt, S. K. & Austin, T. (2003). "A systematic methodology to compute the architectural vulnerability factors for a high-performance microprocessor". MICRO-36, 29–40. doi:10.1109/micro.2003.1253181
- Ibe, E., Taniguchi, H., Yahagi, Y., Shimbo, K. & Toba, T. (2010). "Impact of scaling on neutron-induced soft error in SRAMs from a 250 nm to a 22 nm design rule". IEEE Trans. Electron Devices 57(7), 1527–1538. (Multi-cell upset scaling.) doi:10.1109/ted.2010.2047907
- Kwiatkowska, M., Norman, G. & Parker, D. (2011). "PRISM 4.0: verification of probabilistic real-time systems". CAV 2011, LNCS 6806, 585–591. doi:10.1007/978-3-642-22110-1_47 · PRISM
- Dehnert, C., Junges, S., Katoen, J.-P. & Volk, M. (2017). "A Storm is coming: a modern probabilistic model checker". CAV 2017, LNCS 10427, 592–600. doi:10.1007/978-3-319-63390-9_31 · Storm
- Hölzl, J. (2017). "Markov chains and Markov decision processes in Isabelle/HOL". J. Autom. Reason. 59(3), 345–387. doi:10.1007/s10817-016-9401-5
Hardware formal verification
- Bryant, R. E. (1984). "A switch-level model and simulator for MOS digital systems". IEEE Trans. Computers C-33(2), 160–177. (MOSSIM II; channel-connected components.) doi:10.1109/tc.1984.1676408
- Melham, T. F. (1993). Higher Order Logic and Hardware Verification. Cambridge Tracts in Theoretical Computer Science 31, CUP. doi:10.1017/cbo9780511569845
- Clarke, E. M. & Emerson, E. A. (1981). "Design and synthesis of synchronization skeletons using branching time temporal logic". Logics of Programs, LNCS 131, 52–71. (The birth of model checking; 2007 Turing Award with Sifakis.) doi:10.1007/BFb0025774
- Hunt, W. A., Jr. (1989). "Microprocessor design verification". J. Automated Reasoning 5(4), 429–460. (FM8501.) doi:10.1007/BF00243132
- Bevier, W. R., Hunt, W. A., Jr., Moore, J S. & Young, W. D. (1989). "An approach to systems verification". J. Automated Reasoning 5(4), 411–428. (The CLI verified stack.) doi:10.1007/BF00243131
- Cohn, A. (1989). "The notion of proof in hardware verification". J. Automated Reasoning 5(2), 127–139. (What Viper's "verified" could and could not mean; this book's cautionary ancestor.) doi:10.1007/BF00243000
- Brock, B. & Hunt, W. A., Jr. (1997). "The DUAL-EVAL hardware description language and its use in the formal specification and verification of the FM9001 microprocessor". Formal Methods in System Design 11(1), 71–104. (FM9001 was fabricated as a CMOS ASIC.) doi:10.1023/A:1008685826293
- Edelman, A. (1997). "The mathematics of the Pentium division bug". SIAM Review 39(1), 54–67. doi:10.1137/S0036144595293959
- Moore, J S., Lynch, T. W. & Kaufmann, M. (1998). "A mechanically checked proof of the correctness of the kernel of the AMD5K86 floating-point division program". IEEE Trans. Computers 47(9), 913–926. doi:10.1109/12.713311
- Beyer, S., Jacobi, C., Kroening, D., Leinenbach, D. & Paul, W. (2006). "Putting it all together — formal verification of the VAMP". STTT 8(4–5), 411–430. (Verisoft's processor, ISA to gates in PVS.) doi:10.1007/s10009-006-0204-6
- Klein, G. et al. (2009). "seL4: formal verification of an OS kernel". SOSP 2009, 207–220. doi:10.1145/1629575.1629596
- Lööw, A., Kumar, R., Tan, Y. K., Myreen, M. O., Norrish, M., Abrahamsson, O. & Fox, A. (2019). "Verified compilation on a verified processor". PLDI 2019, 1041–1053. (The Silver stack.) doi:10.1145/3314221.3314622
- Lööw, A. (2021). "Lutsig: a verified Verilog compiler for verified circuit development". CPP 2021, 46–60. doi:10.1145/3437992.3439916
- Burch, J. R. & Dill, D. L. (1994). "Automatic verification of pipelined microprocessor control". CAV 1994, LNCS 818. (Flushing as the abstraction function.) doi:10.1007/3-540-58179-0_44
- Fox, A. (2003). "Formal specification and verification of ARM6". TPHOLs 2003, LNCS 2758. (A commercial ISA against a real pipeline, in HOL4.) doi:10.1007/10930755_2
- Kuehlmann, A., Paruthi, V., Krohm, F. & Ganai, M. K. (2002). "Robust Boolean reasoning for equivalence checking and functional property verification". IEEE Trans. CAD 21(12), 1377–1394. doi:10.1109/tcad.2002.804386
- Brand, D. (1993). "Verification of large synthesized designs". ICCAD 1993, 534–537. doi:10.1109/iccad.1993.580110
- Kaufmann, D., Biere, A. & Kauers, M. (2019). "Verifying large multipliers by combining SAT and computer algebra". FMCAD 2019, 28–36. (PAC certificates.) doi:10.23919/fmcad.2019.8894250
- Leroy, X. (2009). "Formal verification of a realistic compiler". Comm. ACM 52(7), 107–115. (CompCert; the verified-pass vs validated-pass calculus.) doi:10.1145/1538788.1538814
- Armstrong, A. et al. (2019). "ISA semantics for ARMv8-A, RISC-V, and CHERI-MIPS". POPL 2019. (The Sail language.) doi:10.1145/3290384
- Bauereiss, T. et al. (2022). "Verified security for the Morello capability-enhanced prototype Arm architecture". ESOP 2022, LNCS 13240, 174–201. doi:10.1007/978-3-030-99336-8_7
Standards, data sheets, and artifacts
- JEDEC (2006). JESD89A: Measurement and Reporting of Alpha Particle and Terrestrial Cosmic Ray-Induced Soft Errors in Semiconductor Devices. (The standard terrestrial flux reference.) JEDEC
- UC Berkeley BSIM Group. BSIM4 MOSFET Model — Technical Manual. (What E1 actually asserts; the SKY130 models are BSIM4.) BSIM Group
- Synopsys. Liberty Library Modeling Reference (the
.libformat specification). (What the PDK tables assert.) Synopsys TAP-in - SkyWater Technology / Google. SKY130 Open Source PDK Documentation. (Layer stack, model cards, DRC deck — the data register's D3/D4 sources.) skywater-pdk docs
- Asanović, K., et al. The Rocket Chip Generator (UCB/EECS-2016-17). The core generator's technical report; with the rocket-chip repository and the Chipyard framework as the living artifacts.
- The FIRRTL Specification. The intermediate representation's written semantics — L3/04's anchor. Spec; Izraelevitz et al., Reusability is FIRRTL Ground (ICCAD 2017) for the design rationale.
- SiFive / CHIPS Alliance. TileLink Specification. The interconnect protocol L5/02's contract restricts. Spec
- RISC-V International. RISC-V Debug Specification (v0.13 lineage). The debug module's imported register model (L3/06).
- RISC-V International. sail-riscv: the ratified formal specification of the RISC-V ISA. Repository; exports to Coq/Isabelle/HOL4/Lean. GitHub
Data provenance — the generated artifact stack
Nothing is fetched that can be generated. The book's artifacts — RTL, netlist, constraints, layout, reports — are produced by the flow in this repository from pinned sources. The repo-root data/ and build directories are gitignored; regenerate rather than trust.
Pins — deliberately, exactly
| component | what | pin |
|---|---|---|
| Chipyard | the SoC framework: generators, Hammer, the tutorial flow configs | commit e27c6561c0066c1f60bf4eb4885a38391c850ac0 (2026-07-27) |
| firtool (CIRCT) | FIRRTL → SystemVerilog | release 1.75.0, sha256-pinned binary |
| SRAM22 macros | the sky130 SRAM collateral (LEF/GDS/lib/SPICE/Verilog) | rahulk29/sram22_sky130_macros master 75cbe961 (2026-05-06) |
| Hammer | the physical-design driver | hammer-vlsi 1.2.0 (with the compatibility patches recorded in findings) |
| PDK | sky130A via ciel | open_pdks build 8afc8346a57fe1ab7934ba5a6056ea8b43078e71 |
| riscv-opcodes | the standard's machine-readable encodings (L4/03's spec side) | pinned SHA in the fetch script |
| EDA tools | yosys, OpenROAD, Magic, KLayout, Netgen, OpenSTA, Verilator | version-pinned, checksum-verified installs via tools/install-toolchain.sh |
Refs are commit SHAs, not branches. The findings quote exact instance counts, census numbers, and report values from artifacts these pins produce; a floating ref would silently invalidate all of it. If you bump a pin: re-run the flow, re-run the checkers, and re-derive Findings — never one without the other.
Two provenance facts worth stating as facts rather than policy:
- The chain has one root. Every layer's artifact descends from one elaboration of one pinned configuration — the single-root property (which dissolved the old F7, since it holds by construction), kept true by the re-elaboration diff (L3/04) rather than assumed.
- The pins decay. The upstream flow did not run against current components without patches (findings: upstream flow drift); the patches are recorded, small, and applied to open code. This is the cost — and the point — of choosing patchable-modern over frozen-container: nothing is hidden behind a working binary.
What the flow produces
generated-src/ the elaboration: FIRRTL, SystemVerilog, device tree,
per-device register maps, memory configuration
syn-rundir/ ChipTop.mapped.v (the netlist N), ChipTop.mapped.sdc,
synthesis reports
par-rundir/ floorplan, placement, CTS, routing, ChipTop.gds,
extraction, timing reports
signoff DRC (two engines), LVS, multi-corner STA
The book's layer subjects map onto these: L3 reads the SystemVerilog (and its FIRRTL ancestor), L2 the mapped netlist, L1 the SDC and timing reports, L1 the GDS and extraction, L5/L4/L3 the elaboration's metadata and the RTL.
Tools that consume this
The per-layer scoreboards tools/check-l0.py … check-l5.py (run all via tools/check-all.py; rendered into the book as the scoreboard) drive the extractors. The suite is being re-anchored to the generated artifacts; the scoreboard names each checker's status honestly — a checker that has not run against the current artifacts reports TODO, not a stale PASS.
| role | consumes | produces |
|---|---|---|
| RTL census | the emitted SystemVerilog | L3/01's construct table, as a regression |
| netlist graph checks | ChipTop.mapped.v | W1–W4 (L2/01) |
| clock/domain census | netlist + SDC | L1/04's completeness table, L1/10's gating census |
| memory-map diff | RTL decode + device tree + regmaps | L5/03's three-way diff |
| decoder extraction | the emitted core | L4/03's partition |
| configuration record | elaboration metadata + RTL | the record L3–L4 scope against |
| flow runner | all pinned sources | the artifact stack above, reproducibly |
The analysis toolchain — pinned for the same reason
tools/install-toolchain.sh installs the EDA tools version-pinned and sha256-verified, on the same principle as the sources: a number in Findings produced by a floating tool is a number nobody can reproduce. A checksum mismatch aborts the install; re-running is idempotent.
Installing a tool does not discharge an obligation — it removes the precondition. The scoreboard rows stay TODO until a checker actually uses the tool.