FAUST compiler  0.9.9.6b8
sigorderrules.cpp
Go to the documentation of this file.
1 /************************************************************************
2  ************************************************************************
3  FAUST compiler
4  Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale
5  ---------------------------------------------------------------------
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program; if not, write to the Free Software
18  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19  ************************************************************************
20  ************************************************************************/
21 
22 /************************************************************************
23  ************************************************************************
24  Signals Order Rules
25  Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale
26  ---------------------------------------------------------------------
27  A small typing system that computes the "order" of a signal :
28  0 = numerical constant
29  1 = non-numerical constants (FConst)
30  2 = User Interface
31  3 = Audio
32  This order will be used to put expressions in normal form.
33 
34  Contrary to the full type system, it doesn't require environments
35  or special treatments for recursions
36  ************************************************************************
37  ************************************************************************/
38 
39 
40 #include <stdio.h>
41 #include "sigtype.hh"
42 #include "sigprint.hh"
43 #include "prim2.hh"
44 #include "tlib.hh"
45 #include "sigorderrules.hh"
46 #include "xtended.hh"
47 
48 Tree ORDERPROP = tree(symbol("OrderProp"));
49 
50 static int infereSigOrder(Tree sig);
51 
62 int getSigOrder(Tree sig)
63 {
64  Tree tt;
65  if (getProperty(sig, ORDERPROP, tt)) {
66  return tree2int(tt);
67  } else {
68  int order = infereSigOrder(sig);
69  setProperty(sig, ORDERPROP, tree(order));
70  return order;
71  }
72 }
73 
74 // shortcut for order inference algorithm
75 #define O getSigOrder
76 
77 
78 
84 static int infereSigOrder(Tree sig)
85 {
86  int i;
87  double r;
88  Tree sel, s1, s2, s3, s4, ff, id, ls, l, x, y, var, body, type, name, file;
89 
90  xtended* xt = (xtended*) getUserData(sig);
91  // primitive elements
92  if (xt)
93  {
94  //return 3;
95  vector<int> args;
96  for (int i=0; i<sig->arity(); i++) { args.push_back( O(sig->branch(i)) ); }
97  return xt->infereSigOrder(args);
98  }
99 
100 
101  else if (isSigInt(sig, &i)) return 0;
102 
103  else if (isSigReal(sig, &r)) return 0;
104 
105  else if (isSigWaveform(sig)) return 3;
106 
107  else if (isSigInput(sig, &i)) return 3;
108 
109  else if (isSigOutput(sig, &i, s1)) return 3;
110 
111  else if (isSigDelay1(sig, s1)) return 3;
112 
113  else if (isSigPrefix(sig, s1, s2)) return 3;
114 
115  else if (isSigFixDelay(sig, s1, s2)) return 3;
116 
117  else if (isSigBinOp(sig, &i, s1, s2)) return max(O(s1),O(s2));
118 
119  else if (isSigIntCast(sig, s1)) return O(s1);
120 
121  else if (isSigFloatCast(sig, s1)) return O(s1);
122 
123  else if (isSigFFun(sig,ff,ls) && isNil(ls)) return 1;
124 
125  else if (isSigFFun(sig, ff, ls)) return max(1,O(ls));
126 
127  else if (isSigFConst(sig,type,name,file)) return 1;
128 
129  else if (isSigFVar(sig,type,name,file)) return 2;
130 
131  else if (isSigButton(sig)) return 2;
132 
133  else if (isSigCheckbox(sig)) return 2;
134 
135  else if (isSigVSlider(sig)) return 2;
136 
137  else if (isSigHSlider(sig)) return 2;
138 
139  else if (isSigNumEntry(sig)) return 2;
140 
141  else if (isSigHBargraph(sig, l, x, y, s1)) return O(s1);
142 
143  else if (isSigVBargraph(sig, l, x, y, s1)) return O(s1);
144 
145  else if (isSigAttach(sig, s1, s2)) return O(s1);
146 
147  else if (isRec(sig, var, body)) exit(1); //return 3; // not supposed to happen.
148 
149  else if (isRef(sig, var)) exit(1); //return 3; // not supposed to happen.
150 
151  else if (isProj(sig, &i, s1)) return 3;
152 
153  else if (isSigTable(sig, id, s1, s2)) return 3;
154 
155  else if (isSigWRTbl(sig, id, s1, s2, s3)) return 3;
156 
157  else if (isSigRDTbl(sig, s1, s2)) return 3;
158 
159  else if (isSigDocConstantTbl(sig, s1, s2)) return 3;
160 
161  else if (isSigDocWriteTbl(sig,s1,s2,s3,s4)) return 3;
162 
163  else if (isSigDocAccessTbl(sig,s1,s2)) return 3;
164 
165  else if (isSigGen(sig, s1)) return 3;
166 
167  else if (isSigSelect2(sig,sel,s1,s2)) return 3;
168 
169  else if (isSigSelect3(sig,sel,s1,s2,s3)) return 3;
170 
171  else if (isList(sig))
172  {
173  int r = 0;
174  while (isList(sig)) { int x = O(hd(sig)); if (x > r) r = x; sig = tl(sig); }
175  return r;
176  }
177 
178  // unrecognized signal here
179  fprintf(stderr, "ERROR infering signal order : unrecognized signal : "); print(sig, stderr); fprintf(stderr, "\n");
180  exit(1);
181  return 0;
182 }
183 
bool isSigRDTbl(Tree s, Tree &t, Tree &i)
Definition: signals.cpp:77
bool isSigHSlider(Tree s)
Definition: signals.cpp:217
bool isSigFConst(Tree s)
Definition: signals.cpp:138
bool isSigPrefix(Tree t, Tree &t0, Tree &t1)
Definition: signals.cpp:66
bool isSigCheckbox(Tree s)
Definition: signals.cpp:205
bool isSigFFun(Tree s, Tree &ff, Tree &largs)
Definition: signals.cpp:133
bool isSigNumEntry(Tree s)
Definition: signals.cpp:257
bool isSigSelect2(Tree t, Tree &selector, Tree &s1, Tree &s2)
Definition: signals.cpp:116
int tree2int(Tree t)
if t has a node of type int, return it otherwise error
Definition: tree.cpp:230
A CTree = (Node x [CTree]) is a Node associated with a list of subtrees called branches.
Definition: tree.hh:109
bool isSigInput(Tree t, int *i)
Definition: signals.cpp:48
bool isSigFixDelay(Tree t, Tree &t0, Tree &t1)
Definition: signals.cpp:62
Tree hd(Tree l)
Definition: list.hh:133
#define O
bool isSigVBargraph(Tree s)
Definition: signals.cpp:285
bool isSigSelect3(Tree t, Tree &selector, Tree &s1, Tree &s2, Tree &s3)
Definition: signals.cpp:119
bool isSigVSlider(Tree s)
Definition: signals.cpp:237
double max(double x, double y)
Definition: interval.hh:60
bool isSigGen(Tree t, Tree &x)
Definition: signals.cpp:91
int getSigOrder(Tree sig)
retrieve the order annotation (between 0 and 3) of a signal.
bool isNil(Tree l)
Definition: list.hh:137
static int infereSigOrder(Tree sig)
Infere the order of a term according to its components.
bool isSigReal(Tree t, double *r)
Definition: signals.cpp:44
bool isRef(Tree t, int &level)
is t a de Bruijn recursive reference
bool isSigHBargraph(Tree s)
Definition: signals.cpp:279
bool isSigDocConstantTbl(Tree t, Tree &n, Tree &sig)
Definition: signals.cpp:99
bool isList(Tree l)
Definition: list.hh:138
bool isSigTable(Tree t, Tree &id, Tree &n, Tree &sig)
Definition: signals.cpp:85
virtual int infereSigOrder(const vector< int > &args)=0
bool isSigBinOp(Tree s, int *op, Tree &x, Tree &y)
Definition: signals.cpp:126
bool isSigAttach(Tree t, Tree &t0, Tree &t1)
Definition: signals.cpp:291
Tree ORDERPROP
bool isSigDocAccessTbl(Tree t, Tree &tbl, Tree &ridx)
Definition: signals.cpp:107
bool isSigWRTbl(Tree u, Tree &id, Tree &t, Tree &i, Tree &s)
Definition: signals.cpp:81
int arity() const
return the number of branches (subtrees) of a tree
Definition: tree.hh:144
const char * name(Symbol *sym)
Returns the name of a symbol.
Definition: symbol.hh:98
bool isSigWaveform(Tree s)
Definition: signals.cpp:211
bool isRec(Tree t, Tree &body)
is t a de Bruijn recursive tree
bool isSigInt(Tree t, int *i)
Definition: signals.cpp:41
Tree tree(const Node &n)
Definition: tree.hh:186
bool isSigDocWriteTbl(Tree t, Tree &n, Tree &sig, Tree &widx, Tree &wsig)
Definition: signals.cpp:103
bool isSigDelay1(Tree t, Tree &t0)
Definition: signals.cpp:58
bool isSigFloatCast(Tree t)
Definition: signals.cpp:187
void setProperty(Tree t, Tree key, Tree val)
Definition: list.cpp:418
bool isSigFVar(Tree s)
Definition: signals.cpp:144
void * getUserData(Symbol *sym)
Returns user data.
Definition: symbol.hh:100
bool isSigIntCast(Tree t)
Definition: signals.cpp:184
Symbol * symbol(const char *str)
Returns (and creates if new) the symbol of name str.
Definition: symbol.hh:95
bool isProj(Tree t, int *i, Tree &rgroup)
Definition: signals.cpp:151
Tree tl(Tree l)
Definition: list.hh:134
Tree branch(int i) const
return the ith branch (subtree) of a tree
Definition: tree.hh:145
bool isSigOutput(Tree t, int *i, Tree &t0)
Definition: signals.cpp:52
bool isSigButton(Tree s)
Definition: signals.cpp:199
bool getProperty(Tree t, Tree key, Tree &val)
Definition: list.cpp:423
void print(Tree t, FILE *out)
Definition: list.cpp:154