Reference add_proc_m
A proved reference of add, written or adapted by the maintainers and shipped with the task: its design and its proof add_proc_m.lean (115 code lines). The same adder with the whole bit cell, carry and sum, in one always_comb block. It is shown with parshown with par, never a player's entry (proved references).
Area
460.44µm²
460.4416 µm² exactly
Beats 100% · matches 0%
1 of 1 other player beaten, 0 equal.
- vs par
- ±0% equaladd_n · 460.44 µm²
- on this page
- 1st of 10 designs (tied with 4)
- cells
- 80
- flops
- 0
- repair
- 0 buffers, 0 tie cells
- GE
- 112 extra
Performance · time
2 611ps
the delay: the latest output arrival, s[15] rising
Beats 0% · matches 0%
0 of 1 other player beaten, 0 equal.
- vs par
- ±0% equaladd_n · 2 611 ps
- on this page
- 5th of 10 designs (tied with 4)
- Fmax-eq.
- 383.0 MHz derived
- critical path
- 32 cells
- unit depth
- 33 extra
Score · area × time
1202µm²·ns
460.4416 µm² × 2 611 ps
Beats 0% · matches 0%
0 of 1 other player beaten, 0 equal.
- vs par
- ±0% equaladd_n · 1202 µm²·ns
- on this page
- 2nd of 10 designs (tied with 4)
- board
- a proved reference, shown with par: never ranked
- Pareto
- on the front
On the board, of 1 other player: 0 beaten, 0 level, 1 trade off, 0 ahead.
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 add's other players at this revision (1 player, 1 record), never the references, the baselines or a rejected design; each player counts once, at their best, and ties are exact at the recorded unit; advisory, recomputed at every build, never stored in a record and never used by the ranking.
On the board, another player is beaten when this design dominates every record of theirs, level when none of theirs is better and one is identical (the rest dominated), ahead when a record of theirs dominates this design, and a trade off otherwise (one of theirs better on one axis, worse on the other).
“On this page” and “Pareto” compare with the 10 designs of the area-time plot (5 references, 1 submission and 4 baselines): not a ranking.
Area
6.998µm²
6.99840 µm² exactly
Beats 100% · matches 0%
1 of 1 other player beaten, 0 equal.
- vs par
- ±0% equaladd_n · 6.998 µm²
- on this page
- 1st of 10 designs (tied with 4)
- cells
- 80
- flops
- 0
- repair
- 0 buffers, 0 tie cells
- GE
- 112 extra
Performance · time
563ps
the delay: the latest output arrival
Beats 0% · matches 0%
0 of 1 other player beaten, 0 equal.
- vs par
- ±0% equaladd_n · 563 ps
- on this page
- 5th of 10 designs (tied with 4)
- Fmax-eq.
- 1776.2 MHz derived
- unit depth
- 33 extra
Score · area × time
3.94µm²·ns
6.99840 µm² × 563 ps
Beats 100% · matches 0%
1 of 1 other player beaten, 0 equal.
- vs par
- ±0% equaladd_n · 3.94 µm²·ns
- on this page
- 2nd of 10 designs (tied with 4)
- board
- a proved reference, shown with par: never ranked
- Pareto
- on the front
On the board, of 1 other player: 0 beaten, 0 level, 1 trade off, 0 ahead.
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 add's other players at this revision (1 player, 1 record), never the references, the baselines or a rejected design; each player counts once, at their best, and ties are exact at the recorded unit; advisory, recomputed at every build, never stored in a record and never used by the ranking.
On the board, another player is beaten when this design dominates every record of theirs, level when none of theirs is better and one is identical (the rest dominated), ahead when a record of theirs dominates this design, and a trade off otherwise (one of theirs better on one axis, worse on the other).
“On this page” and “Pareto” compare with the 10 designs of the area-time plot (5 references, 1 submission and 4 baselines): not a ranking.
The sources
// svGolf task `add`, reference solution (WP-G S1b): the same ripple-carry adder as add_proc.sv with the
// WHOLE bit cell in ONE `always_comb` body that writes two windows, c[i+1] and s[i]. p[i] is the propagate bit;
// when p[i] the carry out is the carry in, otherwise the operands agree and the carry is their common value a[i].
// c[i] is the carry INTO bit i; c[0] = cin, cout = c[N].
module add_n #(parameter int N = 16) (
input logic [N-1:0] a, b,
input logic cin,
output logic [N-1:0] s,
output logic cout
);
logic [N:0] c;
logic [N-1:0] p;
assign c[0] = cin;
genvar i;
generate
for (i = 0; i < N; i++) begin : g_bit
assign p[i] = a[i] ^ b[i];
always_comb begin
if (p[i]) c[i+1] = c[i];
else c[i+1] = a[i];
s[i] = p[i] ^ c[i];
end
end
endgenerate
assign cout = c[N];
endmodule
add_proc_m.lean (115 code lines)
import Submission.Design
import SvGolf.Comb
import LeanModels.Sv.CombProcTactic
import LeanModels.Sv.CombLib
import LeanModels.Sv.ProcNoQualified
/-!
# Reference solution for task `add` with the whole bit cell in ONE `always_comb` body (WP-G S1b, gate d)
The design is `reference/add_proc_m.sv`: the ripple-carry adder of `reference/add_proc.sv` with the carry cell AND the
sum bit in a single body, `if (p[i]) c[i+1] = c[i]; else c[i+1] = a[i]; s[i] = p[i] ^ c[i];`: one `always_comb` that
writes TWO windows, `c[i+1]` and `s[i]`. `Design2.lowerComb` turns it into the one assign `{c[i+1], s[i]} = {…, …}`.
**The proof below is `reference/add_proc.lean`'s, character for character** (everything after this comment;
`tests/add/same_proof.py` pins that). `sv_equations` states one equation and one knownness fact per WINDOW and names
them by the signal they write and the ordinal of the window among the windows that write it, so this design has the
aliases `eq_c_1`, `eq_p_1`, `eq_c_2`, `eq_s_1`, `eq_cout_1` (and the `known_` twins) with the SAME statements as the
split design's: a proof written against the aliases of one holds for the other unchanged. The structure theorem is
the same too: the rank of the cell is its bit's, whether the cell writes one window or two.
-/
namespace Submission
open LeanModels.Sv LeanModels.Sv.CombView LeanModels.Sv.CombLib LeanModels.Sv.CombEq SvGolf
/-! ## 0. The bridge from the lowered design -/
/-- A design that lowers has the declarations of its lowering. -/
theorem lowerComb_decls {d d' : Design2} (h : d.lowerComb = some d') : d'.decls = d.decls := by
unfold Design2.lowerComb at h
rcases hp : d.lowerProcs d.processes.toList with _ | ps
· simp [hp] at h
· simp only [hp, Option.map_some, Option.some.injEq] at h
rw [← h]
/-- **The task's statement for a design that lowers**: the interface of the design, the comb profile and
acyclicity of its lowering, no qualified `case` in the design (`hnq`, from `NoQ.sem_noQ`), and ONE settled-state
lemma about the lowering give `SatisfiedAt`. -/
theorem satisfiedAt_of_lowered {t : CombTask} {N : Nat} {d d' : Design2}
(hI : t.Interface N d) (hl : d.lowerComb = some d') (hd : CombDesign d') (ha : Acyclic d')
(hnq : d.processes.toList.any Process2.hasQualifiedCase = false)
(hset : ∀ st, CombEqs d' st → StateShape d' st → ∀ v, HoldAll st (t.inputs N) v →
HoldAll st (t.outputs N) (t.fn N v)) :
t.SatisfiedAt N d := by
obtain ⟨hph, -, -⟩ := Design2.lowerComb_phases hl
refine ⟨hI, ⟨unclocked_of_edgeIndices hph, ⟨d', hl, ha⟩, Terminates2.of_lowerComb_acyclic hl hd ha hnq⟩,
?_⟩
apply Models2.of_combProc_inputs hl hd (hnq := hnq)
intro stim tr h c inputs st hi hc v hv
obtain ⟨heqs, hs, hin⟩ := h c st hc
refine hset st heqs hs v (hv.transfer fun n hn val hval => hin inputs hi n ?_ val hval)
have hdec : d'.inputNames = d.inputNames := by simp [Design2.inputNames, lowerComb_decls hl]
rw [hdec, ← inputPorts_map_fst, hI.1]
exact hn
/-! ## 1. Structure: `sv_structure` -/
/-- `CombDesign` and `Acyclic` of the lowered design for every `N ≥ 1`, from ONE round of obligations: the
rank is the player's. `p[i]` has rank 0, the carry cell and the sum cell of bit `i` rank `i + 1`, the
carry-out `N + 1`. -/
theorem add_struct (N : Nat) (hN : 1 ≤ N) :
∃ d', (design.sem N).lowerComb = some d' ∧ CombDesign d' ∧ Acyclic d' := by
sv_structure (rank := rippleRank (fun p => if p = 0 then 0 else N + 1)
(fun _ pos i => if pos = 0 then 0 else i.toNat + 1))
all_goals (intros; omega)
/-! ## 2. The ports (the task's `Interface`) -/
theorem add_interface (N : Nat) (hN : 1 ≤ N) {d'} (hl : (design.sem N).lowerComb = some d') :
SvGolf.Tasks.Add.task.Interface N (design.sem N) := by
sv_interface
/-! ## 3. The arithmetic -/
/-- A 1-bit vector is the `ofBool` of its only bit. -/
theorem bv1_eq_ofBool (v : BitVec 1) : v = BitVec.ofBool (v.getLsbD 0) := by
apply BitVec.eq_of_getLsbD_eq
intro i hi
obtain rfl : i = 0 := by omega
simp
/-- **The player's arithmetic.** From the five equations of the netlist (as `sv_equations` states them: the
carry cell's equation is the body's `if`) and the knownness of `s` and `cout`: the task's outputs. -/
theorem add_final {N : Nat} {st : SvState} {x y : BitVec N} {c0 : Bool}
(hA : SvState.lookup st "a" = some (LVec.ofBitVec x))
(hB : SvState.lookup st "b" = some (LVec.ofBitVec y))
(hCi : SvState.lookup st "cin" = some (LVec.ofBitVec (BitVec.ofBool c0)))
(e0 : st.boolAt "c" 0 = st.boolAt "cin" 0)
(ep : ∀ i, i < N → st.boolAt "p" i = (st.boolAt "a" i ^^ st.boolAt "b" i))
(estep : ∀ i, i < N → st.boolAt "c" (i + 1) =
if st.boolAt "p" i = true then st.boolAt "c" i else st.boolAt "a" i)
(esum : ∀ i, i < N → st.boolAt "s" i = (st.boolAt "p" i ^^ st.boolAt "c" i))
(eout : st.boolAt "cout" 0 = st.boolAt "c" N)
{vs : LVec} (hs : SvState.lookup st "s" = some vs) (hsw : vs.width = N)
(hks : ∀ k, k < N → KnownBit st "s" k)
{vc : LVec} (hc : SvState.lookup st "cout" = some vc) (hcw : vc.width = 1)
(hkc : KnownBit st "cout" 0) :
SvState.lookup st "s" = some (LVec.ofBitVec
(BitVec.ofNat N (x.toNat + y.toNat + c0.toNat))) ∧
SvState.lookup st "cout" = some (LVec.ofBitVec
(BitVec.ofNat 1 ((x.toNat + y.toNat + c0.toNat) / 2 ^ N))) := by
have hvs := SvState.lookup_eq_ofBitVec_bv hs hsw hks
have hvc := SvState.lookup_eq_ofBitVec_bv hc hcw (fun k hk => by
obtain rfl : k = 0 := by omega
exact hkc)
rw [hvs] at hs
rw [hvc] at hc
have hxb : XF.bv 1 (st.boolAt "cout") = BitVec.ofBool (st.boolAt "cout" 0) := by
apply BitVec.eq_of_getLsbD_eq
intro i hi
obtain rfl : i = 0 := by omega
rw [XF.getLsbD_bv hi]; simp
have ba : ∀ i, i < N → st.boolAt "a" i = x.getLsbD i := fun i hi => SvState.boolAt_ofBitVec hA hi
have bb : ∀ i, i < N → st.boolAt "b" i = y.getLsbD i := fun i hi => SvState.boolAt_ofBitVec hB hi
have bci : st.boolAt "cin" 0 = c0 := by
rw [SvState.boolAt_ofBitVec hCi (by omega)]; simp
have hv : AddView N x y c0 (fun i => st.boolAt "c" i) (XF.bv N (st.boolAt "s")).getLsbD
(st.boolAt "cout" 0) := by
refine ⟨by simpa [bci] using e0, fun i hi => ?_, fun i hi => ?_, by rw [eout]⟩
· -- the carry cell: `if p then c else a` is the majority, for `p = a ^ b`
have h1 := estep i hi
rw [ep i hi, ba i hi, bb i hi] at h1
simp only [h1]
generalize x.getLsbD i = a
generalize y.getLsbD i = b
generalize st.boolAt "c" i = c
cases a <;> cases b <;> cases c <;> decide
· rw [XF.getLsbD_bv hi, esum i hi, ep i hi, ba i hi, bb i hi]
obtain ⟨h1, h2⟩ := add_spec hv
rw [hs, h1, hc, hxb, h2]
exact ⟨rfl, rfl⟩
/-! ## 4. The statement -/
/-- **The reference solution**: the `add` statement, for every `N ≥ 1`. -/
theorem solution : Goal := by
intro N hN
have hN' : 1 ≤ N := hN.1
obtain ⟨d', hl, hc, ha⟩ := add_struct N hN'
refine satisfiedAt_of_lowered (add_interface N hN' hl) hl hc ha (NoQ.sem_noQ (by decide) _) ?_
intro st heqs hs v hv
obtain ⟨x, y, ci, ⟨⟩⟩ := v
obtain ⟨c0, rfl⟩ : ∃ c0, ci = BitVec.ofBool c0 := ⟨_, bv1_eq_ofBool ci⟩
simp only [SvGolf.Tasks.Add.task, HoldAll_cons, HoldAll_nil, and_true, BitVec.toNat_ofBool]
at hv ⊢
obtain ⟨hA, hB, hCi⟩ := hv
sv_equations
· obtain ⟨⟨vs, hvs, hvsw⟩, -⟩ := known_s_1 0 (by omega)
obtain ⟨⟨vc, hvc, hvcw⟩, hkc⟩ := known_cout_1
exact add_final hA hB hCi eq_c_1 eq_p_1 eq_c_2 eq_s_1 eq_cout_1 hvs
(by omega) (fun k hk => (known_s_1 k hk).2) hvc hvcw hkc
all_goals first
| (intros; omega)
| sv_cover
| (refine inKnown_ofBitVec hA ?_; omega)
| (refine inKnown_ofBitVec hB ?_; omega)
| (refine inKnown_ofBitVec hCi ?_; omega)
/--
info: 'Submission.solution' depends on axioms: [propext, Classical.choice, Quot.sound]
-/
#guard_msgs (whitespace := lax) in
#print axioms solution
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: 20 cells here, 80 at the scoring point. The critical path at N = 4 (8 cells, ending at s[3] rising, 970 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: 20 cells, 12 nand2_1, 8 xor2_1. There (measured, not ranked): 115.11 µm², 970 ps. Open the drawing on its own (SVG, 15.2 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: 33 nets, 32 cells, to s[15] rising at 2 611 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 8 cells to s[3] rising (970 ps there); each cell is a link to it in the drawing:
b[0]_49_xor2_1_50_nand2_1_51_nand2_1_53_nand2_1_54_nand2_1_56_nand2_1_57_nand2_1_64_xor2_1s[3]
| # | net | edge | driven by | cell | arrival (ps) | transition (ps) | stage (ps) |
|---|---|---|---|---|---|---|---|
| 0 | b[0] | fall | input port | – | 114.4 | 22.5 | |
| 1 | _144_ | rise | _193_ | xor2_1 | 302.4 | 190.5 | 188.0 |
| 2 | _145_ | fall | _194_ | nand2_1 | 374.2 | 45.9 | 71.8 |
| 3 | _146_ | rise | _195_ | nand2_1 | 461.4 | 80.1 | 87.2 |
| 4 | _148_ | fall | _197_ | nand2_1 | 511.0 | 45.9 | 49.6 |
| 5 | _149_ | rise | _198_ | nand2_1 | 598.2 | 80.1 | 87.2 |
| 6 | _151_ | fall | _200_ | nand2_1 | 647.7 | 45.9 | 49.5 |
| 7 | _152_ | rise | _201_ | nand2_1 | 734.9 | 80.1 | 87.2 |
| 8 | _154_ | fall | _203_ | nand2_1 | 784.5 | 45.9 | 49.6 |
| 9 | _155_ | rise | _204_ | nand2_1 | 871.7 | 80.1 | 87.2 |
| 10 | _157_ | fall | _206_ | nand2_1 | 921.3 | 45.9 | 49.6 |
| 11 | _158_ | rise | _207_ | nand2_1 | 1 008.5 | 80.1 | 87.2 |
| 12 | _160_ | fall | _209_ | nand2_1 | 1 058.1 | 45.9 | 49.6 |
| 13 | _161_ | rise | _210_ | nand2_1 | 1 145.3 | 80.1 | 87.2 |
| 14 | _163_ | fall | _212_ | nand2_1 | 1 194.8 | 45.9 | 49.5 |
| 15 | _164_ | rise | _213_ | nand2_1 | 1 282.0 | 80.1 | 87.2 |
| 16 | _166_ | fall | _215_ | nand2_1 | 1 331.6 | 45.9 | 49.6 |
| 17 | _167_ | rise | _216_ | nand2_1 | 1 418.8 | 80.1 | 87.2 |
| 18 | _169_ | fall | _218_ | nand2_1 | 1 468.4 | 45.9 | 49.6 |
| 19 | _170_ | rise | _219_ | nand2_1 | 1 555.6 | 80.1 | 87.2 |
| 20 | _172_ | fall | _221_ | nand2_1 | 1 605.2 | 45.9 | 49.6 |
| 21 | _173_ | rise | _222_ | nand2_1 | 1 692.4 | 80.1 | 87.2 |
| 22 | _175_ | fall | _224_ | nand2_1 | 1 741.9 | 45.9 | 49.5 |
| 23 | _176_ | rise | _225_ | nand2_1 | 1 829.1 | 80.1 | 87.2 |
| 24 | _115_ | fall | _227_ | nand2_1 | 1 878.7 | 45.9 | 49.6 |
| 25 | _116_ | rise | _228_ | nand2_1 | 1 965.9 | 80.1 | 87.2 |
| 26 | _118_ | fall | _230_ | nand2_1 | 2 015.5 | 45.9 | 49.6 |
| 27 | _119_ | rise | _231_ | nand2_1 | 2 102.7 | 80.1 | 87.2 |
| 28 | _121_ | fall | _233_ | nand2_1 | 2 152.3 | 45.9 | 49.6 |
| 29 | _122_ | rise | _234_ | nand2_1 | 2 239.5 | 80.1 | 87.2 |
| 30 | _124_ | fall | _236_ | nand2_1 | 2 289.0 | 45.9 | 49.5 |
| 31 | _125_ | rise | _237_ | nand2_1 | 2 376.2 | 80.1 | 87.2 |
| 32 | _113_ | rise | _256_ | xor2_1 | 2 611.5 | 247.2 | 235.3 |
Cells
at N = 16 · scored
| cell | count | µm² each | µm² in all | share |
|---|---|---|---|---|
xor2_1 | 32 | 8.7584 | 280.2688 | 60.9% |
nand2_1 | 48 | 3.7536 | 180.1728 | 39.1% |
| total | 80 | 460.4416 |
Repair (buffer_trees_v1): 0 buffers on 0 nets, 0 tie cells, 1 weighing round; nothing is resized.
Legality: worst load 0.13 × max_capacitance, worst transition 0.165 × 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 |
|---|---|---|---|
NAND | 48 | 1.000 | 48.000 |
XOR | 32 | 2.000 | 64.000 |
| total | 80 | 112.000 |
The reference
- task
add- design
add_proc_m.svsha2562c38a1b41f8793d4d0b8c54298e59cb0e234601e734f30e12fc9d626c177e3dc- proof
add_proc_m.lean, 115 code lines- tactics seen
decide,omega,simp,sv_cover,sv_equations,sv_interface,sv_structure- same design as
- –
- recorded
- no: the checker's run details (build time, axioms, the post-synthesis vectors) are kept for recorded designs only
- downloads
add_proc_m.svadd_proc_m.lean
Area against time
- submission
- proved reference
- baseline (not proved)
- baseline with a banned operator
- the Pareto front of the entries
- this design
- par's score: area × time = 1202 µm²·ns
the designs as numbers, by score
| design | kind | area (µm²) | time (ps) | score (µm²·ns) |
|---|---|---|---|---|
| select-six | submission | 474.20 | 2 479 | 1176 |
add_n | proved reference · par | 460.44 | 2 611 | 1202 |
add_n_byhand | proved reference | 460.44 | 2 611 | 1202 |
add_proc | proved reference | 460.44 | 2 611 | 1202 |
add_mux | proved reference | 460.44 | 2 611 | 1202 |
add_proc_m · this design | proved reference | 460.44 | 2 611 | 1202 |
add_n_kogge_stone | baseline, not proved | 641.87 | 2 064 | 1325 |
add_n_sklansky | baseline, not proved | 541.77 | 2 451 | 1328 |
plus | baseline, not proved · banned operator | 497.98 | 3 143 | 1565 |
cmp_carry | baseline, not proved · banned operator | 857.07 | 1 965 | 1684 |
- submission
- proved reference
- baseline (not proved)
- baseline with a banned operator
- the Pareto front of the entries
- this design
- par's score: area × time = 3.94 µm²·ns
the designs as numbers, by score
| design | kind | area (µm²) | time (ps) | score (µm²·ns) |
|---|---|---|---|---|
add_n_sklansky | baseline, not proved | 8.048 | 487 | 3.919 |
add_n | proved reference · par | 6.998 | 563 | 3.94 |
add_n_byhand | proved reference | 6.998 | 563 | 3.94 |
add_proc | proved reference | 6.998 | 563 | 3.94 |
add_mux | proved reference | 6.998 | 563 | 3.94 |
add_proc_m · this design | proved reference | 6.998 | 563 | 3.94 |
| select-six | submission | 7.188 | 561 | 4.032 |
add_n_kogge_stone | baseline, not proved | 9.477 | 432 | 4.094 |
cmp_carry | baseline, not proved · banned operator | 12.553 | 336 | 4.218 |
plus | baseline, not proved · banned operator | 7.436 | 568 | 4.224 |
Reproduce
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/add/reference/add_proc_m.sv --task tasks/add --path \
--json out.json --netlist scored.v --repaired-netlist repaired.v
Expect, in out.json:
- ppa.netlist_sha256
95fe9838b1afc8a017600192554b525e00f08988267efdee8fcce4296fe61616- ppa.repair.netlist_sha256
c816b580f0d5aea91d8f56530360f51fb6ef01068b76b83e5ff513f1f06da577- ppa.area_e4um2_sky130
4604416- ppa.delay_ps_sky130
2611
The schematic and the critical-path data are site/schematics/add/2c38a1b41f8793d4.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 918379978cd4caf9…).
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/add/reference/add_proc_m.sv --task tasks/add --pdk asap7 --no-mapped \
--json out.json
Expect, in out.json:
- ppa.netlist_sha256
95fe9838b1afc8a017600192554b525e00f08988267efdee8fcce4296fe61616- ppa.repair.netlist_sha256
61806d575a845fd027ba6a098140558b3803561e6964c92d3d3cf8db19552e11- ppa.area_e5um2_asap7
699840- ppa.delay_ps_asap7
563
leaderboard/asap7/add.json keeps these numbers; python3.12 leaderboard/leaderboard.py asap7 --rescore --task add weighs every design of the task again and compares, bit for bit.