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