From 7407dbc84b49287b5df64fb68e1d1b58d9cc8b22 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Grave Date: Thu, 7 Mar 2019 11:36:46 +0000 Subject: Add proper register generation --- src/VeriFuzz/Config.hs | 2 +- src/VeriFuzz/Gen.hs | 30 ++++++++++++++++-------------- 2 files changed, 17 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/VeriFuzz/Config.hs b/src/VeriFuzz/Config.hs index d7fccb6..1c1b3bb 100644 --- a/src/VeriFuzz/Config.hs +++ b/src/VeriFuzz/Config.hs @@ -67,7 +67,7 @@ defaultValue defaultValue x = Toml.dimap Just (fromMaybe x) . Toml.dioptional defaultConfig :: Config -defaultConfig = Config (Probability 1 1 1 1) (Property 100 Nothing) +defaultConfig = Config (Probability 10 1 1 1) (Property 50 Nothing) probCodec :: TomlCodec Probability probCodec = diff --git a/src/VeriFuzz/Gen.hs b/src/VeriFuzz/Gen.hs index 637b8f1..5c8a60b 100644 --- a/src/VeriFuzz/Gen.hs +++ b/src/VeriFuzz/Gen.hs @@ -31,6 +31,7 @@ import Test.QuickCheck (Gen) import qualified Test.QuickCheck as QC import VeriFuzz.AST import VeriFuzz.ASTGen +import VeriFuzz.CodeGen import VeriFuzz.Config import VeriFuzz.Internal import VeriFuzz.Mutate @@ -95,14 +96,21 @@ fromGraph = do gen :: Gen a -> StateGen a gen = lift . lift +some :: StateGen a -> StateGen [a] +some f = do + amount <- gen positiveArb + replicateM amount f + +newPort :: PortType -> StateGen Port +newPort pt = do + p <- gen $ Port pt <$> QC.arbitrary <*> positiveArb <*> QC.arbitrary + variables %= (p :) + return p + contAssign :: StateGen ContAssign contAssign = do - name <- gen QC.arbitrary - size <- gen positiveArb - signed <- gen QC.arbitrary - variables %= (Port Wire signed size name :) - ContAssign name <$> scopedExpr - + p <- newPort Wire + ContAssign (p ^. portName) <$> scopedExpr scopedExpr :: StateGen Expr scopedExpr = do @@ -136,7 +144,7 @@ askProbability = lift $ asks probability assignment :: StateGen Assign assignment = do - lval <- scopedReg + lval <- lvalFromPort <$> newPort Reg Assign lval Nothing <$> scopedExpr statement :: StateGen Statement @@ -162,16 +170,10 @@ modItem = do ) ] -ports :: StateGen [Port] -ports = do - portList <- gen $ QC.listOf1 QC.arbitrary - variables %= (<> portList) - return portList - moduleDef :: Bool -> StateGen ModDecl moduleDef top = do name <- if top then return "top" else gen QC.arbitrary - portList <- ports + portList <- some $ newPort Wire amount <- gen positiveArb mi <- replicateM amount modItem context <- get -- cgit