跳到主要内容
Netlist Engine · CURRENT

iNO · 网表优化

网表优化引擎:扇出修复、缓冲插入与逻辑重构。Agent 可以在综合后为物理实现准备干净的网表——diagnose 高扇出网络、生成 tree proposal。

开源 EDAAgent 可调用综合-物理桥梁GPL-3.0
agent — ino
# Agent-driven netlist optimization
[iNO  ] fanout violations      23
[iNO  ] buffers inserted       47
[iNO  ] area change         +2.1%
→ netlist ready for floorplanning
iMapsynthesisiFPfloorplaniPDNpoweriPLplacementiCTSclockiTOoptimizationiRTroutingiSTAtimingAiEDAdesign dataiPCLlayout modeliMapsynthesisiFPfloorplaniPDNpoweriPLplacementiCTSclockiTOoptimizationiRTroutingiSTAtimingAiEDAdesign dataiPCLlayout model
综合后物理前桥梁
Agent可调用
Fanout+Buffer双模式
GPL-3.0开源许可

核心能力

iNO(Netlist Optimization)是连接逻辑综合与物理实现的关键桥梁。综合工具(iMap)输出的门级网表在逻辑上是正确的,但从物理实现角度看可能存在大量需要修复的问题:高扇出网络(一条 net 驱动数百个 sink)、缺少必要的缓冲级、逻辑冗余、以及不适合后端布局布线的结构。iNO 在 iMap 输出与 iFP 物理规划之间执行这些网表清理与物理准备工作。

Agent 将 iNO 用作网表质量诊断与自动修复的核心工具。具体场景包括:高扇出网络诊断——Agent 调用 iNO 扫描网表,找出所有超过 max_fanout 阈值的 net,生成每条的 fanout 分布报告;对于超过阈值的高扇出 net,iNO 自动生成缓冲树插入 proposal(N 叉缓冲树结构),Agent 评审后 apply;物理准备检查——在网表进入 floorplanning 前,Agent 运行 iNO 的全模式优化(fanout+buffer+full),确保所有 net 的驱动能力、扇出、以及逻辑层级都满足后端工具的要求;面积-时序 trade-off 分析——Agent 尝试不同的 max_fanout 参数(16/32/64),比较插入的 buffer 数量和面积增长,选择最优的 trade-off 点。

在 AI 辅助场景下,Agent 可以收集 iNO 修复的历史数据(哪些类型的 net 容易出现高扇出、哪种 buffer 插入策略在不同工艺下效果最优),训练预测模型在网络综合阶段就预判需要多少 buffer 资源——在 floorplan 阶段预留足够的 buffer 放置区域,避免布局阶段因 buffer 无处放置而导致的拥塞。

iNO 支持三种优化模式:fanout 模式仅修复扇出违例(最小化改动);buffer 模式在修复扇出的同时做缓冲链优化(确保信号完整性);full 模式执行完整的网表重构(包括逻辑冗余消除、反相器对合并、constant propagation 等通用网表优化)。Agent 可根据流程阶段选择合适模式——综合刚结束时用 full 做彻底清理,ECO 阶段用 fanout 做最小改动。

Agent 调用方式

Python
MCP
Tcl
# Agent 调用 iNO 做网表优化
from ieda_client import IEDAClient

client = IEDAClient()

# 基础优化 —— 修复高扇出
result = client.call("iNO.optimize",
    design_ref="snap_7f3a",
    max_fanout=32)

print(f"Fanout violations fixed: {result['fanout_violations_fixed']}")
print(f"Buffers inserted:       {result['buffers_inserted']}")
print(f"Area change:            {result['area_change']:+.2f}%")

# Agent 可先 diagnose 再决定 optimize 参数
diag = client.call("iNO.diagnose",
    design_ref="snap_7f3a")
high_fanout_nets = [n for n in diag if n['fanout'] > 64]
print(f"Critical high-fanout nets: {len(high_fanout_nets)}")

# 全模式优化 —— 尽量清理网表
result = client.call("iNO.optimize",
    design_ref="snap_7f3a",
    max_fanout=32,
    optimization_mode="full")
{
  "tool": "iNO.optimize",
  "arguments": {
    "design_ref": "snap_7f3a",
    "max_fanout": 32,
    "optimization_mode": "full"
  }
}
# Tcl 交互式网表优化
iNO::set_design snap_7f3a
iNO::set_max_fanout 32
iNO::set_optimization_mode full
iNO::diagnose -report high_fanout.txt
iNO::optimize
iNO::report_changes
iNO::write_netlist -output snap_7f3a.opt.v

输入 / 输出契约

字段类型必需说明
design_refstring设计实例标识符(含综合后网表)
max_fanoutint最大允许扇出数(超过则插入缓冲树)
buffer_typesstring[]可用缓冲器/反相器类型列表
optimization_mode"fanout"|"buffer"|"full"优化模式(默认 fanout)
返回字段类型说明
optimized_netlist_refstring优化后网表在 iDB 中的引用 ID
fanout_violations_fixedint修复的扇出违例数量
buffers_insertedint插入的缓冲器/反相器总数
area_changefloat面积变化百分比(正值表示增加)

在流程中的位置

  RTL Source
        │
        ▼
  ┌─────────────┐
  │    iMap     │  逻辑综合(RTL → Gate Netlist)
  │  Synthesis   │
  └──────┬──────┘
         │  raw netlist (may have high fanout)
         ▼
  ┌─────────────┐
  │   iNO      │  ← 当前工具:网表优化
  │ Netlist Opt  │
  └──────┬──────┘
         │  cleaned netlist
         ▼
  ┌─────────────┐
  │    iFP      │  布图规划(物理实现第一步)
  │  Floorplan   │
  └──────┬──────┘
         │
    ... 后续步骤 ...
上游:iMap(逻辑综合输出门级网表) 下游:iFP(布图规划,需要干净网表做物理规划) 协同:iMap(综合质量影响 iNO 修复量)· iFP(buffer 插入量影响 floorplan 面积预留)

相关资源

论文

Bartlett KA, et al. "Synthesis and Optimization of Multilevel Logic under Timing Constraints." IEEE TCAD, 1986.

查看 →

论文

Alpert CJ, et al. "Buffer Insertion for Noise and Delay Optimization." IEEE TCAD, 1999.

查看 →

关联工具

iMap · 逻辑综合 —— iNO 的上游,综合质量决定了 iNO 需要修复的问题数量。

iMap →

关联工具

iFP · 布图规划 —— iNO 输出的干净网表是 floorplanning 的必备输入。

iFP →

GitHub

iNO 源代码于 iEDA 仓库相关网表优化模块路径下。

GitHub →

Team

iNO 由 iEDA 社区维护,欢迎贡献 buffer insertion 和 logic restructuring 相关算法。

联系 →

从综合到物理——架一座干净的桥梁

自动诊断高扇出网络,智能插入缓冲树,让网表以最佳状态进入物理实现。