convert Python footprint generators to Python 3
[hw/altusmetrum] / packages / qfn-44.py
1 #!/usr/bin/python3
2 # Copyright 2024 by Bdale Garbee <bdale@gag.com>.  GPLv3
3 #
4 # emit PCB footprint for QFN-44 package used by ATmega32U4
5 # - leaving out the under-chip pad as it's not necessary
6 #
7
8 # dimensions in mm from 
9 #       atmel/samd21/ATmega32U4.pdf
10
11 PinWidth = 0.3    # X1
12 PinHeight = 0.85  # Y1
13 RowSpacing = 6.9  # C1 / C2
14 PinSpacing = 0.5  # E
15 Overall = 7.0
16 GndSquare = 5.20  # X2 / Y2
17 CoreSquare = 2.1
18 PinClearance = 2 * (PinSpacing - PinWidth)
19
20 # ATMEL specifies 120-150 microns between pad and solder mask
21 # AT88RF1354 Appplication note  .. should be good here too?
22 #
23 PinResist = PinWidth + (2 * 0.07)
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: Bdale Garbee')
31 print('# email: bdale@gag.com')
32 print('# dist-license: GPL 3')
33 print('# use-license: unlimited')
34
35 print('Element[0x0 "qfn-44" "" "" 0 0 0 0 0 100 0x0]')
36 print("(")
37
38 # pins
39 for pin in range (1,12):
40     print('   Pad[',\
41         mm2mils100((-6 + pin) * PinSpacing), \
42         mm2mils100(-RowSpacing/2 - PinHeight/2 + PinWidth/2), \
43         mm2mils100((-6 + pin) * PinSpacing), \
44         mm2mils100(-RowSpacing/2 + PinHeight/2 - PinWidth/2), \
45         mm2mils100(PinWidth), \
46         mm2mils100(PinClearance), \
47         mm2mils100(PinResist), \
48         '"pin%i"' % (34-pin), '"%i"' % (34-pin), '0x0000]')
49
50     print('   Pad[',\
51         mm2mils100((-6 + pin) * PinSpacing), \
52         mm2mils100(RowSpacing/2 - PinHeight/2 + PinWidth/2), \
53         mm2mils100((-6 + pin) * PinSpacing), \
54         mm2mils100(RowSpacing/2 + PinHeight/2 - PinWidth/2), \
55         mm2mils100(PinWidth), \
56         mm2mils100(PinClearance), \
57         mm2mils100(PinResist), \
58         '"pin%i"' % pin, '"%i"' % pin, '0x0000]')
59       
60     print('   Pad[',\
61         mm2mils100(-RowSpacing/2 - PinHeight/2 + PinWidth/2), \
62         mm2mils100((-6 + pin) * PinSpacing), \
63         mm2mils100(-RowSpacing/2 + PinHeight/2 - PinWidth/2), \
64         mm2mils100((-6 + pin) * PinSpacing), \
65         mm2mils100(PinWidth), \
66         mm2mils100(PinClearance), \
67         mm2mils100(PinResist), \
68         '"pin%i"' % (33+pin), '"%i"' % (33+pin), '0x0000]')
69
70     print('   Pad[',\
71         mm2mils100(RowSpacing/2 - PinHeight/2 + PinWidth/2), \
72         mm2mils100((-6 + pin) * PinSpacing), \
73         mm2mils100(RowSpacing/2 + PinHeight/2 - PinWidth/2), \
74         mm2mils100((-6 + pin) * PinSpacing), \
75         mm2mils100(PinWidth), \
76         mm2mils100(PinClearance), \
77         mm2mils100(PinResist), \
78         '"pin%i"' % (23-pin), '"%i"' % (23-pin), '0x0000]')
79
80 print('   ElementArc[',\
81         mm2mils100(-Overall/2 - PinWidth), \
82         mm2mils100(Overall/2 + PinWidth), \
83         '500 500 0 360 1000 ]')
84 print(")")