71 行
3.1 KiB
Python
71 行
3.1 KiB
Python
# -*- 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))
|