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
这个提交包含在:
+56
-2
@@ -70,7 +70,10 @@ E = RS.E # 引擎(polish / _l_shapes / board_mask 从这
|
||||
#: **但 2026-09-06 试着加进来没跑通**:它板上的铜整片都在顶层、且集中在控制块那一带,
|
||||
#: 六条连线里有四条报「L2 源0 / L16 源0」—— 主碎片周围一个合法孔位都没有,扎不下去。
|
||||
#: 要挪它得先把控制块那一带的顶层拆开,不是改这一行的事。
|
||||
NETS = ('SCL', 'SDA')
|
||||
NETS = ('SCL', 'SDA', 'BUCK_PG')
|
||||
# ── 侧键模拟线 POGO3_PWR / POGO3_VDN / POGO4_VDN / POGO5_PWR / POGO5_VUP(第二十六轮加)
|
||||
# 2026-09-06 随 74HC595 + 按键 MOS 整窝挪到载板(§26.23)之后,下板上不再有 POGO* 网络,
|
||||
# 已从候选表拿掉;它们在 Inner2 上的铜由 pcb_prune_nets.py 一并清掉了。
|
||||
L_TOP, L_BOT, L3 = 1, 2, 16
|
||||
LAYS = (L_TOP, L_BOT, L3)
|
||||
|
||||
@@ -108,6 +111,14 @@ CLUSTERS = {
|
||||
'U12': (121.5, 45.5, 129.5, 52.5), # CH5 INA226
|
||||
'U13': (3.0, 90.5, 11.0, 100.0), # 输入侧 INA226
|
||||
'J24': (30.0, 60.5, 38.5, 67.0), # 排针(通孔针,L3 上直接落脚)
|
||||
# 五路 Buck 控制器:`BUCK_PG` 在 U*.14 上。**不划框的话整条出线短线也被拆掉**,
|
||||
# 而那几个脚在 0.5 mm 脚距的 QFN 上,`entry_stub` 重建不回来 ⇒ 整个网络断成 6 片
|
||||
# (2026-09-06 实测,连通性保险当场拦下)。框只罩住芯片本体 + 0.6 mm。
|
||||
'U1': (14.4, 25.1, 19.2, 29.9),
|
||||
'U2': (48.7, 95.6, 53.5, 100.4),
|
||||
'U3': (137.1, 95.6, 141.9, 100.4),
|
||||
'U4': (46.1, 25.1, 50.9, 29.9),
|
||||
'U5': (125.6, 25.1, 130.4, 29.9),
|
||||
}
|
||||
|
||||
|
||||
@@ -964,6 +975,8 @@ def main():
|
||||
|
||||
pads, vias, lines = NL.geom(refresh)
|
||||
print(u'板上:焊盘 %d / 过孔 %d / 走线 %d' % (len(pads), len(vias), len(lines)))
|
||||
# ⚠️ 只拆**这一轮要动的**网络(`--net` 限定时尤其重要)
|
||||
globals()['NETS'] = tuple(nets)
|
||||
keep_l, drop_l, keep_v, drop_v = split_old(pads, vias, lines)
|
||||
dlen = sum(math.hypot(lines[i]['x1'] - lines[i]['x0'],
|
||||
lines[i]['y1'] - lines[i]['y0']) for i in drop_l)
|
||||
@@ -1016,7 +1029,48 @@ def main():
|
||||
if worse:
|
||||
# ⚠️ 这条保险是必需的:本脚本会把这些网络在簇框外的铜**全部拆掉**重来。
|
||||
# 拆得动、重连不上的话,板子会比动手之前更差,而净距校核照样全绿。
|
||||
sys.exit(u'⛔ %s 的连通性变差了 —— 不下发' % ' / '.join(worse))
|
||||
#
|
||||
# 但**不要因此把整轮毙掉** —— `NETS` 是一张「候选表」,里面难免有挪不动的
|
||||
# (2026-09-06 实测 `BUCK_PG`:五个分支要去板子四角,而 L3 上 y<34 往东
|
||||
# 只剩 x115~116 那条 1.0 mm 缝,`+12V` 把别的通道全占了)。
|
||||
# 把变差的那几个**踢出去重算一遍**,剩下的照常下发。
|
||||
print(u' → %s 挪进内层会变差,踢出候选表重算一轮' % ' / '.join(worse))
|
||||
keep = [n for n in nets if n not in worse]
|
||||
if not keep:
|
||||
sys.exit(u'⛔ 候选表里一个都留不下 —— 不下发')
|
||||
# ⚠️ **拆除清单必须跟着重算**。第一版只换了 `run_plan` 的网络表,
|
||||
# 而 `drop_l/drop_v` 还是按完整候选表算的 ⇒ `--push` 会把被踢掉那个网络的
|
||||
# 铜删掉、又不给它重布,板子直接变差(净距校核照样全绿)。
|
||||
globals()['NETS'] = tuple(keep)
|
||||
keep_l, drop_l, keep_v, drop_v = split_old(pads, vias, lines)
|
||||
vlines, vvias = virtual(pads, vias, lines, drop_l, drop_v)
|
||||
print(u' 重算后要拆:%d 段 / %d 孔(%d 个网络)'
|
||||
% (len(drop_l), len(drop_v), len(keep)))
|
||||
del BLOCK[:]
|
||||
routes = run_plan(pads, vvias, vlines, keep)
|
||||
routes = chamfer(routes, pads, vvias, vlines)
|
||||
msgs, _r = plane_report(routes, pads_raw, obs_board)
|
||||
for m in msgs:
|
||||
print(u' ⚠️ ' + m)
|
||||
if msgs:
|
||||
sys.exit(u'⛔ 重算之后仍有孤岛 —— 不下发')
|
||||
summarize(routes)
|
||||
bad = verify(routes, pads, vvias, vlines)
|
||||
for b in bad[:20]:
|
||||
print(u' ✗ ' + b)
|
||||
if bad:
|
||||
sys.exit(u'⛔ 重算之后校核不过 —— 不下发')
|
||||
nets = keep
|
||||
worse2 = []
|
||||
for net, n, det in connectivity(routes, pads, vvias, vlines):
|
||||
was = len(frags(net, pads, vias, lines))
|
||||
print(u' 连通性 %s:%d 个碎片 %s%s'
|
||||
% (net, n, det if n > 1 else u'✅',
|
||||
u'' if n <= was else u' ⛔ 仍然变差'))
|
||||
if n > was and net in keep:
|
||||
worse2.append(net)
|
||||
if worse2:
|
||||
sys.exit(u'⛔ %s 重算之后仍然变差 —— 不下发' % ' / '.join(worse2))
|
||||
if not push:
|
||||
print(u'\n(只算不下发。要下发加 --push)')
|
||||
return
|
||||
|
||||
在新工单中引用
屏蔽一个用户