Content is user-generated and unverified.

BJT Differential Pair IC Die — What Actually Fixed Congestion

Summary

Multi-layer Pathfinder routing was the single major contributor to congestion reduction. All placement-side optimizations were either reverted or marginal.

Attempted Fixes vs. Impact

Attempted FixTargetCongestion Impact
Hard shell repulsionQPO placementReverted — made QPO worse, pushed components into corners
Channel enforcementQPO placementReverted — fought attraction forces every sweep
Footprint-aware repulsionQPO placementReverted — broke layout for mixed-size pairs
Channel-aware cost termQPO cost functionReverted — no visible effect on routing quality
Cheap proxy congestionQPO mid-round refreshReverted — inaccurate heatmap, worse than stale
Handcrafted positionsInitial placementReverted — cascading issues with QPO_MIN conflicts
Congestion-aware QPO cost (λ)QPO cost functionMarginal — ~5% improvement at best
Adaptive net reorderPathfinder iterationMarginal — tiebreak role only
Route-eval frame selectionQPO→routing bridgeHelpful — picks better QPO frame by actual routing
Multi-layer A* with viasPathfinder router16.0 → 0.8 (95% reduction)

The Numbers

                      │ Cong  │ Zero% │ Match  │ Vias │ WL
  ────────────────────┼───────┼───────┼────────┼──────┼──────
  1-Layer (baseline)  │  16.0 │    0% │  59.2% │    0 │ 698λ
  3-Layer M1-pin-only │   3.3 │    0% │  60.4% │   20 │ 577λ
  3-Layer any-layer   │   0.8 │   50% │  61.7% │   18 │ 572λ
  • 5 out of 10 seeds hit zero congestion — seeds 42, 137, 500, 1234, 8888
  • Worst seed dropped from 48 to 2 congestion cells
  • Wirelength improved 18% (698 → 572λ) — routes take direct cross-layer paths
  • Via count is modest at 18 average — reasonable for a 3-metal process

What Changed in the Router

The A* search space expanded from (x, y) to (x, y, z) where z ∈ {0, 1} represents the metal layer:

  • Layer 0 (M1): horizontal preferred — horizontal moves cost 1.0, vertical cost 1.8
  • Layer 1 (M2): vertical preferred — vertical moves cost 1.0, horizontal cost 1.8
  • Via transition: same (x, y), flip layer — cost 3.0

Congestion tracking became per-layer: presOcc[z][x][y]. Two nets crossing at the same (x, y) on different layers no longer conflict. This is the key — the old single-layer router counted every crossing as congestion, even when the nets would physically pass over each other on different metal layers.

Root Cause Analysis

The original congestion was never a placement problem. We spent 12 iterations trying to fix QPO placement — adjusting repulsion, adding channel enforcement, computing footprint-aware distances, feeding congestion back into the cost function. None of it worked because the fundamental issue was routing dimensionality: 18 nets competing for 4,800 cells when they should have had 9,600 (2 layers × 4,800).

The placement optimizations were trying to spread components apart to create wider routing channels — compensating for a router that couldn't use vertical clearance. With a proper multi-layer router, the original QPO with random scatter and simple repulsion already produces zero-congestion results on 50% of seeds.

The Lesson

When routing fails, fix the router first, not the placer.

Placement quality matters, but only after the router can actually exploit the available routing resources. A perfect placement with a single-layer router will always congest. A mediocre placement with a multi-layer router routes cleanly.

Content is user-generated and unverified.
    BJT Die Routing: Multi-Layer A* Cuts Congestion 95% | Claude