FAUST compiler  0.9.9.6b8
sigprint.cpp
Go to the documentation of this file.
1 /************************************************************************
2  ************************************************************************
3  FAUST compiler
4  Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale
5  ---------------------------------------------------------------------
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program; if not, write to the Free Software
18  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19  ************************************************************************
20  ************************************************************************/
21 
22 
23 
24 #include <stdio.h>
25 
26 #include "signals.hh"
27 #include "sigtype.hh"
28 #include "sigtyperules.hh"
29 
30 // imprime le type d'un signal en clair
31 #if 0
32 void printSigType (Tree tp)
33 {
34  Tree t0;
35  int n, v, c;
36 
37  if (isTableType(tp, t0)) {
38  printf("table-of ");
39  printSigType(t0);
40  } else if (isSigType(tp, &n, &v, &c)) {
41  putchar("NR"[n]);
42  putchar("KB S"[v]);
43  putchar("CI X"[c]);
44  //printf(" {%d,%d,%d} ", n, v, c);
45  } else {
46  printf("unknown");
47  }
48 }
49 
50 void printSigTypeList (Tree l)
51 {
52  char sep = '(';
53 
54  do {
55  putchar(sep); sep = ',';
56  printSigType(hd(l));
57  l = tl(l);
58  } while (isList(l));
59 
60  putchar(')');
61 }
62 #endif
63 
64 void printSigType (int n, int v, int c)
65 {
66  putchar("NR"[n]);
67  putchar("KB S"[v]);
68  putchar("CI X"[c]);
69 }
70 
71 const char* binopname[]= {
72  "+", "-", "*", "/", "%",
73  "<<", ">>",
74  ">", "<", ">=", "<=", "==", "!=",
75  "&", "|", "^"
76 };
77 
78 int binopprec[]= {
79  2, 2, 3, 3, 3,
80  1, 1,
81  1, 1, 1, 1, 1, 1,
82  1, 1, 1
83 };
84 
85 void printSignal(Tree sig, FILE* out, int prec)
86 {
87  int i;
88  double r;
89  Tree x, y, z, u, le, id;
90 
91  if ( isSigInt(sig, &i) ) { fprintf(out, "%d", i); }
92  else if ( isSigReal(sig, &r) ) { fprintf(out, "%f", r); }
93  else if ( isSigInput(sig, &i) ) { fprintf(out, "IN%d", i); }
94  else if ( isSigOutput(sig, &i, x) ) { fprintf(out, "OUT%d := ", i); printSignal(x, out, 0); }
95 
96  else if ( isSigBinOp(sig, &i, x, y) ) {
97  if (prec > binopprec[i]) fputs("(", out);
98  printSignal(x,out,binopprec[i]); fputs(binopname[i], out); printSignal(y, out, binopprec[i]);
99  if (prec > binopprec[i]) fputs(")", out);
100  }
101  else if ( isSigDelay1(sig, x) ) { fputs("mem(", out); printSignal(x,out,0); fputs(")", out); }
102  else if ( isSigPrefix(sig, x, y) ) { fputs("prefix(", out); printSignal(x,out,0); fputs(",", out); printSignal(y,out,0); fputs(")", out); }
103  else if ( isSigAttach(sig, x, y) ) { fputs("attach(", out); printSignal(x,out,0); fputs(",", out); printSignal(y,out,0); fputs(")", out); }
104  else if ( isSigFixDelay(sig, x, y) ) {
105  if (prec > 4) fputs("(", out);
106  printSignal(x,out,4); fputs("@", out); printSignal(y, out, 4);
107  if (prec > 4) fputs(")", out);
108  }
109 
110  else if ( isProj(sig, &i, x) ) { printSignal(x,out,prec); fprintf(out, "#%d", i); }
111  else if ( isRef(sig, i) ) { fprintf(out, "$%d", i); }
112  else if ( isRef(sig, x) ) { print(x, out); }
113  else if ( isRec(sig, le)) { fputs("\\_.", out); printSignal(le, out, prec); }
114  else if ( isRec(sig, x, le)) { fputs("\\", out); print(x,out); fputs(".", out); printSignal(le, out, prec); }
115 
116  else if ( isSigTable(sig, id, x, y) ) { fputs("table(", out); printSignal(x,out,0); fputc(',', out); printSignal(y,out,0); fputc(')', out); }
117  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); }
118  else if ( isSigRDTbl(sig, x, y) ) { printSignal(x,out,0); fputc('[', out); printSignal(y,out,0); fputc(']', out); }
119 
120  else if (isSigDocConstantTbl(sig,x,y)) { fputs("sigDocConstantTbl(", out); printSignal(x,out,0); fputc(',', out);
121  printSignal(y,out,0); fputc(')', out); }
122 
123  else if (isSigDocWriteTbl(sig,x,y,z,u)) { fputs("sigDocWriteTbl(", out); printSignal(x,out,0); fputc(',', out);
124  printSignal(y,out,0); fputc(',', out);
125  printSignal(z,out,0); fputc(',', out);
126  printSignal(u,out,0); fputc(')', out); }
127 
128  else if (isSigDocAccessTbl(sig,x,y)) { fputs("sigDocAccessTbl(", out); printSignal(x,out,0); fputc(',', out);
129  printSignal(y,out,0); fputc(')', out); }
130 
131 
132  else if ( isSigGen(sig, x) ) { printSignal(x,out,prec); }
133 
134  else if ( isSigIntCast(sig, x) ) { fputs("int(", out); printSignal(x,out,0); fputs(")", out); }
135  else if ( isSigFloatCast(sig, x) ) { fputs("float(", out); printSignal(x,out,0); fputs(")", out); }
136 
137  else if (isList(sig)) {
138  char sep = '{';
139  do {
140  fputc(sep, out);
141  printSignal(hd(sig), out, 0);
142  sep=',';
143  sig = tl(sig);
144  } while (isList(sig));
145  fputc('}', out);
146  }
147  else
148  print(sig, out);
149 }
bool isSigRDTbl(Tree s, Tree &t, Tree &i)
Definition: signals.cpp:77
bool isSigPrefix(Tree t, Tree &t0, Tree &t1)
Definition: signals.cpp:66
A CTree = (Node x [CTree]) is a Node associated with a list of subtrees called branches.
Definition: tree.hh:109
bool isSigInput(Tree t, int *i)
Definition: signals.cpp:48
bool isSigFixDelay(Tree t, Tree &t0, Tree &t1)
Definition: signals.cpp:62
void printSigType(int n, int v, int c)
Definition: sigprint.cpp:64
Tree hd(Tree l)
Definition: list.hh:133
bool isSigGen(Tree t, Tree &x)
Definition: signals.cpp:91
bool isSigReal(Tree t, double *r)
Definition: signals.cpp:44
bool isRef(Tree t, int &level)
is t a de Bruijn recursive reference
bool isSigDocConstantTbl(Tree t, Tree &n, Tree &sig)
Definition: signals.cpp:99
bool isList(Tree l)
Definition: list.hh:138
const char * binopname[]
Definition: sigprint.cpp:71
bool isSigTable(Tree t, Tree &id, Tree &n, Tree &sig)
Definition: signals.cpp:85
void printSignal(Tree sig, FILE *out, int prec)
Definition: sigprint.cpp:85
bool isSigBinOp(Tree s, int *op, Tree &x, Tree &y)
Definition: signals.cpp:126
bool isSigAttach(Tree t, Tree &t0, Tree &t1)
Definition: signals.cpp:291
bool isSigDocAccessTbl(Tree t, Tree &tbl, Tree &ridx)
Definition: signals.cpp:107
bool isSigWRTbl(Tree u, Tree &id, Tree &t, Tree &i, Tree &s)
Definition: signals.cpp:81
TableType * isTableType(AudioType *t)
Definition: sigtype.cpp:268
bool isRec(Tree t, Tree &body)
is t a de Bruijn recursive tree
bool isSigInt(Tree t, int *i)
Definition: signals.cpp:41
int binopprec[]
Definition: sigprint.cpp:78
bool isSigDocWriteTbl(Tree t, Tree &n, Tree &sig, Tree &widx, Tree &wsig)
Definition: signals.cpp:103
bool isSigDelay1(Tree t, Tree &t0)
Definition: signals.cpp:58
bool isSigFloatCast(Tree t)
Definition: signals.cpp:187
bool isSigIntCast(Tree t)
Definition: signals.cpp:184
bool isProj(Tree t, int *i, Tree &rgroup)
Definition: signals.cpp:151
API to the typing system of signals.
Tree tl(Tree l)
Definition: list.hh:134
bool isSigOutput(Tree t, int *i, Tree &t0)
Definition: signals.cpp:52
void print(Tree t, FILE *out)
Definition: list.cpp:154