文件
phonerail/.claude/r2/repair_route.py
T
zhou yang和Claude Opus 5 efcba30a0c R2 底板改 4 层(D15):规则 / 几何 / 背面摆位 / 4 层布线与铺铜,已下发
- 规则:铜层 2→4,差分 0.28/0.18,间距 0.15,过孔 0.3/0.2(rules_base)
- 几何:98×98 板框 + 4×M3,槽阵居中,L1 12V 大铜 + 指头(pcb_base)
- 摆位:五插槽留 L1,其余 133 件翻到 L4;背面镜像规则实测;Hub 放走廊 2、
  东移 2.5 mm;扇出圈 / 小件间距 1.5(去耦例外)/ 9 A 过孔阵禁区(place_base)
- 叠层按用户决定改为 L1 槽面 / L2 整层 +3V3 / L3 整层 GND / L4 器件面
- 布线:D± 七对按构造布通(USB3 掉头、USB1/2 北去掉头、USB4/5 东绕、
  J23 桥),+3V3 / GND / +12V 平面网每脚一孔,0.125 网格 + PathFinder
  开关(route_base、remote_route.ps1);剩 37 个网待手工补
- 铺铜:4 层重写,入口链自南向北切段 + 断面校核(pour_base);
  已下发布线 / 缝合孔 / 铜面轮廓,填铜未成功(待查)
- 工具:plot_base / plot_routes / shot_base,board_check 通孔两层都算

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_0168Bu6SEx3cXXCJLkdnE6zB
2026-09-10 21:02:10 +08:00

46 行
2.0 KiB
Python
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
# -*- coding: utf-8 -*-
u"""补线器:在**板上现有铜**之上只布没接完的那几个网(不动其它任何线)。
/c/Python314/python .claude/r2/repair_route.py # 只算
/c/Python314/python .claude/r2/repair_route.py --push # 追加下发(只推新增的段/孔)
现有铜从 `_m6_board_copper.json`(pcb 读回)来,按网名打进占用图 —— 同网可穿,
所以 A* 从没接上的焊盘出发,碰到本网已有的铜就算到了。
"""
import io, json, os, sys, math
sys.stdout.reconfigure(encoding='utf-8')
HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.dirname(HERE)); sys.path.insert(0, HERE)
import router as RT
import pcb_rules as R
NETS = [a for a in sys.argv[1:] if not a.startswith('--')] or \
['VDAC', '$1N147', '$1N156', 'EFUSE_PG', '$1N165', 'VO', '+3V3', 'VBUS', 'SDA']
cp = json.load(io.open(os.path.join(HERE, '_m6_board_copper.json'), encoding='utf-8'))
segs = [tuple(s) for s in cp['segs']]
vias = [tuple(v) for v in cp['vias']]
pads = RT.load_pads()
auto = R.resolve_auto()
board_vias = [(v[0], v[1], v[2], RT.VIA_D) for v in vias if v[2] == 'GND']
_fs, _fv, launch = RT.finger_escape()
bypad = {}
for p in pads:
if p[0] == 'J1' or not p[7] or p[7] in RT.SKIP:
continue
bypad.setdefault(p[7], []).append(p)
for net, pts in launch.items():
for (lay, x, y) in pts:
bypad.setdefault(net, []).append(['J1', 'launch', x, y, 0.3, 0.3, lay, net, 'RECT'])
n0, v0 = len(segs), len(vias)
logs = RT.route_groups(bypad, pads, segs, vias, board_vias, auto,
priority=tuple(NETS), only=set(NETS))
new_s, new_v = segs[n0:], vias[v0:]
print(u'新增 %d 段 / %d 孔' % (len(new_s), len(new_v)))
for m in logs:
print(u' [!] ' + m)
left = RT.check_connected(pads, segs, vias)
print(u'连通性复查:%s' % (u'全通' if not left else left))
json.dump({'segs': new_s, 'vias': new_v}, io.open(os.path.join(HERE, '_m6_repair.json'), 'w', encoding='utf-8'))
if '--push' in sys.argv and new_s:
RT.push(new_s, new_v)