68 if (t->nature() ==
kInt) {
92 if (fIDCounters.find(prefix) == fIDCounters.end()) {
93 fIDCounters[prefix]=0;
95 int n = fIDCounters[prefix];
96 fIDCounters[prefix] = n+1;
97 return subst(
"$0$1", prefix,
T(n));
118 cout <<
ppsig(L3) << endl;
161 for (
int i = 0; i < fClass->inputs(); i++) {
162 fClass->addZone3(
subst(
"$1* input$0 = input[$0];",
T(i),
xfloat()));
167 for (
int i = 0; i < fClass->outputs(); i++) {
168 fClass->addZone3(
subst(
"$1* output$0 = output[$0];",
T(i),
xfloat()));
171 for (
int i = 0;
isList(L); L =
tl(L), i++) {
173 fClass->addExecCode(
subst(
"output$0[i] = $2$1;",
T(i), CS(sig),
xcast()));
175 generateUserInterfaceTree(prepareUserInterfaceTree(fUIRoot));
176 generateMacroInterfaceTree(
"", prepareUserInterfaceTree(fUIRoot));
178 fDescription->ui(prepareUserInterfaceTree(fUIRoot));
191 fClass->addExecCode(
subst(
"output[i] = $0;", CS(sig)));
192 generateUserInterfaceTree(prepareUserInterfaceTree(fUIRoot));
193 generateMacroInterfaceTree(
"", prepareUserInterfaceTree(fUIRoot));
195 fDescription->ui(prepareUserInterfaceTree(fUIRoot));
212 return fCompileProperty.get(sig, cexp);
224 string old;
if (fCompileProperty.get(sig, old) && (old != cexp)) {
225 cerr <<
"ERROR already a compiled expression attached : " << old <<
" replaced by " << cexp << endl;
228 fCompileProperty.set(sig, cexp);
242 if (!getCompiledExpression(sig, code)) {
247 code = generateCode(sig);
248 setCompiledExpression(sig, code);
265 fprintf(stderr,
"CALL generateCode(");
267 fprintf(stderr,
")\n");
272 Tree c, sel, x, y, z, label, id, ff, largs, type,
name, file;
276 if (
getUserData(sig) ) {
return generateXtended(sig); }
277 else if (
isSigInt(sig, &i) ) {
return generateNumber(sig,
T(i)); }
278 else if (
isSigReal(sig, &r) ) {
return generateNumber(sig,
T(r)); }
279 else if (
isSigWaveform(sig) ) {
return generateWaveform(sig); }
280 else if (
isSigInput(sig, &i) ) {
return generateInput (sig,
T(i)); }
281 else if (
isSigOutput(sig, &i, x) ) {
return generateOutput (sig,
T(i), CS(x));}
283 else if (
isSigFixDelay(sig, x, y) ) {
return generateFixDelay (sig, x, y); }
284 else if (
isSigPrefix(sig, x, y) ) {
return generatePrefix (sig, x, y); }
285 else if (
isSigIota(sig, x) ) {
return generateIota (sig, x); }
287 else if (
isSigBinOp(sig, &i, x, y) ) {
return generateBinOp (sig, i, x, y); }
288 else if (
isSigFFun(sig, ff, largs) ) {
return generateFFun (sig, ff, largs); }
292 else if (
isSigTable(sig,
id, x, y) ) {
return generateTable (sig, x, y); }
293 else if (
isSigWRTbl(sig,
id, x, y, z) ) {
return generateWRTbl (sig, x, y, z); }
294 else if (
isSigRDTbl(sig, x, y) ) {
return generateRDTbl (sig, x, y); }
296 else if (
isSigSelect2(sig, sel, x, y) ) {
return generateSelect2 (sig, sel, x, y); }
297 else if (
isSigSelect3(sig, sel, x, y, z) ) {
return generateSelect3 (sig, sel, x, y, z); }
299 else if (
isSigGen(sig, x) ) {
return generateSigGen (sig, x); }
301 else if (
isProj(sig, &i, x) ) {
return generateRecProj (sig, x, i); }
303 else if (
isSigIntCast(sig, x) ) {
return generateIntCast (sig, x); }
304 else if (
isSigFloatCast(sig, x) ) {
return generateFloatCast (sig, x); }
306 else if (
isSigButton(sig, label) ) {
return generateButton (sig, label); }
307 else if (
isSigCheckbox(sig, label) ) {
return generateCheckbox (sig, label); }
308 else if (
isSigVSlider(sig, label,c,x,y,z) ) {
return generateVSlider (sig, label, c,x,y,z); }
309 else if (
isSigHSlider(sig, label,c,x,y,z) ) {
return generateHSlider (sig, label, c,x,y,z); }
310 else if (
isSigNumEntry(sig, label,c,x,y,z) ) {
return generateNumEntry (sig, label, c,x,y,z); }
312 else if (
isSigVBargraph(sig, label,x,y,z) ) {
return generateVBargraph (sig, label, x, y, CS(z)); }
313 else if (
isSigHBargraph(sig, label,x,y,z) ) {
return generateHBargraph (sig, label, x, y, CS(z)); }
314 else if (
isSigAttach(sig, x, y) ) { CS(y);
return generateCacheCode(sig, CS(x)); }
317 printf(
"Error in compiling signal, unrecognized signal : ");
322 return "error in generate code";
339 generateDelayVec(sig, exp, ctype, vname, o->
getMaxDelay());
354 addIncludeFile(file);
358 generateDelayVec(sig, exp, ctype, vname, o->
getMaxDelay());
372 addIncludeFile(file);
373 return generateCacheCode(sig, exp);
385 return forceCacheCode(sig,
subst(
"$1input$0[i]", idx,
icast()));
387 return generateCacheCode(sig,
subst(
"$1input$0[i]", idx,
icast()));
394 string dst =
subst(
"output$0[i]", idx);
395 fClass->addExecCode(
subst(
"$0 = $2$1;", dst, arg,
xcast()));
406 if (opcode ==
kDiv) {
411 if (t1->nature()==
kInt && t2->nature()==
kInt ) {
412 return generateCacheCode(sig,
subst(
"($3($0) $1 $3($2))", CS(arg1),
gBinOpTable[opcode]->fName, CS(arg2),
ifloat()));
413 }
else if (t1->nature()==
kInt && t2->nature()==
kReal ) {
414 return generateCacheCode(sig,
subst(
"($3($0) $1 $2)", CS(arg1),
gBinOpTable[opcode]->fName, CS(arg2),
ifloat()));
415 }
else if (t1->nature()==
kReal && t2->nature()==
kInt ) {
416 return generateCacheCode(sig,
subst(
"($0 $1 $3($2))", CS(arg1),
gBinOpTable[opcode]->fName, CS(arg2),
ifloat()));
418 return generateCacheCode(sig,
subst(
"($0 $1 $2)", CS(arg1),
gBinOpTable[opcode]->fName, CS(arg2),
ifloat()));
421 return generateCacheCode(sig,
subst(
"($0 $1 $2)", CS(arg1),
gBinOpTable[opcode]->fName, CS(arg2)));
438 for (
int i = 0; i<
ffarity(ff); i++) {
440 code += CS(
nth(largs, i));
444 return generateCacheCode(sig, code);
454 if (t->nature() ==
kInt) {
455 ctype =
"int"; vname =
subst(
"i$0", getFreshID(prefix));
457 ctype =
ifloat(); vname =
subst(
"f$0", getFreshID(prefix));
463 string vname, ctype, code;
464 int sharing = getSharingCount(sig);
468 if (getCompiledExpression(sig, code)) {
477 return generateDelayVec(sig, generateVariableStore(sig,exp), ctype, vname, o->
getMaxDelay());
479 return generateDelayVec(sig, exp, ctype, vname, o->
getMaxDelay());
482 }
else if (sharing == 1) {
486 }
else if (sharing > 1) {
488 return generateVariableStore(sig, exp);
491 cerr <<
"Error in sharing count (" << sharing <<
") for " << *sig << endl;
495 return "Error in generateCacheCode";
501 string vname, ctype, code;
505 if (getCompiledExpression(sig, code)) {
513 return generateDelayVec(sig, generateVariableStore(sig,exp), ctype, vname, o->
getMaxDelay());
517 return generateVariableStore(sig, exp);
528 switch (t->variability()) {
532 getTypedNames(t,
"Const", ctype, vname);
533 fClass->addDeclCode(
subst(
"$0 \t$1;", ctype, vname));
534 fClass->addInitCode(
subst(
"$0 = $1;", vname, exp));
539 getTypedNames(t,
"Slow", ctype, vname);
540 fClass->addFirstPrivateDecl(vname);
541 fClass->addZone2(
subst(
"$0 \t$1 = $2;", ctype, vname, exp));
546 getTypedNames(t,
"Temp", ctype, vname);
547 fClass->addExecCode(
subst(
"$0 $1 = $2;", ctype, vname, exp));
561 return generateCacheCode(sig,
subst(
"int($0)", CS(x)));
566 return generateCacheCode(sig,
subst(
"$1($0)", CS(x),
ifloat()));
575 string varname = getFreshID(
"fbutton");
576 fClass->addDeclCode(
subst(
"$1 \t$0;", varname,
xfloat()));
577 fClass->addInitCode(
subst(
"$0 = 0.0;", varname));
581 return generateCacheCode(sig,
subst(
"$1($0)", varname,
ifloat()));
586 string varname = getFreshID(
"fcheckbox");
587 fClass->addDeclCode(
subst(
"$1 \t$0;", varname,
xfloat()));
588 fClass->addInitCode(
subst(
"$0 = 0.0;", varname));
592 return generateCacheCode(sig,
subst(
"$1($0)", varname,
ifloat()));
598 string varname = getFreshID(
"fslider");
599 fClass->addDeclCode(
subst(
"$1 \t$0;", varname,
xfloat()));
604 return generateCacheCode(sig,
subst(
"$1($0)", varname,
ifloat()));
609 string varname = getFreshID(
"fslider");
610 fClass->addDeclCode(
subst(
"$1 \t$0;", varname,
xfloat()));
615 return generateCacheCode(sig,
subst(
"$1($0)", varname,
ifloat()));
620 string varname = getFreshID(
"fentry");
621 fClass->addDeclCode(
subst(
"$1 \t$0;", varname,
xfloat()));
626 return generateCacheCode(sig,
subst(
"$1($0)", varname,
ifloat()));
632 string varname = getFreshID(
"fbargraph");
633 fClass->addDeclCode(
subst(
"$1 \t$0;", varname,
xfloat()));
637 switch (t->variability()) {
640 fClass->addInitCode(
subst(
"$0 = $1;", varname, exp));
644 fClass->addZone2(
subst(
"$0 = $1;", varname, exp));
648 fClass->addExecCode(
subst(
"$0 = $1;", varname, exp));
653 return generateCacheCode(sig, varname);
659 string varname = getFreshID(
"fbargraph");
660 fClass->addDeclCode(
subst(
"$1 \t$0;", varname,
xfloat()));
664 switch (t->variability()) {
667 fClass->addInitCode(
subst(
"$0 = $1;", varname, exp));
671 fClass->addZone2(
subst(
"$0 = $1;", varname, exp));
675 fClass->addExecCode(
subst(
"$0 = $1;", varname, exp));
680 return generateCacheCode(sig, varname);
698 string klassname = getFreshID(
"SIG");
699 string signame = getFreshID(
"sig");
701 fClass->addSubKlass(
signal2klass(fClass, klassname, content));
702 fClass->addInitCode(
subst(
"$0 $1;", klassname, signame));
703 fInstanceInitProperty.set(content, pair<string,string>(klassname,signame));
710 string klassname = getFreshID(
"SIG");
711 string signame = getFreshID(
"sig");
713 fClass->addSubKlass(
signal2klass(fClass, klassname, content));
714 fClass->addStaticInitCode(
subst(
"$0 $1;", klassname, signame));
715 fStaticInitProperty.set(content, pair<string,string>(klassname,signame));
727 string generator(CS(content));
736 pair<string,string> kvnames;
737 if ( ! fInstanceInitProperty.get(g, kvnames)) {
739 bool b = fStaticInitProperty.get(g, kvnames);
741 fClass->addInitCode(
subst(
"$0 $1;", kvnames.first, kvnames.second));
746 cerr <<
"error in ScalarCompiler::generateTable() : "
748 <<
" is not a constant integer table size expression "
755 if (t->nature() ==
kInt) {
756 vname = getFreshID(
"itbl");
759 vname = getFreshID(
"ftbl");
764 fClass->addDeclCode(
subst(
"$0 \t$1[$2];", ctype, vname,
T(size)));
767 fClass->addInitCode(
subst(
"$0.init(samplingFreq);", generator));
769 fClass->addInitCode(
subst(
"$0.fill($1,$2);", generator,
T(size), vname));
785 if (!getCompiledExpression(content, cexp)) {
786 cexp = setCompiledExpression(content, generateStaticSigGen(content, g));
789 pair<string,string> kvnames;
790 if ( ! fStaticInitProperty.get(g, kvnames)) {
792 bool b = fInstanceInitProperty.get(g, kvnames);
794 fClass->addStaticInitCode(
subst(
"$0 $1;", kvnames.first, kvnames.second));
800 cerr <<
"error in ScalarCompiler::generateTable() : "
802 <<
" is not a constant integer table size expression "
809 if (t->nature() ==
kInt) {
810 vname = getFreshID(
"itbl");
813 vname = getFreshID(
"ftbl");
818 fClass->addDeclCode(
subst(
"static $0 \t$1[$2];", ctype, vname,
T(size)));
819 fClass->addStaticFields(
subst(
"$0 \t$1::$2[$3];", ctype, fClass->getClassName(), vname,
T(size) ));
822 fClass->addStaticInitCode(
subst(
"$0.init(samplingFreq);", cexp));
824 fClass->addStaticInitCode(
subst(
"$0.fill($1,$2);", cexp,
T(size), vname));
837 string tblName(CS(tbl));
838 fClass->addExecCode(
subst(
"$0[$1] = $2;", tblName, CS(idx), CS(data)));
856 Tree id, size, content;
859 if (!getCompiledExpression(tbl, tblname)) {
860 tblname = setCompiledExpression(tbl, generateStaticTable(tbl, size, content));
862 return generateCacheCode(sig,
subst(
"$0[$1]", tblname, CS(idx)));
864 return generateCacheCode(sig,
subst(
"$0[$1]", CS(tbl), CS(idx)));
883 if ( ! getVectorNameProperty(sig, vname)) {
884 assert(
isRec(r, var, le));
885 generateRec(r, var, le);
886 assert(getVectorNameProperty(sig, vname));
888 return "[[UNUSED EXP]]";
899 vector<bool> used(N);
900 vector<int> delay(N);
901 vector<string> vname(N);
902 vector<string> ctype(N);
905 for (
int i=0; i<N; i++) {
907 if (fOccMarkup.retrieve(e)) {
911 setVectorNameProperty(e, vname[i]);
912 delay[i] = fOccMarkup.retrieve(e)->getMaxDelay();
921 for (
int i=0; i<N; i++) {
923 generateDelayLine(ctype[i], vname[i], delay[i], CS(
nth(le,i)));
937 string vperm = getFreshID(
"M");
938 string vtemp = getFreshID(
"T");
940 string type =
cType(te);
942 fClass->addDeclCode(
subst(
"$0 \t$1;", type, vperm));
943 fClass->addInitCode(
subst(
"$0 = $1;", vperm, CS(x)));
945 fClass->addExecCode(
subst(
"$0 $1 = $2;", type, vtemp, vperm));
946 fClass->addExecCode(
subst(
"$0 = $1;", vperm, CS(e)));
956 return !(n & (n - 1));
962 if (!
isSigInt(n, &size)) { fprintf(stderr,
"error in generateIota\n"); exit(1); }
964 string vperm = getFreshID(
"iota");
966 fClass->addDeclCode(
subst(
"int \t$0;", vperm));
967 fClass->addInitCode(
subst(
"$0 = 0;", vperm));
970 fClass->addExecCode(
subst(
"$0 = ($0+1)&$1;", vperm,
T(size-1)));
972 fClass->addExecCode(
subst(
"if (++$0 == $1) $0=0;", vperm,
T(size)));
988 return generateCacheCode(sig,
subst(
"(($0)?$1:$2)", CS(sel), CS(s2), CS(s1) ) );
999 return generateCacheCode(sig,
subst(
"(($0==0)? $1 : (($0==1)?$2:$3) )", CS(sel), CS(s1), CS(s2), CS(s3) ) );
1011 string type =
cType(t);
1012 string var = getFreshID(
"S");
1014 switch (w->variability())
1017 fClass->addDeclCode(
subst(
"$0 \t$1[3];", type, var));
1022 fClass->addSharedDecl(var);
1023 fClass->addZone1(
subst(
"$0 \t$1[3];", type, var));
1026 fClass->addExecCode(
subst(
"$0 \t$1[3];", type, var));
1030 switch (t1->variability())
1033 fClass->addInitCode(
subst(
"$0[0] = $1;", var, CS(s1)));
1036 fClass->addZone2b(
subst(
"$0[0] = $1;", var, CS(s1)));
1039 fClass->addExecCode(
subst(
"$0[0] = $1;", var, CS(s1)));
1043 switch (t2->variability())
1046 fClass->addInitCode(
subst(
"$0[1] = $1;", var, CS(s2)));
1049 fClass->addZone2b(
subst(
"$0[1] = $1;", var, CS(s2)));
1052 fClass->addExecCode(
subst(
"$0[1] = $1;", var, CS(s2)));
1056 switch (t3->variability())
1059 fClass->addInitCode(
subst(
"$0[2] = $1;", var, CS(s3)));
1062 fClass->addZone2b(
subst(
"$0[2] = $1;", var, CS(s3)));
1065 fClass->addExecCode(
subst(
"$0[2] = $1;", var, CS(s3)));
1069 return generateCacheCode(sig,
subst(
"$0[$1]", var, CS(sel)));
1080 vector<string> args;
1083 for (
int i=0; i<sig->
arity(); i++) {
1084 args.push_back(CS(sig->
branch(i)));
1089 return generateCacheCode(sig, p->
generateCode(fClass, args, types));
1113 fVectorProperty.set(sig, vecname);
1127 return fVectorProperty.get(sig, vecname);
1138 while (n < x) { n = 2*n; }
1179 mxd = fOccMarkup.retrieve(exp)->getMaxDelay();
1181 if (! getVectorNameProperty(exp, vecname)) {
1182 cerr <<
"No vector name for : " <<
ppsig(exp) << endl;
1192 return subst(
"$0[$1]", vecname, CS(delay));
1194 return generateCacheCode(sig,
subst(
"$0[$1]", vecname, CS(delay)));
1200 int N = pow2limit( mxd+1 );
1201 return generateCacheCode(sig,
subst(
"$0[(IOTA-$1)&$2]", vecname, CS(delay),
T(N-1)));
1213 string s = generateDelayVecNoTemp(sig, exp, ctype, vname, mxd);
1234 fClass->addDeclCode(
subst(
"$0 \t$1[$2];", ctype, vname,
T(mxd+1)));
1235 fClass->addInitCode(
subst(
"for (int i=0; i<$1; i++) $0[i] = 0;", vname,
T(mxd+1)));
1236 fClass->addExecCode(
subst(
"$0[0] = $1;", vname, exp));
1240 fClass->addPostCode(
subst(
"$0[1] = $0[0];", vname));
1241 }
else if (mxd == 2) {
1243 fClass->addPostCode(
subst(
"$0[2] = $0[1]; $0[1] = $0[0];", vname));
1245 fClass->addPostCode(
subst(
"for (int i=$0; i>0; i--) $1[i] = $1[i-1];",
T(mxd), vname));
1247 setVectorNameProperty(sig, vname);
1248 return subst(
"$0[0]", vname);
1253 int N = pow2limit(mxd+1);
1259 fClass->addDeclCode(
subst(
"$0 \t$1[$2];", ctype, vname,
T(N)));
1260 fClass->addInitCode(
subst(
"for (int i=0; i<$1; i++) $0[i] = 0;", vname,
T(N)));
1263 fClass->addExecCode(
subst(
"$0[IOTA&$1] = $2;", vname,
T(N-1), exp));
1264 setVectorNameProperty(sig, vname);
1265 return subst(
"$0[IOTA&$1]", vname,
T(N-1));
1279 fClass->addExecCode(
subst(
"$0 \t$1 = $2;", ctype, vname, exp));
1286 fClass->addDeclCode(
subst(
"$0 \t$1[$2];", ctype, vname,
T(mxd+1)));
1287 fClass->addInitCode(
subst(
"for (int i=0; i<$1; i++) $0[i] = 0;", vname,
T(mxd+1)));
1288 fClass->addExecCode(
subst(
"$0[0] = $1;", vname, exp));
1292 fClass->addPostCode(
subst(
"$0[1] = $0[0];", vname));
1293 }
else if (mxd == 2) {
1294 fClass->addPostCode(
subst(
"$0[2] = $0[1]; $0[1] = $0[0];", vname));
1296 fClass->addPostCode(
subst(
"for (int i=$0; i>0; i--) $1[i] = $1[i-1];",
T(mxd), vname));
1302 int N = pow2limit(mxd+1);
1308 fClass->addDeclCode(
subst(
"$0 \t$1[$2];", ctype, vname,
T(N)));
1309 fClass->addInitCode(
subst(
"for (int i=0; i<$1; i++) $0[i] = 0;", vname,
T(N)));
1312 fClass->addExecCode(
subst(
"$0[IOTA&$1] = $2;", vname,
T(N-1), exp));
1324 fClass->addDeclCode(
"int \tIOTA;");
1325 fClass->addInitCode(
"IOTA = 0;");
1326 fClass->addPostCode(
"IOTA = IOTA+1;");
1340 size = sig->
arity();
1343 stringstream content;
1346 for (
int i = 0; i < size; i++) {
1353 fClass->addDeclCode(
subst(
"static $0 \t$1[$2];", ctype, vname,
T(size)));
1354 fClass->addDeclCode(
subst(
"int \tidx$0;", vname));
1355 fClass->addInitCode(
subst(
"idx$0 = 0;", vname));
1356 fClass->getTopParentKlass()->addStaticFields(
1357 subst(
"$0 \t$1::$2[$3] = ", ctype, fClass->getFullClassName(), vname,
T(size) )
1358 + content.str() +
";");
1366 declareWaveform(sig, vname, size);
1367 fClass->addPostCode(
subst(
"idx$0 = (idx$0 + 1) % $1;", vname,
T(size)));
1368 return generateCacheCode(sig,
subst(
"$0[idx$0]", vname));
bool isSigHSlider(Tree s)
bool isSigRDTbl(Tree s, Tree &t, Tree &i)
void sigToGraph(Tree L, ofstream &fout)
Draw a list of signals as a directed graph using graphviz's dot language.
Compile a list of FAUST signals into a scalar C++ class.
void ensureIotaCode()
Generate code for a unique IOTA variable increased at each sample and used to index ring buffers...
string setCompiledExpression(Tree sig, const string &name)
Set the string of a compiled expression is already compiled.
bool isSigPrefix(Tree t, Tree &t0, Tree &t1)
virtual string CS(Tree sig)
Compile a signal.
bool isSigCheckbox(Tree s)
string generateHBargraph(Tree sig, Tree label, Tree min, Tree max, const string &exp)
bool isSigFFun(Tree s, Tree &ff, Tree &largs)
bool isSigNumEntry(Tree s)
void getTypedNames(Type t, const string &prefix, string &ctype, string &vname)
int pow2limit(int x)
Compute the minimal power of 2 greater than x.
bool isSigSelect2(Tree t, Tree &selector, Tree &s1, Tree &s2)
Tree deBruijn2Sym(Tree t)
void endTiming(const char *msg)
string generateSelect3(Tree sig, Tree sel, Tree s1, Tree s2, Tree s3)
Generate a select3 code (using if-then-else) ((int n = sel==0)? s0 : ((sel==1)? s1 : s2)) int nn; ((n...
bool isSigIota(Tree t, Tree &t0)
virtual string generateWaveform(Tree sig)
string generatePrefix(Tree sig, Tree x, Tree e)
A CTree = (Node x [CTree]) is a Node associated with a list of subtrees called branches.
string generateSelect2(Tree sig, Tree sel, Tree s1, Tree s2)
Generate a select2 code.
const char * ffname(Tree t)
void typeAnnotation(Tree sig)
Fully annotate every subtree of term with type information.
bool isSigInput(Tree t, int *i)
bool isSigFixDelay(Tree t, Tree &t0, Tree &t1)
string generateSigGen(Tree sig, Tree content)
string generateHSlider(Tree sig, Tree label, Tree cur, Tree min, Tree max, Tree step)
virtual bool needCache()=0
string generateFVar(Tree sig, const string &file, const string &name)
Tree uiWidget(Tree label, Tree varname, Tree sig)
string generateIota(Tree sig, Tree arg)
bool isSigVBargraph(Tree s)
bool isSigSelect3(Tree t, Tree &selector, Tree &s1, Tree &s2, Tree &s3)
string generateRecProj(Tree sig, Tree exp, int i)
Generate code for a projection of a group of mutually recursive definitions.
bool isSigVSlider(Tree s)
string generateBinOp(Tree sig, int opcode, Tree arg1, Tree arg2)
double max(double x, double y)
bool isSigGen(Tree t, Tree &x)
string generateRDTbl(Tree sig, Tree tbl, Tree idx)
string generateNumEntry(Tree sig, Tree label, Tree cur, Tree min, Tree max, Tree step)
string generateDelayVecNoTemp(Tree sig, const string &exp, const string &ctype, const string &vname, int mxd)
Generate code for the delay mecchanism without using temporary variables.
const char * ffincfile(Tree ff)
bool isSigReal(Tree t, double *r)
string generateButton(Tree sig, Tree label)
string generateStaticTable(Tree sig, Tree tsize, Tree content)
virtual string generateDelayVec(Tree sig, const string &exp, const string &ctype, const string &vname, int mxd)
Generate code for the delay mecchanism.
string generateFloatCast(Tree sig, Tree x)
Tree privatise(const Tree &t)
Tree sigProj(int i, Tree rgroup)
bool getVectorNameProperty(Tree sig, string &vecname)
Get the vector name property of a signal, the name of the vector used to store the previous values of...
string generateVSlider(Tree sig, Tree label, Tree cur, Tree min, Tree max, Tree step)
string getFreshID(const string &prefix)
string subst(const string &model, const vector< string > &args)
Text substitution.
bool isSigHBargraph(Tree s)
bool getCompiledExpression(Tree sig, string &name)
Test if a signal is already compiled.
virtual string generateVariableStore(Tree sig, const string &exp)
void startTiming(const char *msg)
bool isSigTable(Tree t, Tree &id, Tree &n, Tree &sig)
void printSignal(Tree sig, FILE *out, int prec)
bool isSigBinOp(Tree s, int *op, Tree &x, Tree &y)
bool isSigAttach(Tree t, Tree &t0, Tree &t1)
string generateCheckbox(Tree sig, Tree label)
Type getCertifiedSigType(Tree sig)
Retrieve the type of sig and check it exists.
bool isSigWRTbl(Tree u, Tree &id, Tree &t, Tree &i, Tree &s)
void recursivnessAnnotation(Tree sig)
Annotate a signal with recursivness.
int arity() const
return the number of branches (subtrees) of a tree
void generateRec(Tree sig, Tree var, Tree le)
Generate code for a group of mutually recursive definitions.
string generateInput(Tree sig, const string &idx)
const char * name(Symbol *sym)
Returns the name of a symbol.
bool isSigWaveform(Tree s)
string generateIntCast(Tree sig, Tree x)
string generateXtended(Tree sig)
retrieve the type annotation of sig
bool isRec(Tree t, Tree &body)
is t a de Bruijn recursive tree
bool isSigInt(Tree t, int *i)
virtual void compileSingleSignal(Tree lsig)
string generateOutput(Tree sig, const string &idx, const string &arg1)
static bool isPowerOf2(int n)
virtual string generateCacheCode(Tree sig, const string &exp)
string generateWRTbl(Tree sig, Tree tbl, Tree idx, Tree data)
const char * fflibfile(Tree ff)
string generateNumber(Tree sig, const string &exp)
virtual string generateFixDelay(Tree sig, Tree arg, Tree size)
Generate code for accessing a delayed signal.
bool isSigFloatCast(Tree t)
virtual string generateCode(Klass *klass, const vector< string > &args, const vector< Type > &types)=0
string generateFFun(Tree sig, Tree ff, Tree largs)
int getMaxDelay() const
return the maximal delay collected
void * getUserData(Symbol *sym)
Returns user data.
void declareWaveform(Tree sig, string &vname, int &size)
Generate code for a waveform.
bool isSigIntCast(Tree t)
void setVectorNameProperty(Tree sig, const string &vecname)
Set the vector name property of a signal, the name of the vector used to store the previous values of...
virtual void compileMultiSignal(Tree lsig)
string generateFConst(Tree sig, const string &file, const string &name)
bool isProj(Tree t, int *i, Tree &rgroup)
API to the typing system of signals.
double min(double x, double y)
double tree2float(Tree t)
if t has a node of type float, return it otherwise error
static Klass * signal2klass(Klass *parent, const string &name, Tree sig)
string generateVBargraph(Tree sig, Tree label, Tree min, Tree max, const string &exp)
virtual string generateCode(Tree sig)
Main code generator dispatch.
const char * tree2str(Tree t)
if t has a node of type symbol, return its name otherwise error
Tree branch(int i) const
return the ith branch (subtree) of a tree
string generateStaticSigGen(Tree sig, Tree content)
virtual void generateDelayLine(const string &ctype, const string &vname, int mxd, const string &exp)
Generate code for the delay mecchanism without using temporary variables.
bool isSigOutput(Tree t, int *i, Tree &t0)
string generateTable(Tree sig, Tree tsize, Tree content)
static map< string, int > fIDCounters
void print(Tree t, FILE *out)
virtual string forceCacheCode(Tree sig, const string &exp)