aeae929beff16f88960367e7bdffcd5c2ed80c1b
[hw/micropeak] / packages / MO-220.py
1 #!/usr/bin/python
2 # Copyright 2011 by Bdale Garbee <bdale@gag.com>.  GPLv2
3 #
4 # Program to emit PCB footprint for MO-220 package used by the ATTiny85
5 #
6
7 # dimensions in mm from the ATTiny datasheed
8
9 PinWidth = 0.23   # b   
10 PinHeight = 0.55  # L
11 PinSpacing = 0.50 # e
12 Overall = 4.25    # E
13 GndSquare = 2.60  # D2 & E2
14 CoreSquare = 2.60
15
16 # ATMEL specifies 120-150 microns between pad and solder mask
17 # AT88RF1354 Appplication note
18 #
19 PinResist = PinWidth + (2 * 0.07)
20
21 import sys
22
23 # we're going to use the 1/100 of a mil fundamental unit form
24
25 def mm2mils100( mm ):
26         return int( mm / 25.4 * 1000.0 * 100.0 + 0.5 )
27
28 print '# author: Keith Packard'
29 print '# email: keithp@keithp.com'
30 print '# dist-license: GPL 2'
31 print '# use-license: unlimited'
32
33 print 'Element[0x0 "MO-220" "" "" 0 0 0 0 0 100 0x0]'
34 print "("
35
36 # pad under the chip, must be grounded
37 print '   Pad[',\
38         mm2mils100(0), \
39         mm2mils100(0), \
40         mm2mils100(0), \
41         mm2mils100(0), \
42         mm2mils100(GndSquare), \
43         0, \
44         0, \
45         '"pin21" "21" "square,nopaste"]'
46
47 # vias in the ground pad under the chip
48 #for viarow in range (-1,2):
49 #  for viacol in range (-1,2):
50 #    print '   Pin[',\
51 #       mm2mils100(2 * viacol * CoreSquare / 5), \
52 #       mm2mils100(2 * viarow * CoreSquare / 5), \
53 #       2900, \
54 #       2500, \
55 #       0, \
56 #       1500, \
57 #       '"pin21" "21" 0x0002]'
58
59 # break pad under chip into a grid to control the resist and paste masks
60
61 blocks=3
62
63 for viarow in range (-1, 2):
64   for viacol in range (-1, 2):
65     if (viarow in (-1, 1)) and (viacol in (-1, 1)):
66       # copper sub-square with resist over vias
67       print '   Pad[',\
68         mm2mils100(viacol * CoreSquare / blocks), \
69         mm2mils100(viarow * CoreSquare / blocks), \
70         mm2mils100(viacol * CoreSquare / blocks), \
71         mm2mils100(viarow * CoreSquare / blocks), \
72         mm2mils100((CoreSquare)/blocks), \
73         0, \
74         0, \
75         '"pin21" "21" "square,nopaste"]'
76     else:
77       # copper sub-square without resist
78       print '   Pad[',\
79         mm2mils100(viacol * CoreSquare / blocks), \
80         mm2mils100(viarow * CoreSquare / blocks), \
81         mm2mils100(viacol * CoreSquare / blocks), \
82         mm2mils100(viarow * CoreSquare / blocks), \
83         mm2mils100((CoreSquare)/blocks), \
84         0, \
85         mm2mils100((CoreSquare)/blocks), \
86         '"pin21" "21" "square,nopaste"]'
87       # copper spot to control paste mask generation
88       print '   Pad[',\
89         mm2mils100(viacol * CoreSquare / blocks), \
90         mm2mils100(viarow * CoreSquare / blocks), \
91         mm2mils100(viacol * CoreSquare / blocks), \
92         mm2mils100(viarow * CoreSquare / blocks), \
93         1500, \
94         0, \
95         mm2mils100((CoreSquare)/blocks), \
96         '"pin21" "21" "square"]'
97
98 # pins
99 for pin in range (1,6):
100     print '   Pad[',\
101         mm2mils100((-3 + pin) * PinSpacing), \
102         mm2mils100(-Overall/2 + PinWidth/2), \
103         mm2mils100((-3 + pin) * PinSpacing), \
104         mm2mils100(-Overall/2 + PinHeight - PinWidth/2), \
105         mm2mils100(PinWidth), \
106         mm2mils100(PinSpacing - PinWidth), \
107         mm2mils100(PinResist), \
108         '"pin%i"' % (16-pin), '"%i"' % (16-pin), '0x0000]'
109
110     print '   Pad[',\
111         mm2mils100((-3 + pin) * PinSpacing), \
112         mm2mils100(+Overall/2 - PinHeight + PinWidth/2), \
113         mm2mils100((-3 + pin) * PinSpacing), \
114         mm2mils100(+Overall/2 - PinWidth/2), \
115         mm2mils100(PinWidth), \
116         mm2mils100(PinSpacing - PinWidth), \
117         mm2mils100(PinResist), \
118         '"pin%i"' % pin, '"%i"' % pin, '0x0000]'
119       
120     print '   Pad[',\
121         mm2mils100(Overall/2 - PinHeight + PinWidth/2), \
122         mm2mils100((-3 + pin) * PinSpacing), \
123         mm2mils100(Overall/2 - PinWidth/2), \
124         mm2mils100((-3 + pin) * PinSpacing), \
125         mm2mils100(PinWidth), \
126         mm2mils100(PinSpacing - PinWidth), \
127         mm2mils100(PinResist), \
128         '"pin%i"' % (11-pin), '"%i"' % (11-pin), '0x0000]'
129
130     print '   Pad[',\
131         mm2mils100(-Overall/2 + PinWidth/2), \
132         mm2mils100((-3 + pin) * PinSpacing), \
133         mm2mils100(-Overall/2 + PinHeight - PinWidth/2), \
134         mm2mils100((-3 + pin) * PinSpacing), \
135         mm2mils100(PinWidth), \
136         mm2mils100(PinSpacing - PinWidth), \
137         mm2mils100(PinResist), \
138         '"pin%i"' % (15+pin), '"%i"' % (15+pin), '0x0000]'
139
140 print '   ElementArc[',\
141         mm2mils100(-2.0), \
142         mm2mils100(2.0), \
143         '500 500 0 360 1000 ]'
144 print ")"