Skip to content
Place Engine · CURRENT

iPL · placement engine

Global placement, legalization, and detailed placement engine. Agents can perform local moves within a frozen scope, evaluate HPWL and density changes, and receive legalization feedback—without needing to understand placement algorithm internals.

Place Engine CURRENT Tcl API Python SDK MCP
agent — iPL
# Agent calls iPL for placement
>>> client.call("iPL.place",
...   design_ref="snap_7f3a",
...   effort="standard")
[iPL ] global place done     hpwl=1.82e6
[iPL ] legalization done     density=0.74
[iPL ] detail place done     congestion=low
→ design_ref: snap_7f3a_v2
iPL placementGP globalLG legalizeDP detailHPWL wirelengthNesterov solvereDensity modeliDB databaseiPL placementGP globalLG legalizeDP detailHPWL wirelengthNesterov solvereDensity modeliDB database

Core capabilities

Global placement

iPL uses a Nesterov gradient-descent solver with an e-Density electrostatic density model to spread standard cells evenly in continuous space while minimizing weighted wirelength (WA model). When Agents call iPL.place with effort="estimate", they get a fast HPWL estimate without moving cells; with effort="standard", the full three-stage flow runs. After each step, intermediate state exports automatically to iDB as vectorized features for AiEDA Library.

Legalization

The Abacus legalization engine aligns post-global-placement cells to rows and sites, removes overlaps, and satisfies process constraints. Agents can pass a frozen_objects list to lock placed macros or critical-path standard cells; legality checks apply only to unfrozen regions. After legalization, dirty_set returns the set of moved cells—Agents can pass these downstream to iSTA for incremental timing analysis.

Detailed placement

Detailed placement swaps adjacent cell positions within local windows to optimize wirelength, timing, and routability. A max_displacement constraint prevents critical cells from drifting too far from their legalized positions. After each swap, Agents immediately get updated HPWL, timing slack, and congestion density, forming a closed optimization loop—something that traditionally requires Tcl scripts calling multiple tools repeatedly.

Incremental legalization

When Agents add, remove, or move cells locally at ECO scale, they need not rerun full-chip placement. Calling runIncrLG legalizes only changed cells (via inst_list) and their neighborhoods. Incremental runs typically take 1–5% of full legalization time, sharply reducing Agent decision-loop latency.

Agent calling patterns

iPL exposes three equivalent calling protocols. Agents pick the one best suited to their runtime—Python SDK for native integration, MCP for remote tool services, Tcl for existing script ecosystems.

Python
MCP
Tcl

Python SDK

from ieda import Client

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

# Standard full-flow placement
result = client.call(
    "iPL.place",
    design_ref="snap_7f3a",
    effort="standard",
    region="core",
    intent_ref="intent_v2",
)

# Access structured results
print(result.hpwl)            # 1823400.5
print(result.density)         # 0.738
print(result.congestion_map)  # <binary grid>
print(result.design_ref)      # "snap_7f3a_v2"
print(result.dirty_set)       # ["u_alu_0", "u_reg_5", ...]

# Incremental legalization: only fix local area
incr = client.call(
    "iPL.legalize",
    design_ref="snap_7f3a_v2",
    frozen_objects=["macro_0", "macro_1"],
)

Input / output contract

Request Schema — iPL.place

ParameterTypeRequiredDefaultDescription
design_refstringYesDesign snapshot reference, produced by upstream tools
effort"estimate" | "standard" | "in-design"Yesestimate: HPWL only, no cell moves; standard: full three-stage flow; in-design: incremental optimization on a placed design
regionstringNo"core"Placement target region name
intent_refstringYesAgent intent reference for provenance tracking
frozen_objectsstring[]No[]List of frozen cells—these cells will not be moved

Result Schema

FieldTypeDescription
hpwlfloatTotal half-perimeter wirelength (HPWL)
densityfloatPeak bin density (0.0–1.0)
congestion_mapbinaryCongestion heatmap grid data
design_refstringNew design snapshot reference (includes post-placement coordinates)
dirty_setstring[]Set of cell names that were moved
warningsstring[]Non-fatal warning messages

Role in the flow

RTL
 │
 ▼
┌──────────┐
│   iMap   │  Logic synthesis & tech mapping
└────┬─────┘
     │
     ▼
┌──────────┐
│   iFP    │  floorplanning (Floorplan)
└────┬─────┘
     │
     ▼
┌──────────┐
│  iPDN    │  power grid planning
└────┬─────┘
     │
     ▼
┌──────────────────────────────────────┐
│              iPL  ◆                  │
│  global placement → legalization → detailed placement          │
│  ↑ iSTA (pre-placement timing annotation)    │
│  ↓ iSTA (incremental timing analysis, dirty_set) │
└──────────────────┬───────────────────┘
                   │
                   ▼
          ┌──────────────┐
          │     iCTS     │  Clock tree synthesis
          └──────┬───────┘
                 │
                 ▼
          ┌──────────────┐
          │     iTO      │  timing optimization
          └──────┬───────┘
                 │
                 ▼
          ┌──────────────┐
          │     iRT      │  Global & detailed routing
          └──────────────┘
Upstream dependenciesiFP (floorplanning), iPDN (power grid), iMap (gate-level netlist)
Downstream consumersiCTS (clock tree synthesis), iTO (timing optimization), iSTA (incremental timing analysis)
Concurrent interactioniSTA spans the flow—pre-placement timing annotation and post-placement incremental analysis from dirty_set

Keep building with open intermediate state

After placement completes, design state exports automatically via iDB—downstream tools and AI models read from the same snapshot.