R2:底板 / 刀片布局布线脚本、快照、截图与规划文档更新(含外壳、打印件、布线归档)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
zhou yang
2026-10-04 19:24:45 +08:00
共同撰写人 Claude Opus 5.5
父节点 cd01640c40
当前提交 cf7cc9cf90
共修改 759 个文件,包含 76962 行新增和 5299 行删除
+13 -26
查看文件
@@ -1,5 +1,9 @@
# -*- coding: utf-8 -*-
u"""R2 刀片 **B4-EDGE** 页:PCI-E x4 金手指 + PRSNT# 短接 + D± 退路座。
u"""R2 刀片 **B4-EDGE** 页:PCI-E x4 金手指 + PRSNT# 短接。
⛔ **2026-09-11 删掉 `J2`(D± 退路座)**:底板的 `J39~J43` 在 2026-09-09 已删(方案 §28.11),
刀片这一头没了对端,D12 退路实质作废;刀片压到 90×68 那一轮顺手删掉,
D± 不再往东绕到 x≈60(旧版 D± 60~85 mm / 6~7 孔,大半是它造成的)。
/c/Python314/python .claude/r2/b4_edge.py # 只算 + 本地自检
/c/Python314/python .claude/r2/b4_edge.py --push # 清页 + 重画(幂等)
@@ -41,7 +45,7 @@ PRSNT#=A1↔B31(x4 全长在位;B17 那个是 x1 用的,本板当地用)
## ⚠ ALLOW_SPLIT 放宽了,补一层更硬的判据
连接器页天然靠同名端口/旗成网,不是靠导线:`GND`(三段梳子)、`+12V`(A/B 两排)、
`+3V3`(A/B 两排)、`+5V`(A19/A32 两针)、`USB_DP/DM`(金手指 + 退路座)都是分块的。
`+3V3`(A/B 两排)、`+5V`(A19/A32 两针)都是分块的。
放宽 ALLOW_SPLIT 会让「漏连」这条检查失效,所以本脚本额外做一件事:
逐脚断言「这根针踩着的那段导线,声明的网络名 == PIN_NET 里写的」(`check_pin_nets`)。
少接一根、接错一根都会当场报出来。
@@ -57,14 +61,13 @@ from schcheck import Sheet, by_rel # noqa: E402
PAGE, NAME = 'c8f10dbd1286853b', 'B4-EDGE'
EDGE, WV4 = 'PCIE-X4-EDGE-64P', 'C225106'
EDGE = 'PCIE-X4-EDGE-64P'
# ── 版面常量 ─────────────────────────────────────────────────────────
J1 = (620, 470) # 金手指符号中心;A 排引脚 x=585,B 排 x=655
AX, BX = J1[0] - 35, J1[0] + 35
ABUS, BBUS = 340, 900 # 左/右地母线
APORT, BPORT = 490, 760 # 信号端口列
J2 = (1000, 700) # D± 退路座(1.25mm 4P),引脚朝左
def row(n):
@@ -102,25 +105,20 @@ BGND_MAIN = [n for n in range(1, 33)
if PIN_NET['B%d' % n] == 'GND' and n != 32]
# 同名端口/旗成网、导线上天然分块的网络(判据换成 check_pin_nets,见表头)
ALLOW_SPLIT = set(['GND', '+12V', '+3V3', '+5V', 'USB_DP', 'USB_DM'])
ALLOW_SPLIT = set(['GND', '+12V', '+3V3', '+5V'])
EDGE_REL = {}
for _n in range(1, 33):
EDGE_REL['A%d' % _n] = (-35, 155 - 10 * (_n - 1))
EDGE_REL['B%d' % _n] = (35, 155 - 10 * (_n - 1))
# A1251WV-S-4P rot 0 实测:1~4 自上而下、5/6 是两个固定脚,全部朝左出
WV4_REL = {'1': (-25, 15), '2': (-25, 5), '3': (-25, -5), '4': (-25, -15),
'5': (-25, 35), '6': (-25, -35)}
def placement():
return [['J1', EDGE, J1[0], J1[1], 0],
['J2', WV4, J2[0], J2[1], 0]]
return [['J1', EDGE, J1[0], J1[1], 0]]
def expect():
return {'J1': by_rel(J1[0], J1[1], EDGE_REL),
'J2': by_rel(J2[0], J2[1], WV4_REL)}
return {'J1': by_rel(J1[0], J1[1], EDGE_REL)}
def build():
@@ -200,25 +198,14 @@ def build():
s.w('PRSNT#', (620, 245), (620, 215))
s.port('OUT', 'PRSNT#', 620, 215, 0)
# ── 8. J2 D± 退路座(1=+5V 2=DP 3=DM 4/5/6=GND)──────────────────
jx, jy = J2
for dy, net, d in ((15, '+5V', 'OUT'), (5, 'USB_DP', 'BI'), (-5, 'USB_DM', 'BI')):
s.w(net, (jx - 25, jy + dy), (890, jy + dy))
s.port(d, net, 890, jy + dy, 0)
for dy in (35, -15, -35): # 4 = 地,5/6 = 固定脚
s.w('GND', (jx - 25, jy + dy), (1030, jy + dy))
s.w('GND', (1030, jy + 35), (1030, jy - 35))
s.w('GND', (1030, jy + 35), (1030, jy + 60))
s.gnd(1030, jy + 60, 180)
# ── 9. 文字 ─────────────────────────────────────────────────────
s.txt(45, 795, u'【B4-EDGE】PCI-E x4 金手指(只借机械与针位语义,不是 PCIe)+ D± 退路座', 14)
# ── 8. 文字(J2 D± 退路座 2026-09-11 已删,见表头)──────────────────
s.txt(45, 795, u'【B4-EDGE】PCI-E x4 金手指(只借机械与针位语义,不是 PCIe)', 14)
s.txt(45, 230, u'⚠ NOT PCIe —— 底板插槽旁必须丝印「PhoneRail blade only」。', 11)
s.txt(45, 212, u'T4 已核 CEM 引脚表:B1/B2/B3 都是 +12V(不是 RSVD),', 10)
s.txt(45, 194, u' 所以 +5V 挪到 A19 / A32 —— 每一版 CEM 里它俩都是 RSVD。', 10)
s.txt(45, 176, u'⚠ B10 = +3.3Vaux 必须悬空;B12/B17/B30 与全部 lane 针接地。', 10)
s.txt(45, 158, u'PRSNT# = A1 ↔ B31 短接(x4 全长在位判据)。', 10)
s.txt(45, 140, u'J2 = D± 退路座:PCB 上金手指到 J2 之间留割断位(D12)。', 10)
s.txt(45, 140, u'D± 退路座 J2 已删(底板 J39~J43 已删、无对端,D12 作废)。', 10)
return s