What is a routing blockage, and when do you use one?
From PDVerse PnR Interview Handbook · pdVerse Mentor Guide
Short Answer
A routing blockage is a region where routing is not allowed on the layers you name. Zroute treats it as a hard rule, so wires detour around it. You use one to keep routing off sensitive areas, away from macro pins or edges that cause DRCs, or to reserve space, and you add -zero_spacing when the goal is to keep vias out.
Technical Explanation
create_routing_blockagetakes a boundary, a rectangle, polygon or the area of existing objects, and the layers to block. It can be restricted to certain net types with-net_types, such as signal only.- By default a routing blockage is treated as real metal for extraction and design rule checks, and the default name is
RB_objId. -zero_spacingremoves the minimum spacing rule between the blockage edge and net shapes, and makes the blockage not count as metal for extraction or DRC. It is required when the blockage is meant to prevent via insertion.- A corridor blockage, created with
-reserve_for_top_level_routing, acts as a normal blockage inside the block, but frame view extraction removes it so the top level can route through that space. - Blockages cost capacity. Every track under a blockage is gone for the layers it covers, and the congestion map shows it.
- Blockages are different from routing guides. A guide steers or limits routing and Zroute honours it, but a blockage is an absolute "no".
What To Check
- That each blockage is on the intended layers and net types, with
get_routing_blockages. - Congestion next to blockages, where rerouted nets pile up.
- Whether a blockage meant to prevent vias has
-zero_spacing. - Signal pins under a blockage, which become blocked pins.
Command Checks & Actions
create_routing_blockage -boundary {{0 0} {40 40}} -layers {M2} -net_types signalBlocks signal routing on M2 inside the given rectangle.
create_routing_blockage -boundary {{0 0} {40 40}} -layers {VIA1} -net_types signal -zero_spacingPrevents VIA1 insertion in the area without adding a spacing halo.
get_routing_blockages *Lists the blockages in the block so you can check layers and names.
remove_routing_blockages -allRemoves all routing blockages, for example before rebuilding them from a script.
Healthy, Suspicious & Hard-stop Results
- Healthy (illustrative): Every blockage has a stated reason, no signal pins are underneath, and congestion around it stays below overflow.
- Suspicious (illustrative): A blockage causing a local overflow band next to it, still fixable by moving it or narrowing its layers.
- Hard stop: Signal or macro pins under a blockage with no access, or a blockage meant to stop vias created without
-zero_spacing, which frame view extraction then does not use to trim the via region.
Common Mistake
The Trap: Drawing a blockage on all layers when only one layer needed protection. A blockage meant to keep M2 off an analog macro edge also blocks M3 to M6. Nets that could have passed overhead now detour around the macro, and the channel beside it overflows.
What The Interviewer Is Testing
- Whether you know a blockage is a hard constraint.
- Do you know what
-zero_spacingchanges and when it is required? - A strong answer shows you scope blockages by layer and net type instead of blocking everything.
Follow-up Question & Model Response
"When would you use a routing guide instead of a blockage?"
Candidate Model Response: Use a guide when you want to influence routing without forbidding it: limit track utilization in an area, prefer one direction, or encourage river routing in a tight channel. Zroute honours guides, but they leave room for the router to find solutions. Use a blockage when routing in that area is simply not allowed, for example over a sensitive analog block. A blockage where a guide would do throws away capacity the router could have used carefully.
Practical Example
Tapeout Scenario: A block has a PLL macro that must have no signal wires on M2 and M3 within 5 um of its analog edge (illustrative). The engineer creates create_routing_blockage -boundary {{210 400} {215 460}} -layers {M2 M3} -net_types signal. The strip is 5 um wide and 60 um tall, so every horizontal M3 track crossing that 60 um band is cut for 5 um at the macro edge. The congestion map shows the next GCells over at 92% horizontal usage, tight but not overflowing. An earlier version that blocked all layers had pushed them to 118%.
PnR Flow Mentor Guide
Master the Physical Design Implementation Flow
Read the complete 8-chapter PnR Flow Mentor Guide free on the web — library setup through placement, clock tree synthesis, routing, chip finishing, hierarchical implementation, and ECO, all the way to stream-out.

Continue practising