46 行
2.1 KiB
Python
46 行
2.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
u"""D16 收尾:给指定的 GND 焊盘各打一个孔(route_base.plane_vias,只管给定的脚)—— 服务器跑。
|
|
|
|
DCDC_ROUTE_SERVER=1 /root/pypy/bin/pypy3 .claude/r2/d16_gndfix.py 位号.脚号 ...
|
|
|
|
为什么:拆束重布 + 重铺之后 DRC 报 J36.1 / J36.4 / Q6.2 的 GND 断开 —— 它们原来靠铺铜接地,新线把那块铺铜切成了孤岛 /
|
|
铺铜分块变了那块没填出来。给它们各自的孔最稳。读 _board_for_gnd.json(存档快照 + 采样线加宽 / 删重叠孔),写 _d16_gndfix.out.json。
|
|
"""
|
|
import io
|
|
import json
|
|
import os
|
|
import sys
|
|
|
|
if os.environ.get('DCDC_ROUTE_SERVER') != '1':
|
|
sys.exit(u'!! 布线运算只在服务器上跑(DCDC_ROUTE_SERVER=1),见 CLAUDE.md')
|
|
if '--grid' not in sys.argv:
|
|
sys.argv += ['--grid', '0.125']
|
|
HERE = os.path.dirname(os.path.abspath(__file__))
|
|
sys.path.insert(0, os.path.dirname(HERE))
|
|
sys.path.insert(0, HERE)
|
|
import route_nets as N # noqa: E402
|
|
|
|
R = N.R
|
|
|
|
|
|
def main():
|
|
want = set(tuple(a.split('.')) for a in sys.argv[1:] if '.' in a and not a.startswith('--') and a != '0.125')
|
|
b = json.load(io.open(os.path.join(HERE, '_board_for_gnd.json'), encoding='utf-8'))
|
|
segs = [tuple(s[:7]) for s in b['segs']]
|
|
vias = [tuple(v[:3]) for v in b['vias']]
|
|
pads = R.load_pads()
|
|
skip = set((p[0], str(p[1])) for p in pads if (p[0], str(p[1])) not in want)
|
|
N.INNER[:] = [s for s in segs if s[0] in (15, 16)]
|
|
logs = []
|
|
_is_ep = R.is_ep
|
|
R.is_ep = lambda p: False # 一律「短线 + 孔」,不在焊盘里打孔阵
|
|
s, v = R.plane_vias(pads, [x for x in segs if x[0] in (1, 2)], vias, [], logs, skip, 'late', set())
|
|
R.is_ep = _is_ep
|
|
print(u'打孔 %d 个、引出线 %d 段;没打上:%s' % (len(v), len(s), [m for m in logs]))
|
|
io.open(os.path.join(HERE, '_d16_gndfix.out.json'), 'w', encoding='utf-8').write(json.dumps(
|
|
{'segs': [list(x) for x in s], 'vias': [list(x) for x in v], 'logs': logs}, ensure_ascii=False))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|