# -*- 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))