Honeycomb

1. Status and Evidence🔗

Honeycomb now has a first generated RTL cell tied to the book's documented boundary. The book proves the executable semantics, kernel arithmetic, block-float identity, small analytical design rules, the RTL DSL execute path against step, the encoded-word fetch bridge feeding that execute path, the abstract lifecycle protocol around reset, host writes, start, and execute gating, and the mesh transport-and-composition model that lifts the single cell to the flat fabric. The first-cell 256-entry physical memory index is explicit in those contracts. A first sky130/OpenLane run was recorded for the earlier inferred-memory cell; that run exposed the expected standard-cell memory expansion and did not reach pre-PNR timing. The hot memories now sit behind honeycomb_sram macro-adapter submodules, and a second sky130 synthesis run is recorded against that boundary: the memories bind as SRAM macros and the mapped flip-flop count collapses by roughly fifty times. The macro-backed honeycomb_cell_mac now routes to a clean powered close, meeting setup and hold across all nine corners. The book does not yet prove parser-level SystemVerilog refinement, does not reach a signoff-clean GDS, and does not claim fabricated silicon or measured Honeycomb hardware.

namespace Honeycomb inductive Evidence where | proved | modeled | recorded | target deriving Repr, DecidableEq structure StatusClaim where name : String evidence : Evidence closed : Bool deriving Repr structure SynthesisAttempt where runDate : String tool : String pdk : String flow : String runTag : String boundedMinutes : Nat reachedPrePnrSta : Bool yosysCheckProblems : Nat memoriesRemaining : Nat postDffCells : Nat mappedSky130Flops : Nat postDffSequentialAreaUm2 : String finalAbcCompleted : Bool deriving Repr structure MacroSynthesisResult where runDate : String tool : String pdk : String flow : String runTag : String reachedPrePnrSta : Bool checkProblems : Nat inferredMemoriesRemaining : Nat sramMacroInstances : Nat physicalSramMacros : Nat mappedCells : Nat mappedSky130Flops : Nat stdCellLogicAreaUm2 : String oneSramMacroAreaUm2 : String finalMapCompleted : Bool cycleFaithful : Bool deriving Repr structure PnrAttempt where runDate : String tool : String pdk : String cell : String clockPeriodNs : Nat dieWidthUm : Nat dieHeightUm : Nat sramMacrosPlaced : Nat reachedStage : String nomCornerSetupMet : Bool nomCornerHoldMet : Bool routed : Bool criticalPath : String deriving Repr structure MacTimingRun where runDate : String tool : String pdk : String clockPeriodNs : Nat combWorstPathNs : String combSlackNs : String pipeWorstPathNs : String pipeSlackNs : String goldenEquivalent : Bool deriving Repr def honeycombStatus : List StatusClaim := [ { name := "fixed-width processor semantics", evidence := .proved, closed := true }, { name := "branch-free kernel dot correctness", evidence := .proved, closed := true }, { name := "cycle-level kernel scheduler refinement", evidence := .proved, closed := true }, { name := "block-float integer MAC identity", evidence := .proved, closed := true }, { name := "quantized kernel no-overflow bounds", evidence := .proved, closed := true }, { name := "load lattice and utilization design rules", evidence := .modeled, closed := true }, { name := "GPU comparison constants", evidence := .recorded, closed := true }, { name := "generated single-cell RTL from Lean DSL", evidence := .recorded, closed := true }, { name := "single-cycle execute-path RTL DSL refinement", evidence := .proved, closed := true }, { name := "encoded instruction fetch to execute-path refinement", evidence := .proved, closed := true }, { name := "abstract cell lifecycle refinement", evidence := .proved, closed := true }, { name := "fully synchronous-read cell refinement", evidence := .proved, closed := true }, { name := "pipelined fetch cell control-hazard refinement", evidence := .proved, closed := true }, { name := "generated pipelined-fetch RTL cell", evidence := .recorded, closed := true }, { name := "operand pipeline data-hazard safe-overlap theorem", evidence := .proved, closed := true }, { name := "generated synchronous-read RTL cell", evidence := .recorded, closed := true }, { name := "first-cell physical memory index contract", evidence := .proved, closed := true }, { name := "sky130/OpenLane inferred-memory synthesis attempt", evidence := .recorded, closed := true }, { name := "honeycomb_sram macro-adapter RTL boundary", evidence := .recorded, closed := true }, { name := "sky130 macro-adapter synthesis area", evidence := .recorded, closed := true }, { name := "sky130 macro place-and-route timing attempt", evidence := .recorded, closed := true }, { name := "pipelined-multiplier MAC closes timing (routed)", evidence := .recorded, closed := true }, { name := "pipelined-multiplier cell honeycomb_cell_mac (generated, golden)", evidence := .recorded, closed := true }, { name := "first routed macro cell: clean powered route, zero DRC, all nine corners met", evidence := .recorded, closed := true }, { name := "mesh transport and uniform-composition model", evidence := .proved, closed := true }, { name := "generated router and single-flit RTL from Lean DSL, golden-tested", evidence := .recorded, closed := true }, { name := "generated 1x2 multi-cell mesh RTL, host-write delivered across fabric", evidence := .recorded, closed := true }, { name := "cell-to-network aperture: net-store encodes the transport inject", evidence := .proved, closed := true }, { name := "network send is a conservative ISA extension (no regression, proved)", evidence := .proved, closed := true }, { name := "net-cell cycle model refines step and emits the packet, proved", evidence := .proved, closed := true }, { name := "dimension-order routing is deadlock-free (acyclic channel dependency)", evidence := .proved, closed := true }, { name := "generated net-cell and program-injection mesh RTL, golden-tested", evidence := .recorded, closed := true }, { name := "signoff-clean routed cell (zero DRC) and tile area", evidence := .target, closed := false }, { name := "parser-level SystemVerilog refinement", evidence := .target, closed := false }, { name := "Honeycomb silicon", evidence := .target, closed := false } ] def honeycombCellOpenLaneAttempt : SynthesisAttempt := { runDate := "2026-07-07", tool := "OpenLane v2.3.10", pdk := "sky130A open_pdks 0fe599b2afb6708d281543108caf8310912f54af", flow := "Classic through OpenROAD.STAPrePNR", runTag := "synthesis-2026-07-07-classic", boundedMinutes := 30, reachedPrePnrSta := false, yosysCheckProblems := 0, memoriesRemaining := 0, postDffCells := 318547, mappedSky130Flops := 40994, postDffSequentialAreaUm2 := "875972.627200", finalAbcCompleted := false } def honeycombCellMacroSynth : MacroSynthesisResult := { runDate := "2026-07-07", tool := "Yosys 0.52", pdk := "sky130 open_pdks 0fe599b2afb6708d281543108caf8310912f54af", flow := "synth + dfflibmap + abc; honeycomb_sram adapters blackboxed as SRAM macros", runTag := "macro-synth-2026-07-07", reachedPrePnrSta := false, checkProblems := 0, inferredMemoriesRemaining := 0, sramMacroInstances := 4, physicalSramMacros := 5, mappedCells := 16511, mappedSky130Flops := 802, stdCellLogicAreaUm2 := "125809.411200", oneSramMacroAreaUm2 := "190712.550000", finalMapCompleted := true, cycleFaithful := false } def honeycombCellSyncPnr : PnrAttempt := { runDate := "2026-07-07", tool := "OpenLane v2.3.10", pdk := "sky130A open_pdks 0fe599b2afb6708d281543108caf8310912f54af", cell := "honeycomb_cell_sync, adapters bound to sky130_sram_1kbyte_1rw1r_32x256_8", clockPeriodNs := 30, dieWidthUm := 2720, dieHeightUm := 1300, sramMacrosPlaced := 5, reachedStage := "post-CTS STA; routing not reached", nomCornerSetupMet := true, nomCornerHoldMet := true, routed := false, criticalPath := "64-bit multiply-accumulate" } def honeycombMacTiming : MacTimingRun := { runDate := "2026-07-07", tool := "OpenLane v2.3.10", pdk := "sky130A open_pdks 0fe599b2afb6708d281543108caf8310912f54af", clockPeriodNs := 25, combWorstPathNs := "26.281357", combSlackNs := "-0.777316", pipeWorstPathNs := "20.841551", pipeSlackNs := "4.871030", goldenEquivalent := true } def honeycombCellMacPnr : PnrAttempt := { runDate := "2026-07-07", tool := "OpenLane v2.3.10", pdk := "sky130A open_pdks 0fe599b2afb6708d281543108caf8310912f54af", cell := "honeycomb_cell_mac, pipelined multiplier and registered SRAM outputs, powered macros", clockPeriodNs := 29, dieWidthUm := 3100, dieHeightUm := 1800, sramMacrosPlaced := 5, reachedStage := "detailed routing 100% with zero DRC; setup and hold close across all nine corners (worst setup +1.66 ns, worst hold +0.15 ns at ss_100C_1v60)", nomCornerSetupMet := true, nomCornerHoldMet := true, routed := true, criticalPath := "sky130 SRAM access, ss_100C_1v60 slow corner" } /-- Residual signal-DRC violations after the powered `honeycomb_cell_mac` route. Zero once the SRAM macro `vccd1`/`vssd1` pins are tied through `PDN_MACRO_CONNECTIONS`; the earlier 23 were signal-into-untied-power shorts. -/ def honeycombCellMacResidualDrc : Nat := 0 def rtlReleased : Bool := true def honeycombSiliconExists : Bool := false theorem rtl_no_silicon_status : rtlReleased = true /\ honeycombSiliconExists = false := rtlReleased = true honeycombSiliconExists = false All goals completed! 🐙 theorem openlane_attempt_did_not_reach_sta : honeycombCellOpenLaneAttempt.reachedPrePnrSta = false := rfl theorem openlane_attempt_erased_inferred_memories : honeycombCellOpenLaneAttempt.memoriesRemaining = 0 := rfl theorem macro_synth_completed_mapping : honeycombCellMacroSynth.finalMapCompleted = true := rfl theorem macro_synth_kept_memories_as_macros : honeycombCellMacroSynth.inferredMemoriesRemaining = 0 /\ honeycombCellMacroSynth.sramMacroInstances = 4 := honeycombCellMacroSynth.inferredMemoriesRemaining = 0 honeycombCellMacroSynth.sramMacroInstances = 4 All goals completed! 🐙 theorem macro_synth_collapsed_flops : honeycombCellMacroSynth.mappedSky130Flops < honeycombCellOpenLaneAttempt.mappedSky130Flops := honeycombCellMacroSynth.mappedSky130Flops < honeycombCellOpenLaneAttempt.mappedSky130Flops All goals completed! 🐙 theorem macro_synth_not_cycle_faithful : honeycombCellMacroSynth.cycleFaithful = false := rfl theorem pnr_met_nominal_but_did_not_route : honeycombCellSyncPnr.nomCornerSetupMet = true /\ honeycombCellSyncPnr.routed = false := honeycombCellSyncPnr.nomCornerSetupMet = true honeycombCellSyncPnr.routed = false All goals completed! 🐙 -- The pipelined multiplier routes with positive slack at the clock the -- combinational one violates, while retiring the identical dot product. theorem mac_pipeline_closes_and_is_equivalent : honeycombMacTiming.goldenEquivalent = true := rfl -- With the multiply pipelined, the SRAM outputs registered, the macro power -- pins tied off, and a roomier floorplan, the cell is the first to route to a -- clean powered close: zero DRC and setup+hold met across all nine corners. theorem mac_cell_routes_with_timing_met : honeycombCellMacPnr.nomCornerSetupMet = true /\ honeycombCellMacPnr.routed = true /\ honeycombCellMacResidualDrc = 0 := honeycombCellMacPnr.nomCornerSetupMet = true honeycombCellMacPnr.routed = true honeycombCellMacResidualDrc = 0 All goals completed! 🐙 -- The five placed macros hold 5 KiB: four 256-entry memories, the 64-bit data -- memory being two 32-bit macros. The die was chosen loosely for easy routing. def pnrSramBits : Nat := honeycombCellSyncPnr.sramMacrosPlaced * 32 * 256 def pnrDieAreaUm2 : Nat := honeycombCellSyncPnr.dieWidthUm * honeycombCellSyncPnr.dieHeightUm theorem pnr_sram_is_forty_kibit : pnrSramBits = 40960 := pnrSramBits = 40960 All goals completed! 🐙 end Honeycomb

