--- /dev/null
+/************************************************************************
+ ************************************************************************
+ 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