Annotation of researchv10no/cmd/vsw/switch.c, revision 1.1

1.1     ! root        1: #include       <libc.h>
        !             2: #include       <fio.h>
        !             3: #include       "crossbar.h"
        !             4: #include       "switch.h"
        !             5: 
        !             6: extern int verbose;
        !             7: 
        !             8: Switch::Switch(char *nam, int n)
        !             9: {
        !            10:        int i;
        !            11: 
        !            12:        name = nam;
        !            13:        nwires = n;
        !            14:        maxlines = 0;
        !            15:        for(i = 0; i < MAXLABEL; i++)
        !            16:                lines[i][0] = lines[i][1] = 0;
        !            17: }
        !            18: 
        !            19: void
        !            20: Switch::add(int inout, char label, char *n1, char *n2, Crossbar *c, int l)
        !            21: {
        !            22:        int n = labeltoint(label);
        !            23: 
        !            24:        if(n > maxlines)
        !            25:                maxlines = n;
        !            26:        if(lines[n][inout])
        !            27:                fprint(2, "warning: redefining label %s.%c\n", name, label);
        !            28:        lines[n][inout] = new Line(label, n1, n2, c, l);
        !            29: }
        !            30: 
        !            31: void
        !            32: Switch::reinit()
        !            33: {
        !            34: }
        !            35: 
        !            36: void
        !            37: Switch::describe()
        !            38: {
        !            39:        int imax, omax, n, i;
        !            40:        char bi[256], bo[256];
        !            41: 
        !            42:        if(verbose)
        !            43:                Fprint(1, "%s video switch:\n", name);
        !            44:        imax = 6, omax = 7;     /* inputs/outputs */
        !            45:        for(i = 0; i <= maxlines; i++){
        !            46:                n = lines[i][0]->pr(i, bi, 0);
        !            47:                if(n > imax) imax = n;
        !            48:                n = lines[i][1]->pr(i, bi, 0);
        !            49:                if(n > omax) omax = n;
        !            50:        }
        !            51:        blank(1, n = (imax-6)/2);
        !            52:        Fprint(1, "inputs");
        !            53:        blank(1, imax+3+(omax-7)/2-n-6);
        !            54:        Fprint(1, "outputs\n");
        !            55:        for(i = 0; i <= maxlines; i++){
        !            56:                lines[i][0]->pr(i, bi, imax+3);
        !            57:                lines[i][1]->pr(i, bo, 0);
        !            58:                Fprint(1, "%s%s\n", bi, bo);
        !            59:        }
        !            60: }
        !            61: 
        !            62: void
        !            63: Switch::pr(char opt)
        !            64: {
        !            65:        int i, j, l[50], k;
        !            66:        Crossbar *c[50];
        !            67:        Line *lp, *ll;
        !            68:        char buf[256];
        !            69:        int didit;
        !            70: 
        !            71:        if(!verbose)
        !            72:                Fprint(1, "-%c", opt);
        !            73:        for(i = 0; i <= maxlines; i++)
        !            74:                if(ll = lines[i][0]){
        !            75:                        if(k = ll->c->map(ll->line, c, l)){
        !            76:                                didit = 0;
        !            77:                                for(j = 0; c[j]; j++)
        !            78:                                        if((k = lineofcl(1, c[j], l[j])) >= 0){
        !            79:                                                if(didit == 0){
        !            80:                                                        if(verbose)
        !            81:                                                                Fprint(1, "%s[i%c] ==>", ll->name[0], ll->label);
        !            82:                                                        didit = 1;
        !            83:                                                }
        !            84:                                                lp = lines[k][1];
        !            85:                                                if(verbose)
        !            86:                                                        Fprint(1, " %s[o%c]", lp->name[0], lp->label);
        !            87:                                                else
        !            88:                                                        Fprint(1, " %c%c", lines[i][1]->label, lp->label);
        !            89:                                        }
        !            90:                                if(didit && verbose)
        !            91:                                        Fprint(1, "\n");
        !            92:                        }
        !            93:                }
        !            94:        if(!verbose)
        !            95:                Fprint(1, "\n");
        !            96: }
        !            97: 
        !            98: void
        !            99: Switch::connect(char input, char output)
        !           100: {
        !           101:        int i, o;
        !           102:        Line *lp;
        !           103: 
        !           104:        i = labeltoint(input);
        !           105:        o = labeltoint(output);
        !           106:        lp = lines[i][0];
        !           107:        lp->c->connect(lp->line, lines[o][1]->c, lines[o][1]->line, nwires);
        !           108: }
        !           109: 
        !           110: int
        !           111: Switch::lineofcl(int output, Crossbar *c, int l)
        !           112: {
        !           113:        int i;
        !           114:        register Line *lp;
        !           115: 
        !           116:        for(i = 0; i <= maxlines; i++){
        !           117:                lp = lines[i][output];
        !           118:                if((lp->c == c) && (lp->line == l))
        !           119:                        return(i);
        !           120:        }
        !           121:        return(-1);
        !           122: }
        !           123: 
        !           124: int
        !           125: labeltoint(char label)
        !           126: {
        !           127:        if((label >= '0') && (label <= '9'))
        !           128:                return(label-'0');
        !           129:        if((label >= 'a') && (label <= 'z'))
        !           130:                return((label-'a')+10);
        !           131:        fprint(2, "bad arg to labeltoint '%c'\n", label);
        !           132:        abort();
        !           133:        return(0);
        !           134: }
        !           135: 
        !           136: char
        !           137: inttolabel(int i)
        !           138: {
        !           139:        if((i >= 0) && (i < MAXLABEL))
        !           140:                return("0123456789abcdefghijklmnopqrstuvwxyz"[i]);
        !           141:        fprint(2, "bad arg to inttolabel %d\n", i);
        !           142:        abort();
        !           143:        return(0);
        !           144: }
        !           145: 
        !           146: void
        !           147: blank(int fd, int n)
        !           148: {
        !           149:        while(n-- > 0)
        !           150:                Fputc(fd, ' ');
        !           151: }
        !           152: 
        !           153: #include       <sys/filio.h>
        !           154: #include       <sys/ttyio.h>
        !           155: #include       <sysent.h>
        !           156: #include       <ipc.h>
        !           157: 
        !           158: int
        !           159: opendk(char *name)
        !           160: {
        !           161:        int rfs;
        !           162:        char buf[256];
        !           163:        struct sgttyb vvec;
        !           164:        extern int tty_ld, buf_ld;
        !           165: 
        !           166:        sprint(buf, "/cs/dk!%s", name);
        !           167:        rfs = ipcopen(buf, "light");
        !           168:        if(rfs < 0){
        !           169:                perror(buf);
        !           170:                exit(1);
        !           171:        }
        !           172:        ioctl(rfs, FIOPUSHLD, &buf_ld);
        !           173:        if(ioctl(rfs, FIOLOOKLD, 0) != tty_ld){
        !           174:                if(ioctl(rfs, FIOPUSHLD, &tty_ld) < 0){
        !           175:                        perror("tty_ld");
        !           176:                        exit(1);
        !           177:                }
        !           178:        }
        !           179:        vvec.sg_flags = RAW;
        !           180:        vvec.sg_erase = 0;
        !           181:        vvec.sg_kill = 0;
        !           182:        if(ioctl(rfs, TIOCSETP, &vvec) < 0){
        !           183:                perror("ioctl");
        !           184:                exit(1);
        !           185:        }
        !           186:        return(rfs);
        !           187: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.