- 规则:铜层 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
78 行
3.8 KiB
Python
78 行
3.8 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""跨页网络对账:列出每个网络名出现在哪些页,标出只出现在一页的(多半是漏接或拼错)。"""
|
||
import json, sys, os
|
||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||
from eda import run
|
||
from collections import defaultdict
|
||
|
||
JS = """
|
||
const out={};
|
||
for (const p of await eda.dmt_Schematic.getCurrentSchematicAllSchematicPagesInfo()){
|
||
await eda.dmt_EditorControl.openDocument(p.uuid);
|
||
const nets=[];
|
||
for (const c of await eda.sch_PrimitiveComponent.getAll()){
|
||
const t=c.getState_ComponentType();
|
||
if (t==='netflag'||t==='netport'){
|
||
let n=''; try{ n=c.getState_Net()||''; }catch(e){}
|
||
nets.push(t+'|'+n);
|
||
}
|
||
}
|
||
out[p.name]=nets;
|
||
}
|
||
return out;
|
||
"""
|
||
r = run(JS, timeout=600)
|
||
assert r.get('success'), json.dumps(r, ensure_ascii=False)[:500]
|
||
data = r['result']
|
||
|
||
pages, kinds, count = defaultdict(set), {}, defaultdict(int)
|
||
for page, items in data.items():
|
||
for it in items:
|
||
k, n = it.split('|', 1)
|
||
pages[n].add(page); count[n] += 1; kinds[n] = k
|
||
|
||
POWER = {'GND', '+3V3', '+12V'}
|
||
# 五路复制后才会出现对端的网络(CH2~CH5 与 P4-USB 还没画)
|
||
# 2026-09-04:五路都画完了,这些网络本来就该有对端;留着只是为了万一将来再加页。
|
||
PENDING = tuple('EFUSE_EN EFUSE_FLT EFUSE_PG VDAC K2_ K3_ K4_ K5_ VBUS_EN'.split())
|
||
# 2026-09-04 两板拆分之后,VO2_P~VO5_P 在 P5-BTB 上都有了对端(每路 3 针),
|
||
# 原来那条「只为命名、天然单实例」的豁免已经不需要了。
|
||
# 这个集合先留空:真出现单实例就该报出来,别再默默放行。
|
||
# 2026-09-06 595 上载板之后:POGOn_* 只在 C4-SITEn 一页上(按键 MOS 漏极 -> 顶针那一段),
|
||
# 端口只是给 PCB 网络起名(pcb2_route_sig 等按名字认它),天然单实例。
|
||
NAMING_ONLY = {'POGO%d_%s' % (n, k) for n in range(1, 6) for k in ('PWR', 'VUP', 'VDN')}
|
||
# 2026-09-07 FAN-R2:两路 TACH 的风扇侧原始节点只在 P6 一页上(座子 -> 上拉 -> 串阻),
|
||
# 端口只是给 PCB 网络起名,天然单实例。开关后的 FAN_12V_SW 用电源旗,不在这里。
|
||
NAMING_ONLY |= {'FAN_IN_TACH_RAW', 'FAN_OUT_TACH_RAW'}
|
||
# 2026-09-08 R2 刀片 B4-EDGE:PRSNT# 只是金手指 A1↔B31 在刀片内部短接的那一根,
|
||
# 刀片这一侧天生没有对端(对端在**底板**的 A5-SLOTS,另一份原理图,xpage 看不到)。
|
||
# 端口只为给网络起名,否则 EasyEDA 会给个 $4N... 默认名。
|
||
NAMING_ONLY |= {'PRSNT#'}
|
||
# 2026-09-08 R2 底板 A1-INPUT:入口链三个节点(J1→F1→Q1→Rs6)在 R1 上本来是无名网络,
|
||
# PCB 侧只能按 $1N223/$1N227/$1N236 认。这一段过 9A、要铺铜 + 断面校核(方案 §6.4),
|
||
# 所以各挂一面 Power 旗起名 —— 天然单实例,本页内部的节点,不该有对端。
|
||
NAMING_ONLY |= {'VIN_RAW', 'VIN_FUSED', 'VIN_SW'}
|
||
|
||
print('%-14s %-8s %-4s %s' % ('网络', '类型', '实例', '出现在哪些页'))
|
||
print('-' * 78)
|
||
bad, pend = [], []
|
||
for n in sorted(pages):
|
||
ps = sorted(pages[n])
|
||
mark = ''
|
||
if n not in POWER:
|
||
if len(ps) == 1 and n.startswith(PENDING) and not n.endswith('1'):
|
||
mark = ' (待 CH2~5 补对端)'; pend.append(n)
|
||
elif n.startswith('VBUS_EN') and count[n] < 2:
|
||
mark = ' (待 P4-USB 补对端)'; pend.append(n)
|
||
elif n in NAMING_ONLY:
|
||
mark = ' (只为命名,无对端;见 NAMING_ONLY 注释)'
|
||
elif count[n] < 2:
|
||
mark = ' <== 只有 1 个实例,必定漏接'; bad.append(n)
|
||
print('%-14s %-8s %-4d %s%s' % (n or '(空)', kinds[n], count[n], ', '.join(ps), mark))
|
||
|
||
print()
|
||
print('真正漏接(全工程只有 1 个实例): %d 个' % len(bad))
|
||
for n in bad:
|
||
print(' !', n, '->', sorted(pages[n]))
|
||
print('等后续页面补对端: %d 个' % len(pend))
|