aboutsummaryrefslogtreecommitdiffstats
path: root/src/VeriFuzz/Verilog/AST.hs
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2019-02-01 13:04:11 +0000
committerYann Herklotz <ymherklotz@gmail.com>2019-02-01 13:04:11 +0000
commit4964c632a434a0b41f645c45223ee12f2bdac80e (patch)
tree4ee82039c44642f542872308ce994b25e1a607f7 /src/VeriFuzz/Verilog/AST.hs
parent6920285fd26ad50513f9b867a5bd25b8b14c2116 (diff)
downloadverismith-4964c632a434a0b41f645c45223ee12f2bdac80e.tar.gz
verismith-4964c632a434a0b41f645c45223ee12f2bdac80e.zip
[Fix #27] Add function to Expr and add Generation type
Diffstat (limited to 'src/VeriFuzz/Verilog/AST.hs')
-rw-r--r--src/VeriFuzz/Verilog/AST.hs58
1 files changed, 37 insertions, 21 deletions
diff --git a/src/VeriFuzz/Verilog/AST.hs b/src/VeriFuzz/Verilog/AST.hs
index b02da1b..2d4971d 100644
--- a/src/VeriFuzz/Verilog/AST.hs
+++ b/src/VeriFuzz/Verilog/AST.hs
@@ -65,10 +65,13 @@ module VeriFuzz.Verilog.AST
, exprCond
, exprTrue
, exprFalse
+ , exprFunc
+ , exprBody
, exprStr
, traverseExpr
, ConstExpr(..)
, constNum
+ , Function (..)
-- * Assignment
, Assign(..)
, assignReg
@@ -124,7 +127,7 @@ positiveArb = QC.suchThat QC.arbitrary (> 0)
-- be lowercase and uppercase for now. This might change in the future though,
-- as Verilog supports many more characters in Identifiers.
newtype Identifier = Identifier { _getIdentifier :: Text }
- deriving (Eq, Show, IsString, Semigroup, Monoid)
+ deriving (Eq, IsString, Semigroup, Monoid)
makeLenses ''Identifier
@@ -135,7 +138,7 @@ instance QC.Arbitrary Identifier where
-- | Verilog syntax for adding a delay, which is represented as @#num@.
newtype Delay = Delay { _getDelay :: Int }
- deriving (Eq, Show, Num)
+ deriving (Eq, Num)
makeLenses ''Delay
@@ -148,7 +151,7 @@ data Event = EId Identifier
| EAll
| EPosEdge Identifier
| ENegEdge Identifier
- deriving (Eq, Show)
+ deriving (Eq)
instance QC.Arbitrary Event where
arbitrary = EId <$> QC.arbitrary
@@ -179,7 +182,7 @@ data BinaryOperator = BinPlus -- ^ @+@
| BinLSR -- ^ @>>@
| BinASL -- ^ @<<<@
| BinASR -- ^ @>>>@
- deriving (Eq, Show)
+ deriving (Eq)
instance QC.Arbitrary BinaryOperator where
arbitrary = QC.elements
@@ -221,7 +224,7 @@ data UnaryOperator = UnPlus -- ^ @+@
| UnXor -- ^ @^@
| UnNxor -- ^ @~^@
| UnNxorInv -- ^ @^~@
- deriving (Eq, Show)
+ deriving (Eq)
instance QC.Arbitrary UnaryOperator where
arbitrary = QC.elements
@@ -237,6 +240,16 @@ instance QC.Arbitrary UnaryOperator where
, UnNxorInv
]
+data Function = SignedFunc
+ | UnSignedFunc
+ deriving (Eq)
+
+instance QC.Arbitrary Function where
+ arbitrary = QC.elements
+ [ SignedFunc
+ , UnSignedFunc
+ ]
+
-- | Verilog expression, which can either be a primary expression, unary
-- expression, binary operator expression or a conditional expression.
data Expr = Number { _exprSize :: Int
@@ -255,8 +268,11 @@ data Expr = Number { _exprSize :: Int
, _exprTrue :: Expr
, _exprFalse :: Expr
}
+ | Func { _exprFunc :: Function
+ , _exprBody :: Expr
+ }
| Str { _exprStr :: Text }
- deriving (Eq, Show)
+ deriving (Eq)
instance Num Expr where
a + b = BinOp a BinPlus b
@@ -284,7 +300,6 @@ expr n
| n == 0 = QC.oneof
[ Id <$> QC.arbitrary
, Number <$> positiveArb <*> QC.arbitrary
- , UnOp <$> QC.arbitrary <*> QC.arbitrary
-- , Str <$> QC.arbitrary
]
| n > 0 = QC.oneof
@@ -297,6 +312,7 @@ expr n
-- , Str <$> QC.arbitrary
, BinOp <$> subexpr 2 <*> QC.arbitrary <*> subexpr 2
, Cond <$> subexpr 3 <*> subexpr 3 <*> subexpr 3
+ , Func <$> QC.arbitrary <*> subexpr 2
]
| otherwise = expr 0
where subexpr y = expr (n `div` y)
@@ -315,13 +331,13 @@ makeLenses ''Expr
-- | Constant expression, which are known before simulation at compilation time.
newtype ConstExpr = ConstExpr { _constNum :: Int }
- deriving (Eq, Show, Num, QC.Arbitrary)
+ deriving (Eq, Num, QC.Arbitrary)
makeLenses ''ConstExpr
data Task = Task { _taskName :: Identifier
, _taskExpr :: [Expr]
- } deriving (Eq, Show)
+ } deriving (Eq)
makeLenses ''Task
@@ -343,7 +359,7 @@ data LVal = RegId { _regId :: Identifier}
, _regSizeLSB :: ConstExpr
}
| RegConcat { _regConc :: [Expr] }
- deriving (Eq, Show)
+ deriving (Eq)
makeLenses ''LVal
@@ -360,7 +376,7 @@ instance IsString LVal where
data PortDir = PortIn -- ^ Input direction for port (@input@).
| PortOut -- ^ Output direction for port (@output@).
| PortInOut -- ^ Inout direction for port (@inout@).
- deriving (Eq, Show)
+ deriving (Eq)
instance QC.Arbitrary PortDir where
arbitrary = QC.elements [PortIn, PortOut, PortInOut]
@@ -369,7 +385,7 @@ instance QC.Arbitrary PortDir where
-- not that common and not a priority.
data PortType = Wire
| Reg { _regSigned :: Bool }
- deriving (Eq, Show)
+ deriving (Eq)
instance QC.Arbitrary PortType where
arbitrary = QC.oneof [pure Wire, Reg <$> QC.arbitrary]
@@ -387,7 +403,7 @@ makeLenses ''PortType
data Port = Port { _portType :: PortType
, _portSize :: Int
, _portName :: Identifier
- } deriving (Eq, Show)
+ } deriving (Eq)
makeLenses ''Port
@@ -404,7 +420,7 @@ data ModConn = ModConn { _modConn :: Expr }
| ModConnNamed { _modConnName :: Identifier
, _modExpr :: Expr
}
- deriving (Eq, Show)
+ deriving (Eq)
makeLenses ''ModConn
@@ -414,7 +430,7 @@ instance QC.Arbitrary ModConn where
data Assign = Assign { _assignReg :: LVal
, _assignDelay :: Maybe Delay
, _assignExpr :: Expr
- } deriving (Eq, Show)
+ } deriving (Eq)
makeLenses ''Assign
@@ -423,7 +439,7 @@ instance QC.Arbitrary Assign where
data ContAssign = ContAssign { _contAssignNetLVal :: Identifier
, _contAssignExpr :: Expr
- } deriving (Eq, Show)
+ } deriving (Eq)
makeLenses ''ContAssign
@@ -443,7 +459,7 @@ data Stmnt = TimeCtrl { _statDelay :: Delay
| StatCA { _stmntCA :: ContAssign } -- ^ Stmnt continuous assignment. May not be correct.
| TaskEnable { _stmntTask :: Task}
| SysTaskEnable { _stmntSysTask :: Task}
- deriving (Eq, Show)
+ deriving (Eq)
makeLenses ''Stmnt
@@ -491,7 +507,7 @@ data ModItem = ModCA ContAssign
| Decl { _declDir :: Maybe PortDir
, _declPort :: Port
}
- deriving (Eq, Show)
+ deriving (Eq)
makeLenses ''ModItem
makePrisms ''ModItem
@@ -509,7 +525,7 @@ data ModDecl = ModDecl { _modId :: Identifier
, _modOutPorts :: [Port]
, _modInPorts :: [Port]
, _modItems :: [ModItem]
- } deriving (Eq, Show)
+ } deriving (Eq)
makeLenses ''ModDecl
@@ -524,12 +540,12 @@ instance QC.Arbitrary ModDecl where
-- | Description of the Verilog module.
newtype Description = Description { _getDescription :: ModDecl }
- deriving (Eq, Show, QC.Arbitrary)
+ deriving (Eq, QC.Arbitrary)
makeLenses ''Description
-- | The complete sourcetext for the Verilog module.
newtype VerilogSrc = VerilogSrc { _getVerilogSrc :: [Description] }
- deriving (Eq, Show, QC.Arbitrary, Semigroup, Monoid)
+ deriving (Eq, QC.Arbitrary, Semigroup, Monoid)
makeLenses ''VerilogSrc