Record 817c78519b11
Recorded by the maintainers from the proved reference band: its design and its proof band.lean (159 code lines). One AND gate per bit: assign y = a & b;. The record shows that reference passing the whole checker. It is par, the bar to beatpar, the bar to beat, not a player's entry, and it is not ranked among the submissions (proved references).
Area
100.10µm²
100.0960 µm² exactly
Performance · time
280ps
the delay: the latest output arrival, y[0] falling
Score · area × time
28.03µm²·ns
100.0960 µm² × 280 ps
- vs par
- this design is par
- on this page
- 1st of 2 designs (tied with 1)
- board
- par, the bar to beat: never ranked
- Pareto
- on the front
No other player has a ranked record on _example yet: the beats and matches lines come with the first one.
how these numbers are measured and compared
Area: sky130 A0′, the repaired netlist. Time: NLDM, inputs driven by buf_8, 10 fF per output bit, no wires.
Area, time and score are ranked (the leaderboard orders by the score); a number tagged extra, derived or research is shown, never ranked. Fmax-equivalent = 10⁶ / time in ps, for comparison with sites that quote Fmax.
The field is the ranked records of _example's other players at this revision (0 players, 0 records), never the references, the baselines or a rejected design; advisory, recomputed at every build, never stored in a record and never used by the ranking.
“On this page” and “Pareto” compare with the 2 designs of the area-time plot (2 references): not a ranking.
Area
1.400µm²
1.39968 µm² exactly
- vs par
- this design is par
- on this page
- 1st of 3 designs (tied with 2)
- cells
- 16
- flops
- 0
- repair
- 0 buffers, 0 tie cells
- GE
- 21.328 extra
Performance · time
56ps
the delay: the latest output arrival
- vs par
- this design is par
- on this page
- 1st of 3 designs (tied with 2)
- Fmax-eq.
- 17857.1 MHz derived
- unit depth
- 1 extra
Score · area × time
0.0784µm²·ns
1.39968 µm² × 56 ps
- vs par
- this design is par
- on this page
- 1st of 3 designs (tied with 2)
- board
- par, the bar to beat: never ranked
- Pareto
- on the front
No other player has a ranked record on _example yet: the beats and matches lines come with the first one.
how these numbers are measured and compared
Area: ASAP7 A0′ (asap7_a0_v1), the same scored netlist, each gate its least-area ASAP7 build, repaired by buffering. Time: NLDM, inputs driven by BUFx8, 2.5 fF per output bit, no wires; a table read below its grid is read at its floor. ASAP7: a predictive 7 nm library, never fabricated; no wires, like sky130's score (how ASAP7 is scored, and its quirks).
Area, time and score order this view's board (by the score); the records' ranked score is sky130's, the default view; a number tagged extra, derived or research is shown, never ranked. Fmax-equivalent = 10⁶ / time in ps, for comparison with sites that quote Fmax.
The field is the ranked records of _example's other players at this revision (0 players, 0 records), never the references, the baselines or a rejected design; advisory, recomputed at every build, never stored in a record and never used by the ranking.
“On this page” and “Pareto” compare with the 3 designs of the area-time plot (3 references): not a ranking.
The sources
// svGolf task `_example` -- reference solution: N two-input AND gates.
module band #(parameter int N = 4) (
input logic [N-1:0] a,
input logic [N-1:0] b,
output logic [N-1:0] y
);
assign y = a & b;
endmodule
band.lean (159 code lines)
import Submission.Design
import SvGolf.Comb
import LeanModels.Sv.Gen2
import LeanModels.Sv.Hier2Gen
/-!
# Reference solution for task `_example` (N-bit bitwise AND): the proof
This is a submission file like any player's `Solution.lean`. The checker
generates the module `Submission.Design`, which loads the player's envelope as
`Submission.design` and names the statement to prove `Submission.Goal`
(`SvGolf.Tasks.Example.Statement Submission.design.sem`). This file proves
theorem Submission.solution : Submission.Goal
for EVERY `N` of the task's range (`1 ≤ N < 2^31`): nothing is unrolled at a fixed width and nothing is
bit-blasted. The design (`reference/band.sv`) is one continuous assign,
`assign y = a & b;`.
Route (the `Examples/system-verilog/ripple_add` recipe, copied here because
svGolf does not import `Examples`):
1. **The design at symbolic `N`** (`band_sem_processes`, `band_sem_decls`):
`instantiate2` split into its stages by `PDesign.instantiate2_of_ok`, the
one-driver guard of `name.sem` discharged by `driversOk` on the (closed)
process list.
2. **The comb profile and acyclicity** (`band_comb`, `band_acyclic`): one
whole-signal assign; it reads `a`, `b`, which no process writes.
3. **The settled state** (`band_settled`): in a solution of the equations,
known `a b : BitVec N` give `y = a &&& b` (`CombEqs.lookup_ident` and the
`Known2` calculus).
4. **The statement** (`solution`): `CombTask.satisfiedAt_of_comb`
(`SvGolf/Comb.lean`) reduces it to the interface and step 3.
-/
namespace Submission
open LeanModels.Sv SvGolf
/-! ## 1. The design at symbolic `N` -/
/-- The one process: `assign y = a & b;`. -/
def andProc : Process2 := .assign (.ident "y") (.binary .and (.ident "a") (.ident "b"))
/-- The instantiated declarations at raw port width `w` (`|N - 1| + 1`). -/
def bandDecls (w : Nat) : List Decl :=
[{ name := "a", width := w, isInput := true },
{ name := "b", width := w, isInput := true },
{ name := "y", width := w, isOutput := true }]
/-- Every declaration is 1-D: element width 1. -/
def bandElems : List (String × Nat) := [("a", 1), ("b", 1), ("y", 1)]
/-- The declaration scope: `N` bound, declared `int` (32 bits). -/
def bandScope (N : Int) : IEnv := { vals := [("N", N)], pwidths := [("N", 32)] }
/-- The parameter environment (scope plus packed geometry). -/
def bandEnv (N : Int) : IEnv :=
{ bandScope N with dims := dimTable (bandScope N) design.pdesign.decls }
theorem band_paramEnv (N : Int) : design.pdesign.paramEnv2 [N] = .ok (bandEnv N) := rfl
theorem band_buildDecls (N : Int) :
buildDecls (bandEnv N) design.pdesign.decls = .ok (bandDecls ((N - 1).natAbs + 1)) := by
simp [design.pdesign, buildDecls, instDecl, PType.width_packed_cons, PDim.width, evalInt,
bandEnv, bandScope, List.lookup, bandDecls, Gen2.except_ok_bind]
theorem band_buildElems (N : Int) :
buildElems (bandEnv N) design.pdesign.decls = .ok bandElems := by
simp [design.pdesign, buildElems, PType.width_packed_cons, PDim.width, evalInt, bandEnv,
bandScope, List.lookup, bandElems, Gen2.except_ok_bind]
theorem band_static (N : Nat) (w : Nat) :
design.pdesign.processes.map
(instProcess2 ((bandEnv N).withDecls (bandDecls w)) bandElems) = [andProc] := by
sv2_inst_simp [design.pdesign, bandEnv, bandScope, bandDecls, bandElems, andProc, dimTable,
dimTableStep, PType.width_packed_cons, PDim.width]
theorem band_instantiate2 (N : Nat) :
design.pdesign.instantiate2 [(N : Int)] (PDesign.surfaceFuel [(N : Int)]) =
.ok (design.pdesign.assemble2 (bandEnv N) (bandDecls (((N : Int) - 1).natAbs + 1))
bandElems []) :=
PDesign.instantiate2_of_ok rfl (band_paramEnv N) (band_buildDecls N) (band_buildElems N)
(by rw [show design.pdesign.generates = [] from rfl, expandList2_nil])
theorem band_processes (N : Nat) :
(design.pdesign.instantiateD2 [(N : Int)]).processes.toList = [andProc] := by
rw [PDesign.instantiateD2_of_ok (band_instantiate2 N), PDesign.assemble2_processes, band_static]
rfl
/-- The one-driver rule: closed data, decided. -/
theorem band_driversOk :
driversOk design.pdesign.declNames design.pdesign.inputNames [andProc] = true := by
decide
/-- `design.sem N` is the instantiated design (its one-driver guard passes). -/
theorem band_sem_eq (N : Nat) : design.sem N = design.pdesign.instantiateD2 [(N : Int)] := by
show design.pdesign.instantiateGD2 [(N : Int)] = _
apply PDesign.instantiateGD2_of_driversOk
rw [band_processes]
exact band_driversOk
theorem band_sem_processes (N : Nat) : (design.sem N).processes.toList = [andProc] := by
rw [band_sem_eq]
exact band_processes N
theorem band_sem_decls (N : Nat) (hN : 1 ≤ N) : (design.sem N).decls.toList = bandDecls N := by
rw [band_sem_eq, PDesign.instantiateD2_of_ok (band_instantiate2 N), PDesign.assemble2_decls]
have hw : ((N : Int) - 1).natAbs + 1 = N := by omega
rw [hw]
/-! ## 2. Comb profile and acyclicity -/
theorem band_proc {N j : Nat} {p : Process2} :
(design.sem N).processes[j]? = some p ↔ j = 0 ∧ p = andProc := by
rw [← Array.getElem?_toList, band_sem_processes]
match j with
| 0 => simp [eq_comm]
| _ + 1 => simp
theorem band_declWidth_y {N : Nat} (hN : 1 ≤ N) : (design.sem N).declWidth "y" = some N := by
simp [Design2.declWidth, band_sem_decls N hN, bandDecls]
theorem band_writes {N : Nat} (hN : 1 ≤ N) {j : Nat} {wn : Win} :
(design.sem N).Writes j wn ↔ j = 0 ∧ wn = ("y", 0, N) := by
constructor
· rintro ⟨t, e, hp, hw⟩
obtain ⟨rfl, h⟩ := band_proc.mp hp
simp only [andProc, Process2.assign.injEq] at h
obtain ⟨rfl, rfl⟩ := h
simp [Lhs2.wins, Lhs2.windows?, Lhs2.window?, band_declWidth_y hN] at hw
exact ⟨rfl, hw⟩
· rintro ⟨rfl, rfl⟩
exact ⟨_, _, band_proc.mpr ⟨rfl, rfl⟩,
by simp [Lhs2.wins, Lhs2.windows?, Lhs2.window?, band_declWidth_y hN]⟩
theorem band_comb {N : Nat} (hN : 1 ≤ N) : CombDesign (design.sem N) where
nodup := by
rw [band_sem_decls N hN]
simp [bandDecls]
assign := by
intro j p hp
obtain ⟨rfl, rfl⟩ := band_proc.mp hp
exact ⟨_, _, [("y", 0, N)], rfl, by
simp [Lhs2.windows?, Lhs2.window?, band_declWidth_y hN]⟩
inWidth := by
intro j n lo w h
obtain ⟨-, h⟩ := (band_writes hN).mp h
simp only [Prod.mk.injEq] at h
obtain ⟨rfl, rfl, rfl⟩ := h
exact ⟨_, band_declWidth_y hN, by omega⟩
notInput := by
rintro n ⟨j, lo, w, h⟩
obtain ⟨-, h⟩ := (band_writes hN).mp h
simp only [Prod.mk.injEq] at h
obtain ⟨rfl, -, -⟩ := h
simp [Design2.inputNames, band_sem_decls N hN, bandDecls]
disjoint := by
intro i j wi wj hij hi hj
obtain ⟨rfl, -⟩ := (band_writes hN).mp hi
obtain ⟨rfl, -⟩ := (band_writes hN).mp hj
exact absurd rfl hij
selfDisjoint := by
intro j t e hp
obtain ⟨-, h⟩ := band_proc.mp hp
simp only [andProc, Process2.assign.injEq] at h
obtain ⟨rfl, -⟩ := h
exact Lhs2.wins_pairwise_of_leaf (fun _ h => by cases h) _
rhsFree := by
intro j t e hp
obtain ⟨-, h⟩ := band_proc.mp hp
simp only [andProc, Process2.assign.injEq] at h
obtain ⟨-, rfl⟩ := h
rfl
rhsDeclared := by
intro j t e hp
obtain ⟨-, h⟩ := band_proc.mp hp
simp only [andProc, Process2.assign.injEq] at h
obtain ⟨-, rfl⟩ := h
simp [Expr2.idents, band_sem_decls N hN, bandDecls]
initWidth := by
intro n _ dc hdc _ v hv
rw [band_sem_decls N hN] at hdc
simp [bandDecls] at hdc
rcases hdc with rfl | rfl | rfl <;> cases hv
inFourState := by
intro dc hdc _
rw [band_sem_decls N hN] at hdc
simp [bandDecls] at hdc
rcases hdc with rfl | rfl | rfl <;> rfl
/-- Rank 0 for the one process: it reads `a` and `b`, which nothing writes. -/
theorem band_acyclic {N : Nat} (hN : 1 ≤ N) : Acyclic (design.sem N) := by
refine ⟨fun _ => 0, ?_⟩
intro i j ti ei tj ej wj hi hj hw hex
obtain ⟨rfl, h⟩ := band_proc.mp hi
simp only [andProc, Process2.assign.injEq] at h
obtain ⟨-, rfl⟩ := h
obtain ⟨-, rfl⟩ := (band_writes hN).mp ⟨tj, ej, hj, hw⟩
simp [Expr2.reads, ReadWin.overlaps] at hex
/-! ## 3. The settled state -/
/-- In every shaped solution of the design's equations, known `a`, `b` give
`y = a &&& b`. -/
theorem band_settled {N : Nat} (hN : 1 ≤ N) {st : SvState} (heqs : CombEqs (design.sem N) st)
(hs : StateShape (design.sem N) st) {x z : BitVec N}
(ha : SvState.lookup st "a" = some (LVec.ofBitVec x))
(hb : SvState.lookup st "b" = some (LVec.ofBitVec z)) :
SvState.lookup st "y" = some (LVec.ofBitVec (x &&& z)) := by
have hy := CombEqs.lookup_ident (band_comb hN) heqs hs (band_proc.mpr ⟨rfl, rfl⟩)
(evalPure2_and_ofBitVec (evalPure2_ident_ofBitVec ha) (evalPure2_ident_ofBitVec hb))
(band_declWidth_y hN)
rw [LVec.resizeU_ofBitVec, BitVec.setWidth_eq] at hy
exact hy
/-! ## 4. The statement -/
theorem band_interface (N : Nat) (hN : 1 ≤ N) :
SvGolf.Tasks.Example.task.Interface N (design.sem N) := by
simp [CombTask.Interface, inputPorts, outputPorts, band_sem_decls N hN, bandDecls,
SvGolf.Tasks.Example.task]
/-- **The reference solution**: the `_example` statement, for every `N` in range (`1 ≤ N < 2^31`). -/
theorem solution : Goal := by
intro N hN
have hN' : 1 ≤ N := hN.1
refine CombTask.satisfiedAt_of_comb (band_interface N hN') (band_comb hN') (band_acyclic hN') ?_
intro st heqs hs v hv
obtain ⟨x, z, ⟨⟩⟩ := v
simp only [SvGolf.Tasks.Example.task, HoldAll_cons, HoldAll_nil, and_true] at hv ⊢
exact band_settled hN' heqs hs hv.1 hv.2
end Submission
The netlist
The netlist card shows the sky130 weighing (its cells, its critical path): the ASAP7 view changes the overview above, not this card.
Schematic
drawn at N = 4
Drawn at N = 4, a display instance; scored at N = 16. Only this drawing and the notes under it are at the smaller size: the critical path, the cells and every other number on this page are the scored netlist's.
It is the same design through the same pinned flow at a smaller size (ppa.py --param), so that what it does can be seen: 4 cells here, 16 at the scoring point. The critical path at N = 4 (1 cell, ending at y[0] falling, 280 ps there) is in the accent colour. Drawn by netlistsvg with svGolf's sky130 skin (derived from netlistsvg's default skin, as the drawing is: MIT licence, Copyright (c) 2016 Neil Turley, the notice): one symbol per cell function, the cell above it, the instance on hover; nor2b and nand2b are drawn with the bubble on their inverted input. The cells of the path are listed under Critical path, each a link to the cell here.
The netlist at N = 4: 4 cells, 4 and2_1. There (measured, not ranked): 25.02 µm², 280 ps. Open the drawing on its own (SVG, 5.0 KB) to pan and zoom it with the browser's own controls.
Critical path
at N = 16 · scored
The path the ranked delay ends on, at the scoring point N = 16: 2 nets, 1 cell, to y[0] falling at 280 ps. Each row is a net of the repaired netlist with the arrival and the transition the STA computed there (NLDM tables, the larger transition carried; no wires). The first row is an input: its arrival is the input driver's own delay (buf_8 fed by a 50 ps ramp). From ppa.py --path (critical_path_timing); the instance names are the scored netlist's, not the schematic's (drawn at a smaller size).
In the schematic, drawn at N = 4, the critical path is 1 cell to y[0] falling (280 ps there); each cell is a link to it in the drawing:
a[0]_0_and2_1y[0]
| # | net | edge | driven by | cell | arrival (ps) | transition (ps) | stage (ps) |
|---|---|---|---|---|---|---|---|
| 0 | a[0] | fall | input port | – | 108.3 | 18.4 | |
| 1 | y[0] | fall | _13_ | and2_1 | 279.6 | 66.6 | 171.3 |
Cells
at N = 16 · scored
| cell | count | µm² each | µm² in all | share |
|---|---|---|---|---|
and2_1 | 16 | 6.2560 | 100.0960 | 100.0% |
| total | 16 | 100.0960 |
Repair (buffer_trees_v1): 0 buffers on 0 nets, 0 tie cells, 1 weighing round; nothing is resized.
Legality: worst load 0.063 × max_capacitance, worst transition 0.074 × max_transition; 0 timing-table reads outside the characterized grid.
the gate mix of the extra GE column (the pinned GE table, score/ge.json)
| cell | count | GE each | GE total |
|---|---|---|---|
AND | 16 | 1.333 | 21.328 |
| total | 16 | 21.328 |
The record
- task
_example- player
- svgolf-reference
- assisted by
- Claude (Anthropic)
- submitted
- 2026-11-07
- notes
- reference solution
- scoring point
- N = 16
- design
band.svsha25669299388b006f49d94180cdf29fad24c02995b1f727e5ce458910e60c09816ff- proof
band.leansha2564a7b050a40cf22a75cdac8dd5f4b981436211832d3f595aa2533bd6e3155e6be: the proof of the referenceband(band.lean, 159 code lines)- canonical text
- sha256
bc2ef59e283b225af14f7520ae0600da799509b81360fcd5098e0400ecd2d76e - record hash
817c78519b1127c4ab22cc9e5ebbc3bb3b37e6a56ac0c9199013d4e2e2dffb85- downloads
817c78519b11.sv817c78519b11.lean817c78519b11.json
The proof
- code lines
- 159
- build time
- 16.78 s
- axioms
Classical.choice,Quot.sound,propext- tactics seen
decide,omega,simp- imports
Submission.Design,SvGolf.Comb,LeanModels.Sv.Gen2,LeanModels.Sv.Hier2Gen
Checker and flow
Checked under the pinned flow of this site's boards.
- Yosys
Yosys 0.53 (git sha1 53c22ab7c0ced80861c7536c5dae682c30fb5834, clang++ 17.0.0 -fPIC -O3)- Verilator
Verilator 5.042 2025-11-02 rev UNKNOWN.REV- Lean toolchain
leanprover/lean4:v4.33.0-rc1- svGolf revision
d1f3cae6f01a088007a57b31ff8baa6b839d6f74- lean-surfaces revision
d1f3cae6f01a088007a57b31ff8baa6b839d6f74- canonicalization script
bbd11227d45dc1365f27597fd45c565fe721ba2648450588fc4fd983d00b367b- scoring script
ea58219d8ef14c3bad265218ee266ccdb709ac9d4dc5258edc34d51ee83a0445- GE table
6a29196a3f4b58241f4c9af650c9141e4632b737214d563a11ba142a725c4bea- extractor
4930696021c588c75dc890034c534c95560ad9a28a4955b87d1f8d68b5edbc0c- canonical RTLIL
08912da22756e668b8774aaddd737194b0151352c218ecf464f800b86c1cace7
the checker's files (sha256)
| file | sha256 |
|---|---|
check.py | e708084f72f955b0ae1aaabe469dba3eacc5a91484a1ed81bcc073b60f3c0b6d |
check/ | 3145eb578ca71e452eff05a398e8ad04673e6c72ca5343b234cb22e2cefe65a6 |
check/ | fb51d72510b515460866c2798aad3c6f55295536e627b92854c3580af215bb91 |
check/ | 73856a45905724544247ad29042bdc2f1778271ec07b15cdb3a5f214685165c1 |
check/ | 076db01a9791bcc25ee84e9b0033604a4b675f00b212eab0c864078e6a4748b7 |
check/ | 4e1ee2110c63f24e033dd689c929ea686ddf10f4db23b9057c6fb711394c7558 |
lakefile.toml | f35a88404367d22906effc14d644aac9a9cad47dfd3b704ea8fec88acfaf9c4d |
lean-toolchain | 62c2d9c0fc1ec4c67e151c11eff41ca004ef38e179cf9476c230406e6defedef |
score/ | f18c14c23a14d55db63e202f42cc424dc84c1dd1c337f132ad60859dc9d5d33a |
score/ | bbd11227d45dc1365f27597fd45c565fe721ba2648450588fc4fd983d00b367b |
score/ | 95332451ae3754226fb87b46027385b46a91121e7eb9ae25b302bce756d90475 |
score/ | 6a29196a3f4b58241f4c9af650c9141e4632b737214d563a11ba142a725c4bea |
score/ | 54b93ca63888009d0671c8978e8ab7bf4fb8ce303bc78d3b4e1f83d946cc3201 |
score/ | 912031912c3e3f6790725161753e95415df34846bd8c27dde3eb707747ddbcbe |
score/ | 93547b343dbac135737e98516b1004a780e1cf2f579e1bd7fed82c908c6d4125 |
score/ | 4b8688ba3f4d67681658e5944afe878592adf588cd416a8b47597ebe06deb045 |
score/ | d66a6086a37a97f5985266057051979fb6a8a3c557d3ef9c42acc1b5e41502d8 |
score/ | 71d2e3b82f8813ec64a58f0a46909ca23dfab377db44eda6f294b713f45ae781 |
score/ | 11952f61058051c9e8de91a801b672d07e66a29308e978156c04ffd9f0dbef45 |
score/ | ea58219d8ef14c3bad265218ee266ccdb709ac9d4dc5258edc34d51ee83a0445 |
score/ | c3874dbfc85921a87df6eacdfc6b2c9a0e2b34edd5738951e0d8bdb51f4558b2 |
Post-synthesis check
ls-sv's reading of the design and the scored netlist, simulated on the same vectors, agreed on every one. The vectors are a sample of the inputs: a guard against the two tools disagreeing, not a proof.
- mode
- full
- vectors
- 4130
- full set
- 4130
- mismatches
- 0
- point
- N=16
- seed
df510cae7dcce83cb90883f314db9062018493d5b234c0cf17906c3f957eb5a4- salted
- no
Area against time
- proved reference
- the Pareto front of the entries
- this design
- par's score: area × time = 28.03 µm²·ns
the designs as numbers, by score
| design | kind | area (µm²) | time (ps) | score (µm²·ns) |
|---|---|---|---|---|
band · this design | proved reference · par | 100.10 | 280 | 28.03 |
band_lp | proved reference | 100.10 | 280 | 28.03 |
- proved reference
- the Pareto front of the entries
- this design
- par's score: area × time = 0.0784 µm²·ns
the designs as numbers, by score
| design | kind | area (µm²) | time (ps) | score (µm²·ns) |
|---|---|---|---|---|
band · this design | proved reference · par | 1.400 | 56 | 0.0784 |
band_lp | proved reference | 1.400 | 56 | 0.0784 |
band_tactics | proved reference | 1.400 | 56 | 0.0784 |
Reproduce and verify
From svgolf/, with the pinned tools (reproduce a score lists them):
# the ranked numbers, at the scoring point (from svgolf/, with the pinned Yosys and liberty)
python3.12 score/ppa.py tasks/_example/reference/band.sv --task tasks/_example --path \
--json out.json --netlist scored.v --repaired-netlist repaired.v
Expect, in out.json:
- score.rtlil_sha256
08912da22756e668b8774aaddd737194b0151352c218ecf464f800b86c1cace7- ppa.netlist_sha256
d6499297a145c23b802c40766f239336d8a15ea1462d342d3656dfc82ff0ae52- ppa.repair.netlist_sha256
28a4d30c1807e8485a142102f5681ec21310c41266ebe9feb8aed005d456387d- ppa.area_e4um2_sky130
1000960- ppa.delay_ps_sky130
280
The schematic and the critical-path data are site/schematics/_example/69299388b006f49d.json and its .svg, written by site/gen_schematics.py (the display instance is ppa.py ... --param N=4 --repaired-netlist, drawn by netlistsvg 1.0.2; repaired netlist sha256 bbbff5e1613dcf43…).
From svgolf/, with the pinned tools (reproduce a score lists them):
# the ASAP7 view's numbers, at the scoring point (from svgolf/, with the pinned Yosys; once:
# python3.12 score/ppa.py --pdk asap7 --fetch-liberty, the five pinned ASAP7 files into score/lib/asap7/)
python3.12 score/ppa.py tasks/_example/reference/band.sv --task tasks/_example --pdk asap7 --no-mapped \
--json out.json
Expect, in out.json:
- ppa.netlist_sha256
d6499297a145c23b802c40766f239336d8a15ea1462d342d3656dfc82ff0ae52- ppa.repair.netlist_sha256
38596d52847c91d7e7fd70188696e9e46d40313f3f301d368705a0864dcb4902- ppa.area_e5um2_asap7
139968- ppa.delay_ps_asap7
56
leaderboard/asap7/_example.json keeps these numbers; python3.12 leaderboard/leaderboard.py asap7 --rescore --task _example weighs every design of the task again and compares, bit for bit.
Verify the record
Download the three files, then from svgolf/:
# re-run the whole check on this record's files (the cost of the original check)
H=817c78519b1127c4ab22cc9e5ebbc3bb3b37e6a56ac0c9199013d4e2e2dffb85
mkdir -p rec/_example && cp "$H.json" "$H.sv" "$H.lean" rec/_example/
python3.12 leaderboard/leaderboard.py verify --data-dir rec --task _example --full
verify --offline checks only the hashes and the arithmetic; plain verify also rescores the design (no Lean; seconds for most designs, a minute or more for the largest), on sky130 and on ASAP7.