X-Git-Url: https://scm.cri.ensmp.fr/git/Faustine.git/blobdiff_plain/c7f552fd8888da2f0d8cfb228fe0f28d3df3a12c..b4b6f2ea75b9f0f3ca918f5b84016610bf7a4d4f:/interpretor/preprocessor/faust-0.9.47mr3/compiler/signals/ppsig.cpp diff --git a/interpretor/preprocessor/faust-0.9.47mr3/compiler/signals/ppsig.cpp b/interpretor/preprocessor/faust-0.9.47mr3/compiler/signals/ppsig.cpp new file mode 100644 index 0000000..46275b3 --- /dev/null +++ b/interpretor/preprocessor/faust-0.9.47mr3/compiler/signals/ppsig.cpp @@ -0,0 +1,246 @@ +/************************************************************************ + ************************************************************************ + FAUST compiler + Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale + --------------------------------------------------------------------- + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + ************************************************************************ + ************************************************************************/ + + + +#include "ppsig.hh" +#include "binop.hh" +#include "prim2.hh" +#include "xtended.hh" +#include "recursivness.hh" + +ostream& ppsig::printinfix (ostream& fout, const string& opname, int priority, Tree x, Tree y) const +{ + if (fPriority > priority) fout << "("; + fout << ppsig(x,fEnv,priority) << opname << ppsig(y,fEnv,priority); + if (fPriority > priority) fout << ")"; + return fout; +} + +ostream& ppsig::printfun (ostream& fout, const string& funame, Tree x) const +{ + return fout << funame << '(' << ppsig(x,fEnv) << ')'; +} + +ostream& ppsig::printfun (ostream& fout, const string& funame, Tree x, Tree y) const +{ + return fout << funame << '(' << ppsig(x,fEnv) << ',' << ppsig(y,fEnv) << ')'; +} + +ostream& ppsig::printfun (ostream& fout, const string& funame, Tree x, Tree y, Tree z) const +{ + return fout << funame << '(' << ppsig(x,fEnv) << ',' << ppsig(y,fEnv) << ',' << ppsig(z,fEnv) << ')'; +} + +ostream& ppsig::printfun (ostream& fout, const string& funame, Tree x, Tree y, Tree z, Tree zz) const +{ + return fout << funame << '(' << ppsig(x,fEnv) << ',' << ppsig(y,fEnv) << ',' << ppsig(z,fEnv) << ',' << ppsig(zz,fEnv) << ')'; +} + +ostream& ppsig::printfun (ostream& fout, const string& funame, Tree x, Tree y, Tree z, Tree z2, Tree z3) const +{ + return fout << funame << '(' << ppsig(x,fEnv) << ',' << ppsig(y,fEnv) << ',' << ppsig(z,fEnv) << ',' << ppsig(z2,fEnv) << ',' << ppsig(z3,fEnv) << ')'; +} + +ostream& ppsig::printui (ostream& fout, const string& funame, Tree label) const +{ + fout << funame << '('; + printlabel(fout, label); + return fout << ')'; +} + +ostream& ppsig::printui (ostream& fout, const string& funame, Tree label, Tree lo, Tree hi, Tree step) const +{ + fout << funame << '('; + printlabel(fout, label); + return fout + << ',' << ppsig(lo,fEnv) + << ',' << ppsig(hi,fEnv) + << ',' << ppsig(step,fEnv) + << ')'; +} + +ostream& ppsig::printui (ostream& fout, const string& funame, Tree label, Tree cur, Tree lo, Tree hi, Tree step) const +{ + fout << funame << '('; + printlabel(fout, label); + return fout + << ',' << ppsig(cur,fEnv) + << ',' << ppsig(lo,fEnv) + << ',' << ppsig(hi,fEnv) + << ',' << ppsig(step,fEnv) + << ')'; +} + +ostream& ppsig::printout (ostream& fout, int i, Tree x) const +{ + if (fPriority > 0) fout << "("; + fout << "OUT" << i << " = " << ppsig(x, fEnv, 0); + if (fPriority > 0) fout << ")"; + return fout; +} + +ostream& ppsig::printlabel (ostream& fout, Tree pathname) const +{ + fout << *hd(pathname); + pathname = tl(pathname); + while (!isNil(pathname)) { + fout << '/' << *tl(hd(pathname)); + pathname = tl(pathname); + } + return fout; +} + +ostream& ppsig::printlist (ostream& fout, Tree largs) const +{ + string sep = ""; + fout << '('; + while (!isNil(largs)) { + fout << sep << ppsig(hd(largs), fEnv); + sep = ", "; + largs = tl(largs); + } + fout << ')'; + return fout; +} + +ostream& ppsig::printff (ostream& fout, Tree ff, Tree largs) const +{ + fout << ffname(ff); printlist(fout, largs); + return fout; +} + +ostream& ppsig::printFixDelay (ostream& fout, Tree exp, Tree delay) const +{ + int d; + + if (isSigInt(delay, &d) && (d==1)) { + fout << ppsig(exp,fEnv,8) << "'"; + } else { + printinfix(fout, "@", 8, exp, delay); + } + return fout; +} + +// else if ( isSigFixDelay(sig, x, y) ) { printinfix(fout, "@", 8, x, y); } + +ostream& ppsig::printrec (ostream& fout, Tree var, Tree lexp, bool hide) const +{ + if (isElement(var, fEnv) ) { + fout << *var; + } else if (hide) { + fout << *var; + } else { + fout << "letrec(" << *var << " = " << ppsig(lexp, addElement(var, fEnv)) << ")"; + } + return fout; +} + +ostream& ppsig::printrec (ostream& fout, Tree lexp, bool hide) const +{ + fout << "debruijn(" << ppsig(lexp,fEnv) << ")"; + return fout; +} + +ostream& ppsig::printextended (ostream& fout, Tree sig) const +{ + string sep = ""; + xtended* p = (xtended*) getUserData(sig); + + fout << p->name() << '('; + for (int i = 0; i < sig->arity(); i++) { + fout << sep << ppsig(sig->branch(i), fEnv); + sep = ", "; + } + fout << ')'; + return fout; +} + + +ostream& ppsig::print (ostream& fout) const +{ + int i; + double r; + Tree c, sel, x, y, z, u, var, le, label, id, ff, largs, type, name, file; + + if ( isList(sig) ) { printlist(fout, sig); } + else if ( isProj(sig, &i, x) ) { fout << "proj" << i << '(' << ppsig(x, fEnv) << ')'; } + else if ( isRec(sig, var, le) ) { printrec(fout, var, le, fHideRecursion /*&& (getRecursivness(sig)==0)*/ ); } + + // debruinj notation + else if ( isRec(sig, le) ) { printrec(fout, le, fHideRecursion ); } + else if ( isRef(sig, i) ) { fout << "REF[" << i << "]"; } + + else if ( getUserData(sig) ) { printextended(fout, sig); } + else if ( isSigInt(sig, &i) ) { fout << i; } + else if ( isSigReal(sig, &r) ) { fout << r; } + else if ( isSigInput(sig, &i) ) { fout << "IN[" << i << "]"; } + else if ( isSigOutput(sig, &i, x) ) { printout(fout, i, x) ; } + + else if ( isSigDelay1(sig, x) ) { fout << ppsig(x, fEnv, 9) << "'"; } + //else if ( isSigFixDelay(sig, x, y) ) { printinfix(fout, "@", 8, x, y); } + else if ( isSigFixDelay(sig, x, y) ) { printFixDelay(fout, x, y); } + else if ( isSigPrefix(sig, x, y) ) { printfun(fout, "prefix", x, y); } + else if ( isSigIota(sig, x) ) { printfun(fout, "iota", x); } + else if ( isSigBinOp(sig, &i, x, y) ) { printinfix(fout, gBinOpTable[i]->fName, gBinOpTable[i]->fPriority, x, y); } + else if ( isSigFFun(sig, ff, largs) ) { printff(fout, ff, largs); } + else if ( isSigFConst(sig, type, name, file) ) { fout << tree2str(name); } + else if ( isSigFVar(sig, type, name, file) ) { fout << tree2str(name); } + + else if ( isSigTable(sig, id, x, y) ) { printfun(fout, "TABLE", x, y); } + else if ( isSigWRTbl(sig, id, x, y, z) ) { printfun(fout, "write", x, y, z); } + else if ( isSigRDTbl(sig, x, y) ) { printfun(fout, "read", x, y); } + else if ( isSigGen(sig, x) ) { fout << ppsig(x, fEnv, fPriority); } + + else if ( isSigDocConstantTbl(sig, x, y) ) { printfun(fout, "docConstantTbl", x, y); } + else if ( isSigDocWriteTbl(sig, x, y, z, u) ) { printfun(fout, "docWriteTbl", x, y, z, u); } + else if ( isSigDocAccessTbl(sig, x, y) ) { printfun(fout, "docAccessTbl", x, y); } + + else if ( isSigSelect2(sig, sel, x, y) ) { printfun(fout, "select2", sel, x, y); } + else if ( isSigSelect3(sig, sel, x, y, z) ) { printfun(fout, "select3", sel, x, y, z); } + + else if ( isSigIntCast(sig, x) ) { printfun(fout, "int", x); } + else if ( isSigFloatCast(sig, x) ) { printfun(fout, "float", x); } + + else if ( isSigButton(sig, label) ) { printui(fout, "button", label); } + else if ( isSigCheckbox(sig, label) ) { printui(fout, "checkbox", label); } + else if ( isSigVSlider(sig, label,c,x,y,z) ) { printui(fout, "vslider", label, c, x, y, z); } + else if ( isSigHSlider(sig, label,c,x,y,z) ) { printui(fout, "hslider", label, c, x, y, z); } + else if ( isSigNumEntry(sig, label,c,x,y,z) ) { printui(fout, "nentry", label, c, x, y, z); } + else if ( isSigVBargraph(sig, label,x,y,z) ) { printui(fout, "vbargraph", label, x, y, z); } + else if ( isSigHBargraph(sig, label,x,y,z) ) { printui(fout, "hbargraph", label, x, y, z); } + else if ( isSigAttach(sig, x, y) ) { printfun(fout, "attach", x, y); } + + else if ( isSigVectorize(sig,x,y)) { printfun(fout, "vectorize", x, y); } + else if ( isSigSerialize(sig,x)) { printfun(fout, "serialize", x); } + else if ( isSigVectorAt(sig,x,y)) { printfun(fout, "vectorAt", x, y); } + else if ( isSigConcat(sig,x,y)) { printfun(fout, "concat", x, y); } + + else if ( isSigUpSample(sig,x,y)) { printfun(fout, "up", x, y); } + else if ( isSigDownSample(sig,x,y)) { printfun(fout, "down", x, y); } + + else { + cerr << "NOT A SIGNAL : " << *sig << endl; + //exit(1); + } + return fout; +} +