[mod.sources] wirewrap program part 02 of 02

sources-request@genrad.UUCP (08/18/85)

Mod.sources:  Volume 2, Issue 36
Submitted by: uwvax!geowhiz!karsh <karsh@geowhiz.UUCP> (Bruce Karsh)



#!/bin/sh
#
# This is a release of my wirewrap program.  It has been used
# to make several boards here, and seems to be pretty reliable. 
# It was written on a Masscomp MC500, but I don't think there
# are any serious machine dependencies in it.  (But then again,
# I'm often suprised by how easy it is to inadvertantly write
# machine dependent code.)
# 
# I'd like to hear some bug reports and success stories.  I will
# try to send out bug fixes as quickly as I can.
# 
# As usual, unpack all parts by running through sh, then run make.
# 
# Unix Wirewrap Source Code:
# cnvtnum.c	gettoken.c	getwired.c	getwirelen.c	header1.c
# header2.c	initialize.c	insertname.c	insertx.c	main.c
# mywrite.c	mywrite2.c	namecmp.c	namecmp2.c	output1.c
# output2.c	output3.c	readin.c	setptr.c	setrowandcol.c
# sort1.c		sort2.c		test.c
# 
# .h files:
#   wirewrap.h
# 
# Documentation:
#   wirewrap.1 README PACKINGLIST
# 
# Unix wirewrap makefile:
#   Makefile
# 
# Test Data:
#   autocal
# 
# Example listing:
#   autocal.listing
# 
# ----
# Bruce Karsh
# U. Wisc. Dept. Geology and Geophysics
# 1215 W Dayton, Madison, WI 53706
# (608) 262-1697
# {ihnp4,seismo}!uwvax!geowhiz!karsh
#
echo 'Start of wirewrap program, part 02 of 02:'
echo 'x - Makefile'
sed 's/^X//' > Makefile << '/'
Xwirewrap:     initialize.o readin.o main.o setptr.o setrowandcol.o \
X              sort1.o getwired.o output3.o getwirelen.o \
X              insertx.o output1.o mywrite.o header1.o sort2.o \
X              output2.o header2.o mywrite2.o \
X              test.o cnvtnum.o namecmp.o insertname.o gettoken.o \
X              namecmp2.o
X	cc -o wirewrap initialize.o readin.o main.o setptr.o \
X              setrowandcol.o sort1.o getwired.o output3.o \
X              getwirelen.o output1.o insertx.o mywrite.o \
X              header1.o sort2.o output2.o header2.o mywrite2.o \
X              test.o cnvtnum.o namecmp.o gettoken.o \
X              insertname.o namecmp2.o -lm
X
Xclean:
X	rm -f *.o
X
Xpackage:
X	packmail -hREADME -t'wirewrap program' `/bin/cat PACKINGLIST`
X
Xgettoken.o: wirewrap.h
Xgetwired.o: wirewrap.h
Xgetwirelen.o: wirewrap.h
Xinitialize.o: wirewrap.h
Xinsertname.o: wirewrap.h
Xmain.o: wirewrap.h
Xmywrite.o: wirewrap.h
Xmywrite2.o: wirewrap.h
Xnamecmp.o: wirewrap.h
Xnamecmp2.o: wirewrap.h
Xoutput1.o: wirewrap.h
Xoutput2.o: wirewrap.h
Xoutput3.o: wirewrap.h
Xreadin.o: wirewrap.h
Xsetptr.o: wirewrap.h
Xsetrowandcol.o: wirewrap.h
Xsort1.o: wirewrap.h
Xsort2.o: wirewrap.h
Xtest.o: wirewrap.h
/
echo 'x - PACKINGLIST'
sed 's/^X//' > PACKINGLIST << '/'
XMakefile
XPACKINGLIST
XREADME
Xautocal
Xautocal.listing
Xcnvtnum.c
Xgettoken.c
Xgetwired.c
Xgetwirelen.c
Xheader1.c
Xheader2.c
Xinitialize.c
Xinsertname.c
Xinsertx.c
Xmain.c
Xmywrite.c
Xmywrite2.c
Xnamecmp.c
Xnamecmp2.c
Xoutput1.c
Xoutput2.c
Xoutput3.c
Xreadin.c
Xsetptr.c
Xsetrowandcol.c
Xsort1.c
Xsort2.c
Xtest.c
Xwirewrap.1
Xwirewrap.h
/
echo 'x - README'
sed 's/^X//' > README << '/'
XThis is a release of my wirewrap program.  It has been used
Xto make several boards here, and seems to be pretty reliable. 
XIt was written on a Masscomp MC500, but I don't think there
Xare any serious machine dependencies in it.  (But then again,
XI'm often suprised by how easy it is to inadvertantly write
Xmachine dependent code.)
X
XI'd like to hear some bug reports and success stories.  I will
Xtry to send out bug fixes as quickly as I can.
X
XAs usual, unpack all parts by running through sh, then run make.
X
XUnix Wirewrap Source Code:
Xcnvtnum.c	gettoken.c	getwired.c	getwirelen.c	header1.c
Xheader2.c	initialize.c	insertname.c	insertx.c	main.c
Xmywrite.c	mywrite2.c	namecmp.c	namecmp2.c	output1.c
Xoutput2.c	output3.c	readin.c	setptr.c	setrowandcol.c
Xsort1.c		sort2.c		test.c
X
X.h files:
X  wirewrap.h
X
XDocumentation:
X  wirewrap.1 README PACKINGLIST
X
XUnix wirewrap makefile:
X  Makefile
X
XTest Data:
X  autocal
X
XExample listing:
X  autocal.listing
X
X----
XBruce Karsh
XU. Wisc. Dept. Geology and Geophysics
X1215 W Dayton, Madison, WI 53706
X(608) 262-1697
X{ihnp4,seismo}!uwvax!geowhiz!karsh
/
echo 'x - autocal'
sed 's/^X//' > autocal << '/'
X/*
X**  Auto calibration circuitry for UW Digital recording packages.
X*/
X:chip	I/O-edge	1a	80	2	56	1	4
X	.	.	.	GAP4	.	.	.	.
X	10SEC	.	.	.	.	.	.	SKEY-	
X	.	.	.	.	.	.	.	.
X	.	.	.	TST+	.	.	.	.
X
X	.	.	.	.	.	.	.	g
X	.	.	.	.	.	.	.	.
X	bgld-	.	bcal+	.	.	.	.	.
X	.	.	.	PD3	.	.	.	.
X	.	.	.	.	.	.	.	.
X	.	.	.	.	.	.	.	.
X
X:chip	UPI/O	10a	1	1	37	53	4
X	Q
X
X:chip	RUN.FF1	8c	14	3	53	41	4
X	.	.	.	.	.	.	.
X	jamrun+	.	.	.	.	.	.
X
X:chip	RUN.FF2	2e	16	3	35	5	4
X	.	.	.	.	RON+	.	.	.
X	.	.	.	.	.	.	.	.
X
X:chip	Buffer.4050	2g	16	3	17	5	4
X	.	.	.	.	.	.	.	.
X	.	.	cal+	bcal+	.	gld-	bgld-	.
X
X:chip	count.4020	2h	16	3	8	5	4
X	.	q13	stop+	.	.	.	.	-
X	.	clk/2	calrun-	.	.	q10	.	+
X
X:chip	runff.4013	3g	14	3	17	11	4
X	calrun-	.	10SEC	g	jamrun-	stop+	-
X	stop+	calena+	g	Q	jamrun+	jamrun-	+
X
X:chip	or.4071	3h	14	3	8	11	4
X	mp	acal	cal+	seqi	calrun-	seqm	-
X	seqm	ap	apms	calena+	TST+	RON+	+
X
X:chip	and.4081	4g	14	3	17	17	4
X	SKEY-	TST+	gld-	mp	TST+	PD3	-
X	jamrun+	apms	acal	ap	q10	q13	+
X
X:chip	xor.4030	4h	14	3	8	17	4
X	seq4	seq12	seql	seqn	seql	seq6	-
X	seq1	seqn	seqm	clk	GAP4	g	+
X
X:chip	shift.4015	5g	16	3	17	23	4
X	clk	seq8	.	.	seq1	q13	seqi	-
X	clk	seq4	.	seq6	.	q13	seq4	+
X
X:chip	shift.4015	5h	16	3	8	23	4
X	clk	.	.	.	.	q13	seq8	-
X	clk	seq12	.	.	.	q13	seq12	+
X
X:chip	syncff.4013	6h	14	3	8	29	4
X	clk/2	clk/2-	clk	calrun-	clk/2-	g	-
X	g	g	g	g	.	.	+
X
X:SPECIAL
X	+	-
/
echo 'x - cnvtnum.c'
sed 's/^X//' > cnvtnum.c << '/'
X#include <ctype.h>
Xchar *cnvtnump; /* Pointer to next character to process. */
Xint cnvtnumv;   /* 1 if valid number, 0 otherwise. */
X/*************************************/
X/*  cnvtnum - convert ascii to int.  */
X/*  Works like atoi() except that it */
X/*  leaves the externel variables set*/
X/*  to help in error recovery.       */
X/*************************************/
Xcnvtnum(str)
Xchar *str;
X{
Xint sign=1;
Xint result=0;
Xcnvtnump = str;
Xcnvtnumv=0;
X
X/* Skip leading blanks. */
X
Xwhile(*cnvtnump == ' ' || *cnvtnump == '\t')cnvtnump++;
X
X/* Pick up leading sign. */
X
Xif(*cnvtnump == '+')
X  {
X  sign = 1;
X  *cnvtnump++;
X  }
Xelse if(*cnvtnump == '-')
X  {
X  sign = -1;
X  *cnvtnump++;
X  }
X
X/* Pick up digits. */
X
Xwhile(isdigit(*cnvtnump))
X  {
X  result=10*result+ (*cnvtnump-'0');
X  cnvtnump++;
X  cnvtnumv=1;
X  }
X
Xreturn(sign*result);
X}
/
echo 'x - gettoken.c'
sed 's/^X//' > gettoken.c << '/'
X#include <ctype.h>
X#include <stdio.h>
X#include "wirewrap.h"
X/*
X** gettoken - return a whitespace delimited token.
X**            Tokens are truncated at 79 characters.
X**	      Return code is zero if a token is
X**	      returned, otherwise an end of file
X**	      was reached and -1 is returned.
X*/
Xgettoken(token)
Xchar *token;
X{
Xchar chr;
Xint tokenptr;
Xstatic int firsttime=1;
Xstatic int nextchr;
Xint comment;
Xtokenptr=0;
Xtoken[tokenptr]=0;
Xcomment=0;
X
X/* If first time through, get a look-ahead character. */
X
Xif(firsttime == 1)
X  {
X  nextchr=getchar();
X  firsttime=0;
X  }
X
Xfor(;;)
X  {
X  /* Get a character from the input. */
X
X  if(nextchr == EOF)
X    chr=EOF;
X  else
X    {
X    chr=nextchr;
X    nextchr=getchar();
X    }
X
X  /* Test if start of a comment. */
X
X  if(chr == '/' && nextchr == '*')
X    {
X    nextchr = getchar();
X    comment = 1;
X    continue;
X    }
X
X  /* Test if end of a comment. */
X
X  if(chr == '*' && nextchr == '/' && comment == 1)
X    {
X    nextchr=getchar();
X    comment=0;
X    continue;
X    }
X
X  /* Test if EOF within a comment. */
X
X  if(chr == EOF && comment == 1)break;
X
X  /* Test if a newline char within a comment. */
X
X  if(chr == '\n' && comment == 1)
X    {
X    inputline++;
X    continue;
X    }
X
X  /* Test if any other character within a comment. */
X
X  if(comment == 1)continue;
X    
X  /* Process end of file. */
X
X  if(chr == EOF)break;
X
X  /* Process white space character. */
X
X  if(isspace(chr))
X    {
X
X    /* Process new line character. */
X    if(chr == '\n')
X      {
X      if(tokenptr != 0)
X
X        /* Process new line character which terminates a token */
X
X        ungetc(chr,stdin);
X      else
X
X        /* Process a new line character which does not terminate a token */
X
X        inputline++;
X      }
X
X  /* Process any white space character that terminates a token */
X
X    if(tokenptr != 0) return(0);
X
X  /* Process a white space character that doesn't terminate a token */
X
X    else continue;
X    }
X  else
X
X  /* Process a non white space charater */
X
X    if(tokenptr<79)
X      {
X
X      /* Process a non white space charater before the 79'th char of a token */
X
X      token[tokenptr]=chr;
X      tokenptr++;
X      token[tokenptr]=0;
X      }
X    else
X
X      /* Process a non white space character after the 79'th char of a token */
X
X      continue;
X  }
X
X/* Process end of file */
X
Xif(tokenptr==0)return(-1);else return(0);
X}
/
echo 'x - getwired.c'
sed 's/^X//' > getwired.c << '/'
X/**********************************************
X*  getwired - do the wire routing.            *
X*					      *
X*    When getwired is called, the signal list *
X*  is sorted in order by signalname.  This    *
X*  routine connects adjacent pins with the    *
X*  same signal name together.  Pins are conn- *
X*  nected together with either top to top     *
X*  wraps or bottom to bottom wraps everywhere.*
X*  The last wrap may really be wrapped as a   *
X*  top to bottom wrap if there is an odd num- *
X*  ber of pins in the string.  But it is still*
X*  represented as a top to top wrap.	      *
X**********************************************/
X
X#include "wirewrap.h"
X
Xgetwired()
X{
Xint indexlo,indexhi,count,i;
Xchar currentsignal[NAMELENGTH];
Xindexhi = 0;
Xwhile(indexhi < nextfree)
X  {
X  indexlo = indexhi;
X  indexhi = indexhi + 1;
X  for(i=0;i<NAMELENGTH;i++)
X    currentsignal[i] = pinarray[indexlo].signalname->signalname[i];
X  while((indexhi < nextfree) && 
X         !namecmp(pinarray[indexhi].signalname->signalname,currentsignal)
X        )indexhi++;
X  if(namecmp(currentsignal,NULLSIGNAL))
X    { 
X    count = indexlo;
X    while(count < indexhi-1)
X      {
X      pinarray[count].inner = count+1;
X      pinarray[count+1].inner = count;
X      count = count + 2;
X      }
X    count = indexlo + 1;
X    while(count < indexhi-1)
X      {
X      pinarray[count].outer = count+1;
X      pinarray[count+1].outer = count;
X      count = count + 2;
X      }
X    }
X  }
X}
/
echo 'x - getwirelen.c'
sed 's/^X//' > getwirelen.c << '/'
X#define sqr(a) ( (a)*(a) )
X#include <math.h>
X#include "wirewrap.h"
Xdouble getwirelength(row1,col1,row2,col2)
Xint row1,col1,row2,col2;
X{
Xdouble wlength;
X
X/* Compute straight line distance. */
X
Xwlength = .1 * sqrt((double) sqr(row1-row2)+sqr(col1-col2));
X
X/* Apply linear regression coefficients */
X
Xwlength = wlength * lengthfactor + pinpart;
X
X/* Round up to the nearest larger .5 inch */
X
Xwlength = wlength * 2 + 1;
Xwlength = (int) wlength;
Xwlength = wlength/2.0;
X
X/* Make sure that it is at least as long as the minimum length. */
X
Xif(wlength < minlength) wlength = minlength;
Xreturn(wlength);
X}
/
echo 'x - header1.c'
sed 's/^X//' > header1.c << '/'
Xheader1()
X{
Xchar outline[80];
X
Xoutline[0]=0;
Xinsertx("chip",outline,10);
Xinsertx("pin",outline,23);
Xinsertx("chip",outline,28);
Xprintf("%s\n",outline);
Xoutline[0]=0;
Xinsertx("name",outline,10);
Xinsertx("num",outline,23);
Xinsertx("position",outline,28);
Xinsertx("row col",outline,42);
Xprintf("%s\n",outline);
X}
/
echo 'x - header2.c'
sed 's/^X//' > header2.c << '/'
Xheader2()
X{
Xchar outline[80];
Xoutline[0]=0;
Xinsertx("signal",outline,1);
Xinsertx("pin",outline,14);
Xinsertx("inner wire",outline,18);
Xinsertx("outer wire",outline,39);
Xprintf("%s\n",outline);
Xoutline[0]=0;
Xinsertx("name ",outline,1);
Xinsertx("num",outline,14);
Xprintf("%s\n",outline);
X}
/
echo 'x - initialize.c'
sed 's/^X//' > initialize.c << '/'
X/*******************************************
X* initialize - initialize global variables *
X*******************************************/
X
X#include "wirewrap.h"
X
Xinitialize()
X{
Xchipleader = 0;
Xsiglistleader = 0;
Xnextfree = 0;
Xlinenum = 67;
Xinputline=1;
X}
/
echo 'x - insertname.c'
sed 's/^X//' > insertname.c << '/'
X#include "wirewrap.h"
Xinsertname(from,to,pos)
Xchar *from, *to;
Xint pos;
X{
Xchar *p;
Xint l;
X
X/* Pad with trailing blanks. */
X
Xl=strlen(to);
Xwhile(l<(pos-1))
X  {
X  to[l]=' ';
X  l++;
X  }
Xto[l]=0;
X
X/* Append the from string to the to string. */
X
Xl=pos-1;
Xfor(p=from; p-from < NAMELENGTH; p++)
X  {
X  to[l] = *p;
X  l++;
X  }
Xto[l]=0;
X}
/
echo 'x - insertx.c'
sed 's/^X//' > insertx.c << '/'
Xinsertx(from,to,pos)
Xchar *from, *to;
Xint pos;
X{
Xchar *p;
Xint l;
X
X/* Pad with trailing blanks. */
X
Xl=strlen(to);
Xwhile(l<(pos-1))
X  {
X  to[l]=' ';
X  l++;
X  }
Xto[l]=0;
X
X/* Append the from string to the to string. */
X
Xl=pos-1;
Xfor(p=from; *p != 0; p++)
X  {
X  to[l] = *p;
X  l++;
X  }
Xto[l]=0;
X}
/
echo 'x - main.c'
sed 's/^X//' > main.c << '/'
X#include "wirewrap.h"
Xmain()
X{
Xinitialize();
Xreadin();	/* Read the input file. */
X
X#ifdef DEBUG
X  printf("Dump of pin array after inputting data\n");
X  test();
X#endif
X
Xsort1();                 /* Sort by signal name. */
X
X#ifdef DEBUG
X  printf("Dump of pin array after sort by signal name\n");
X  test();
X#endif
X
Xgetwired();              /* Wire the pins togther. */
X
X#ifdef DEBUG
X  printf("Dump of pin array after doing the wiring.\n");
X  test();
X#endif
X
Xoutput1();              /* Output the first printout. (Chip side view) */
X
Xsort2();                /* Sort by (row,col). */
X
X#ifdef DEBUG
X  printf("Dump of pin array after sorting by (row,col)\n");
X  test();
X#endif
X
Xoutput2();             /* Output the second printout. (Pin side view) */
X
Xoutput3();             /* Output the third printout. (Wire lengths) */
X}
/
echo 'x - mywrite.c'
sed 's/^X//' > mywrite.c << '/'
X#include "wirewrap.h"
X
Xmywrite(outline)
Xchar *outline;
X{
Xif(linenum > 60)
X  {
X  printf("");
X  header1();
X  linenum=3;
X  }
X  printf("%s\n",outline);
X  linenum++;
X}
/
echo 'x - mywrite2.c'
sed 's/^X//' > mywrite2.c << '/'
X#include "wirewrap.h"
X
Xmywrite2(outline)
Xchar *outline;
X{
Xif(linenum > 60)
X  {
X  printf("");
X  header2();
X  linenum=3;
X  }
X  printf("%s\n",outline);
X  linenum++;
X}
/
echo 'x - namecmp.c'
sed 's/^X//' > namecmp.c << '/'
X/*
X** namecmp - compare two names.  Works like strcmp()
X*/
X#include "wirewrap.h"
Xnamecmp(a,b)
Xchar a[NAMELENGTH],b[NAMELENGTH];
X{
Xint i;
Xfor(i=0;i<NAMELENGTH;i++)
X  {
X  if(a[i]<b[i])return(-1);
X  else if (a[i]>b[i])return(1);
X  }
Xreturn(0);
X}
/
echo 'x - namecmp2.c'
sed 's/^X//' > namecmp2.c << '/'
X/*
X** namecmp2 - compare two names.  Works like strcmp()
X**            This is the same as namecmp except that
X**	      namecmp2 ignores case.
X*/
X#include "wirewrap.h"
Xnamecmp2(a,b)
Xchar a[NAMELENGTH],b[NAMELENGTH];
X{
Xint i;
Xfor(i=0;i<NAMELENGTH;i++)
X  {
X  if(tolower(a[i])<tolower(b[i]))return(-1);
X  else if (tolower(a[i])>tolower(b[i]))return(1);
X  }
Xreturn(0);
X}
/
echo 'x - output1.c'
sed 's/^X//' > output1.c << '/'
X#include "wirewrap.h"
Xoutput1()
X{
Xchar currentsig[12],outline[80], sig[12], wrap, newstring[80];
Xint count, i;
X
Xcurrentsig[0] = 0;
Xcount = 0;
Xoutline[0] = 0;
Xwhile(count < nextfree)
X  {
X  for(i=0;i<12;i++)sig[i] = pinarray[count].signalname->signalname[i];
X  if(namecmp(sig,currentsig))
X    {
X    insertname(sig,outline,1);
X    if((pinarray[count].signalname->special) != 0)
X      insertx("Special",outline,2+NAMELENGTH);
X    mywrite(outline);
X    outline[0]=0;
X    for(i=0;i<12;i++)currentsig[i]=sig[i];
X    wrap='T';
X    }
X  if(wrap == 'T')wrap='B'; else wrap='T';
X  newstring[0]=0;
X  insertname(pinarray[count].mychip->name,outline,10);
X  sprintf(newstring,"%d",pinarray[count].pinnum);
X  insertx(newstring,outline,12+NAMELENGTH);
X  insertname(pinarray[count].mychip->position,outline,17+NAMELENGTH);
X  sprintf(newstring,"(%d,%d)",pinarray[count].row, pinarray[count].col);
X  insertx(newstring,outline,30+NAMELENGTH);
X  if(namecmp(sig,NULLSIGNAL) && (!pinarray[count].signalname->special))
X    insertx(wrap,outline,39+NAMELENGTH);
X  mywrite(outline);
X  outline[0] = 0;
X  count++;
X  }
X}
/
echo 'x - output2.c'
sed 's/^X//' > output2.c << '/'
X#include "wirewrap.h"
X
Xoutput2()
X{
Xint oldrow,oldcol,runflag,count,already,specialsig;
Xint innerptr,innerwrap,outerptr,outerwrap;
Xchar tempstr[80],outline[80];
Xdouble wlength,getwirelength();
Xprintf("");
Xheader2();
Xoldrow = -100;
Xoldcol = -100;
Xlinenum = 3;
Xrunflag = 0;
Xfor(count=0;count<nextfree;count++)
X  {
X  outline[0]=0;
X  if((pinarray[count].row == oldrow) &&
X   (pinarray[count].col == (oldcol + 1)))
X    runflag = 1;
X  else
X    {
X    if(runflag != 0)
X      {
X      mywrite2(" ");
X      runflag=0;
X      }
X    }
X  oldrow = pinarray[count].row;
X  oldcol = pinarray[count].col;
X
X  /* SET UP THE SIGNAL NAME AND PIN NUMBER */
X
X  insertname(pinarray[count].signalname->signalname,outline,1);
X  sprintf(tempstr,"%d",pinarray[count].pinnum);
X  insertx(tempstr,outline,14);
X
X  /* FIGURE SOME STUFF OUT FOR THE INNER WRAP */
X
X  innerptr = pinarray[count].inner;
X  innerwrap = (pinarray[count].inner != -1);
X  if(innerwrap)
X    already = (pinarray[count].inner < count);
X  else
X    already = 0;
X  specialsig = pinarray[count].signalname->special;
X
X  /* SET UP LENGTH OF INNER WIRE */
X
X  if(specialsig)
X    insertx("SPEC",outline,18);
X  if(already && (! specialsig))
X    insertx("TEST",outline,18);
X  if(innerwrap && (! already) && (! specialsig))
X    {
X    wlength=getwirelength(pinarray[count].row,pinarray[count].col,
X                  pinarray[innerptr].row,pinarray[innerptr].col);
X    wlength = (double) ( (int) (wlength * 10) ) / 10;
X    sprintf(tempstr,"%.1f",wlength);
X    insertx(tempstr,outline,18);
X    }
X
X  /* SET UP ROW1 AND COL1 */
X
X  sprintf(tempstr,"%d",pinarray[count].row);
X  insertx(tempstr,outline,23);
X  insertx(",",outline,strlen(outline)+1);
X  sprintf(tempstr,"%d",pinarray[count].col);
X  insertx(tempstr,outline,strlen(outline)+1);
X
X  /* SET UP ROW2 AND COL2 */
X
X  if((!specialsig) && innerwrap)
X    {
X    insertx(" ",outline,strlen(outline)+1);
X    sprintf(tempstr,"%d",pinarray[innerptr].row);
X    insertx(tempstr,outline,strlen(outline)+1);
X    insertx(",",outline,strlen(outline)+1);
X    sprintf(tempstr,"%d",pinarray[innerptr].col);
X    insertx(tempstr,outline,strlen(outline)+1);
X    }
X
X  /* FIGURE SOME STUFF OUT FOR THE OUTER WRAP */
X
X  outerptr = pinarray[count].outer;
X  outerwrap =(pinarray[count].outer != -1);
X  if(outerwrap)
X    already=(pinarray[count].outer < count);
X  else
X    already=0;
X  specialsig = pinarray[count].signalname->special;
X
X  /* SET UP LENGTH OF OUTER WIRE */
X
X  if(specialsig)
X    insertx("SPEC",outline,39);
X  if(already && (!specialsig))
X    insertx("TEST",outline,39);
X  if(outerwrap && (!already) && (!specialsig))
X    {
X    wlength=getwirelength(pinarray[count].row,pinarray[count].col,
X                  pinarray[outerptr].row,pinarray[outerptr].col);
X    wlength = (double) ( (int) (wlength * 10) ) / 10;
X    sprintf(tempstr,"%.1f",wlength);
X    insertx(tempstr,outline,39);
X    }
X
X  /* SET UP ROW1 AND COL1 */
X
X  sprintf(tempstr,"%d",pinarray[count].row);
X  insertx(tempstr,outline,44);
X  insertx(",",outline,strlen(outline)+1);
X  sprintf(tempstr,"%d",pinarray[count].col);
X  insertx(tempstr,outline,strlen(outline)+1);
X
X  /* SET UP ROW2 AND COL2 */
X
X  if((!specialsig) && outerwrap)
X    {
X    insertx(" ",outline,strlen(outline)+1);
X    sprintf(tempstr,"%d",pinarray[outerptr].row);
X    insertx(tempstr,outline,strlen(outline)+1);
X    insertx(",",outline,strlen(outline)+1);
X    sprintf(tempstr,"%d",pinarray[outerptr].col);
X    insertx(tempstr,outline,strlen(outline)+1);
X    }
X
X  /* SET UP EMPTY/FULL FLAG */
X
X  if((!specialsig) && outerwrap)
X    {
X    insertx(" ",outline,strlen(outline)+1);
X    if(pinarray[outerptr].inner == -1)
X      insertx("E",outline,strlen(outline)+1);
X    else
X      insertx("F",outline,strlen(outline)+1);
X    }
X  mywrite2(outline);
X  }
X}
/
echo 'x - output3.c'
sed 's/^X//' > output3.c << '/'
X#include "wirewrap.h"
X
Xoutput3()
X{
Xdouble wirelength,getwirelength();
Xint longctr, i, len, total, ctr[21];
X
X/* Zero out counters */
X
X        longctr = 0;
X        for(i=2;i<=20;i++)ctr[i]=0;
X        
X/* Print heading. */
X
X        printf("\014");
X        printf(" WIRE LENGTH SUMMARY\n");
X        printf(" -------------------\n");
X        printf("\n");
X        printf(" Wire   Number\n");
X        printf("Length   Used\n");
X        
X/* Wire counting loop. */
X        
X        for(i=0; i<nextfree;i++)
X        {
X        
X        /* Count inner wire length*/
X        
X                if( (pinarray[i].inner != -1) &&
X                (!pinarray[i].signalname->special) )
X                  {
X                  wirelength=getwirelength(pinarray[i].row,pinarray[i].col,
X                                pinarray[pinarray[i].inner].row,
X                                pinarray[pinarray[i].inner].col);
X                  len=wirelength / 0.5 + 0.1;
X                  if(len > 20)
X                    longctr++;
X                  else
X                    ctr[len]++;
X                  }
X        
X        /* Count outer wire length*/
X                
X                if( (pinarray[i].outer != -1 ) &&
X                (!pinarray[i].signalname->special) )
X                  {
X                  wirelength=getwirelength(pinarray[i].row,pinarray[i].col,
X                                pinarray[pinarray[i].outer].row,
X                                pinarray[pinarray[i].outer].col);
X                  len=wirelength / 0.5 + 0.1;
X                  if(len > 20)
X                    longctr++;
X                  else
X                    ctr[len]++;
X                  }
X        }
X
X        /* Only count each wire once. */
X                for(i=2;i<=20;i++)ctr[i]=ctr[i]/2;
X                longctr=longctr/2;
X        
X        /* Make listing. */
X        
X                for(i=2;i<=20;i++)
X                  {
X                  if(ctr[i] > 0)
X                     {
X		     printf("%-9.1f %d\n",(.5*i),ctr[i]);
X                     }
X                  }
X        if(longctr > 0)
X          {
X          printf("> 10.0 %d\n",longctr);
X          }
X        
X        /* Total up how many wires used. */
X        
X        total=0;
X        for(i=2;i<=20;i++)total+=ctr[i];
X        total += longctr;
X        printf("Total number of wires used: %d\n",total);
X}
/
echo 'x - setrowandcol.c'
sed 's/^X//' > setrowandcol.c << '/'
X/*********************************************************/
X/*                                                       */
X/* setrowandcol: sets up the row and column field of the */
X/* pin list entry based on the pin orientation, width,   */
X/* pincount and (row1,col1).                             */
X/*                                                       */
X/*********************************************************/
X
X#include "wirewrap.h"
X
Xsetrowandcol(thispin)
Xstruct pin *thispin;
X{
Xint width,row1,col1,pinsrow,pincount;
X/*
X** Pick up width, (row1,col1), and pincount for this chip.
X*/
Xwidth = (thispin -> mychip) -> width;
Xrow1 = (thispin -> mychip) -> row1;
Xcol1 = (thispin -> mychip) -> col1;
Xpincount = (thispin -> mychip) -> pincount;
X/*
X** Process SIPs (single inline packages).  These are entered as 
X** having a width of zero.  All other chips are assumed to be
X** DIPs (dual inline packages).
X** An n pin SIP has n pins per row.  An n pin DIP has n/2 pins per row.
X*/
Xif(width == 0)
X  pinsrow = pincount;
Xelse
X  pinsrow = pincount/2;
X/*
X** Following is the calculation of row and column numbers for each
X** of the four orientations.
X*/
Xswitch ((thispin -> mychip) -> orientation)
X  {
X  case 1: if(thispin -> pinnum > pinsrow)
X             {
X             thispin -> row = row1 + width;
X             thispin -> col = col1 + pincount - thispin -> pinnum;
X             }
X           else
X             {
X             thispin -> row = row1;
X             thispin -> col = col1 + thispin -> pinnum - 1;
X             }
X           break;
X  case 2 : if(thispin -> pinnum > pinsrow)
X             {
X             thispin -> row = row1 + pincount - thispin -> pinnum;
X             thispin -> col = col1 - width;
X             }
X           else
X             {
X             thispin -> row = row1 + thispin -> pinnum - 1;
X             thispin -> col = col1;
X             }
X           break;
X  case 3 : if(thispin -> pinnum > pinsrow)
X             {
X             thispin -> row = row1 - width;
X             thispin -> col = col1 - pincount + thispin -> pinnum;
X             }
X           else
X             {
X             thispin -> row = row1;
X             thispin -> col = col1 - thispin -> pinnum + 1;
X             }
X           break;
X  case 4 : if(thispin -> pinnum > pinsrow)
X             {
X             thispin -> row = row1 - pincount + thispin -> pinnum;
X             thispin -> col = col1 + width;
X             }
X           else
X             {
X             thispin -> row = row1 - thispin -> pinnum + 1;
X             thispin -> col = col1;
X             }
X  }
X}
/
echo 'x - sort1.c'
sed 's/^X//' > sort1.c << '/'
X/*******************************************************
X*  Batcher's method sort by signalname.		       *
X*  Reference: Knuth Sorting & Searching, Section 5.2.2 *
X*******************************************************/
X
X#include "wirewrap.h"
X
Xsort1()
X{
Xstruct pin tempin;
Xint p,q,r,d,n,i,j,m;
X
X/*Find the 'middle' of the array.*/
Xn = nextfree;
Xi = 1;
Xj = 2;
Xwhile(j < n)
X  {
X  i = j;
X  j = j+j;
X  }
Xm = i;  /*m is the middle of the array*/
X        
X/* Batcher's method*/
Xp = m;
Xwhile(p > 0)
X  {
X  q = m;
X  r = 0;
X  d =p;
X  for(;;)
X    {
X    for(i= 0;i < n-d;i++)
X      {
X      if ( (i&p) == r)
X        if(namecmp(pinarray[i].signalname->signalname,
X           pinarray[i+d].signalname->signalname)>0)
X          {
X          tempin = pinarray[i+d];
X          pinarray[i+d] = pinarray[i];
X          pinarray[i] = tempin;
X          }
X      }
X      if(p != q)
X        {
X        d = q - p;
X        q = q/2;
X        r = p;
X        }
X      else 
X        break;
X    }
X  p = p/2;
X  }
X}
/
echo 'x - sort2.c'
sed 's/^X//' > sort2.c << '/'
X/*******************************************************
X*  Batcher's method sort by signalname.		       *
X*  Reference: Knuth Sorting & Searching, Section 5.2.2 *
X*******************************************************/
X
X#include "wirewrap.h"
X
Xsort2()
X{
Xstruct pin tempin;
Xint p,q,r,d,n,i,j,m;
Xint a,b,innera,innerb,outera,outerb;
X
X/*Find the 'middle' of the array.*/
Xn = nextfree;
Xi = 1;
Xj = 2;
Xwhile(j < n)
X  {
X  i = j;
X  j = j+j;
X  }
Xm = i;  /*m is the middle of the array*/
X        
X/* Batcher's method*/
Xp = m;
Xwhile(p > 0)
X  {
X  q = m;
X  r = 0;
X  d =p;
X  for(;;)
X    {
X    for(i= 0;i < n-d;i++)
X      {
X      if ( (i&p) == r)
X        if(   (pinarray[i].row >  pinarray[i+d].row) 
X          || ((pinarray[i].row == pinarray[i+d].row)
X          &&  (pinarray[i].col >  pinarray[i+d].col)))
X          {
X          /* First decide which two to swap. */
X          a=i;
X          b=i+d;
X          /* Then decide which ones reference them. */
X          innera = pinarray[a].inner;
X          outera = pinarray[a].outer;
X          innerb=pinarray[b].inner;
X          outerb=pinarray[b].outer;
X          /* Update those. */
X          if(innera != -1)pinarray[innera].inner=b;
X          if(outera != -1)pinarray[outera].outer=b;
X          if(innerb != -1)pinarray[innerb].inner=a;
X          if(outerb != -1)pinarray[outerb].outer=a;
X          /* Now make the swap. */
X          tempin = pinarray[b];
X          pinarray[b] = pinarray[a];
X          pinarray[a] = tempin;
X          }
X      }
X      if(p != q)
X        {
X        d = q - p;
X        q = q/2;
X        r = p;
X        }
X      else 
X        break;
X    }
X  p = p/2;
X  }
X}
/
echo 'x - test.c'
sed 's/^X//' > test.c << '/'
X#include "wirewrap.h"
X#ifdef DEBUG
X
Xtest()
X{
Xint i;
Xfor(i=0; i<nextfree;i++)
X  {
X  printf("Printing pin %d\n",i);
X  printf(" Location: (%d,%d) Inner: %d Outer: %d %s\n",pinarray[i].row,
X         pinarray[i].col, pinarray[i].inner, pinarray[i].outer,
X         pinarray[i].signalname->signalname);
X  }
X}
X#endif
/
echo 'x - wirewrap.h'
sed 's/^X//' > wirewrap.h << '/'
X/***********************************************************/
X/*                                                         */
X/*  wirewrap: Wirewrap PC board Routing and documentation  */
X/*            generation system                            */
X/*                                                         */
X/***********************************************************/
X
X#include <stdio.h>
X#define minlength 1.5
X#define pinpart 0.626
X#define lengthfactor 1.01674
X#define numpins 1500     /* Maximum number of pins program can handle */
X#define NAMELENGTH 12    /* Number of chars in a signal name, chip name,
X                            or a chip position. */
X/* Following token definitions must be at least NAMELENGTH bytes long */
X#define NULLSIGNAL    ".            "
X#define CHIPTOKEN     ":CHIP        "
X#define SPECIALTOKEN  ":SPECIAL     "
X
X/* Important structures used throughout the program */
X
Xstruct signallist           /* One entry for every signal */
X  {
X  char signalname[NAMELENGTH];
X  struct signallist *succ;
X  char special;
X  }*siglistleader;
X
Xstruct chip                /* One entry for every chip */
X  {
X  char name[NAMELENGTH];
X  char position[NAMELENGTH];
X  unsigned int pincount, width, row1, col1, orientation;
X  struct chip *succ;
X  }*chipleader;
X
Xstruct pin                  /* One entry for every pin */
X  {
X  struct signallist *signalname;
X  struct chip *mychip;
X  unsigned int pinnum;
X  unsigned int row,col;
X  int inner,outer;
X  }*pinptr;
X
X/* Global variables */
X
Xstruct pin pinarray[numpins];  /* Used pin list */
Xint nextfree;                  /* Index of next free entry in the pin list */
Xint linenum;                   /* Line number within the page that the output
X                                  listing is at */
Xint inputline;		       /* Line number in the input file. */
X/* #define DEBUG  /* Turns on extra debugging output. */
/
echo 'Part 02 of wirewrap program complete.'
exit