X-Git-Url: https://scm.cri.ensmp.fr/git/Faustine.git/blobdiff_plain/c7f552fd8888da2f0d8cfb228fe0f28d3df3a12c..b4b6f2ea75b9f0f3ca918f5b84016610bf7a4d4f:/interpretor/preprocessor/faust-0.9.47mr3/compiler/headers/loop.hh diff --git a/interpretor/preprocessor/faust-0.9.47mr3/compiler/headers/loop.hh b/interpretor/preprocessor/faust-0.9.47mr3/compiler/headers/loop.hh new file mode 100644 index 0000000..3f0879b --- /dev/null +++ b/interpretor/preprocessor/faust-0.9.47mr3/compiler/headers/loop.hh @@ -0,0 +1,93 @@ +/************************************************************************ + ************************************************************************ + 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. + ************************************************************************ + ************************************************************************/ + + + +#ifndef _LOOP_H +#define _LOOP_H + +/********************************************************************** + - loop.hh : loop C++ à remplir (projet FAUST) - + + + Historique : + ----------- + 21-01-2008 : implementation initiale (yo) + +***********************************************************************/ +namespace std{} +using namespace std; + +#include +#include +#include +#include +#include +#include "tlib.hh" + +#define kMaxCategory 32 + +/* + * Loops are lines of code that correspond to a recursive expression or a vector expression. + */ + +struct Loop +{ + const bool fIsRecursive; ///< recursive loops can't be SIMDed + Tree fRecSymbolSet; ///< recursive loops define a set of recursive symbol + Loop* const fEnclosingLoop; ///< Loop from which this one originated + const string fSize; ///< number of iterations of the loop + // fields concerned by absorbsion + set fBackwardLoopDependencies; ///< Loops that must be computed before this one + set fForwardLoopDependencies; ///< Loops that will be computed after this one + list fPreCode; ///< code to execute at the begin of the loop + list fExecCode; ///< code to execute in the loop + list fPostCode; ///< code to execute at the end of the loop + // for topological sort + int fOrder; ///< used during topological sort + int fIndex; ///< used during scheduler mode code generation + // new fields + int fUseCount; ///< how many loops depend on this one + list fExtraLoops; ///< extra loops that where in sequences + + int fPrinted; ///< true when loop has been printed (to track multi-print errors) + +public: + Loop(Tree recsymbol, Loop* encl, const string& size); ///< create a recursive loop + Loop(Loop* encl, const string& size); ///< create a non recursive loop + + bool isEmpty(); ///< true when the loop doesn't contain any line of code + bool hasRecDependencyIn(Tree S); ///< returns true is this loop or its ancestors define a symbol in S + + void addPreCode (const string& str); ///< add a line of C++ code pre code + void addExecCode (const string& str); ///< add a line of C++ code + void addPostCode (const string& str); ///< add a line of C++ post code + void println (int n, ostream& fout); ///< print the loop + void printParLoopln(int n, ostream& fout); ///< print the loop with a #pragma omp loop + + void printoneln (int n, ostream& fout); ///< print the loop in scalar mode + + void absorb(Loop* l); ///< absorb a loop inside this one + // new method + void concat(Loop* l); +}; + +#endif