|
FAUST compiler
0.9.9.6b8
|
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
1.8.0