package jazz.circuit.expr;

//////////////////////////////////////////////////////////////////////////////
//
//  Implementation of boolean operators for boolean expressions
//
//  Author: Francois.Bourdoncle@ensmp.fr
//
//////////////////////////////////////////////////////////////////////////////

Builtin.(|)(e1@BoolExpr, e2@BoolExpr) =
  new BoolExpr(e = new _OrExpr(e1 = e1.e, e2 = e2.e));

Builtin.(&)(e1@BoolExpr, e2@BoolExpr) =
  new BoolExpr(e = new _AndExpr(e1 = e1.e, e2 = e2.e));

Builtin.(~)(e@BoolExpr) =
  new BoolExpr(e = new _NotExpr(e = e.e));

Builtin.cond(e0@BoolExpr, e1@BoolExpr, e2@BoolExpr) = 
  new BoolExpr(e = new _MuxExpr(e0 = e0.e, e1 = e1.e, e2 = e2.e));

Builtin.(^)(e1@BoolExpr, e2@BoolExpr) =
  new BoolExpr(e = new _XorExpr(e1 = e1.e, e2 = e2.e));

//////////////////////////////////////////////////////////////////////////////
//
//  The register operator
//
//////////////////////////////////////////////////////////////////////////////

BoolExpr.reg(e@BoolExpr) = new BoolExpr(e = new _RegExpr(e = e.e));