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

AboutContactPrivacyTerms
Skip to lesson

Course contents

  • Logic Synthesis Glossary
  • Logic Synthesis Cheatsheet
  • Synthesis Foundations14
  • Logic Optimisation and Mapping20
  • Constraints and Timing15
    • SDC for Synthesis
    • Delay Models and Slack
    • Timing-Driven Synthesis
      • Critical-Path Focus
      • Restructuring and Duplication
      • Sizing and Path Groups
      • Reading WNS and TNS
      • Margin and When to Stop
  • Sequential, FSM and Memory19
  • Datapath Synthesis14
  • Area, Power and Test14
  • Verification, ECO and Handoff15
  • Flows and Debugging15
  • Interview and Judgment11
Loading lesson

‹Timing-Driven Synthesis
  1. Topics
  2. Logic Synthesis
  3. Constraints and Timing
  4. Timing-Driven Synthesis
  5. Sizing and Path Groups

Part 3 · Constraints and Timing · Intermediate

Sizing and Path Groups

Gate sizing on the worst path, plus path groups and weights that split effort.

On this page

    Sizing trades area for drive

    A larger gate drives its load faster and occupies more area. Sizing up gates on the critical path shortens arrival one stage at a time.

    The model below uses EXAMPLE parameters with units and a stated formula. Delay of one gate is its base delay divided by its size, and area is its base area times its size.

    Diagram
    EXAMPLE parameters: delays in delay units, areas in teaching-library area units
    three gates, base delays 4.0, 3.0, 3.0; base areas 2, 2, 2 (one NAND2 each)
    required time = 6.0; rule: delay(size) = base delay / size, area(size) = base area x size
    start: arrival = 4.0 + 3.0 + 3.0 = 10.0; slack = 6.0 - 10.0 = -4.0; area = 6
    upsize gate 0 (slowest, 4.0): delays 2.0, 3.0, 3.0; arrival = 8.0; slack = -2.0; area = 8
    upsize gate 1 (slowest, 3.0): delays 2.0, 1.5, 3.0; arrival = 6.5; slack = -0.5; area = 10
    upsize gate 2 (slowest, 3.0): delays 2.0, 1.5, 1.5; arrival = 5.0; slack = +1.0; area = 12
    stop with slack >= 0; growth = 12 - 6 = 6 area units over 3 upsizes

    A sizing loop on one path

    The program below runs that loop: upsize the slowest gate until slack reaches zero. Its checks pin every arrival, size, and area from the hand arithmetic above.

    example.py
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    import sys
    
    BASE_DELAY = [4.0, 3.0, 3.0]
    BASE_AREA = [2, 2, 2]
    REQUIRED = 6.0
    MAX_SIZE = 4
    
    def total(xs):
        s = 0.0
        for x in xs:
            s += x
        return s
    
    def close(got, want):
        return abs(got - want) < 1e-9
    
    sizes = [1, 1, 1]
    start_arr = total([BASE_DELAY[i] / sizes[i] for i in range(3)])
    after = []
    guard = 0
    while True:
        delays = [BASE_DELAY[i] / sizes[i] for i in range(3)]
        arr = total(delays)
        slack = REQUIRED - arr
        if slack >= 0.0:
            break
        worst = 0
        for i in range(1, 3):
            if delays[i] > delays[worst]:
                worst = i
        if sizes[worst] >= MAX_SIZE:
            print("FAIL: size cap reached with slack " + str(slack))
            sys.exit(1)
        sizes[worst] += 1
        guard += 1
        if guard > 100:
            print("FAIL: loop did not settle")
            sys.exit(1)
        after.append(total([BASE_DELAY[i] / sizes[i] for i in range(3)]))
    
    end_arr = total([BASE_DELAY[i] / sizes[i] for i in range(3)])
    end_slack = REQUIRED - end_arr
    end_area = BASE_AREA[0] * sizes[0] + BASE_AREA[1] * sizes[1] + BASE_AREA[2] * sizes[2]
    
    if not close(start_arr, 10.0):
        print("FAIL: start arrival " + str(start_arr) + " want 10.0")
        sys.exit(1)
    if after != [8.0, 6.5, 5.0]:
        print("FAIL: trace " + str(after) + " want [8.0, 6.5, 5.0]")
        sys.exit(1)
    if sizes != [2, 2, 2]:
        print("FAIL: sizes " + str(sizes) + " want [2, 2, 2]")
        sys.exit(1)
    if not close(end_slack, 1.0):
        print("FAIL: end slack " + str(end_slack) + " want 1.0")
        sys.exit(1)
    if end_area != 12:
        print("FAIL: end area " + str(end_area) + " want 12")
        sys.exit(1)
    
    print("PASS: sizing loop moves slack -4.0 to +1.0 in 3 upsizes, area 6 to 12")

    Groups and weights split the budget

    Path groups collect paths with a shared target, such as core logic and IO paths. Weights state which group matters more when one transform cannot serve both.

    The numbers below are illustrative: relative weights whose scale differs between tools. A heavier group draws effort first, and a lighter group may wait several passes.

    Diagram
    illustrative groups (not tool output; weight scales differ between tools)
    group core: register-to-register paths, weight 10, draws effort first
    group io: input-to-register and register-to-output paths, weight 5
    group slow: paths with relaxed targets, weight 1, served after the rest

    Common mistakes

    Common pitfall

    Sizing every gate on a failing path instead of the slowest ones grows area for the same arrival. Rank the stages, upsize the worst, then re-rank before the next step.

    Interview

    Likely probes: the sizing tradeoff and what weights do.

    • Each upsize here buys delay at exactly 2 area units: arrivals 10.0, 8.0, 6.5, 5.0 against areas 6, 8, 10, 12.

    • The loop stops at the first non-negative slack; extra sizing past zero is waste.

    • Weights order groups when effort cannot serve all paths at once.

    Check yourself After two upsizes the arrivals read 8.0 then 6.5 with required 6.0. Why does the loop run a third time?

    Slack is still -0.5 after the second upsize. The loop stops only at non-negative slack, reached at 5.0.

    Check yourself Group core has weight 10 and group slow has weight 1. What does that order mean for effort?

    Core paths draw effort first. Slow paths are served after the heavier groups stop improving.

    Related topics

    • Up: Timing-Driven Synthesis

    • Next: Reading WNS and TNS

    • Technology Mapping

    Previous

    49 / 139

    Next: Reading WNS and TNS

    Up next

    Up nextReading WNS and TNS

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • Critical-Path Focus
    • Margin and When to Stop