aboutsummaryrefslogtreecommitdiffstats
path: root/src/Test/VeriFuzz/VerilogAST.hs
blob: e4d19ec967576c27fa8b093007fa67e2b02f418a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
{-# LANGUAGE TemplateHaskell #-}

module Test.VeriFuzz.VerilogAST where

import           Control.Lens
import           Data.Text    (Text)
import qualified Data.Text    as T

type NetLVal = Text

type Identifier = Text

data Number = Number { _numSize :: Int
                     , _numVal  :: Int
                     } deriving (Show)

data BinaryOperator = BinAnd
                    | BinOr
                    | BinXor
                    deriving (Show)

data UnaryOperator = UnNot
                   | UnMinus
                   deriving (Show)

data Primary = PrimNum Number
             | PrimId Identifier
             deriving (Show)

data Expression = PrimExpr Primary
                | UnPrimExpr { _exprUnOp :: UnaryOperator
                             , _exprPrim :: Primary
                             }
                | OpExpr { _exprLhs   :: Expression
                         , _exprBinOp :: BinaryOperator
                         , _exprRhs   :: Expression
                         }
                | CondExpr { _exprCond  :: Expression
                           , _exprTrue  :: Expression
                           , _exprFalse :: Expression
                           }
                deriving (Show)

data ContAssign = ContAssign { _contAssignNetLVal :: NetLVal
                             , _contAssignExpr    :: Expression
                             } deriving (Show)

data PortDir = Input
             | Output
             | InOut
             deriving (Show)

data Port = Port { _portName :: Identifier
                 , _portDir  :: PortDir
                 } deriving (Show)

type ModuleItem = Text

-- | 'module' module_identifier [list_of_ports] ';' { module_item } 'end_module'
data ModuleDecl = ModuleDecl { _moduleId   :: Identifier
                             , _modPorts   :: [Port]
                             , _moduleItem :: ModuleItem
                             } deriving (Show)

type Description = ModuleDecl

type SourceText = [Description]

makeLenses ''Number
makeLenses ''Expression
makeLenses ''ContAssign
makeLenses ''Port
makeLenses ''ModuleDecl