|
FAUST compiler
0.9.9.6b8
|
00001 /************************************************************************ 00002 ************************************************************************ 00003 FAUST compiler 00004 Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale 00005 --------------------------------------------------------------------- 00006 This program is free software; you can redistribute it and/or modify 00007 it under the terms of the GNU General Public License as published by 00008 the Free Software Foundation; either version 2 of the License, or 00009 (at your option) any later version. 00010 00011 This program is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 GNU General Public License for more details. 00015 00016 You should have received a copy of the GNU General Public License 00017 along with this program; if not, write to the Free Software 00018 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00019 ************************************************************************ 00020 ************************************************************************/ 00021 00022 00023 00024 #include <stdio.h> 00025 00026 #include "signals.hh" 00027 #include "sigtype.hh" 00028 #include "sigtyperules.hh" 00029 00030 // imprime le type d'un signal en clair 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 //printf(" {%d,%d,%d} ", n, v, c); 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 double r; 00089 Tree x, y, z, u, 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 (isSigDocConstantTbl(sig,x,y)) { fputs("sigDocConstantTbl(", out); printSignal(x,out,0); fputc(',', out); 00121 printSignal(y,out,0); fputc(')', out); } 00122 00123 else if (isSigDocWriteTbl(sig,x,y,z,u)) { fputs("sigDocWriteTbl(", out); printSignal(x,out,0); fputc(',', out); 00124 printSignal(y,out,0); fputc(',', out); 00125 printSignal(z,out,0); fputc(',', out); 00126 printSignal(u,out,0); fputc(')', out); } 00127 00128 else if (isSigDocAccessTbl(sig,x,y)) { fputs("sigDocAccessTbl(", out); printSignal(x,out,0); fputc(',', out); 00129 printSignal(y,out,0); fputc(')', out); } 00130 00131 00132 else if ( isSigGen(sig, x) ) { printSignal(x,out,prec); } 00133 00134 else if ( isSigIntCast(sig, x) ) { fputs("int(", out); printSignal(x,out,0); fputs(")", out); } 00135 else if ( isSigFloatCast(sig, x) ) { fputs("float(", out); printSignal(x,out,0); fputs(")", out); } 00136 00137 else if (isList(sig)) { 00138 char sep = '{'; 00139 do { 00140 fputc(sep, out); 00141 printSignal(hd(sig), out, 0); 00142 sep=','; 00143 sig = tl(sig); 00144 } while (isList(sig)); 00145 fputc('}', out); 00146 } 00147 else 00148 print(sig, out); 00149 }
1.8.0