convert Python footprint generators to Python 3
[hw/altusmetrum] / packages / UBLOX-MAX.py
1 #!/usr/bin/python3
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 3')
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(")")