aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYann Herklotz Grave <git@yannherklotzgrave.com>2019-03-06 18:31:29 +0000
committerYann Herklotz Grave <git@yannherklotzgrave.com>2019-03-06 18:31:42 +0000
commit79c53b7f034091364079c2718705408a112a687b (patch)
treec5a986a8cbe78fed6ca353bf0b5bdfc995c43be4
parent97693128e2d09cce93fb284a0ae56d094ca75e92 (diff)
downloadverismith-79c53b7f034091364079c2718705408a112a687b.tar.gz
verismith-79c53b7f034091364079c2718705408a112a687b.zip
Add always blocks to the main generation
-rw-r--r--src/VeriFuzz/Gen.hs51
1 files changed, 44 insertions, 7 deletions
diff --git a/src/VeriFuzz/Gen.hs b/src/VeriFuzz/Gen.hs
index f8773ca..2225f34 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
@@ -42,7 +43,7 @@ newtype Context = Context { _variables :: [Port]
makeLenses ''Context
-type StateGen = StateT Context (ReaderT Probability Gen)
+type StateGen = StateT Context (ReaderT Config Gen)
toId :: Int -> Identifier
toId = Identifier . ("w" <>) . T.pack . show
@@ -112,8 +113,46 @@ proceduralContAssign = do
. portName
)
+lvalFromPort :: Port -> LVal
+lvalFromPort (Port _ _ _ i) = RegId i
+
+proceduralReg :: StateGen LVal
+proceduralReg = do
+ context <- get
+ gen
+ . QC.elements
+ . fmap lvalFromPort
+ . filter (\p -> p ^. portType == Reg)
+ $ context
+ ^. variables
+
+probability :: Config -> Probability
+probability c = c ^. configProbability
+
+askProbability :: StateT Context (ReaderT Config Gen) Probability
+askProbability = lift $ asks probability
+
+proceduralStatement :: StateGen Statement
+proceduralStatement = do
+ prob <- askProbability
+ gen $ QC.frequency
+ [ (prob ^. probBlock , BlockAssign <$> QC.arbitrary)
+ , (prob ^. probNonBlock, NonBlockAssign <$> QC.arbitrary)
+ ]
+
proceduralModItem :: StateGen ModItem
-proceduralModItem = ModCA <$> proceduralContAssign
+proceduralModItem = do
+ prob <- askProbability
+ amount <- gen positiveArb
+ statement <- fold <$> replicateM amount proceduralStatement
+ event <- gen QC.arbitrary
+ modCA <- ModCA <$> proceduralContAssign
+ gen $ QC.frequency
+ [ (prob ^. probAssign, return modCA)
+ , ( prob ^. probAlways
+ , return $ Always (EventCtrl event (Just statement))
+ )
+ ]
proceduralPorts :: StateGen [Port]
proceduralPorts = do
@@ -135,12 +174,10 @@ proceduralMod top = do
yport
mi
-procedural :: Gen VerilogSrc
-procedural =
+procedural :: Config -> Gen VerilogSrc
+procedural config =
VerilogSrc
. (: [])
. Description
<$> runReaderT (evalStateT (proceduralMod True) context) config
- where
- config = Probability 1 1
- context = Context []
+ where context = Context []