|
|
researchv10 Norman
#include <libc.h>
#include <fio.h>
#include "crossbar.h"
#include "switch.h"
extern int verbose;
Switch::Switch(char *nam, int n)
{
int i;
name = nam;
nwires = n;
maxlines = 0;
for(i = 0; i < MAXLABEL; i++)
lines[i][0] = lines[i][1] = 0;
}
void
Switch::add(int inout, char label, char *n1, char *n2, Crossbar *c, int l)
{
int n = labeltoint(label);
if(n > maxlines)
maxlines = n;
if(lines[n][inout])
fprint(2, "warning: redefining label %s.%c\n", name, label);
lines[n][inout] = new Line(label, n1, n2, c, l);
}
void
Switch::reinit()
{
}
void
Switch::describe()
{
int imax, omax, n, i;
char bi[256], bo[256];
if(verbose)
Fprint(1, "%s video switch:\n", name);
imax = 6, omax = 7; /* inputs/outputs */
for(i = 0; i <= maxlines; i++){
n = lines[i][0]->pr(i, bi, 0);
if(n > imax) imax = n;
n = lines[i][1]->pr(i, bi, 0);
if(n > omax) omax = n;
}
blank(1, n = (imax-6)/2);
Fprint(1, "inputs");
blank(1, imax+3+(omax-7)/2-n-6);
Fprint(1, "outputs\n");
for(i = 0; i <= maxlines; i++){
lines[i][0]->pr(i, bi, imax+3);
lines[i][1]->pr(i, bo, 0);
Fprint(1, "%s%s\n", bi, bo);
}
}
void
Switch::pr(char opt)
{
int i, j, l[50], k;
Crossbar *c[50];
Line *lp, *ll;
char buf[256];
int didit;
if(!verbose)
Fprint(1, "-%c", opt);
for(i = 0; i <= maxlines; i++)
if(ll = lines[i][0]){
if(k = ll->c->map(ll->line, c, l)){
didit = 0;
for(j = 0; c[j]; j++)
if((k = lineofcl(1, c[j], l[j])) >= 0){
if(didit == 0){
if(verbose)
Fprint(1, "%s[i%c] ==>", ll->name[0], ll->label);
didit = 1;
}
lp = lines[k][1];
if(verbose)
Fprint(1, " %s[o%c]", lp->name[0], lp->label);
else
Fprint(1, " %c%c", lines[i][1]->label, lp->label);
}
if(didit && verbose)
Fprint(1, "\n");
}
}
if(!verbose)
Fprint(1, "\n");
}
void
Switch::connect(char input, char output)
{
int i, o;
Line *lp;
i = labeltoint(input);
o = labeltoint(output);
lp = lines[i][0];
lp->c->connect(lp->line, lines[o][1]->c, lines[o][1]->line, nwires);
}
int
Switch::lineofcl(int output, Crossbar *c, int l)
{
int i;
register Line *lp;
for(i = 0; i <= maxlines; i++){
lp = lines[i][output];
if((lp->c == c) && (lp->line == l))
return(i);
}
return(-1);
}
int
labeltoint(char label)
{
if((label >= '0') && (label <= '9'))
return(label-'0');
if((label >= 'a') && (label <= 'z'))
return((label-'a')+10);
fprint(2, "bad arg to labeltoint '%c'\n", label);
abort();
return(0);
}
char
inttolabel(int i)
{
if((i >= 0) && (i < MAXLABEL))
return("0123456789abcdefghijklmnopqrstuvwxyz"[i]);
fprint(2, "bad arg to inttolabel %d\n", i);
abort();
return(0);
}
void
blank(int fd, int n)
{
while(n-- > 0)
Fputc(fd, ' ');
}
#include <sys/filio.h>
#include <sys/ttyio.h>
#include <sysent.h>
#include <ipc.h>
int
opendk(char *name)
{
int rfs;
char buf[256];
struct sgttyb vvec;
extern int tty_ld, buf_ld;
sprint(buf, "/cs/dk!%s", name);
rfs = ipcopen(buf, "light");
if(rfs < 0){
perror(buf);
exit(1);
}
ioctl(rfs, FIOPUSHLD, &buf_ld);
if(ioctl(rfs, FIOLOOKLD, 0) != tty_ld){
if(ioctl(rfs, FIOPUSHLD, &tty_ld) < 0){
perror("tty_ld");
exit(1);
}
}
vvec.sg_flags = RAW;
vvec.sg_erase = 0;
vvec.sg_kill = 0;
if(ioctl(rfs, TIOCSETP, &vvec) < 0){
perror("ioctl");
exit(1);
}
return(rfs);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.