aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYann Herklotz <git@ymhg.org>2019-05-09 14:36:28 +0100
committerYann Herklotz <git@ymhg.org>2019-05-09 14:36:28 +0100
commit110d1392882cff9618997acad85af78017688c86 (patch)
tree5982e3d54321f89af1d1b694ed7db35fca03858a /src
parentfa2703bb983c2dd72fea3863980a7c589b57f0a4 (diff)
downloadverismith-110d1392882cff9618997acad85af78017688c86.tar.gz
verismith-110d1392882cff9618997acad85af78017688c86.zip
Add NFData to force evaluation of config file
Diffstat (limited to 'src')
-rw-r--r--src/VeriFuzz.hs14
-rw-r--r--src/VeriFuzz/Config.hs189
-rw-r--r--src/VeriFuzz/Fuzz.hs5
-rw-r--r--src/VeriFuzz/Report.hs40
-rw-r--r--src/VeriFuzz/Sim/Icarus.hs4
-rw-r--r--src/VeriFuzz/Sim/Quartus.hs4
-rw-r--r--src/VeriFuzz/Sim/Vivado.hs4
-rw-r--r--src/VeriFuzz/Sim/XST.hs4
-rw-r--r--src/VeriFuzz/Sim/Yosys.hs4
9 files changed, 101 insertions, 167 deletions
diff --git a/src/VeriFuzz.hs b/src/VeriFuzz.hs
index c4c7448..495492f 100644
--- a/src/VeriFuzz.hs
+++ b/src/VeriFuzz.hs
@@ -15,7 +15,6 @@ module VeriFuzz
, runSimulation
, runReduce
, draw
- , versionInfo
, SourceInfo(..)
, module VeriFuzz.Verilog
, module VeriFuzz.Config
@@ -38,12 +37,9 @@ import Data.Text (Text)
import qualified Data.Text as T
import Data.Text.Encoding (decodeUtf8)
import qualified Data.Text.IO as T
-import Data.Version (showVersion)
-import Development.GitRev
import Hedgehog (Gen)
import qualified Hedgehog.Gen as Hog
import Hedgehog.Internal.Seed (Seed)
-import Paths_verifuzz (version)
import Prelude hiding (FilePath)
import Shelly
import Shelly.Lifted (liftSh)
@@ -57,16 +53,6 @@ import VeriFuzz.Sim
import VeriFuzz.Sim.Internal
import VeriFuzz.Verilog
-versionInfo :: String
-versionInfo =
- "VeriFuzz "
- <> showVersion version
- <> " ("
- <> $(gitCommitDate)
- <> " "
- <> $(gitHash)
- <> ")"
-
-- | Generate a specific number of random bytestrings of size 256.
randomByteString :: C.CtrDRBG -> Int -> [ByteString] -> [ByteString]
randomByteString gen n bytes
diff --git a/src/VeriFuzz/Config.hs b/src/VeriFuzz/Config.hs
index f4656ec..46cc721 100644
--- a/src/VeriFuzz/Config.hs
+++ b/src/VeriFuzz/Config.hs
@@ -70,6 +70,7 @@ module VeriFuzz.Config
, parseConfig
, encodeConfig
, encodeConfigFile
+ , versionInfo
)
where
@@ -77,9 +78,12 @@ import Control.Applicative (Alternative)
import Control.Lens hiding ((.=))
import Data.List.NonEmpty (NonEmpty (..))
import Data.Maybe (fromMaybe)
-import Data.Text (Text)
+import Data.Text (Text, pack)
import qualified Data.Text.IO as T
+import Data.Version (showVersion)
+import Development.GitRev
import Hedgehog.Internal.Seed (Seed)
+import Paths_verifuzz (version)
import Shelly (toTextIgnore)
import Toml (TomlCodec, (.=))
import qualified Toml
@@ -126,47 +130,6 @@ import VeriFuzz.Sim.Yosys
-- - <https://www.xilinx.com/products/design-tools/ise-design-suite.html ISE Design Suite>
-- - <https://www.xilinx.com/products/design-tools/ise-design-suite.html Vivado Design Suite>
-- - <http://www.clifford.at/yosys/ Yosys Open SYnthesis Suite>
---
--- === Default Configuration
---
--- >>> T.putStrLn $ encodeConfig defaultConfig
--- <BLANKLINE>
--- [probability]
--- expr.binary = 5
--- expr.concatenation = 3
--- expr.number = 1
--- expr.rangeselect = 5
--- expr.signed = 5
--- expr.string = 0
--- expr.ternary = 5
--- expr.unary = 5
--- expr.unsigned = 5
--- expr.variable = 5
--- moditem.assign = 5
--- moditem.combinational = 1
--- moditem.instantiation = 1
--- moditem.sequential = 1
--- statement.blocking = 0
--- statement.conditional = 1
--- statement.forloop = 0
--- statement.nonblocking = 3
--- <BLANKLINE>
--- [property]
--- module.depth = 2
--- module.max = 5
--- size = 20
--- statement.depth = 3
--- <BLANKLINE>
--- [[synthesiser]]
--- name = "yosys"
--- yosys.description = "yosys"
--- yosys.output = "syn_yosys.v"
--- <BLANKLINE>
--- [[synthesiser]]
--- name = "vivado"
--- vivado.description = "vivado"
--- vivado.output = "syn_vivado.v"
--- <BLANKLINE>
-- | Probability of different expressions nodes.
data ProbExpr = ProbExpr { _probExprNum :: {-# UNPACK #-} !Int
@@ -234,38 +197,36 @@ data Property = Property { _propSize :: {-# UNPACK #-} !Int
}
deriving (Eq, Show)
+data Info = Info { _infoCommit :: !Text
+ , _infoVersion :: !Text
+ }
+ deriving (Eq, Show)
+
data SimDescription = SimDescription { simName :: {-# UNPACK #-} !Text }
deriving (Eq, Show)
-data SynthDescription = SynthDescription { synthName :: {-# UNPACK #-} !Text
- , synthYosysBin :: Maybe Text
- , synthYosysDesc :: Maybe Text
- , synthYosysOutput :: Maybe Text
- , synthXstBin :: Maybe Text
- , synthXstDesc :: Maybe Text
- , synthXstOutput :: Maybe Text
- , synthVivadoBin :: Maybe Text
- , synthVivadoDesc :: Maybe Text
- , synthVivadoOutput :: Maybe Text
- , synthQuartusBin :: Maybe Text
- , synthQuartusDesc :: Maybe Text
- , synthQuartusOutput :: Maybe Text
+data SynthDescription = SynthDescription { synthName :: {-# UNPACK #-} !Text
+ , synthBin :: Maybe Text
+ , synthDesc :: Maybe Text
+ , synthOut :: Maybe Text
}
deriving (Eq, Show)
-data Config = Config { _configProbability :: {-# UNPACK #-} !Probability
+data Config = Config { _configInfo :: Info
+ , _configProbability :: {-# UNPACK #-} !Probability
, _configProperty :: {-# UNPACK #-} !Property
, _configSimulators :: [SimDescription]
, _configSynthesisers :: [SynthDescription]
}
deriving (Eq, Show)
-makeLenses ''ProbExpr
-makeLenses ''ProbModItem
-makeLenses ''ProbStatement
-makeLenses ''Probability
-makeLenses ''Property
-makeLenses ''Config
+$(makeLenses ''ProbExpr)
+$(makeLenses ''ProbModItem)
+$(makeLenses ''ProbStatement)
+$(makeLenses ''Probability)
+$(makeLenses ''Property)
+$(makeLenses ''Info)
+$(makeLenses ''Config)
defaultValue
:: (Alternative r, Applicative w)
@@ -278,18 +239,9 @@ fromXST :: XST -> SynthDescription
fromXST (XST a b c) =
SynthDescription
"xst"
- Nothing
- Nothing
- Nothing
(toTextIgnore <$> a)
(Just b)
(Just $ toTextIgnore c)
- Nothing
- Nothing
- Nothing
- Nothing
- Nothing
- Nothing
fromYosys :: Yosys -> SynthDescription
fromYosys (Yosys a b c) =
@@ -298,55 +250,29 @@ fromYosys (Yosys a b c) =
(toTextIgnore <$> a)
(Just b)
(Just $ toTextIgnore c)
- Nothing
- Nothing
- Nothing
- Nothing
- Nothing
- Nothing
- Nothing
- Nothing
- Nothing
fromVivado :: Vivado -> SynthDescription
fromVivado (Vivado a b c) =
SynthDescription
"vivado"
- Nothing
- Nothing
- Nothing
- Nothing
- Nothing
- Nothing
(toTextIgnore <$> a)
(Just b)
(Just $ toTextIgnore c)
- Nothing
- Nothing
- Nothing
fromQuartus :: Quartus -> SynthDescription
fromQuartus (Quartus a b c) =
SynthDescription
"quartus"
- Nothing
- Nothing
- Nothing
- Nothing
- Nothing
- Nothing
- Nothing
- Nothing
- Nothing
(toTextIgnore <$> a)
(Just b)
(Just $ toTextIgnore c)
defaultConfig :: Config
-defaultConfig = Config (Probability defModItem defStmnt defExpr)
- (Property 20 Nothing 3 2 5)
- []
- [fromYosys defaultYosys, fromVivado defaultVivado]
+defaultConfig = Config (Info (pack $(gitHash)) (pack $ showVersion version))
+ (Probability defModItem defStmnt defExpr)
+ (Property 20 Nothing 3 2 5)
+ []
+ [fromYosys defaultYosys, fromVivado defaultVivado]
where
defModItem =
ProbModItem 5 -- Assign
@@ -469,43 +395,28 @@ simulator = Toml.textBy pprint parseIcarus "name"
synthesiser :: TomlCodec SynthDescription
synthesiser =
SynthDescription
- <$> Toml.textBy id parseSynth "name"
+ <$> Toml.text "name"
.= synthName
- <*> Toml.dioptional (Toml.text $ twoKey "yosys" "bin")
- .= synthYosysBin
- <*> Toml.dioptional (Toml.text $ twoKey "yosys" "description")
- .= synthYosysDesc
- <*> Toml.dioptional (Toml.text $ twoKey "yosys" "output")
- .= synthYosysOutput
- <*> Toml.dioptional (Toml.text $ twoKey "xst" "bin")
- .= synthXstBin
- <*> Toml.dioptional (Toml.text $ twoKey "xst" "description")
- .= synthXstDesc
- <*> Toml.dioptional (Toml.text $ twoKey "xst" "output")
- .= synthXstOutput
- <*> Toml.dioptional (Toml.text $ twoKey "vivado" "bin")
- .= synthVivadoBin
- <*> Toml.dioptional (Toml.text $ twoKey "vivado" "description")
- .= synthVivadoDesc
- <*> Toml.dioptional (Toml.text $ twoKey "vivado" "output")
- .= synthVivadoOutput
- <*> Toml.dioptional (Toml.text $ twoKey "quartus" "bin")
- .= synthQuartusBin
- <*> Toml.dioptional (Toml.text $ twoKey "quartus" "description")
- .= synthQuartusDesc
- <*> Toml.dioptional (Toml.text $ twoKey "quartus" "output")
- .= synthQuartusOutput
- where
- parseSynth s@"yosys" = Right s
- parseSynth s@"vivado" = Right s
- parseSynth s@"quartus" = Right s
- parseSynth s@"xst" = Right s
- parseSynth s = Left $ "Could not match '" <> s <> "' with a synthesiser."
+ <*> Toml.dioptional (Toml.text "bin")
+ .= synthBin
+ <*> Toml.dioptional (Toml.text "description")
+ .= synthDesc
+ <*> Toml.dioptional (Toml.text "output")
+ .= synthOut
+
+infoCodec :: TomlCodec Info
+infoCodec = Info
+ <$> defaultValue (defaultConfig ^. configInfo . infoCommit) (Toml.text "commit")
+ .= _infoCommit
+ <*> defaultValue (defaultConfig ^. configInfo . infoVersion) (Toml.text "version")
+ .= _infoVersion
configCodec :: TomlCodec Config
configCodec =
Config
- <$> defaultValue (defaultConfig ^. configProbability)
+ <$> defaultValue (defaultConfig ^. configInfo) (Toml.table infoCodec "info")
+ .= _configInfo
+ <*> defaultValue (defaultConfig ^. configProbability)
(Toml.table probCodec "probability")
.= _configProbability
<*> defaultValue (defaultConfig ^. configProperty)
@@ -536,3 +447,13 @@ encodeConfig = Toml.encode configCodec
encodeConfigFile :: FilePath -> Config -> IO ()
encodeConfigFile f = T.writeFile f . encodeConfig
+
+versionInfo :: String
+versionInfo =
+ "VeriFuzz "
+ <> showVersion version
+ <> " ("
+ <> $(gitCommitDate)
+ <> " "
+ <> $(gitHash)
+ <> ")"
diff --git a/src/VeriFuzz/Fuzz.hs b/src/VeriFuzz/Fuzz.hs
index 6a0e0ad..77f728a 100644
--- a/src/VeriFuzz/Fuzz.hs
+++ b/src/VeriFuzz/Fuzz.hs
@@ -24,6 +24,7 @@ module VeriFuzz.Fuzz
)
where
+import Control.DeepSeq (force)
import Control.Exception.Lifted (finally)
import Control.Lens
import Control.Monad (forM, void)
@@ -73,8 +74,8 @@ runFuzz conf yos m = shelly $ runFuzz' conf yos m
runFuzz' :: Monad m => Config -> Yosys -> (Config -> Fuzz m b) -> m b
runFuzz' conf yos m = runReaderT
(evalStateT (m conf) (FuzzReport [] [] []))
- (FuzzEnv (descriptionToSynth <$> conf ^. configSynthesisers)
- (descriptionToSim <$> conf ^. configSimulators)
+ (FuzzEnv (force $ descriptionToSynth <$> conf ^. configSynthesisers)
+ (force $ descriptionToSim <$> conf ^. configSimulators)
yos
)
diff --git a/src/VeriFuzz/Report.hs b/src/VeriFuzz/Report.hs
index c65df5a..77a5942 100644
--- a/src/VeriFuzz/Report.hs
+++ b/src/VeriFuzz/Report.hs
@@ -30,6 +30,7 @@ module VeriFuzz.Report
)
where
+import Control.DeepSeq (NFData, rnf)
import Control.Lens
import Data.ByteString (ByteString)
import Data.Maybe (fromMaybe)
@@ -53,9 +54,15 @@ type BResult = Result Failed ByteString
data SynthTool = XSTSynth {-# UNPACK #-} !XST
| VivadoSynth {-# UNPACK #-} !Vivado
| YosysSynth {-# UNPACK #-} !Yosys
- | QuartusSynth !Quartus
+ | QuartusSynth {-# UNPACK #-} !Quartus
deriving (Eq)
+instance NFData SynthTool where
+ rnf (XSTSynth a) = rnf a
+ rnf (VivadoSynth a) = rnf a
+ rnf (YosysSynth a) = rnf a
+ rnf (QuartusSynth a) = rnf a
+
instance Show SynthTool where
show (XSTSynth xst) = show xst
show (VivadoSynth vivado) = show vivado
@@ -99,6 +106,9 @@ defaultXSTSynth = XSTSynth defaultXST
newtype SimTool = IcarusSim Icarus
deriving (Eq)
+instance NFData SimTool where
+ rnf (IcarusSim a) = rnf a
+
instance Tool SimTool where
toText (IcarusSim icarus) = toText icarus
@@ -160,25 +170,21 @@ descriptionToSim s =
error $ "Could not find implementation for simulator '" <> show s <> "'"
descriptionToSynth :: SynthDescription -> SynthTool
-descriptionToSynth s@(SynthDescription "yosys" _ _ _ _ _ _ _ _ _ _ _ _) =
+descriptionToSynth (SynthDescription "yosys" bin desc out) =
YosysSynth
- . Yosys (fromText <$> synthYosysBin s) (fromMaybe (yosysDesc defaultYosys) $ synthYosysDesc s)
- . maybe (yosysOutput defaultYosys) fromText
- $ synthYosysOutput s
-descriptionToSynth s@(SynthDescription "vivado" _ _ _ _ _ _ _ _ _ _ _ _) =
+ . Yosys (fromText <$> bin) (fromMaybe (yosysDesc defaultYosys) desc)
+ $ maybe (yosysOutput defaultYosys) fromText out
+descriptionToSynth (SynthDescription "vivado" bin desc out) =
VivadoSynth
- . Vivado (fromText <$> synthVivadoBin s) (fromMaybe (vivadoDesc defaultVivado) $ synthVivadoDesc s)
- . maybe (vivadoOutput defaultVivado) fromText
- $ synthVivadoOutput s
-descriptionToSynth s@(SynthDescription "xst" _ _ _ _ _ _ _ _ _ _ _ _) =
+ . Vivado (fromText <$> bin) (fromMaybe (vivadoDesc defaultVivado) desc)
+ $ maybe (vivadoOutput defaultVivado) fromText out
+descriptionToSynth (SynthDescription "xst" bin desc out) =
XSTSynth
- . XST (fromText <$> synthXstBin s) (fromMaybe (xstDesc defaultXST) $ synthXstDesc s)
- . maybe (xstOutput defaultXST) fromText
- $ synthXstOutput s
-descriptionToSynth s@(SynthDescription "quartus" _ _ _ _ _ _ _ _ _ _ _ _) =
+ . XST (fromText <$> bin) (fromMaybe (xstDesc defaultXST) desc)
+ $ maybe (xstOutput defaultXST) fromText out
+descriptionToSynth (SynthDescription "quartus" bin desc out) =
QuartusSynth
- . Quartus (fromText <$> synthQuartusBin s) (fromMaybe (quartusDesc defaultQuartus) $ synthQuartusDesc s)
- . maybe (quartusOutput defaultQuartus) fromText
- $ synthQuartusOutput s
+ . Quartus (fromText <$> bin) (fromMaybe (quartusDesc defaultQuartus) $ desc)
+ $ maybe (quartusOutput defaultQuartus) fromText out
descriptionToSynth s =
error $ "Could not find implementation for synthesiser '" <> show s <> "'"
diff --git a/src/VeriFuzz/Sim/Icarus.hs b/src/VeriFuzz/Sim/Icarus.hs
index 062a087..423d51b 100644
--- a/src/VeriFuzz/Sim/Icarus.hs
+++ b/src/VeriFuzz/Sim/Icarus.hs
@@ -16,6 +16,7 @@ module VeriFuzz.Sim.Icarus
)
where
+import Control.DeepSeq (NFData, rnf, rwhnf)
import Control.Lens
import Crypto.Hash (Digest, hash)
import Crypto.Hash.Algorithms (SHA256)
@@ -57,6 +58,9 @@ instance Simulator Icarus where
runSim = runSimIcarus
runSimWithFile = runSimIcarusWithFile
+instance NFData Icarus where
+ rnf = rwhnf
+
defaultIcarus :: Icarus
defaultIcarus = Icarus "iverilog" "vvp"
diff --git a/src/VeriFuzz/Sim/Quartus.hs b/src/VeriFuzz/Sim/Quartus.hs
index 88bb6c9..c93603e 100644
--- a/src/VeriFuzz/Sim/Quartus.hs
+++ b/src/VeriFuzz/Sim/Quartus.hs
@@ -16,6 +16,7 @@ module VeriFuzz.Sim.Quartus
)
where
+import Control.DeepSeq (NFData, rnf, rwhnf)
import Data.Text (Text, unpack)
import Prelude hiding (FilePath)
import Shelly
@@ -41,6 +42,9 @@ instance Synthesiser Quartus where
synthOutput = quartusOutput
setSynthOutput (Quartus a b _) = Quartus a b
+instance NFData Quartus where
+ rnf = rwhnf
+
defaultQuartus :: Quartus
defaultQuartus = Quartus Nothing "quartus" "syn_quartus.v"
diff --git a/src/VeriFuzz/Sim/Vivado.hs b/src/VeriFuzz/Sim/Vivado.hs
index c17334e..ee67a78 100644
--- a/src/VeriFuzz/Sim/Vivado.hs
+++ b/src/VeriFuzz/Sim/Vivado.hs
@@ -16,6 +16,7 @@ module VeriFuzz.Sim.Vivado
)
where
+import Control.DeepSeq (NFData, rnf, rwhnf)
import Data.Text (Text, unpack)
import Prelude hiding (FilePath)
import Shelly
@@ -42,6 +43,9 @@ instance Synthesiser Vivado where
synthOutput = vivadoOutput
setSynthOutput (Vivado a b _) = Vivado a b
+instance NFData Vivado where
+ rnf = rwhnf
+
defaultVivado :: Vivado
defaultVivado = Vivado Nothing "vivado" "syn_vivado.v"
diff --git a/src/VeriFuzz/Sim/XST.hs b/src/VeriFuzz/Sim/XST.hs
index e1e8243..11be094 100644
--- a/src/VeriFuzz/Sim/XST.hs
+++ b/src/VeriFuzz/Sim/XST.hs
@@ -18,6 +18,7 @@ module VeriFuzz.Sim.XST
)
where
+import Control.DeepSeq (NFData, rnf, rwhnf)
import Data.Text (Text, unpack)
import Prelude hiding (FilePath)
import Shelly
@@ -45,6 +46,9 @@ instance Synthesiser XST where
synthOutput = xstOutput
setSynthOutput (XST a b _) = XST a b
+instance NFData XST where
+ rnf = rwhnf
+
defaultXST :: XST
defaultXST = XST Nothing "xst" "syn_xst.v"
diff --git a/src/VeriFuzz/Sim/Yosys.hs b/src/VeriFuzz/Sim/Yosys.hs
index b7fae6b..c432afe 100644
--- a/src/VeriFuzz/Sim/Yosys.hs
+++ b/src/VeriFuzz/Sim/Yosys.hs
@@ -20,6 +20,7 @@ module VeriFuzz.Sim.Yosys
)
where
+import Control.DeepSeq (NFData, rnf, rwhnf)
import Control.Lens
import Data.Text (Text, unpack)
import Prelude hiding (FilePath)
@@ -49,6 +50,9 @@ instance Synthesiser Yosys where
synthOutput = yosysOutput
setSynthOutput (Yosys a b _) = Yosys a b
+instance NFData Yosys where
+ rnf = rwhnf
+
defaultYosys :: Yosys
defaultYosys = Yosys Nothing "yosys" "syn_yosys.v"