------------------------------------------------------------------------------- --- $Id: Gates.hs#1 2009/10/01 10:31:09 REDMOND\\satnams $ ------------------------------------------------------------------------------- module Lava.Gates where import Lava.Combinators import Lava.Serial import Lava.Classes inv :: Combinational m bit => bit -> m bit inv = lut1 not and2 :: Combinational m bit => (bit, bit) -> m bit and2 = lut2 (&&) or2 :: Combinational m bit => (bit, bit) -> m bit or2 = lut2 (||) xor2 :: Combinational m bit => (bit, bit) -> m bit xor2 = lut2 (/=) nxor2 :: Combinational m bit => (bit, bit) -> m bit nxor2 = lut2 (==) ------------------------------------------------------------------------------- muxBit :: Combinational m bit => bit -> (bit, bit) -> m bit muxBit sel (d0, d1) = lut3 muxFn (sel, d0, d1) ------------------------------------------------------------------------------- muxBit' :: Combinational m bit => bit -> (bit, bit) -> m bit muxBit' sel (d0, d1) = lut3 muxFn' (sel, d0, d1) ------------------------------------------------------------------------------- -- The behaviour of a multiplexor. muxFn :: Bool -> Bool -> Bool -> Bool muxFn sel d0 d1 = if sel then d1 else d0 ------------------------------------------------------------------------------- -- A multiplexor which has an inverted control input w.r.t. muxBit muxFn' :: Bool -> Bool -> Bool -> Bool muxFn' sel d0 d1 = if sel then d0 else d1 ------------------------------------------------------------------------------- muxBus :: Combinational m a => (a, ([a], [a])) -> m [a] muxBus (sel, (a,b)) = (ziP >-> mapM (muxBit sel)) (a, b) ------------------------------------------------------------------------------- muxBus' :: Combinational m a => (a, ([a], [a])) -> m [a] muxBus' (sel, (a,b)) = (ziP >-> mapM (muxBit' sel)) (a, b) -------------------------------------------------------------------------------