Logic Synthesis · Step 4

Technology Mapping

How the synthesizer selects standard cells from a Liberty library, sizes cells for timing, buffers high-fanout nets, and handles wire-load models to produce a P&R-ready gate netlist.

Standard Cell Library — Liberty (.lib) Structure

Liberty File: stdcell_tt_1p0v_25c.lib (TT corner, 1.0V, 25°C) NAND2X1 area: 1.32 µm² leakage: 0.8 nW cap_A: 1.2 fF cap_B: 1.2 fF rise_delay: NLDM [slew × load] max_fanout: 12 NAND2X2 area: 2.15 µm² leakage: 1.6 nW cap_A: 2.1 fF cap_B: 2.1 fF rise_delay: NLDM [slew × load] max_fanout: 24 DFFSX1 area: 4.40 µm² leakage: 2.2 nW setup: 0.085 ns hold: 0.010 ns Clk→Q delay: NLDM scan (SE, SI) pins recovery, removal BUFX4 area: 2.86 µm² leakage: 2.0 nW cap_A: 3.5 fF drive strength: X4 output cap: 8.0 fF non-inverting fanout buffering
Liberty (.lib) contains per-cell: area, leakage, pin capacitances, NLDM timing tables (delay vs slew+load), and setup/hold/recovery/removal for sequential cells.
/* Liberty snippet — NAND2X1 cell */
cell (NAND2X1) {
  area          : 1.32;
  cell_leakage_power : 0.8e-9;

  pin (A) { direction: input; capacitance: 1.2e-15; }
  pin (B) { direction: input; capacitance: 1.2e-15; }

  pin (ZN) {
    direction: output;
    function: "!(A * B)";  /* NAND2 Boolean function */
    timing() {
      related_pin: "A";
      timing_sense: negative_unate;
      /* NLDM table: rows=input_slew, cols=output_cap */
      cell_rise(delay_template_7x7) {
        index_1 ("0.01, 0.05, 0.1, 0.2, 0.4, 0.8, 1.6");  /* slew ns */
        index_2 ("0.001, 0.005, 0.01, 0.02, 0.04, 0.08, 0.16"); /* pF */
        values (
          "0.012, 0.018, 0.024, 0.036, 0.059, 0.108, 0.208",
          "0.030, 0.037, 0.044, 0.057, 0.081, 0.130, 0.232",
          ...
        );
      }
    }
  }
}

Drive Strength & Cell Sizing

INV X1 W_P=2λ, W_N=1λ area: 1.0× INV X2 W_P=4λ, W_N=2λ area: 1.8× faster (2×) INV X4 W_P=8λ, W_N=4λ area: 3.2× faster (4×) INV X8 W_P=16λ, W_N=8λ area: 6.0× fastest (8×) leakage: 8× Drive strength scales with transistor width — larger = faster output, more area, more leakage
Larger drive strength cells have wider transistors: they charge output capacitance faster but occupy more area and have proportionally higher leakage current.
Drive StrengthRelative AreaRelative SpeedMax FanoutUse Case
X1 (minimum)1.0×1.0× (baseline)~4–6Non-critical paths, low-fanout nets
X21.8×~1.5×~8–12Moderate fanout, slightly critical nets
X43.2×~2.5×~16–24High-fanout nets, timing-critical paths
X86.0×~4×~32–48Very high fanout, most critical paths
X12/X169–12×~6–8×~64+Clock buffers, extreme fanout (pre-CTS)

Wire-Load Models vs Extracted RC

Wire-Load Model (Synthesis) fanout → estimated capacitance (lookup table) fanout 1 → 0.02 pF fanout 2 → 0.04 pF fanout 4 → 0.09 pF fanout 8 → 0.18 pF Statistical average from similar designs Ignores actual wire length! Simple, fast — used pre-P&R Extracted RC (Post-Route) actual routed wire → SPEF/DSPF parasitic extraction R = ρ × L / (W × T) C = C_area × W × L + C_fringe × L R, C from foundry PDK extraction rules Delay = 0.69 × R × C (Elmore) Accurate — used in STA sign-off
Wire-load models estimate wire delay from fanout counts — fast but inaccurate for long nets. Post-route extracted RC (SPEF) gives exact delays used in sign-off STA.

