module Verismith.Tool.Icarus
( Icarus (..),
defaultIcarus,
runSimIc,
runSimIcEMI,
runSimIcEC,
)
where
import Control.DeepSeq (NFData, rnf, rwhnf)
import Control.Lens
import Control.Monad (void)
import Crypto.Hash (Digest, hash)
import Crypto.Hash.Algorithms (SHA256)
import Data.Binary (encode)
import Data.Bits
import qualified Data.ByteArray as BA (convert)
import Data.ByteString (ByteString)
import qualified Data.ByteString as B
import Data.ByteString.Lazy (toStrict)
import qualified Data.ByteString.Lazy as L (ByteString)
import Data.Char (digitToInt)
import Data.Foldable (fold)
import Data.List (transpose)
import Data.List.NonEmpty (NonEmpty (..), fromList)
import Data.Maybe (listToMaybe)
import Data.Text (Text)
import qualified Data.Text as T
import Numeric (readInt)
import Shelly
import Shelly.Lifted (liftSh)
import Verismith.CounterEg (CounterEg (..))
import Verismith.Result
import Verismith.Tool.Internal
import Verismith.Tool.Template
import Verismith.Verilog.AST
import Verismith.Verilog.BitVec
import Verismith.Verilog.CodeGen
import Verismith.Verilog.Internal
import Verismith.Verilog.Mutate
import Prelude hiding (FilePath)
data Icarus = Icarus
{ Icarus -> FilePath
icarusPath :: FilePath,
Icarus -> FilePath
vvpPath :: FilePath
}
deriving (Icarus -> Icarus -> Bool
(Icarus -> Icarus -> Bool)
-> (Icarus -> Icarus -> Bool) -> Eq Icarus
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Icarus -> Icarus -> Bool
== :: Icarus -> Icarus -> Bool
$c/= :: Icarus -> Icarus -> Bool
/= :: Icarus -> Icarus -> Bool
Eq)
instance Show Icarus where
show :: Icarus -> FilePath
show Icarus
_ = FilePath
"iverilog"
instance Tool Icarus where
toText :: Icarus -> Text
toText Icarus
_ = Text
"iverilog"
instance Simulator Icarus where
runSim :: forall ann.
Show ann =>
Icarus -> SourceInfo ann -> [ByteString] -> ResultSh ByteString
runSim = Icarus -> SourceInfo ann -> [ByteString] -> ResultSh ByteString
forall ann.
Show ann =>
Icarus -> SourceInfo ann -> [ByteString] -> ResultSh ByteString
runSimIcarus
runSimWithFile :: Icarus -> FilePath -> [ByteString] -> ResultSh ByteString
runSimWithFile = Icarus -> FilePath -> [ByteString] -> ResultSh ByteString
runSimIcarusWithFile
instance NFData Icarus where
rnf :: Icarus -> ()
rnf = Icarus -> ()
forall a. a -> ()
rwhnf
defaultIcarus :: Icarus
defaultIcarus :: Icarus
defaultIcarus = FilePath -> FilePath -> Icarus
Icarus FilePath
"iverilog" FilePath
"vvp"
addDisplay :: [Statement ann] -> [Statement ann]
addDisplay :: forall ann. [Statement ann] -> [Statement ann]
addDisplay [Statement ann]
s =
[[Statement ann]] -> [Statement ann]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[Statement ann]] -> [Statement ann])
-> [[Statement ann]] -> [Statement ann]
forall a b. (a -> b) -> a -> b
$
[[Statement ann]] -> [[Statement ann]]
forall a. [[a]] -> [[a]]
transpose
[ [Statement ann]
s,
Int -> Statement ann -> [Statement ann]
forall a. Int -> a -> [a]
replicate Int
l (Statement ann -> [Statement ann])
-> Statement ann -> [Statement ann]
forall a b. (a -> b) -> a -> b
$ Delay -> Maybe (Statement ann) -> Statement ann
forall a. Delay -> Maybe (Statement a) -> Statement a
TimeCtrl Delay
1 Maybe (Statement ann)
forall a. Maybe a
Nothing,
Int -> Statement ann -> [Statement ann]
forall a. Int -> a -> [a]
replicate Int
l (Statement ann -> [Statement ann])
-> (Task -> Statement ann) -> Task -> [Statement ann]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Task -> Statement ann
forall a. Task -> Statement a
SysTaskEnable (Task -> [Statement ann]) -> Task -> [Statement ann]
forall a b. (a -> b) -> a -> b
$ Identifier -> [Expr] -> Task
Task Identifier
"display" [Expr
"%b", Identifier -> Expr
Id Identifier
"y"]
]
where
l :: Int
l = [Statement ann] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Statement ann]
s
assignFunc :: [Port] -> ByteString -> Statement ann
assignFunc :: forall ann. [Port] -> ByteString -> Statement ann
assignFunc [Port]
inp ByteString
bs =
Assign -> Statement ann
forall a. Assign -> Statement a
NonBlockAssign
(Assign -> Statement ann)
-> (Integer -> Assign) -> Integer -> Statement ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LVal -> Maybe Delay -> Expr -> Assign
Assign LVal
conc Maybe Delay
forall a. Maybe a
Nothing
(Expr -> Assign) -> (Integer -> Expr) -> Integer -> Assign
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BitVec -> Expr
Number
(BitVec -> Expr) -> (Integer -> BitVec) -> Integer -> Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Integer -> BitVec
forall a. Int -> a -> BitVecF a
BitVec (ByteString -> Int
B.length ByteString
bs Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
8)
(Integer -> Statement ann) -> Integer -> Statement ann
forall a b. (a -> b) -> a -> b
$ ByteString -> Integer
bsToI ByteString
bs
where
conc :: LVal
conc = [Expr] -> LVal
RegConcat (Port -> Expr
portToExpr (Port -> Expr) -> [Port] -> [Expr]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Port]
inp)
convert :: Text -> ByteString
convert :: Text -> ByteString
convert =
ByteString -> ByteString
toStrict
(ByteString -> ByteString)
-> (Text -> ByteString) -> Text -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer -> ByteString
forall a. Binary a => a -> ByteString
encode :: Integer -> L.ByteString)
(Integer -> ByteString) -> (Text -> Integer) -> Text -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer
-> ((Integer, FilePath) -> Integer)
-> Maybe (Integer, FilePath)
-> Integer
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Integer
0 (Integer, FilePath) -> Integer
forall a b. (a, b) -> a
fst
(Maybe (Integer, FilePath) -> Integer)
-> (Text -> Maybe (Integer, FilePath)) -> Text -> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Integer, FilePath)] -> Maybe (Integer, FilePath)
forall a. [a] -> Maybe a
listToMaybe
([(Integer, FilePath)] -> Maybe (Integer, FilePath))
-> (Text -> [(Integer, FilePath)])
-> Text
-> Maybe (Integer, FilePath)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> (Char -> Bool) -> (Char -> Int) -> ReadS Integer
forall a. Num a => a -> (Char -> Bool) -> (Char -> Int) -> ReadS a
readInt Integer
2 (Char -> FilePath -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` (FilePath
"01" :: String)) Char -> Int
digitToInt
ReadS Integer
-> (Text -> FilePath) -> Text -> [(Integer, FilePath)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> FilePath
T.unpack
mask :: Text -> Text
mask :: Text -> Text
mask = HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"x" Text
"0"
callback :: ByteString -> Text -> ByteString
callback :: ByteString -> Text -> ByteString
callback ByteString
b Text
t = ByteString
b ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> Text -> ByteString
convert (Text -> Text
mask Text
t)
runSimIcarus :: (Show ann) => Icarus -> (SourceInfo ann) -> [ByteString] -> ResultSh ByteString
runSimIcarus :: forall ann.
Show ann =>
Icarus -> SourceInfo ann -> [ByteString] -> ResultSh ByteString
runSimIcarus Icarus
sim SourceInfo ann
rinfo [ByteString]
bss = do
let tb :: ModDecl a
tb =
Identifier
-> [Port] -> [Port] -> [ModItem a] -> [Parameter] -> ModDecl a
forall a.
Identifier
-> [Port] -> [Port] -> [ModItem a] -> [Parameter] -> ModDecl a
ModDecl
Identifier
"main"
[]
[]
[ Statement a -> ModItem a
forall a. Statement a -> ModItem a
Initial (Statement a -> ModItem a) -> Statement a -> ModItem a
forall a b. (a -> b) -> a -> b
$
[Statement a] -> Statement a
forall m. Monoid m => [m] -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold ([Statement a] -> [Statement a]
forall ann. [Statement ann] -> [Statement ann]
addDisplay ([Statement a] -> [Statement a]) -> [Statement a] -> [Statement a]
forall a b. (a -> b) -> a -> b
$ [Port] -> ByteString -> Statement a
forall ann. [Port] -> ByteString -> Statement ann
assignFunc (ModDecl ann -> [Port]
forall a. ModDecl a -> [Port]
_modInPorts ModDecl ann
m) (ByteString -> Statement a) -> [ByteString] -> [Statement a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [ByteString]
bss)
Statement a -> Statement a -> Statement a
forall a. Semigroup a => a -> a -> a
<> (Task -> Statement a
forall a. Task -> Statement a
SysTaskEnable (Task -> Statement a) -> Task -> Statement a
forall a b. (a -> b) -> a -> b
$ Identifier -> [Expr] -> Task
Task Identifier
"finish" [])
]
[]
let newtb :: ModDecl ann
newtb = ModDecl ann -> ModDecl ann -> ModDecl ann
forall ann. ModDecl ann -> ModDecl ann -> ModDecl ann
instantiateMod ModDecl ann
m ModDecl ann
forall {a}. ModDecl a
tb
let modWithTb :: Verilog ann
modWithTb = [ModDecl ann] -> Verilog ann
forall a. [ModDecl a] -> Verilog a
Verilog [ModDecl ann
newtb, ModDecl ann
m]
Sh () -> ResultT Failed Sh ()
forall a. Sh a -> ResultT Failed Sh a
forall (m :: * -> *) a. MonadSh m => Sh a -> m a
liftSh (Sh () -> ResultT Failed Sh ())
-> (Text -> Sh ()) -> Text -> ResultT Failed Sh ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FilePath -> Text -> Sh ()
writefile FilePath
"main.v" (Text -> ResultT Failed Sh ()) -> Text -> ResultT Failed Sh ()
forall a b. (a -> b) -> a -> b
$ Verilog ann -> Text
forall a. Source a => a -> Text
genSource Verilog ann
modWithTb
Failed -> ResultSh ByteString -> ResultSh ByteString
forall (m :: * -> *) a b.
(Monad m, Monoid a) =>
a -> ResultT a m b -> ResultT a m b
annotate (ByteString -> Failed
SimFail ByteString
forall a. Monoid a => a
mempty) (ResultSh ByteString -> ResultSh ByteString)
-> ResultSh ByteString -> ResultSh ByteString
forall a b. (a -> b) -> a -> b
$ Icarus -> FilePath -> [ByteString] -> ResultSh ByteString
forall a.
Simulator a =>
a -> FilePath -> [ByteString] -> ResultSh ByteString
runSimWithFile Icarus
sim FilePath
"main.v" [ByteString]
bss
where
m :: ModDecl ann
m = SourceInfo ann
rinfo SourceInfo ann
-> Getting (ModDecl ann) (SourceInfo ann) (ModDecl ann)
-> ModDecl ann
forall s a. s -> Getting a s a -> a
^. Getting (ModDecl ann) (SourceInfo ann) (ModDecl ann)
forall a (f :: * -> *).
Functor f =>
(ModDecl a -> f (ModDecl a)) -> SourceInfo a -> f (SourceInfo a)
mainModule
runSimIcarusWithFile ::
Icarus -> FilePath -> [ByteString] -> ResultSh ByteString
runSimIcarusWithFile :: Icarus -> FilePath -> [ByteString] -> ResultSh ByteString
runSimIcarusWithFile Icarus
sim FilePath
f [ByteString]
_ = Failed -> ResultSh ByteString -> ResultSh ByteString
forall (m :: * -> *) a b.
(Monad m, Monoid a) =>
a -> ResultT a m b -> ResultT a m b
annotate (ByteString -> Failed
SimFail ByteString
forall a. Monoid a => a
mempty) (ResultSh ByteString -> ResultSh ByteString)
-> (Sh ByteString -> ResultSh ByteString)
-> Sh ByteString
-> ResultSh ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sh ByteString -> ResultSh ByteString
forall a. Sh a -> ResultT Failed Sh a
forall (m :: * -> *) a. MonadSh m => Sh a -> m a
liftSh (Sh ByteString -> ResultSh ByteString)
-> Sh ByteString -> ResultSh ByteString
forall a b. (a -> b) -> a -> b
$ do
FilePath
dir <- Sh FilePath
pwd
FilePath -> Text -> Sh Text -> Sh ()
forall a. FilePath -> Text -> Sh a -> Sh ()
logCommand_ FilePath
dir Text
"icarus" (Sh Text -> Sh ()) -> Sh Text -> Sh ()
forall a b. (a -> b) -> a -> b
$
FilePath -> [Text] -> Sh Text
run (Icarus -> FilePath
icarusPath Icarus
sim) [Text
"-o", Text
"main", FilePath -> Text
toTextIgnore FilePath
f]
Int -> ByteString -> ByteString
B.take Int
8 (ByteString -> ByteString)
-> (ByteString -> ByteString) -> ByteString -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Digest SHA256 -> ByteString
forall bin bout.
(ByteArrayAccess bin, ByteArray bout) =>
bin -> bout
BA.convert (Digest SHA256 -> ByteString)
-> (ByteString -> Digest SHA256) -> ByteString -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ByteString -> Digest SHA256
forall ba a.
(ByteArrayAccess ba, HashAlgorithm a) =>
ba -> Digest a
hash :: ByteString -> Digest SHA256)
(ByteString -> ByteString) -> Sh ByteString -> Sh ByteString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FilePath -> Text -> Sh ByteString -> Sh ByteString
forall a. FilePath -> Text -> Sh a -> Sh a
logCommand
FilePath
dir
Text
"vvp"
(ByteString
-> (ByteString -> Text -> ByteString)
-> FilePath
-> [Text]
-> Sh ByteString
forall a. a -> FoldCallback a -> FilePath -> [Text] -> Sh a
runFoldLines (ByteString
forall a. Monoid a => a
mempty :: ByteString) ByteString -> Text -> ByteString
callback (Icarus -> FilePath
vvpPath Icarus
sim) [Text
"main"])
fromBytes :: ByteString -> Integer
fromBytes :: ByteString -> Integer
fromBytes = (Integer -> Word8 -> Integer) -> Integer -> ByteString -> Integer
forall a. (a -> Word8 -> a) -> a -> ByteString -> a
B.foldl' Integer -> Word8 -> Integer
forall {a} {a}. (Bits a, Integral a, Num a) => a -> a -> a
f Integer
0 where f :: a -> a -> a
f a
a a
b = a
a a -> Int -> a
forall a. Bits a => a -> Int -> a
`shiftL` Int
8 a -> a -> a
forall a. Bits a => a -> a -> a
.|. a -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
b
tbModule :: [ByteString] -> (ModDecl ann) -> (Verilog ann)
tbModule :: forall ann. [ByteString] -> ModDecl ann -> Verilog ann
tbModule [ByteString]
bss ModDecl ann
top =
[ModDecl ann] -> Verilog ann
forall a. [ModDecl a] -> Verilog a
Verilog
[ ModDecl ann -> ModDecl ann -> ModDecl ann
forall ann. ModDecl ann -> ModDecl ann -> ModDecl ann
instantiateMod ModDecl ann
top (ModDecl ann -> ModDecl ann) -> ModDecl ann -> ModDecl ann
forall a b. (a -> b) -> a -> b
$
Identifier
-> [Port] -> [Port] -> [ModItem ann] -> [Parameter] -> ModDecl ann
forall a.
Identifier
-> [Port] -> [Port] -> [ModItem a] -> [Parameter] -> ModDecl a
ModDecl
Identifier
"testbench"
[]
[]
[ Statement ann -> ModItem ann
forall a. Statement a -> ModItem a
Initial (Statement ann -> ModItem ann) -> Statement ann -> ModItem ann
forall a b. (a -> b) -> a -> b
$
[Statement ann] -> Statement ann
forall m. Monoid m => [m] -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold
[ Assign -> Statement ann
forall a. Assign -> Statement a
BlockAssign (LVal -> Maybe Delay -> Expr -> Assign
Assign LVal
"clk" Maybe Delay
forall a. Maybe a
Nothing Expr
0),
Assign -> Statement ann
forall a. Assign -> Statement a
BlockAssign (LVal -> Maybe Delay -> Expr -> Assign
Assign LVal
inConcat Maybe Delay
forall a. Maybe a
Nothing Expr
0)
]
Statement ann -> Statement ann -> Statement ann
forall a. Semigroup a => a -> a -> a
<> [Statement ann] -> Statement ann
forall m. Monoid m => [m] -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold
( ( \Expr
r ->
Delay -> Maybe (Statement ann) -> Statement ann
forall a. Delay -> Maybe (Statement a) -> Statement a
TimeCtrl
Delay
10
(Statement ann -> Maybe (Statement ann)
forall a. a -> Maybe a
Just (Statement ann -> Maybe (Statement ann))
-> Statement ann -> Maybe (Statement ann)
forall a b. (a -> b) -> a -> b
$ Assign -> Statement ann
forall a. Assign -> Statement a
BlockAssign (LVal -> Maybe Delay -> Expr -> Assign
Assign LVal
inConcat Maybe Delay
forall a. Maybe a
Nothing Expr
r))
)
(Expr -> Statement ann)
-> (ByteString -> Expr) -> ByteString -> Statement ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Expr
forall a. Num a => Integer -> a
fromInteger
(Integer -> Expr) -> (ByteString -> Integer) -> ByteString -> Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Integer
fromBytes
(ByteString -> Statement ann) -> [ByteString] -> [Statement ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [ByteString]
bss
)
Statement ann -> Statement ann -> Statement ann
forall a. Semigroup a => a -> a -> a
<> (Delay -> Maybe (Statement ann) -> Statement ann
forall a. Delay -> Maybe (Statement a) -> Statement a
TimeCtrl Delay
10 (Maybe (Statement ann) -> Statement ann)
-> (Task -> Maybe (Statement ann)) -> Task -> Statement ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Statement ann -> Maybe (Statement ann)
forall a. a -> Maybe a
Just (Statement ann -> Maybe (Statement ann))
-> (Task -> Statement ann) -> Task -> Maybe (Statement ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Task -> Statement ann
forall a. Task -> Statement a
SysTaskEnable (Task -> Statement ann) -> Task -> Statement ann
forall a b. (a -> b) -> a -> b
$ Identifier -> [Expr] -> Task
Task Identifier
"finish" []),
Statement ann -> ModItem ann
forall a. Statement a -> ModItem a
Always (Statement ann -> ModItem ann)
-> (Statement ann -> Statement ann) -> Statement ann -> ModItem ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Delay -> Maybe (Statement ann) -> Statement ann
forall a. Delay -> Maybe (Statement a) -> Statement a
TimeCtrl Delay
5 (Maybe (Statement ann) -> Statement ann)
-> (Statement ann -> Maybe (Statement ann))
-> Statement ann
-> Statement ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Statement ann -> Maybe (Statement ann)
forall a. a -> Maybe a
Just (Statement ann -> ModItem ann) -> Statement ann -> ModItem ann
forall a b. (a -> b) -> a -> b
$
Assign -> Statement ann
forall a. Assign -> Statement a
BlockAssign
(LVal -> Maybe Delay -> Expr -> Assign
Assign LVal
"clk" Maybe Delay
forall a. Maybe a
Nothing (UnaryOperator -> Expr -> Expr
UnOp UnaryOperator
UnNot (Identifier -> Expr
Id Identifier
"clk"))),
Statement ann -> ModItem ann
forall a. Statement a -> ModItem a
Always (Statement ann -> ModItem ann)
-> (Task -> Statement ann) -> Task -> ModItem ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event -> Maybe (Statement ann) -> Statement ann
forall a. Event -> Maybe (Statement a) -> Statement a
EventCtrl (Identifier -> Event
EPosEdge Identifier
"clk") (Maybe (Statement ann) -> Statement ann)
-> (Task -> Maybe (Statement ann)) -> Task -> Statement ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Statement ann -> Maybe (Statement ann)
forall a. a -> Maybe a
Just (Statement ann -> Maybe (Statement ann))
-> (Task -> Statement ann) -> Task -> Maybe (Statement ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Task -> Statement ann
forall a. Task -> Statement a
SysTaskEnable (Task -> ModItem ann) -> Task -> ModItem ann
forall a b. (a -> b) -> a -> b
$
Identifier -> [Expr] -> Task
Task Identifier
"strobe" [Expr
"%b", Identifier -> Expr
Id Identifier
"y"]
]
[]
]
where
inConcat :: LVal
inConcat = ([Expr] -> LVal
RegConcat ([Expr] -> LVal) -> ([Expr] -> [Expr]) -> [Expr] -> LVal
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Expr -> Bool) -> [Expr] -> [Expr]
forall a. (a -> Bool) -> [a] -> [a]
filter (Expr -> Expr -> Bool
forall a. Eq a => a -> a -> Bool
/= (Identifier -> Expr
Id Identifier
"clk")) ([Expr] -> LVal) -> [Expr] -> LVal
forall a b. (a -> b) -> a -> b
$ (Identifier -> Expr
Id (Identifier -> Expr) -> (Port -> Identifier) -> Port -> Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Port -> Identifier
fromPort (Port -> Expr) -> [Port] -> [Expr]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ModDecl ann
top ModDecl ann -> Getting [Port] (ModDecl ann) [Port] -> [Port]
forall s a. s -> Getting a s a -> a
^. Getting [Port] (ModDecl ann) [Port]
forall a (f :: * -> *).
Applicative f =>
([Port] -> f [Port]) -> ModDecl a -> f (ModDecl a)
modInPorts)))
tbModule' :: [Identifier] -> [ByteString] -> (ModDecl ann) -> (Verilog ann)
tbModule' :: forall ann.
[Identifier] -> [ByteString] -> ModDecl ann -> Verilog ann
tbModule' [Identifier]
ids [ByteString]
bss ModDecl ann
top =
[ModDecl ann] -> Verilog ann
forall a. [ModDecl a] -> Verilog a
Verilog
[ ModDecl ann -> ModDecl ann -> ModDecl ann
forall ann. ModDecl ann -> ModDecl ann -> ModDecl ann
instantiateMod ModDecl ann
top (ModDecl ann -> ModDecl ann) -> ModDecl ann -> ModDecl ann
forall a b. (a -> b) -> a -> b
$
Identifier
-> [Port] -> [Port] -> [ModItem ann] -> [Parameter] -> ModDecl ann
forall a.
Identifier
-> [Port] -> [Port] -> [ModItem a] -> [Parameter] -> ModDecl a
ModDecl
Identifier
"testbench"
[]
[]
[ Statement ann -> ModItem ann
forall a. Statement a -> ModItem a
Initial (Statement ann -> ModItem ann) -> Statement ann -> ModItem ann
forall a b. (a -> b) -> a -> b
$
[Statement ann] -> Statement ann
forall m. Monoid m => [m] -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold
[ Assign -> Statement ann
forall a. Assign -> Statement a
BlockAssign (LVal -> Maybe Delay -> Expr -> Assign
Assign LVal
"clk" Maybe Delay
forall a. Maybe a
Nothing Expr
0),
Assign -> Statement ann
forall a. Assign -> Statement a
BlockAssign (LVal -> Maybe Delay -> Expr -> Assign
Assign LVal
inConcat Maybe Delay
forall a. Maybe a
Nothing Expr
0),
if [Identifier] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Identifier]
ids then Statement ann
forall a. Monoid a => a
mempty else Assign -> Statement ann
forall a. Assign -> Statement a
BlockAssign (LVal -> Maybe Delay -> Expr -> Assign
Assign LVal
inIds Maybe Delay
forall a. Maybe a
Nothing Expr
0)
]
Statement ann -> Statement ann -> Statement ann
forall a. Semigroup a => a -> a -> a
<> [Statement ann] -> Statement ann
forall m. Monoid m => [m] -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold
( ( \Expr
r ->
Delay -> Maybe (Statement ann) -> Statement ann
forall a. Delay -> Maybe (Statement a) -> Statement a
TimeCtrl
Delay
10
(Statement ann -> Maybe (Statement ann)
forall a. a -> Maybe a
Just (Statement ann -> Maybe (Statement ann))
-> Statement ann -> Maybe (Statement ann)
forall a b. (a -> b) -> a -> b
$ Assign -> Statement ann
forall a. Assign -> Statement a
BlockAssign (LVal -> Maybe Delay -> Expr -> Assign
Assign LVal
inConcat Maybe Delay
forall a. Maybe a
Nothing Expr
r))
)
(Expr -> Statement ann)
-> (ByteString -> Expr) -> ByteString -> Statement ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Expr
forall a. Num a => Integer -> a
fromInteger
(Integer -> Expr) -> (ByteString -> Integer) -> ByteString -> Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Integer
fromBytes
(ByteString -> Statement ann) -> [ByteString] -> [Statement ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [ByteString]
bss
)
Statement ann -> Statement ann -> Statement ann
forall a. Semigroup a => a -> a -> a
<> (Delay -> Maybe (Statement ann) -> Statement ann
forall a. Delay -> Maybe (Statement a) -> Statement a
TimeCtrl Delay
10 (Maybe (Statement ann) -> Statement ann)
-> (Task -> Maybe (Statement ann)) -> Task -> Statement ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Statement ann -> Maybe (Statement ann)
forall a. a -> Maybe a
Just (Statement ann -> Maybe (Statement ann))
-> (Task -> Statement ann) -> Task -> Maybe (Statement ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Task -> Statement ann
forall a. Task -> Statement a
SysTaskEnable (Task -> Statement ann) -> Task -> Statement ann
forall a b. (a -> b) -> a -> b
$ Identifier -> [Expr] -> Task
Task Identifier
"finish" []),
Statement ann -> ModItem ann
forall a. Statement a -> ModItem a
Always (Statement ann -> ModItem ann)
-> (Statement ann -> Statement ann) -> Statement ann -> ModItem ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Delay -> Maybe (Statement ann) -> Statement ann
forall a. Delay -> Maybe (Statement a) -> Statement a
TimeCtrl Delay
5 (Maybe (Statement ann) -> Statement ann)
-> (Statement ann -> Maybe (Statement ann))
-> Statement ann
-> Statement ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Statement ann -> Maybe (Statement ann)
forall a. a -> Maybe a
Just (Statement ann -> ModItem ann) -> Statement ann -> ModItem ann
forall a b. (a -> b) -> a -> b
$
Assign -> Statement ann
forall a. Assign -> Statement a
BlockAssign
(LVal -> Maybe Delay -> Expr -> Assign
Assign LVal
"clk" Maybe Delay
forall a. Maybe a
Nothing (UnaryOperator -> Expr -> Expr
UnOp UnaryOperator
UnNot (Identifier -> Expr
Id Identifier
"clk"))),
Statement ann -> ModItem ann
forall a. Statement a -> ModItem a
Always (Statement ann -> ModItem ann)
-> (Task -> Statement ann) -> Task -> ModItem ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event -> Maybe (Statement ann) -> Statement ann
forall a. Event -> Maybe (Statement a) -> Statement a
EventCtrl (Identifier -> Event
EPosEdge Identifier
"clk") (Maybe (Statement ann) -> Statement ann)
-> (Task -> Maybe (Statement ann)) -> Task -> Statement ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Statement ann -> Maybe (Statement ann)
forall a. a -> Maybe a
Just (Statement ann -> Maybe (Statement ann))
-> (Task -> Statement ann) -> Task -> Maybe (Statement ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Task -> Statement ann
forall a. Task -> Statement a
SysTaskEnable (Task -> ModItem ann) -> Task -> ModItem ann
forall a b. (a -> b) -> a -> b
$
Identifier -> [Expr] -> Task
Task Identifier
"strobe" [Expr
"%b", NonEmpty Expr -> Expr
Concat ([Expr] -> NonEmpty Expr
forall a. HasCallStack => [a] -> NonEmpty a
fromList ([Expr] -> NonEmpty Expr) -> [Expr] -> NonEmpty Expr
forall a b. (a -> b) -> a -> b
$ (Identifier -> Expr) -> [Identifier] -> [Expr]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Identifier -> Expr
Id [Identifier]
outputs)]
]
[]
]
where
inConcat :: LVal
inConcat =
( [Expr] -> LVal
RegConcat
([Expr] -> LVal) -> ([Expr] -> [Expr]) -> [Expr] -> LVal
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Expr -> Bool) -> [Expr] -> [Expr]
forall a. (a -> Bool) -> [a] -> [a]
filter ((Expr -> [Expr] -> Bool) -> [Expr] -> Expr -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip Expr -> [Expr] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem ([Expr] -> Expr -> Bool) -> [Expr] -> Expr -> Bool
forall a b. (a -> b) -> a -> b
$ (Identifier -> Expr) -> [Identifier] -> [Expr]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Identifier -> Expr
Id [Identifier]
ids)
([Expr] -> [Expr]) -> ([Expr] -> [Expr]) -> [Expr] -> [Expr]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Expr -> Bool) -> [Expr] -> [Expr]
forall a. (a -> Bool) -> [a] -> [a]
filter (Expr -> Expr -> Bool
forall a. Eq a => a -> a -> Bool
/= (Identifier -> Expr
Id Identifier
"clk"))
([Expr] -> LVal) -> [Expr] -> LVal
forall a b. (a -> b) -> a -> b
$ (Identifier -> Expr
Id (Identifier -> Expr) -> (Port -> Identifier) -> Port -> Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Port -> Identifier
fromPort (Port -> Expr) -> [Port] -> [Expr]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ModDecl ann
top ModDecl ann -> Getting [Port] (ModDecl ann) [Port] -> [Port]
forall s a. s -> Getting a s a -> a
^. Getting [Port] (ModDecl ann) [Port]
forall a (f :: * -> *).
Applicative f =>
([Port] -> f [Port]) -> ModDecl a -> f (ModDecl a)
modInPorts))
)
inIds :: LVal
inIds = [Expr] -> LVal
RegConcat ([Expr] -> LVal) -> [Expr] -> LVal
forall a b. (a -> b) -> a -> b
$ (Identifier -> Expr) -> [Identifier] -> [Expr]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Identifier -> Expr
Id [Identifier]
ids
outputs :: [Identifier]
outputs = ModDecl ann
top ModDecl ann
-> Getting (Endo [Identifier]) (ModDecl ann) Identifier
-> [Identifier]
forall s a. s -> Getting (Endo [a]) s a -> [a]
^.. ([Port] -> Const (Endo [Identifier]) [Port])
-> ModDecl ann -> Const (Endo [Identifier]) (ModDecl ann)
forall a (f :: * -> *).
Applicative f =>
([Port] -> f [Port]) -> ModDecl a -> f (ModDecl a)
modOutPorts (([Port] -> Const (Endo [Identifier]) [Port])
-> ModDecl ann -> Const (Endo [Identifier]) (ModDecl ann))
-> ((Identifier -> Const (Endo [Identifier]) Identifier)
-> [Port] -> Const (Endo [Identifier]) [Port])
-> Getting (Endo [Identifier]) (ModDecl ann) Identifier
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Port -> Const (Endo [Identifier]) Port)
-> [Port] -> Const (Endo [Identifier]) [Port]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse ((Port -> Const (Endo [Identifier]) Port)
-> [Port] -> Const (Endo [Identifier]) [Port])
-> ((Identifier -> Const (Endo [Identifier]) Identifier)
-> Port -> Const (Endo [Identifier]) Port)
-> (Identifier -> Const (Endo [Identifier]) Identifier)
-> [Port]
-> Const (Endo [Identifier]) [Port]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Identifier -> Const (Endo [Identifier]) Identifier)
-> Port -> Const (Endo [Identifier]) Port
Lens' Port Identifier
portName
counterTestBench :: CounterEg -> (ModDecl ann) -> (Verilog ann)
counterTestBench :: forall ann. CounterEg -> ModDecl ann -> Verilog ann
counterTestBench (CounterEg [(Text, Text)]
_ [[(Text, Text)]]
states) ModDecl ann
m = [ByteString] -> ModDecl ann -> Verilog ann
forall ann. [ByteString] -> ModDecl ann -> Verilog ann
tbModule [ByteString]
filtered ModDecl ann
m
where
filtered :: [ByteString]
filtered = Text -> ByteString
convert (Text -> ByteString)
-> ([(Text, Text)] -> Text) -> [(Text, Text)] -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Text] -> Text
forall m. Monoid m => [m] -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold ([Text] -> Text)
-> ([(Text, Text)] -> [Text]) -> [(Text, Text)] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Text, Text) -> Text) -> [(Text, Text)] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Text, Text) -> Text
forall a b. (a, b) -> b
snd ([(Text, Text)] -> [Text])
-> ([(Text, Text)] -> [(Text, Text)]) -> [(Text, Text)] -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Text, Text) -> Bool) -> [(Text, Text)] -> [(Text, Text)]
forall a. (a -> Bool) -> [a] -> [a]
filter ((Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
/= Text
"clk") (Text -> Bool) -> ((Text, Text) -> Text) -> (Text, Text) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text, Text) -> Text
forall a b. (a, b) -> a
fst) ([(Text, Text)] -> ByteString) -> [[(Text, Text)]] -> [ByteString]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [[(Text, Text)]]
states
runSimIc' ::
(Synthesiser b, Show ann) =>
([ByteString] -> (ModDecl ann) -> (Verilog ann)) ->
FilePath ->
Icarus ->
b ->
(SourceInfo ann) ->
[ByteString] ->
Maybe ByteString ->
ResultSh ByteString
runSimIc' :: forall b ann.
(Synthesiser b, Show ann) =>
([ByteString] -> ModDecl ann -> Verilog ann)
-> FilePath
-> Icarus
-> b
-> SourceInfo ann
-> [ByteString]
-> Maybe ByteString
-> ResultSh ByteString
runSimIc' [ByteString] -> ModDecl ann -> Verilog ann
fun FilePath
datadir Icarus
sim1 b
synth1 SourceInfo ann
srcInfo [ByteString]
bss Maybe ByteString
bs = do
FilePath
dir <- Sh FilePath -> ResultT Failed Sh FilePath
forall a. Sh a -> ResultT Failed Sh a
forall (m :: * -> *) a. MonadSh m => Sh a -> m a
liftSh Sh FilePath
pwd
let top :: ModDecl ann
top = SourceInfo ann
srcInfo SourceInfo ann
-> Getting (ModDecl ann) (SourceInfo ann) (ModDecl ann)
-> ModDecl ann
forall s a. s -> Getting a s a -> a
^. Getting (ModDecl ann) (SourceInfo ann) (ModDecl ann)
forall a (f :: * -> *).
Functor f =>
(ModDecl a -> f (ModDecl a)) -> SourceInfo a -> f (SourceInfo a)
mainModule
let tb :: Verilog ann
tb = [ByteString] -> ModDecl ann -> Verilog ann
fun [ByteString]
bss ModDecl ann
top
Sh () -> ResultT Failed Sh ()
forall a. Sh a -> ResultT Failed Sh a
forall (m :: * -> *) a. MonadSh m => Sh a -> m a
liftSh (Sh () -> ResultT Failed Sh ())
-> (Text -> Sh ()) -> Text -> ResultT Failed Sh ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FilePath -> Text -> Sh ()
writefile FilePath
tbname (Text -> ResultT Failed Sh ()) -> Text -> ResultT Failed Sh ()
forall a b. (a -> b) -> a -> b
$ FilePath -> Verilog ann -> b -> Text
forall a ann.
(Synthesiser a, Show ann) =>
FilePath -> Verilog ann -> a -> Text
icarusTestbench FilePath
datadir Verilog ann
tb b
synth1
Sh () -> ResultT Failed Sh ()
forall a. Sh a -> ResultT Failed Sh a
forall (m :: * -> *) a. MonadSh m => Sh a -> m a
liftSh (Sh () -> ResultT Failed Sh ()) -> Sh () -> ResultT Failed Sh ()
forall a b. (a -> b) -> a -> b
$ FilePath -> Text -> FilePath -> [Text] -> Sh ()
exe FilePath
dir Text
"icarus" FilePath
"iverilog" [Text
"-o", Text
exename, FilePath -> Text
toTextIgnore FilePath
tbname]
ByteString
s <-
Sh ByteString -> ResultSh ByteString
forall a. Sh a -> ResultT Failed Sh a
forall (m :: * -> *) a. MonadSh m => Sh a -> m a
liftSh (Sh ByteString -> ResultSh ByteString)
-> Sh ByteString -> ResultSh ByteString
forall a b. (a -> b) -> a -> b
$
Int -> ByteString -> ByteString
B.take Int
8
(ByteString -> ByteString)
-> (ByteString -> ByteString) -> ByteString -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Digest SHA256 -> ByteString
forall bin bout.
(ByteArrayAccess bin, ByteArray bout) =>
bin -> bout
BA.convert
(Digest SHA256 -> ByteString)
-> (ByteString -> Digest SHA256) -> ByteString -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ByteString -> Digest SHA256
forall ba a.
(ByteArrayAccess ba, HashAlgorithm a) =>
ba -> Digest a
hash :: ByteString -> Digest SHA256)
(ByteString -> ByteString) -> Sh ByteString -> Sh ByteString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FilePath -> Text -> Sh ByteString -> Sh ByteString
forall a. FilePath -> Text -> Sh a -> Sh a
logCommand
FilePath
dir
Text
"vvp"
( ByteString
-> (ByteString -> Text -> ByteString)
-> FilePath
-> [Text]
-> Sh ByteString
forall a. a -> FoldCallback a -> FilePath -> [Text] -> Sh a
runFoldLines
(ByteString
forall a. Monoid a => a
mempty :: ByteString)
ByteString -> Text -> ByteString
callback
(Icarus -> FilePath
vvpPath Icarus
sim1)
[Text
exename]
)
case (Maybe ByteString
bs, ByteString
s) of
(Maybe ByteString
Nothing, ByteString
s') -> Sh (Result Failed ByteString) -> ResultSh ByteString
forall a (m :: * -> *) b. m (Result a b) -> ResultT a m b
ResultT (Sh (Result Failed ByteString) -> ResultSh ByteString)
-> (Result Failed ByteString -> Sh (Result Failed ByteString))
-> Result Failed ByteString
-> ResultSh ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Result Failed ByteString -> Sh (Result Failed ByteString)
forall a. a -> Sh a
forall (m :: * -> *) a. Monad m => a -> m a
return (Result Failed ByteString -> ResultSh ByteString)
-> Result Failed ByteString -> ResultSh ByteString
forall a b. (a -> b) -> a -> b
$ ByteString -> Result Failed ByteString
forall a b. b -> Result a b
Pass ByteString
s'
(Just ByteString
bs', ByteString
s') ->
if ByteString
bs' ByteString -> ByteString -> Bool
forall a. Eq a => a -> a -> Bool
== ByteString
s'
then Sh (Result Failed ByteString) -> ResultSh ByteString
forall a (m :: * -> *) b. m (Result a b) -> ResultT a m b
ResultT (Sh (Result Failed ByteString) -> ResultSh ByteString)
-> (Result Failed ByteString -> Sh (Result Failed ByteString))
-> Result Failed ByteString
-> ResultSh ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Result Failed ByteString -> Sh (Result Failed ByteString)
forall a. a -> Sh a
forall (m :: * -> *) a. Monad m => a -> m a
return (Result Failed ByteString -> ResultSh ByteString)
-> Result Failed ByteString -> ResultSh ByteString
forall a b. (a -> b) -> a -> b
$ ByteString -> Result Failed ByteString
forall a b. b -> Result a b
Pass ByteString
s'
else Sh (Result Failed ByteString) -> ResultSh ByteString
forall a (m :: * -> *) b. m (Result a b) -> ResultT a m b
ResultT (Sh (Result Failed ByteString) -> ResultSh ByteString)
-> (Result Failed ByteString -> Sh (Result Failed ByteString))
-> Result Failed ByteString
-> ResultSh ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Result Failed ByteString -> Sh (Result Failed ByteString)
forall a. a -> Sh a
forall (m :: * -> *) a. Monad m => a -> m a
return (Result Failed ByteString -> ResultSh ByteString)
-> Result Failed ByteString -> ResultSh ByteString
forall a b. (a -> b) -> a -> b
$ Failed -> Result Failed ByteString
forall a b. a -> Result a b
Fail (ByteString -> Failed
SimFail ByteString
s')
where
exe :: FilePath -> Text -> FilePath -> [Text] -> Sh ()
exe FilePath
dir Text
name FilePath
e = Sh Text -> Sh ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Sh Text -> Sh ()) -> ([Text] -> Sh Text) -> [Text] -> Sh ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> Sh Text -> Sh Text
forall a. Bool -> Sh a -> Sh a
errExit Bool
False (Sh Text -> Sh Text) -> ([Text] -> Sh Text) -> [Text] -> Sh Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FilePath -> Text -> Sh Text -> Sh Text
forall a. FilePath -> Text -> Sh a -> Sh a
logCommand FilePath
dir Text
name (Sh Text -> Sh Text) -> ([Text] -> Sh Text) -> [Text] -> Sh Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FilePath -> [Text] -> Sh Text
timeout FilePath
e
tbname :: FilePath
tbname = Text -> FilePath
fromText (Text -> FilePath) -> Text -> FilePath
forall a b. (a -> b) -> a -> b
$ b -> Text
forall a. Tool a => a -> Text
toText b
synth1 Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"_testbench.v"
exename :: Text
exename = b -> Text
forall a. Tool a => a -> Text
toText b
synth1 Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"_main"
runSimIc ::
(Synthesiser b, Show ann) =>
FilePath ->
Icarus ->
b ->
SourceInfo ann ->
[ByteString] ->
Maybe ByteString ->
ResultSh ByteString
runSimIc :: forall b ann.
(Synthesiser b, Show ann) =>
FilePath
-> Icarus
-> b
-> SourceInfo ann
-> [ByteString]
-> Maybe ByteString
-> ResultSh ByteString
runSimIc = ([ByteString] -> ModDecl ann -> Verilog ann)
-> FilePath
-> Icarus
-> b
-> SourceInfo ann
-> [ByteString]
-> Maybe ByteString
-> ResultSh ByteString
forall b ann.
(Synthesiser b, Show ann) =>
([ByteString] -> ModDecl ann -> Verilog ann)
-> FilePath
-> Icarus
-> b
-> SourceInfo ann
-> [ByteString]
-> Maybe ByteString
-> ResultSh ByteString
runSimIc' [ByteString] -> ModDecl ann -> Verilog ann
forall ann. [ByteString] -> ModDecl ann -> Verilog ann
tbModule
runSimIcEMI ::
(Synthesiser b, Show ann) =>
[Identifier] ->
FilePath ->
Icarus ->
b ->
SourceInfo ann ->
[ByteString] ->
Maybe ByteString ->
ResultSh ByteString
runSimIcEMI :: forall b ann.
(Synthesiser b, Show ann) =>
[Identifier]
-> FilePath
-> Icarus
-> b
-> SourceInfo ann
-> [ByteString]
-> Maybe ByteString
-> ResultSh ByteString
runSimIcEMI [Identifier]
ids = ([ByteString] -> ModDecl ann -> Verilog ann)
-> FilePath
-> Icarus
-> b
-> SourceInfo ann
-> [ByteString]
-> Maybe ByteString
-> ResultSh ByteString
forall b ann.
(Synthesiser b, Show ann) =>
([ByteString] -> ModDecl ann -> Verilog ann)
-> FilePath
-> Icarus
-> b
-> SourceInfo ann
-> [ByteString]
-> Maybe ByteString
-> ResultSh ByteString
runSimIc' ([Identifier] -> [ByteString] -> ModDecl ann -> Verilog ann
forall ann.
[Identifier] -> [ByteString] -> ModDecl ann -> Verilog ann
tbModule' [Identifier]
ids)
runSimIcEC ::
(Synthesiser b, Show ann) =>
FilePath ->
Icarus ->
b ->
(SourceInfo ann) ->
CounterEg ->
Maybe ByteString ->
ResultSh ByteString
runSimIcEC :: forall b ann.
(Synthesiser b, Show ann) =>
FilePath
-> Icarus
-> b
-> SourceInfo ann
-> CounterEg
-> Maybe ByteString
-> ResultSh ByteString
runSimIcEC FilePath
a Icarus
b b
c SourceInfo ann
d CounterEg
e = ([ByteString] -> ModDecl ann -> Verilog ann)
-> FilePath
-> Icarus
-> b
-> SourceInfo ann
-> [ByteString]
-> Maybe ByteString
-> ResultSh ByteString
forall b ann.
(Synthesiser b, Show ann) =>
([ByteString] -> ModDecl ann -> Verilog ann)
-> FilePath
-> Icarus
-> b
-> SourceInfo ann
-> [ByteString]
-> Maybe ByteString
-> ResultSh ByteString
runSimIc' ((ModDecl ann -> Verilog ann)
-> [ByteString] -> ModDecl ann -> Verilog ann
forall a b. a -> b -> a
const ((ModDecl ann -> Verilog ann)
-> [ByteString] -> ModDecl ann -> Verilog ann)
-> (ModDecl ann -> Verilog ann)
-> [ByteString]
-> ModDecl ann
-> Verilog ann
forall a b. (a -> b) -> a -> b
$ CounterEg -> ModDecl ann -> Verilog ann
forall ann. CounterEg -> ModDecl ann -> Verilog ann
counterTestBench CounterEg
e) FilePath
a Icarus
b b
c SourceInfo ann
d []