RUSTSTA · 0.2.0 · 2026-10-23
SPEF 进入时序计算。
支持普通和 gzip SPEF,严格检查单位、名称、RC 拓扑与资源预算,并将结果写入可重开的工作区,用于一阶 RC 延迟和显式传播时钟分析。
SPEF / .spef.gz→PARASIT · mmap→NLDM + Elmore→时序 / 完整重算
669
常规测试通过另有双 PDK 实际单元替换验证
4 / 4
独立 RC 一阶矩验证通过分支、零电阻、非对称与宽数值范围
2 / 2
CPU / CUDA 验证通过f64 结果逐位一致
已实现的范围
- 详细 D_NET、NAME_MAP、端口 / 引脚、接地和耦合电容、电阻;NS/PS、PF/FF、OHM/KOHM 单位换算。
- gzip CRC、截断、解压膨胀、非法索引、错误方向与缺失标注检查;失败不改变 HEAD。
- 零电阻收缩、树状 RC 的 Elmore 一阶矩、实际引脚电容与输出负载;不可用的网格拓扑会明确报错。
- 显式提取 corner、PARASIT 存储、过期结果失效;支持完整重算和增量一致性检查。
当前模型是集总 NLDM + 一阶 Elmore,耦合按系数 1 接地,不求解有效电容波形或串扰。格式支持、模型验证、与其他计算器的一致性以及设计时序闭合,是不同的结论。
独立节点方程验证
Ngspice 通过独立节点方程 Gτ=C 计算一阶矩,RustSTA 通过树归约计算。下表单位均为 ns,不是 50% 电压阈值延迟。
| 案例 | RustSTA | 独立节点求解 | 绝对差 |
|---|---|---|---|
| branch | 0.3 | 0.3 | 0 |
| zero_resistance | 0.08 | 0.08 | 0 |
| asymmetric | 0.11645 | 0.11645 | 2.78e-17 |
| wide_range | 0.3327172 | 0.3327172 | 0 |
双 PDK 实际提取
| PDK | RC 网 | RC 节点 | 输入 | 未约束端点 | R=0 校准差 ps | 完整 RC 差 ps |
|---|---|---|---|---|---|---|
| sky130 | 19 | 5083 | gzip | 0 | 0.00046773 | 3.1487 |
| gf180 | 19 | 5077 | gzip | 0 | 0.00074428 | 6.7928 |
真实文件的节点、负载、传播时钟及完整 / 增量重算均通过功能验证。R=0 仅作为名称、电容和单元模型校准,不能代替真实提取。实际单元替换后仍与完整重算一致。
严格参考比对仍为 partial。完整非零 RC 与 OpenSTA 默认计算器的差异约 3.15 / 6.79 ps,超过保持不变的 1 ps 门槛。不同计算器没有被假定为同一波形模型,差异未被隐藏或改写为通过;也不据此声称时序签核完成。
使用方法
rusteda init --workspace work --format json
rusteda import --workspace work --base-rev rev0 \
--lib cells.lib --corner tt --netlist routed.v --sdc timing.sdc \
--spef routed.spef.gz --spef-corner tt --format json
ruststa run --workspace work --base-rev rev1 --corner tt \
--precision f64 --max-state-gib 1 --format json
ruststa check --workspace work --base-rev rev2 --method full --format json
默认输入和解压结果各不超过 32 MiB、100,000 个网、500,000 个节点和 1,000,000 个元件。预算可配置但有硬上限。原生核心不依赖 Python 或 GUI;外部求解器仅用于验证。