diff --git a/README.md b/README.md index d77d62652aa1c48c3459aba4a63702d1b30f51a7..414f8e25316d6061c4d300bfd72ff3bc875bb2cc 100644 --- a/README.md +++ b/README.md @@ -447,6 +447,7 @@ ### 07/29/2019 - Was working on 'dsn_python' Python Library. +- Latest package can be found at [personal github](https://github.com/monkalynn813/dsn_python) - Class tree: ~~~ diff --git a/dsn_python/__pycache__/dsn_module.cpython-36.pyc b/dsn_python/__pycache__/dsn_module.cpython-36.pyc index 67dd4c746bbcda5080e33f75d4063229c4e527e9..14d6de5fd5368591fa4de84d9c95cff16343eefe 100644 Binary files a/dsn_python/__pycache__/dsn_module.cpython-36.pyc and b/dsn_python/__pycache__/dsn_module.cpython-36.pyc differ diff --git a/dsn_python/__pycache__/dsnwritier.cpython-36.pyc b/dsn_python/__pycache__/dsnwritier.cpython-36.pyc index 692145d1fb7d6ff1e429023c7a121d0773adbee3..1feefcb9130856e37c619d19224dc7a7e0542c83 100644 Binary files a/dsn_python/__pycache__/dsnwritier.cpython-36.pyc and b/dsn_python/__pycache__/dsnwritier.cpython-36.pyc differ diff --git a/dsn_python/dsn_geo.py b/dsn_python/dsn_geo.py index 2fd2ea3e2eae3804469d4d2bef6ace671087d962..9430ff0fb1510b5b90ef48af87b8dd4fc0c19b93 100644 --- a/dsn_python/dsn_geo.py +++ b/dsn_python/dsn_geo.py @@ -69,11 +69,7 @@ class Boundary(AST): } } - index_ctr=0 - def __init__(self,path,brd_index=None): - brd_index=Boundary.index_ctr - Boundary.index_ctr+=1 - + def __init__(self,path,brd_index=0): super(Boundary,self).__init__(path=path,brd_index=brd_index) diff --git a/dsn_python/dsn_module.py b/dsn_python/dsn_module.py index 0b993d50c88d9e491607f6aa02d6360541aebc37..d5cf1040893263a5056b6b482bc7035e757e7060 100644 --- a/dsn_python/dsn_module.py +++ b/dsn_python/dsn_module.py @@ -1,7 +1,9 @@ from pykicad.sexpr import * -class Component(AST): +unit_convert=1000 + +class Placement(AST): tag='component' schema={ '0':{ @@ -32,10 +34,10 @@ class Component(AST): } } } - def __init__(self,ref1,at,ref2=None,flip='front',orientation=0,name=None): + def __init__(self,ref1,at=[0,0],ref2=None,flip='front',orientation=0,name=None): at[1]=-at[1] #flip y for dsn ref2=ref1 - super(Component,self).__init__(ref1=ref1,ref2=ref2,at=at,flip=flip,orientation=orientation,name=name) + super(Placement,self).__init__(ref1=ref1,ref2=ref2,at=at,flip=flip,orientation=orientation,name=name) class Outline(AST): tag='outline' @@ -47,11 +49,11 @@ class Outline(AST): '_attr':'width' }, '1':{ - '_parser':number, + '_parser':integer, '_attr':'outline_start' }, '2':{ - '_parser':number, + '_parser':integer, '_attr':'outline_end' } } @@ -122,7 +124,41 @@ class Padstack(AST): def __init__(self,pin_type='Round[A]Pad_1524_um',shape=None,attach='off'): shape=self.init_list(shape,[]) super(Padstack,self).__init__(pin_type=pin_type,shape=shape,attach=attach) + + @classmethod + def auto_detect(cls,path,attach='off'): + """ + load a module footprint file and auto detect pad info + output: padstack class + """ + from pykicad.module import Module as mod + import numpy as np + module=mod.from_file(path) + + pad_types=[] + for i in range(len(module.pads)): + pad=module.pads[i] + combo=[pad.shape,pad.layers,int(pad.size[0]*unit_convert)] + if not combo in pad_types: + pad_types.append(combo) + padstack=[] + for i in range(len(pad_types)): + shape_class=[] + for layer in pad_types[i][1]: + if '*' in layer: + layer_ext=layer.split('.')[-1] + shape_class.append(Shape(pad_types[i][0],'F.'+layer_ext,pad_types[i][2])) + shape_class.append(Shape(pad_types[i][0],'B.'+layer_ext,pad_types[i][2])) + else: + shape_class.append(shape_class=Shape(pad_types[i][0],layer,pad_types[i][2])) + + pin_type='Round[A]Pad_'+str(int(pad_types[i][2]))+'_um' + padstack_class=cls(pin_type,shape_class,attach) + padstack.append(padstack_class) + return padstack + + class Footprint(AST): tag='image' schema={ @@ -146,6 +182,46 @@ class Footprint(AST): pin=self.init_list(pin,[]) super(Footprint,self).__init__(ref=ref,outline=outline,pin=pin) + + @classmethod + def from_file(cls,path,ref='REF**'): + """ + load module footprint from a '.kicad_mod' file + path: afile + ref: ref name of module eg. U1 + output: footprint class + """ + from pykicad.module import Module as mod + import numpy as np + module=mod.from_file(path) + + outlines=[] + for i in range(len(module.lines)): + outline=module.lines[i] + width=outline.width*unit_convert + outline_start=np.array(outline.start)*unit_convert + outline_start[1]*=-1 + outline_start=list(outline_start) + outline_end=np.array(outline.end)*unit_convert + outline_end[1]*=-1 + outline_end=list(outline_end) + outline_class=Outline(width,outline_start,outline_end) + outlines.append(outline_class) + + pads=[] + for i in range(len(module.pads)): + pad=module.pads[i] + pin_index=int(pad.name) + pin_at=np.array(pad.at)*unit_convert + pin_at[1]*=-1 + pin_at=list(pin_at) + pin_size=pad.size[0]*unit_convert + pin_type='Round[A]Pad_'+str(int(pin_size))+'_um' + pin_class=Pin(pin_index,pin_at,pin_type) + pads.append(pin_class) + return cls(ref=ref,outline=outlines,pin=pads) + + + -# def load_module(file) \ No newline at end of file diff --git a/dsn_python/dsnwritier.py b/dsn_python/dsnwritier.py index f31eea043a9fad1178b5b59d5e60f4f3e2b36648..5823467df1a005dc384e65af9d6175e62717360e 100644 --- a/dsn_python/dsnwritier.py +++ b/dsn_python/dsnwritier.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 from pykicad.sexpr import * from dsn_rule import * -from dsn_module import Component,Footprint, Padstack +from dsn_module import Placement,Footprint, Padstack import dsn_module as module from dsn_net import * from dsn_geo import * @@ -102,7 +102,7 @@ class Dsn(AST): '3':{ 'via':{ '_parser': text, - '_attr': 'via_txt' + '_attr': 'via_type' }, }, '4':{ @@ -116,8 +116,8 @@ class Dsn(AST): '4':{ 'placement':{ '0':{ - 'component':{ - '_parser':Component, + 'placement':{ + '_parser':Placement, '_multiple':True }, }, @@ -170,9 +170,9 @@ class Dsn(AST): layers=None, boundary=None, keepout=None, - via_txt='"Via[0-1]_800:400_um"', + via_type=None, rule=None, - component=None, + placement=None, image=None, padstack=None, net=None, @@ -184,7 +184,7 @@ class Dsn(AST): parser=self.init_list(parser,[]) boundary=self.init_list(boundary,[]) keepout=self.init_list(keepout,[]) - component=self.init_list(component,[]) + placement=self.init_list(placement,[]) image=self.init_list(image,[]) padstack=self.init_list(padstack,[]) net=self.init_list(net,[]) @@ -197,9 +197,9 @@ class Dsn(AST): layers=layers, boundary=boundary, keepout=keepout, - via_txt=via_txt, + via_type=via_type, rule=rule, - component=component, + placement=placement, image=image, padstack=padstack, net=net, diff --git a/dsn_python/test_dsn_python.py b/dsn_python/test_dsn_python.py index 85154a48512a3a5ff962ce9fa33b6a534a65b057..001e648d9fdc0bd429a3c39610d695e4b68fd618 100644 --- a/dsn_python/test_dsn_python.py +++ b/dsn_python/test_dsn_python.py @@ -5,13 +5,23 @@ from pykicad import pcb test=dsnwritier.Dsn() ############################################################################### -###manually +##General layers=[ dsnwritier.Layer('F.Cu'), dsnwritier.Layer('B.Cu') ] +parsers= dsnwritier.Parser() + +rule=dsnwritier.Rule() +clearance=[ + dsnwritier.Clearance(200.1), + dsnwritier.Clearance(200.1,'default_smd'), + dsnwritier.Clearance(50,'smd_smd')] +rule.clearance=clearance +############################################################################### +###manually bdata=[137735, -31864.8, 165736, -31864.8, 165736, -113335, 137735, -113335, 137735, -113864, 160735, -113864, 160735, -151336, 150736, -151336, 150736, -151865, 160735, -151865, 160735, -211335, 150736, -211335, @@ -32,45 +42,12 @@ kdata2=[98235.3, -224531, 98764.5, -224531, 98764.5, -219905, 103236, -224376 103765, -224157, 103765, -224002, 103610, -224002, 98235.3, -218628, 98235.3, -224531] -####################################################################################### -###load from library -# drawingclass=dsnwritier.load_drawing('/home/jingyan/Documents/summer_intern_lemur/roco_electrical/kicad_test.dxf') -# bdata=drawingclass.load_polygon()[0] - -drawingclass=dsnwritier.load_drawing('/home/jingyan/Documents/summer_intern_lemur/roco_electrical/dsn_line_test.dxf') -ddata=drawingclass.load_polygon() -bdata=ddata[0] #first element is boundary - -keepout=[] #load all the rest as outline - -for i in range(1,len(ddata)): - kdata=dsnwritier.Keepout(ddata[i]) - keepout.append(kdata) -####################################################################################### -parsers= dsnwritier.Parser() - +############# boundary=dsnwritier.Boundary(bdata) -############# keepout=[ dsnwritier.Keepout(kdata1), dsnwritier.Keepout(kdata2)] -############# -keepout=[] #load all the rest as outline - -for i in range(1,len(ddata)): - kdata=dsnwritier.Keepout(ddata[i]) - keepout.append(kdata) - -rule=dsnwritier.Rule() -clearance=[ - dsnwritier.Clearance(200.1), - dsnwritier.Clearance(200.1,'default_smd'), - dsnwritier.Clearance(50,'smd_smd')] -rule.clearance=clearance -########## -component=[dsnwritier.Component('U1',[103000,48000],name='"DEV"'), - dsnwritier.Component('J1',[103000,48000],name='"DEV"')] ############### image1_outline=[ @@ -92,6 +69,36 @@ padstack1=dsnwritier.Padstack(shape=pin_shape1,attach='off') pin_shape2=[dsnwritier.module.Shape(layer='F.Cu',size=800), dsnwritier.module.Shape(layer='B.Cu',size=800)] padstack2=dsnwritier.Padstack(pin_type='"Via[0-1]_800:400_um"',shape=pin_shape2,attach='off') +####################################################################################### +###load from library + +drawingclass=dsnwritier.load_drawing('/home/jingyan/Documents/summer_intern_lemur/roco_electrical/dsn_line_test.dxf') +ddata=drawingclass.load_polygon() +bdata=ddata[0] #first element is boundary + +############# +boundary=dsnwritier.Boundary(bdata) + +############# +keepout=[] #load all the rest as outline + +for i in range(1,len(ddata)): + kdata=dsnwritier.Keepout(ddata[i]) + keepout.append(kdata) + +########## +libpath='/home/jingyan/Documents/summer_intern_lemur/roco_electrical/libraries/kicad-ESP8266/ESP8266.pretty/' + +image=[dsnwritier.Footprint.from_file(libpath+'mpu-9250.kicad_mod',ref='J1'), + dsnwritier.Footprint.from_file(libpath+'ESP12F-Devkit-V3.kicad_mod',ref='U1')] + +padstack=dsnwritier.Padstack.auto_detect(libpath+'mpu-9250.kicad_mod') + +##########placement +placement=[dsnwritier.Placement('U1',[103000,48000],orientation=90,name='"DEV"'), + dsnwritier.Placement('J1',[103000,48000],orientation=270,name='"DEV"')] + + ############## net1=dsnwritier.Net('3v3',conn_pins=['U1-3','J1-1']) net2=dsnwritier.Net('VIN',conn_pins='U1-1') @@ -103,9 +110,9 @@ test.layers=layers test.boundary=boundary test.keepout=keepout test.rule=rule -test.component=component +test.placement=placement test.image=image -test.padstack=[padstack1,padstack2] +test.padstack=padstack test.net=[net1,net2] test.netclass=netclass1 diff --git a/dsn_python/testdsn.dsn b/dsn_python/testdsn.dsn index 080354484a6b28f00d206b8b263533d01a894246..82ed21d3b2d2f8b34663377b64d6a3032423dfed 100644 --- a/dsn_python/testdsn.dsn +++ b/dsn_python/testdsn.dsn @@ -17,7 +17,7 @@ (property (index 1))) (boundary - (path pcb 0 -26696.2760000000 -280310.9110000000 216684.7830000000 -280310.9110000000 216684.7830000000 19577.2840000000 -26696.2760000000 19577.2840000000)) + (path pcb 1 -26696.2760000000 -280310.9110000000 216684.7830000000 -280310.9110000000 216684.7830000000 19577.2840000000 -26696.2760000000 19577.2840000000)) (keepout "" ( polygon signal 0 106000.2480000000 -113732.1160000000 106000.2480000000 -113467.5320000000 118999.9710000000 -113467.5320000000 118999.9710000000 -113732.1160000000)) (keepout "" @@ -282,7 +282,6 @@ ( polygon signal 0 96999.7640000000 -113732.1160000000 96999.7640000000 -113467.5320000000 118999.9710000000 -113467.5320000000 118999.9710000000 -113732.1160000000)) (keepout "" ( polygon signal 0 77999.8890000000 -113732.1160000000 77999.8890000000 -113467.5320000000 96999.7640000000 -113467.5320000000 96999.7640000000 -113732.1160000000)) - (via "Via[0-1]_800:400_um") (rule (width 250) (clearance 200.1000000000) @@ -292,34 +291,95 @@ (type smd_smd)))) (placement (component U1 - (place U1 103000 -48000 front 0 + (place U1 103000 -48000 front 90 (PN "DEV"))) (component J1 - (place J1 103000 -48000 front 0 + (place J1 103000 -48000 front 270 (PN "DEV")))) (library +(image J1 +(outline + (path signal 120.0000000000 -7620.0000000000 11430.0000000000 7540.0000000000 11430.0000000000)) +(outline + (path signal 120.0000000000 7620.0000000000 11430.0000000000 7620.0000000000 -13570.0000000000)) +(outline + (path signal 120.0000000000 7620.0000000000 -13570.0000000000 -7620.0000000000 -13570.0000000000)) +(outline + (path signal 120.0000000000 -7620.0000000000 -13570.0000000000 -7620.0000000000 11430.0000000000)) +(pin Round[A]Pad_1524_um 1 -6350.0000000000 10160.0000000000) +(pin Round[A]Pad_1524_um 2 -6350.0000000000 7620.0000000000) +(pin Round[A]Pad_1524_um 3 -6350.0000000000 5080.0000000000) +(pin Round[A]Pad_1524_um 4 -6350.0000000000 2540.0000000000) +(pin Round[A]Pad_1524_um 5 -6350.0000000000 -0.0000000000) +(pin Round[A]Pad_1524_um 6 -6350.0000000000 -2540.0000000000) +(pin Round[A]Pad_1524_um 7 -6350.0000000000 -5080.0000000000) +(pin Round[A]Pad_1524_um 8 -6350.0000000000 -7620.0000000000) +(pin Round[A]Pad_1524_um 9 -6350.0000000000 -10160.0000000000) +(pin Round[A]Pad_1524_um 10 -6350.0000000000 -12700.0000000000)) (image U1 (outline - (path signal 120 -7620 11430 7540 11430)) + (path signal 150.0000000000 11430.0000000000 -22860.0000000000 3810.0000000000 -22860.0000000000)) +(outline + (path signal 150.0000000000 5500.0000000000 18270.0000000000 -5500.0000000000 18270.0000000000)) +(outline + (path signal 150.0000000000 5500.0000000000 25400.0000000000 5500.0000000000 18270.0000000000)) +(outline + (path signal 150.0000000000 -5500.0000000000 18270.0000000000 -5500.0000000000 25400.0000000000)) +(outline + (path signal 150.0000000000 -3800.0000000000 -23860.0000000000 -3800.0000000000 -18130.0000000000)) +(outline + (path signal 150.0000000000 -3800.0000000000 -18130.0000000000 3800.0000000000 -18130.0000000000)) +(outline + (path signal 150.0000000000 3800.0000000000 -18130.0000000000 3800.0000000000 -23860.0000000000)) +(outline + (path signal 150.0000000000 3800.0000000000 -23860.0000000000 -3800.0000000000 -23860.0000000000)) +(outline + (path signal 150.0000000000 12700.0000000000 24130.0000000000 12700.0000000000 -21590.0000000000)) (outline - (path signal 120 -7620 11430 7540 -13570)) + (path signal 150.0000000000 -13335.0000000000 24130.0000000000 -13335.0000000000 -21590.0000000000)) (outline - (path signal 120 -7620 -13570 -7620 -13570)) + (path signal 150.0000000000 -3810.0000000000 -22860.0000000000 -12065.0000000000 -22860.0000000000)) (outline - (path signal 120 -7620 -13570 -7620 11430)) -(pin Round[A]Pad_1524_um 1 -6350 10160) -(pin Round[A]Pad_1524_um 2 -6350 7620)) + (path signal 150.0000000000 11430.0000000000 25400.0000000000 -12700.0000000000 25400.0000000000)) +(pin Round[A]Pad_1524_um 1 -12065.0000000000 19050.0000000000) +(pin Round[A]Pad_1524_um 2 -12065.0000000000 16510.0000000000) +(pin Round[A]Pad_1524_um 3 -12065.0000000000 13970.0000000000) +(pin Round[A]Pad_1524_um 4 -12065.0000000000 11430.0000000000) +(pin Round[A]Pad_1524_um 5 -12065.0000000000 8890.0000000000) +(pin Round[A]Pad_1524_um 6 -12065.0000000000 6350.0000000000) +(pin Round[A]Pad_1524_um 7 -12065.0000000000 3810.0000000000) +(pin Round[A]Pad_1524_um 8 -12065.0000000000 1270.0000000000) +(pin Round[A]Pad_1524_um 9 -12065.0000000000 -1270.0000000000) +(pin Round[A]Pad_1524_um 10 -12065.0000000000 -3810.0000000000) +(pin Round[A]Pad_1524_um 11 -12065.0000000000 -6350.0000000000) +(pin Round[A]Pad_1524_um 12 -12065.0000000000 -8890.0000000000) +(pin Round[A]Pad_1524_um 13 -12065.0000000000 -11430.0000000000) +(pin Round[A]Pad_1524_um 14 -12065.0000000000 -13970.0000000000) +(pin Round[A]Pad_1524_um 15 -12065.0000000000 -16510.0000000000) +(pin Round[A]Pad_1524_um 16 11430.0000000000 -16510.0000000000) +(pin Round[A]Pad_1524_um 17 11430.0000000000 -13970.0000000000) +(pin Round[A]Pad_1524_um 18 11430.0000000000 -11430.0000000000) +(pin Round[A]Pad_1524_um 19 11430.0000000000 -8890.0000000000) +(pin Round[A]Pad_1524_um 20 11430.0000000000 -6350.0000000000) +(pin Round[A]Pad_1524_um 21 11430.0000000000 -3810.0000000000) +(pin Round[A]Pad_1524_um 22 11430.0000000000 -1270.0000000000) +(pin Round[A]Pad_1524_um 23 11430.0000000000 1270.0000000000) +(pin Round[A]Pad_1524_um 24 11430.0000000000 3810.0000000000) +(pin Round[A]Pad_1524_um 25 11430.0000000000 6350.0000000000) +(pin Round[A]Pad_1524_um 26 11430.0000000000 8890.0000000000) +(pin Round[A]Pad_1524_um 27 11430.0000000000 11430.0000000000) +(pin Round[A]Pad_1524_um 28 11430.0000000000 13970.0000000000) +(pin Round[A]Pad_1524_um 29 11430.0000000000 16510.0000000000) +(pin Round[A]Pad_1524_um 30 11430.0000000000 19050.0000000000)) (padstack Round[A]Pad_1524_um (shape ( circle F.Cu 1524)) (shape ( circle B.Cu 1524)) - (attach off)) -(padstack "Via[0-1]_800:400_um" (shape - ( circle F.Cu 800)) + ( circle F.Mask 1524)) (shape - ( circle B.Cu 800)) + ( circle B.Mask 1524)) (attach off))) (network (net 3v3