R2:底板 / 刀片布局布线脚本、快照、截图与规划文档更新(含外壳、打印件、布线归档)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
+205
-24
@@ -35,18 +35,28 @@ M3 的第四页。**主体是 R1 载板 `C2-HUB` 整页原样搬过来**(`OFF
|
||||
方案 §8.2 表第 6 条写的「若需要禁用多余口,改的是 strap 而不是电路」在这里反过来了:
|
||||
本来就全开,要做的是**连线**,不是改 strap。
|
||||
|
||||
⚠️ 沿用 R1 第三十三轮的定案(设计文档 §21.6b):`CFG_SEL[2:0]=110`(strap 禁用)
|
||||
取代旧的「`PRT_SWP1~5` 各 100k 下拉」,本页三个 CFG_SEL 脚照 R1 接:
|
||||
⭐ **2026-09-10 R2 底板改回 `CFG_SEL[2:0]=000`(strap 使能)—— 推翻 §21.6b,仅底板;R1 载板仍是 110。**
|
||||
理由:底板上口 1~3 的 D± 北去,Hub 侧 D−/D+ 左右顺序与槽上相反,原来靠「U 形掉头」构造对调,
|
||||
占掉 U32 北面最挤的一块。strap 使能后 `PRT_SWPx` 上拉 = 该口 D+/D− 在芯片内对调,直走即可。
|
||||
R1 当年放弃 strap 是因为载板上 51/49/47 三颗电阻「走线 0 解」;底板 U32 转了 270°,这三只脚
|
||||
外侧只有去耦和可改道的布线挡着(2026-09-10 实测),摆位阶段与去耦一起求解。
|
||||
|
||||
CFG_SEL2(13) —— Table 5-3 缓冲类型 `I`(纯输入)→ 直接接 +3V3_HUB,不加电阻
|
||||
CFG_SEL1(42) —— 复用 HS_IND 输出,必须经 R712 10k **上拉**(硬接会和输出打架)
|
||||
CFG_SEL0(41) —— R711 10k 下拉 ⇒ 1/1/0 = 110
|
||||
CFG_SEL2(13) —— 纯输入 → 由 +3V3_HUB 端口改 **GND 端口**
|
||||
CFG_SEL1(42) —— 复用 HS_IND 输出 → R712 10k 由上拉改 **下拉**(换那面旗)
|
||||
CFG_SEL0(41) —— R711 10k 下拉,不动 ⇒ 0/0/0 = 000
|
||||
PRT_SWP1~3(51/49/47) —— R724~R726 100k **上拉** = 口 1~3 D+/D− 对调;
|
||||
⚠ 本页 1/2、3/4、6/7 脚的端口网名**同时对调**(1 脚 → USB1_DP …),
|
||||
否则片内翻了、网表没翻,极性反而错(`to_strap_mode()` / `SWAP_ROWS`)
|
||||
PRT_SWP4~6(33/31/17) —— R727~R729 100k **下拉** 钉住(口 4/5 手机、口 6 ESP32;I/O12 无内部下拉,§21.6a)
|
||||
PRT_SWP7 / BOOST / GANG_EN —— 采到 1 无害(口 7 空着),不装(§21.6a 同一筛法)
|
||||
NON_REM[1:0] —— R719/R720 各 10k 下拉 = 00,R1 原样(strap 使能后才真正起作用)
|
||||
|
||||
⚠️ **口 7 是全开且悬空的**(`USBDN7_DP/DM` 55/56 不接)。这是**故意**的,理由见 §21.6b:
|
||||
strap 停采样以后原来那两颗 10k 上拉会把 D+ 分压到 `3.3×15/(10+15)=1.98V`,
|
||||
正好压在全速「已插入」的 2.0V 判据上 → 反复枚举失败的幽灵口,比 `lsusb` 里多一个
|
||||
空口难看得多。悬空时被 Hub 内部 15k 下拉拉低 = 空闲,无害。R1 已把 `R714/R715` 删掉,
|
||||
本页同样不装。
|
||||
另:**R723 1 MΩ 跨 XTAL1–XTAL2**(USB2517 Hardware Design Checklist p9:「A 1 MΩ resistor connected
|
||||
across XTAL1 and XTAL2 is required. Failure to place this resistor will result in unstable crystal
|
||||
operation.」;数据手册 p52 Figure 9-1 也画着 1Meg)—— R1 起就漏了。
|
||||
|
||||
⚠️ **口 7 仍悬空**(`USBDN7_DP/DM` 55/56 不接):strap 使能后 PRT_DIS 采的是 D± 上拉,
|
||||
悬空时被 Hub 内部 15k 下拉拉低 ⇒ 口 7 开着、空闲,无害。R714/R715 不装。
|
||||
|
||||
## 第 6 个口要不要串阻 / ESD?——**不要**,和 R1 的五个口一样直连
|
||||
|
||||
@@ -117,7 +127,10 @@ OFF = (0, 0) # 整页原样搬,一个字
|
||||
# **是靠人眼截图发现的**。整块平移 +380,落到 x 730~1070 / y 425~515 那条空带
|
||||
# (上边是 U32 左列端口的 y≤465 @ x=760、下边是 +3V3_HUB 端口 y=525,都不撞)。
|
||||
SHIFT_RECT = (770, 40, 1080, 140) # 源页坐标里的这一块
|
||||
SHIFT_D = (0, 380)
|
||||
# ⚠ 2026-09-10 再右移 40(原 (0,380)):改动 4 在 U32 右列 47/49/51 行(y 475/495/515)加了 strap 电阻,
|
||||
# 原位置的 `VBUS_UP` 端口 (800,500) 标签往左伸到 x≈725,正压在 49 脚那行的 R725 上(截图发现,
|
||||
# 几何验证 / text_clash 都够不着)。右移后标签到 765 为止,R725 那一行的铜到 750 为止。
|
||||
SHIFT_D = (40, 380)
|
||||
|
||||
|
||||
def _in_rect(x, y, r=SHIFT_RECT):
|
||||
@@ -197,12 +210,105 @@ NEW_PARTS = [
|
||||
]
|
||||
BLOCK = (300, 190, 900, 330) # 新块要占的净空矩形(含端口标签)
|
||||
|
||||
# ── 改动 4(2026-09-10,R2 底板):CFG_SEL 改回 000 + PRT_SWP + 晶振 1MΩ(理由见文件头)─────
|
||||
# U32 引脚在本页的坐标:左列 x=320(33@340 / 31@360 / 17@500),右列 x=680(47@475 / 49@495 / 51@515)。
|
||||
# 这六行原来都是悬空脚,两侧端口列(x=170 / x=760)对应的行也都空着(2026-09-10 从 `_c2hub_live.json` 查过)。
|
||||
# 电阻横放 rot 0:1 脚 (x−20)、2 脚 (x+20)(同本页 R708 实测)。
|
||||
STRAP_RIGHT = [('R724', 515, '51'), ('R725', 495, '49'), ('R726', 475, '47')] # 上拉 → +3V3_HUB 端口
|
||||
STRAP_LEFT = [('R727', 340, '33'), ('R728', 360, '31'), ('R729', 500, '17')] # 下拉 → GND 端口
|
||||
# 口 1~3 的 D± 在本页左列(x=320 脚 → x=170 端口,一脚一段直线,2026-09-10 查过):
|
||||
# y 660 = 1 脚 USBDN1_DM、650 = 2 脚 DN1_DP、640 = 3 脚 DN2_DM、630 = 4 脚 DN2_DP、610 = 6 脚 DN3_DM、600 = 7 脚 DN3_DP
|
||||
# PRT_SWP1~3 上拉之后这六只脚的 DP/DM 片内对调 ⇒ 端口网名跟着对调:{y: (原网名, 新网名)}
|
||||
SWAP_ROWS = [(660, ('USB1_DM', 'USB1_DP')), (650, ('USB1_DP', 'USB1_DM')),
|
||||
(640, ('USB2_DM', 'USB2_DP')), (630, ('USB2_DP', 'USB2_DM')),
|
||||
(610, ('USB3_DM', 'USB3_DP')), (600, ('USB3_DP', 'USB3_DM'))]
|
||||
R723_C = (1000, 800) # 1MΩ:Y1 正上方的空行。B 说明块最上一行 y=780(文字盒到 789),端口标签 794~806 不压字
|
||||
STRAP_PARTS = ([[d, 'C25741', 720, y, 0] for d, y, _p in STRAP_RIGHT] +
|
||||
[[d, 'C25741', 250, y, 0] for d, y, _p in STRAP_LEFT] +
|
||||
[['R723', 'C26083', R723_C[0], R723_C[1], 0]])
|
||||
|
||||
|
||||
def hpin(x, y, half=20):
|
||||
u"""横放(rot 0)两脚件的期望:只比坐标集合(`schcheck.two_pin` 只管竖放)。"""
|
||||
return {'?': set([(x - half, y), (x + half, y)])}
|
||||
|
||||
|
||||
def to_strap_mode(W, F, PT):
|
||||
u"""源页是 R1 的 110 接法 → 改成 000:13 脚端口改名 GND、R712 的上拉旗换地旗。**只改名字,坐标不动**。"""
|
||||
n13 = [it for it in PT if (it[1], it[2], it[3]) == ('+3V3_HUB', 170, 540)]
|
||||
assert len(n13) == 1, u'13 脚那个 +3V3_HUB 端口没找到(源页坐标变了?)'
|
||||
n13[0][1] = 'GND'
|
||||
f712 = [it for it in F if (it[0], it[1], it[2], it[3]) == ('Power', '+3V3_HUB', 970, 305)]
|
||||
assert len(f712) == 1, u'R712 上拉那面 +3V3_HUB 旗没找到'
|
||||
f712[0][:] = ['Ground', 'GND', 970, 305, 0] # Ground rot0:符号在下、引脚在上,导线从上方来(同 R711 那面)
|
||||
W2, hit = [], 0
|
||||
for a, b, net in W:
|
||||
if set([a, b]) in (set([(170, 540), (320, 540)]), set([(970, 305), (970, 360)])):
|
||||
assert net == '+3V3_HUB', u'%s-%s 原来不是 +3V3_HUB 而是 %s' % (a, b, net)
|
||||
W2.append((a, b, 'GND'))
|
||||
hit += 1
|
||||
else:
|
||||
W2.append((a, b, net))
|
||||
assert hit == 2, u'要改名的两段导线只找到 %d 段(13 脚那段 + R712 那段)' % hit
|
||||
# ⭐ 口 1~3 的 Hub 侧 DP/DM **网名对调**:PRT_SWPx=1 之后 USBDNx_DM 脚输出的是 D+。
|
||||
# 不对调的话 1 脚还连着槽上的 D− —— 芯片里翻了一次、网表又原样,极性反而错。
|
||||
# 对调后网表就是「Hub 西脚 ↔ 槽西针(D+)」,底板上直走、不交叉(这正是删 U 形掉头的前提)。
|
||||
swap = dict(SWAP_ROWS)
|
||||
got = 0
|
||||
for it in PT:
|
||||
if it[2] == 170 and it[3] in swap:
|
||||
assert it[1] == swap[it[3]][0], u'y=%d 端口原来是 %s 不是 %s' % (it[3], it[1], swap[it[3]][0])
|
||||
it[1] = swap[it[3]][1]
|
||||
got += 1
|
||||
assert got == len(swap), u'要对调的 D± 端口只找到 %d / %d 个' % (got, len(swap))
|
||||
W3, got = [], 0
|
||||
for a, b, net in W2:
|
||||
y = a[1]
|
||||
if a[1] == b[1] and y in swap and set([a[0], b[0]]) == set([170, 320]):
|
||||
assert net == swap[y][0], u'y=%d 导线原来是 %s 不是 %s' % (y, net, swap[y][0])
|
||||
W3.append((a, b, swap[y][1]))
|
||||
got += 1
|
||||
else:
|
||||
W3.append((a, b, net))
|
||||
assert got == len(swap), u'要对调的 D± 导线只找到 %d / %d 段' % (got, len(swap))
|
||||
return W3
|
||||
|
||||
|
||||
def add_straps(s):
|
||||
u"""六颗 strap 电阻 + R723。脚 → 电阻 → 同名端口,同本页「每个芯片脚一段短线 + 一个端口」的画法。"""
|
||||
for _d, y, pin in STRAP_RIGHT:
|
||||
s.w('#SWP' + pin, (680, y), (700, y))
|
||||
# 51 / 47 两行各一个 +3V3_HUB 端口;49 那一行(y=495)**不放端口**:平移过来的 VBUS 分压块的
|
||||
# `VBUS_UP` 标签就在 y=500,放了必压。R725 右端用一段竖线接到 47 行那根线上 ——
|
||||
# 47 行的线在 x=750 断开成两段,三根线在 (750,475) **端点**相交,不做中段 T 接。
|
||||
s.w('+3V3_HUB', (740, 515), (760, 515))
|
||||
s.port('BI', '+3V3_HUB', 760, 515, 0) # BI + rot0 ⇒ 符号在右,同这一列其他端口
|
||||
s.w('+3V3_HUB', (740, 475), (750, 475), (760, 475))
|
||||
s.port('BI', '+3V3_HUB', 760, 475, 0)
|
||||
s.w('+3V3_HUB', (740, 495), (750, 495), (750, 475))
|
||||
for _d, y, pin in STRAP_LEFT:
|
||||
s.w('#SWP' + pin, (320, y), (270, y))
|
||||
# 33 / 17 两行各一个 GND 端口;31 那一行(y=360)**不放端口**:R709/R710 分压的 `VBUS_DET`
|
||||
# 输出端口 (90,360) 标签往右伸到 x≈170,放了必压。改成往上引 25 挂一面地旗
|
||||
# (Ground rot180 = 符号在上、引脚在下,导线从下方来,skill §2);上方 y 365~415 只有 U32 的悬空脚。
|
||||
for y in (340, 500):
|
||||
s.w('GND', (230, y), (170, y))
|
||||
s.port('BI', 'GND', 170, y, 180) # BI + rot180 ⇒ 符号在左,同这一列其他端口
|
||||
s.w('GND', (230, 360), (230, 385))
|
||||
s.gnd(230, 385, 180)
|
||||
x, y = R723_C
|
||||
s.w('XTAL1', (950, y), (x - 20, y))
|
||||
s.port('BI', 'XTAL1', 950, y, 180)
|
||||
s.w('XTAL2', (x + 20, y), (1050, y))
|
||||
s.port('BI', 'XTAL2', 1050, y, 0)
|
||||
|
||||
# ── U32 上故意不接的脚(设计文档 §21.6 / §21.6b)+ J23 的 SBU ──────────────
|
||||
# 53/54 已被改动 2 接走,所以**不在**这张表里。
|
||||
NC = {
|
||||
'U32': ['14', '15', '16', '17', '18', '20', '21', '22', '23', '26', '27', '28',
|
||||
'29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39',
|
||||
'47', '48', '49', '50', '51', '55', '56'],
|
||||
# 17/31/33/47/49/51 是 PRT_SWP6/5/4/3/2/1,2026-09-10 起接 strap 电阻(改动 4),不在表里
|
||||
'U32': ['14', '15', '16', '18', '20', '21', '22', '23', '26', '27', '28',
|
||||
'29', '30', '32', '34', '35', '36', '37', '38', '39',
|
||||
'48', '50', '55', '56'],
|
||||
'J23': ['A8', 'B8'], # SBU1/SBU2,USB2.0 用不上
|
||||
}
|
||||
|
||||
@@ -229,11 +335,11 @@ TEXTS = [
|
||||
(45, 800, u'【A4-HUB】板载 USB 2.0 七口 Hub + Hub 专用 3.3V —— 对电脑只有一根线(D13)', 14),
|
||||
|
||||
# B:Hub 配置 / T6 / 第 6 口 / HUB_RST
|
||||
(345, 780, u'U32 USB2517I:CFG_SEL[2:0]=110 = 内部默认配置 + strap 禁用(§21.6b)', 11),
|
||||
(345, 762, u'CFG_SEL2(13) 纯输入接 +3V3_HUB;CFG_SEL1 经 R712 上拉、CFG_SEL0 经 R711 下拉', 11),
|
||||
(345, 744, u'T6 已核 DS00001598C p.20 Table 7-1:0Ah/0Bh 端口禁用默认 00h ⇒ 七口全开', 11),
|
||||
(345, 726, u'⇒ 口 6 无需改 strap 直接连线;口 1~5 → A5 五槽,口 6 → A3 的 ESP32 原生 USB', 11),
|
||||
(345, 708, u'口 7 全开但悬空(R714/R715 已删:10k 上拉把 D+ 分到 1.98V 会变幽灵口)', 11),
|
||||
(345, 780, u'U32 USB2517I:CFG_SEL[2:0]=000 = 内部默认 + strap 使能(2026-09-10 底板改回)', 11),
|
||||
(345, 762, u'CFG_SEL2(13) 接 GND;R711/R712 10k 下拉;NON_REM=00(R719/R720 下拉)', 11),
|
||||
(345, 744, u'PRT_SWP1~3 经 R724~R726 上拉 = 口 1~3 片内对调;1~7 脚端口 DP/DM 名随之对调', 11),
|
||||
(345, 726, u'PRT_SWP4~6 经 R727~R729 100k 下拉钉住;口 1~5 → A5 五槽,口 6 → ESP32', 11),
|
||||
(345, 708, u'R723 1MΩ 跨 XTAL1–XTAL2:Microchip 检查清单写 required,不装晶振不稳', 11),
|
||||
(345, 690, u'HUB_RST 固件只在启动自检脉冲一次;误复位 = 自断控制台 + 下次烧不进去', 11),
|
||||
|
||||
# C:U31 说明(就在 U31 块左边)
|
||||
@@ -483,6 +589,34 @@ def label_clash(s):
|
||||
return sorted(set(errs))
|
||||
|
||||
|
||||
def port_label_clash(s, place):
|
||||
u"""端口标签(符号 + 字)与别的端口标签 / 两脚件本体叠在一起。
|
||||
|
||||
2026-09-10 改动 4 加 strap 时,`VBUS_UP` 标签压 R725、`VBUS_DET` 标签顶 GND 端口 ——
|
||||
`text_clash` 只查页面文字、`flag_clash` 只看锚点距离,都够不着,是截图发现的。
|
||||
标签按 40 + 5×字符(§8b 实测)、高 ±5 算盒子;两脚件本体按 rot0 ±(20,5) / rot90·270 ±(5,20)。
|
||||
R1 原页可能本来就有擦边,所以只报告、不拦下发。"""
|
||||
boxes = []
|
||||
for d, net, x, y, rot in s.PT:
|
||||
left = (d == 'IN') == (int(rot) % 360 == 0)
|
||||
w = 40 + 5 * len(net)
|
||||
boxes.append(((x - w, y - 5, x, y + 5) if left else (x, y - 5, x + w, y + 5), u'端口 %s@(%d,%d)' % (net, x, y)))
|
||||
bodies = []
|
||||
for d, _k, x, y, rot in place:
|
||||
if d[0] in 'RC' and d[1:].isdigit():
|
||||
bodies.append(((x - 20, y - 5, x + 20, y + 5) if int(rot) % 180 == 0 else (x - 5, y - 20, x + 5, y + 20), d))
|
||||
hit = lambda a, b: a[0] < b[2] and b[0] < a[2] and a[1] < b[3] and b[1] < a[3] # noqa: E731
|
||||
errs = []
|
||||
for i in range(len(boxes)):
|
||||
for j in range(i + 1, len(boxes)):
|
||||
if hit(boxes[i][0], boxes[j][0]):
|
||||
errs.append(u'%s 与 %s 的标签叠在一起' % (boxes[i][1], boxes[j][1]))
|
||||
for b, d in bodies:
|
||||
if hit(boxes[i][0], b):
|
||||
errs.append(u'%s 的标签压在 %s 上' % (boxes[i][1], d))
|
||||
return sorted(set(errs))
|
||||
|
||||
|
||||
def flag_clash(s, gx=20, gy=10):
|
||||
u"""两面旗/端口的符号叠在一起(同 a1_input.py / a2_aux.py)。"""
|
||||
errs, items = [], [(it[1], it[2], it[3]) for it in s.F + s.PT]
|
||||
@@ -498,11 +632,20 @@ def flag_clash(s, gx=20, gy=10):
|
||||
def build():
|
||||
W, F, PT, place, exp, nfloat = load(SRC, OFF)
|
||||
W = shift_block(W, F, PT, place, exp)
|
||||
want_nc = sum(len(v) for v in NC.values()) + len(USB6) # 53/54 在源页上还是悬空的
|
||||
# 53/54(第 6 口)和六个 strap 脚在源页上都还是悬空的
|
||||
want_nc = sum(len(v) for v in NC.values()) + len(USB6) + len(STRAP_RIGHT) + len(STRAP_LEFT)
|
||||
assert nfloat == want_nc, \
|
||||
u'源页悬空引脚 %d 个,NC 表 + 第 6 口 = %d 个(对不上就是漏接或者表过期)' \
|
||||
u'源页悬空引脚 %d 个,NC 表 + 第 6 口 + strap 六脚 = %d 个(对不上就是漏接或者表过期)' \
|
||||
% (nfloat, want_nc)
|
||||
W = to_strap_mode(W, F, PT)
|
||||
assert_clear(W, F, PT, exp, BLOCK)
|
||||
for _d, y, _p in STRAP_RIGHT:
|
||||
assert_clear(W, F, PT, exp, (695, y - 8, 745, y + 8))
|
||||
for _d, y, _p in STRAP_LEFT:
|
||||
assert_clear(W, F, PT, exp, (225, y - 8, 275, y + 8))
|
||||
assert_clear(W, F, PT, exp, (940, R723_C[1] - 8, 1060, R723_C[1] + 8))
|
||||
assert_clear(W, F, PT, exp, (745, 470, 755, 500)) # R725 → 47 行那段竖线
|
||||
assert_clear(W, F, PT, exp, (215, 365, 245, 410)) # R728 的地旗(符号朝上)
|
||||
|
||||
s = Sheet(PAGE, NAME)
|
||||
s.W += W
|
||||
@@ -510,11 +653,17 @@ def build():
|
||||
s.PT += PT
|
||||
add_u31(s)
|
||||
add_usb6(s)
|
||||
add_straps(s)
|
||||
for t in TEXTS:
|
||||
s.txt(t[0], t[1], t[2], t[3])
|
||||
|
||||
place = place + [list(x) for x in NEW_PARTS]
|
||||
place = place + [list(x) for x in NEW_PARTS] + [list(x) for x in STRAP_PARTS]
|
||||
exp = dict(exp)
|
||||
for d, y, _p in STRAP_RIGHT:
|
||||
exp[d] = hpin(720, y)
|
||||
for d, y, _p in STRAP_LEFT:
|
||||
exp[d] = hpin(250, y)
|
||||
exp['R723'] = hpin(*R723_C)
|
||||
exp['U31'] = dict(U31_PINS) # 4 脚件,逐脚断言
|
||||
exp['C752'] = two_pin(C752_C[0], C752_C[1]) # 无极性,只比坐标集合
|
||||
exp['C753'] = two_pin(C753_C[0], C753_C[1])
|
||||
@@ -547,6 +696,10 @@ def main():
|
||||
pins[d] = dict(want)
|
||||
errs = s.netcheck(pins, NC, ALLOW_SPLIT)
|
||||
errs += text_clash(s, exp) + label_clash(s) + flag_clash(s)
|
||||
plc = port_label_clash(s, place)
|
||||
print(u'端口标签叠压(只报告,下发前人工看)%d 条%s' % (len(plc), u':' if plc else u''))
|
||||
for e in plc:
|
||||
print(u' ' + e)
|
||||
# 契约 §3 第 1 条的硬约束复核:HUB_RST 必须有一颗 10k 上拉到 +3V3_HUB
|
||||
assert PARTS['C25744']['name'] == '0402WGF1002TCE', u'C25744 不再是 10k 电阻'
|
||||
r716 = [it for it in place if it[0] == 'R716']
|
||||
@@ -556,8 +709,8 @@ def main():
|
||||
# 第 6 个下行口确实接出去了
|
||||
for net, y in USB6:
|
||||
assert any(it[1] == net and it[0] == 'BI' for it in s.PT), u'%s 端口没画' % net
|
||||
print(u'R1 C2-HUB 原样搬 %d 件 + 新增 %d 件(U31 块)= %d 件'
|
||||
% (len(place) - len(NEW_PARTS), len(NEW_PARTS), len(place)))
|
||||
print(u'R1 C2-HUB 原样搬 %d 件 + 新增 %d 件(U31 块)+ %d 件(strap ×6 + R723 1MΩ)= %d 件'
|
||||
% (len(place) - len(NEW_PARTS) - len(STRAP_PARTS), len(NEW_PARTS), len(STRAP_PARTS), len(place)))
|
||||
s.report(len(place), errs)
|
||||
if not push:
|
||||
return
|
||||
@@ -566,8 +719,36 @@ def main():
|
||||
s.clear()
|
||||
s.place(place, exp)
|
||||
s.push_geometry()
|
||||
hide_strap_values()
|
||||
print(u'接着跑 verify_sch.py --nets')
|
||||
|
||||
|
||||
# ⚠ strap 电阻相邻两行只差 20 个单位:上一颗的阻值字(`Name` 属性 ={Value},在本体下方 15)
|
||||
# 正好落在下一颗的位号(本体上方 5)上 —— 2026-09-10 截图发现,R724 的「100kΩ」和 R725 的位号都在 y=500。
|
||||
# 行距由 U32 引脚定死,挪不开 ⇒ 这六颗**隐藏阻值字、只留位号**(阻值写在 B 块说明里)。R723 那一行没邻居,照常显示。
|
||||
# `sch_PrimitiveAttribute.modify(id, {valueVisible:false})` 2026-09-10 在 R725 上实测:改完立刻读回为 false。
|
||||
# 清页重画会把属性冲回默认,所以这一步必须跟着每次下发走。
|
||||
def hide_strap_values():
|
||||
ds = [d for d, _y, _p in STRAP_RIGHT + STRAP_LEFT]
|
||||
r = call(u"""
|
||||
await eda.dmt_EditorControl.openDocument('%s');
|
||||
await new Promise(r=>setTimeout(r,1500));
|
||||
const DS = %s, out = {};
|
||||
for (const c of await eda.sch_PrimitiveComponent.getAll()) {
|
||||
if (c.getState_ComponentType()!=='part' || !DS.includes(c.getState_Designator())) continue;
|
||||
const nm = (await eda.sch_PrimitiveAttribute.getAll(c.getState_PrimitiveId())).find(a=>a.getState_Key()==='Name');
|
||||
if (!nm) { out[c.getState_Designator()] = 'no Name'; continue; }
|
||||
await eda.sch_PrimitiveAttribute.modify(nm.getState_PrimitiveId(), {valueVisible:false});
|
||||
const back = await eda.sch_PrimitiveAttribute.get(nm.getState_PrimitiveId());
|
||||
out[c.getState_Designator()] = back ? back.getState_ValueVisible() : 'gone';
|
||||
}
|
||||
return out;""" % (PAGE, json.dumps(ds)))
|
||||
bad = [d for d in ds if r.get(d) is not False]
|
||||
if bad:
|
||||
raise SystemExit(u'!! 这几颗的阻值字没藏住:%s(读回 %s)—— 不存盘' % (bad, r))
|
||||
call(u"return await eda.sch_Document.save();")
|
||||
print(u'strap 电阻阻值字已隐藏并存盘:%s' % ' '.join(sorted(ds)))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
在新工单中引用
屏蔽一个用户