# Clashilator: Automated Clash - Verilator integration This package provides Cabal `Setup.hs` functionality to automatically integrate Verilator into your Clash project. * Detailed introduction: * Example project: ## Usage Suppose you have a Clash circuit that you want to simulate using Verilator, and then write Haskell code to interact with that simulation. If your Clash code looks like this: ``` topEntity :: "CLK" ::: Clock System -> "FOO" ::: Signal System Bit -> "BAR" ::: Signal System (Unsigned 4) -> ( "BAZ" ::: Signal System (Unsigned 10) , "QUUX" ::: Signal System Bit ) topEntity = ... makeTopEntity 'topEntity ``` and you put this in your Cabal file (`x-clashilator-clock` can be omitted if you have only a single clock): ``` custom-setup setup-depends: clashilator executable MySim main-is: simulator.hs x-clashilator-clock: CLK x-clashilator-top-is: MyCircuit ``` then in your `simulator.hs`, you can import the "virtual" module `Clash.Clashilator.FFI` which provides the following definitions: ``` data INPUT = INPUT { iFOO :: Bit , iBAR :: Word8 } deriving (Show) instance Storable INPUT data OUTPUT = OUTPUT { oBAZ :: Word16 , oQUUX :: Bit } deriving (Show) instance Storable OUTPUT data Sim simInit :: IO (Ptr Sim) simShutdown :: Ptr Sim -> IO () simStep :: Ptr Sim -> Ptr INPUT -> Ptr OUTPUT -> IO () ``` Note that input and output buses are represented as the smallest possible `Word` type, to improve marshalling cost when crossing the Haskell-C++ barrier.