Core capabilities
Multi-rule geometry checks
iDRC supports full basic geometric DRC: spacing (same/adjacent layer metal and via minimum spacing), width (min/max wire and via width), enclosure (metal over vias and vias over metal), area (minimum polygon area), notch (minimum notch width), and more. Agents set the rule set via rules (e.g. ["spacing", "width"]) or ["all"] for a full check. Each rule returns independently so Agents can locate violation types without parsing logs.
Incremental DRC (dirty region)
Full-chip DRC is among the slowest EDA steps. iDRC incremental mode tracks geometry changed since the last check (dirty region) and re-runs DRC only there. With incremental=true, iDRC pulls dirty regions from iDB, merges overlaps, and verifies locally. After a router fixes a few nets, incremental DRC often takes 2–10% of full-chip time. Results include clean_regions—verified violation-free bounding boxes.
Region-scoped checks
Agents can limit DRC to a rectangle via the region parameter (BBox). In interactive repair, after identifying a violation region, Agents can loop edit-check on that area and margin in milliseconds instead of waiting for full-chip verification. Combined with rules, DRC becomes an interactive feedback loop—not batch-only.
Typed violation reports
iDRC returns structured violations: each Violation has type, layer, BBox, object refs, and severity. Unlike text DRC logs, Agents can iterate, group by type, cluster by region, and rank by severity—enabling automated triage and repair priority. This is the data foundation for autonomous DRC repair loops.
Agent calling patterns
iDRC exposes three equivalent calling protocols.
Python SDK
from ieda import Client client = Client("http://localhost:9099") # Full DRC check (all rules) drc = client.call( "iDRC.check", design_ref="snap_7f3a", rules=["all"], incremental=False, ) print(drc.violation_count) # 0 print(drc.coverage) # 1.0 (100% area checked) # Incremental DRC: only check dirty regions incr = client.call( "iDRC.check", design_ref="snap_7f3a", rules=["spacing", "width", "enclosure"], incremental=True, ) print(incr.violation_count) # 3 for v in incr.violations: print(v.rule, v.layer, v.bbox, v.severity) # enclosure, M2, [(100,200),(150,220)], ERROR print(incr.clean_regions) # verified-clean bounding boxes # Region-limited DRC for interactive repair loop region_check = client.call( "iDRC.check", design_ref="snap_7f3a", rules=["spacing"], region={"x0": 100, "y0": 200, "x1": 300, "y1": 400}, )
Input / output contract
Request Schema — iDRC.check
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
design_ref | string | Yes | — | Design snapshot with full layout geometry |
rules | string[] | Yes | — | Rule list: spacing, width, enclosure, area, notch, etc.; ["all"] for full check |
incremental | bool | No | false | Incremental check on dirty region only |
region | BBox | No | null (full chip) | Bounding box for scoped check {x0, y0, x1, y1} |
Result Schema
| Field | Type | Description |
|---|---|---|
violation_count | int | Total violation count |
violations | Violation[] | Violation details: rule, layer, bbox, objects, severity |
clean_regions | BBox[] | Verified clean region bounds (especially useful in incremental mode) |
coverage | float | Check coverage (0.0–1.0): fraction of layout area checked |
design_ref | string | Associated design snapshot reference |
Role in the flow
iDRC mainly runs in post-route physical verification; incremental mode makes it essential in ECO loops.
RTL → iMap → iFP → iPDN → iPL → iCTS → iTO → iRT
│
After routing completes │
↓
──────────
↓
◆ iDRC (Design rule check)
│ [spacing] [width]
│ [enclosure] [area]
│ [notch] [min-step] ...
│
↓ DRC Clean?
│
Yes │ No
│ │
↓ ↓
iLVS iECO (ECO)
(LVS) │
│ ↓
↓ iRT (local re-route)
GDSII │
↓
iDRC (incremental recheck)
↑
└────── loop ──────┘