The gap between WLM and extracted RC causes most post-route timing failures. Mitigation: physically-aware synthesis (DC-G / Genus iSpatial) uses trial placement to estimate real wire lengths, giving 30–50% better correlation to post-route timing at synthesis time.

DesignWare Components

DesignWare CellRTL Pattern RecognizedAdvantage vs Generic
DW_add / DW_inca + b, a + 1Optimized carry-lookahead adder; 20–40% smaller/faster than NAND-mapped ripple carry
DW_multa * bBooth-encoded multiplier; 30–50% fewer cells than synthesized Wallace tree
DW_cmpa > b, a == b, a < bUnified comparator shared across multiple conditions
DW_div / DW_rema / b, a % bNon-restoring division; much smaller than RTL-inferred iterative divider
DW_shiftera << b, a >> b (variable shift)Barrel shifter with optimized mux-tree
DW_sqrtInteger square rootDigit-recurrence algorithm; heavily optimized
## Force use of DesignWare components in DC
set_app_var synthetic_library "dw_foundation_ver.sldb"

# DC automatically infers DW cells for RTL arithmetic
# Verify after compile:
report_design -designware      # shows which DW cells were inferred

## Explicitly instantiate for guaranteed selection:
# module my_mult (input [15:0] a, b, output [31:0] p);
#   DW_mult_uns #(.a_width(16),.b_width(16)) u_mult (.A(a),.B(b),.PRODUCT(p));
# endmodule

Technology Mapping Interview Questions

What is a Liberty file and what does it contain?
A Liberty (.lib) file is the timing/power characterization database for a standard cell library. For each cell it provides: cell area (µm²), leakage power, input pin capacitance, and NLDM (Non-Linear Delay Model) tables — 2D matrices giving cell delay and output transition time as a function of input slew (rows) and output load capacitance (columns). Sequential cells also have setup/hold/recovery/removal tables. The synthesizer reads Liberty to determine which cells meet timing and to estimate total power.
How does the technology mapper choose between NAND2X1 and NAND2X2?
The mapper uses dynamic programming over the NAND graph. For each node (gate), it evaluates all candidate cells from the Liberty library that implement the same Boolean function, computing the cost (timing slack, area) for each choice given the current fanout and input slew. X1 is chosen for non-critical paths to save area; X2 or larger is chosen when the additional drive strength is needed to meet timing (slack is negative or near zero). After initial mapping, incremental sizing passes upsize cells on the most timing-critical paths.
What is a wire-load model and why does it cause post-route timing failures?
A wire-load model estimates net capacitance from only the fanout count — a lookup table built from statistical averages of similar designs. The actual wire delay after routing depends on the physical wire length, which depends on placement. Long nets crossing the die can have 5–10× higher capacitance than the WLM estimate. The synthesizer sees a clean timing report (slack ≥ 0), but after routing the long wire adds delay that pushes the slack negative. Solution: physically-aware synthesis (DC-Graphical, Genus iSpatial) uses estimated placement during synthesis to compute better wire-length estimates.
What is SPEF and how is it used in sign-off STA?
SPEF (Standard Parasitic Exchange Format) contains the extracted RC parasitics of all nets after routing: net resistance (R, in Ohms) and capacitance (C, in Farads/pF) from the actual routed geometry, extracted using the foundry's RC extraction rules. The sign-off STA tool (PrimeTime, Tempus) reads the SPEF file and uses real wire delays (Elmore: 0.69×R×C) instead of WLM estimates for timing analysis. SPEF + Liberty + SDC + extracted netlist = accurate sign-off timing — this is the final check before tapeout.
When would you use set_dont_use in synthesis?
set_dont_use tells the synthesizer to never use specific cells from the library. Use cases: (1) cells that are problematic for DFT (complex flops without scan pins); (2) cells that the foundry marks as "not recommended for new designs" (NR cells); (3) very high-leakage cells that violate the power budget; (4) cells with known reliability issues (e.g., ULVT in an automotive-reliability design); (5) cells that DRC rules prohibit in certain metal layers (antenna-prone large cells). Unlike dont_touch, dont_use prevents the cell from being selected — it still exists in the library.