Multiplexers
The basic multiplixers select an array bits.
I is an array of n 1-bit values, or Bits(n)
S is the selector; it has log(n) bits.
mux = Mux2() :: I:In(Bits(2)), S:In(Bit), O:Out(Bit)
mux = Mux4() :: I:In(Bits(4)), S:In(Bits(2)), O:Out(Bit)
mux = Mux8() :: I:In(Bits(8)), S:In(Bits(3)), O:Out(Bit)
mux = Mux16() :: I:In(Bits(16)), S:In(Bits(4)), O:Out(Bit)
A more general MUX selects amongst height inputs
each with a given width.
mux = Mux(height=2, width=None) ::
I0:In(Bits(width)),
I1:In(Bits(width)),
...
In:In(Bits(width)), # n=log2(height)
S:Bits(log2(height)),
O:Out(Bits(width))
For height=1, S has type Bit.