--- /dev/null
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+load "footprint.5c"
+import Footprint;
+
+int total_pad = 16;
+real center_gap = 4.00;
+
+if (dim(argv) > 1)
+ total_pad = string_to_integer(argv[1]);
+if (dim(argv) > 2)
+ center_gap = string_to_real(argv[2]);
+
+real pad_width = 0.60;
+
+real pad_height;
+
+if (center_gap > 6)
+ pad_height = 1.50;
+else
+ pad_height = 1.30;
+
+real pad_spacing = 1.27;
+
+int num_pad = total_pad / 2; /* per side */
+
+string name = sprintf ("SOIC-%d", total_pad);
+
+real package_width = (num_pad - 1) * pad_spacing + 1.61;
+
+real package_height = center_gap + 2 * pad_height + 0.4;
+
+real pad_y_off = center_gap / 2 + pad_height / 2;
+
+element_start(name);
+
+real pad_off(int n) {
+ return pad_spacing * (n - (num_pad - 1) / 2);
+}
+
+real corner(int dx, int dy) {
+ real x = dx * package_width / 2;
+ real y = dy * package_height / 2;
+ real len = 0.4;
+
+ line(x, y, x - dx * len, y);
+ line(x, y, x, y - dy * len);
+}
+
+corner(-1, -1);
+corner(1, -1);
+corner(-1, 1);
+corner(1, 1);
+
+real dot_off = -.3;
+
+line(-package_width/2 + dot_off, package_height/2 - dot_off,
+ -package_width/2 + dot_off, package_height/2 - dot_off);
+
+for (pad = 0; pad < num_pad; pad++) {
+ /* bottom (1-num_pad) */
+
+ pad_mm(pad_off(pad),
+ pad_y_off,
+ pad_width,
+ pad_height,
+ sprintf("%d", pad + 1),
+ sprintf("%d", pad + 1));
+
+ /* top side (total_pad - num_pad+1) */
+
+ pad_mm(-pad_off(pad),
+ -pad_y_off,
+ pad_width,
+ pad_height,
+ sprintf("%d", total_pad - pad),
+ sprintf("%d", total_pad - pad));
+
+}
+
+element_end();
--- /dev/null
+v 20130925 2
+B 400 400 1100 3300 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1
+P 0 3300 400 3300 1 0 0
+{
+T 0 3300 5 10 0 0 0 0 1
+pintype=unknown
+T 455 3395 5 10 1 1 0 0 1
+pinlabel=1A
+T 305 3345 5 10 1 1 0 6 1
+pinnumber=3
+T 0 3300 5 10 0 0 0 0 1
+pinseq=0
+}
+P 1900 3300 1500 3300 1 0 0
+{
+T 1900 3300 5 10 0 0 0 0 1
+pintype=unknown
+T 1445 3395 5 10 1 1 0 6 1
+pinlabel=1Y
+T 1595 3345 5 10 1 1 0 0 1
+pinnumber=2
+T 1900 3300 5 10 0 0 0 0 1
+pinseq=0
+}
+L 800 3500 800 3100 3 0 0 0 -1 -1
+L 800 3500 1100 3300 3 0 0 0 -1 -1
+L 1100 3300 800 3100 3 0 0 0 -1 -1
+L 1100 3300 1500 3300 3 0 0 0 -1 -1
+L 800 3300 400 3300 3 0 0 0 -1 -1
+P 1000 4100 1000 3700 1 0 0
+{
+T 1000 4100 5 10 0 0 0 0 1
+pintype=unknown
+T 855 3500 5 10 1 1 180 8 1
+pinlabel=Vcc
+T 795 3850 5 10 1 1 0 0 1
+pinnumber=1
+T 1000 4100 5 10 0 0 0 0 1
+pinseq=0
+}
+P 0 2800 400 2800 1 0 0
+{
+T 0 2800 5 10 0 0 0 0 1
+pintype=unknown
+T 0 2800 5 10 0 0 0 0 1
+pinseq=0
+T 455 2895 5 10 1 1 0 0 1
+pinlabel=2A
+T 305 2845 5 10 1 1 0 6 1
+pinnumber=5
+}
+P 1900 2800 1500 2800 1 0 0
+{
+T 1900 2800 5 10 0 0 0 0 1
+pintype=unknown
+T 1900 2800 5 10 0 0 0 0 1
+pinseq=0
+T 1445 2895 5 10 1 1 0 6 1
+pinlabel=2Y
+T 1595 2845 5 10 1 1 0 0 1
+pinnumber=4
+}
+L 800 3000 800 2600 3 0 0 0 -1 -1
+L 800 3000 1100 2800 3 0 0 0 -1 -1
+L 1100 2800 800 2600 3 0 0 0 -1 -1
+L 1100 2800 1500 2800 3 0 0 0 -1 -1
+L 800 2800 400 2800 3 0 0 0 -1 -1
+P 0 2300 400 2300 1 0 0
+{
+T 0 2300 5 10 0 0 0 0 1
+pintype=unknown
+T 0 2300 5 10 0 0 0 0 1
+pinseq=0
+T 455 2395 5 10 1 1 0 0 1
+pinlabel=3A
+T 305 2345 5 10 1 1 0 6 1
+pinnumber=7
+}
+P 1900 2300 1500 2300 1 0 0
+{
+T 1900 2300 5 10 0 0 0 0 1
+pintype=unknown
+T 1900 2300 5 10 0 0 0 0 1
+pinseq=0
+T 1445 2395 5 10 1 1 0 6 1
+pinlabel=3Y
+T 1595 2345 5 10 1 1 0 0 1
+pinnumber=6
+}
+L 800 2500 800 2100 3 0 0 0 -1 -1
+L 800 2500 1100 2300 3 0 0 0 -1 -1
+L 1100 2300 800 2100 3 0 0 0 -1 -1
+L 1100 2300 1500 2300 3 0 0 0 -1 -1
+L 800 2300 400 2300 3 0 0 0 -1 -1
+P 0 1800 400 1800 1 0 0
+{
+T 0 1800 5 10 0 0 0 0 1
+pintype=unknown
+T 0 1800 5 10 0 0 0 0 1
+pinseq=0
+T 455 1895 5 10 1 1 0 0 1
+pinlabel=4A
+T 305 1845 5 10 1 1 0 6 1
+pinnumber=9
+}
+P 1900 1800 1500 1800 1 0 0
+{
+T 1900 1800 5 10 0 0 0 0 1
+pintype=unknown
+T 1900 1800 5 10 0 0 0 0 1
+pinseq=0
+T 1445 1895 5 10 1 1 0 6 1
+pinlabel=4Y
+T 1595 1845 5 10 1 1 0 0 1
+pinnumber=10
+}
+L 800 2000 800 1600 3 0 0 0 -1 -1
+L 800 2000 1100 1800 3 0 0 0 -1 -1
+L 1100 1800 800 1600 3 0 0 0 -1 -1
+L 1100 1800 1500 1800 3 0 0 0 -1 -1
+L 800 1800 400 1800 3 0 0 0 -1 -1
+P 0 1300 400 1300 1 0 0
+{
+T 0 1300 5 10 0 0 0 0 1
+pintype=unknown
+T 0 1300 5 10 0 0 0 0 1
+pinseq=0
+T 455 1395 5 10 1 1 0 0 1
+pinlabel=5A
+T 305 1345 5 10 1 1 0 6 1
+pinnumber=11
+}
+P 1900 1300 1500 1300 1 0 0
+{
+T 1900 1300 5 10 0 0 0 0 1
+pintype=unknown
+T 1900 1300 5 10 0 0 0 0 1
+pinseq=0
+T 1445 1395 5 10 1 1 0 6 1
+pinlabel=5Y
+T 1595 1345 5 10 1 1 0 0 1
+pinnumber=12
+}
+L 800 1500 800 1100 3 0 0 0 -1 -1
+L 800 1500 1100 1300 3 0 0 0 -1 -1
+L 1100 1300 800 1100 3 0 0 0 -1 -1
+L 1100 1300 1500 1300 3 0 0 0 -1 -1
+L 800 1300 400 1300 3 0 0 0 -1 -1
+P 0 800 400 800 1 0 0
+{
+T 0 800 5 10 0 0 0 0 1
+pintype=unknown
+T 0 800 5 10 0 0 0 0 1
+pinseq=0
+T 455 895 5 10 1 1 0 0 1
+pinlabel=6A
+T 305 845 5 10 1 1 0 6 1
+pinnumber=14
+}
+P 1900 800 1500 800 1 0 0
+{
+T 1900 800 5 10 0 0 0 0 1
+pintype=unknown
+T 1900 800 5 10 0 0 0 0 1
+pinseq=0
+T 1445 895 5 10 1 1 0 6 1
+pinlabel=6Y
+T 1595 845 5 10 1 1 0 0 1
+pinnumber=15
+}
+L 800 1000 800 600 3 0 0 0 -1 -1
+L 800 1000 1100 800 3 0 0 0 -1 -1
+L 1100 800 800 600 3 0 0 0 -1 -1
+L 1100 800 1500 800 3 0 0 0 -1 -1
+L 800 800 400 800 3 0 0 0 -1 -1
+P 1000 0 1000 400 1 0 0
+{
+T 1000 0 5 10 0 0 0 0 1
+pintype=unknown
+T 855 500 5 10 1 1 0 0 1
+pinlabel=GND
+T 795 250 5 10 1 1 180 6 1
+pinnumber=8
+T 1000 0 5 10 0 0 0 0 1
+pinseq=0
+}