X-Git-Url: https://scm.cri.ensmp.fr/git/Faustine.git/blobdiff_plain/1059e1cc0c2ecfa237406949aa26155b6a5b9154..66f23d4fabf89ad09adbd4dfc15ac6b5b2b7da83:/interpreter/preprocessor/faust-0.9.47mr3/compiler/generator/klass.hh diff --git a/interpreter/preprocessor/faust-0.9.47mr3/compiler/generator/klass.hh b/interpreter/preprocessor/faust-0.9.47mr3/compiler/generator/klass.hh new file mode 100644 index 0000000..079e6c3 --- /dev/null +++ b/interpreter/preprocessor/faust-0.9.47mr3/compiler/generator/klass.hh @@ -0,0 +1,223 @@ +/************************************************************************ + ************************************************************************ + 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 _KLASS_H +#define _KLASS_H + +/********************************************************************** + - klass.h : class C++ � remplir (projet FAUST) - + + + Historique : + ----------- + 17-10-2001 : implementation initiale (yo) + 18-10-2001 : Ajout de getFreshID (yo) + 02-11-2001 : Ajout de sous classes (yo) + +***********************************************************************/ +using namespace std; + +#include +#include +#include +#include +#include "sigtype.hh" +#include "smartpointer.hh" +#include "tlib.hh" +#include "uitree.hh" +#include "property.hh" + +#define kMaxCategory 32 + +#include "loop.hh" +#include "graphSorting.hh" + +class Klass //: public Target +{ + +protected: + // we make it global because several classes may need + // power def but we want the code to be generated only once + static bool fNeedPowerDef; ///< true when faustpower definition is needed + + + protected: + + string fKlassName; + string fSuperKlassName; + int fNumInputs; + int fNumOutputs; + int fNumActives; ///< number of active controls in the UI (sliders, buttons, etc.) + int fNumPassives; ///< number of passive widgets in the UI (bargraphs, etc.) + + set fIncludeFileSet; + set fLibrarySet; + + list fSubClassList; + + list fDeclCode; + list fStaticInitCode; ///< static init code for class constant tables + list fStaticFields; ///< static fields after class + list fInitCode; + list fUICode; + list fUIMacro; + +#if 0 + list fSlowDecl; + list fSharedDecl; ///< declare shared variables for openMP + list fCommonCode; ///< code executed by all threads + list fSlowCode; + list fEndCode; +#endif + list fSharedDecl; ///< shared declarations + list fFirstPrivateDecl; ///< first private declarations + + list fZone1Code; ///< shared vectors + list fZone2Code; ///< first private + list fZone2bCode; ///< single once per block + list fZone2cCode; ///< single once per block + list fZone3Code; ///< private every sub block + + Loop* fTopLoop; ///< active loops currently open + property fLoopProperty; ///< loops used to compute some signals + + bool fVec; + + public: + + Klass (const string& name, const string& super, int numInputs, int numOutputs, bool __vec = false) + : fKlassName(name), fSuperKlassName(super), fNumInputs(numInputs), fNumOutputs(numOutputs), + fNumActives(0), fNumPassives(0), + fTopLoop(new Loop(0, "count")), fVec(__vec) + {} + + virtual ~Klass() {} + + void openLoop(const string& size); + void openLoop(Tree recsymbol, const string& size); + void closeLoop(Tree sig); + + void setLoopProperty(Tree sig, Loop* l); ///< Store the loop used to compute a signal + bool getLoopProperty(Tree sig, Loop*& l); ///< Returns the loop used to compute a signal + const string& getClassName() const { return fKlassName; } ///< Returns the name of the class + + Loop* topLoop() { return fTopLoop; } + + void buildTasksList(); + + void addIncludeFile (const string& str) { fIncludeFileSet.insert(str); } + + void addLibrary (const string& str) { fLibrarySet.insert(str); } + + void rememberNeedPowerDef () { fNeedPowerDef = true; } + + void collectIncludeFile(set& S); + + void collectLibrary(set& S); + + void addSubKlass (Klass* son) { fSubClassList.push_back(son); } + + void addDeclCode (const string& str) { fDeclCode.push_back(str); } + + void addInitCode (const string& str) { fInitCode.push_back(str); } + + void addStaticInitCode (const string& str) { fStaticInitCode.push_back(str); } + + void addStaticFields (const string& str) { fStaticFields.push_back(str); } + + void addUICode (const string& str) { fUICode.push_back(str); } + + void addUIMacro (const string& str) { fUIMacro.push_back(str); } + + void incUIActiveCount () { fNumActives++; } + void incUIPassiveCount () { fNumPassives++; } + + + void addSharedDecl (const string& str) { fSharedDecl.push_back(str); } + void addFirstPrivateDecl (const string& str) { fFirstPrivateDecl.push_back(str); } + + void addZone1 (const string& str) { fZone1Code.push_back(str); } + void addZone2 (const string& str) { fZone2Code.push_back(str); } + void addZone2b (const string& str) { fZone2bCode.push_back(str); } + void addZone2c (const string& str) { fZone2cCode.push_back(str); } + void addZone3 (const string& str) { fZone3Code.push_back(str); } + + void addPreCode ( const string& str) { fTopLoop->addPreCode(str); } + void addExecCode ( const string& str) { fTopLoop->addExecCode(str); } + void addPostCode (const string& str) { fTopLoop->addPostCode(str); } + + virtual void println(int n, ostream& fout); + + virtual void printComputeMethod (int n, ostream& fout); + virtual void printComputeMethodScalar (int n, ostream& fout); + virtual void printComputeMethodVectorFaster (int n, ostream& fout); + virtual void printComputeMethodVectorSimple (int n, ostream& fout); + virtual void printComputeMethodOpenMP (int n, ostream& fout); + virtual void printComputeMethodScheduler (int n, ostream& fout); + + virtual void printLoopGraphScalar(int n, ostream& fout); + virtual void printLoopGraphVector(int n, ostream& fout); + virtual void printLoopGraphOpenMP(int n, ostream& fout); + virtual void printLoopGraphScheduler(int n, ostream& fout); + virtual void printLoopGraphInternal(int n, ostream& fout); + virtual void printGraphDotFormat(ostream& fout); + + // experimental + virtual void printLoopDeepFirst(int n, ostream& fout, Loop* l, set& visited); + + virtual void printLastLoopLevelScheduler(int n, int lnum, const lset& L, ostream& fout); + virtual void printLoopLevelScheduler(int n, int lnum, const lset& L, ostream& fout); + virtual void printOneLoopScheduler(lset::const_iterator p, int n, ostream& fout); + virtual void printLoopLevelOpenMP(int n, int lnum, const lset& L, ostream& fout); + + virtual void printMetadata(int n, const map >& S, ostream& fout); + + virtual void printIncludeFile(ostream& fout); + + virtual void printLibrary(ostream& fout); + virtual void printAdditionalCode(ostream& fout); + + int inputs() { return fNumInputs; } + int outputs() { return fNumOutputs; } +}; + +class SigIntGenKlass : public Klass { + + public: + + SigIntGenKlass (const string& name) : Klass(name, "", 0, 1, false) {} + + virtual void println(int n, ostream& fout); +}; + +class SigFloatGenKlass : public Klass { + + public: + + SigFloatGenKlass (const string& name) : Klass(name, "", 0, 1, false) {} + + virtual void println(int n, ostream& fout); +}; + + +#endif