package jazz.circuit.expr;

//////////////////////////////////////////////////////////////////////////////
//
//  Abstract Syntax Tree of Boolean Expressions
//
//  Author: Francois.Bourdoncle@ensmp.fr
//
//////////////////////////////////////////////////////////////////////////////

public abstract class _BoolExpr {
  setEq(e: _BoolExpr): _BoolExpr;
  setOr(e: _BoolExpr): _BoolExpr;
  setAnd(e: _BoolExpr): _BoolExpr;
  setXor(e: _BoolExpr): _BoolExpr;
  getDefinition(): _BoolExpr;
  getValue<T: BooleanAlgebra>(vars: T[],
                              reg: fun(T): T,
                              constant: fun(per): T): T;
  static dynamic priority: int = 0;
}

class _AndExpr extends _BoolExpr {
  e1: _BoolExpr;
  e2: _BoolExpr;
}

class _OrExpr extends _BoolExpr {
  e1: _BoolExpr;
  e2: _BoolExpr;
}

class _XorExpr extends _BoolExpr {
  e1: _BoolExpr;
  e2: _BoolExpr;
}

class _MuxExpr extends _BoolExpr {
  e0: _BoolExpr;
  e1: _BoolExpr;
  e2: _BoolExpr;
}

class _NotExpr extends _BoolExpr {
  e: _BoolExpr;
}

class _RegExpr extends _BoolExpr {
  e: _BoolExpr;
}

class _CstExpr extends _BoolExpr {
  v: per;
}
class _VarExpr extends _BoolExpr {
  id: int;
}