文件
phonerail/.claude/_pcb1_unrouted_report.md

292 行
31 KiB
Markdown

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
# 下板 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.3~19.5, y 45.8~47.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 24~29 / y 12~26)更远,帮不上。先接受绕行。
复制到五路(`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 142~154、y 17.8~33.3 整块空(CH5 东缘到 J29/J30 之间);再往北 x 147.8~155 / y 33.8~45.8;到 y 45.8~46.3 时和 J22 前面那块 (x 143~149, y 46~52) 连上。
- 中段 (x 115~135, y 20~45) 顶层被 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.8~103 / y 18.8~25.3 是空的)。
⇒ `USB_VIA` 的头两个孔要重选到 (99.5~100.5, 20~24) 那一带(两孔错开 ≥ 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` 再跑一遍看还剩几条。