1 /************************************************************************
2  ************************************************************************
3     FAUST compiler
4     Copyright (C) 2003-2018 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 #include <stdio.h>
23 
24 #include "signals.hh"
25 #include "sigtype.hh"
26 #include "sigtyperules.hh"
27 
28 // Print the signal type
29 #if 0
30 void printSigType(Tree tp)
31 {
32 	Tree t0;
33 	int n, v, c;
34 
35 	if (isTableType(tp, t0)) {
36 		printf("table-of ");
37 		printSigType(t0);
38 	} else if (isSigType(tp, &n, &v, &c)) {
39 		putchar("NR"[n]);
40 		putchar("KB S"[v]);
41 		putchar("CI X"[c]);
42 		//printf(" {%d,%d,%d} ", n, v, c);
43 	} else {
44 		printf("unknown");
45 	}
46 }
47 
48 void printSigTypeList(Tree l)
49 {
50 	char sep = '(';
51 
52 	do {
53 		putchar(sep); sep = ',';
54 		printSigType(hd(l));
55 		l = tl(l);
56 	} while (isList(l));
57 
58 	putchar(')');
59 }
60 #endif
61 
printSigType(int n,int v,int c)62 void printSigType(int n, int v, int c)
63 {
64     putchar("NR"[n]);
65     putchar("KB S"[v]);
66     putchar("CI X"[c]);
67 }
68 
69 static const char* binopname[] = {"+", "-", "*", "/", "%", "<<", ">>", ">", "<", ">=", "<=", "==", "!=", "&", "|", "^"};
70 
71 static int binopprec[] = {2, 2, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
72 
printSignal(Tree sig,FILE * out,int prec)73 void printSignal(Tree sig, FILE* out, int prec)
74 {
75     int    i;
76     double r;
77     Tree   x, y, z, u, le, id;
78 
79     if (isSigInt(sig, &i)) {
80         fprintf(out, "%d", i);
81     } else if (isSigReal(sig, &r)) {
82         fprintf(out, "%f", r);
83     } else if (isSigInput(sig, &i)) {
84         fprintf(out, "IN%d", i);
85     } else if (isSigOutput(sig, &i, x)) {
86         fprintf(out, "OUT%d := ", i);
87         printSignal(x, out, 0);
88     }
89 
90     else if (isSigBinOp(sig, &i, x, y)) {
91         if (prec > binopprec[i]) fputs("(", out);
92         printSignal(x, out, binopprec[i]);
93         fputs(binopname[i], out);
94         printSignal(y, out, binopprec[i]);
95         if (prec > binopprec[i]) fputs(")", out);
96     } else if (isSigDelay1(sig, x)) {
97         fputs("mem(", out);
98         printSignal(x, out, 0);
99         fputs(")", out);
100     } else if (isSigPrefix(sig, x, y)) {
101         fputs("prefix(", out);
102         printSignal(x, out, 0);
103         fputs(",", out);
104         printSignal(y, out, 0);
105         fputs(")", out);
106     } else if (isSigAttach(sig, x, y)) {
107         fputs("attach(", out);
108         printSignal(x, out, 0);
109         fputs(",", out);
110         printSignal(y, out, 0);
111         fputs(")", out);
112     } else if (isSigEnable(sig, x, y)) {
113         fputs("enable(", out);
114         printSignal(x, out, 0);
115         fputs(",", out);
116         printSignal(y, out, 0);
117         fputs(")", out);
118     } else if (isSigControl(sig, x, y)) {
119         fputs("control(", out);
120         printSignal(x, out, 0);
121         fputs(",", out);
122         printSignal(y, out, 0);
123         fputs(")", out);
124     } else if (isSigDelay(sig, x, y)) {
125         if (prec > 4) fputs("(", out);
126         printSignal(x, out, 4);
127         fputs("@", out);
128         printSignal(y, out, 4);
129         if (prec > 4) fputs(")", out);
130     }
131 
132     else if (isProj(sig, &i, x)) {
133         printSignal(x, out, prec);
134         fprintf(out, "#%d", i);
135     } else if (isRef(sig, i)) {
136         fprintf(out, "$%d", i);
137     } else if (isRef(sig, x)) {
138         print(x, out);
139     } else if (isRec(sig, le)) {
140         fputs("\\_.", out);
141         printSignal(le, out, prec);
142     } else if (isRec(sig, x, le)) {
143         fputs("\\", out);
144         print(x, out);
145         fputs(".", out);
146         printSignal(le, out, prec);
147     }
148 
149     else if (isSigTable(sig, id, x, y)) {
150         fputs("table(", out);
151         printSignal(x, out, 0);
152         fputc(',', out);
153         printSignal(y, out, 0);
154         fputc(')', out);
155     } else if (isSigWRTbl(sig, id, x, y, z)) {
156         printSignal(x, out, 0);
157         fputc('[', out);
158         printSignal(y, out, 0);
159         fputs("] := (", out);
160         printSignal(z, out, 0);
161         fputc(')', out);
162     } else if (isSigRDTbl(sig, x, y)) {
163         printSignal(x, out, 0);
164         fputc('[', out);
165         printSignal(y, out, 0);
166         fputc(']', out);
167     }
168 
169     else if (isSigDocConstantTbl(sig, x, y)) {
170         fputs("sigDocConstantTbl(", out);
171         printSignal(x, out, 0);
172         fputc(',', out);
173         printSignal(y, out, 0);
174         fputc(')', out);
175     }
176 
177     else if (isSigDocWriteTbl(sig, x, y, z, u)) {
178         fputs("sigDocWriteTbl(", out);
179         printSignal(x, out, 0);
180         fputc(',', out);
181         printSignal(y, out, 0);
182         fputc(',', out);
183         printSignal(z, out, 0);
184         fputc(',', out);
185         printSignal(u, out, 0);
186         fputc(')', out);
187     }
188 
189     else if (isSigDocAccessTbl(sig, x, y)) {
190         fputs("sigDocAccessTbl(", out);
191         printSignal(x, out, 0);
192         fputc(',', out);
193         printSignal(y, out, 0);
194         fputc(')', out);
195     }
196 
197     else if (isSigGen(sig, x)) {
198         printSignal(x, out, prec);
199     }
200 
201     else if (isSigIntCast(sig, x)) {
202         fputs("int(", out);
203         printSignal(x, out, 0);
204         fputs(")", out);
205     } else if (isSigFloatCast(sig, x)) {
206         fputs("float(", out);
207         printSignal(x, out, 0);
208         fputs(")", out);
209     }
210 
211     else if (isList(sig)) {
212         char sep = '{';
213         do {
214             fputc(sep, out);
215             printSignal(hd(sig), out, 0);
216             sep = ',';
217             sig = tl(sig);
218         } while (isList(sig));
219         fputc('}', out);
220     } else {
221         print(sig, out);
222     }
223 }
224