{-# LANGUAGE ScopedTypeVariables, FlexibleContexts, TypeFamilies,
TypeSynonymInstances, FlexibleInstances, GADTs, RankNTypes,
UndecidableInstances, TypeOperators #-}
module Language.KansasLava.Protocols.Types where
import Language.KansasLava.Rep
import Language.KansasLava.Signal
import Language.KansasLava.Types
import Language.KansasLava.Utils
import Control.Monad
newtype Ack = Ack { unAck :: Bool }
deriving (Eq,Ord)
instance Show Ack where
show (Ack True) = "A"
show (Ack False) = "~"
instance Rep Ack where
data X Ack = XAckRep { unXAckRep :: X Bool }
type W Ack = W Bool
unX = liftM Ack . unX . unXAckRep
optX = XAckRep . optX . liftM unAck
toRep = toRep . unXAckRep
fromRep = XAckRep . fromRep
repType Witness = repType (Witness :: Witness Bool)
showRep = showRepDefault
toAck :: (sig ~ Signal clk) => sig Bool -> sig Ack
toAck = coerce Ack
fromAck :: (sig ~ Signal clk) => sig Ack -> sig Bool
fromAck = coerce unAck
newtype Ready = Ready { unReady :: Bool }
deriving (Eq,Ord)
instance Show Ready where
show (Ready True) = "R"
show (Ready False) = "~"
instance Rep Ready where
data X Ready = XReadyRep { unXReadyRep :: X Bool }
type W Ready = W Bool
unX = liftM Ready . unX . unXReadyRep
optX = XReadyRep . optX . liftM unReady
toRep = toRep . unXReadyRep
fromRep = XReadyRep . fromRep
repType Witness = repType (Witness :: Witness Bool)
showRep = showRepDefault
toReady :: (sig ~ Signal clk) => sig Bool -> sig Ready
toReady = coerce Ready
fromReady :: (sig ~ Signal clk) => sig Ready -> sig Bool
fromReady = coerce unReady