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 / mul / reference

Reference mul_n

proved referenceproved reference scored at N = 16

A proved reference of mul, written or adapted by the maintainers and shipped with the task: its design and its proof mul_n.lean (70 code lines). The N × N array multiplier, partial products summed by rows of full adders, proved with the sv_comb tactics. It is shown with parshown with par, never a player's entry (proved references).

Area

8 290.45µm²

8 290.4512 µm² exactly

Beats 0% · matches 0%

0 of 2 other players beaten, 0 equal.

vs par
−3.2% smallermul_tree_h · 8 563.21 µm²
on this page
4th of 10 designs (tied with 1)
cells
1 408
flops
0
repair
0 buffers, 0 tie cells
GE
1 962.576 extra

Performance · time

10 907ps

the delay: the latest output arrival, p[30] rising

Beats 0% · matches 0%

0 of 2 other players beaten, 0 equal.

vs par
+82.0% slowermul_tree_h · 5 992 ps
on this page
9th of 10 designs (tied with 1)
Fmax-eq.
91.7 MHz derived
critical path
87 cells
unit depth
88 extra

Score · area × time

90 424µm²·ns

8 290.4512 µm² × 10 907 ps

Beats 0% · matches 0%

0 of 2 other players beaten, 0 equal.

vs par
+76.2% worsemul_tree_h · 51 311 µm²·ns
on this page
9th of 10 designs (tied with 1)
board
a proved reference, shown with par: never ranked
Pareto
dominated on this page by late-carry, plus-minus-two and dadda_rc_16

On the board, of 2 other players: 0 beaten, 0 level, 0 trade off, 2 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 mul's other players at this revision (2 players, 2 records), 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, 2 submissions and 3 baselines): not a ranking.

Area

123.930µm²

123.93000 µm² exactly

Beats 0% · matches 0%

0 of 2 other players beaten, 0 equal.

vs par
−3.1% smallermul_tree_h · 127.954 µm²
on this page
4th of 10 designs (tied with 1)
cells
1 411
flops
0
repair
0 buffers, 0 tie cells
GE
1 962.576 extra

Performance · time

1 981ps

the delay: the latest output arrival

Beats 0% · matches 0%

0 of 2 other players beaten, 0 equal.

vs par
+70.8% slowermul_tree_h · 1 160 ps
on this page
9th of 10 designs (tied with 1)
Fmax-eq.
504.8 MHz derived
unit depth
88 extra

Score · area × time

245.5µm²·ns

123.93000 µm² × 1 981 ps

Beats 0% · matches 0%

0 of 2 other players beaten, 0 equal.

vs par
+65.4% worsemul_tree_h · 148.4 µm²·ns
on this page
9th of 10 designs (tied with 1)
board
a proved reference, shown with par: never ranked
Pareto
dominated on this page by late-carry, plus-minus-two and dadda_rc_16

On the board, of 2 other players: 0 beaten, 0 level, 0 trade off, 2 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 mul's other players at this revision (2 players, 2 records), 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, 2 submissions and 3 baselines): not a ranking.

The sources

