Golf scores on ASAP7, a predictive 7 nm library: never fabricated, and like sky130's score it counts no wires. sky130, a real 130 nm process, is the default. How ASAP7 is scored, and its quirks.

Tasks / add / reference

Reference add_proc

proved referenceproved reference scored at N = 16

A proved reference of add, written or adapted by the maintainers and shipped with the task: its design and its proof add_proc.lean (115 code lines). The same adder with its carry cell written as an always_comb if/else. 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

add_proc.svdownload
// svGolf task `add`, reference solution (WP-G): a ripple-carry adder whose CARRY CELL is an
// `always_comb` body inside the generate loop. 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];
      end
      assign s[i] = p[i] ^ c[i];
    end
  endgenerate
  assign cout = c[N];
endmodule
add_proc.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 an `always_comb` carry cell (WP-G)

The design is `reference/add_proc.sv`: a ripple-carry adder whose carry cell is an `always_comb`
`if (p[i]) c[i+1] = c[i]; else c[i+1] = a[i];` inside the generate loop. This file proves

    theorem Submission.solution : Submission.Goal

for EVERY `N ≥ 1` (`N` stays a variable from the envelope to the conclusion; nothing is unrolled), with the
`sv_comb` tactics, exactly like `reference/add_n.lean`. What differs is one fact about the design and one
lemma:

* **`design.sem N` is not a `CombDesign`** (`CombDesign.assign`: every process is a continuous assign), because
  it still contains the procedural process. What holds, and what the settle theory transfers to the design
  (`Runs2.lowerComb_iff`), is a statement about its LOWERING `d'` (`Design2.lowerComb`: each `always_comb` body
  replaced by the one continuous assign `assign {c[i+1]} = {…}` it computes). So the structure theorem is
  `∃ d', (design.sem N).lowerComb = some d' ∧ CombDesign d' ∧ Acyclic d'`, the interface theorem takes
  `(hl : (design.sem N).lowerComb = some d')` (the ports of the instantiated design are the declarations of the
  summary, which only needs that the instantiation succeeded and lowers), and the equations are about `d'`.
* **`satisfiedAt_of_lowered`** (below, ten lines) is the bridge from the lowered design's settled-state lemma
  to the task's statement about `design.sem N`; it is `CombTask.satisfiedAt_of_comb` with the lowering
  theorems of `Comb2Proc.lean` (`Design2.lowerComb_phases`, `Terminates2.of_lowerComb_acyclic`,
  `Models2.of_combProc_inputs`). The last two also take `hnq`: no qualified (`unique`/`priority`) `case` in
  `design.sem N` itself, which `NoQ.sem_noQ` (`LeanModels/Sv/ProcNoQualified.lean`) gives for every `N` from one
  `decide` on the parametric design.

