From 110d1392882cff9618997acad85af78017688c86 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Thu, 9 May 2019 14:36:28 +0100 Subject: Add NFData to force evaluation of config file --- src/VeriFuzz.hs | 14 ---- src/VeriFuzz/Config.hs | 189 +++++++++++++------------------------------- src/VeriFuzz/Fuzz.hs | 5 +- src/VeriFuzz/Report.hs | 40 ++++++---- src/VeriFuzz/Sim/Icarus.hs | 4 + src/VeriFuzz/Sim/Quartus.hs | 4 + src/VeriFuzz/Sim/Vivado.hs | 4 + src/VeriFuzz/Sim/XST.hs | 4 + src/VeriFuzz/Sim/Yosys.hs | 4 + 9 files changed, 101 insertions(+), 167 deletions(-) (limited to 'src') 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 -- - -- - -- - --- --- === Default Configuration --- --- >>> T.putStrLn $ encodeConfig defaultConfig --- --- [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 --- --- [property] --- module.depth = 2 --- module.max = 5 --- size = 20 --- statement.depth = 3 --- --- [[synthesiser]] --- name = "yosys" --- yosys.description = "yosys" --- yosys.output = "syn_yosys.v" --- --- [[synthesiser]] --- name = "vivado" --- vivado.description = "vivado" --- vivado.output = "syn_vivado.v" --- -- | 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" -- cgit