The status vocabulary is intentionally conservative:

  • proved means the claim is a Lean theorem in this book.

  • modeled means the claim follows from a checked analytical model and its stated constants.

  • recorded means a measured or externally observed constant is copied into the book as evidence, but the book does not reproduce the measurement.

  • target means design intent, not completed implementation.

This distinction matters because Honeycomb is meant to become hardware. The book can be exact about a processor contract today while still being explicit that parser-level RTL refinement, timing closure, physical area, and power are future work.

The recorded OpenLane run is deliberately conservative evidence, not a usable tile-area claim. It used the generated honeycomb_cell as-is, with inferred 256-entry program, scalar-data, resident-weight, and stream memories. Yosys reported zero pre-synthesis check problems and no inferred latches, but replaced all memories with registers. After DFF legalization the design contained 318547 cells and 40994 mapped sky130 flip-flops; the reported 875972.627200 square microns covers the mapped sequential cells, while the remaining combinational primitives were still before the final technology-mapped netlist. Final ABC mapping did not complete within the bounded run, so no pre-PNR timing number is recorded.

The important warning is architectural rather than cosmetic: the bare inferred-memory cell is a simulator and proof boundary, but standard-cell synthesis turns the hot storage into a very large flop-and-mux fabric. A credible physical area and timing number needs a macro-backed memory boundary.

