Detailed Placement Optimization
The idea
Once cells are legal, a family of local optimizations grinds out the remaining wirelength, each attacking a different move structure:
- Global swap / vertical swap: for each cell, compute its optimal region (the median box of its connected pins); if a better position there exists, swap with the occupant or shift into whitespace.
- Local reordering: within a window of a few consecutive cells in one row, try all permutations and keep the best.
- Single-row optimization: fix cell order in a row and solve positions exactly (the Abacus clustering mathematics, or linear-time slack redistribution) to minimize wirelength with cells sliding within free space.
- Independent-set matching: find many mutually non-interacting cells of equal width, then solve their optimal one-to-one assignment to their current slot set as a bipartite matching, achieving a simultaneous multi-cell move no greedy pass would find.
- Window rip-up and re-place (Domino style): free all cells in a small region and re-place them optimally via network-flow or enumeration.
Engines like FastDP orchestrate these in converging rounds; modern variants add timing awareness (weight nets by criticality) and routability terms (respect cell padding and pin-access spacing).
Why it matters
Individually tiny, collectively decisive: detailed placement routinely
recovers several percent of wirelength and fixes the local pathologies
(pin-access conflicts, row-end congestion) that global optimization
cannot see. In OpenROAD this is the detailed_placement step (the dpl
module, with its own swap and reordering passes).
Where you meet it today
Every flow, every tool, immediately after legalization, and again after any engineering change order touches the placement.