From 2a6496d3ed36c5d90a0ca1f651272dd3c6039a93 Mon Sep 17 00:00:00 2001 From: Werner Almesberger Date: Fri, 10 Jun 2011 10:24:53 -0300 Subject: [PATCH] fab/m1/: quick and dirty adaptation of prettygerbv and drl2gerber to M1 --- fab/m1/Makefile | 18 ++++++ fab/m1/README | 3 + fab/m1/drl2gerber | 74 ++++++++++++++++++++++ fab/m1/prettygerbv | 152 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 247 insertions(+) create mode 100644 fab/m1/Makefile create mode 100644 fab/m1/README create mode 100755 fab/m1/drl2gerber create mode 100755 fab/m1/prettygerbv diff --git a/fab/m1/Makefile b/fab/m1/Makefile new file mode 100644 index 0000000..1f11cd0 --- /dev/null +++ b/fab/m1/Makefile @@ -0,0 +1,18 @@ +D=rc3_gerber + +all: front.png back.png + +drill.pho: + tr -d '\015' <$(D)/drl00.drl | ./drl2gerber >$@ + +front.png: drill.pho + cd $(D) && ../prettygerbv -d ../drill.pho foo front ../$@ + +back.png: drill.pho + cd $(D) && ../prettygerbv -d ../drill.pho foo back ../$@ + +conn.png: drill.pho + cd $(D) && ../prettygerbv -d ../drill.pho foo conn ../$@ + +clean: + rm -f drill.pho front.png back.png conn.png diff --git a/fab/m1/README b/fab/m1/README new file mode 100644 index 0000000..c97f3a3 --- /dev/null +++ b/fab/m1/README @@ -0,0 +1,3 @@ +wget http://downloads.qi-hardware.com/hardware/milkymist_one/gerber/rc3/rc3_gerber.tar.bz2 +tar xfj rc3_gerber.tar.bz2 +make diff --git a/fab/m1/drl2gerber b/fab/m1/drl2gerber new file mode 100755 index 0000000..6fc2ddc --- /dev/null +++ b/fab/m1/drl2gerber @@ -0,0 +1,74 @@ +#!/usr/bin/perl +# +# drl2gerber - Convert a KiCAD-generated Excellon drill file to Gerber +# +# Written 2011 by Werner Almesberger +# Copyright 2011 Werner Almesberger +# +# 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; either version 2 of the License, or +# (at your option) any later version. +# + + +print "G04 MACHINE-GENERATED FROM DRILL FILE*\n" || die; +print "G01*\n" || die; # linear Interpolation +print "G70*\n" || die; # inch units +print "G90*\n" || die; # absolute Mode +print "%MOIN*%*\n" || die; # inches, RS274X-style +print "%FSLAX34Y34*%\n" || die; # format + +$x0 = 7300; +$y0 = 268910; + + +sub u() +{ + my $f = 1000000; + + $_[0] =~ /^(-?)(\d+)$/; + my $s = 0; + for (split("", $2)) { + $s += $_*$f; + $f /= 10; + } + return $1 eq "-" ? -$s : $s; +} + + +while (<>) { + chop; + if (/^T(\d+)C/) { + print "%ADD", $1+10, "C,$'*%\n" || die; + print "G54D", $1+10, "*\n" || die; + $faux_g85 = 0; + # we dont' seem to have easily machine-readable + # information in Altium's Excellon to tell what should + # be a hole and what should be a slot + undef $last; + next; + } + if (/^T(\d+)$/) { + print "G54D", $1+10, "*\n" || die; + next; + } + if (/^X([-0-9.]+)Y([-0-9.]+)$/) { + my $c = sprintf("X%dY%d", &u($1)+$x0, &u($2)+$y0); + + if ($faux_g85) { + print "${last}D02*\n${c}D01*\n" if defined $last; + $last = $c; + } else { + print "${c}D03*\n" || die; + } + next; + } + if (/^X([-0-9.]+)Y([-0-9.]+)G85X([-0-9.]+)Y([-0-9.]+)$/) { + printf("X%dY%dD02*\nX%dY%dD01*\n", + &u($1)+$x0, &u($2)+$y0, &u($3)+$x0, &u($4)+$y0) || die; + next; + } +} + +print "M02*\n" || die; diff --git a/fab/m1/prettygerbv b/fab/m1/prettygerbv new file mode 100755 index 0000000..916bbec --- /dev/null +++ b/fab/m1/prettygerbv @@ -0,0 +1,152 @@ +#!/bin/sh +# +# prettygerbv - Use gerbv to generate "pretty" views of a PCB +# +# Written 2011 by Werner Almesberger +# Copyright 2011 Werner Almesberger +# +# 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; either version 2 of the License, or +# (at your option) any later version. +# + + +COPPER="(cons 'color #(65535 50401 10000))" +PASTE="(cons 'color #(39083 39083 50000))" +MASK="(cons 'inverted #t) (cons 'color #(8839 53994 8178))" +SILK="(cons 'color #(65535 65535 65535))" +EDGE="(cons 'color #(65535 65535 0))" +DRILL="(cons 'color #(0 0 40000))" + +FRONT="(cons 'color #(65535 10000 10000))" +BACK="(cons 'color #(30000 65535 30000))" +EDGE2="(cons 'color #(30000 40000 65535))" +L2="(cons 'color #(1000 1000 1000))" +L3="(cons 'color #(1000 1000 1000))" +L4="(cons 'color #(1000 1000 1000))" +L5="(cons 'color #(1000 1000 1000))" + + +usage() +{ + cat <&2 +usage: $0 [-d file] project-name view png-file + + view "front", "back", "conn", "all" + + -d file also use drill file (converted to Gerber) +EOF + exit 1 +} + + +layers_begin() +{ + curr_layer=$1 + echo '(gerbv-file-version! "2.0A")' >_gvp +} + + +layer() +{ + file=$1 + shift + [ -e "$file" ] || return + cat <>_gvp +(define-layer! $curr_layer (cons 'filename "$file") $*) +EOF + curr_layer=`expr $curr_layer - 1` +} + + +layers_end() +{ + echo '(set-render-type! 2)' >>_gvp +} + + +run_gerbv() +{ + gerbv -p _gvp --dpi=600 -x png -o "$1" +} + + +front() +{ + layers_begin 5 + layer art01.pho $COPPER + [ "$drill" ] && layer $drill $DRILL + layer smd0129.pho $PASTE + layer sm0125.pho $INV $MASK + layer sst0127.pho $SILK +# layer $NAME-PCB_Edges.gbr $EDGE + layers_end + + run_gerbv "$1" +} + + +back() +{ + layers_begin 5 + layer art06.pho $COPPER + [ "$drill" ] && layer $drill $DRILL + layer smd0630.pho $PASTE + layer sm0626.pho $INV $MASK + layer ssb0628.pho $SILK +# layer $NAME-PCB_Edges.gbr $EDGE + layers_end + + run_gerbv _tmp.png + convert -flop _tmp.png "$1" + rm -f _tmp.png +} + + +conn() +{ + layers_begin 6 + layer art06.pho $BACK + layer art05.pho $L5 + layer art04.pho $L4 + layer art03.pho $L3 + layer art02.pho $L2 + layer art01.pho $FRONT +# layer $NAME-PCB_Edges.gbr $EDGE2 + layers_end + + run_gerbv "$1" +} + + +all() +{ + front _front.png + back _back.png + conn _conn.png + montage -geometry +4+4 _front.png _back.png _conn.png "$1" + rm -f _front.png _back.png _conn.png +} + +drill= +if [ "$1" = -d ]; then + drill=$2 + shift 2 +fi + +[ "$4" ] && usage +[ ! "$3" ] && usage + +NAME=$1 +OUT=$3 + +case "$2" in + front|back|conn) ;; + all) ;; + *) usage;; +esac + +$2 "$OUT" + +#rm -f _gvp