Skip to content
Route Engine · CURRENT

iRT · routing engine

Global and detailed routing engine. Agents can locally re-route frozen nets and fix local DRC violations without disturbing completed routes—downgrading routing problems from chip-wide disasters to local repairs.

Route Engine CURRENT Tcl API Python SDK MCP
agent — iRT
# Agent calls iRT for routing
>>> client.call("iRT.route",
...   design_ref="snap_7f3a",
...   effort="standard",
...   nets=["net_1234", "net_5678"])
[iRT ] global route done     completed=12,802
[iRT ] track assign done     wirelength=4.2e6
[iRT ] detail route done     drc=0 via=24,531
→ design_ref: snap_7f3a_v3
iRT routingGR globalTA track assignDR detailMaze routerA* searchDRC clean3D gridiRT routingGR globalTA track assignDR detailMaze routerA* searchDRC clean3D grid

Core capabilities

Global routing

iRT's global routing stage partitions the routing region into a 3D grid (x, y, layer) and uses maze routing (A* search) to find coarse paths with minimal congestion and controlled wirelength for each net. With effort="estimate", Agents get a fast congestion assessment from global routing only; with effort="standard", the full global routing + track assignment + detail routing flow runs. Global routing output includes per-net demand on each grid edge—exportable to AiEDA Library as congestion feature vectors.

Track assignment

Track assignment maps coarse global-routing paths onto manufacturing tracks while respecting per-layer preferred direction, minimum spacing, and other process rules. It optimizes wire positions while preserving global routing topology, providing a high-quality starting point for detail routing. Agents can lock already optimized nets via frozen_nets and run track assignment only on new or modified nets.

Detail routing

Detail routing starts from track assignment results and routes each net segment-by-segment on the manufacturing grid. It supports multi-width metal wires, via arrays, and non-default rule (NDR) width/spacing. The core Agent capability: via the nets parameter, iRT rip-up and reroutes only those nets and their immediate neighborhoods; completed routes locked by frozen_nets remain untouched. Agents can iteratively fix local DRC—one or a few nets at a time—without rerouting the entire chip from scratch.

Partial rip-up and reroute

Combining nets and frozen_nets, Agents get precise local re-route: specify nets to fix, lock all others, and iRT runs maze search within the new constraint boundary. After completion, drc_count reports remaining DRC violations and failed_nets lists nets that could not be routed. Agents use this to decide next steps—try different net ordering, adjust routing parameters, or escalate for human review.

Agent calling patterns

iRT exposes three equivalent calling protocols.

Python
MCP
Tcl

Python SDK

from ieda import Client

client = Client("http://localhost:9099")

# Standard full-flow routing
result = client.call(
    "iRT.route",
    design_ref="snap_7f3a",
    effort="standard",
)

print(result.completed_nets)  # 12802
print(result.failed_nets)     # 0
print(result.drc_count)       # 0
print(result.wirelength)      # 4.2e6
print(result.via_count)        # 24531

# Partial re-route: only fix specific nets
partial = client.call(
    "iRT.route",
    design_ref="snap_7f3a",
    effort="in-design",
    nets=["net_1234", "net_5678"],
    frozen_nets=["net_0001", "net_0002", "..."],
)
print(partial.drc_count)    # 3  (remaining violations)
print(partial.failed_nets)  # ["net_5678"]

# Quick congestion estimation
est = client.call(
    "iRT.route",
    design_ref="snap_7f3a",
    effort="estimate",
)

Input / output contract

Request Schema — iRT.route

ParameterTypeRequiredDefaultDescription
design_refstringYesDesign snapshot reference with post-placement cell coordinates, netlist, and process data
effort"estimate" | "standard" | "in-design"Yesestimate: global routing congestion only; standard: full three-stage flow; in-design: partial re-route
netsstring[]No[] (all)Nets to route (for partial re-route)
frozen_netsstring[]No[]Frozen net list—these nets' routing results will not be modified

Result Schema

FieldTypeDescription
completed_netsintNumber of successfully routed nets
failed_netsintNumber of nets that could not be routed
drc_countintRemaining DRC violation count
wirelengthfloatTotal wirelength (sum of all completed nets)
design_refstringNew design snapshot reference (includes routing results)
via_countintTotal via count

Role in the flow

RTL
 ↓
 iMap (Synth)
 ↓
 iFP (floorplanning)
 ↓
 iPDN (power grid)
 ↓
 iPL (Place)
 ↓
 iCTS (Clock tree synthesis)
 ↓
 iTO (timing optimization)
 ↓
────────────────────────────
 ↓
◆ iRT (routing engine)      ← upstream: post-placement DEF + clock tree + timing-optimized netlist
 │                         → input: LEF/DEF, design rules, RC tech files
 │  [global routing]              ↔ iSTA (pre-route timing estimation)
 │  [track assignment]
 │  [detail routing]              ↔ iDRC (live DRC check)
 │                         ↔ iRCX (parasitic extraction for iSTA signoff)
 ↓
────────────────────────────
 ↓
 iDRC (Design rule check)
 ↓
 iLVS (layout vs. schematic)
 ↓
 GDSII
Upstream dependenciesiPL (placement), iCTS (clock tree), iTO (timing optimization)—cell coordinates, clock routes, and optimized netlist required
Downstream consumersiSTA (post-route signoff timing with parasitics), iDRC (design rule check), iRCX (parasitic extraction)
Concurrent interactionDetail routing interacts tightly with iDRC—each net is DRC-checked before writing to iDB; only DRC-clean routes are committed

Routing results, instantly verifiable

After iRT completes, design state includes routing geometry—iDRC can run incremental DRC immediately, and iSTA can use iRCX-extracted parasitics for signoff timing analysis.