{-# LANGUAGE RecordWildCards, ForeignFunctionInterface #-} module Clash.Clashilator.FFI where import Prelude import Clash.Prelude import Data.Word import Data.Int import Foreign.Storable import Foreign.Ptr import Foreign.Marshal.Alloc data INPUT = INPUT { {{#inPorts}} {{^first}}, {{/first}}{{hsName}} :: {{hsType}} {{/inPorts}} } deriving (Show) data OUTPUT = OUTPUT{ {{#outPorts}} {{^first}}, {{/first}}{{hsName}} :: {{hsType}} {{/outPorts}} } deriving (Show) #include "Interface.h" data Sim foreign import ccall unsafe "vinit" simInit :: IO (Ptr Sim) foreign import ccall unsafe "vshutdown" simShutdown :: Ptr Sim -> IO () foreign import ccall unsafe "vstep" simStep :: Ptr Sim -> Ptr INPUT -> Ptr OUTPUT -> IO () instance Storable Bit where alignment = alignment . bitToBool sizeOf = sizeOf . bitToBool peek = fmap boolToBit . peek . castPtr poke ptr = poke (castPtr ptr) . bitToBool instance Storable INPUT where alignment _ = #alignment INPUT sizeOf _ = #size INPUT {-# INLINE peek #-} peek ptr = const INPUT <$> pure () {{#inPorts}} <*> (#peek INPUT, {{cName}}) ptr {{/inPorts}} {-# INLINE poke #-} poke ptr this = do {{#inPorts}} (#poke INPUT, {{cName}}) ptr ({{hsName}} this) {{/inPorts}} return () instance Storable OUTPUT where alignment _ = #alignment OUTPUT sizeOf _ = #size OUTPUT {-# INLINE peek #-} peek ptr = const OUTPUT <$> pure () {{#outPorts}} <*> (#peek OUTPUT, {{cName}}) ptr {{/outPorts}} {-# INLINE poke #-} poke ptr this = do {{#outPorts}} (#poke OUTPUT, {{cName}}) ptr ({{hsName}} this) {{/outPorts}} return ()