vyges-grt — global routing
Physical construction — opt-in, and not part of
vyges install loom. These engines build the design database that the sign-off and verification engines read, so they install as their own group:vyges install physical # all of them vyges install grt # just this oneIt is also a standalone
vyges-grtbinary on your PATH, which is what the dispatch calls and what a flow author targets directly. Source: vyges-tools/grt.
A global router decides, for each net, which cells of a coarse routing grid the detailed router
may use. The answer is a set of route guides, one rectangle per segment on a layer, and the
guides are what detailed routing (vyges-drt detailed_route) consumes.
vyges-grt routes a placed design and writes those guides. Two routers sit behind the
global_route step: the default negotiation-based router, with pattern and maze routing, 3D layer
assignment and rip-up and reroute, and a second, CUGR-style router selected with use_cugr. Both
handle non-default rules, incremental routing and antenna repair, and timing-driven routing is
timed by the engine’s own timer.
Run it
The input is a JSON job: the design, and the steps a routing script would run, in order.
{
"lefs": ["tech.lef", "cells.lef"],
"def": "placed.def",
"steps": [
{ "cmd": "set_routing_layers", "signal": ["met1", "met5"] },
{ "cmd": "global_adjustment", "value": 0.5 },
{ "cmd": "global_route" },
{ "cmd": "write_guides", "path": "route.guide" }
]
}
vyges-grt route job.json # the report on stdout
vyges-grt route job.json -o report.json
To hand the result straight to detailed routing, add { "cmd": "write_db", "path": "routed.odb" }
after global_route: it writes the database as global routing leaves it — every net’s guides, the
gcell grid and the routing layers — and vyges-drt detailed_route --db routed.odb reads exactly
that:
vyges-grt route job.json # ... "write_db", "path": "gr.odb"
vyges-drt detailed_route --db gr.odb --out routed.def
A design can come from a database ("db": "placed.odb") instead of LEF and DEF. Order matters:
a per-layer adjustment is judged against the maximum routing layer at the time it is given, and a
second global_route runs on the design the first one left. The full step list is in the
CLI reference.
The report is JSON:
{"status":"routed","global_route":[{"nets":2,"total_overflow":0,"congested":false,"clock_nets":[]}],
"files_written":["route.guide"],"guides_written":["route.guide"],"log":[]}
Status and exit codes
| status | exit | meaning |
|---|---|---|
routed | 0 | every step ran; the report lists each global_route and every file written |
vacuous | 2 | every step ran but none produced anything: no global_route and no file written. Not a pass |
error | 2 | usage, unreadable input, a failed write, or routing that ends congested without allow_congestion |
refused | 3 | a step needs something this engine does not model; reason names it |
Diagnostics go to stderr as vyges-events records (GRT-DONE, GRT-REFUSED, GRT-ERROR, and
the design database’s own messages), so stdout carries nothing but the report.
Limits
- One input is an oracle.
repair_antennastakes the antenna violations as a reference checker reports them (itsviolationsfile); the violation check itself is not modelled, and diode insertion is refused.timer_slacks, when given, also answers the timer from a captured file instead of computing the slacks. - Refused rather than approximated: reading pin access points during antenna checking; a second antenna-repair iteration; incremental routing with no CUGR route in the session; design edits inside an incremental bracket that are not modelled (each named); RC settings before a liberty library; a clock period with no liberty library to time it.
- The Steiner trees come from
vyges-sttand the placement parasitics fromvyges-est, each correlated separately.