FAUST compiler  0.9.9.6b8
signals.hh
Go to the documentation of this file.
00001 /************************************************************************
00002  ************************************************************************
00003     FAUST compiler
00004     Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale
00005     ---------------------------------------------------------------------
00006     This program is free software; you can redistribute it and/or modify
00007     it under the terms of the GNU General Public License as published by
00008     the Free Software Foundation; either version 2 of the License, or
00009     (at your option) any later version.
00010 
00011     This program is distributed in the hope that it will be useful,
00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014     GNU General Public License for more details.
00015 
00016     You should have received a copy of the GNU General Public License
00017     along with this program; if not, write to the Free Software
00018     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00019  ************************************************************************
00020  ************************************************************************/
00021 
00022 
00023 
00024 #ifndef _SIGNALS_
00025 #define _SIGNALS_
00026 
00027 #include "tlib.hh"
00028 #include "binop.hh"
00029 #include <assert.h>
00030 #include <vector>
00031 
00032 using namespace std;
00033 
00034 
00036 
00041 
00042 
00043 // Constant signals : for all t, x(t)=n
00044 Tree sigInt(int n);
00045 Tree sigReal(double n);
00046 
00047 bool  isSigInt(Tree t, int* i);
00048 bool  isSigReal(Tree t, double* r);
00049 
00050 
00051 // Inputs and outputs
00052 Tree sigInput(int i);
00053 Tree sigOutput(int i, Tree t);
00054 
00055 bool  isSigInput(Tree t, int* i);
00056 bool  isSigOutput(Tree t, int* i, Tree& t0);
00057 
00058 // delay
00059 Tree  sigDelay0(Tree t);
00060 Tree  sigDelay1(Tree t);
00061 bool  isSigDelay1(Tree t, Tree& t0);
00062 
00063 Tree  sigFixDelay(Tree t0, Tree t1);
00064 bool  isSigFixDelay(Tree t, Tree& t0, Tree& t1);
00065 
00066 Tree  sigPrefix(Tree t0, Tree t1);
00067 bool  isSigPrefix(Tree t, Tree& t0, Tree& t1);
00068 
00069 Tree  sigIota(Tree t0);
00070 bool  isSigIota(Tree t, Tree& t0);
00071 
00072 // Int and Double casting
00073 Tree  sigIntCast(Tree t);
00074 Tree  sigFloatCast(Tree t);
00075 
00076 bool  isSigIntCast(Tree t);
00077 bool  isSigFloatCast(Tree t);
00078 
00079 bool  isSigIntCast(Tree t, Tree& x);
00080 bool  isSigFloatCast(Tree t, Tree& x);
00081 
00082 
00083 // tables
00084 Tree sigRDTbl (Tree t, Tree i);
00085 Tree sigWRTbl (Tree id, Tree t, Tree i, Tree s);
00086 Tree sigTable (Tree id, Tree n, Tree sig);
00087 Tree sigGen   (Tree content);
00088 
00089 bool isSigRDTbl (Tree s, Tree& t, Tree& i);
00090 bool isSigWRTbl (Tree u, Tree& id, Tree& t, Tree& i, Tree& s);
00091 bool isSigTable (Tree t, Tree& id, Tree& n, Tree& sig);
00092 bool isSigGen   (Tree t, Tree& content);
00093 bool isSigGen   (Tree t);
00094 
00095 inline Tree sigWriteReadTable(Tree n, Tree init, Tree widx, Tree wsig, Tree ridx)
00096 {
00097     return sigRDTbl(sigWRTbl(nil, sigTable(nil, n, sigGen(init)), widx, wsig), ridx);
00098 }
00099 
00100 inline Tree sigReadOnlyTable(Tree n, Tree init, Tree ridx)
00101 {
00102     return sigRDTbl(sigTable(nil, n, sigGen(init)), ridx);
00103 }
00104 
00105 
00106 // Tables for documentator
00107 // used to replace real tables for documentation purposes only
00108 
00109 Tree sigDocConstantTbl(Tree n, Tree init);
00110 Tree sigDocWriteTbl(Tree n, Tree init, Tree widx, Tree wsig);
00111 Tree sigDocAccessTbl(Tree doctbl, Tree ridx);
00112 
00113 bool isSigDocConstantTbl(Tree s, Tree& n, Tree& init);
00114 bool isSigDocWriteTbl(Tree s, Tree& n, Tree& init, Tree& widx, Tree& wsig);
00115 bool isSigDocAccessTbl(Tree s, Tree& doctbl, Tree& ridx);
00116 
00117 // selectors
00118 
00119 Tree sigSelect2 (Tree selector, Tree s1, Tree s2);
00120 Tree sigSelect3 (Tree selector, Tree s1, Tree s2, Tree s3);
00121 
00122 bool isSigSelect2 (Tree t, Tree& selector, Tree& s1, Tree& s2);
00123 bool isSigSelect3 (Tree t, Tree& selector, Tree& s1, Tree& s2, Tree& s3);
00124 
00125 // arithmetical operations 
00126 
00127 Tree sigBinOp   (int op, Tree x, Tree y);
00128 bool isSigBinOp (Tree s, int* op, Tree& x, Tree& y);
00129 
00130 // Foreign Functions
00131 
00132 Tree sigFFun (Tree ff, Tree largs);
00133 bool isSigFFun  (Tree s, Tree& ff, Tree& largs);
00134 
00135 // Foreign Constants
00136 
00137 Tree sigFConst      (Tree type, Tree name, Tree file);
00138 bool isSigFConst    (Tree s);
00139 bool isSigFConst    (Tree s, Tree& type, Tree& name, Tree& file);
00140 
00141 // Foreign Variables
00142 
00143 Tree sigFVar      (Tree type, Tree name, Tree file);
00144 bool isSigFVar    (Tree s);
00145 bool isSigFVar    (Tree s, Tree& type, Tree& name, Tree& file);
00146 
00147 // emulation des anciennes fonctions
00148 inline Tree sigAdd(Tree x, Tree y)  { return sigBinOp(kAdd, x, y); }
00149 inline Tree sigSub(Tree x, Tree y)  { return sigBinOp(kSub, x, y); }
00150 inline Tree sigMul(Tree x, Tree y)  { return sigBinOp(kMul, x, y); }
00151 inline Tree sigDiv(Tree x, Tree y)  { return sigBinOp(kDiv, x, y); }
00152 inline Tree sigRem(Tree x, Tree y)  { return sigBinOp(kRem, x, y); }
00153 
00154 inline Tree sigAND(Tree x, Tree y)  { return sigBinOp(kAND, x, y); }
00155 inline Tree sigOR(Tree x, Tree y)   { return sigBinOp(kOR, x, y); }
00156 inline Tree sigXOR(Tree x, Tree y)  { return sigBinOp(kXOR, x, y); }
00157 
00158 inline Tree sigLeftShift(Tree x, Tree y)    { return sigBinOp(kLsh, x, y); }
00159 inline Tree sigRightShift(Tree x, Tree y)   { return sigBinOp(kRsh, x, y); }
00160 
00161 inline Tree sigGT(Tree x, Tree y)   { return sigBinOp(kGT, x, y); }
00162 inline Tree sigLT(Tree x, Tree y)   { return sigBinOp(kLT, x, y); }
00163 inline Tree sigGE(Tree x, Tree y)   { return sigBinOp(kGE, x, y); }
00164 inline Tree sigLE(Tree x, Tree y)   { return sigBinOp(kLE, x, y); }
00165 inline Tree sigEQ(Tree x, Tree y)   { return sigBinOp(kEQ, x, y); }
00166 inline Tree sigNE(Tree x, Tree y)   { return sigBinOp(kNE, x, y); }
00167 
00168 // pattern matching pour les anciennes fonctions
00169 bool isSigAdd   (Tree a, Tree&x, Tree&y);
00170 bool isSigMul   (Tree a, Tree&x, Tree&y);
00171 bool isSigSub   (Tree a, Tree&x, Tree&y);
00172 bool isSigDiv   (Tree a, Tree&x, Tree&y);
00173 
00174 // operations pratiques sur des arbres dont on sait qu'ils sont des nombres
00175 Tree addNums    (Tree a, Tree b);
00176 Tree subNums    (Tree a, Tree b);
00177 Tree mulNums    (Tree a, Tree b);
00178 Tree divNums    (Tree a, Tree b);
00179 Tree divExtendedNums    (Tree a, Tree b);
00180 Tree minusNum   (Tree a);
00181 Tree inverseNum (Tree a);
00182 
00183 // tests sur les signaux constants
00184 inline bool isNum       (Tree a)    { assert(a); return isNum(a->node()); }
00185 inline bool isZero      (Tree a)    { assert(a); return isZero(a->node()); }
00186 inline bool isGTZero    (Tree a)    { assert(a); return isGTZero(a->node()); }
00187 inline bool isGEZero    (Tree a)    { assert(a); return isGEZero(a->node()); }
00188 inline bool isOne       (Tree a)    { assert(a); return isOne(a->node()); }
00189 inline bool isMinusOne  (Tree a)    { assert(a); return isMinusOne(a->node()); }
00190 
00191 //projection for recursive groups
00192 Tree sigProj (int i, Tree rgroup);
00193 bool isProj (Tree t, int* i, Tree& rgroup);
00194 
00195 inline bool isNum(const Tree& t, num& n)
00196 {
00197     double      f;
00198     int         i;
00199 
00200     if (isDouble(t->node(), &f)) { n = f; return true;  }
00201     if (isInt(t->node(), &i)) { n = i; return true;  }
00202     return false;
00203 }
00204 
00205 
00206 /*****************************************************************************
00207                              User Interface Elements
00208 *****************************************************************************/
00209 
00210 Tree sigButton   (Tree label);
00211 bool isSigButton (Tree s);
00212 bool isSigButton (Tree s, Tree& label);
00213 
00214 Tree sigCheckbox   (Tree label);
00215 bool isSigCheckbox (Tree s);
00216 bool isSigCheckbox (Tree s, Tree& label);
00217 
00218 Tree sigVSlider   (Tree label, Tree cur, Tree min, Tree max, Tree step);
00219 bool isSigVSlider (Tree s);
00220 bool isSigVSlider (Tree s, Tree& label, Tree& cur, Tree& min, Tree& max, Tree& step);
00221 
00222 Tree sigHSlider   (Tree label, Tree cur, Tree min, Tree max, Tree step);
00223 bool isSigHSlider (Tree s);
00224 bool isSigHSlider (Tree s, Tree& label, Tree& cur, Tree& min, Tree& max, Tree& step);
00225 
00226 Tree sigNumEntry   (Tree label, Tree cur, Tree min, Tree max, Tree step);
00227 bool isSigNumEntry (Tree s);
00228 bool isSigNumEntry (Tree s, Tree& label, Tree& cur, Tree& min, Tree& max, Tree& step);
00229 
00230 // output elements
00231 Tree sigVBargraph   (Tree label, Tree min, Tree max, Tree t0);
00232 bool isSigVBargraph (Tree s);
00233 bool isSigVBargraph (Tree s, Tree& label, Tree& min, Tree& max, Tree& t0);
00234 
00235 Tree sigHBargraph   (Tree label, Tree min, Tree max, Tree t0);
00236 bool isSigHBargraph (Tree s);
00237 bool isSigHBargraph (Tree s, Tree& label, Tree& min, Tree& max, Tree& t0);
00238 
00239 Tree sigAttach   (Tree x, Tree y);
00240 bool isSigAttach (Tree s);
00241 bool isSigAttach (Tree s, Tree& x, Tree& y);
00242 
00243 
00244 /*****************************************************************************
00245                              matrix extension
00246 *****************************************************************************/
00247 
00248 // a tuple of signals is basically a list of signals.
00249 // mode = 0 means normal, mode = 1 means blocked
00250 Tree sigTuple (int mode, Tree ls);
00251 bool isSigTuple (Tree s, int* mode, Tree& ls);
00252 
00253 // Access the components of a tuple.
00254 // ts is tuple of signals, idx is a scalar signal between 0..n
00255 Tree sigTupleAccess(Tree ts, Tree idx);
00256 bool isSigTupleAccess(Tree s, Tree& ts, Tree& idx);
00257 
00258 // create a tuple of signals
00259 Tree sigCartesianProd (Tree s1, Tree s2);
00260 
00261 
00262 
00263 /*****************************************************************************
00264                              access to sub signals of a signal
00265 *****************************************************************************/
00266 
00267 int getSubSignals (Tree sig, vector<Tree>& vsigs, bool visitgen=true);
00268 
00269 
00276 bool verySimple(Tree exp);
00277 
00278 
00279 
00280 #endif