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