文件
phonerail/.claude/xpage.py
T
zhou yang和Claude Opus 5 efcba30a0c R2 底板改 4 层(D15):规则 / 几何 / 背面摆位 / 4 层布线与铺铜,已下发
- 规则:铜层 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
2026-09-10 21:02:10 +08:00

78 行
3.8 KiB
Python
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
# -*- 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))