21afe87bbd4a4acec4694e5dc54babff15bcff32
[hw/altusmetrum] / packages / UBLOX-MAX.py
1 #!/usr/bin/python2
2 # Copyright 2013 by Bdale Garbee <bdale@gag.com>.  GPLv2
3 #
4 # Program to emit PCB footprint for U-Blox MAX-6 GPS receiver
5 #
6
7 # dimensions in mm fromL
8 #       LEA-6_NEO-6_MAX-6_HardwareIntegrationManual_(GPS.G6-HW-09007).pdf
9
10 BodyHeight = 10.1
11 BodyWidth = 12.5                        # physical is 9.7, 12.5 includes paste
12
13 CornerPinWidth = 0.7
14 MainPinWidth = 0.8
15 PinHeight = 1.8
16 PinSpacing = 1.1
17 RowCenters = 9.7 - (1.0 - 0.8)
18 RowSpacing = RowCenters - PinHeight
19
20 PasteTongueWidthDelta = 0.2
21 PasteRowSpacing = 9.7
22 PasteHeight = (12.5 - 9.7) / 2
23 #PasteHeight = 0.8                      # not quite what the manual says
24
25 import sys
26
27 # we're going to use the 1/100 of a mil fundamental unit form
28 def mm2mils100( mm ):
29         return int( mm / 25.4 * 1000.0 * 100.0 + 0.5 )
30
31 print '# author: Bdale Garbee'
32 print '# email: bdale@gag.com'
33 print '# dist-license: GPL 2'
34 print '# use-license: unlimited'
35
36 print 'Element[0x0 "UBLOX-MAX" "" "" 0 0 -10161 -12011 0 100 0x0]'
37 print "("
38 # first, lay down the copper but with no paste mask defined
39 for pin in range (0,9):
40     if (pin == 0) or (pin == 8):
41         PinWidth = CornerPinWidth
42     else:
43         PinWidth = MainPinWidth
44     print '   Pad[',\
45         mm2mils100((pin-4) * PinSpacing), \
46         mm2mils100(-(RowSpacing/2 + PinWidth/2)), \
47         mm2mils100((pin-4) * PinSpacing), \
48         mm2mils100(-(RowSpacing/2 + PinHeight - PinWidth/2)), \
49         mm2mils100(PinWidth), \
50         mm2mils100(PinSpacing - PinWidth), \
51         mm2mils100(PinWidth)+600, \
52         '"pin%i"' % (18 - pin), '"%i"' % (18 - pin), '"square,nopaste"]'
53
54     print '   Pad[',\
55         mm2mils100((pin-4) * PinSpacing), \
56         mm2mils100(RowSpacing/2 + PinWidth/2), \
57         mm2mils100((pin-4) * PinSpacing), \
58         mm2mils100(RowSpacing/2 + PinHeight - PinWidth/2), \
59         mm2mils100(PinWidth), \
60         mm2mils100(PinSpacing - PinWidth), \
61         mm2mils100(PinWidth)+600, \
62         '"pin%i"' % (1 + pin), '"%i"' % (1 + pin), '"square,nopaste"]'
63
64 # now define the paste mask, which needs two rectangles per pad in T-shape
65 # the first rectangle is full pin height but narrower
66 for pin in range (0,9):
67     if (pin == 0) or (pin == 8):
68         PinWidth = CornerPinWidth - PasteTongueWidthDelta
69     else:
70         PinWidth = MainPinWidth - PasteTongueWidthDelta
71     print '   Pad[',\
72         mm2mils100((pin-4) * PinSpacing), \
73         mm2mils100(-(RowSpacing/2 + PinWidth/2)), \
74         mm2mils100((pin-4) * PinSpacing), \
75         mm2mils100(-(RowSpacing/2 + PinHeight - PinWidth/2)), \
76         mm2mils100(PinWidth), \
77         mm2mils100(PinSpacing - PinWidth), \
78         mm2mils100(PinWidth)+600, \
79         '"pin%i"' % (18 - pin), '"%i"' % (18 - pin), '"square"]'
80
81     print '   Pad[',\
82         mm2mils100((pin-4) * PinSpacing), \
83         mm2mils100(RowSpacing/2 + PinWidth/2), \
84         mm2mils100((pin-4) * PinSpacing), \
85         mm2mils100(RowSpacing/2 + PinHeight - PinWidth/2), \
86         mm2mils100(PinWidth), \
87         mm2mils100(PinSpacing - PinWidth), \
88         mm2mils100(PinWidth)+600, \
89         '"pin%i"' % (1 + pin), '"%i"' % (1 + pin), '"square"]'
90
91 # the second rectangle is partial height but full width
92 for pin in range (0,9):
93     if (pin == 0) or (pin == 8):
94         PinWidth = CornerPinWidth
95     else:
96         PinWidth = MainPinWidth
97     print '   Pad[',\
98         mm2mils100((pin-4) * PinSpacing), \
99         mm2mils100(-(PasteRowSpacing/2 + PinWidth/2)), \
100         mm2mils100((pin-4) * PinSpacing), \
101         mm2mils100(-(PasteRowSpacing/2 + PasteHeight - PinWidth/2)), \
102         mm2mils100(PinWidth), \
103         mm2mils100(PinSpacing - PinWidth), \
104         mm2mils100(PinWidth)+600, \
105         '"pin%i"' % (18 - pin), '"%i"' % (18 - pin), '"square"]'
106
107     print '   Pad[',\
108         mm2mils100((pin-4) * PinSpacing), \
109         mm2mils100(PasteRowSpacing/2 + PinWidth/2), \
110         mm2mils100((pin-4) * PinSpacing), \
111         mm2mils100(PasteRowSpacing/2 + PasteHeight - PinWidth/2), \
112         mm2mils100(PinWidth), \
113         mm2mils100(PinSpacing - PinWidth), \
114         mm2mils100(PinWidth)+600, \
115         '"pin%i"' % (1 + pin), '"%i"' % (1 + pin), '"square"]'
116
117
118 print '   ElementLine[',\
119         mm2mils100(-BodyHeight/2), \
120         mm2mils100(-BodyWidth/2), \
121         mm2mils100(-BodyHeight/2), \
122         mm2mils100( BodyWidth/2), \
123         '1000 ]'
124
125 print '   ElementLine[',\
126         mm2mils100(-BodyHeight/2), \
127         mm2mils100( BodyWidth/2), \
128         mm2mils100( BodyHeight/2), \
129         mm2mils100( BodyWidth/2), \
130         '1000 ]'
131
132 print '   ElementLine[',\
133         mm2mils100( BodyHeight/2), \
134         mm2mils100( BodyWidth/2), \
135         mm2mils100( BodyHeight/2), \
136         mm2mils100(-BodyWidth/2), \
137         '1000 ]'
138
139 print '   ElementLine[',\
140         mm2mils100( BodyHeight/2), \
141         mm2mils100(-BodyWidth/2), \
142         mm2mils100(-BodyHeight/2), \
143         mm2mils100(-BodyWidth/2), \
144         '1000 ]'
145
146 print '   ElementArc[',\
147         mm2mils100(-4 * PinSpacing), \
148         mm2mils100(RowSpacing/2-PinHeight/2), \
149         '500 500 0 360 1000 ]'
150
151 print ")"