mul_n.svdownload
// svGolf task `mul` -- reference solution: an N x N -> 2N array multiplier.
//
// Partial products pp[i][j] = a[j] & b[i]; row 0 is pp[0] itself; row i
// (1 <= i < N) adds the upper N bits of row i-1 to pp[i] with an N-bit
// ripple-carry adder of full adders (carry-in 0). Output bit i < N is bit 0
// of row i; the top N bits are the upper N bits of row N-1.
// Bitwise operators only; genvar loops step with `++` (ls-sv's tier).
module mul_n #(parameter int N = 16) (
  input  logic [N-1:0]   a, b,
  output logic [2*N-1:0] p
);
  logic [N-1:0][N-1:0] pp;   // pp[i][j] = a[j] & b[i]
  logic [N-1:0][N:0]   s;    // row sums (N+1 bits)
  logic [N-1:0][N:0]   c;    // ripple carries
  logic [N-1:0][N-1:0] t;    // propagate x ^ y

  genvar i, j;
  generate
    for (i = 0; i < N; i++) begin : g_pp
      for (j = 0; j < N; j++) begin : g_pp_j
        assign pp[i][j] = a[j] & b[i];
      end
    end
  endgenerate

  assign s[0] = {1'b0, pp[0]};
  assign c[0] = '0;
  assign t[0] = '0;

  generate
    for (i = 1; i < N; i++) begin : g_row
      assign c[i][0] = 1'b0;
      for (j = 0; j < N; j++) begin : g_bit
        assign t[i][j]   = s[i-1][j+1] ^ pp[i][j];
        assign s[i][j]   = t[i][j] ^ c[i][j];
        assign c[i][j+1] = (s[i-1][j+1] & pp[i][j]) | (c[i][j] & t[i][j]);
      end
      assign s[i][N] = c[i][N];
    end
  endgenerate

  generate
    for (i = 0; i < N; i++) begin : g_out
      assign p[i] = s[i][0];
    end
  endgenerate
  assign p[2*N-1:N] = s[N-1][N:1];
endmodule
mul_n.lean (70 code lines)
import Submission.Design
import SvGolf.Comb
import LeanModels.Sv.CombEqTactic
import LeanModels.Sv.CombLib

/-!
# Reference solution for task `mul`, proved with the `sv_comb` tactics

This is a submission file like any player's `Solution.lean`. The checker generates the module
`Submission.Design` (`Submission.design`, `Submission.Goal`); this file proves

    theorem Submission.solution : Submission.Goal

for EVERY `N ≥ 1`. The design is `reference/mul_n.sv`, an `N × N → 2N` array multiplier: 2-D
signals `pp`, `s`, `c`, `t`, nested `generate for` loops, a part-select target and a concatenation.
The same statement is proved with no tactic in `reference/mul_n_byhand.lean` (about six times as
many code lines).

## Route

1. **Structure** (`mul_struct`): `sv_structure` proves `CombDesign ∧ Acyclic` in one theorem;
   the goals it leaves compare 2-D windows, which are row-major offsets `r * W + c`, so they are
   closed by `intros; sv_rowmajor; omega` (`sv_rowmajor` rewrites those comparisons into
   lexicographic ones with the library lemma `rmN_lt_iff`). The rank is a lexicographic key
   `(row, column, phase)` of each site identity (`mulKey`). `mul_struct` needs
   `maxHeartbeats 400000` (the default 200000 times out in `simp`).
2. **Ports** (`mul_interface`): the statement pins the port names, order and widths; `sv_interface`
   proves them from the `CombDesign` profile (see `add_n.lean`).
3. **Equations** (in `solution`): `sv_equations` derives the eleven equations of the 2-D netlist
   (`eq_pp_g_pp_j_0`, `eq_t_g_bit_0`, ..., the row stride hidden inside `rmN W i j`), the knownness
   of every driven bit and the obligations. The one-dimensional and simple ones close by
   `intros; omega`; the six COVERAGE goals of the nested 2-D reads (`cover_2`, `cover_4` to
   `cover_8`: "the cell this assign reads is written by some assign") are closed by `sv_cover`, which
   solves the writer's loop indices from the read's row and column and walks the disjunction of
   writers (`CombCover.lean`).
4. **Arithmetic and bridge** (in `solution`): the equations are the library structure
   `CombLib.MulNetlistView` (one field per group of assigns), over the cells `st.cell "s" W i j` of the
   2-D signals. Each field is one `sv_bridge eq_x`: the printed equation has the netlist's `Int` index
   forms (`rmN W (↑i + -1) (↑j + 1)`), the field has `Nat` indices (`s (i - 1) (j + 1)`), and
   `sv_bridge` closes the difference by congruence and `omega`. `ideal_mul_view` (the ripple-row lemma
   and the row induction) proves `p = a * b`, and the port bridge turns the Boolean bits into the
   port's value.
-/

namespace Submission

open LeanModels.Sv LeanModels.Sv.CombView LeanModels.Sv.CombLib LeanModels.Sv.CombEq SvGolf

/-! ## 1. Structure: `sv_structure` -/

/-- The rank: a lexicographic key `(row, column, phase)` of each site identity. Partial products and
the zero rows come first; within a row, column by column: the propagate `t`, the carry `c`, then the
sum `s`; the row's top bit after its last column; the outputs last. -/
def mulKey (N : Nat) : SiteId → Key
  | .plain 0 => (0, 0, 1)                 -- s[0] = {1'b0, pp[0]}
  | .plain 1 => (0, 0, 0)                 -- c[0] = '0
  | .plain 2 => (0, 0, 0)                 -- t[0] = '0
  | .plain _ => (N, 0, 1)                 -- p[2*N-1:N] = s[N-1][N:1]
  | .fam "g_pp_j" _ _ => (0, 0, 0)        -- pp[i][j] = a[j] & b[i]
  | .fam "g_row" 0 [i] => (i.toNat, 0, 0) -- c[i][0] = 1'b0
  | .fam "g_row" _ [i] => (i.toNat, N, 0) -- s[i][N] = c[i][N]
  | .fam "g_bit" 0 [i, j] => (i.toNat, j.toNat, 1)   -- t[i][j]
  | .fam "g_bit" 1 [i, j] => (i.toNat, j.toNat, 3)   -- s[i][j]
  | .fam "g_bit" _ [i, j] => (i.toNat, j.toNat, 2)   -- c[i][j+1]
  | .fam _ _ _ => (N, 0, 0)               -- p[i] = s[i][0]

set_option maxHeartbeats 400000 in
/-- `CombDesign` and `Acyclic` for every `N ≥ 1`, from the lexicographic key: ONE application of the
soundness theorem and one round of obligations for both. -/
theorem mul_struct (N : Nat) (hN : 1 ≤ N) :
    CombDesign (design.sem N) ∧ Acyclic (design.sem N) ∧ SharedObl design.pdesign [N] := by
  sv_structure (lexRank := mulKey N)
  all_goals (intros; sv_rowmajor; omega)

/-! ## 2. The ports (the task's `Interface`) -/

/-- The task's interface: exactly the ports `a`, `b` (`N` bits) and `p` (`2N` bits). -/
theorem mul_interface (N : Nat) (hN : 1 ≤ N) (hc : CombDesign (design.sem N)) :
    SvGolf.Tasks.Mul.task.Interface N (design.sem N) := by
  sv_interface

/-! ## 3. The statement: bridge and arithmetic; `sv_cover` closes the coverage -/

set_option maxHeartbeats 400000 in
/-- **The reference solution**: the `mul` statement, for every `N ≥ 1`. -/
theorem solution : Goal := by
  intro N hN
  have hN' : 1 ≤ N := hN.1
  obtain ⟨hc, ha, hso⟩ := mul_struct N hN'
  refine CombTask.satisfiedAt_of_comb (mul_interface N hN' hc) hc ha ?_
  intro st heqs hs v hv
  obtain ⟨x, y, ⟨⟩⟩ := v
  simp only [SvGolf.Tasks.Mul.task, HoldAll_cons, HoldAll_nil, and_true] at hv ⊢
  obtain ⟨hA, hB⟩ := hv
  sv_equations
  · obtain ⟨⟨vp, hvp, hvpw⟩, -⟩ := known_p_g_out_0 0 (by omega)
    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 hkp : ∀ k, k < 2 * N → KnownBit st "p" k := by
      intro k hk
      by_cases h : k < N
      · exact (known_p_g_out_0 k h).2
      · obtain ⟨j, rfl⟩ : ∃ j, k = N + j := ⟨k - N, by omega⟩
        exact (known_p_plain_3 j (by omega)).2
    rw [hvp, SvState.lookup_eq_ofBitVec_bv (W := 2 * N) hvp (by omega) hkp]
    congr 2
    refine ideal_mul_view hN' (pp := st.cell "pp" N) (t := st.cell "t" N)
      (s := st.cell "s" ((N : Int) + 1)) (c := st.cell "c" ((N : Int) + 1))
      { pp_def := ?_, s0 := ?_, s0_top := ?_, c0 := ?_, t0 := ?_, ci0 := ?_, t_def := ?_, s_def := ?_,
        c_def := ?_, s_top := ?_, p_low := ?_, p_high := ?_ }
    · sv_bridge eq_pp_g_pp_j_0 with ba, bb
    · sv_bridge eq_s_plain_0 with if_pos
    · sv_bridge (eq_s_plain_0 N (by omega)) with if_neg
    · sv_bridge eq_c_plain_1
    · sv_bridge eq_t_plain_2
    · sv_bridge eq_c_g_row_0
    · sv_bridge eq_t_g_bit_0
    · sv_bridge eq_s_g_bit_1
    · sv_bridge eq_c_g_bit_2
    · sv_bridge eq_s_g_row_2
    · sv_bridge eq_p_g_out_0 with XF.getLsbD_bv
    · sv_bridge eq_p_plain_3 with XF.getLsbD_bv
  case inputsKnown_1 => exact inKnown_ofBitVec hA (by omega)
  case inputsKnown_2 => exact inKnown_ofBitVec hB (by omega)
  all_goals first | (intros; omega) | sv_cover

/--
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.

_136_ · sky130_fd_sc_hd__and2_1 and2_1 _137_ · sky130_fd_sc_hd__nand2_1 nand2_1 _138_ · sky130_fd_sc_hd__and2_1 and2_1 _139_ · sky130_fd_sc_hd__and2_1 and2_1 _140_ · sky130_fd_sc_hd__and2_1 and2_1 _141_ · sky130_fd_sc_hd__and2_1 and2_1 _142_ · sky130_fd_sc_hd__nand2_1 nand2_1 _143_ · sky130_fd_sc_hd__nand2_1 nand2_1 _144_ · sky130_fd_sc_hd__nor2_1 nor2_1 _145_ · sky130_fd_sc_hd__xnor2_1 xnor2_1 _146_ · sky130_fd_sc_hd__and2_1 and2_1 _147_ · sky130_fd_sc_hd__xor2_1 xor2_1 _148_ · sky130_fd_sc_hd__and2_1 and2_1 _149_ · sky130_fd_sc_hd__xor2_1 xor2_1 _150_ · sky130_fd_sc_hd__and2_1 and2_1 _151_ · sky130_fd_sc_hd__and2_1 and2_1 _152_ · sky130_fd_sc_hd__or2_1 or2_1 _153_ · sky130_fd_sc_hd__and2_1 and2_1 _154_ · sky130_fd_sc_hd__and2_1 and2_1 _155_ · sky130_fd_sc_hd__xnor2_1 xnor2_1 _156_ · sky130_fd_sc_hd__nand2_1 nand2_1 _157_ · sky130_fd_sc_hd__inv_1 inv_1 _158_ · sky130_fd_sc_hd__xor2_1 xor2_1 _159_ · sky130_fd_sc_hd__nand2_1 nand2_1 _160_ · sky130_fd_sc_hd__xor2_1 xor2_1 _161_ · sky130_fd_sc_hd__nand2_1 nand2_1 _162_ · sky130_fd_sc_hd__xor2_1 xor2_1 _163_ · sky130_fd_sc_hd__and2_1 and2_1 _164_ · sky130_fd_sc_hd__xor2_1 xor2_1 _165_ · sky130_fd_sc_hd__and2_1 and2_1 _166_ · sky130_fd_sc_hd__nand2_1 nand2_1 _167_ · sky130_fd_sc_hd__and2_1 and2_1 _168_ · sky130_fd_sc_hd__and2_1 and2_1 _169_ · sky130_fd_sc_hd__nor2b_1 nor2b_1 _170_ · sky130_fd_sc_hd__mux2_1 mux2_1 0 1 _171_ · sky130_fd_sc_hd__nand2_1 nand2_1 _172_ · sky130_fd_sc_hd__xor2_1 xor2_1 _173_ · sky130_fd_sc_hd__nand2_1 nand2_1 _174_ · sky130_fd_sc_hd__xor2_1 xor2_1 _175_ · sky130_fd_sc_hd__nand2_1 nand2_1 _176_ · sky130_fd_sc_hd__xor2_1 xor2_1 _177_ · sky130_fd_sc_hd__nand2_1 nand2_1 _178_ · sky130_fd_sc_hd__xor2_1 xor2_1 _179_ · sky130_fd_sc_hd__nand2_1 nand2_1 _180_ · sky130_fd_sc_hd__and2_1 and2_1 _181_ · sky130_fd_sc_hd__and2_1 and2_1 _182_ · sky130_fd_sc_hd__nand2_1 nand2_1 _183_ · sky130_fd_sc_hd__nand2_1 nand2_1 _184_ · sky130_fd_sc_hd__mux2_1 mux2_1 0 1 _185_ · sky130_fd_sc_hd__or2_1 or2_1 _186_ · sky130_fd_sc_hd__xor2_1 xor2_1 _187_ · sky130_fd_sc_hd__nand2_1 nand2_1 _188_ · sky130_fd_sc_hd__xor2_1 xor2_1 _189_ · sky130_fd_sc_hd__nand2_1 nand2_1 _190_ · sky130_fd_sc_hd__xor2_1 xor2_1 _191_ · sky130_fd_sc_hd__nand2_1 nand2_1 _192_ · sky130_fd_sc_hd__and2_1 and2_1 _193_ · sky130_fd_sc_hd__nand2_1 nand2_1 _194_ · sky130_fd_sc_hd__nand2_1 nand2_1 _195_ · sky130_fd_sc_hd__xor2_1 xor2_1 _196_ · sky130_fd_sc_hd__nand2_1 nand2_1 _197_ · sky130_fd_sc_hd__xor2_1 xor2_1 _198_ · sky130_fd_sc_hd__nand2_1 nand2_1 _199_ · sky130_fd_sc_hd__xnor2_1 xnor2_1 a b p 0 1 2 3 4 5 6 7 0 1 2 3 2 0 1 3

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: 64 cells here, 1 408 at the scoring point. The critical path at N = 4 (15 cells, ending at p[6] rising, 2 478 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: 64 cells, 21 nand2_1, 18 and2_1, 15 xor2_1, 3 xnor2_1, 2 mux2_1, 2 or2_1, 1 inv_1, 1 nor2_1, 1 nor2b_1. There (measured, not ranked): 397.88 µm², 2 478 ps. Open the drawing on its own (SVG, 43.1 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: 88 nets, 87 cells, to p[30] rising at 10 907 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 15 cells to p[6] rising (2 478 ps there); each cell is a link to it in the drawing:

  1. b[1]
  2. _139_ and2_1
  3. _145_ xnor2_1
  4. _146_ and2_1
  5. _152_ or2_1
  6. _156_ nand2_1
  7. _168_ and2_1
  8. _170_ mux2_1
  9. _172_ xor2_1
  10. _173_ nand2_1
  11. _181_ and2_1
  12. _186_ xor2_1
  13. _188_ xor2_1
  14. _189_ nand2_1
  15. _191_ nand2_1
  16. _197_ xor2_1
  17. p[6]
every stage (88 rows)
#netedgedriven bycellarrival (ps)transition (ps)stage (ps)
0b[1]fallinput port–128.734.0
1_2491_fall_2839_and2_1297.957.8169.2
2_2566_rise_2846_xor2_1501.1190.5203.2
3_2577_fall_2847_nand2_1572.945.971.8
4_2642_rise_2853_nand2_1660.180.187.2
5_2696_fall_2858_nand2_1709.645.949.5
6_2826_rise_2870_nand2_1796.880.187.2
7_1504_fall_2875_nand2_1846.445.949.6
8_1698_rise_2893_nand2_1933.680.187.2
9_1752_fall_2898_nand2_1983.245.949.6
10_1969_rise_2922_nand2_11 070.480.187.2
11_1974_fall_2927_nand2_11 120.045.949.6
12_2003_rise_2957_nand2_11 207.280.187.2
13_2008_fall_2962_nand2_11 256.845.949.6
14_2043_rise_2998_nand2_11 343.980.187.1
15_2048_fall_3003_nand2_11 393.545.949.6
16_2089_rise_3045_nand2_11 480.780.187.2
17_2094_fall_3050_nand2_11 530.345.949.6
18_2141_rise_3098_nand2_11 617.580.187.2
19_2146_fall_3103_nand2_11 667.145.949.6
20_2199_rise_3157_nand2_11 754.380.187.2
21_2204_fall_3162_nand2_11 803.945.949.6
22_2263_rise_3222_nand2_11 891.180.187.2
23_2268_fall_3227_nand2_11 940.645.949.5
24_2333_rise_3293_nand2_12 027.880.187.2
25_2338_fall_3298_nand2_12 077.445.949.6
26_2409_rise_3370_nand2_12 164.680.187.2
27_2414_fall_3375_nand2_12 214.247.549.6
28_2494_rise_3453_nand2_12 302.180.187.9
29_2498_fall_3457_nand2_12 361.156.659.0
30_2589_fall_3541_and2_12 522.941.7161.8
31_2591_fall_3543_mux2_12 835.475.1312.5
32_2593_rise_3545_xor2_13 026.8190.5191.4
33_2594_fall_3546_nand2_13 091.540.964.7
34_2680_fall_3626_and2_13 253.448.1161.9
35_2686_rise_3631_xor2_13 452.5190.5199.1
36_2688_rise_3633_xor2_13 669.2190.5216.7
37_2690_rise_3635_xor2_13 886.0190.5216.8
38_2692_rise_3637_xor2_14 102.8190.5216.8
39_2694_rise_3639_xor2_14 319.6190.5216.8
40_2697_rise_3641_xor2_14 536.3190.5216.7
41_2699_rise_3643_xor2_14 753.1190.5216.8
42_2701_rise_3645_xor2_14 969.9190.5216.8
43_2703_rise_3647_xor2_15 186.7190.5216.8
44_2705_rise_3649_xor2_15 403.4190.5216.7
45_2708_rise_3651_xor2_15 620.2190.5216.8
46_2710_rise_3653_xor2_15 837.0190.5216.8
47_2712_rise_3655_xor2_16 053.8190.5216.8
48_2714_rise_3657_xor2_16 270.5190.5216.7
49_2716_rise_3659_xor2_16 487.3190.5216.8
50_2719_rise_3661_xor2_16 704.1190.5216.8
51_2721_rise_3663_xor2_16 920.8190.5216.7
52_2723_rise_3665_xor2_17 137.6190.5216.8
53_2725_rise_3667_xor2_17 354.4190.5216.8
54_2727_rise_3669_xor2_17 571.2190.5216.8
55_2730_rise_3671_xor2_17 787.9190.5216.7
56_2732_rise_3673_xor2_18 004.7190.5216.8
57_2734_rise_3675_xor2_18 221.5190.5216.8
58_2736_rise_3677_xor2_18 438.3190.5216.8
59_2738_rise_3679_xor2_18 655.0190.5216.7
60_2741_rise_3681_xor2_18 871.8190.5216.8
61_2742_fall_3682_nand2_18 943.645.971.8
62_2743_rise_3684_nand2_19 030.880.187.2
63_2827_fall_3761_nand2_19 080.445.949.6
64_2828_rise_3763_nand2_19 167.580.187.1
65_1530_fall_3834_nand2_19 217.145.949.6
66_1531_rise_3836_nand2_19 304.380.187.2
67_1603_fall_3901_nand2_19 353.945.949.6
68_1604_rise_3903_nand2_19 441.180.187.2
69_1668_fall_3962_nand2_19 490.745.949.6
70_1669_rise_3964_nand2_19 577.980.187.2
71_1727_fall_4017_nand2_19 627.545.949.6
72_1728_rise_4019_nand2_19 714.680.187.1
73_1780_fall_4066_nand2_19 764.245.949.6
74_1781_rise_4068_nand2_19 851.480.187.2
75_1826_fall_4109_nand2_19 901.045.949.6
76_1828_rise_4111_nand2_19 988.280.187.2
77_1866_fall_4146_nand2_110 037.845.949.6
78_1867_rise_4148_nand2_110 125.080.187.2
79_1899_fall_4177_nand2_110 174.645.949.6
80_1900_rise_4179_nand2_110 261.880.187.2
81_1925_fall_4202_nand2_110 311.345.949.5
82_1926_rise_4204_nand2_110 398.580.187.2
83_1945_fall_4221_nand2_110 448.145.949.6
84_1946_rise_4223_nand2_110 535.380.187.2
85_1958_fall_4234_nand2_110 584.945.949.6
86_1959_rise_4236_nand2_110 672.180.187.2
87_1456_rise_4242_xor2_110 907.3247.2235.2

Cells

at N = 16 · scored

the cells of the repaired netlist, by area8 bars; the table beside the chart lists the same numbers.xor2_1: 4020.11 µm² (µm² · 459 cells)xor2_14020.11 µm² · 459 cellsnand2_1: 2522.42 µm² (µm² · 672 cells)nand2_12522.42 µm² · 672 cellsand2_1: 1682.86 µm² (µm² · 269 cells)and2_11682.86 µm² · 269 cellsxnor2_1: 26.28 µm² (µm² · 3 cells)xnor2_126.28 µm² · 3 cellsmux2_1: 22.52 µm² (µm² · 2 cells)mux2_122.52 µm² · 2 cellsnor2b_1: 6.26 µm² (µm² · 1 cell)nor2b_16.26 µm² · 1 cellor2_1: 6.26 µm² (µm² · 1 cell)or2_16.26 µm² · 1 cellinv_1: 3.75 µm² (µm² · 1 cell)inv_13.75 µm² · 1 cell
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_14598.75844020.105648.5%
nand2_16723.75362522.419230.4%
and2_12696.25601682.864020.3%
xnor2_138.758426.27520.3%
mux2_1211.260822.52160.3%
nor2b_116.25606.25600.1%
or2_116.25606.25600.1%
inv_113.75363.75360.0%
total1 4088290.4512

Repair (buffer_trees_v1): 0 buffers on 0 nets, 0 tie cells, 1 weighing round; nothing is resized.

Legality: worst load 0.144 × max_capacitance, worst transition 0.178 × 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 netlist8 bars; the table beside the chart lists the same numbers.NAND: 672 cells (672.000 GE)NAND672 672.000 GEXOR: 459 cells (918.000 GE)XOR459 918.000 GEAND: 269 cells (358.577 GE)AND269 358.577 GEXNOR: 3 cells (6.000 GE)XNOR3 6.000 GEMUX: 2 cells (4.666 GE)MUX2 4.666 GEANDNOT: 1 cell (1.333 GE)ANDNOT1 1.333 GENOT: 1 cell (0.667 GE)NOT1 0.667 GEOR: 1 cell (1.333 GE)OR1 1.333 GE
Cells by type; area is the count weighted by the pinned GE table.
cellcountGE eachGE total
NAND6721.000672.000
XOR4592.000918.000
AND2691.333358.577
XNOR32.0006.000
MUX22.3334.666
ANDNOT11.3331.333
NOT10.6670.667
OR11.3331.333
total14081962.576

The reference

task
mul
design
mul_n.sv sha256 66686a9d4c60cc9484a7fc673c5a8e2b73f30e25f9f6ddaccccbf3d51bf3bd23
proof
mul_n.lean, 70 code lines
tactics seen
omega, simp, sv_cover, sv_equations, sv_interface, sv_rowmajor, 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
mul_n.sv mul_n.lean

Area against time

µm² × ps · lower left is better · ASAP7
  • submission
  • proved reference
  • baseline (not proved)
  • baseline with a banned operator
  • the Pareto front of the entries
  • this design
  • par's score: area × time = 51 311 µ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; every design is in view.
the designs as numbers, by score
designkindarea (µm²)time (ps)score (µm²·ns)
late-carry submission7 961.395 34242 530
dadda_rc_16 baseline, not proved8 230.395 46144 946
dadda_ks_16 baseline, not proved8 937.325 14846 009
plus-minus-two submission7 978.906 32950 498
mul_tree_h proved reference · par8 563.215 99251 311
mul_tree proved reference8 603.256 12952 729
mul_wallace proved reference8 966.105 98253 635
yosys_mul baseline, not proved · banned operator8 825.966 26155 259
mul_n · this designproved reference8 290.4510 90790 424
mul_n_byhand proved reference8 290.4510 90790 424
  • submission
  • proved reference
  • baseline (not proved)
  • baseline with a banned operator
  • the Pareto front of the entries
  • this design
  • par's score: area × time = 148.4 µ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; every design is in view.
the designs as numbers, by score
designkindarea (µm²)time (ps)score (µm²·ns)
dadda_ks_16 baseline, not proved133.174902120.1
late-carry submission120.8541 088131.5
dadda_rc_16 baseline, not proved123.3911 100135.7
mul_tree_h proved reference · par127.9541 160148.4
yosys_mul baseline, not proved · banned operator131.7891 139150.1
mul_tree proved reference128.5521 191153.1
plus-minus-two submission119.7461 307156.5
mul_wallace proved reference133.9171 186158.8
mul_n · this designproved reference123.9301 981245.5
mul_n_byhand proved reference123.9301 981245.5

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/mul/reference/mul_n.sv --task tasks/mul --path \
    --json out.json --netlist scored.v --repaired-netlist repaired.v

Expect, in out.json:

ppa.netlist_sha256
57ce50c4b62767ed364613bef11a6e4d8154722d0daeb6975594ece98921aadc
ppa.repair.netlist_sha256
dea76e7e7e8ea1319b86d0885ae7b02c653cec63c1b22dc42d8c7a0cb4f35eee
ppa.area_e4um2_sky130
82904512
ppa.delay_ps_sky130
10907

The schematic and the critical-path data are site/schematics/mul/66686a9d4c60cc94.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 6789c15f0758cdbd…).

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/mul/reference/mul_n.sv --task tasks/mul --pdk asap7 --no-mapped \
    --json out.json

Expect, in out.json:

ppa.netlist_sha256
57ce50c4b62767ed364613bef11a6e4d8154722d0daeb6975594ece98921aadc
ppa.repair.netlist_sha256
dc39f8141d84f2ffd4fa1cc39e2c5b268fa24378c2e9cc23881d28019cffde8d
ppa.area_e5um2_asap7
12393000
ppa.delay_ps_asap7
1981

leaderboard/asap7/mul.json keeps these numbers; python3.12 leaderboard/leaderboard.py asap7 --rescore --task mul weighs every design of the task again and compares, bit for bit.