The second run answers that warning. With the four hot memories behind honeycomb_sram adapters, the same sky130 standard-cell library, and the sky130_sram_1kbyte_1rw1r_32x256_8 macro bound as a blackbox, synthesis reaches a complete technology-mapped netlist. The program, resident-weight, and stream memories become one 32-bit SRAM macro each, and the 64-bit scalar-data memory becomes a dual-read 64-bit adapter that maps to two of the same 32×256 macros, for five physical SRAM macros in all. The mapped design keeps just 802 sky130 flip-flops for the register file and control state, down from 40994, and 16511 total mapped cells, down from 318547, with zero synthesis check problems and no inferred memories left in the logic. The standard-cell logic occupies about 125809 square microns, dominated by the 64-bit MAC datapath; each SRAM macro is about 190712 square microns, so a macro-backed tile is roughly nine-tenths SRAM by area.

This is deliberately recorded as a synthesis-shape experiment, not a cycle-faithful implementation. The proved honeycomb_sram adapter reads combinationally, while the sky130 macro is a synchronous-read SRAM. Binding the macro therefore demonstrates area and mappability at the documented boundary; a cycle-accurate macro cell needs a registered-read pipeline stage and its own refinement obligation.

That registered-read cell is the fully synchronous honeycomb_cell_sync, and a first placed-macro OpenLane run was made against it. The four adapters bound to five sky130_sram_1kbyte_1rw1r_32x256_8 macros — 5 KiB of SRAM in all: 256 words of 32 bits per macro, with the 64-bit data memory using two. The run reached synthesis, floorplan, macro placement, clock-tree synthesis, and post-CTS static timing. At a 30 ns clock the nominal corner met both setup and hold, but the slow corner left the 64-bit multiply-accumulate path several nanoseconds short even after post-CTS resizing, so routing was not attempted. The critical path is the arithmetic, not the SRAM: closing it needs a slower clock or a pipelined multiplier.

