package jazz.circuit; /////////////////////////////////////////////////////////////////////////////// // // Streams (array of nets) // /////////////////////////////////////////////////////////////////////////////// final public class Stream implements BooleanAlgebra { // The nets of that stream public nets: Net[]; // The delay operator on streams public static reg(s: Stream): Stream; // The constant generator on streams public static constant(c: per): Stream; } /////////////////////////////////////////////////////////////////////////////// // // Implementation // /////////////////////////////////////////////////////////////////////////////// // The delay and boolean operators on streams Stream.reg(s: Stream) = new Stream(nets = [i -> Net.reg(s.nets[i])]); Stream.constant(c: per) = new Stream(nets = [i -> Net.constant(c)]); // Implement all the boolean algebra operators on streams Builtin.(&)(x@Stream, y@Stream) = new Stream(nets = [i -> x.nets[i] & y.nets[i]]); Builtin.(|)(x@Stream, y@Stream) = new Stream(nets = [i -> x.nets[i] | y.nets[i]]); Builtin.(^)(x@Stream, y@Stream) = new Stream(nets = [i -> x.nets[i] ^ y.nets[i]]); Builtin.(~)(x@Stream) = new Stream(nets = [i -> ~x.nets[i]]); Builtin.cond(c@Stream, x@Stream, y@Stream) = new Stream(nets = [i -> Net.mux(c.nets[i], x.nets[i], y.nets[i])]);