What are Zroute's engines, and which command drives each?
From PDVerse PnR Interview Handbook · pdVerse Mentor Guide
Short Answer
Zroute, the ICC2 router, has five engines: global routing, track assignment, detail routing, ECO routing and routing verification. The first three can be run one at a time with route_global, route_track and route_detail, or all together with route_auto. ECO routing and verification are only reached through their own task commands, route_eco and check_routes.
Technical Explanation
- Global routing (
route_global) assigns net segments to global routing cells and produces the congestion map. It is the only engine that can run in congestion-map-only mode, without keeping any routes. - Track assignment (
route_track) puts each global segment on a real track. After it finishes, the block no longer has global routes; it has real metal shapes with many violations, especially near pins. - Detail routing (
route_detail) fixes those violations. It also handles antenna rules, via optimization and concurrent redundant vias during its iterations. - ECO routing (
route_eco) is for changes after signal routing is complete. It connects open nets and fixes DRCs; with-nets, DRC fixing stays inside those nets' ECO area, while without it the whole block is covered. - Routing verification (
check_routes) reports DRCs, open nets, antenna violations and voltage area violations on routed signal nets. It writes its results to thezroute.errerror data. route_autochains global routing, track assignment and detail routing. It is the normal choice once the flow is stable; the separate commands are for when you want to stop and look between steps.- All engines read the same
route.commonapplication options, and each engine also has its own option group, such asroute.global,route.trackandroute.detail.
What To Check
- After
route_global, the overflow summary it prints and the stored congestion map. - After
route_track, the wire length and via count summary. - After
route_detail, the DRC count per iteration and whether it is still falling. - After any routing step,
check_routesfor DRCs, opens and antenna violations.
Command Checks & Actions
route_globalRuns the global routing engine and reports overflow.
route_trackRuns track assignment on the existing global routes.
route_detailRuns detail routing and search-and-repair iterations.
route_eco -nets {n1 n2} -reroute modified_nets_onlyRuns the ECO routing engine on changed nets after signal routing is complete.
check_routesRuns routing verification: DRC, opens, antenna and voltage area checks.
route_autoRuns global routing, track assignment and detail routing in one command.
Healthy, Suspicious & Hard-stop Results
- Healthy (illustrative): Each engine finishes with its expected output: overflow near zero after global routing, a steadily falling DRC count in detail routing, and
check_routesshowing zero opens. - Suspicious (illustrative): Detail routing DRC count flattens at a few hundred after 10 or more iterations.
- Hard stop: Open nets after detail routing, or
check_routesnever run. Opens needroute_eco; incremental detail routing does not connect them.
Common Mistake
The Trap: Using route_detail -incremental true to fix open nets reported by check_routes. Incremental detail routing only cleans up DRCs; it does not connect opens. The engineer reruns it three times, the opens stay, while one route_eco run would have connected them.
What The Interviewer Is Testing
- Whether you know which engines have their own commands and which are only reached through task commands.
- Do you pick the right engine for a symptom: opens go to ECO routing, DRC clean-up goes to detail routing?
- A strong answer shows you understand
route_autoas a convenience wrapper, not a different router.
Follow-up Question & Model Response
"After route_auto finishes, why run check_routes separately?"
Candidate Model Response: Detail routing reports its own DRC summary, but check_routes is the verification engine and checks the block as it now stands, including antenna and voltage area rules and open nets. It also refreshes zroute.err, which later commands such as incremental detail routing and remove_redundant_shapes can read. If anything has been edited since routing, only a fresh check_routes sees it.
Practical Example
Tapeout Scenario: On a 400k-instance block (illustrative), route_auto finishes with 212 DRCs. check_routes confirms 212 DRCs and also reports 3 open nets on cells that were resized after routing. The engineer runs route_eco on those three nets, which connects them, then check_routes and route_detail -incremental true -initial_drc_from_input true, which drops the DRC count to 18. A final check_routes shows 0 opens and 18 DRCs, all in one macro corner, which go to a separate review.
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