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