module Ivory.HW.BitData where
import Ivory.BitData
import Ivory.Language
import Ivory.HW.Prim
import Ivory.HW.Reg
newtype BitDataReg d = BitDataReg (Reg (BitDataRep d))
mkBitDataReg :: IvoryIOReg (BitDataRep d) => Integer -> BitDataReg d
mkBitDataReg = BitDataReg . mkReg
getReg :: (BitData d, IvoryIOReg (BitDataRep d))
=> BitDataReg d -> Ivory eff d
getReg (BitDataReg r) = do
val <- readReg r
return $ fromRep val
setReg :: (BitData d, IvoryIOReg (BitDataRep d))
=> BitDataReg d -> BitDataM d a -> Ivory eff a
setReg (BitDataReg r) mf = do
let (result, val) = runBits 0 mf
writeReg r val
return result
modifyReg :: (BitData d, IvoryIOReg (BitDataRep d))
=> BitDataReg d -> BitDataM d a -> Ivory eff a
modifyReg (BitDataReg r) mf = do
val <- readReg r
let (result, val') = runBits val mf
writeReg r val'
return result