Skip to content

Instantly share code, notes, and snippets.

@samt
Created November 11, 2019 05:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save samt/db077785ddf99e2797c9d65ee49022d4 to your computer and use it in GitHub Desktop.
Save samt/db077785ddf99e2797c9d65ee49022d4 to your computer and use it in GitHub Desktop.
(module M.2-TEMPLATE (layer F.Cu) (tedit 5DC8ECDB)
(descr {{datasheet}})
(tags {{tags}})
(attr smd)
(fp_text reference REF** (at 0.05 -5.75) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.12)))
)
(fp_text value {{name}} (at 0 6) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text user "INSERT DIRECTION" (at 0 1.5) (layer Cmts.User)
(effects (font (size 0.5 0.5) (thickness 0.1)))
)
(fp_line (start -4.75 1.75) (end -5 1.25) (layer Dwgs.User) (width 0.1))
(fp_line (start -5.25 1.75) (end -4.75 1.75) (layer Dwgs.User) (width 0.1))
(fp_line (start -5 1.25) (end -5.25 1.75) (layer Dwgs.User) (width 0.1))
(fp_text user "MODULE EDGE" (at 0 -1) (layer Cmts.User)
(effects (font (size 0.5 0.5) (thickness 0.1)))
)
(fp_line (start 8 -0.25) (end -8 -0.25) (layer Dwgs.User) (width 0.1))
(fp_line (start -9.75 4) (end -11.5 4) (layer F.SilkS) (width 0.12))
(fp_line (start 11.5 4) (end 9.75 4) (layer F.SilkS) (width 0.12))
(fp_poly (pts (xy -9.25 -3) (xy -9 -2.5) (xy -9.5 -2.5)) (layer F.SilkS) (width 0.1))
(fp_line (start 11.5 4) (end 11.5 -4.5) (layer F.SilkS) (width 0.12))
(fp_line (start -11.5 4) (end -11.5 -4.5) (layer F.SilkS) (width 0.12))
(fp_line (start 11.75 -5) (end -11.75 -5) (layer F.CrtYd) (width 0.05))
(fp_line (start 11.75 5) (end 11.75 -5) (layer F.CrtYd) (width 0.05))
(fp_line (start -11.75 5) (end 11.75 5) (layer F.CrtYd) (width 0.05))
(fp_line (start -11.75 -5) (end -11.75 5) (layer F.CrtYd) (width 0.05))
(fp_line (start 5.25 1.75) (end 5 1.25) (layer Dwgs.User) (width 0.1))
(fp_line (start 4.75 1.75) (end 5.25 1.75) (layer Dwgs.User) (width 0.1))
(fp_line (start 5 1.25) (end 4.75 1.75) (layer Dwgs.User) (width 0.1))
(fp_text user %R (at 0 0) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -11.25 -4.5) (end -11.25 3.75) (layer F.Fab) (width 0.1))
(fp_line (start -9.5 4.5) (end 9.5 4.5) (layer F.Fab) (width 0.1))
(fp_line (start -9.5 -4.25) (end 9.5 -4.25) (layer F.Fab) (width 0.1))
(fp_line (start 11.25 -4.5) (end 11.25 3.75) (layer F.Fab) (width 0.1))
(fp_line (start 11.25 3.75) (end 9.5 3.75) (layer F.Fab) (width 0.1))
(fp_line (start 9.5 3.75) (end 9.5 4.5) (layer F.Fab) (width 0.1))
(fp_line (start -9.5 3.75) (end -9.5 4.5) (layer F.Fab) (width 0.1))
(fp_line (start -9.5 3.75) (end -11.25 3.75) (layer F.Fab) (width 0.1))
(fp_line (start 11.25 -4.5) (end 9.5 -4.5) (layer F.Fab) (width 0.1))
(fp_line (start 9.5 -4.5) (end 9.5 -4.25) (layer F.Fab) (width 0.1))
(fp_line (start -9.5 -4.25) (end -9.5 -4.5) (layer F.Fab) (width 0.1))
(fp_line (start -9.5 -4.5) (end -11.25 -4.5) (layer F.Fab) (width 0.1))
(pad "" np_thru_hole circle (at 10 1.475) (size 1.6 1.6) (drill 1.6) (layers *.Cu *.Mask))
(pad MP smd rect (at 10.35 -3.025) (size 1.2 2.75) (layers F.Cu F.Paste F.Mask))
(pad MP smd rect (at -10.35 -3.025) (size 1.2 2.75) (layers F.Cu F.Paste F.Mask))
(pad "" np_thru_hole circle (at -10 1.475) (size 1.1 1.1) (drill 1.1) (layers *.Cu *.Mask))
(pad 75 smd rect (at 9.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 74 smd rect (at 9 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 73 smd rect (at 8.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 72 smd rect (at 8.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 71 smd rect (at 8.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 70 smd rect (at 8 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 69 smd rect (at 7.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 68 smd rect (at 7.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 67 smd rect (at 7.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 66 smd rect (at 7 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 65 smd rect (at 6.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 64 smd rect (at 6.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 63 smd rect (at 6.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 62 smd rect (at 6 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 61 smd rect (at 5.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 60 smd rect (at 5.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 59 smd rect (at 5.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 58 smd rect (at 5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 57 smd rect (at 4.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 56 smd rect (at 4.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 55 smd rect (at 4.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 54 smd rect (at 4 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 53 smd rect (at 3.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 52 smd rect (at 3.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 51 smd rect (at 3.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 50 smd rect (at 3 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 49 smd rect (at 2.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 48 smd rect (at 2.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 47 smd rect (at 2.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 46 smd rect (at 2 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 45 smd rect (at 1.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 44 smd rect (at 1.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 43 smd rect (at 1.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 42 smd rect (at 1 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 41 smd rect (at 0.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 40 smd rect (at 0.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 39 smd rect (at 0.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 38 smd rect (at 0 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 37 smd rect (at -0.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 36 smd rect (at -0.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 35 smd rect (at -0.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 34 smd rect (at -1 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 33 smd rect (at -1.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 32 smd rect (at -1.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 31 smd rect (at -1.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 30 smd rect (at -2 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 29 smd rect (at -2.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 28 smd rect (at -2.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 27 smd rect (at -2.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 26 smd rect (at -3 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 25 smd rect (at -3.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 24 smd rect (at -3.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 23 smd rect (at -3.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 22 smd rect (at -4 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 21 smd rect (at -4.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 20 smd rect (at -4.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 19 smd rect (at -4.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 18 smd rect (at -5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 17 smd rect (at -5.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 16 smd rect (at -5.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 15 smd rect (at -5.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 14 smd rect (at -6 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 13 smd rect (at -6.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 12 smd rect (at -6.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 11 smd rect (at -6.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 10 smd rect (at -7 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 9 smd rect (at -7.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 8 smd rect (at -7.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 7 smd rect (at -7.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 6 smd rect (at -8 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 5 smd rect (at -8.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 4 smd rect (at -8.5 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 3 smd rect (at -8.75 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 2 smd rect (at -9 4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(pad 1 smd rect (at -9.25 -4) (size 0.3 1.6) (layers F.Cu F.Paste F.Mask))
(model ${KISYS3DMOD}/Connector_TE-Connectivity.3dshapes/{{name}}.wrl
(at (xyz 0 0 0))
(scale (xyz 1 1 1))
(rotate (xyz 0 0 0))
)
)
const DATASHEET_BASE = 'https://www.te.com/commerce/DocumentDelivery/DDEController?Action=showdoc&DocId=Customer+Drawing%7F2199230%7FB2%7Fpdf%7FEnglish%7FENG_CD_2199230_B2.pdf%7F'
const KICAD_FOOTPRINT_REPO = '/Users/samt/Repos/kicad/kicad-footprints';
function partToKey(part) {
switch (part) {
case '2199230-8': return 'A';
case '2199230-3': return 'B';
case '2199230-4': return 'E';
case '1-2199230-5': return 'M';
}
}
function keyToPins(key) {
switch (key) {
case 'A': return [8,9,10,11,12,13,14,15];
case 'B': return [12,13,14,15,16,17,18,19];
case 'E': return [24,25,26,27,28,29,30,31];
case 'M': return [59,60,61,62,63,64,65,66];
}
}
function keyToKeySilk(key) {
const line = {
A: { even: -7.5, odd: -7.25 },
B: { even: -6.5, odd: -6.25 },
E: { even: -3.5, odd: -3.25 },
M: { even: 5.5, odd: 5.25 }
};
return ( // semicolon insertion workaround
// Even line
` (fp_line (start ${line[key].even} 4) (end ${line[key].even + 1.5} 4) (layer F.SilkS) (width 0.12))\n` +
// Odd Line
` (fp_line (start ${line[key].odd} -4) (end ${line[key].odd + 1.5} -4) (layer F.SilkS) (width 0.12))\n`
);
}
function partToEntry(part) {
const key = partToKey(part);
const pins = keyToPins(key);
const name = `TE_Bus_M.2_${key}_H4.2_P0.5mm_Horizontal`;
const datasheet = DATASHEET_BASE + part;
const tags = `M.2 NGFF ${key} KEY`;
return { key, name, tags, datasheet, pins };
}
const fs = require('fs');
const variations = [
partToEntry('2199230-8'),
partToEntry('2199230-3'),
partToEntry('2199230-4'),
partToEntry('1-2199230-5')
];
const tedit = parseInt(Date.now() / 1000).toString(16).toUpperCase();
const basefile = fs.readFileSync('./M.2-TEMPLATE.kicad_mod');
const template = basefile.toString().replace(
/\(module\s[^\s]+\s\(layer F.Cu\)\s\(tedit\s[A-F0-9]+\)/g,
'(module {{name}} (layer F.Cu) (tedit {{tedit}})'
).replace(
/\(descr[^\)]+\)/,
'(descr "{{desc}}")'
).replace(
/\(tags[^\)]+\)/,
'(tags "{{tags}}")'
);
for (let v in variations) {
let { name, key, tags, pins, datasheet } = variations[v];
let buffer = template
.replace(/\{\{name\}\}/g, name)
.replace(/\{\{desc\}\}/g, `M.2 connector ${key}-key ${datasheet}`)
.replace(/\{\{tags\}\}/g, tags)
.replace(/\{\{tedit\}\}/g, tedit)
.split('\n');
let result = '';
for (let b in buffer) {
let line = buffer[b];
if (line.indexOf('(pad "" np_thru_hole circle (at 10 1.475)') !== -1) {
result += keyToKeySilk(key);
}
let matches = line.match(/pad ([0-9]{1,2})/);
if (matches !== null && pins.indexOf(parseInt(matches[1])) !== -1) {
// no op
} else {
result += line + '\n';
}
}
fs.writeFileSync(`${KICAD_FOOTPRINT_REPO}/Connector_TE-Connectivity.pretty/${name}.kicad_mod`, result);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment