环境
- easyeda-agent CLI/daemon v0.25.1(Windows,EasyEDA Pro 3.2.175,连接器 0.25.1)
- 单窗口、单工程、单页(P1),页面刚
sch clear 过
现象
对一个空页依次执行多个 sch block-apply 后,几乎所有块都返回:
status: failed-rolled-back
failure: layout verification found N overlap(s) and N pin coincidence(s)
rollback: complete=true verified=true attempted=6 survived=0
但事后 sch read 显示这些"已回滚"的器件全部还在页面上(169 个器件,含全部 6-7 件的块),随后 sch gate 四阶段全 pass(layout-lint/check/bridge-check/drc)。
即:manifest 声称 "rollback verified: all newly placed primitive IDs are absent",与页面真实状态矛盾;而 gate 证明最终布局其实完全合法。
稳定复现(两个变体都触发)
变体 A:同参数重复 instance
easyeda sch clear
easyeda sch block-apply block.esp32s3_wroom1_module --instance esp32_wifi --spacing 400 --at 2600,300 --bind 3V3=3V3 --bind GND=GND --json
# -> applied (正常)
# 同一命令原样再跑一次(同 instance 名):
# -> failed-rolled-back, "6 overlap(s) and 6 pin coincidence(s)"
# 但页面上此时有两份该块的器件(第一份 + "回滚掉的"第二份都可见)
变体 B:先 place 通道器件再 block-apply
页面先经 lib search + sch place 放了一个 STM32F103(LQFP48) + 一个 24C02(place 通道,各自坐标),再执行:
easyeda sch block-apply block.esp32s3_wroom1_module --instance esp32s3 --spacing 400 --at 2600,300 --bind ...
overlap/pin-coincidence 计数恰好等于该块自身的器件数(esp32 块 6/6、ch340 块 7/7、ams1117 块 4/4、tactile 块 2/2)——像是块的 6 个器件被与"自身/幽灵"判定重叠。随后 sch read 器件都在,sch gate 全 pass。
关键观察
- overlap 计数 = 块自身器件数的特征指纹暗示布局校验读到的是一份"幽灵几何"(同一批器件被数了两遍,或读了陈旧缓存);
- gate 与 block-apply 的布局判定互相矛盾(同一页,前者 pass 后者 fail);
- 回滚路径声明
verified=true 但器件幸存 —— schematic.component.delete 的 read-back 校验可能同样读到了陈旧状态。
疑点方向(供参考)
- block-apply 布局校验读 geometry 用的快照可能是 place 前或跨窗口/跨页残留的陈旧 bbox 缓存;
- EasyEDA Pro 对同一工程开过两个窗口时(我们都关掉了)残留更易复现;单窗口下变体 A/B 仍 100% 复现;
- v0.25.1 的
sch place --designator 原子分配与 block-apply 的 designator 分配是否存在竞争。
我们的 workaround
gate pass 后做 substance 复核:sch read 回读网表,若 DesignIR 的电源轨全部存在且页面器件数 ≥ 阈值,则信任页面而非 failed 标志。这在我们的迭代闭环里工作正常,但上游若能修复根因(或至少让 rollback verification 说真话)会更好。
感谢这个项目,block 库 + gate 体系非常好用。
环境
sch clear过现象
对一个空页依次执行多个
sch block-apply后,几乎所有块都返回:但事后
sch read显示这些"已回滚"的器件全部还在页面上(169 个器件,含全部 6-7 件的块),随后sch gate四阶段全 pass(layout-lint/check/bridge-check/drc)。即:manifest 声称 "rollback verified: all newly placed primitive IDs are absent",与页面真实状态矛盾;而 gate 证明最终布局其实完全合法。
稳定复现(两个变体都触发)
变体 A:同参数重复 instance
变体 B:先 place 通道器件再 block-apply
页面先经
lib search+sch place放了一个 STM32F103(LQFP48) + 一个 24C02(place 通道,各自坐标),再执行:overlap/pin-coincidence 计数恰好等于该块自身的器件数(esp32 块 6/6、ch340 块 7/7、ams1117 块 4/4、tactile 块 2/2)——像是块的 6 个器件被与"自身/幽灵"判定重叠。随后
sch read器件都在,sch gate全 pass。关键观察
verified=true但器件幸存 ——schematic.component.delete的 read-back 校验可能同样读到了陈旧状态。疑点方向(供参考)
sch place --designator原子分配与 block-apply 的 designator 分配是否存在竞争。我们的 workaround
gate pass 后做 substance 复核:
sch read回读网表,若 DesignIR 的电源轨全部存在且页面器件数 ≥ 阈值,则信任页面而非 failed 标志。这在我们的迭代闭环里工作正常,但上游若能修复根因(或至少让 rollback verification 说真话)会更好。感谢这个项目,block 库 + gate 体系非常好用。