skill
EDA Skillpack
Public Made by Adomby adom
All skills for all EDA capabilities across the Adom ecosystem.
main
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)