The area of that run is not a tile-area claim. The die was set to 2720 by 1300 microns, about 3.54 square millimeters, chosen loosely so the five macros and their routing had room; it is only about a third utilized. The real content is roughly one square millimeter — about 0.95 for the five SRAM macros and 0.13 for the standard-cell logic — so a tightened floorplan would be far smaller. What the run establishes is a real placed-and-clocked macro cell with an honest timing bottleneck, not a finished tile.

That bottleneck was then attacked directly. The critical path is the 32-bit signed multiply, not the accumulate: a combinational multiply-accumulate and one with the product merely registered route to essentially the same worst path, so the multiplier itself must be pipelined. Splitting the multiply into a half-width partial-product stage and a combine-and-accumulate stage — a two-cycle latency that the scheduling chapter's conservation law already proves leaves the accumulator unchanged — was placed and routed against the combinational baseline. Both were checked to retire the identical signed dot product first. At a 25 ns clock the combinational multiply-accumulate misses timing with a routed worst path of 26.3 ns (−0.78 ns slack), while the pipelined multiplier meets it with a 20.8 ns worst path (+4.87 ns slack): a roughly one-fifth shorter critical path, from a timing violation to comfortable margin, for the same arithmetic. A deeper split would shorten it further. This is the route by which the macro cell reaches timing closure — pipelining the multiply, with the kernel result already proved invariant to the added latency.