The tactics are the same (`sv_structure`, `sv_interface`, `sv_equations`); `sv_structure` returns one more
obligation, `noSelfRead_k` (no read of the carry cell's body overlaps the window it writes), closed by
`intros; omega` like the others. The equation of the carry cell is the body's own: an `if` on the first bit of
the condition (`eq_c_2`).
-/

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.

_41_ · sky130_fd_sc_hd__nand2_1 nand2_1 _42_ · sky130_fd_sc_hd__nand2_1 nand2_1 _43_ · sky130_fd_sc_hd__nand2_1 nand2_1 _44_ · sky130_fd_sc_hd__nand2_1 nand2_1 _45_ · sky130_fd_sc_hd__xor2_1 xor2_1 _46_ · sky130_fd_sc_hd__nand2_1 nand2_1 _47_ · sky130_fd_sc_hd__nand2_1 nand2_1 _48_ · sky130_fd_sc_hd__xor2_1 xor2_1 _49_ · sky130_fd_sc_hd__nand2_1 nand2_1 _50_ · sky130_fd_sc_hd__nand2_1 nand2_1 _51_ · sky130_fd_sc_hd__xor2_1 xor2_1 _52_ · sky130_fd_sc_hd__nand2_1 nand2_1 _53_ · sky130_fd_sc_hd__nand2_1 nand2_1 _54_ · sky130_fd_sc_hd__xor2_1 xor2_1 _55_ · sky130_fd_sc_hd__nand2_1 nand2_1 _56_ · sky130_fd_sc_hd__nand2_1 nand2_1 _57_ · sky130_fd_sc_hd__xor2_1 xor2_1 _58_ · sky130_fd_sc_hd__xor2_1 xor2_1 _59_ · sky130_fd_sc_hd__xor2_1 xor2_1 _60_ · sky130_fd_sc_hd__xor2_1 xor2_1 a b cin cout s 0 1 2 3 3 2 1 0 3 2 1 0

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:

  1. b[0]
  2. _45_ xor2_1
  3. _46_ nand2_1
  4. _47_ nand2_1
  5. _49_ nand2_1
  6. _50_ nand2_1
  7. _52_ nand2_1
  8. _53_ nand2_1
  9. _60_ xor2_1
  10. s[3]
#netedgedriven bycellarrival (ps)transition (ps)stage (ps)
0b[0]fallinput port–114.422.5
1_128_rise_177_xor2_1302.4190.5188.0
2_129_fall_178_nand2_1374.245.971.8
3_130_rise_179_nand2_1461.480.187.2
4_132_fall_181_nand2_1511.045.949.6
5_133_rise_182_nand2_1598.280.187.2
6_135_fall_184_nand2_1647.745.949.5
7_136_rise_185_nand2_1734.980.187.2
8_138_fall_187_nand2_1784.545.949.6
9_139_rise_188_nand2_1871.780.187.2
10_141_fall_190_nand2_1921.345.949.6
11_142_rise_191_nand2_11 008.580.187.2
12_144_fall_193_nand2_11 058.145.949.6
13_145_rise_194_nand2_11 145.380.187.2
14_147_fall_196_nand2_11 194.845.949.5
15_148_rise_197_nand2_11 282.080.187.2
16_150_fall_199_nand2_11 331.645.949.6
17_151_rise_200_nand2_11 418.880.187.2
18_153_fall_202_nand2_11 468.445.949.6
19_154_rise_203_nand2_11 555.680.187.2
20_156_fall_205_nand2_11 605.245.949.6
21_157_rise_206_nand2_11 692.480.187.2
22_159_fall_208_nand2_11 741.945.949.5
23_160_rise_209_nand2_11 829.180.187.2
24_099_fall_211_nand2_11 878.745.949.6
25_100_rise_212_nand2_11 965.980.187.2
26_102_fall_214_nand2_12 015.545.949.6
27_103_rise_215_nand2_12 102.780.187.2
28_105_fall_217_nand2_12 152.345.949.6
29_106_rise_218_nand2_12 239.580.187.2
30_108_fall_220_nand2_12 289.045.949.5
31_109_rise_221_nand2_12 376.280.187.2
32_97_rise_240_xor2_12 611.5247.2235.3

Cells

at N = 16 · scored

the cells of the repaired netlist, by area2 bars; the table beside the chart lists the same numbers.xor2_1: 280.27 µm² (µm² · 32 cells)xor2_1280.27 µm² · 32 cellsnand2_1: 180.17 µm² (µm² · 48 cells)nand2_1180.17 µm² · 48 cells
The area of each cell type in the repaired A0′ netlist, at the scoring point: the count times the cell's area in the pinned liberty. Their sum is the ranked area.
cellcountµm² eachµm² in allshare
xor2_1328.7584280.268860.9%
nand2_1483.7536180.172839.1%
total80460.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)
gate mix: cells of each type in the scored netlist2 bars; the table beside the chart lists the same numbers.NAND: 48 cells (48.000 GE)NAND48 48.000 GEXOR: 32 cells (64.000 GE)XOR32 64.000 GE
Cells by type; area is the count weighted by the pinned GE table.
cellcountGE eachGE total
NAND481.00048.000
XOR322.00064.000
total80112.000

The reference

task
add
design
add_proc.sv sha256 a940dbcecfa882af983100946b2fa7a911eb0463cf67bb203ef4aca63d699132
proof
add_proc.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.sv add_proc.lean

Area against time

µm² × ps · lower left is better · ASAP7
add: this design's sky130 area against time, among the task's designs10 designs by sky130 area (µm²) (x) and time (ps) (y), this one ringed; lower left is better; 3 beyond the view, counted at its edges. The table under the chart lists the same numbers.2200240026002800450500550600sky130 area (µm²)time (ps) · lower is betterpar's score: area × time = 1202 µm²·nsthe Pareto front of the entriesadd_n_sklansky · baseline, not proved · Score: 1328 µm²·ns · Area: 541.8 µm² · Delay: 2451 ps5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_m5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_m5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_m5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_mselect-six · submission · 2026-11-05 · Score: 1176 µm²·ns · Area: 474.2 µm² · Delay: 2479 ps5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_mthis design · par's numbers1 design beyond the view (right)1 ▸1 design beyond the view (above)▴ 12 designs beyond the view (below)▾ 2
add: this design's sky130 area against time, among the task's designs10 designs by sky130 area (µm²) (x) and time (ps) (y), this one ringed; lower left is better; 3 beyond the view, counted at its edges. The table under the chart lists the same numbers.2200240026002800500600sky130 area (µm²)time (ps) · lower is betterpar's score: area × time = 1202 µm²·nsthe Pareto front of the entriesadd_n_sklansky · baseline, not proved · Score: 1328 µm²·ns · Area: 541.8 µm² · Delay: 2451 ps5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_m5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_m5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_m5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_mselect-six · submission · 2026-11-05 · Score: 1176 µm²·ns · Area: 474.2 µm² · Delay: 2479 ps5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_mthis design · par's numbers1 design beyond the view (right)1 ▸1 design beyond the view (above)▴ 12 designs beyond the view (below)▾ 2
  • 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
