31 KiB
下板 PCB1:35 条布不通的逐条分析与处理方案(2026-09-06,纯本地分析,未碰桥接)
数据来源:_pcb1_place_now.json(21:00 route_sig 下发后回读的快照,3118 线 / 985 孔,和 _chainB.log 的数一致)、
pcb1-parts.json、_pcb1_poured.json、_pcb1_polypads.json、_pcb1_sig_plan_all.json(归属表,认哪些铜是布线器自己画的)。
所有探路都用引擎自己的判据(Field / route_grid,CLR 0.20 + 半线宽 + QERR),所以"通 / 不通"和 pcb1_route_sig.py 是同一把尺。
pcb-copper.json 是 20:16 抓的(删死网之前,3938 线),已过期,本轮没用它。
0. 结论(先看这里)
- 35 条里只有 2 条是摆位几何上真出不去的(
U6.16/U7.16=$6N532/$6N547)。其余 33 条在"拆光布线器自己画的铜"之后 全部能以 0.20 线宽在 0.1 / 0.05 栅格上布通——它们是布线顺序 / 拆线额度的事,不是母版几何缺口。 证据:pcb1_unrouted.py(新工具)对每条连接做两遍探路,全铜 vs 拆光自己人;◆行给出具体要拆哪些网络的哪几段。 - A 类:
ESCAPE_NUDGE0.30→0.50 救不了U6.16/U7.16(本地实测,挪完照样"几何上就出不去")。 它们被 C609 / C612 的 GND 脚 + GND 扇出孔(西)、C607 / C610(北)、U6.15 的 +3V3 出线段(东) 三面围死;北挪 C607 只是把北墙推远。 真正的解法是 C609 / C612 转 180°(VREF 脚朝南正对引脚)——转完$6N532/$6N547各 3.6 mm 一次布通、净距 0。ESCAPE_NUDGE按 §26.22b 照改了(0.50 / 东列 0.45,本地六项检查全过),它对 U6.5/U6.6(SCL)/U6.13 那几排仍然有用,善后清单在 §2。 - C 类(五路 eFuse 编程脚 → 0402 阵):在 CH1 上把 6 个网的旧铜拆光重布,5/6 通,只有 OVP(
$2N676)卡在R109.2 → R110.1那一跳—— OVP 节点在 R110 的西脚、R109 的东脚,两个脚斜对角,中间是 U14 东侧四根出线段的落脚区。R%10 转 180° 之后 CH1 六个网 6/6 一次布通、净距 0 (pcb1_ch_reroute.py --ch 1 --move R110:0:0:180)。这是母版里改一处、五路复制的那种改法(§3)。 - B 类(USB 差分对):束根本没起步——束的起点锚
USB_A=(104,25.18)被SCL的顶层线压着(净距 −0.08),终点引出线 (147,52)-(149,52) 被EFUSE_EN3的过孔 (149.5,52.1) 压着。板上存在一条 0.74 mm 的束走廊:顶层 y≈17.0 沿下板边从 x 101 走到 141,再沿 x≈142~143 北上到 y 48, 全程 76.7 mm、换层 2 次(pcb1_usb_corridor.py --a 101,17实测)。要做的是改USB_A/USB_B/USB_VIA三个常量并拆 EFUSE_EN3 那一小截(§4)。 - D 类(SDA / SCL / INA_ALERT 末端):六个末端焊盘(U8.3/U8.4/U9.4/U11.3/U10.5/U6.6)在拆光自己人之后都出得去、1.2~1.3 mm 内都有合法孔位;
现在"没有合法孔位"是因为 INA226 南侧那个口袋被 SDA/SCL/INA_ALERT 自己的出线段 + 邻脚的出线段(0.5 pitch,各留了 0.6~1.1 mm 的直出段)填满了。
处理办法是把这三网在各 INA226 周围的自己人铜拆掉、三根一起按 0.05 栅格重布(§5)。唯一硬的一处:
SCL → U6.6拆光也只能 w0.15 / 0.05 栅格过——U6 南排 0.5 pitch + R615 那 0.612 的道,ESCAPE_NUDGE0.50 正是为它。 - E 类:+5V 的
J24.8/10那一坨困在排针 2.54 pitch 的针缝里(缝 0.74 = 刚好卡在 §26.22b 那个 0.741 门槛上);VDAC2(71 mm)、EFUSE_PG2、EFUSE_FLT4都是拆几段就通。GND剩的那个碎片是 Inner1 铺铜的一块 0 mm² 死铜岛,不是布线的事。
1. 逐条清单(37 条 = 33 条信号 + GND 1 个铺铜岛 + USB 4 条;日志里的 35 = 33 + GND 按对象数的 2)
符号:几何 = 摆位几何上过不去;自己人 = 拆光布线器自己画的铜就通(括号里是路上压到的、要拆的网络与段数);量化 = 要 0.05 栅格才通。 两端坐标是碎片锚点。"差多少"是瓶颈格的 edt 与 0.371(0.20 线在 0.1 栅格的门槛)之差。
| # | 网络 | 类 | 连接(碎片 A ⇢ 碎片 B) | 缝 mm | 卡在哪 / 差多少 |
|---|---|---|---|---|---|
| 1 | $6N532 |
A | C609.2+R614.2 ⇢ U6.16 (78.83,39.51) | 1.37 | 几何:U6.16 拆光也出不去。西 GND 孔 (78.03,39.61) 0.50 / GND 短线 0.66;北 C607.1 (79.08,40.79) 的西缘正好在 x 78.83;东 U6.15 (0.36) 及其 +3V3 出线段 0.51。三面墙,0.03 的线都过不去 |
| 2 | $6N547 |
A | C612.2+R616.2 ⇢ U7.16 (108.82,36.21) | 1.36 | 同上,镜像:GND 孔 (108.02,36.31) 0.50、C610.1、U7.15 出线段 0.51 |
| 3 | $2N676 |
C | R109.2 ⇢ R110.1 ⇢ U14.15 | 2.2 / 3.5 | 自己人($2N680×1 $2N687×1;$2N685×1 EFUSE_EN1×3 VO1×1)。母版几何真正紧的一跳:R109.2(东脚) → R110.1(西脚) 斜对角,见 §3 |
| 4 | $2N680 |
C | U14.19 ⇢ R112.2 | 3.1 | 自己人($2N676×6 $2N687×3):U14.19 的出线段被 $2N687 的线 (y 46.10) 和自家旧半截 (y 46.52) 夹住 |
| 5 | $8N676 |
C | R210.1+U15.15 ⇢ R209.2 | 2.2 | 自己人($8N680×1 $8N687×1)。R209.2 被 EFUSE_FLT2 线 (0.55) + $8N680 线 (0.87) 夹成 0.48 的缝(要 0.74) |
| 6 | $8N680 |
C | U15.19 ⇢ R212.2 | 3.1 | 自己人($8N687×1 +3V3×2 EFUSE_FLT2×1) |
| 7 | $8N698 |
C | R216.2+R217.1 ⇢ U15.3 | 12.2 | 自己人($8N680×2 $8N687×1 $8N699×2 +3V3×2 EFUSE_FLT2×4 EFUSE_PG2×3 SCL×1 SDA×1 VO2×1)。U15.3 在北排,邻脚 U15.2/U15.4 出线段 0.40 |
| 8 | $8N727 |
C | Q201.3+Q202.1 ⇢ R218.2 | 3.7 | 自己人(+3V3×5 EFUSE_EN2×2)。R218.2 被 +3V3 的 0.28 线三面包住(0.65~0.71) |
| 9 | $10N676 |
C | R309.2 ⇢ R310.1 ⇢ U16.15 | 2.2 / 3.5 | 自己人($10N680×1 $10N687×1;$10N685×1 EFUSE_EN3×3 VO3×1)。R309.2:EFUSE_FLT3 线 0.55 + $10N680 线 0.85 → 缝 0.48 |
| 10 | $10N680 |
C | U16.19 ⇢ R312.2 | 3.1 | 自己人($10N687×1 +3V3×2 EFUSE_FLT3×1)。日志:"理想路径要压掉 6 条(连坐后 11,上限 10)" → RIP_MAX=10 卡住 |
| 11 | $10N698 |
C | R316.2+R317.1 ⇢ U16.3 | 12.2 | 自己人(9 个网 25 段)。U16.3 北排,EFUSE_PG3 出线段 0.40 |
| 12 | $10N727 |
C | Q301.3+Q302.1 ⇢ R318.2 | 3.7 | 自己人($10N732×3 +3V3×3 EFUSE_PG3×3) |
| 13 | $12N859 |
C | U17.19 ⇢ R412.2 | 3.1 | 自己人($12N866×1 $17N151×2 EFUSE_PG4×2) |
| 14 | $12N866 |
C | U17.18 ⇢ C414.1 | 1.9 | 自己人($12N859×1 EFUSE_PG4×2) |
| 15 | $12N877 |
C | U17.3 ⇢ R416.2+R417.1 | 12.2 | 自己人(9 个网 19 段) |
| 16 | $14N676 |
C | R509.2 ⇢ R510.1 ⇢ U18.15 | 2.2 / 3.5 | 自己人($14N680×1 $14N687×1;$14N685×1 $17N151×1) |
| 17 | $14N680 |
C | U18.19 ⇢ R512.2 | 3.1 | 自己人($14N687×1 EFUSE_EN5×1 EFUSE_PG5×2) |
| 18 | $14N687 |
C | U18.18 ⇢ C514.1 | 1.9 | 量化+自己人:瓶颈 (131.50,46.10) L1,edt 0.300,差 0.071 —— 夹在 $14N680 自家旧半截 (y 46.52) 和 GND 孔 (131.82,45.50)/R510.2 之间 |
| 19 | $14N698 |
C | R516.2+R517.1 ⇢ U18.3 | 12.2 | 自己人(11 个网 30 段) |
| 20 | +5V |
E | 主干 ⇢ J24.8+J24.10 | 14.0 | 那一坨(两针 + 6 段线)整个困在 J24 针缝里:2.54 pitch − Ø1.8 = 0.74 mm 的缝,+5V 类最细 0.30 要 0.70(准确值)/ 0.84(0.1 栅格);瓶颈 (31.70,60.00) L2 贴着 J24.19 |
| 21 | EFUSE_FLT4 |
E | R413.2 ⇢ U17.20;R413.2 ⇢ U23.7 | 6.9 / 21.6 | 自己人($12N855×3 $12N859×2 $12N866×2 EFUSE_PG4×2;U23.7 那一跳 10 个网 27 段)。U17.20 / U23.7 拆光都出得去,最近合法孔位 0.84 / 1.24 mm |
| 22 | EFUSE_PG2 |
E | R215.1+U15.2 ⇢ U23.14 | 35.7 | 自己人($16N18×2 +3V3×6 +5V×1 EFUSE_EN2×1 EFUSE_PG1×2 EFUSE_PG3×2)。U23.14 两侧 U23.13/15 的出线段 0.55 |
| 23 | VDAC2 |
E | U6.11+U6.12 ⇢ R208.2 | 71.5 | 自己人($6N530×2 EFUSE_FLT2×3 EFUSE_FLT3×3 EFUSE_PG1×1 EFUSE_PG5×1 INA_ALERT×1 SCL×1 SDA×1)。长网,多跑 --ripup |
| 24 | INA_ALERT |
D | 主干(R607.2…) ⇢ U11.3 | 20.3 | 自己人(12 个网 32 段,大头是 EFUSE_PG4×7 EFUSE_FLT5×5 SCL×5)。U11.3 拆光后合法孔位 1.29 mm (45.95,48.40) |
| 25 | INA_ALERT |
D | U11.3 ⇢ U8.3 | 29.5 | 自己人($12N877×4 $2N699×3 +5V×2 EFUSE_PG1×5 SCL×1 SDA×1 VO1×3),要 0.05 栅格 |
| 26 | SCL |
D | 主干 ⇢ U6.6 | 15.6 | 自己人($6N525×5 EFUSE_FLT3×2 SDA×10 VDAC4×3)但只有 w0.15 / 0.05 栅格:U6.5 / U6.7 0.36、它们的出线段 0.40,全铜时 3 mm 内没有合法孔位 |
| 27 | SCL |
D | U6.6 ⇢ U10.5 | 73.1 | 自己人(15 个网 36 段,SDA×11)。U10.5 拆光后合法孔位 0.22 mm (140.75,75.80) |
| 28 | SDA |
D | 主干 ⇢ U9.4 | 1.3 | 自己人(EFUSE_PG2×4 SCL×1)——差 1.3 mm |
| 29 | SDA |
D | U9.4 ⇢ U8.4 | 46.4 | 自己人($2N699×4 $2N727×5 $8N732×3 +3V3×5 EFUSE_EN1×1 EFUSE_PG1×4 INA_ALERT×1 SCL×1 VBUS_EN4×1),要 0.05 栅格 |
| 30 | SDA |
D | 主干 ⇢ U12.2+U12.4 | 15.6 | 自己人($14N698×4 $17N154×2 VBUS_EN5×1) |
| 31 | GND |
— | 主平面 ⇢ Inner1 一块 0 mm² 铺铜岛 | — | 铺铜死岛,布线器接不上也不该接;pcb1_pour / inner1_verify 的事 |
| 32-35 | USB_DP / USB_DM |
B | U20.14/13 ⇢ J22.B6/B7,A6↔B6 / A7↔B7 | 61 / 1.0 | 束没起步(§4);A↔B 短接是 0.5 pitch 的量化问题(差 0.021,0.05 栅格就通) |
表里没有
$2N687/$8N687/$10N687/$12N855等:它们现在是通的,但被别的通道网当作"要拆的"——重布 C 类时它们会被拆掉重画,顺序见 §3。
2. A 类:U6.16 / U7.16($6N532 / $6N547)
2.1 卡在哪(pcb1_unrouted.py,全铜 / 拆光自己人两遍都是 ✘)
U6.16(VREF, 0.28×0.80, 中心 (78.83,39.51)) 周围 1.5 mm 的异网铜,按到焊盘的距离:
| 距 | 网 | 是什么 | 方向 |
|---|---|---|---|
| 0.36 | +3V3 | U6.15 焊盘 (79.33,39.51) | 东(0.5 pitch 邻脚) |
| 0.50 | GND | 过孔 (78.03,39.61) —— C609.1 的 GND 扇出孔 | 西 |
| 0.51 | +3V3 | U6.15 的出线段 (79.33,39.86)-(79.33,40.38) | 东北 |
| 0.66 | GND | 短线 (78.03,40.28)-(78.03,39.61) w0.30 | 西北 |
| 0.67 | GND | U6 散热盘条 (79.76,38.85) | 南 |
| 0.84 | +3V3 | C607.1 焊盘 (79.08,40.79),西缘 x = 78.83 = U6.16 的 x | 北 |
目标 C609.2 在 (78.03,41.32)、R614.2 在 (77.06,40.26)——在西北。往西北走要从 GND 孔 + GND 短线 + C609.1(GND,(78.03,40.48))这堵 x=78.03 的墙
和 C607.1 西缘(x=78.83)之间过:缝 0.53 mm(78.30 → 78.83),0.20 线要 0.74。
把 C607 再北挪 0.2(总 0.50)之后,这道缝一样宽——墙是东西向的,北挪没用。本地实测(pcb1_ch_reroute.py --win 73,32,87,47 --nets '$6N532' --move C607:0:0.2 --move C608:0.15:0 --move R615:0:-0.2):
"还有 1 个几何上就出不去:U6.16",布不通。U7 同。
2.2 解法:C609 / C612 转 180°(已写进 pcb1_place.SAT_FLIP)
C609 现在 rot 90,GND 脚 (C609.1) 在南、VREF 脚 (C609.2) 在北,GND 扇出孔又打在 GND 脚正南——正好把 U6.16 去 VREF 脚的路堵死。 转成 rot 270 之后 VREF 脚 (78.03,40.48) 正对 U6.16、只差 0.8 mm,GND 脚到 (78.03,41.32)。
本地实测(--move C609:0:0:180 --drop-via 78.03,39.61):$6N532 3.6 mm 一次布通,净距 0 / 钻孔 0 / 铺铜 0;U7(--move C612:0:0:180 --drop-via 108.02,36.31)同样 3.6 mm。
路径(可直接手写):
$6N532: (78.03,40.48)→(78.03,39.93) ; (78.03,39.93)→(78.30,40.20)→(78.83,40.21) ; (78.83,39.51)→(78.83,40.21) ; (77.06,40.26)→(77.06,40.84) ; (77.80,40.60)→(77.30,40.60)→(77.06,40.84) 全部 L1 w0.20
$6N547: (108.02,37.18)→(108.02,36.63) ; (108.02,36.63)→(108.30,36.90)→(108.82,36.91) ; (108.82,36.21)→(108.82,36.91) ; (107.05,36.95)→(107.05,37.54) ; (107.80,37.30)→(107.34,37.30)→(107.12,37.42)→(107.05,37.54)
转件的善后:
| 件 | 删 | 补 |
|---|---|---|
| C609 (78.03,40.90) rot 90→270 | $6N532 短线 L1 (78.03,41.32)-(78.03,41.87) 与 (78.03,41.87)-(77.06,40.84);GND 短线 L1 (78.03,40.28)-(78.03,39.61);GND 孔 (78.03,39.61) |
C609.1 新 GND 孔 (77.80,42.00)(或 (77.45,41.75))+ 0.3 短线。这个点现在压着 EFUSE_FLT3 两段自己画的线,先拆它们(它会自己重布回来) |
| C612 (108.02,37.60) rot 90→270 | $6N547 短线 L1 (108.02,38.02)-(108.02,38.57) 与 (108.02,38.57)-(107.05,37.54);GND 短线 L1 (108.02,36.98)-(108.02,36.31);GND 孔 (108.02,36.31) |
C612.1 新 GND 孔 (107.30,38.00)(压着 $6N547 两段旧线,本来就要拆) |
⚠️ 孔位是按"拆光布线器自己画的铜 + 删掉上面那几段老扇出"算的合法孔位(孔心离焊盘 ≥ 0.45,0.3 线可达);C609.1 周围全铜时 2.5 mm 内一个合法孔位都没有——被 EFUSE_FLT5 / EFUSE_FLT2 的线和孔(都是布线器画的)围着。
2.3 ESCAPE_NUDGE 0.50 / 东列 0.45(按 §26.22b 照改,本地检查全过)
pcb1_place.py 里已改:R615/R617 (0,−0.50)、C607/C610 (0,+0.50)、C608/C611 (+0.45,0)。/c/Python314/python .claude/pcb1_place.py:
"本地检查通过:焊盘净距≥0.2 / 无重叠 / 无越框 / 不压定位孔 / 高度预算全过 / 排针阵列对上锚点 / 去耦贴身",C607→U6.15 去耦距 1.31→1.51(上限 3.0)。
新坐标:R615 (78.655,35.025) / C607 (79.503,40.994) / C608 (82.98,39.51) / R617 (108.648,31.726) / C610 (109.493,37.695) / C611 (112.97,36.21)。
板上现在是按 0.30 摆的(_pcb1_place_now.json 与 POS 逐件核过,只差这 6 颗的 0.20 / 0.15 和 C609/C612 的旋转)。
再挪这 0.20 / 0.15,6 mm 内会压到 / 要重做的铜(pcb1_ch_reroute.py --win 70,28,120,50 --nets NONE --move … 的碰撞清单):
| 类 | 网 | 铜 | 被谁压 |
|---|---|---|---|
| 要删(异网净距 < 0.20) | VDAC4 |
过孔 (79.85,34.65) | R615.2,+0.185 |
| 要删 | SDA |
L1 (110.20,32.00)-(109.30,31.10) w0.20;过孔 (108.90,31.10) | R617.2,+0.106 / +0.050(这是 pcb1_i2c_l3 的换层孔,它每轮重算会自己让开——§26.22 A-1 已经说过) |
| 扇出短线要按新位置重做 | +3V3 |
L1 (79.08,40.72)-(79.08,41.36) w0.45 ← C607.1;L1 (109.07,37.41)-(109.07,38.06) ← C610.1 | 元件走了,线留在原地 |
| 同上 | GND |
L1 (83.15,40.51)-(84.00,40.51) ← C608.2;(113.14,37.21)-(114.00,37.21) ← C611.2;(78.22,35.23)-(77.80,35.40) ← R615.1;(108.22,31.93)-(107.20,32.80) ← R617.1 | |
| 同上 | $6N530 / $6N545 |
L1 (84.35,39.48)-(83.30,38.50)、(83.30,38.50)-(82.53,38.51) ← C608.1;(114.33,36.17)-(113.30,35.20)、(113.30,35.20)-(112.52,35.21) ← C611.1 |
加上 §2.2 的 C609/C612 转件,下发时一共删 7 线 / 2 孔 + 重做 10 段扇出短线 + 补 2 个 GND 孔。
3. C 类:五路母版的 $*N676/680/698/727(+ 685/687)
3.1 几何(CH1,绝对坐标 = 局部 + (8.3,15.5))
eFuse U14(WQFN-20,rot 180,中心 (14.3,45.8))的四个编程脚在东列(x 16.30,0.5 pitch):
17 ILIM (45.05) $2N685 / 18 dVdT (45.55) $2N687 / 19 IMON (46.05) $2N680 / 20 FLT# (46.55) EFUSE_FLT1;
OVP 15 在南排 (15.05,44.30) $2N676;PGTH 3 在北排 (14.55,47.30) $2N698。
它们要去的 0402 阵(模板 CH1 里 R%09~R%17 / C%14,三列 × 四行,2.0 mm 行距):
| 列 x | y 47.5 | y 45.5 | y 43.5 | y 41.5 |
|---|---|---|---|---|
| 19.3 | R109 (.1 VO1 西 / .2 OVP 东) | R110 (.1 OVP 西 / .2 GND 东) | R111 (.1 ILIM 西 / .2 GND) | |
| 22.8 | C114 (.1 dVdT 西 / .2 GND) | R112 (.1 GND 西 / .2 IMON 东) | R113 (.1 +3V3 / .2 FLT# 东) | |
| 26.3 | R114 (.1 EN) | R115 (.1 PGOOD) | R116 (.1 $2N699 / .2 PGTH 东) | R117 (.1 PGTH 西 / .2 GND) |
症结只有一处:OVP 分压的中点在 R109 的东脚 (19.73,47.5) 和 R110 的西脚 (18.87,45.5)——斜对角,而两脚之间那块 (x 18.319.5, y 45.847.2)
正是 U14 东列四根出线段(终点 x 17.7~18.3)和它们去东边 0402 阵的必经之路;再加 OVP 还要从南排 (15.05,44.3) 绕过 R110/R111 那一列过来。
拆光重布的实测:5/6 通、只剩 $2N676 的 R109.2 → R110.1 这一跳(pcb1_ch_reroute.py --ch 1)。换布线顺序(长的先)反而 4/6。
3.2 方案:R%10 转 180°(母版改一处,五路复制)
R110 转 180° 之后 OVP 脚到东边 (19.73,45.5),正对 R109.2 (19.73,47.5)——一根 2 mm 的竖线,离出线段落脚区 1.2 mm;GND 脚到西边 (18.87,45.5)。
实测:pcb1_ch_reroute.py --ch 1 --move R110:0:0:180 --drop-via 20.62,45.5 → 6/6 布通,净距 0 / 钻孔 0 / 铺铜 0,
连 --also-efuse(再把 EFUSE_FLT1/PG1/EN1 一起拆了重布)也是 8/9(EFUSE_EN1 单独欠一条,是长网的顺序问题)。
GND 脚的扇出孔预先打在 (18.87,44.50)(脚正南 1.0,离 R111.1 顶 0.425)再布,仍是 6/6(--add-via GND:18.87,44.5)。
六个网的路径(--move R110:0:0:180 那一版,可直接手写;L1/L2 层,w0.20):
$2N685 (18.87,43.50)→(18.28,43.50) ; (16.30,45.05)→(17.05,45.05) ; (18.28,43.50)→(17.05,45.05)
$2N687 (22.26,47.50)→(21.56,47.50) ; (16.30,45.55)→(17.88,45.55)→(18.43,46.10)→(20.27,46.10) ; (20.27,46.10)→(20.48,46.10)→(21.55,47.17)→(21.56,47.50)
$2N680 (23.23,45.50)→(23.82,45.50) ; (16.30,46.05)→(17.75,46.05)→(18.23,46.52)→(20.27,46.52) ;
(20.27,46.52)→(20.20,46.73)L1 ▽ (20.20,46.73)→(21.18,45.75)→(23.40,45.75)→(23.70,45.62)→(23.82,45.50)L2 ▽ L1
$2N676 (19.73,47.50)→(20.32,47.50) ; (19.73,45.50)→(20.32,45.50) ; (15.05,44.30)→(15.05,43.55) ;
(20.32,47.50)→(19.90,47.60)L1 ▽ (19.50,47.20)→(19.50,46.10)→(20.20,45.40)L2 ▽ (20.32,45.50)L1 ;
(19.50,45.25)→(19.50,45.05)→(19.20,44.75)→(18.25,44.75)L1 ▽ (16.80,43.30)→(15.30,43.30)L2 ▽ (15.05,43.55)L1
$2N727 (25.13,51.00)→(25.72,51.00) ; (25.72,51.00)→(27.70,51.00)→(28.30,51.60)→(28.30,54.70)→(27.30,55.70)→(25.00,55.70)→(24.50,55.20)→(24.10,55.09)→(23.10,54.05) ; (22.70,53.80)→(21.10,52.20)→(21.10,51.00)
$2N698 (14.55,47.30)→(14.55,48.05)→(14.43,48.17)→(13.38,48.17)→(12.47,49.08)L1 ▽ (11.57,49.98)L2 ; 然后 49.5 mm:
(11.40,49.80)→(10.10,49.80)L2 ▽ (10.10,58.70)→(11.00,59.60)→(29.10,59.60)→(29.80,58.90)→(29.70,45.80)L1 ▽ (27.90,44.00)L2 ▽ (26.00,42.10)→(26.00,41.70)L1
$2N698(PGTH,北排脚 → 第三列)绕了 49.5 mm(从 U14 西边北上、沿 y 59.6 走到 x 29.7 再下来)——通,但难看;--also-efuse 那版是 27.9 mm。
不想绕的话母版里要动的是 R%16/R%17(PGTH 分压):它们在第三列最东(局部 (18,28)/(18,26)),离北排脚 12 mm;现在腾出来的按键区(局部 x 2429 / y 1226)更远,帮不上。先接受绕行。
复制到五路(R%10 在模板里改 rot 0→180 就全改了;下面是板上现有铜的善后,按通道):
| CH | 件 | 现 rot → 新 | 删 GND 短线 | 旧 GND 孔 | 新 GND 孔(脚 ±1.0,北排通道镜像) |
|---|---|---|---|---|---|
| 1 | R110 (19.30,45.50) | 0 → 180 | L1 (19.97,45.50)-(20.62,45.50) | (20.62,45.50) 可留 | (18.87,44.50) 已验证 |
| 4 | R410 (50.97,45.50) | 0 → 180 | L1 (51.63,45.50)-(52.29,45.50) | (52.29,45.50) 可留 | (50.54,44.50) |
| 5 | R510 (130.50,45.50) | 0 → 180 | L1 (131.17,45.50)-(131.82,45.50) | (131.82,45.50) 可留 | (130.07,44.50) |
| 2 | R210 (48.59,80.00) | 180 → 0 | L1 (48.16,80.22)-(48.16,80.89) | (48.16,80.89) 可留 | (49.02,81.00) |
| 3 | R310 (136.97,80.00) | 180 → 0 | L1 (136.54,80.22)-(136.54,80.89) | (136.54,80.89) 可留 | (137.40,81.00) |
每路的六个网(由焊盘签名跨五路对齐算出,已写进 pcb1_ch_reroute.C_NETS):
CH1 $2N685 $2N687 $2N680 $2N676 $2N698 $2N727 / CH2 $8N… 同号 / CH3 $10N… 同号 / CH4 $12N864 $12N866 $12N859 $12N855 $12N877 $12N906 / CH5 $14N… 同号。
布线顺序就按这个(ILIM, dVdT, IMON, OVP, PGTH, 联锁);CH2~5 的路径让 pcb1_ch_reroute.py --ch N --move R%10:0:0:180 --json 各算一遍再手写或交给 route_sig。
4. B 类:USB 差分对(U20 IO19/IO20 → J22)
4.1 现在为什么整束跳过
usb_pair() 第一步就失败:"USB 束(0.7 mm 宽)布不通:(104.0,25.2) -> (147.0,52.0)"。原因不是走廊,是两个锚点被占了:
- 起点
USB_A=(104.0,25.18):SCL顶层线 (104.00,25.20)-(95.90,33.30) 和 (104.03,25.18)-(107.60,28.80) 正好穿过锚点(净距 −0.08 / −0.05),SCL换层孔 (103.30,25.40) 0.43,EFUSE_EN5L2 斜线 0.03,VBUS_EN5L2 斜线 (100.8,20.85)-(119.8,39.85) 0.70——老走廊 A→B 那条 45° 带子被 EFUSE_EN5 / VBUS_EN5 / EFUSE_FLT5(顶层 7 段)占了。 - 终点引出线 (147,52)-(149,52):
EFUSE_EN3的过孔 (149.50,52.10) 和线 (149.5,52.1)-(144.3,46.9) / (149.5,55.9)-(149.5,52.1) 压在上面(−0.17 / −0.19)。 (第二十轮那次 58.1 mm 布通之后,R602/R603 被SAT表挪到 J22 旁边、EFUSE_EN3 又从这里过,落点没了。)
4.2 板上还有的 0.74 束走廊(pcb1_usb_corridor.py,两层各一张 0.5 mm 格的 ASCII 图)
- 顶层 y ≈ 15.8~17.3 那条带:从 x 101 一直空到 x 150(CH5 底 18.23 之上什么都没有,下面是板边 / 风扇座之间)。
- 底层同一条带也是空的(x 100.8 → 150)。
- 东侧北上:顶层 x 142
154、y 17.833.3 整块空(CH5 东缘到 J29/J30 之间);再往北 x 147.8155 / y 33.845.8;到 y 45.846.3 时和 J22 前面那块 (x 143149, y 46~52) 连上。 - 中段 (x 115
135, y 2045) 顶层被 CH5 占满、底层只剩零碎——老走廊已经没了。
实测 --a 101,17:0.74 束 通,76.7 mm、换层 2 次:
(101.3,17.0)L1 → (140.9,17.0)L1 → (141.9,20.4)…(141.9,34.1)L1 ▽ (141.9,38.7)→(143.2,40.0)L2 ▽ (143.2,48.2)L1 → (146.7,51.7)L1
(0.60 束走底层 y 17.3 到 x 131.5 再上顶层,71.5 mm。)
4.3 要改什么(pcb1_route_sig.py 三个常量 + 拆一小截)
USB_A改到 (102.0, 17.0)(西引出线到 x 100,避开 +3V3 孔 (99.04,17.76) 和 +3V3 竖线 x 98.90;--a 101,17会报"引出线净距不够",--a 102,17束本身就通)。U20.13/14(96.75, 24.54/25.81) 到束头的扇入:顶层出脚往东 1.5 mm → 翻底层 → 沿 x≈100 南下到 y 17(底层 x 98.8103 / y 18.825.3 是空的)。 ⇒USB_VIA的头两个孔要重选到 (99.5100.5, 2024) 那一带(两孔错开 ≥ 1.5),现在的 (101.2,25.814)/(99.5,24.544) 是对着老锚点选的。USB_B改到 (146.0, 52.0) 左右,同时拆掉EFUSE_EN3那一截:过孔 (149.50,52.10)、L1 (149.5,52.1)-(144.3,46.9)、L2 (149.5,55.9)-(149.5,52.1) (它会被--ripup重布回去,也可以先--net EFUSE_EN3单独补)。尾孔USB_VIA也要按新的 B 重选(J22.B6/B7 (151.93, 52.75/51.25) 到 (148,52))。--b 146,52实测束通,卡在"扇入段过不去(头 / 尾)"——正是因为USB_VIA还是老坐标。- 让 USB 在 route_sig 里先于 SCL / EFUSE_EN3 / EFUSE_EN5 / VBUS_EN5 占走廊(它本来就在 ①b 先跑);这次跑之前要把 4.1 里压着锚点的那几段自己人铜拆掉,不然还是先失败、后被占。
- 顺手:
NORIP里 USB 已钉死不拆,但SCL那两段是pcb1_i2c_l3画的(不在 route_sig 归属表里),route_sig 拆不到——要在pcb1_i2c_l3的障碍表里把 USB 走廊当禁区,或者先布 USB 再跑 i2c_l3。
pcb1_usb_corridor.py --a X,Y --b X,Y 可以离线反复试锚点(它调的是 usb_pair() 本尊,输出和 route_sig 一样)。孔位 USB_VIA 现在还得手改常量再试;本轮没找到能一次过 _fan() 的组合(扇入用 L 形 + 顶层直出,条件苛刻),建议下一步在 usb_pair() 里把 _fan 改成用 connect() 走一小段迷宫。
5. D 类:SDA / SCL / INA_ALERT 末端
六个末端焊盘周围 1.5 mm([自] = 布线器自己画的,可拆;[扇出] = pcb_fanout 画的,不动):
| 焊盘 | 1.5 mm 内的异网铜(近 → 远) | 拆光自己人后 |
|---|---|---|
U11.3 INA_ALERT (45.97,49.69) |
U11.2 +3V3 / U11.4 SDA 焊盘 0.36;SDA 出线段 (46.47,49.69)-(46.47,49.08) [自] 0.40、SDA 竖线 (46.48,49.08)-(46.48,50.62) [自] 0.41;+3V3 扇出 [扇出] 0.76;SCL 出线段 [自] 0.90;SDA 斜线 [自] 0.96 |
出得去;合法孔位 1.29 mm (45.95,48.40) |
U8.3 INA_ALERT (14.30,49.69) |
U8.2 GND / U8.4 SDA 焊盘 0.36;SDA 出线段 [自] 0.40;GND 扇出 [扇出] 0.76;SCL 出线段 ×2 [自] 0.90;GND 孔 [扇出] 1.11;$2N698 [自] 1.46 |
出得去 |
U8.4 SDA (14.80,49.69) |
U8.3 / U8.5 焊盘 0.36;SCL 出线段 ×2 [自] 0.40;INA_ALERT 出线段 ×2 [自] 0.40;INA_ALERT 斜线 [自] 0.94;$2N699 孔 [自] 1.00 |
出得去;孔位 1.20 mm (16.00,49.70) |
U9.4 SDA (53.09,75.81) |
U9.3 / U9.5 焊盘 0.36;INA_ALERT / SCL 出线段 [自] 0.40;+3V3 孔 (51.92,75.83) [自] 0.86、+3V3 线 ×2 [自] 0.86 |
出得去;孔位 1.19 mm (51.90,75.80)——就是那个 +3V3 孔的位置 |
U10.5 SCL (140.97,75.81) |
U10.4 SDA 焊盘 0.36;SDA 出线段 [自] 0.40 / 0.43;SDA 孔 (140.00,75.40) [自] 0.75;INA_ALERT 出线段 [自] 0.91;EFUSE_PG3 [自] 1.13 |
出得去;孔位 0.22 mm (140.75,75.80) |
U6.6 SCL (79.33,36.51) |
U6.5 $6N525 / U6.7 SDA 焊盘 0.36;两者的出线段 [自] 0.40;U6 散热盘 0.63;$6N525 折线 ×3 [自] 0.76~0.89;GND 孔 [扇出] 0.87 |
出得去,但只有 w0.15 / 0.05 栅格;孔位仍没有 |
结论:不是"器件脚下没有合法孔位",是 INA226 南侧那个 0.5 pitch 的口袋被三根 I²C 线自己的直出段 + 邻脚的直出段填满了。
plan_stubs() 给每个待接脚都留 0.3 mm 直出段并当障碍,SDA/SCL/ALERT 三个相邻脚各留一根,剩下的缝正好 < 0.74。
处理:把三网在 U8/U9/U10/U11/U12 周围 3 mm 内自己画的铜全拆(--net SDA SCL INA_ALERT --ripup,或用 pcb1_ch_reroute.py --win … --nets SDA SCL INA_ALERT --rip-in-win 先离线算),
三根一起按 0.05 栅格重布:先布最远的那根、让它从口袋侧面出去打孔,其余两根从另一侧。
U6.6 那一跳靠 ESCAPE_NUDGE(R615 −0.50 → U6 南排道 0.812)+ 拆 $6N525(U6.5)的 5 段折线。
6. E 类 / GND / +5V
VDAC2(U6.11/12 → R208.2,71 mm)、EFUSE_PG2(→ U23.14,36 mm)、EFUSE_FLT4(→ U17.20 / U23.7):拆光自己人 0.1 栅格就通;要拆的都是 EFUSE_* / +3V3 的若干段,多跑--ripup或把RIP_MAX临时放到 15($10N680那条日志明说"要压掉 6 条,连坐后 11,上限 10")。+5V→J24.8/10:那一坨((15.49,63.77)/(18.03,63.77) 两针 + 6 段 0.30 线,含北侧 y 64.85 那一横)困在 J24 针阵里。2.54 − 1.80 = 0.74 mm 的针缝,+5V 类最细 0.30 需要 0.70(准确)/ 0.84(0.1 栅格)/ 0.77(0.05)/ 0.735(0.025)。 布线器在 0.025 档理论上塞得下(0.74 ≥ 0.735,余 5 µm),实际没成。两条路:① 手写一根 0.30 从 (19.35,62.70) 沿两排针之间(y 62.5)往东走到 +5V 的 (33.27,61.23)——共 6 个针缝,每个 5 µm 余量,别指望 DRC 不叫; ② 认了:+5V 现在只有 4 根 J24 针,这两根不接的话按 §25.10 的分散取电就少一半——要用户拍板要不要从 J24 西端绕出去(约 36 mm 的 0.6 线)。GND:剩的碎片是 Inner1 铺铜 0 mm² 的一块孤岛(pcb1_netlist把它当一个节点)。是pcb1_pour的事,用inner1_verify.py看一眼;布线器不该管。
7. 改了哪些脚本、怎么本地验证的
| 文件 | 改动 | 本地验证 |
|---|---|---|
pcb1_unrouted.py(新) |
逐条连接探路:全铜 / 拆光自己人两遍、线宽阶梯、0.1/0.05 栅格、瓶颈格与"差多少"、末端焊盘出线 + 最近合法孔位、五路签名对齐分类、--json |
/c/Python314/python .claude/pcb1_unrouted.py --json out.json,1m57s,输出即本报告 §1。eda.run 在 import 前换成抛异常的桩 |
pcb1_ch_reroute.py(新) |
在一个窗口 / 一组网络上把布线器自己画的铜拆光,按顺序用引擎本尊重布;--move DES:dx:dy[:rot](本地模型挪 / 转件 + 6 mm 碰撞清单)、--drop-via、--add-via NET:x,y、--rip-in-win、--order、--json |
--ch 1 --move R110:0:0:180 --drop-via 20.62,45.5 → 6/6、净距 0;--win 73,32,87,47 --nets '$6N532' --move C609:0:0:180 --drop-via 78.03,39.61 → 通 |
pcb1_usb_corridor.py(新) |
原样调 usb_pair() 看卡在哪 + 两层 0.74 束的可走格 ASCII 图 + A→B 连通性(0.74/0.60/0.50) |
--a 101,17 → 76.7 mm 通;默认锚点 → 起点被 SCL 压着 |
pcb1_escape_audit.py |
「一个焊盘 + 只有自己的出线段(≤1.2 mm、无孔)」也算孤立焊盘——route_sig 现在把出线段一起下发了,原判据会报 0 个 | 跑出 30 个待审、18 个被围死(和 §1 的 A/C/D 端点一致) |
pcb1_place.py |
ESCAPE_NUDGE 0.30→0.50 / 东列 0.45;新增 SAT_FLIP = {'C609':180,'C612':180}(在 place_sats() 之后施加,rot 90→270);两段注释写明为什么 |
/c/Python314/python .claude/pcb1_place.py 六项全过;POS 与板上快照逐件比对只差这 8 颗 |
没有任何脚本碰过桥接:所有新脚本 import 之前把 eda.run / eda.port 换成抛 RuntimeError 的桩;pcb1_place.py 不带 --push/--verify 本来就只算不发。
8. 下发顺序(等桥接空出来之后;每一步之前先 pcb1_reload.py 确认没人在用)
- A 类(只动 8 颗,绝不
pcb1_place.py --push): a. 按 §2.3 的坐标定点挪 R615/C607/C608/R617/C610/C611,C609/C612 旋转到 270; b. 删 §2.2 + §2.3 表里的 7 线 / 2 孔;删 10 段旧扇出短线; c. 补 C609.1 GND 孔 (77.80,42.00)、C612.1 GND 孔 (107.30,38.00),各接 0.3 短线;重做 C607.1/C610.1 (+3V3)、C608.2/C611.2/R615.1/R617.1 (GND)、C608.1/C611.1 ($6N530/$6N545) 的扇出; d.pcb1_i2c_l3.py --push(SDA 换层孔让开 R617.2); e.pcb1_parts_dump.py(§26.21 那条规矩)。 - C 类:五路
R%10各转 180°(模板CH1里('R%10', 11.0, 30.0, 0)→ rot 180,板上按 §3.2 的表定点转);删 5 段 GND 短线;补 5 个 GND 孔;pcb_prune_nets.py之外不要用--clean——用pcb1_ch_reroute.py --ch N --move R%10:0:0:180 --json逐路算好,手写下发,或route_sig --net <六个网> --ripup --push。 - B 类:拆 EFUSE_EN3 那 3 段 + SCL 穿过 (104,25.2) 的 2 段;改
USB_A/USB_B/USB_VIA;pcb1_usb_corridor.py离线确认usb_pair()通了再route_sig --net USB_DP USB_DM --push。 - D 类:
route_sig --net SDA SCL INA_ALERT --ripup --push(或先用pcb1_ch_reroute.py --win … --rip-in-win离线看)。 - 收尾固定序列:
pcb1_route_sig.py --refresh --ripup --push→pcb1_pour.py --push --refresh→pcb1_reload.py→drc_read.py;pcb1_unrouted.py再跑一遍看还剩几条。