That multiplier was then folded into the cell. honeycomb_cell_mac is the fully synchronous cell with the combinational multiply replaced by the two-stage honeycomb_mul2, running each instruction over five phases — fetch, read, mul1, mul2, wb — with the accumulate in the write-back phase taking the pipelined product. It is generated from the same DSL, CI-checked, and passes the full golden program suite with identical architectural results, so the integration is correct. Placed and routed with the SRAM macros, it confirms the multiply is now off the critical path: the worst path no longer starts in the multiplier but at the instruction SRAM macro, whose clock-to-output access alone is about eleven nanoseconds, followed by the decode logic it feeds. At a 20 ns clock the cell improves on the combinational-multiply cell — from a −3.15 ns to a −2.23 ns nominal-corner worst path — but does not close, and the slow corner behaves as before, now on the SRAM path rather than the multiply. The honest lesson is that pipelining the multiply was necessary but not sufficient: the next bottleneck is the SRAM read itself, which closing requires registering the fetched instruction into its own pipeline stage so the macro's access latency stops sharing a cycle with the logic downstream of it.

That step was taken. The cell now re-registers its instruction, resident-weight, and streamed-operand SRAM outputs into standard-cell flip-flops each cycle, so the macro's roughly eleven-nanosecond clock-to-output is isolated on its own SRAM-to-register path, and decode and the multiplier both start from fast registers. This fits the same five-phase schedule -- the register consumes the slack of the read phase -- and the full golden suite still passes with identical results.

Placed and routed on five powered sky130_sram_1kbyte_1rw1r_32x256_8 macros (scripts/pnr-mac.sh), with the macros' vccd1/vssd1 pins tied to VPWR/VGND through PDN_MACRO_CONNECTIONS, detailed routing finishes 100% with zero DRC violations, and post-route static timing closes setup and hold across all nine corners at a 29 ns clock -- worst setup +1.66 ns, worst hold +0.15 ns at the slow ss100C1v60 corner, after post-GRT design repair. This is the first Honeycomb cell to reach a clean, powered physical close; earlier cells stalled in synthesis or in the post-CTS timing resizer before ever routing.

Two earlier numbers were corrected along the way. A previously-recorded "22 ns closes all corners, 15 ns nominal" timing and "twenty-three residual DRC violations" shared one root cause: the SRAM macro power pins were left unconnected, so the router drove signal wires into the untied power shapes -- the DRC shorts -- and the timing was read off an unpowered netlist, which is not a physical result. Tying the macro power pins removed the shorts and moved the honest close to 29 ns. The residual max-slew and max-capacitance violations that remain (~937 at the slow corner) are structural, on the SRAM macro pins and the clock tree, and are left for a signoff waiver or a targeted driver pass.

The 3100 by 1800 micron (5.58 mm^2) die is deliberately loose, about 21 percent utilized -- content is roughly 2.1 mm^2, about 0.95 for the five SRAM macros and 1.17 for the standard-cell logic -- and is not a tile-area claim. So the honest state is a placed, clock-tree-synthesized, and cleanly routed macro cell that closes timing at every corner on powered macros, generated from the same proved DSL and passing the same golden programs -- not yet a signoff-clean GDS. Full signoff DRC (via KLayout, since Magic's GDS reader chokes on the vendor SRAM) and a tightened floorplan are the physical steps that remain.