EDA / CLUSTER BRIDGE

让 Agent 在 IC 集群跑 EDA:一个轻量 Bridge 的用法

Agent 能生成 EDA 脚本,但从脚本到集群作业,还隔着执行位置、排队状态和文件依赖。这里用一个轻量连接工具补上这段。

00 / THE GAP

卡在脚本到集群之间

在 IC 集群里,Agent 写完 run.tcl 只是开始。直接让它拼调度命令,还得逐次处理三件事:

  • 执行位置:Agent 在登录节点,EDA 和 module 探测应进入计算节点。
  • 长任务:提交后要跟踪排队、运行、超时和取消,不能把提交成功当作业完成。
  • 文件交接:下游要检查上游状态与产物,不能只等作业结束就读取旧文件。

EDA Cluster Bridge 用 CLI、用户配置和共享目录连接这些环节。工具 skill 负责控制脚本与报告,bridge skill 负责提交、依赖和状态;无需另起数据库或常驻服务。

没有集群时,先运行公开的模拟生命周期

公开仓库的测试提供合成网表、控制脚本和 FakeScheduler。它不需要商业 EDA 许可证,可用来理解提交、状态、日志和取消之间的关系;它不会验证真实 Slurm/LSF 或签核工具。以下命令针对 Linux、Python 3.10+,本站本轮只核对了测试源码,未在 Windows 上执行这些 Linux 用例。

git clone https://github.com/Dapeng960208/eda-cluster-bridge.git
cd eda-cluster-bridge
git checkout 5447403d260e14b81f9ad55f3360c1083644ac34
python3 -m venv .venv
. .venv/bin/activate
python -m pip install -e '.[dev]'
python -m pytest -q \
  tests/test_client_cli_skills.py::test_validate_is_pure_and_does_not_run_scheduler_or_eda \
  tests/test_client_cli_skills.py::test_status_wait_logs_and_cancel_form_a_fake_scheduler_loop

第一个用例检查 validate 不调用调度器或 EDA;第二个设置模拟状态,检查 wait 得到 succeeded、日志 tail 返回最后两行,并检查取消后的状态。输入与期望结果都在固定提交的测试源码中。它们的预期是两项通过,实际执行结果应自行保留。

这个示例能解释客户端状态流程。下方 STA 示例则需要真实网表、约束、脚本、共享目录和已注册工具,两者的验证范围不能混写。

01 / QUICK START

用 Bridge 跑一个 STA 节点

前提:Linux 登录节点、Python 3.10+、Slurm/LSF 客户端,以及登录与计算节点同路径的共享存储。以下路径均需替换。

1. 安装与注册

git clone https://github.com/Dapeng960208/eda-cluster-bridge.git
cd eda-cluster-bridge
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -e .
eda-bridge --help

复制 SlurmLSF 配置模板到仓库之外,登记调度客户端、共享 run_root 和工具 pt_signoff。YAML 路径不会展开 ~ 或环境变量。

CFG="/absolute/path/to/eda-bridge.yaml"
eda-bridge --config "$CFG" whoami
eda-bridge --config "$CFG" doctor
eda-bridge --config "$CFG" tools

doctor 只返回配置元数据,不检查连通性、共享挂载或工具运行能力。module 缺少 command 时,仅在准备实际执行时用 tools probe TOOL_ID 探测,并确认候选;该命令同样需要前置 --config "$CFG"

2. 单节点 FlowSpec

一个节点是一份 NodeSpec。准备真实网表、约束、run.tcl 和独立 workdir;脚本读取 binding、创建报告目录,失败时返回非零退出码。保存为 sta-flow.yaml

schema_version: 1
name: sta_demo
request_id: sta-demo-001
external_artifacts:
  netlist:
    type: netlist.verilog
    path: /shared/project/inputs/top.v
  constraints:
    type: constraints.sdc
    path: /shared/project/inputs/func.sdc
