{-# LANGUAGE DataKinds #-} {-# LANGUAGE TypeOperators #-} -- -- Prim.hs --- I/O register primitives. -- -- Copyright (C) 2013, Galois, Inc. -- All Rights Reserved. -- module Ivory.HW.Prim where import Ivory.Language hw_moduledef :: ModuleDef hw_moduledef = do incl ioRegReadU8 incl ioRegWriteU8 incl ioRegReadU16 incl ioRegWriteU16 incl ioRegReadU32 incl ioRegWriteU32 class IvoryBits a => IvoryIOReg a where ioRegSize :: a -> Integer ioRegRead :: Def ('[Uint32] ':-> a) ioRegWrite :: Def ('[Uint32, a] ':-> ()) ioRegReadU8 :: Def ('[Uint32] ':-> Uint8) ioRegReadU8 = importProc "ivory_hw_io_read_u8" "ivory_hw_prim.h" ioRegWriteU8 :: Def ('[Uint32, Uint8] ':-> ()) ioRegWriteU8 = importProc "ivory_hw_io_write_u8" "ivory_hw_prim.h" instance IvoryIOReg Uint8 where ioRegSize _ = 1 ioRegRead = ioRegReadU8 ioRegWrite = ioRegWriteU8 ioRegReadU16 :: Def ('[Uint32] ':-> Uint16) ioRegReadU16 = importProc "ivory_hw_io_read_u16" "ivory_hw_prim.h" ioRegWriteU16 :: Def ('[Uint32, Uint16] ':-> ()) ioRegWriteU16 = importProc "ivory_hw_io_write_u16" "ivory_hw_prim.h" instance IvoryIOReg Uint16 where ioRegSize _ = 2 ioRegRead = ioRegReadU16 ioRegWrite = ioRegWriteU16 ioRegReadU32 :: Def ('[Uint32] ':-> Uint32) ioRegReadU32 = importProc "ivory_hw_io_read_u32" "ivory_hw_prim.h" ioRegWriteU32 :: Def ('[Uint32, Uint32] ':-> ()) ioRegWriteU32 = importProc "ivory_hw_io_write_u32" "ivory_hw_prim.h" instance IvoryIOReg Uint32 where ioRegSize _ = 4 ioRegRead = ioRegReadU32 ioRegWrite = ioRegWriteU32