Skip to content
DenseChip
Learn
PracticeCode labInterview

DenseChip

Navigate

Menu

LearnPracticeCode labInterview

Tools

All toolsSV editorCode repoResume
DenseChip

Practice, courses, and chip-design tools in one focused workspace.

LearnPracticeCode labInterviewToolsLearning paths

© 2026 DenseChip

AboutRoadmapCareersInternshipsFAQContactPrivacyTerms
Skip to lesson

Course contents

  • Logic Synthesis Glossary
  • Logic Synthesis Cheatsheet
  • Synthesis Foundations14
  • Logic Optimisation and Mapping20
    • Boolean Optimisation
    • Technology Mapping
      • Covering a Network with Cells
      • Cuts and Matching
      • Area Against Delay
      • Inverters and Banned Cells
      • Mapping in Yosys
    • Cell Libraries and Liberty
    • Structuring and Buffering
  • Constraints and Timing15
  • Sequential, FSM and Memory19
  • Datapath Synthesis14
  • Area, Power and Test14
  • Verification, ECO and Handoff15
  • Flows and Debugging15
  • Interview and Judgment11
Loading lesson

←Technology Mapping
  1. Topics
  2. Logic Synthesis
  3. Logic Optimisation and Mapping
  4. Technology Mapping
  5. Area Against Delay
