50c2664cab5676f6d150dfa51b6119a726fbfb46
[hw/altusmetrum] / packages / vqfn-48.py
1 #!/usr/bin/python2
2 # Copyright 2022 by Bdale Garbee <bdale@gag.com>.  GPLv3
3 #
4 # emit PCB footprint for Atmel VQFN-48 package used by SAM21D
5 #
6
7 # dimensions in mm from 
8 #       atmel/samd21/SAM_D21_DA1_Family_Data_Sheet_DS40001882H-2580554.pdf
9
10 PinWidth = 0.3    # X1
11 PinHeight = 0.85  # Y1
12 RowSpacing = 6.9  # C1 / C2
13 PinSpacing = 0.5  # E
14 Overall = 7.0
15 GndSquare = 5.25  # X2 / Y2
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  .. should be good here too?
21 #
22 PinResist = PinWidth + (2 * 0.07)
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: Bdale Garbee'
30 print '# email: bdale@gag.com'
31 print '# dist-license: GPL 3'
32 print '# use-license: unlimited'
33
34 print 'Element[0x0 "vqfn-48" "" "" 0 0 0 0 0 100 0x0]'
35 print "("
36
37 ## pad under the chip
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 #       '"pin49" "49" "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(1.8 * viacol * CoreSquare / 3 + .9 * CoreSquare/3), \
53 #       mm2mils100(1.8 * viarow * CoreSquare / 3 + .9 * CoreSquare/3), \
54 #       2600, \
55 #       2500, \
56 #       0, \
57 #       1300, \
58 #       '"pin17" "17" 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 #       '"pin17" "17" "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 #       '"pin17" "17" "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 #       '"pin17" "17" "square"]'
98
99 # pins
100 for pin in range (1,13):
101     print '   Pad[',\
102         mm2mils100((-6.5 + pin) * PinSpacing), \
103         mm2mils100(-RowSpacing/2 - PinHeight/2 + PinWidth/2), \
104         mm2mils100((-6.5 + pin) * PinSpacing), \
105         mm2mils100(-RowSpacing/2 + PinHeight/2 - PinWidth/2), \
106         mm2mils100(PinWidth), \
107         mm2mils100(PinClearance), \
108         mm2mils100(PinResist), \
109         '"pin%i"' % (37-pin), '"%i"' % (37-pin), '0x0000]'
110
111     print '   Pad[',\
112         mm2mils100((-6.5 + pin) * PinSpacing), \
113         mm2mils100(RowSpacing/2 - PinHeight/2 + PinWidth/2), \
114         mm2mils100((-6.5 + pin) * PinSpacing), \
115         mm2mils100(RowSpacing/2 + PinHeight/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(-RowSpacing/2 - PinHeight/2 + PinWidth/2), \
123         mm2mils100((-6.5 + pin) * PinSpacing), \
124         mm2mils100(-RowSpacing/2 + PinHeight/2 - PinWidth/2), \
125         mm2mils100((-6.5 + pin) * PinSpacing), \
126         mm2mils100(PinWidth), \
127         mm2mils100(PinClearance), \
128         mm2mils100(PinResist), \
129         '"pin%i"' % (36+pin), '"%i"' % (36+pin), '0x0000]'
130
131     print '   Pad[',\
132         mm2mils100(RowSpacing/2 - PinHeight/2 + PinWidth/2), \
133         mm2mils100((-6.5 + pin) * PinSpacing), \
134         mm2mils100(RowSpacing/2 + PinHeight/2 - PinWidth/2), \
135         mm2mils100((-6.5 + pin) * PinSpacing), \
136         mm2mils100(PinWidth), \
137         mm2mils100(PinClearance), \
138         mm2mils100(PinResist), \
139         '"pin%i"' % (25-pin), '"%i"' % (25-pin), '0x0000]'
140
141 print '   ElementArc[',\
142         mm2mils100(-Overall/2 - PinWidth), \
143         mm2mils100(Overall/2 + PinWidth), \
144         '500 500 0 360 1000 ]'
145 print ")"