Skip to content

Agent Planner · Goal decomposition & execution monitor

Decomposes natural-language or structured goals into executable typed plans with live critic and adjustment. Deterministic rule baselines suffice—no LLM required.

Agent Service · D1 · Wave 1 In development · D1 iEDA.ai L4
planner — critic — recovery
# decompose goal into typed plan
$ planner.plan("Optimize critical-path timing")
[step 1] STA identify critical paths
[step 2] Resize cells on path top-3
[step 3] Verify timing delta
→ critic monitors, recovery on failure
iMapsynthesisiFPfloorplaniPDNpoweriPLplacementiCTSclockiTOoptimizationiRTroutingiSTAtimingAiEDAdesign dataiPCLlayout modeliMapsynthesisiFPfloorplaniPDNpoweriPLplacementiCTSclockiTOoptimizationiRTroutingiSTAtimingAiEDAdesign dataiPCLlayout model

Core capabilities

1. Plan Generation

Decompose goals (natural language or DSL) into sub-task sequences: goal → sub-plan → tool selection → dependency ordering. Each sub-task has explicit I/O contracts and expected thresholds. Supports sequential, parallel, conditional dependencies.

2. Critic

Monitor execution after each sub-task for goal drift. Critic does not modify the plan—it emits on-track / deviation-detected / goal-violated reports for Planner decisions.

3. Recovery

Auto-generate alternatives on sub-task failure. Recovery: rollback to checkpoint, swap toolchain, adjust parameters, relax goals (e.g., +5% area for timing convergence). All recovery paths pass Gate evaluation.

4. Stop Criteria

Hard vs soft gates:

  • Hard gates: constraint violations (e.g., area overrun), budget exhaustion (wall-clock or tool calls), unrecoverable errors.
  • Soft gates: diminishing returns (N rounds improvement < threshold), goal met but further tuning yields little gain.

Agent calling patterns

from ieda.agent import Planner, Goal, StopCriteria

planner = Planner()

goal = Goal(
    target="Optimize critical-path timing,no more than 5% area increase",
    constraints={"area_budget_pct": 5.0},
    quality={"timing_slack_ps": -50}
)

plan = planner.plan(goal)

# plan.result: TypedPlan {
#   steps: [Step("sta-analyze", tool="iSTA"),
#           Step("resize-critical", tool="iPL", deps=["sta-analyze"]),
#           Step("verify", tool="iSTA", deps=["resize-critical"])],
#   stop: HardStop("area_budget_pct <= 5.0"),
#   critic: OnStepComplete("verify") -> CompareDelta("timing_slack_ps")
# }

result = planner.execute(plan, db=current_idb)
# critic runs after each step, recovery triggers on failure

Input / output contract

DirectionFieldTypeDescription
Inputgoalstr | GoalNatural-language or structured goal description
InputconstraintsdictHard constraints: area, power, time budget
Inputtool_capabilitieslist[str]Available tools (for tool selection)
Inputdesign_snapshotstrDesign checkpoint identifier
OutputplanTypedPlanFull plan with steps, deps, stop, critic
Outputexecution_traceTracePer-step I/O/runtime/result
Outputrecovery_loglist[Recovery]All recovery events and alternatives