文件

69 行
2.7 KiB
Python

#!/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()