diff --git a/python/pcb.py b/python/pcb.py
index 688a92f3a8ef89309692208fce0d9b185f9c27e2..f69d3e867e803ffcd64c498395489bc378aed926 100755
--- a/python/pcb.py
+++ b/python/pcb.py
@@ -4563,6 +4563,446 @@ class ADXL343(part):
 # ICs
 #
 
+class SAMD21E(part):
+   #
+   # TQFP
+   #
+   def __init__(self,value=''):
+      self.value = value
+      self.pad = [point(0,0,0)]
+      self.labels = []
+      d = 8.5/2/25.4
+      w = 0.4/2/25.4
+      h = 1.6/2/25.4
+      p = 0.8/25.4
+      l = 0.004
+      pad = cube(-h,h,-w,w,0,0)
+      padv = cube(-w,w,-h,h,0,0)
+      #
+      # pin 1
+      #
+      self.shape = translate(pad,-d,3.5*p,0)
+      self.shape = add(self.shape,cylinder(-d-h,3.5*p,0,0,w))
+      self.pad.append(point(-d,3.5*p,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'1A0',line=l))
+      #
+      # pin 2
+      #
+      self.shape = add(self.shape,translate(pad,-d,2.5*p,0))
+      self.pad.append(point(-d,2.5*p,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A01',line=l))
+      #
+      # pin 3
+      #
+      self.shape = add(self.shape,translate(pad,-d,1.5*p,0))
+      self.pad.append(point(-d,1.5*p,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A02',line=l))
+      #
+      # pin 4
+      #
+      self.shape = add(self.shape,translate(pad,-d,.5*p,0))
+      self.pad.append(point(-d,.5*p,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A03',line=l))
+      #
+      # pin 5
+      #
+      self.shape = add(self.shape,translate(pad,-d,-.5*p,0))
+      self.pad.append(point(-d,-.5*p,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A04',line=l))
+      #
+      # pin 6
+      #
+      self.shape = add(self.shape,translate(pad,-d,-1.5*p,0))
+      self.pad.append(point(-d,-1.5*p,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A05',line=l))
+      #
+      # pin 7
+      #
+      self.shape = add(self.shape,translate(pad,-d,-2.5*p,0))
+      self.pad.append(point(-d,-2.5*p,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A06',line=l))
+      #
+      # pin 8
+      #
+      self.shape = add(self.shape,translate(pad,-d,-3.5*p,0))
+      self.pad.append(point(-d,-3.5*p,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A07',line=l))
+      #
+      # pin 9
+      #
+      self.shape = add(self.shape,translate(padv,-3.5*p,-d,0))
+      self.pad.append(point(-3.5*p,-d,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'VAN',line=l,angle=-90))
+      #
+      # pin 10
+      #
+      self.shape = add(self.shape,translate(padv,-2.5*p,-d,0))
+      self.pad.append(point(-2.5*p,-d,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND',line=l,angle=-90))
+      #
+      # pin 11
+      #
+      self.shape = add(self.shape,translate(padv,-1.5*p,-d,0))
+      self.pad.append(point(-1.5*p,-d,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A08',line=l,angle=-90))
+      #
+      # pin 12
+      #
+      self.shape = add(self.shape,translate(padv,-.5*p,-d,0))
+      self.pad.append(point(-.5*p,-d,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A09',line=l,angle=-90))
+      #
+      # pin 13
+      #
+      self.shape = add(self.shape,translate(padv,.5*p,-d,0))
+      self.pad.append(point(.5*p,-d,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A10',line=l,angle=-90))
+      #
+      # pin 14
+      #
+      self.shape = add(self.shape,translate(padv,1.5*p,-d,0))
+      self.pad.append(point(1.5*p,-d,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A11',line=l,angle=-90))
+      #
+      # pin 15
+      #
+      self.shape = add(self.shape,translate(padv,2.5*p,-d,0))
+      self.pad.append(point(2.5*p,-d,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A14',line=l,angle=-90))
+      #
+      # pin 16
+      #
+      self.shape = add(self.shape,translate(padv,3.5*p,-d,0))
+      self.pad.append(point(3.5*p,-d,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A15',line=l,angle=-90))
+      #
+      # pin 17
+      #
+      self.shape = add(self.shape,translate(pad,d,-3.5*p,0))
+      self.pad.append(point(d,-3.5*p,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A16',line=l))
+      #
+      # pin 18
+      #
+      self.shape = add(self.shape,translate(pad,d,-2.5*p,0))
+      self.pad.append(point(d,-2.5*p,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A17',line=l))
+      #
+      # pin 19
+      #
+      self.shape = add(self.shape,translate(pad,d,-1.5*p,0))
+      self.pad.append(point(d,-1.5*p,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A18',line=l))
+      #
+      # pin 20
+      #
+      self.shape = add(self.shape,translate(pad,d,-.5*p,0))
+      self.pad.append(point(d,-.5*p,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A19',line=l))
+      #
+      # pin 21
+      #
+      self.shape = add(self.shape,translate(pad,d,.5*p,0))
+      self.pad.append(point(d,.5*p,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A22',line=l))
+      #
+      # pin 22
+      #
+      self.shape = add(self.shape,translate(pad,d,1.5*p,0))
+      self.pad.append(point(d,1.5*p,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A23',line=l))
+      #
+      # pin 23
+      #
+      self.shape = add(self.shape,translate(pad,d,2.5*p,0))
+      self.pad.append(point(d,2.5*p,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'24-',line=l))
+      #
+      # pin 24
+      #
+      self.shape = add(self.shape,translate(pad,d,3.5*p,0))
+      self.pad.append(point(d,3.5*p,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'25+',line=l))
+      #
+      # pin 25
+      #
+      self.shape = add(self.shape,translate(padv,3.5*p,d,0))
+      self.pad.append(point(3.5*p,d,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A27',line=l,angle=-90))
+      #
+      # pin 26
+      #
+      self.shape = add(self.shape,translate(padv,2.5*p,d,0))
+      self.pad.append(point(2.5*p,d,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'RST',line=l,angle=-90))
+      #
+      # pin 27
+      #
+      self.shape = add(self.shape,translate(padv,1.5*p,d,0))
+      self.pad.append(point(1.5*p,d,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A28',line=l,angle=-90))
+      #
+      # pin 28
+      #
+      self.shape = add(self.shape,translate(padv,.5*p,d,0))
+      self.pad.append(point(.5*p,d,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND',line=l,angle=-90))
+      #
+      # pin 29
+      #
+      self.shape = add(self.shape,translate(padv,-.5*p,d,0))
+      self.pad.append(point(-.5*p,d,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'VCR',line=l,angle=-90))
+      #
+      # pin 30
+      #
+      self.shape = add(self.shape,translate(padv,-1.5*p,d,0))
+      self.pad.append(point(-1.5*p,d,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'VIN',line=l,angle=-90))
+      #
+      # pin 31
+      #
+      self.shape = add(self.shape,translate(padv,-2.5*p,d,0))
+      self.pad.append(point(-2.5*p,d,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'CLK',line=l,angle=-90))
+      #
+      # pin 32
+      #
+      self.shape = add(self.shape,translate(padv,-3.5*p,d,0))
+      self.pad.append(point(-3.5*p,d,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'DIO',line=l,angle=-90))
+
+class SAMD11D(part):
+   #
+   # SOIC
+   #
+   def __init__(self,value=''):
+      self.value = value
+      self.pad = [point(0,0,0)]
+      self.labels = []
+      d = 9.82/2/25.4
+      w = .63/2/25.4
+      h = 1.9/2/25.4
+      pad = cube(-h,h,-w,w,0,0)
+      #
+      # pin 1
+      #
+      self.shape = translate(pad,-d,.225,0)
+      self.shape = add(self.shape,cylinder(-d-h,.225,0,0,w))
+      self.pad.append(point(-d,.225,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'1A05'))
+      #
+      # pin 2
+      #
+      self.shape = add(self.shape,translate(pad,-d,.175,0))
+      self.pad.append(point(-d,.175,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A06'))
+      #
+      # pin 3
+      #
+      self.shape = add(self.shape,translate(pad,-d,.125,0))
+      self.pad.append(point(-d,.125,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A07'))
+      #
+      # pin 4
+      #
+      self.shape = add(self.shape,translate(pad,-d,.075,0))
+      self.pad.append(point(-d,.075,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A08'))
+      #
+      # pin 5
+      #
+      self.shape = add(self.shape,translate(pad,-d,.025,0))
+      self.pad.append(point(-d,.025,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A09'))
+      #
+      # pin 6
+      #
+      self.shape = add(self.shape,translate(pad,-d,-.025,0))
+      self.pad.append(point(-d,-.025,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A14'))
+      #
+      # pin 7
+      #
+      self.shape = add(self.shape,translate(pad,-d,-.075,0))
+      self.pad.append(point(-d,-.075,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A15'))
+      #
+      # pin 8
+      #
+      self.shape = add(self.shape,translate(pad,-d,-.125,0))
+      self.pad.append(point(-d,-.125,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A16'))
+      #
+      # pin 9
+      #
+      self.shape = add(self.shape,translate(pad,-d,-.175,0))
+      self.pad.append(point(-d,-.175,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A22'))
+      #
+      # pin 10
+      #
+      self.shape = add(self.shape,translate(pad,-d,-.225,0))
+      self.pad.append(point(-d,-.225,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A23'))
+      #
+      # pin 11
+      #
+      self.shape = add(self.shape,translate(pad,d,-.225,0))
+      self.pad.append(point(d,-.225,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'RST'))
+      #
+      # pin 12
+      #
+      self.shape = add(self.shape,translate(pad,d,-.175,0))
+      self.pad.append(point(d,-.175,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'CLK'))
+      #
+      # pin 13
+      #
+      self.shape = add(self.shape,translate(pad,d,-.125,0))
+      self.pad.append(point(d,-.125,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'DIO'))
+      #
+      # pin 14
+      #
+      self.shape = add(self.shape,translate(pad,d,-.075,0))
+      self.pad.append(point(d,-.075,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'24-'))
+      #
+      # pin 15
+      #
+      self.shape = add(self.shape,translate(pad,d,-.025,0))
+      self.pad.append(point(d,-.025,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'25+'))
+      #
+      # pin 16
+      #
+      self.shape = add(self.shape,translate(pad,d,.025,0))
+      self.pad.append(point(d,.025,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))
+      #
+      # pin 17
+      #
+      self.shape = add(self.shape,translate(pad,d,.075,0))
+      self.pad.append(point(d,.075,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'VCC'))
+      #
+      # pin 18
+      #
+      self.shape = add(self.shape,translate(pad,d,.125,0))
+      self.pad.append(point(d,.125,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A02'))
+      #
+      # pin 19
+      #
+      self.shape = add(self.shape,translate(pad,d,.175,0))
+      self.pad.append(point(d,.175,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A03'))
+      #
+      # pin 20
+      #
+      self.shape = add(self.shape,translate(pad,d,.225,0))
+      self.pad.append(point(d,.225,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A04'))
+
+class ATtiny1614(part):
+   #
+   # SOIC
+   #
+   def __init__(self,value=''):
+      self.value = value
+      self.pad = [point(0,0,0)]
+      self.labels = []
+      d = 0.11
+      w = 0.015
+      h = .03
+      pad = cube(-h,h,-w,w,0,0)
+      #
+      # pin 1
+      #
+      self.shape = translate(pad,-d,.15,0)
+      self.shape = add(self.shape,cylinder(-d-h,.15,0,0,w))
+      self.pad.append(point(-d,.15,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'1VCC'))
+      #
+      # pin 2
+      #
+      self.shape = add(self.shape,translate(pad,-d,.1,0))
+      self.pad.append(point(-d,.1,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'PA4'))
+      #
+      # pin 3
+      #
+      self.shape = add(self.shape,translate(pad,-d,.050,0))
+      self.pad.append(point(-d,.05,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'PA5'))
+      #
+      # pin 4
+      #
+      self.shape = add(self.shape,translate(pad,-d,0,0))
+      self.pad.append(point(-d,0,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'PA6'))
+      #
+      # pin 5
+      #
+      self.shape = add(self.shape,translate(pad,-d,-.05,0))
+      self.pad.append(point(-d,-.05,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'PA7'))
+      #
+      # pin 6
+      #
+      self.shape = add(self.shape,translate(pad,-d,-.1,0))
+      self.pad.append(point(-d,-.1,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'RB3'))
+      #
+      # pin 7
+      #
+      self.shape = add(self.shape,translate(pad,-d,-.15,0))
+      self.pad.append(point(-d,-.15,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'TB2'))
+      #
+      # pin 8
+      #
+      self.shape = add(self.shape,translate(pad,d,-.15,0))
+      self.pad.append(point(d,-.15,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'PB1'))
+      #
+      # pin 9
+      #
+      self.shape = add(self.shape,translate(pad,d,-.1,0))
+      self.pad.append(point(d,-.1,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'PB0'))
+      #
+      # pin 10
+      #
+      self.shape = add(self.shape,translate(pad,d,-.05,0))
+      self.pad.append(point(d,-.05,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'UPDI'))
+      #
+      # pin 11
+      #
+      self.shape = add(self.shape,translate(pad,d,0,0))
+      self.pad.append(point(d,0,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'PA1'))
+      #
+      # pin 12
+      #
+      self.shape = add(self.shape,translate(pad,d,.050,0))
+      self.pad.append(point(d,.05,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'PA2'))
+      #
+      # pin 13
+      #
+      self.shape = add(self.shape,translate(pad,d,.1,0))
+      self.pad.append(point(d,.1,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'PA3'))
+      #
+      # pin 14
+      self.shape = add(self.shape,translate(pad,d,.15,0))
+      self.pad.append(point(d,.15,0))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))
+
 class FT230XS(part):
    def __init__(self,value=''):
       self.value = value
@@ -4580,7 +5020,7 @@ class FT230XS(part):
       self.shape = translate(pad,-d,3.5*p,0)
       self.shape = add(self.shape,cylinder(-d-h,3.5*p,0,0,w))
       self.pad.append(point(-d,3.5*p,0))
-      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'TXD',line=l))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'1TXD',line=l))
       #
       # pin 2
       #
@@ -4672,6 +5112,9 @@ class FT230XS(part):
 
 
 class ATtiny412(part):
+   #
+   # SOIC150
+   #
    def __init__(self,value=''):
       self.value = value
       self.pad = [point(0,0,0)]
@@ -4730,7 +5173,10 @@ class ATtiny412(part):
       self.pad.append(point(d,.075,0))
       self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'GND'))
 
-class SAMD11C_SOIC(part):
+class SAMD11C(part):
+   #
+   # SOIC
+   #
    def __init__(self,value=''):
       self.value = value
       self.pad = [point(0,0,0)]
@@ -4745,7 +5191,7 @@ class SAMD11C_SOIC(part):
       self.shape = translate(pad,-d,.15,0)
       self.shape = add(self.shape,cylinder(-d-h,.15,0,0,w))
       self.pad.append(point(-d,.15,0))
-      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A05'))
+      self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'1A05'))
       #
       # pin 2: PA08
       #
@@ -4820,6 +5266,7 @@ class SAMD11C_SOIC(part):
       self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A02'))
       #
       # pin 14: PA04
+      #
       self.shape = add(self.shape,translate(pad,d,.15,0))
       self.pad.append(point(d,.15,0))
       self.labels.append(self.text(self.pad[-1].x,self.pad[-1].y,self.pad[-1].z,'A04'))