00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <stdio.h>
00025
00026 #include "signals.hh"
00027 #include "sigtype.hh"
00028 #include "sigtyperules.hh"
00029
00030
00031 #if 0
00032 void printSigType (Tree tp)
00033 {
00034 Tree t0;
00035 int n, v, c;
00036
00037 if (isTableType(tp, t0)) {
00038 printf("table-of ");
00039 printSigType(t0);
00040 } else if (isSigType(tp, &n, &v, &c)) {
00041 putchar("NR"[n]);
00042 putchar("KB S"[v]);
00043 putchar("CI X"[c]);
00044
00045 } else {
00046 printf("unknown");
00047 }
00048 }
00049
00050 void printSigTypeList (Tree l)
00051 {
00052 char sep = '(';
00053
00054 do {
00055 putchar(sep); sep = ',';
00056 printSigType(hd(l));
00057 l = tl(l);
00058 } while (isList(l));
00059
00060 putchar(')');
00061 }
00062 #endif
00063
00064 void printSigType (int n, int v, int c)
00065 {
00066 putchar("NR"[n]);
00067 putchar("KB S"[v]);
00068 putchar("CI X"[c]);
00069 }
00070
00071 const char* binopname[]= {
00072 "+", "-", "*", "/", "%",
00073 "<<", ">>",
00074 ">", "<", ">=", "<=", "==", "!=",
00075 "&", "|", "^"
00076 };
00077
00078 int binopprec[]= {
00079 2, 2, 3, 3, 3,
00080 1, 1,
00081 1, 1, 1, 1, 1, 1,
00082 1, 1, 1
00083 };
00084
00085 void printSignal(Tree sig, FILE* out, int prec)
00086 {
00087 int i;
00088 float r;
00089 Tree x, y, z, le, id;
00090
00091 if ( isSigInt(sig, &i) ) { fprintf(out, "%d", i); }
00092 else if ( isSigReal(sig, &r) ) { fprintf(out, "%f", r); }
00093 else if ( isSigInput(sig, &i) ) { fprintf(out, "IN%d", i); }
00094 else if ( isSigOutput(sig, &i, x) ) { fprintf(out, "OUT%d := ", i); printSignal(x, out, 0); }
00095
00096 else if ( isSigBinOp(sig, &i, x, y) ) {
00097 if (prec > binopprec[i]) fputs("(", out);
00098 printSignal(x,out,binopprec[i]); fputs(binopname[i], out); printSignal(y, out, binopprec[i]);
00099 if (prec > binopprec[i]) fputs(")", out);
00100 }
00101 else if ( isSigDelay1(sig, x) ) { fputs("mem(", out); printSignal(x,out,0); fputs(")", out); }
00102 else if ( isSigPrefix(sig, x, y) ) { fputs("prefix(", out); printSignal(x,out,0); fputs(",", out); printSignal(y,out,0); fputs(")", out); }
00103 else if ( isSigAttach(sig, x, y) ) { fputs("attach(", out); printSignal(x,out,0); fputs(",", out); printSignal(y,out,0); fputs(")", out); }
00104 else if ( isSigFixDelay(sig, x, y) ) {
00105 if (prec > 4) fputs("(", out);
00106 printSignal(x,out,4); fputs("@", out); printSignal(y, out, 4);
00107 if (prec > 4) fputs(")", out);
00108 }
00109
00110 else if ( isProj(sig, &i, x) ) { printSignal(x,out,prec); fprintf(out, "#%d", i); }
00111 else if ( isRef(sig, i) ) { fprintf(out, "$%d", i); }
00112 else if ( isRef(sig, x) ) { print(x, out); }
00113 else if ( isRec(sig, le)) { fputs("\\_.", out); printSignal(le, out, prec); }
00114 else if ( isRec(sig, x, le)) { fputs("\\", out); print(x,out); fputs(".", out); printSignal(le, out, prec); }
00115
00116 else if ( isSigTable(sig, id, x, y) ) { fputs("table(", out); printSignal(x,out,0); fputc(',', out); printSignal(y,out,0); fputc(')', out); }
00117 else if ( isSigWRTbl(sig, id, x, y, z) ){ printSignal(x,out,0); fputc('[',out); printSignal(y,out,0); fputs("] := (", out); printSignal(z,out,0); fputc(')', out); }
00118 else if ( isSigRDTbl(sig, x, y) ) { printSignal(x,out,0); fputc('[', out); printSignal(y,out,0); fputc(']', out); }
00119
00120 else if ( isSigGen(sig, x) ) { printSignal(x,out,prec); }
00121
00122 else if ( isSigIntCast(sig, x) ) { fputs("int(", out); printSignal(x,out,0); fputs(")", out); }
00123 else if ( isSigFloatCast(sig, x) ) { fputs("float(", out); printSignal(x,out,0); fputs(")", out); }
00124
00125 else if (isList(sig)) {
00126 char sep = '{';
00127 do {
00128 fputc(sep, out);
00129 printSignal(hd(sig), out, 0);
00130 sep=',';
00131 sig = tl(sig);
00132 } while (isList(sig));
00133 fputc('}', out);
00134 }
00135 else
00136 print(sig, out);
00137 }