Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
#! /bin/sh
#
# Regeneration of index files.
if [ -z "$1" ]; then
cat <<@
This script transforms a WIMS circuit data file into a ps file
recognizable by xcircuit. You can then modify the latter and
transform back using ps2data.
Usage: ./data2ps inputfile
@
exit
fi
if [ -n "$w_module" ]; then
echo "This script is to be used manually. It should not be run by WIMS."
exit
fi
inp=$1
[ -f "$inp" ] || inp=$1.data
[ -f "$inp" ] || exit
current=`pwd`
cd `dirname $0`
homedir=`pwd`
header=$homedir/circ-header.ps1
tail=$homedir/circ-tail.ps1
cd $current
# Translation size factor
sf=64
desc=`awk 'BEGIN {rec=0};
/^:/ {rec++};
rec>1 {exit};
rec==1 {if(substr($0,1,1)==":") print substr($0,2); else print};' $inp`
range=`awk 'BEGIN {rec=0};
/^:/ {rec++};
rec>2 {exit};
rec==2 {if(substr($0,1,1)==":") print substr($0,2); else print};' $inp`
pos=`awk 'BEGIN {rec=0};
/^:/ {rec++};
rec>3 {exit};
rec==3 {if(substr($0,1,1)==":") print substr($0,2); else print};' $inp`
wire=`awk 'BEGIN {rec=0};
/^:/ {rec++};
rec>4 {exit};
rec==4 {if(substr($0,1,1)==":") print substr($0,2); else print};' $inp`
dots=`awk 'BEGIN {rec=0};
/^:/ {rec++};
rec>5 {exit};
rec==5 {if(substr($0,1,1)==":") print substr($0,2); else print};' $inp`
pairs=`echo "$range" | tr '()[]' '@@@@' | cut -s -d@ -f2 | tr ',' ' '`
if [ -z "$pairs" ]; then
pairs=`echo "$range" | cut -s -d, -f4 | tr ',' ' '`
fi
cat $header
echo
echo "(DESC: $desc) {/Helvetica cf} 2 16 0 1.00 0 -160 label"
echo "$range" |\
awk -F, '{
texthd="{/Helvetica cf} 2 16 0 1.00"; sf='$sf';
for(i=0;i<=$2/2;i++) {
printf "0.8 0.8 0.8 scb\n1 1.00 0 %d %d %d 2 polygon\nsce\n",
i*2*sf, $1*sf, i*2*sf;
printf "1.00 0 0 %d tap\n",i*2*sf;
printf "(%d) %s -64 %d label\n",i*2,texthd,i*2*sf-16;
}
if($2%2 == 1) {
printf "1.00 0 0 %d tap\n",$2*sf;
printf "(%d) %s -64 %d label\n",$2,texthd,$2*sf-16;
}
printf "0.8 0.8 0.8 scb\n1 1.00 0 0 0 %d 2 polygon\nsce\n", $2*sf;
for(i=1;i<=$1/2;i++) {
printf "0.8 0.8 0.8 scb\n1 1.00 %d 0 %d %d 2 polygon\nsce\n",
i*2*sf, i*2*sf, $2*sf;
printf "1.00 270 %d 0 tap\n",i*2*sf;
printf "(%d) %s %d -48 label\n",i*2,texthd,i*2*sf-16;
}
if($1%2 == 1) {
printf "1.00 270 %d 0 tap\n",$1*sf;
printf "(%d) %s %d -48 label\n",$1,texthd,$1*sf-16;
}
exit}'
echo "$pos" |\
awk -F, '{sf='$sf';
texthd="{/Helvetica cf} 2 16 0 1.00";
printf "1.00 %d %d %d acsource\n",(1-$5)*270,$1*sf,$2*sf;
if($3>=0 && $4>=0) printf "(XXX) %s %d %d label\n",
texthd,int($3*4)*sf/4,int($4*4)*sf/4-32;
for(i=6;i<=NF;i++) {
if($i>-1 && $i<1) continue;
if($i<0) t=-0.25; else t=0.25;
if($5==0) printf("1 1.50 %d %d %d %d 2 polygon\n",
int(($1+$i)*4)*sf/4, int($2*4)*sf/4,
int(($1+t)*4)*sf/4, int($2*4)*sf/4);
else printf("1 1.50 %d %d %d %d 2 polygon\n",
int($1*4)*sf/4, int(($2+$i)*4)*sf/4,
int($1*4)*sf/4, int(($2+t)*4)*sf/4);
}
}'
echo "$dots" |\
awk -F, '{sf='$sf';
for(i=2;i<=NF;i+=2) printf "1.00 0 %d %d dot\n",$(i-1)*sf,$i*sf;
}'
echo "$wire" | awk '$1=="lines" {print}' | sed 's/lines//;s/_color_//' |\
awk -F, '{sf='$sf';
printf "1 3.00 ";
for(i=2;i<=NF;i++) printf "%d ",$i*sf;
printf "%d polygon\n",(i-1)/2;
}'
echo "$wire" | awk '$1=="line" {print}' | sed 's/line//;s/_color_//' |\
awk -F, '{sf='$sf';
printf "1 3.00 %d %d %d %d 2 polygon\n",
$1*sf,$2*sf,$3*sf,$4*sf;
}'
echo "$wire" | awk '$1=="parallel" {print}' | sed 's/parallel//;s/_color_//' |\
awk -F, '{sf='$sf';
for(i=0;i<$7;i++) {
printf "1 3.00 %d %d %d %d 2 polygon\n",
($1+i*$5)*sf,($2+i*$6)*sf,
($3+i*$5)*sf,($4+i*$6)*sf;
}
}'
echo "$wire" | awk '$1 == "text" || $1 == "string" {print}' |\
awk -F, 'BEGIN {texthd="{/Helvetica cf} 2 16 0 1.00"; sf='$sf'};
{printf "(%s) %s %d %d label\n",$5,texthd,$2*sf,$3*sf-32}'
for p in $pairs; do
echo "$pos" | awk -F, 'FNR == '$p' {
sf='$sf';
if($5==0) {x1=$1+1;x2=$1+2;y1=y2=$2;}
else {x1=x2=$1;y1=$2-1;y2=$2-2;};
printf "1.0 0.0 0.0 scb\n1 3.00 %d %d %d %d 2 polygon\nsce\n",
x1*sf,y1*sf,x2*sf,y2*sf;
exit;
}'
done
cat $tail