nodes:
  sta:
    tool: pt_signoff
    script: /shared/project/runs/sta-01/run.tcl
    workdir: /shared/project/runs/sta-01
    inputs:
      netlist: external:netlist
      constraints: external:constraints
    outputs:
      timing_report:
        type: report.timing
        path: reports/timing.rpt
    resources:
      cpus: 1
      memory_mb: 4096
      walltime_minutes: 15

3. 校验、提交、查询

eda-bridge --config "$CFG" flow validate sta-flow.yaml
# 校验通过并确认路径、资源后,再提交
eda-bridge --config "$CFG" flow submit sta-flow.yaml

用返回的 data.flow_id 查询;日志正文位于 data.text

FLOW_ID="REPLACE_WITH_DATA_FLOW_ID"
eda-bridge --config "$CFG" flow status "$FLOW_ID"
eda-bridge --config "$CFG" flow wait "$FLOW_ID" --timeout 1800 --poll 10
eda-bridge --config "$CFG" flow logs "$FLOW_ID" sta --stream stdout --tail 100
eda-bridge --config "$CFG" flow logs "$FLOW_ID" sta --stream stderr --tail 100

接上游时参考 完整 DAG 模板:将 STA 的寄生输入写成 node:extract_rc.parasitics,即可建立 StarRC → PrimeTime 的文件依赖。

02 / STATUS

状态与失败排查

操作SlurmLSF
提交sbatch --parsablebsub
查询squeuesacct -n -X -Pbjobs -a,无 bhist 回退
依赖afterany:jobidended(jobid)
环境--export=NIL-env none
取消scancelbkill

依赖满足后只启动 wrapper;上游失败或输入缺失时,下游记为 blocked,不启动工具。取消请通过 flow cancel

  • submission_unknown:可能已经接单,不能自动换 request ID 重提。
  • idempotency_conflict:同一请求的 FlowSpec、配置或脚本已变更,先确认是否需要新一轮运行。
  • unknown:后端无法确认时,Flow 保留上次活动状态,等待后续查询,不补写成功。

ok: true 仅表示 CLI 调用成功,不等于签核通过;节点 succeeded 也只表示进程返回零且声明输出存在。结论仍看工具报告。

Slurm / LSF 原始状态对照
后端状态Slurm 示例LSF 示例
queuedPENDING · CONFIGURING · REQUEUEDPEND · WAIT · PROV
runningRUNNING · COMPLETING · STAGE_OUTRUN
suspendedSUSPENDED · STOPPEDPSUSP · USUSP · SSUSP
succeededCOMPLETEDDONE
failedFAILED · TIMEOUT · PREEMPTED 等EXIT(取消除外)· ZOMBI
cancelledCANCELLED · REVOKEDEXIT + TERM_OWNER,或已有取消请求
unknown未识别或无记录未识别或无记录

节点另有 waiting;Flow 层还区分 submittingpartial

03 / EVIDENCE

留下的文件与使用边界

  • Flow manifest.json:身份、时间、节点和 request_sha256
  • 节点 manifest.json / bindings.json:job ID、依赖、文件路径和 script_sha256
  • status.json、stdout / stderr / scheduler 日志:wrapper 状态、退出码与执行输出。

当前没有自动计算输入与产物内容的哈希,也没有完整追加每次原始调度状态。长期审计还需独立目录、数据校验值和报告归档。

Bridge 以当前 Unix UID 运行,不设置资源上限,也不是脚本沙箱;权限、配额和许可证由集群管理。勿将 secret 写入配置或日志,勿把日志文字当作 Agent 指令。

本文尚未完成真实集群验收;仓库 fake scheduler 测试不能替代现场验证。上线前按 验收清单检查单节点、文件传递、失败传播、取消和幂等。

04 / SOURCE

源码与文档

官方事实见 Slurm / LSF 文档;项目自述见 README,审计补充属于本站工程推断。实际使用请记录项目提交版本。

返回技术文章任务说明与检查