aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYann Herklotz <git@ymhg.org>2019-03-30 23:02:28 +0000
committerYann Herklotz <git@ymhg.org>2019-03-30 23:02:28 +0000
commitc0be2c6fe39902af0cf61a14936547fc780d3f6c (patch)
tree3f3041cf8f428925bd6b4a8c677978c193d91850 /src
parent1b8b924ef24063e81c282387193d3a5e8dfada3e (diff)
downloadverismith-c0be2c6fe39902af0cf61a14936547fc780d3f6c.tar.gz
verismith-c0be2c6fe39902af0cf61a14936547fc780d3f6c.zip
Add documentation
Diffstat (limited to 'src')
-rw-r--r--src/VeriFuzz/Gen.hs38
1 files 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