- 规则:铜层 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
46 行
2.0 KiB
Python
46 行
2.0 KiB
Python
# -*- 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)
|