Skip to content
Clock Engine · CURRENT

iCTS · Clock tree synthesis

Clock tree synthesis engine. Agents can inspect clock tree structure, retrieve common-path timing, and adjust local subtrees—instead of treating the clock tree as a black box.

Open-source EDAAgent-callableObservable clock treeGPL-3.0
agent — icts
# Agent-driven clock tree synthesis
[iCTS ] skew achieved     0.042
[iCTS ] latency achieved   0.89
[iCTS ] buffers inserted     78
→ inspect clock paths interactively
iMapsynthesisiFPfloorplaniPDNpoweriPLplacementiCTSclockiTOoptimizationiRTroutingiSTAtimingAiEDAdesign dataiPCLlayout modeliMapsynthesisiFPfloorplaniPDNpoweriPLplacementiCTSclockiTOoptimizationiRTroutingiSTAtimingAiEDAdesign dataiPCLlayout model
post-placementKey step
AgentCallable
DME+Slew-AwareAlgorithm framework
GPL-3.0License

Core capabilities

iCTS (Clock Tree Synthesis) builds the buffered tree network from clock sources (PLL/OSC) to all timing-register clock pins after standard-cell placement. Goals include keeping clock skew within constraints, minimizing insertion latency, and meeting transition/slew requirements. iCTS uses a DME (Deferred-Merge Embedding) plus Slew-Aware dual framework—bottom-up geometric merging and top-down timing propagation and correction.

Agents can upgrade iCTS from a one-click build tool to an interactive clock-tree debug platform. Use cases include: clock tree inspection—traverse topology, check fanout and load per buffer level, identify abnormally long branches or high-fanout nodes; local clock tree resynthesis—when STA finds skew violations on a path, rebuild only the problem subtree (adjust buffer types, add buffer levels, or change routing topology) instead of rerunning full CTS; skew target tuning—try different skew_target values (e.g. 0.02ns vs 0.05ns) and observe trade-offs in buffer count and total latency for PPA optimization.

In multi-clock-domain designs, iCTS builds independent trees per domain, then balances at the top level after cross-domain skew evaluation via iSTA. Agents can prioritize domains with strict skew constraints (e.g. source-synchronous interfaces) and relax async domains to save area and power.

iCTS supports extensible timing models: interconnect uses PERI for slew and Elmore for delay; buffer insertion delay uses LUT with bilinear interpolation. Agents can switch to ML models (XGBoost / CatBoost) for more accurate buffer delay prediction. For large designs (>3000 registers), iCTS auto-enables K-Means clustering to split clock nets into sub-regions, build local trees, and merge.

Agent calling patterns

Python
MCP
Tcl
# Agent calls iCTS for clock tree synthesis
from ieda_client import IEDAClient

client = IEDAClient()

# Basic clock tree build
result = client.call("iCTS.synthesize",
    design_ref="snap_7f3a",
    skew_target=0.05,
    latency_target=1.0)

# Agent checks results; rebuild subtree if needed
if result['achieved_skew'] > 0.05:
    # Rebuild violating subtree
    repair = client.call("iCTS.rebuild_subtree",
        clock_tree_ref=result['clock_tree_ref'],
        subtree_root="clk_buf_42",
        target_skew=0.03)

# Agent traverses clock paths and extracts AI features
for path in result['clock_paths']:
    print(f"Path: {path['name']}, levels: {path['levels']}")
{
  "tool": "iCTS.synthesize",
  "arguments": {
    "design_ref": "snap_7f3a",
    "skew_target": 0.05,
    "latency_target": 1.0
  }
}
# Tcl interactive clock tree synthesis
iCTS::set_design snap_7f3a
iCTS::set_skew_target 0.05
iCTS::set_latency_target 1.0
iCTS::set_buffer_types {BUF_X1 BUF_X2 BUF_X4}
iCTS::synthesize
iCTS::report_clock_tree
iCTS::check_skew -threshold 0.05
iCTS::write_def -output snap_7f3a.cts.def

Input / output contract

FieldTypeRequiredDescription
design_refstringYesDesign instance identifier (includes post-placement data)
skew_targetfloatYesTarget clock skew (ns); typical 0.02–0.10
latency_targetfloatYesTarget insertion latency (ns)
clock_portsstring[]YesClock ports to build trees for
buffer_typesstring[]NoAvailable buffer types (auto-selected by default)
Return fieldTypeDescription
clock_tree_refstringClock tree reference ID in iDB
achieved_skewfloatAchieved global skew (ns)
achieved_latencyfloatAchieved average insertion latency (ns)
buffer_countintTotal clock buffers inserted
clock_pathsClockPath[]Per-path details (delay, levels, slew)

Role in the flow

    ··· prior steps ···
         │
  ┌─────────────┐
  │    iPL      │  standard-cell placement complete
  │  Placement   │
  └──────┬──────┘
         │  placed design
         ▼
  ┌─────────────┐
  │   iCTS     │  ← current tool: clock tree synthesis
  │ Clock Tree   │
  └──────┬──────┘
         │  clock_tree_ref
         ▼
  ┌─────────────┐
  │    iTO      │  timing optimization (hold/DRV repair)
  │ Timing Opt   │
  └──────┬──────┘
         │
         ▼
  ┌─────────────┐
  │    iRT      │  routing
  │   Routing    │
  └──────┬──────┘
    ··· downstream steps ···
Upstream: iPL (standard-cell placement complete) Downstream: iTO (timing optimization) → iRT (routing) Concurrent: iSTA (post-CTS timing verification)

Papers

Tsay RS. "An Exact Zero-Skew Clock Routing Algorithm." IEEE TCAD, 1993. Foundational DME algorithm work.

View →

Papers

Lin X, et al. "Slew-Aware Clock Tree Synthesis with Buffer Sizing." IEEE TVLSI, 2018.

View →

Related tools

iPL · placement — clock tree synthesis input comes from placed cell locations.

iPL →

Related tools

iTO · timing optimization — hold/setup timing repair after CTS.

iTO →

GitHub

iCTS source code lives in the iEDA repository under src/iCTS.

GitHub →

Related tools

iSTA · timing analysis — essential for post-CTS clock tree timing verification.

iSTA →

Turn the clock tree from black box to white box

Agents can inspect every clock path, diagnose skew hotspots, and repair local subtrees precisely.