import jazz.circuit.*;
import jazz.circuit.expr.BoolExpr.*;
// Create the following meta-circuit:
//
// input I0, I1;
// output O;
//
// O = (I0 ^ P) & (reg(O) & I1)
// P = #1(10)
//
// and return a function that can be used to instanciate the meta-circuit
// on a given boolean algebra given
//
// - the register operator on that algebra
// - the constant generator for that algebra
// - two inputs I0 and I1 in that algebra
//
var circuit = ( O.setEq(I0 ^ P)
; O.setAnd(reg(O) & I1)
; create )
{
I0 = newInput(0);
I1 = newInput(1);
O = newLocal();
P = constant(#1(10));
fun create(r, c)(i0, i1) = instanciate([O])([i0, i1], r, c)[0];
}
// Instanciate the circuit on nets
device NetCircuit {
input i0: Net;
input i1: Net;
output o: Net;
// Instanciate the circuit on nets, giving the input values as well as the
// delay and constant functions for nets (i.e., "reg" and "Net" respectively)
o = circuit(Net.reg, Net.constant)(i0, i1);
}
// Export the device
export NetCircuit();
// Instanciate the circuit on streams
device StreamCircuit {
public n: int;
input i0: Net[n];
input i1: Net[n];
output o: Net[n];
// Package the input as streams (array of nets)
I0 = new Stream(nets = i0);
I1 = new Stream(nets = i1);
// Instanciate the circuit on streams, giving the input values as well as
// the delay and constant functions for streams
O = circuit(Stream.reg, Stream.constant)(I0, I1);
// Unpackage the nets from the stream
o = O.nets;
}
// Export the device for n=4
export StreamCircuit(n = 4);