From c0be2c6fe39902af0cf61a14936547fc780d3f6c Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Sat, 30 Mar 2019 23:02:28 +0000 Subject: Add documentation --- src/VeriFuzz/Gen.hs | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/VeriFuzz/Gen.hs b/src/VeriFuzz/Gen.hs index b41a4cf..f7baa12 100644 --- a/src/VeriFuzz/Gen.hs +++ b/src/VeriFuzz/Gen.hs @@ -31,14 +31,15 @@ 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 import VeriFuzz.Random -newtype Context = Context { _variables :: [Port] - -- , _modules :: [ModDecl] - } +data Context = Context { _variables :: [Port] + , _nameCounter :: Int + } makeLenses ''Context @@ -100,12 +101,29 @@ some f = do amount <- gen positiveArb replicateM amount f +makeIdentifier :: T.Text -> StateGen Identifier +makeIdentifier prefix = do + context <- get + let ident = Identifier $ prefix <> showT (context ^. nameCounter) + nameCounter += 1 + return ident + newPort :: PortType -> StateGen Port newPort pt = do - p <- gen $ Port pt <$> QC.arbitrary <*> positiveArb <*> QC.arbitrary + ident <- makeIdentifier . T.toLower $ showT pt + p <- gen $ Port pt <$> QC.arbitrary <*> positiveArb <*> pure ident variables %= (p :) return p +select :: PortType -> StateGen Port +select ptype = do + context <- get + case filter chooseReg $ context ^.. variables . traverse of + [] -> newPort ptype + l -> gen $ QC.elements l + where + chooseReg (Port a _ _ _) = ptype == a + scopedExpr :: StateGen Expr scopedExpr = do context <- get @@ -148,14 +166,14 @@ statement = do -- | Generate a random module item. modItem :: StateGen ModItem modItem = do - prob <- askProbability - stat <- fold <$> some statement - event <- gen QC.arbitrary - modCA <- ModCA <$> contAssign + prob <- askProbability + stat <- fold <$> some statement + eventReg <- select Reg + modCA <- ModCA <$> contAssign gen $ QC.frequency [ (prob ^. probAssign, return modCA) , ( prob ^. probAlways - , return $ Always (EventCtrl event (Just stat)) + , return $ Always (EventCtrl (EId (eventReg ^. portName)) (Just stat)) ) ] @@ -184,5 +202,5 @@ procedural config = . (: []) . Description <$> QC.resize num (runReaderT (evalStateT (moduleDef True) context) config) - where context = Context [] + where context = Context [] 0 num = config ^. configProperty . propSize -- cgit