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