------------------------------------------------------------------------------- -- $Id: Primitives.hs#1 2009/10/01 10:31:09 REDMOND\\satnams $ ------------------------------------------------------------------------------- module Lava.Primitives where ------------------------------------------------------------------------------- data CombinationalGateBehaviour = DriverBehaviour Bool | UnaryGate (Bool -> Bool) | BinaryGate (Bool -> Bool -> Bool) | Gate3 (Bool -> Bool -> Bool -> Bool) | Gate4 (Bool -> Bool -> Bool -> Bool -> Bool) | ListToListBehaviour ([Bool] -> [Bool]) | UnspecifiedCombinationalGateBehaviour ------------------------------------------------------------------------------- instance Show CombinationalGateBehaviour where showsPrec _ f = showString (showGateBehaviour f) ------------------------------------------------------------------------------- data Primitive = Gate {gateKind :: GateKind, gateName :: String, gatePos :: Position, gateSize :: (Int, Int), gateBehaviour :: CombinationalGateBehaviour} | Input String deriving Show ------------------------------------------------------------------------------- data GateKind = Lut1 | Lut2 | Lut3 | Lut4 | LeafGate {inputPorts, outputPorts :: [String]} deriving Show ------------------------------------------------------------------------------- data Position = NoPlacement | Unplaced | At (Int, Int) deriving (Eq, Show) ------------------------------------------------------------------------------- placed :: Position -> Bool placed (At _) = True placed _ = False ------------------------------------------------------------------------------- showGateBehaviour :: CombinationalGateBehaviour -> String showGateBehaviour (UnaryGate f) = [boolToChar (f i) | i <- [True, False]] showGateBehaviour (BinaryGate f) = reverse [boolToChar (f i0 i1) | [i0, i1] <- boolVecs 2] showGateBehaviour (Gate3 f) = reverse [boolToChar (f i0 i1 i2) | [i0, i1, i2] <- boolVecs 3] showGateBehaviour (Gate4 f) = reverse [boolToChar (f i0 i1 i2 i3) | [i0, i1, i2, i3] <- boolVecs 4] showGateBehaviour _ = error "unknown gate behaviour" ------------------------------------------------------------------------------- boolVecs :: Int -> [[Bool]] boolVecs n = [numToBoolVec n i | i <- [0..2^n-1]] ------------------------------------------------------------------------------- numToBoolVec 0 0 = [] numToBoolVec n i = lsb : numToBoolVec (n-1) (i `div` 2) where lsb = if i `mod` 2 == 0 then False else True ------------------------------------------------------------------------------- boolToChar :: Bool -> Char boolToChar False = '0' boolToChar True = '1' -------------------------------------------------------------------------------