文件
phonerail/.claude/r2/pcb_pinswap.py
T

71 行
3.1 KiB
Python
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
# -*- coding: utf-8 -*-
u"""把 `pinmap_base.py` 在原理图上做的 EFUSE/PRSNT 换脚**同步到 PCB 的焊盘网名**。
/c/Python314/python .claude/r2/pcb_pinswap.py # 只读回对比
/c/Python314/python .claude/r2/pcb_pinswap.py --push # 改焊盘网名 + 读回校验
⚠ 为什么不走「从原理图导入变更」对话框:那条路会按内部通道 ID 重新配对,
R1 §交接二 踩过一次(配错一格,把一个本来正确的风扇块打乱),修起来要
`pcb1_uid_sync.py`。这里只有 8 只脚换名、元件身份一个没动,**定点改焊盘更安全**,
判据也简单:读回这 8 只脚的网名逐个对上。
"""
import json
import os
import sys
HERE = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.dirname(HERE))
sys.path.insert(0, HERE)
from eda import run # noqa: E402
import pcb_base as B # noqa: E402
WANT = {'8': 'PRSNT1#', '9': 'PRSNT2#', '10': 'PRSNT3#', '11': 'PRSNT4#',
'17': 'EFUSE_EN1', '18': 'EFUSE_EN2', '19': 'EFUSE_EN3',
'20': 'EFUSE_EN4', '21': 'EFUSE_EN5'}
# 2026-09-11 方案 B(原理图 `u20_remap_b.py` 已改):NTC 挪到南排 ADC1 的 IO4/IO5,风扇整组挪到西列北段,
# 38/39(IO2/IO1)改空脚(目标网名 '')。与上面 §29.5 那 9 只一起读回核对。
WANT.update({'4': 'NTC1', '5': 'NTC2', '6': 'UP_VBUS_DET', '7': 'PRSNT5#',
'22': 'FAN_TACH_OUT', '23': 'FAN_TACH_IN', '24': 'FAN_PWM', '25': 'FAN_EN',
'38': '', '39': ''})
JS = u"""
await eda.dmt_EditorControl.openDocument('%s');
await new Promise(r => setTimeout(r, 2000));
const WANT = %s, PUSH = %s;
const out = [];
for (const c of await eda.pcb_PrimitiveComponent.getAll()) {
if (c.designator !== 'U20') continue;
const ps = await eda.pcb_PrimitiveComponent.getAllPinsByPrimitiveId(c.getState_PrimitiveId());
for (const p of ps) {
const n = String(p.getState_PadNumber());
if (!(n in WANT)) continue;
const before = String(p.net || '');
if (PUSH && before !== WANT[n]) { try { p.toAsync().setState_Net(WANT[n]).done(); } catch (e) {} }
out.push([n, before, WANT[n]]);
}
}
if (PUSH) { await eda.pcb_Document.save(); await new Promise(r => setTimeout(r, 800)); }
return out;
"""
def call(push):
r = run(JS % (B.PCB, json.dumps(WANT, ensure_ascii=False), 'true' if push else 'false'),
timeout=300)
assert r.get('success'), json.dumps(r, ensure_ascii=False)[:400]
return r['result']
if __name__ == '__main__':
push = '--push' in sys.argv
rows = call(push)
rows.sort(key=lambda t: int(t[0]))
for n, before, want in rows:
flag = u'' if before == want else u' ← 改'
print(u' pin%-3s %-11s → %-11s%s' % (n, before or '(空)', want, flag))
if push:
after = {t[0]: t[1] for t in call(False)}
bad = [n for n, w in WANT.items() if after.get(n) != w]
print(u'[%s] 读回校验%s' % ('OK' if not bad else 'X',
u'%d 只脚逐个对上' % len(WANT) if not bad else u' 不过: %s' % bad))