FAUST compiler  0.9.9.6b8
Defines | Functions | Variables
sigorderrules.cpp File Reference
#include <stdio.h>
#include "sigtype.hh"
#include "sigprint.hh"
#include "prim2.hh"
#include "tlib.hh"
#include "sigorderrules.hh"
#include "xtended.hh"
Include dependency graph for sigorderrules.cpp:

Go to the source code of this file.

Defines

#define O   getSigOrder

Functions

static int infereSigOrder (Tree sig)
 Infere the order of a term according to its components.
int getSigOrder (Tree sig)
 retrieve the order annotation (between 0 and 3) of a signal.

Variables

Tree ORDERPROP = tree(symbol("OrderProp"))

Define Documentation

#define O   getSigOrder

Definition at line 75 of file sigorderrules.cpp.

Referenced by infereSigOrder().


Function Documentation

int getSigOrder ( Tree  sig)

retrieve the order annotation (between 0 and 3) of a signal.

(compute the order the first time). Orders have the following meanings 0 : numbers 1 : constants 2 : user interface values 3 : audio values

Parameters:
sigthe signal we want to know the order
Returns:
the order number

Definition at line 62 of file sigorderrules.cpp.

References getProperty(), infereSigOrder(), setProperty(), tree(), and tree2int().

Referenced by mterm::complexity(), aterm::normalizedTree(), mterm::normalizedTree(), and normalizeFixedDelayTerm().

{
    Tree tt;
    if (getProperty(sig, ORDERPROP, tt)) { 
        return tree2int(tt); 
    } else {
        int order = infereSigOrder(sig);
        setProperty(sig, ORDERPROP, tree(order));
        return order;
    }
}   

Here is the call graph for this function:

Here is the caller graph for this function:

static int infereSigOrder ( Tree  sig) [static]

Infere the order of a term according to its components.

Parameters:
sigthe signal to analyze
Returns:
the order of sig

Definition at line 84 of file sigorderrules.cpp.

References CTree::arity(), CTree::branch(), getUserData(), hd(), xtended::infereSigOrder(), isList(), isNil(), isProj(), isRec(), isRef(), isSigAttach(), isSigBinOp(), isSigButton(), isSigCheckbox(), isSigDelay1(), isSigDocAccessTbl(), isSigDocConstantTbl(), isSigDocWriteTbl(), isSigFConst(), isSigFFun(), isSigFixDelay(), isSigFloatCast(), isSigFVar(), isSigGen(), isSigHBargraph(), isSigHSlider(), isSigInput(), isSigInt(), isSigIntCast(), isSigNumEntry(), isSigOutput(), isSigPrefix(), isSigRDTbl(), isSigReal(), isSigSelect2(), isSigSelect3(), isSigTable(), isSigVBargraph(), isSigVSlider(), isSigWRTbl(), max(), name(), O, print(), and tl().

Referenced by getSigOrder().

{
    int         i;
    double      r;
    Tree        sel, s1, s2, s3, s4, ff, id, ls, l, x, y, var, body, type, name, file;

    xtended* xt = (xtended*) getUserData(sig);
    // primitive elements
    if (xt)                                 
    {
        //return 3;
        vector<int> args;
        for (int i=0; i<sig->arity(); i++) { args.push_back( O(sig->branch(i)) ); }
        return xt->infereSigOrder(args);
    }

    
    else if (isSigInt(sig, &i))                 return 0;
        
    else if (isSigReal(sig, &r))                return 0;
        
    else if (isSigInput(sig, &i))               return 3;
        
    else if (isSigOutput(sig, &i, s1))          return 3;
        
    else if (isSigDelay1(sig, s1))              return 3;
    
    else if (isSigPrefix(sig, s1, s2))          return 3;
    
    else if (isSigFixDelay(sig, s1, s2))        return 3;
    
    else if (isSigBinOp(sig, &i, s1, s2))       return max(O(s1),O(s2));
    
    else if (isSigIntCast(sig, s1))             return O(s1);
        
    else if (isSigFloatCast(sig, s1))           return O(s1);

    else if (isSigFFun(sig,ff,ls) && isNil(ls)) return 1;

    else if (isSigFFun(sig, ff, ls))            return max(1,O(ls));

    else if (isSigFConst(sig,type,name,file))   return 1;

    else if (isSigFVar(sig,type,name,file))     return 2;
        
    else if (isSigButton(sig))                  return 2;
    
    else if (isSigCheckbox(sig))                return 2;
    
    else if (isSigVSlider(sig))                 return 2;
     
    else if (isSigHSlider(sig))                 return 2;
    
    else if (isSigNumEntry(sig))                return 2;
        
    else if (isSigHBargraph(sig, l, x, y, s1))  return O(s1);
        
    else if (isSigVBargraph(sig, l, x, y, s1))  return O(s1);
        
    else if (isSigAttach(sig, s1, s2))          return O(s1);
                
    else if (isRec(sig, var, body))             exit(1); //return 3;  // not supposed to happen.
                
    else if (isRef(sig, var))                   exit(1); //return 3;  // not supposed to happen. 

    else if (isProj(sig, &i, s1))               return 3;
                                                        
    else if (isSigTable(sig, id, s1, s2))       return 3;
        
    else if (isSigWRTbl(sig, id, s1, s2, s3))   return 3; 
            
    else if (isSigRDTbl(sig, s1, s2))           return 3;

    else if (isSigDocConstantTbl(sig, s1, s2))  return 3;

    else if (isSigDocWriteTbl(sig,s1,s2,s3,s4)) return 3;

    else if (isSigDocAccessTbl(sig,s1,s2))      return 3;

    else if (isSigGen(sig, s1))                 return 3;
        
    else if (isSigSelect2(sig,sel,s1,s2))       return 3;
        
    else if (isSigSelect3(sig,sel,s1,s2,s3))    return 3;   
    
    else if (isList(sig)) 
    {
        int r = 0;
        while (isList(sig)) { int x = O(hd(sig)); if (x > r) r = x; sig = tl(sig); }
        return r;
    }
    
    // unrecognized signal here
    fprintf(stderr, "ERROR infering signal order : unrecognized signal  : "); print(sig, stderr); fprintf(stderr, "\n");
    exit(1);
    return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

Tree ORDERPROP = tree(symbol("OrderProp"))

Definition at line 48 of file sigorderrules.cpp.