package jazz.circuit.expr;
//////////////////////////////////////////////////////////////////////////////
//
// Boolean Expressions
//
// Boolean expressions can be used to build circuits algorithmically and
// imperatively. Boolean expressions represent "meta-circuits" that can be
// instanciated on any boolean algebra, provided a function to generate
// constants, and a register function.
//
// Author: Francois.Bourdoncle@ensmp.fr
//
//////////////////////////////////////////////////////////////////////////////
public final class BoolExpr implements BooleanAlgebra {
// Creation of input variable number "n"
public static newInput(n: int): BoolExpr;
// Creation of a new local node
public static newLocal(): BoolExpr;
// Defines the value of the boolean expression variable "this" by the
// equation "this = e". Since this method destructively replaces any
// previous definition of the boolean expression variable, calls to this
// method must be explicitly serialized.
public setEq(e: BoolExpr): BoolExpr;
// Defines the value of the boolean expression variable "this". If the
// variable has no previous definition, simply defines the variable by the
// equation "this = e". If the variable was already defined by the equation
// "this = e0", then the variable is redefined by the new equation
// "this = (e0 | e)". Since this method destructively replaces any previous
// definition of the boolean expression variable, calls to this method must
// be explicitly serialized.
public setOr(e: BoolExpr): BoolExpr;
// Same as above, but redefines the variables by "this = (e0 & e)".
public setAnd(e: BoolExpr): BoolExpr;
// Same as above, but redefines the variables by "this = (e0 ^ e)".
public setXor(e: BoolExpr): BoolExpr;
// Definition of a boolean variable
public getDefinition(): BoolExpr;
// Instanciate each variable the array of specified output boolean
// expressions over a given boolean algebra A, given:
//
// - the mapping of input variable to input values (e.g., input nets)
// - the register function of the boolean algebra (e.g., "reg")
// - the instanciation function for constants (e.g., "Net.constant")
//
public static instanciate<T: BooleanAlgebra>(outputs: BoolExpr[])
(inputs: T[],
reg: fun(T): T,
constant: fun(per): T): T[];
// The delay operator
public static reg(e: BoolExpr): BoolExpr;
// Creation of a new constant
public static constant(v: per): BoolExpr;
// Private implementation
e: _BoolExpr;
}