跳到主要内容

External Tool Bridge · 安全的外部工具接入

为每个商业/开源外部工具提供独立的进程沙箱、协议化结果解析、版本探测与 license 管理。让 Agent 安全地调用非 iEDA 原生的工具。

Agent Service · D0/DRAFT · Wave 0 规划中 · D0 iEDA.ai L4
bridge — sandbox — protocol
# sandboxed external tool invocation
$ bridge.call("magic", args=["drc", "check"])
[sandbox] process isolated, mem=4G
[parse]  DRC violations → structured
→ agent never touches raw tool I/O
iMapsynthesisiFPfloorplaniPDNpoweriPLplacementiCTSclockiTOoptimizationiRTroutingiSTAtimingAiEDAdesign dataiPCLlayout modeliMapsynthesisiFPfloorplaniPDNpoweriPLplacementiCTSclockiTOoptimizationiRTroutingiSTAtimingAiEDAdesign dataiPCLlayout model

核心能力

1. Process Sandbox

每个外部工具运行在独立进程沙箱中,具备资源限制(CPU 核心数、内存上限、磁盘 IO 配额、运行时间上限)。沙箱间完全隔离,一个工具的崩溃不影响其他工具或 iEDA 主进程。支持容器化(Docker/Podman)和原生 cgroups 两种模式。

2. Protocol Adapter

标准化不同外部工具的输入/输出格式。每个 adapter 定义 input_schema(工具接受的参数与文件格式)和 output_schema(工具输出的结构化表示)。Adapter 负责将 iEDA 内部数据(iDB)转换为外部工具所需格式,以及将外部工具输出解析回 iEDA 内部表示。

3. Version Detection

自动探测外部工具版本与 capability。启动时查询工具的 --version 输出并解析为结构化版本号。维护 capability registry:某个功能在哪个版本引入、哪些参数在哪个版本废弃。Agent 调用前自动检查版本兼容性。

4. License Management

商业工具的 license 池化、租约与抢占。Agent 调用商业工具前需获取 license lease(带超时的租约)。支持优先级队列:高优先级任务可抢占低优先级 lease(需安全退出)。License 使用情况持续监控并记录审计日志。

5. Result Parsing

结构化解析外部工具的报告和日志。将工具原始输出(text/log/XML/JSON)解析为统一的ToolResult 对象,包含:status(success/warning/error)、violations(结构化违规列表)、metrics(数值化的度量指标)、raw_log(原始日志备份)。

Agent 调用方式

from ieda.agent import ExternalToolBridge, SandboxConfig

bridge = ExternalToolBridge()

# 注册外部工具 adapter
bridge.register(
    name="magic",
    binary="/usr/local/bin/magic",
    adapter="magic_adapter_v2",
    sandbox=SandboxConfig(
        cpu_cores=4, memory_gb=8, timeout_sec=3600,
        isolation="docker"
    )
)

# 版本探测
version = bridge.detect_version("magic")
# version: {major: 8, minor: 3, patch: 463, capabilities: [...]}

# License 获取(商业工具)
lease = bridge.acquire_license(
    tool="genus", feature="Innovus_Impl_System", timeout_sec=7200
)
# lease: {id: "lease-42", expires: "2025-07-30T14:00:00", priority: "normal"}

# 安全调用外部工具
result = bridge.call(
    tool="magic",
    args=["drc", "check", "-design", "top"],
    input_files={"/in/top.def": def_bytes},
    sandbox=SandboxConfig(memory_gb=4)
)
# result: ToolResult {
#   status: "success",
#   violations: [{type: "min_width", layer: "m2", location: ...}],
#   metrics: {total_drc: 12, elapsed_sec: 45.3}
# }

# 释放 license
bridge.release_license(lease.id)

输入/输出契约

方向字段类型说明
输入toolstr已注册的外部工具名称
输入argslist[str]工具命令行参数
输入sandboxSandboxConfig资源限制与隔离配置
输入input_filesdict[str, bytes]传递给工具的输入文件映射
输入license_featurestr需要的 license feature 名称
输出resultToolResult结构化工具执行结果
输出output_filesdict[str, bytes]工具产生的输出文件
输出sandbox_statsdict沙箱资源使用统计