#!/usr/bin/env python3 """清点两块板引用了哪些符号,以及位号前缀 / netflag / netport 的分布。""" import json, os, sys, collections ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "eda_src") def _prefix(d): """位号前缀 = 开头连续的字母。R9A/Rs6/C106 -> R/Rs/C""" i = 0 while i < len(d) and d[i].isalpha(): i += 1 return d[:i] or d def pages(board): tree = json.load(open(os.path.join(ROOT, "_tree.json"), encoding="utf-8")) return next(x for x in tree["boards"] if x["board"] == board)["pages"] def comps(board): for p in pages(board): g = json.load(open(os.path.join(ROOT, board, p["name"] + ".geom.json"), encoding="utf-8")) for c in (g["prims"]["Component"] or []): c["__page"] = p["name"]; c["__board"] = board yield c def main(): sym = {} # uuid -> {name, refs:set, count} flag = collections.Counter() # (symbolName, net) port = collections.Counter() for b in ("Board1", "Board2"): for c in comps(b): t = c["ComponentType"] if t == "part": s = c.get("Symbol") or {} u = s.get("uuid") e = sym.setdefault(u, {"name": s.get("name"), "refs": set(), "n": 0}) d = c.get("Designator") or "" e["refs"].add(_prefix(d)) e["n"] += 1 elif t == "netflag": flag[((c.get("Component") or {}).get("name"), c.get("Net"))] += 1 elif t == "netport": port[((c.get("Component") or {}).get("name"),)] += 1 print(f"part 引用的不同符号: {len(sym)}") multi = {u: e for u, e in sym.items() if len(e["refs"]) > 1} if multi: print(f" ⚠ 前缀不唯一的符号 {len(multi)}:") for u, e in list(multi.items())[:6]: print(f" {e['name']:28s} {sorted(e['refs'])}") fs = collections.Counter(k[0] for k in flag) print(f"\nnetflag 图形种类 {len(fs)}: {dict(fs)}") nets = sorted({k[1] for k in flag}) print(f"netflag 网络 {len(nets)}: {nets}") conflict = collections.defaultdict(set) for (s, n), _ in flag.items(): conflict[n].add(s) bad = {n: v for n, v in conflict.items() if len(v) > 1} print(f"同一网络用了多种 netflag 图形: {bad if bad else '无'}") print(f"\nnetport 图形种类: {dict(port)}") json.dump({u: {"name": e["name"], "refs": sorted(e["refs"]), "n": e["n"]} for u, e in sym.items()}, open(os.path.join(ROOT, "_symbols_used.json"), "w", encoding="utf-8"), ensure_ascii=False, indent=1) if __name__ == "__main__": main()