Congestion compares routing demand with routing supply in each region. Demand comes from pins that must escape; supply comes from tracks crossing the region.
Synthesis cannot route, so it uses a proxy. Pin density is the simplest one: pins divided by region area.
Take an EXAMPLE threshold of 0.05 pins per square micron. Regions above it are flagged congested before any route exists.
The second proxy below counts track crossings instead of area. Both are EXAMPLE gauges, not a router verdict.
region A: 100 um x 100 um = 10000 um^2, 600 pins
density = 600 / 10000 = 0.06 pins/um^2 -> above 0.05, congested
region B: 200 um x 100 um = 20000 um^2, 600 pins
density = 600 / 20000 = 0.03 pins/um^2 -> below 0.05, clear
track check on A: demand 600 x 2 = 1200 crossings, capacity 800
proxy = 1200 / 800 = 1.5 -> above 1, congested
after remap: 300 pins -> demand 600, proxy = 600 / 800 = 0.75 -> clearThe program below computes both proxies for the stated regions. Its five self-checks repeat the hand arithmetic exactly.
import sys
THRESHOLD = 0.05
def density(pins, w_um, h_um):
return pins / (w_um * h_um)
def track_proxy(pins, crossings_per_pin, capacity):
return pins * crossings_per_pin / capacity
def close(got, want):
return abs(got - want) / want < 1e-9
got = [
density(600, 100.0, 100.0),
density(600, 200.0, 100.0),
track_proxy(600, 2.0, 800.0),
track_proxy(300, 2.0, 800.0),
]
want = [0.06, 0.03, 1.5, 0.75]
for i in range(len(got)):
if not close(got[i], want[i]):
print("FAIL: proxy " + str(i + 1) + " got " + str(got[i]) + " want " + str(want[i]))
sys.exit(1)
if not (got[0] > THRESHOLD and got[1] < THRESHOLD):
print("FAIL: density flags disagree with the threshold")
sys.exit(1)
print("PASS: congestion proxies match hand arithmetic on 5 checks")Technology mapping picks cell sizes and counts, and both move pin density. A faster mapping with bigger or more cells raises demand in exactly the hot region.
Mapping choice | Physical effect | Congestion direction |
|---|---|---|
Stronger drivers on long nets | Larger cells, more pins per area | Worse locally, shorter delay |
Extra buffering | More cells along the route | Worse count, shorter segments |
Wide mux kept flat | Many inputs converge in one spot | Worse hotspot |
High-fanout driver duplicated | Load split across two cells | Better per sink, one more cell |
0.06 pins per square micron. Above the 0.05 threshold, so flagged congested.
More cells and pins raise demand further. The net improves on paper while the region gets harder to route.