文件
phonerail/.claude/_pcb1_unrouted_report.md

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. 结论(先看这里)

  1. 35 条里只有 2 条是摆位几何上真出不去的(U6.16 / U7.16 = $6N532 / $6N547)。其余 33 条在"拆光布线器自己画的铜"之后 全部能以 0.20 线宽在 0.1 / 0.05 栅格上布通——它们是布线顺序 / 拆线额度的事,不是母版几何缺口。 证据:pcb1_unrouted.py(新工具)对每条连接做两遍探路,全铜 vs 拆光自己人;◆ 行给出具体要拆哪些网络的哪几段。
  2. A 类:ESCAPE_NUDGE 0.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。
  3. 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)。
  4. 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)。
  5. 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_NUDGE 0.50 正是为它。
  6. 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_EN5 L2 斜线 0.03,VBUS_EN5 L2 斜线 (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 142154、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 115135, 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 三个常量 + 拆一小截)

  1. 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) 是对着老锚点选的。
  2. 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 还是老坐标。
  3. 让 USB 在 route_sig 里先于 SCL / EFUSE_EN3 / EFUSE_EN5 / VBUS_EN5 占走廊(它本来就在 ①b 先跑);这次跑之前要把 4.1 里压着锚点的那几段自己人铜拆掉,不然还是先失败、后被占。
  4. 顺手: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 确认没人在用)

  1. 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 那条规矩)。
  2. 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。
  3. 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。
  4. D 类:route_sig --net SDA SCL INA_ALERT --ripup --push(或先用 pcb1_ch_reroute.py --win … --rip-in-win 离线看)。
  5. 收尾固定序列:pcb1_route_sig.py --refresh --ripup --push → pcb1_pour.py --push --refresh → pcb1_reload.py → drc_read.py;pcb1_unrouted.py 再跑一遍看还剩几条。