--- /dev/null
+#!/usr/bin/python3
+# Copyright 2023 by Bdale Garbee <bdale@gag.com>. GPLv3
+#
+# Program to emit PCB footprint for GCT MEM2051-00-195-00-A micro SD connector
+# this is a push-push style connector with normally open card detection pin
+#
+
+# dimensions in mm from gct/mem2051.pdf
+MntFWidth = 1.50
+MntFHeight = 2.00
+MntRWidth = 1.30
+MntRHeight = 1.40
+MntYR = MntRHeight/2 - 0.3
+MntYFL = MntYR + MntRHeight/2 + 11.50 + MntFHeight/2
+MntYFR = MntYR + MntRHeight/2 + 12.50 + MntFHeight/2
+MntXRL = -11.50/2 + MntRWidth/2
+MntXRR = -11.50/2 + 5.70 + MntRWidth/2
+MntXFL = -11.50/2 - MntFWidth/2
+MntXFR = 11.50/2 + MntFWidth/2
+
+CDWidth = 1.00
+CDHeight = 0.95
+CDX = -11.50/2 + 1.54 + CDWidth/2
+CDY = CDHeight/2 - 0.3
+
+PinWidth = 0.80
+PinHeight = 1.50
+PinSpacing = 1.10
+PinY = MntYR + MntRHeight/2 + 9.41 + PinHeight/2
+PinY2 = PinY - 0.4
+PinY46 = PinY + 0.2
+
+BoxX = 14.00
+BoxYleft = 14.20
+BoxYright = 15.20
+ArcWidth = 10.80
+ArcHeight = 1.30
+ArcOffset = 1.3
+LineWidth = 1000
+
+Clearance = 0.32
+
+MaskAdd = 0.15
+
+import sys
+
+# we're going to use the 1/100 of a mil fundamental unit form
+def mm2mils100( mm ):
+ return int( mm / 25.4 * 1000.0 * 100.0 + 0.5 )
+
+print('# author: Bdale Garbee')
+print('# email: bdale@gag.com')
+print('# dist-license: GPL 3')
+print('# use-license: unlimited')
+
+print('Element[0x0 "microSD" "" "" 0 0 0 0 0 100 0x0]')
+print("(")
+
+# mounting pads
+print(' Pad[',\
+ mm2mils100(MntXFL), \
+ mm2mils100(MntYFL - MntFHeight/2 + MntFWidth/2), \
+ mm2mils100(MntXFL), \
+ mm2mils100(MntYFL + MntFHeight/2 - MntFWidth/2), \
+ mm2mils100(MntFWidth), \
+ mm2mils100(Clearance), \
+ mm2mils100(MntFWidth + MaskAdd), \
+ '"10" "10" 0x0100]')
+
+print(' Pad[',\
+ mm2mils100(MntXFR), \
+ mm2mils100(MntYFR - MntFHeight/2 + MntFWidth/2), \
+ mm2mils100(MntXFR), \
+ mm2mils100(MntYFR + MntFHeight/2 - MntFWidth/2), \
+ mm2mils100(MntFWidth), \
+ mm2mils100(Clearance), \
+ mm2mils100(MntFWidth + MaskAdd), \
+ '"10" "10" 0x0100]')
+
+print(' Pad[',\
+ mm2mils100(MntXRL), \
+ mm2mils100(MntYR - MntRHeight/2 + MntRWidth/2), \
+ mm2mils100(MntXRL), \
+ mm2mils100(MntYR + MntRHeight/2 - MntRWidth/2), \
+ mm2mils100(MntRWidth), \
+ mm2mils100(Clearance), \
+ mm2mils100(MntRWidth + MaskAdd), \
+ '"10" "10" 0x0100]')
+
+print(' Pad[',\
+ mm2mils100(MntXRR), \
+ mm2mils100(MntYR - MntRHeight/2 + MntRWidth/2), \
+ mm2mils100(MntXRR), \
+ mm2mils100(MntYR + MntRHeight/2 - MntRWidth/2), \
+ mm2mils100(MntRWidth), \
+ mm2mils100(Clearance), \
+ mm2mils100(MntRWidth + MaskAdd), \
+ '"10" "10" 0x0100]')
+
+# signal pads
+for pin in range (1,9):
+
+ myPinY = PinY
+ if pin == 2:
+ myPinY = PinY2
+ elif (pin == 4 or pin == 6):
+ myPinY = PinY46
+ else:
+ myPinY = PinY
+
+ print(' Pad[',\
+ mm2mils100(CDX + (6-pin) * PinSpacing), \
+ mm2mils100(myPinY-(PinHeight/2)+(PinWidth/2)), \
+ mm2mils100(CDX + (6-pin) * PinSpacing), \
+ mm2mils100(myPinY+(PinHeight/2)-(PinWidth/2)), \
+ mm2mils100(PinWidth), \
+ mm2mils100(Clearance), \
+ mm2mils100(PinWidth + MaskAdd), \
+ '"pin%i"' % (pin), '"%i"' % (pin), '0x0100]')
+
+# card detect pad
+ print(' Pad[',\
+ mm2mils100(CDX - CDHeight/2 + CDWidth/2), \
+ mm2mils100(CDY), \
+ mm2mils100(CDX + CDHeight/2 - CDWidth/2), \
+ mm2mils100(CDY), \
+ mm2mils100(CDHeight), \
+ mm2mils100(Clearance), \
+ mm2mils100(CDHeight + MaskAdd), \
+ '"9" "9" 0x0100]')
+
+# keepout area
+print(' ElementLine[', \
+ mm2mils100(CDX - 2.10/2), \
+ mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 4.37), \
+ mm2mils100(CDX + 2.10/2), \
+ mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 4.37), \
+ LineWidth, ']')
+
+print(' ElementLine[', \
+ mm2mils100(CDX + 2.10/2), \
+ mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 2.30), \
+ mm2mils100(CDX + 2.10/2), \
+ mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 4.37), \
+ LineWidth, ']')
+
+print(' ElementLine[', \
+ mm2mils100(CDX - 2.10/2), \
+ mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 2.30), \
+ mm2mils100(CDX - 2.10/2), \
+ mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 4.37), \
+ LineWidth, ']')
+
+print(' ElementLine[', \
+ mm2mils100(-14.00/2 + 0.75), \
+ mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 2.30), \
+ mm2mils100(CDX - 2.10/2), \
+ mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 2.30), \
+ LineWidth, ']')
+
+print(' ElementLine[', \
+ mm2mils100(14.00/2 - 4.55), \
+ mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 2.30), \
+ mm2mils100(14.00/2 - 4.55), \
+ mm2mils100(MntYFR - MntFHeight/2 - 7.37), \
+ LineWidth, ']')
+
+print(' ElementLine[', \
+ mm2mils100(-14.00/2 + 0.75), \
+ mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 2.30), \
+ mm2mils100(-14.00/2 + 0.75), \
+ mm2mils100(MntYFR - MntFHeight/2 - 7.37), \
+ LineWidth, ']')
+
+print(' ElementLine[', \
+ mm2mils100(CDX + 2.10/2), \
+ mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 2.30), \
+ mm2mils100(14.00/2 - 4.55), \
+ mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 2.30), \
+ LineWidth, ']')
+
+print(' ElementLine[', \
+ mm2mils100(-14.00/2 + 0.75), \
+ mm2mils100(MntYFR - MntFHeight/2 - 7.37), \
+ mm2mils100(14.00/2 - 4.55), \
+ mm2mils100(MntYFR - MntFHeight/2 - 7.37), \
+ LineWidth, ']')
+
+
+# silkscreen box
+print(' ElementLine[', \
+ mm2mils100(BoxX/2), \
+ mm2mils100(0), \
+ mm2mils100(BoxX/2), \
+ mm2mils100(BoxYright), \
+ LineWidth, ']')
+
+print(' ElementLine[', \
+ mm2mils100(-BoxX/2), \
+ mm2mils100(0), \
+ mm2mils100(-BoxX/2), \
+ mm2mils100(BoxYleft), \
+ LineWidth, ']')
+
+print(' ElementLine[', \
+ mm2mils100(-BoxX/2), \
+ mm2mils100(0), \
+ mm2mils100(+BoxX/2), \
+ mm2mils100(0), \
+ LineWidth, ']')
+
+print(' ElementLine[', \
+ mm2mils100(+BoxX/2-2*ArcHeight), \
+ mm2mils100(BoxYleft), \
+ mm2mils100(+BoxX/2-2*ArcHeight), \
+ mm2mils100(BoxYright), \
+ LineWidth, ']')
+
+print(' ElementLine[', \
+ mm2mils100(+BoxX/2-5), \
+ mm2mils100(BoxYleft-1), \
+ mm2mils100(+BoxX/2-5), \
+ mm2mils100(BoxYright), \
+ LineWidth, ']')
+
+print(' ElementLine[', \
+ mm2mils100(+BoxX/2-5), \
+ mm2mils100(BoxYright), \
+ mm2mils100(+BoxX/2), \
+ mm2mils100(BoxYright), \
+ LineWidth, ']')
+
+print(' ElementArc[', \
+ mm2mils100(-ArcOffset), \
+ mm2mils100((BoxYleft*2-3.75)-ArcHeight), \
+ mm2mils100(ArcWidth), \
+ mm2mils100(ArcHeight), \
+ 238, \
+ 64, \
+ LineWidth, ']')
+
+print(")")