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