aboutsummaryrefslogtreecommitdiffstats
path: root/src/VeriFuzz/Verilog/Gen.hs
diff options
context:
space:
mode:
authorYann Herklotz <git@ymhg.org>2019-04-09 17:32:11 +0100
committerYann Herklotz <git@ymhg.org>2019-04-09 17:32:11 +0100
commitaefb46596f3f2302540a83b2be8b042232822a2f (patch)
tree38afcf0c16635e386fff37c496e1ff5740718cb0 /src/VeriFuzz/Verilog/Gen.hs
parentc1a832419a28ac074cbccbeb7060afd22c36d033 (diff)
downloadverismith-aefb46596f3f2302540a83b2be8b042232822a2f.tar.gz
verismith-aefb46596f3f2302540a83b2be8b042232822a2f.zip
Add probabilities to generation of expressions
Diffstat (limited to 'src/VeriFuzz/Verilog/Gen.hs')
-rw-r--r--src/VeriFuzz/Verilog/Gen.hs65
1 files changed, 46 insertions, 19 deletions
diff --git a/src/VeriFuzz/Verilog/Gen.hs b/src/VeriFuzz/Verilog/Gen.hs
index ae72b9f..6ec422d 100644
--- a/src/VeriFuzz/Verilog/Gen.hs
+++ b/src/VeriFuzz/Verilog/Gen.hs
@@ -59,7 +59,7 @@ sumSize ps = sum $ ps ^.. traverse . portSize
random :: [Identifier] -> (Expr -> ContAssign) -> Gen ModItem
random ctx fun = do
- expr <- Hog.sized (exprWithContext ctx)
+ expr <- Hog.sized (exprWithContext (ProbExpr 1 1 1 1 1 1 0 1 1) ctx)
return . ModCA $ fun expr
--randomAssigns :: [Identifier] -> [Gen ModItem]
@@ -86,6 +86,49 @@ randomMod inps total = do
gen :: Gen a -> StateGen a
gen = lift . lift
+constExprWithContext :: [Parameter] -> ProbExpr -> Hog.Size -> Gen ConstExpr
+constExprWithContext ps prob size
+ | size == 0 = Hog.frequency
+ [ (prob ^. probExprNum, ConstNum <$> genPositive <*> arb)
+ , (if null ps then 0 else prob ^. probExprId, ParamId . view paramIdent <$> Hog.element ps)
+ ]
+ | size > 0 = Hog.frequency
+ [ (prob ^. probExprNum, ConstNum <$> genPositive <*> arb)
+ , (if null ps then 0 else prob ^. probExprId, ParamId . view paramIdent <$> Hog.element ps)
+ , (prob ^. probExprUnOp, ConstUnOp <$> arb <*> subexpr 2)
+ , (prob ^. probExprBinOp, ConstBinOp <$> subexpr 2 <*> arb <*> subexpr 2)
+ , (prob ^. probExprCond, ConstCond <$> subexpr 3 <*> subexpr 3 <*> subexpr 3)
+ , (prob ^. probExprConcat, ConstConcat <$> listOf1 (subexpr 8))
+ ]
+ | otherwise = constExprWithContext ps prob 0
+ where subexpr y = constExprWithContext ps prob $ size `div` y
+
+exprSafeList :: ProbExpr -> [(Int, Gen Expr)]
+exprSafeList prob = [(prob ^. probExprNum, Number <$> genPositive <*> Hog.integral (Hog.linearFrom 0 (-100) 100))]
+
+exprRecList :: ProbExpr -> (Hog.Size -> Gen Expr) -> [(Int, Gen Expr)]
+exprRecList prob subexpr =
+ [ (prob ^. probExprNum, Number <$> genPositive <*> Hog.integral (Hog.linearFrom 0 (-100) 100))
+ , (prob ^. probExprConcat, Concat <$> listOf1 (subexpr 8))
+ , (prob ^. probExprUnOp, UnOp <$> arb <*> subexpr 2)
+ , (prob ^. probExprStr, Str <$> Hog.text (Hog.linear 0 100) Hog.alphaNum)
+ , (prob ^. probExprBinOp, BinOp <$> subexpr 2 <*> arb <*> subexpr 2)
+ , (prob ^. probExprCond, Cond <$> subexpr 3 <*> subexpr 3 <*> subexpr 3)
+ , (prob ^. probExprSigned, Func <$> pure SignedFunc <*> subexpr 2)
+ , (prob ^. probExprUnsigned, Func <$> pure UnsignedFunc <*> subexpr 2)
+ ]
+
+exprWithContext :: ProbExpr -> [Identifier] -> Hog.Size -> Gen Expr
+exprWithContext prob [] n | n == 0 = Hog.frequency $ exprSafeList prob
+ | n > 0 = Hog.frequency $ exprRecList prob subexpr
+ | otherwise = exprWithContext prob [] 0
+ where subexpr y = exprWithContext prob [] $ n `div` y
+exprWithContext prob l n
+ | n == 0 = Hog.frequency $ (prob ^. probExprId, Id <$> Hog.element l) : exprSafeList prob
+ | n > 0 = Hog.frequency $ (prob ^. probExprId, Id <$> Hog.element l) : exprRecList prob subexpr
+ | otherwise = exprWithContext prob l 0
+ where subexpr y = exprWithContext prob l $ n `div` y
+
some :: StateGen a -> StateGen [a]
some f = do
amount <- gen genPositive
@@ -116,9 +159,10 @@ choose ptype (Port a _ _ _) = ptype == a
scopedExpr :: StateGen Expr
scopedExpr = do
context <- get
+ prob <- askProbability
gen
. Hog.sized
- . exprWithContext
+ . exprWithContext (prob ^. probExpr)
$ context
^.. variables
. traverse
@@ -193,23 +237,6 @@ initialBlock = do
where
makeAssign p = NonBlockAssign $ Assign (lvalFromPort p) Nothing 0
-constExprWithContext :: [Parameter] -> ProbExpr -> Hog.Size -> Gen ConstExpr
-constExprWithContext ps prob size
- | size == 0 = Hog.frequency
- [ (prob ^. probExprNum, ConstNum <$> genPositive <*> arb)
- , (if null ps then 0 else prob ^. probExprId, ParamId . view paramIdent <$> Hog.element ps)
- ]
- | size > 0 = Hog.frequency
- [ (prob ^. probExprNum, ConstNum <$> genPositive <*> arb)
- , (if null ps then 0 else prob ^. probExprId, ParamId . view paramIdent <$> Hog.element ps)
- , (prob ^. probExprUnOp, ConstUnOp <$> arb <*> subexpr 2)
- , (prob ^. probExprBinOp, ConstBinOp <$> subexpr 2 <*> arb <*> subexpr 2)
- , (prob ^. probExprCond, ConstCond <$> subexpr 3 <*> subexpr 3 <*> subexpr 3)
- , (prob ^. probExprConcat, ConstConcat <$> listOf1 (subexpr 8))
- ]
- | otherwise = constExprWithContext ps prob 0
- where subexpr y = constExprWithContext ps prob $ size `div` y
-
constExpr :: StateGen ConstExpr
constExpr = do
prob <- askProbability