main
John Lauer Publish independent Astra ESC source and full-pad Kelvin review lesson d057af8 22d ago
from component_search import *
import component_search as cs,planner as m,ast
from route_search import search2
plans=[];blocked=[];lookup={p['name']:p for p in pads if not p['name'].endswith('.')};kelvin=[]
for net,a,b in [('GND','U6.3','R32.2'),('GND_OUT','U6.4','R32.1')]:
 p,q=lookup[a],lookup[b];dy=q['y']-p['y'];bend=q['x']-1.8
 path=[[p['x'],p['y']],[bend-abs(dy),p['y']],[bend,q['y']],[q['x'],q['y']]]
 plans.append({'net':net,'width':.25,'paths':[path],'stage':'kelvin'});register2(net,path,.25)
 kelvin.append((net,LineString(path).buffer(.375).difference(q['g'].buffer(-.02))))
protected_count=len(m.copper)
base_masks=m.masks
def guarded_masks(net,width):
 a=base_masks(net,width)
 for kn,g in kelvin:
  if net==kn:
   raster(a[0],g.buffer(width/2));raster(a[1],g.buffer(width/2));raster(a[2],g.buffer(.4))
 return a
m.masks=guarded_masks;cs.masks=guarded_masks
plans=json.loads(Path('fresh-routes.json').read_text());load(plans)
for c in m.copper[:protected_count]:c['net']='__kelvin_'+c['net']
by['GND_OUT']=[p for p in by['GND_OUT'] if p['name']!='U6.4']
def span(n):
 ps=by[n];return max((math.hypot(p['x']-q['x'],p['y']-q['y']) for p in ps for q in ps),default=0)
for net in sorted((n for n in by if n not in ['GND','+3V3'] and len(by[n])>1),key=span):
 if any(p['net']==net and p.get('stage')=='signals-power' for p in plans):continue
 width=.5 if net in ['+VBAT','GND_OUT','/DRV_SHA','/DRV_SHB','/DRV_SHC'] else .25
 plan={'net':net,'width':width,'paths':[],'stage':'signals-power'};plans.append(plan);gaps=route_components(plan)
 if gaps:blocked.append([net,gaps,'components'])
 print(net,'paths',len(plan['paths']),'gaps',gaps,flush=True)
 Path('fresh-routes.json').write_text(json.dumps(plans,indent=2));Path('fresh-route-blocked.json').write_text(json.dumps(blocked,indent=2))
print('done',len(blocked),'blocked',flush=True)