sky130 area (x) against the ranked time (y); lower left is better on both. The step line is the Pareto front of the entries (the proved references and the players' ranked records); a design under par's score curve has a better score than par. Baselines are drawn for scale: scored, never proved. Fitted to the cluster: 3 designs beyond the view, counted at its edge (◂ ▸ ▴ ▾); “All designs” shows them.
the designs as numbers, by score
designkindarea (µm²)time (ps)score (µm²·ns)
select-six submission474.202 4791176
add_n proved reference · par460.442 6111202
add_n_byhand proved reference460.442 6111202
add_proc · this designproved reference460.442 6111202
add_mux proved reference460.442 6111202
add_proc_m proved reference460.442 6111202
add_n_kogge_stone baseline, not proved641.872 0641325
add_n_sklansky baseline, not proved541.772 4511328
plus baseline, not proved · banned operator497.983 1431565
cmp_carry baseline, not proved · banned operator857.071 9651684
add: this design's ASAP7 area against time, among the task's designs10 designs by ASAP7 area (µm²) (x) and time (ps) (y), this one ringed; lower left is better; 2 beyond the view, counted at its edges. The table under the chart lists the same numbers.45050055077.588.59ASAP7 area (µm²)time (ps) · lower is betterpar's score: area × time = 3.94 µm²·nsthe Pareto front of the entriesadd_n_sklansky · baseline, not proved · Score: 3.919 µm²·ns · Area: 8.048 µm² · Delay: 487 psplus · baseline, not proved · banned operator · Score: 4.224 µm²·ns · Area: 7.436 µm² · Delay: 568 ps5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_m5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_m5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_m5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_mselect-six · submission · 2026-11-05 · Score: 4.032 µm²·ns · Area: 7.188 µm² · Delay: 561 ps5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_mthis design · par's numbers2 designs beyond the view (right)2 ▸1 design beyond the view (below)▾ 1
add: this design's ASAP7 area against time, among the task's designs10 designs by ASAP7 area (µm²) (x) and time (ps) (y), this one ringed; lower left is better; 2 beyond the view, counted at its edges. The table under the chart lists the same numbers.450500550789ASAP7 area (µm²)time (ps) · lower is betterpar's score: area × time = 3.94 µm²·nsthe Pareto front of the entriesadd_n_sklansky · baseline, not proved · Score: 3.919 µm²·ns · Area: 8.048 µm² · Delay: 487 psplus · baseline, not proved · banned operator · Score: 4.224 µm²·ns · Area: 7.436 µm² · Delay: 568 ps5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_m5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_m5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_m5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_mselect-six · submission · 2026-11-05 · Score: 4.032 µm²·ns · Area: 7.188 µm² · Delay: 561 ps5 designs at this point · add_mux · add_n · add_n_byhand · this design · add_proc_mthis design · par's numbers2 designs beyond the view (right)2 ▸1 design beyond the view (below)▾ 1
  • 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
ASAP7 area (x) against the ASAP7 time (y); lower left is better on both. The step line is the Pareto front of the entries (the proved references and the players' ranked records); a design under par's score curve has a better score than par. Baselines are drawn for scale: scored, never proved. Fitted to the cluster: 2 designs beyond the view, counted at its edge (◂ ▸ ▴ ▾); “All designs” shows them.
the designs as numbers, by score
designkindarea (µm²)time (ps)score (µm²·ns)
add_n_sklansky baseline, not proved8.0484873.919
add_n proved reference · par6.9985633.94
add_n_byhand proved reference6.9985633.94
add_proc · this designproved reference6.9985633.94
add_mux proved reference6.9985633.94
add_proc_m proved reference6.9985633.94
select-six submission7.1885614.032
add_n_kogge_stone baseline, not proved9.4774324.094
cmp_carry baseline, not proved · banned operator12.5533364.218
plus baseline, not proved · banned operator7.4365684.224

Reproduce

From svgolf/, with the pinned tools (reproduce a score lists them):

shell
# 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.sv --task tasks/add --path \
    --json out.json --netlist scored.v --repaired-netlist repaired.v

Expect, in out.json:

ppa.netlist_sha256
e5135f1202bcb770c48312eebe29fb828fa36f2c020e75a5123a9a9772cd3293
ppa.repair.netlist_sha256
3fdf7e02a0df1678f2b9242a89834744b9217a2f8c2d0147b444c981103556ac
ppa.area_e4um2_sky130
4604416
ppa.delay_ps_sky130
2611

The schematic and the critical-path data are site/schematics/add/a940dbcecfa882af.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 f0564347e3063a33…).

From svgolf/, with the pinned tools (reproduce a score lists them):

shell
# 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.sv --task tasks/add --pdk asap7 --no-mapped \
    --json out.json

Expect, in out.json:

ppa.netlist_sha256
e5135f1202bcb770c48312eebe29fb828fa36f2c020e75a5123a9a9772cd3293
ppa.repair.netlist_sha256
2d64bad1d8fc8f792f7d29355576161c31bd259fcf2ed9df05a2cd700bb9a64d
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.