FAUST compiler  0.9.9.6b8
sigprint.cpp
Go to the documentation of this file.
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 }