aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2018-12-27 10:37:43 +0100
committerYann Herklotz <ymherklotz@gmail.com>2018-12-27 10:37:43 +0100
commitda918a74783557820d0262482f1df8b3fe2e7708 (patch)
tree0cc7aaebc52b99508a920cd35d063ee136ac941d /src
parent957796ae792505626423023ba7e41efb37446d1a (diff)
downloadverismith-da918a74783557820d0262482f1df8b3fe2e7708.tar.gz
verismith-da918a74783557820d0262482f1df8b3fe2e7708.zip
Improve expression and statement generation
Diffstat (limited to 'src')
-rw-r--r--src/Test/VeriFuzz/VerilogAST.hs116
1 files changed, 96 insertions, 20 deletions
diff --git a/src/Test/VeriFuzz/VerilogAST.hs b/src/Test/VeriFuzz/VerilogAST.hs
index 3d48843..dace0eb 100644
--- a/src/Test/VeriFuzz/VerilogAST.hs
+++ b/src/Test/VeriFuzz/VerilogAST.hs
@@ -169,7 +169,7 @@ data Statement = TimeCtrl { _statDelay :: Delay
| SeqBlock { _statements :: [Statement] } -- ^ Sequential block (@begin ... end@)
| BlockAssign Assign -- ^ blocking assignment (@=@)
| NonBlockAssign Assign -- ^ Non blocking assignment (@<=@)
- | StatCA ContAssign -- ^ Statement continuous assignment
+ | StatCA ContAssign -- ^ Statement continuous assignment. May not be correct.
| TaskEnable Task
| SysTaskEnable Task
deriving (Show, Eq, Ord)
@@ -205,6 +205,55 @@ newtype SourceText = SourceText { _getSourceText :: [Description] }
-- Generate Arbitrary instances for the AST
+expr :: Int -> QC.Gen Expression
+expr 0 = QC.oneof
+ [ PrimExpr <$> QC.arbitrary
+ , UnPrimExpr <$> QC.arbitrary <*> QC.arbitrary
+ -- , ExprStr <$> QC.arbitrary
+ ]
+expr n
+ | n > 0 = QC.oneof
+ [ PrimExpr <$> QC.arbitrary
+ , UnPrimExpr <$> QC.arbitrary <*> QC.arbitrary
+ -- , ExprStr <$> QC.arbitrary
+ , OpExpr <$> subexpr 2 <*> QC.arbitrary <*> subexpr 2
+ , CondExpr <$> subexpr 3 <*> subexpr 3 <*> subexpr 3
+ ]
+ | otherwise = expr 0
+ where
+ subexpr y = expr (n `div` y)
+
+statement :: Int -> QC.Gen Statement
+statement 0 = QC.oneof
+ [ BlockAssign <$> QC.arbitrary
+ , NonBlockAssign <$> QC.arbitrary
+ -- , StatCA <$> QC.arbitrary
+ , TaskEnable <$> QC.arbitrary
+ , SysTaskEnable <$> QC.arbitrary
+ ]
+statement n
+ | n > 0 = QC.oneof
+ [ TimeCtrl <$> QC.arbitrary <*> (Just <$> substat 2)
+ , SeqBlock <$> QC.listOf1 (substat 4)
+ , BlockAssign <$> QC.arbitrary
+ , NonBlockAssign <$> QC.arbitrary
+ -- , StatCA <$> QC.arbitrary
+ , TaskEnable <$> QC.arbitrary
+ , SysTaskEnable <$> QC.arbitrary
+ ]
+ | otherwise = statement 0
+ where
+ substat y = statement (n `div` y)
+
+modPortGen :: QC.Gen Port
+modPortGen = QC.oneof
+ [ Port (Just Input) Nothing <$> QC.arbitrary
+ , Port (Just Output) <$> (Just . Reg <$> QC.arbitrary) <*> QC.arbitrary
+ ]
+
+instance QC.Arbitrary Text where
+ arbitrary = T.pack <$> QC.arbitrary
+
instance QC.Arbitrary Identifier where
arbitrary = Identifier . T.pack <$>
(QC.shuffle (['a'..'z'] <> ['A'..'Z']) >>= QC.sublistOf)
@@ -213,13 +262,50 @@ instance QC.Arbitrary Number where
arbitrary = Number <$> QC.suchThat QC.arbitrary (>0) <*> QC.arbitrary
instance QC.Arbitrary Net where
- arbitrary = QC.elements [Wire, Tri]
+ arbitrary = pure Wire
instance QC.Arbitrary BinaryOperator where
- arbitrary = QC.elements [BinAnd, BinOr, BinXor]
+ arbitrary = QC.elements
+ [ BinPlus
+ , BinMinus
+ , BinTimes
+ , BinDiv
+ , BinMod
+ , BinEq
+ , BinNEq
+ , BinCEq
+ , BinCNEq
+ , BinLAnd
+ , BinLOr
+ , BinLT
+ , BinLEq
+ , BinGT
+ , BinGEq
+ , BinAnd
+ , BinOr
+ , BinXor
+ , BinXNor
+ , BinXNorInv
+ , BinPower
+ , BinLSL
+ , BinLSR
+ , BinASL
+ , BinASR
+ ]
instance QC.Arbitrary UnaryOperator where
- arbitrary = QC.elements [UnNot, UnMinus]
+ arbitrary = QC.elements
+ [ UnPlus
+ , UnMinus
+ , UnNot
+ , UnAnd
+ , UnNand
+ , UnOr
+ , UnNor
+ , UnXor
+ , UnNxor
+ , UnNxorInv
+ ]
instance QC.Arbitrary Primary where
arbitrary = PrimNum <$> QC.arbitrary
@@ -231,10 +317,10 @@ instance QC.Arbitrary PortType where
arbitrary = QC.oneof [PortNet <$> QC.arbitrary, Reg <$> QC.arbitrary]
instance QC.Arbitrary Port where
- arbitrary = Port <$> QC.arbitrary <*> QC.arbitrary <*> QC.arbitrary
+ arbitrary = Port Nothing <$> QC.arbitrary <*> QC.arbitrary
instance QC.Arbitrary Delay where
- arbitrary = Delay <$> QC.arbitrary
+ arbitrary = Delay <$> QC.suchThat QC.arbitrary (\x -> x > 0)
instance QC.Arbitrary Event where
arbitrary = EId <$> QC.arbitrary
@@ -255,20 +341,10 @@ instance QC.Arbitrary Assign where
arbitrary = Assign <$> QC.arbitrary <*> QC.arbitrary <*> QC.arbitrary
instance QC.Arbitrary Expression where
- arbitrary = QC.frequency [ (1, OpExpr <$> QC.arbitrary <*> QC.arbitrary <*> QC.arbitrary)
- , (2, PrimExpr <$> QC.arbitrary)
- ]
+ arbitrary = QC.sized expr
instance QC.Arbitrary Statement where
- arbitrary = QC.oneof [ TimeCtrl <$> QC.arbitrary <*> QC.arbitrary
- , EventCtrl <$> QC.arbitrary <*> QC.arbitrary
- , SeqBlock <$> QC.arbitrary
- , BlockAssign <$> QC.arbitrary
- , NonBlockAssign <$> QC.arbitrary
- , StatCA <$> QC.arbitrary
- , TaskEnable <$> QC.arbitrary
- , SysTaskEnable <$> QC.arbitrary
- ]
+ arbitrary = QC.sized statement
instance QC.Arbitrary ContAssign where
arbitrary = ContAssign <$> QC.arbitrary <*> QC.arbitrary
@@ -280,12 +356,12 @@ instance QC.Arbitrary ModItem where
arbitrary = QC.oneof [ ModCA <$> QC.arbitrary
, ModInst <$> QC.arbitrary <*> QC.arbitrary <*> QC.arbitrary
, Initial <$> QC.arbitrary
- , Always <$> QC.arbitrary
+ , Always <$> (EventCtrl <$> QC.arbitrary <*> QC.arbitrary)
, Decl <$> QC.arbitrary
]
instance QC.Arbitrary ModDecl where
- arbitrary = ModDecl <$> QC.arbitrary <*> QC.arbitrary <*> QC.arbitrary
+ arbitrary = ModDecl <$> QC.arbitrary <*> QC.listOf1 modPortGen <*> QC.arbitrary
instance QC.Arbitrary Description where
arbitrary = Description <$> QC.arbitrary