00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "signals.hh"
00031
00032
00034
00038
00039
00040 Tree sigInt(int i) { return tree(i); }
00041 bool isSigInt(Tree t, int* i) { return isInt(t->node(), i); }
00042
00043 Tree sigReal(float r) { return tree(r); }
00044 bool isSigReal(Tree t, float* r) { return isFloat(t->node(), r); }
00045
00046 Sym SIGINPUT = symbol ("sigInput");
00047 Tree sigInput(int i) { return tree(SIGINPUT, tree(i)); }
00048 bool isSigInput(Tree t, int* i) { Tree x; return isTree(t, SIGINPUT, x) && isInt(x->node(),i); }
00049
00050 Sym SIGOUTPUT = symbol ("sigOutput");
00051 Tree sigOutput(int i, Tree t0) { return tree(SIGOUTPUT, tree(i), t0); }
00052 bool isSigOutput(Tree t, int* i, Tree& t0) { Tree x; return isTree(t, SIGOUTPUT, x, t0) && isInt(x->node(),i); }
00053
00054 Sym SIGDELAY1 = symbol ("sigDelay1");
00055 Tree sigDelay0(Tree t0) { return sigFixDelay(t0, sigInt(0));}
00056
00057 Tree sigDelay1(Tree t0) { return tree(SIGDELAY1, t0); }
00058 bool isSigDelay1(Tree t, Tree& t0) { return isTree(t, SIGDELAY1, t0); }
00059
00060 Sym SIGFIXDELAY = symbol ("sigFixDelay");
00061 Tree sigFixDelay(Tree t0, Tree t1) { return tree(SIGFIXDELAY, t0, sigIntCast(t1)); }
00062 bool isSigFixDelay(Tree t, Tree& t0, Tree& t1) { return isTree(t, SIGFIXDELAY, t0, t1); }
00063
00064 Sym SIGPREFIX = symbol ("sigPrefix");
00065 Tree sigPrefix(Tree t0, Tree t1) { return tree(SIGPREFIX, t0, t1); }
00066 bool isSigPrefix(Tree t, Tree& t0, Tree& t1) { return isTree(t, SIGPREFIX, t0, t1); }
00067
00068 Sym SIGIOTA = symbol ("sigIota");
00069 Tree sigIota(Tree t0) { return tree(SIGIOTA, t0); }
00070 bool isSigIota(Tree t, Tree& t0) { return isTree(t, SIGIOTA, t0); }
00071
00072
00073 Sym SIGRDTBL = symbol ("SigRDTbl");
00074 Tree sigRDTbl (Tree t, Tree i) { return tree(SIGRDTBL, t, i); }
00075 bool isSigRDTbl (Tree s, Tree& t, Tree& i) { return isTree(s, SIGRDTBL, t, i); }
00076
00077 Sym SIGWRTBL = symbol ("SigWRTbl");
00078 Tree sigWRTbl (Tree id, Tree t, Tree i, Tree s) { return tree(SIGWRTBL, id, t, i, s); }
00079 bool isSigWRTbl (Tree u, Tree& id, Tree& t, Tree& i, Tree& s) { return isTree(u, SIGWRTBL, id, t, i, s); }
00080
00081 Sym SIGTABLE = symbol ("SigTable");
00082 Tree sigTable (Tree id, Tree n, Tree sig) { return tree(SIGTABLE, id, n, sig); }
00083 bool isSigTable (Tree t, Tree& id, Tree& n, Tree& sig) { return isTree(t, SIGTABLE, id, n, sig); }
00084
00085
00086
00087 Sym SIGSELECT2 = symbol ("SigSelect2");
00088 Sym SIGSELECT3 = symbol ("SigSelect3");
00089
00090 Tree sigSelect2 (Tree selector, Tree s1, Tree s2) { return tree(SIGSELECT2, sigIntCast(selector), s1, s2); }
00091 bool isSigSelect2 (Tree t, Tree& selector, Tree& s1, Tree& s2) { return isTree(t, SIGSELECT2, selector, s1, s2); }
00092
00093 Tree sigSelect3 (Tree selector, Tree s1, Tree s2, Tree s3) { return tree(SIGSELECT3, sigIntCast(selector), s1, s2, s3); }
00094 bool isSigSelect3 (Tree t, Tree& selector, Tree& s1, Tree& s2, Tree& s3) { return isTree(t, SIGSELECT3, selector, s1, s2, s3); }
00095
00096
00097
00098
00099 Sym SIGBINOP = symbol ("SigBinOp");
00100 Tree sigBinOp(int op, Tree x, Tree y) { return tree(SIGBINOP, tree(op), x, y); }
00101 bool isSigBinOp(Tree s, int* op, Tree& x, Tree& y) { Tree t; return isTree(s, SIGBINOP, t, x, y) && isInt(t->node(),op); }
00102
00103
00104
00105
00106 Sym SIGFFUN = symbol ("SigFFun");
00107 Tree sigFFun (Tree ff, Tree largs) { return tree(SIGFFUN, ff, largs); }
00108 bool isSigFFun (Tree s, Tree& ff, Tree& largs) { return isTree(s, SIGFFUN, ff, largs); }
00109
00110
00111 Sym SIGFCONST = symbol ("SigFConst");
00112 Tree sigFConst (Tree type, Tree name, Tree file) { return tree(SIGFCONST, type, name, file); }
00113 bool isSigFConst (Tree s) { Tree t,n,f; return isTree(s, SIGFCONST, t, n, f); }
00114 bool isSigFConst (Tree s, Tree& type, Tree& name, Tree& file) { return isTree(s, SIGFCONST,type, name, file); }
00115
00116
00117 Sym SIGFVAR = symbol ("SigFVar");
00118 Tree sigFVar (Tree type, Tree name, Tree file) { return tree(SIGFVAR, type, name, file); }
00119 bool isSigFVar (Tree s) { Tree t,n,f; return isTree(s, SIGFVAR, t, n, f); }
00120 bool isSigFVar (Tree s, Tree& type, Tree& name, Tree& file) { return isTree(s, SIGFVAR, type, name, file); }
00121
00122
00123
00124 Sym SIGGEN = symbol ("SigGen");
00125 Tree sigGen (Tree s) { return tree(SIGGEN, s); }
00126 bool isSigGen (Tree t, Tree& x) { return isTree(t, SIGGEN, x); }
00127 bool isSigGen (Tree t) { return t->node()== Node(SIGGEN); }
00128
00129
00130
00131 Sym SIGPROJ = symbol ("SigProj");
00132 Tree sigProj (int i, Tree rgroup) { return tree(SIGPROJ, tree(i), rgroup); }
00133 bool isProj (Tree t, int* i, Tree& rgroup) { Tree x; return isTree(t, SIGPROJ, x, rgroup) && isInt(x->node(), i); }
00134
00135
00136
00137
00138 Sym SIGINTCAST = symbol ("sigIntCast");
00139 Sym SIGFLOATCAST = symbol ("sigFloatCast");
00140
00141 Tree sigIntCast(Tree t)
00142 {
00143 Node n = t->node();
00144
00145 int i; if (isInt(n, &i)) return t;
00146 float x; if (isFloat(n, &x)) return tree(int(x));
00147 if (isSigIntCast(t)) return t;
00148
00149 return tree(SIGINTCAST, t);
00150 }
00151
00152 Tree sigFloatCast(Tree t)
00153 {
00154 Node n = t->node();
00155
00156 int i; if (isInt(n, &i)) return tree(float(i));
00157 float x; if (isFloat(n, &x)) return t;
00158 if (isSigFloatCast(t)) return t;
00159 if (isSigInput(t, &i)) return t;
00160
00161 return tree(SIGFLOATCAST, t);
00162 }
00163
00164
00165
00166 bool isSigIntCast(Tree t) { Tree x; return isTree(t, SIGINTCAST, x); }
00167 bool isSigIntCast(Tree t, Tree& x) { return isTree(t, SIGINTCAST, x); }
00168
00169 bool isSigFloatCast(Tree t) { Tree x; return isTree(t, SIGFLOATCAST, x);}
00170 bool isSigFloatCast(Tree t, Tree& x) { return isTree(t, SIGFLOATCAST, x); }
00171
00172
00173
00174
00175
00176
00177
00178
00179 Sym SIGBUTTON = symbol ("SigButton");
00180 Tree sigButton (Tree lbl) { return tree(SIGBUTTON, lbl); }
00181 bool isSigButton (Tree s) { Tree lbl; return isTree(s, SIGBUTTON, lbl); }
00182 bool isSigButton (Tree s, Tree& lbl) { return isTree(s, SIGBUTTON, lbl); }
00183
00184
00185 Sym SIGCHECKBOX = symbol ("SigCheckbox");
00186 Tree sigCheckbox (Tree lbl) { return tree(SIGCHECKBOX, lbl); }
00187 bool isSigCheckbox (Tree s) { Tree lbl; return isTree(s, SIGCHECKBOX, lbl); }
00188 bool isSigCheckbox (Tree s, Tree& lbl) { return isTree(s, SIGCHECKBOX, lbl); }
00189
00190
00191 Sym SIGHSLIDER = symbol ("SigHSlider");
00192 Tree sigHSlider (Tree lbl, Tree cur, Tree min, Tree max, Tree step)
00193 { return tree(SIGHSLIDER, lbl, list4(cur,min,max,step)); }
00194 bool isSigHSlider (Tree s) { Tree lbl, params; return isTree(s, SIGHSLIDER, lbl, params); }
00195
00196 bool isSigHSlider (Tree s, Tree& lbl, Tree& cur, Tree& min, Tree& max, Tree& step)
00197 {
00198 Tree params;
00199 if (isTree(s, SIGHSLIDER, lbl, params)) {
00200 cur = nth(params, 0);
00201 min = nth(params, 1);
00202 max = nth(params, 2);
00203 step= nth(params, 3);
00204 return true;
00205 } else {
00206 return false;
00207 }
00208 }
00209
00210
00211 Sym SIGVSLIDER = symbol ("SigVSlider");
00212 Tree sigVSlider (Tree lbl, Tree cur, Tree min, Tree max, Tree step)
00213 { return tree(SIGVSLIDER, lbl, list4(cur,min,max,step)); }
00214 bool isSigVSlider (Tree s) { Tree lbl, params; return isTree(s, SIGVSLIDER, lbl, params); }
00215
00216 bool isSigVSlider (Tree s, Tree& lbl, Tree& cur, Tree& min, Tree& max, Tree& step)
00217 {
00218 Tree params;
00219 if (isTree(s, SIGVSLIDER, lbl, params)) {
00220 cur = nth(params, 0);
00221 min = nth(params, 1);
00222 max = nth(params, 2);
00223 step= nth(params, 3);
00224 return true;
00225 } else {
00226 return false;
00227 }
00228 }
00229
00230
00231 Sym SIGNUMENTRY = symbol ("SigNumEntry");
00232 Tree sigNumEntry (Tree lbl, Tree cur, Tree min, Tree max, Tree step)
00233 { return tree(SIGNUMENTRY, lbl, list4(cur,min,max,step)); }
00234 bool isSigNumEntry (Tree s) { Tree lbl, params; return isTree(s, SIGNUMENTRY, lbl, params); }
00235
00236 bool isSigNumEntry (Tree s, Tree& lbl, Tree& cur, Tree& min, Tree& max, Tree& step)
00237 {
00238 Tree params;
00239 if (isTree(s, SIGNUMENTRY, lbl, params)) {
00240 cur = nth(params, 0);
00241 min = nth(params, 1);
00242 max = nth(params, 2);
00243 step= nth(params, 3);
00244 return true;
00245 } else {
00246 return false;
00247 }
00248 }
00249
00250
00251
00252
00253
00254 Sym SIGHBARGRAPH = symbol ("SigHBargraph");
00255 Tree sigHBargraph (Tree lbl, Tree min, Tree max, Tree x) { return tree(SIGHBARGRAPH, lbl, min, max, x); }
00256 bool isSigHBargraph (Tree s) { Tree lbl, min, max, x; return isTree(s, SIGHBARGRAPH, lbl, min, max, x); }
00257 bool isSigHBargraph (Tree s, Tree& lbl, Tree& min, Tree& max, Tree& x) { return isTree(s, SIGHBARGRAPH, lbl, min, max, x); }
00258
00259
00260 Sym SIGVBARGRAPH = symbol ("SigVBargraph");
00261 Tree sigVBargraph (Tree lbl, Tree min, Tree max, Tree x) { return tree(SIGVBARGRAPH, lbl, min, max, x); }
00262 bool isSigVBargraph (Tree s) { Tree lbl, min, max, x; return isTree(s, SIGVBARGRAPH, lbl, min, max, x); }
00263 bool isSigVBargraph (Tree s, Tree& lbl, Tree& min, Tree& max, Tree& x) { return isTree(s, SIGVBARGRAPH, lbl, min, max, x); }
00264
00265
00266 Sym SIGATTACH = symbol ("sigAttach");
00267 Tree sigAttach(Tree t0, Tree t1) { return tree(SIGATTACH, t0, t1); }
00268 bool isSigAttach(Tree t, Tree& t0, Tree& t1) { return isTree(t, SIGATTACH, t0, t1); }
00269
00270
00271
00272 Tree addNums(Tree a, Tree b)
00273 {
00274 return tree(addNode(a->node(),b->node()));
00275 }
00276
00277 Tree subNums(Tree a, Tree b)
00278 {
00279 return tree(subNode(a->node(),b->node()));
00280 }
00281
00282 Tree mulNums(Tree a, Tree b)
00283 {
00284 return tree(mulNode(a->node(),b->node()));
00285 }
00286
00287 Tree divNums(Tree a, Tree b)
00288 {
00289 return tree(divNode(a->node(),b->node()));
00290 }
00291
00292 Tree divExtendedNums(Tree a, Tree b)
00293 {
00294 return tree(divExtendedNode(a->node(),b->node()));
00295 }
00296
00297 Tree minusNum(Tree a)
00298 {
00299 return tree(minusNode(a->node()));
00300 }
00301
00302 Tree inverseNum(Tree a)
00303 {
00304 return tree(inverseNode(a->node()));
00305 }
00306
00307 bool isSigAdd(Tree a, Tree& x, Tree& y)
00308 {
00309 int op;
00310 return isSigBinOp(a, &op, x, y) && (op == kAdd);
00311 }
00312
00313 bool isSigMul(Tree a, Tree& x, Tree& y)
00314 {
00315 int op;
00316 return isSigBinOp(a, &op, x, y) && (op == kMul);
00317 }
00318
00319 bool isSigSub(Tree a, Tree& x, Tree& y)
00320 {
00321 int op;
00322 return isSigBinOp(a, &op, x, y) && (op == kSub);
00323 }
00324
00325 bool isSigDiv(Tree a, Tree& x, Tree& y)
00326 {
00327 int op;
00328 return isSigBinOp(a, &op, x, y) && (op == kDiv);
00329 }
00330
00331
00332
00333
00334
00335
00336
00337 Sym SIGTUPLE = symbol ("SigTuple");
00338 Sym SIGTUPLEACCESS = symbol ("SigTupleAccess");
00339
00340
00341
00342 Tree sigTuple (int mode, Tree ls) { return tree(SIGTUPLE, tree(mode), ls); }
00343 bool isSigTuple (Tree s, int* mode, Tree& ls) { Tree m; return isTree(s, SIGTUPLE, m, ls) && isInt(m->node(), mode); }
00344
00345
00346
00347 Tree sigTupleAccess(Tree ts, Tree idx) { return tree(SIGTUPLEACCESS, ts, idx); }
00348 bool isSigTupleAccess(Tree s, Tree& ts, Tree& idx) { return isTree(s, SIGTUPLEACCESS, ts, idx); }
00349
00350
00351 Tree sigCartesianProd (Tree s1, Tree s2)
00352 {
00353 Tree l1, l2;
00354 int m1, m2;
00355
00356 if (isSigTuple(s1, &m1, l1) && (m1 == 0)) {
00357
00358 } else {
00359 l1 = list1(s1);
00360 }
00361
00362 if (isSigTuple(s2, &m2, l2) && (m2 == 0)) {
00363
00364 } else {
00365 l2 = list1(s2);
00366 }
00367
00368
00369 return sigTuple(0, concat(l1,l2));
00370 }
00371
00372
00373
00380 bool verySimple(Tree exp)
00381 {
00382 int i;
00383 float r;
00384 Tree type, name, file;
00385
00386 return isSigInt(exp, &i)
00387 || isSigReal(exp, &r)
00388 || isSigInput(exp, &i)
00389 || isSigFConst(exp, type, name, file);
00390 }