Rename interpretor to interpreter.
[Faustine.git] / 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 (file)
index 0000000..079e6c3
--- /dev/null
@@ -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 <string>
+#include <list>
+#include <set>
+#include <map>
+#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<string>                        fIncludeFileSet;
+       set<string>                     fLibrarySet;
+
+       list<Klass* >           fSubClassList;
+
+       list<string>            fDeclCode;
+       list<string>            fStaticInitCode;                ///< static init code for class constant tables
+       list<string>            fStaticFields;                  ///< static fields after class
+       list<string>            fInitCode;
+       list<string>            fUICode;
+       list<string>            fUIMacro;
+
+#if 0
+    list<string>        fSlowDecl;
+    list<string>        fSharedDecl;            ///< declare shared variables for openMP
+    list<string>        fCommonCode;            ///< code executed by all threads
+    list<string>        fSlowCode;
+    list<string>        fEndCode;
+#endif
+    list<string>        fSharedDecl;            ///< shared declarations
+    list<string>        fFirstPrivateDecl;      ///< first private declarations
+
+    list<string>        fZone1Code;              ///< shared vectors
+    list<string>        fZone2Code;              ///< first private
+    list<string>        fZone2bCode;             ///< single once per block
+    list<string>        fZone2cCode;             ///< single once per block
+    list<string>        fZone3Code;             ///< private every sub block
+  
+    Loop*               fTopLoop;               ///< active loops currently open
+    property<Loop*>     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<string>& S);
+
+       void collectLibrary(set<string>& 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<Loop*>& 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<Tree, set<Tree> >& 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