On this page

    Part 2 of 9, lesson 8 of 20Part 2 of 9/Logic Optimisation and Mapping/Lesson 8 of 20Intermediate

    Area Against Delay

    Area cost, arrival times, and why the cheapest cell is not always chosen.

    The cheapest cover is too slow exactly when it matters, and tightening the target past what the library can give buys no more speed. This page records the staircase so the trade stops being a slogan.

    After this lesson you can: read an area-against-delay sweep, compute slack with the correct sign, and tell a useful target from one past the plateau.

    Two objectives

    Area mapping minimises the sum of cell areas; delay mapping minimises arrival times against required times, path by path — the fastest cover on each failing path, the cheapest elsewhere. The two modes disagree exactly when the cheapest cover is too slow for its required time, and this lesson records that disagreement.

    Mode

    Cost

    Decision

    Area

    Sum of cell areas

    Cheapest cover that implements the function.

    Delay

    Worst arrival against required time

    Fastest cover on each failing path, cheapest elsewhere.

    Two definitions carry the lesson. Arrival time is when a signal gets there, as ABC reports in picoseconds. Slack is required minus arrival, and its sign is the verdict: positive meets, zero exactly meets, negative fails.

    One function, six targets

    The design is a small cone of AND, OR, and XOR terms feeding one output. The script synthesises it once, saves the generic gates, then maps the same gates six times against sized.lib, where every cell exists in plain, X2, and X4 — bigger is faster and larger. The -D target steps down from 1000 to 100 ps, and typical.constr hands ABC a 0.05 pF output load. The assertions prove no generic gate survives any mapping.

    yosys
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    read_verilog <<EOV
    module trade(input [7:0] x, output y);
    assign y = ((x[0] & x[1]) | (x[2] & x[3]) | (x[4] ^ x[5])) & (x[6] | x[7]);
    endmodule
    EOV
    synth -top trade -flatten
    design -save generic
    tee -o abc_1000.txt abc -liberty sized.lib -constr typical.constr -D 1000
    tee -o stat_1000.txt stat -liberty sized.lib
    write_json net_1000.json
    select -assert-none t:$and t:$or t:$xor t:$xnor t:$mux t:$not
    select -assert-none t:$_AND_ t:$_OR_ t:$_XOR_ t:$_XNOR_ t:$_MUX_ t:$_NOT_ t:$_NAND_ t:$_NOR_
    check
    design -load generic
    tee -o abc_700.txt abc -liberty sized.lib -constr typical.constr -D 700
    tee -o stat_700.txt stat -liberty sized.lib
    select -assert-none t:$and t:$or t:$xor t:$xnor t:$mux t:$not
    select -assert-none t:$_AND_ t:$_OR_ t:$_XOR_ t:$_XNOR_ t:$_MUX_ t:$_NOT_ t:$_NAND_ t:$_NOR_
    check
    design -load generic
    tee -o abc_500.txt abc -liberty sized.lib -constr typical.constr -D 500
    tee -o stat_500.txt stat -liberty sized.lib
    select -assert-none t:$and t:$or t:$xor t:$xnor t:$mux t:$not
    select -assert-none t:$_AND_ t:$_OR_ t:$_XOR_ t:$_XNOR_ t:$_MUX_ t:$_NOT_ t:$_NAND_ t:$_NOR_
    check
    design -load generic
    tee -o abc_300.txt abc -liberty sized.lib -constr typical.constr -D 300
    tee -o stat_300.txt stat -liberty sized.lib
    write_json net_300.json
    select -assert-none t:$and t:$or t:$xor t:$xnor t:$mux t:$not
    select -assert-none t:$_AND_ t:$_OR_ t:$_XOR_ t:$_XNOR_ t:$_MUX_ t:$_NOT_ t:$_NAND_ t:$_NOR_
    check
    design -load generic
    tee -o abc_200.txt abc -liberty sized.lib -constr typical.constr -D 200
    tee -o stat_200.txt stat -liberty sized.lib
    select -assert-none t:$and t:$or t:$xor t:$xnor t:$mux t:$not
    select -assert-none t:$_AND_ t:$_OR_ t:$_XOR_ t:$_XNOR_ t:$_MUX_ t:$_NOT_ t:$_NAND_ t:$_NOR_
    check
    design -load generic
    tee -o abc_100.txt abc -liberty sized.lib -constr typical.constr -D 100
    tee -o stat_100.txt stat -liberty sized.lib
    select -assert-none t:$and t:$or t:$xor t:$xnor t:$mux t:$not
    select -assert-none t:$_AND_ t:$_OR_ t:$_XOR_ t:$_XNOR_ t:$_MUX_ t:$_NOT_ t:$_NAND_ t:$_NOR_
    check
    design -load generic
    tee -o abc_heavy.txt abc -liberty sized.lib -constr heavy.constr -D 500
    tee -o stat_heavy.txt stat -liberty sized.lib
    select -assert-none t:$and t:$or t:$xor t:$xnor t:$mux t:$not
    select -assert-none t:$_AND_ t:$_OR_ t:$_XOR_ t:$_XNOR_ t:$_MUX_ t:$_NOT_ t:$_NAND_ t:$_NOR_
    check
    log PASS: tighter targets and heavier loads move the same function

    The last run previews the break-it: the same function at -D 500 against heavy.constr with a 0.2 pF load. Same target, heavier load.

    What the six runs printed

    Predict first You ask for 100 ps after seeing the 200 ps result. Will ABC hand you a faster netlist, or the same one back?

    The same one: the 100 ps run returns the 200 ps netlist exactly, at 211 ps and area 33.4. In this ABC script no tighter -D target found a faster cover, so the extra pressure buys nothing.

    Target -D

    Cells

    Area

    Delay reached

    Slack at 211 (common check)

    Slack at own target

    1000 ps

    5

    16

    342 ps

    -131 (fails)

    +658 (meets)

    700 ps

    5

    16

    342 ps

    -131 (fails)

    +358 (meets)

    500 ps

    5

    16

    342 ps

    -131 (fails)

    +158 (meets)

    300 ps

    5

    20.8

    298 ps

    -87 (fails)

    +2 (meets)

    200 ps

    5

    33.4

    211 ps

    0 (exactly meets)

    -11 (fails)

    100 ps

    5

    33.4

    211 ps

    0 (exactly meets)

    -111 (fails)

    Read the table top to bottom. The 1000 ps run is the loose end at area 16, arrival 342 ps, with 0 upsized cells; the 700 and 500 ps runs return exactly that netlist, so tightening the target that far buys nothing: the first plateau. Past it the mapper pays for speed with drive strength: the 300 ps run reports area 20.8 at 298 ps with 1 upsized cell, and the 200 ps run reaches area 33.4 at the tightest arrival in the table. That is 109% more area for 38% less delay across the sweep. The 100 ps run returns the 200 ps netlist unchanged: pressure past the fastest cover ABC found buys no more speed. Both slack columns are required minus arrival, computed, never typed.

    Area against delay: 3 distinct netlists, from the loosest target's cover at area 16 to the tightest at area 33.4.

    Slack, read both ways

    Two slack columns, two promises. The common-check column fixes one hypothetical requirement for every row (the tightest arrival in the table); do not read it as any run's own verdict — the loose end asked for 1000 ps. The own-target column checks each run against the -D it ran with: the 1000 through 300 ps runs meet theirs, while the 200 and 100 ps runs cannot, because in this ABC script no target below 200 ps found a faster cover than the 200 ps run's arrival. Same arrivals, opposite lessons: the sign follows the required time you choose, so the answers recompute slack from the table instead of quoting it.

    Recorded netlist at the 300 ps target: 5 cells, area 20.8, 1 upsized cell in orange.

    The structure barely moved between the loose and 300 ps netlists; the sizes on the slow path did. Before rewriting logic, the tool buys speed with drive strength — the orange cell is where the money went.

    Break it: quadruple the load

    The heavy run keeps the 500 ps target and swaps typical.constr for heavy.constr, raising the output load from 0.05 pF to 0.2 pF: 6 cells at area 19.2 with arrival 448 ps, against the 500 ps typical-load row in the table (5 cells at area 16). The cover changes to carry the load — the heavy histogram reads AND2 x1, AOI21 x2, BUF_X2 x1, NOR2 x1, XNOR2 x1, with a BUF_X2 the typical cover never needed — and the arrival slips by 106 ps. The 500 ps target still meets, but slack falls from +158 (meets) to +52 (meets) while area rises 3.2 units: recheck both after every load change.

    Common mistakes

    Trimming area on a failing path buys a small saving at the price of a violation. Shrink logic off the critical path first, and re-read slack after every change: pushing the target past the fastest cover ABC found buys no more speed, as the identical 200 and 100 ps rows show.

    The smallest cell fits the function. Why did the tool skip it?

    • Weak answer: the tool always picks the biggest cells, or area does not matter.

    • Strong answer: the path needed the faster cover, and slack decides, not area alone. ABC never sees the hypothetical required time; it reacts to its own -D target. The 1000 ps run meets its own target at area 16, and each tighter -D step that still misses buys drive strength — area 20.8 at the 300 ps step, area 33.4 at 200 ps — until the 100 ps step buys nothing because ABC found no faster cover. The run table prices each -D step.

    • Follow-up: the load quadruples yet the slack stays positive. Is the cover fine? Only against this target: the cover already changed, the arrival slipped, and the margin fell. Remap at the real load first; only then consider logic or library changes.

    Check yourself Against the table's common-check requirement, which runs meet timing and what are their slacks?

    Only rows whose Delay reached beats the tightest arrival meet it; slacks are the common-check column, required minus arrival, negatives failing. Promise the loosest arrival in that column and every run meets. The sign follows the required time, never the other way round.

    Check yourself The load quadruples at the same 500 ps target. What may the mapper do, and what does the recording show?

    It may upsize cells and insert a buffer: the recording adds a BUF_X2 the typical-load cover never needed and rebuilds the cone as AND2 x1, AOI21 x2, BUF_X2 x1, NOR2 x1, XNOR2 x1 — 6 cells at area 19.2 and arrival 448 ps against the 500 ps typical-load row before (5 cells at area 16). Same logic, a different cover, and the slack at 500 ps falls from +158 (meets) to +52 (meets).

    • Slack is required minus arrival: positive meets, zero exactly meets, negative fails.

    • A tighter target first buys bigger cells on the slow path, not new logic.

    • A target below what the library can reach changes nothing; the reports show it.

    Rule of thumb: read the delay the tool reports before tightening a target again, and recompute slack whenever the requirement moves.

    How this was checked

    Every number and picture on this page comes from one Yosys 0.69 run of the script shown, recorded by the course checker (scripts/tools/run-rtl-testbenches.mjs with COURSE=synth): ABC maps one cone against the teaching library sized.lib at six delay targets with typical.constr (BUF driver, 0.05 pF load) plus one run at the middle target with heavy.constr (0.2 pF). The library is fictional, so absolute areas and delays are teaching units; the shape of the trade is the point. Slack values are required minus the recorded arrival, computed on the page.

    • Interview: run a mock interview on this topic

    Related topics

    • Cuts and Matching

    • Inverters and Banned Cells

    • See also: Area, Power and Timing Tradeoffs

    Previous

    24 / 139

    Next: Inverters and Banned Cells

    Up next

    Up nextInverters and Banned Cells

    Sign in to save progress

    Practice this lessonPrevious lessonReport an error

    See also

    • Covering a Network with Cells
    • Mapping in Yosys