69 行
2.7 KiB
Python
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()
|