1{-
2    SockeyeAST.hs: AST for Sockeye
3
4    Part of Sockeye
5
6    Copyright (c) 2018, ETH Zurich.
7
8    All rights reserved.
9
10    This file is distributed under the terms in the attached LICENSE file.
11    If you do not find this file, copies can be found by writing to:
12    ETH Zurich D-INFK, CAB F.78, Universitaetstrasse 6, CH-8092 Zurich,
13    Attn: Systems Group.
14-}
15
16module SockeyeAST where
17
18import SockeyeASTMeta
19
20{- This transformation should do +/- linking for modules:
21  - Resolve multiple files
22    by using the symbol table to resolve module names
23  - Inserts constants
24  - Returns a list module declartions, no more info about file
25  - Group NodeDeclarations with their Definitions
26-}
27
28{- TODO: This is just a placeholder -}
29data Sockeye = Sockeye
30  deriving (Show)
31
32{- TODO: This is very rough -}
33{-
34data Sockeye = Sockeye {
35    modules :: Map UniqueModuleId ModuleSpec
36  }
37  deriving (Show)
38
39data UniqueModuleId = UniqueModuleId {
40  name :: !String,
41  file :: !String
42}
43
44data ModuleSpec = ModuleSpec
45    { moduleMeta  :: ASTMeta
46    , name :: String
47    , parameters  :: [ModuleParameter]
48    , nodeDecls   :: [NodeDeclaration]
49    , instDecls   :: [QualifiedInstanceDeclaration]
50    , definitions :: [Definition]
51    }
52
53data QualifiedInstanceDeclaration = QualifiedInstanceDeclaration
54  { instDeclMeta :: ASTMeta
55  , instName :: !String
56  , instModName :: !String -- CHANGE ME
57  }
58  -}
59
60
61
62
63{-
64 - From here the data structures are shared with the Parse AST
65 - If they should be different, either change the parser to directly parse them differently
66 - or move them to the ParserAST
67 -}
68data UnqualifiedRef = UnqualifiedRef
69    { refMeta  :: ASTMeta
70    , refName  :: String
71    , refIndex :: Maybe ArrayIndex
72    }
73    deriving (Show)
74
75instance MetaAST UnqualifiedRef where
76    meta = refMeta
77
78data NodeReference
79    = InternalNodeRef
80        { nodeRefMeta :: ASTMeta
81        , nodeRef     :: UnqualifiedRef
82        }
83    | InputPortRef
84        { nodeRefMeta :: ASTMeta
85        , instRef     :: UnqualifiedRef
86        , nodeRef     :: UnqualifiedRef
87        }
88    deriving (Show)
89
90instance MetaAST NodeReference where
91    meta = nodeRefMeta
92
93data ArrayIndex = ArrayIndex ASTMeta [WildcardSet]
94    deriving (Show)
95
96instance MetaAST ArrayIndex where
97    meta (ArrayIndex m _) = m
98
99data Address = Address ASTMeta [WildcardSet]
100    deriving (Show)
101
102instance MetaAST Address where
103    meta (Address m _) = m
104
105data AddressBlock = AddressBlock
106    { addrBlockMeta :: ASTMeta
107    , addresses     :: Address
108    , properties    :: PropertyExpr
109    }
110    deriving (Show)
111
112instance MetaAST AddressBlock where
113    meta = addrBlockMeta
114
115data WildcardSet
116    = ExplicitSet ASTMeta NaturalSet
117    | Wildcard ASTMeta
118    deriving (Show)
119
120instance MetaAST WildcardSet where
121    meta (ExplicitSet m _) = m
122    meta (Wildcard m) = m
123
124data NaturalSet = NaturalSet ASTMeta [NaturalRange]
125    deriving (Show)
126
127instance MetaAST NaturalSet where
128    meta (NaturalSet m _) = m
129
130data NaturalRange
131    = SingletonRange
132        { natRangeMeta :: ASTMeta
133        , base         :: NaturalExpr
134        }
135    | LimitRange
136        { natRangeMeta :: ASTMeta
137        , base         :: NaturalExpr
138        , limit        :: NaturalExpr
139        }
140    | BitsRange
141        { natRangeMeta :: ASTMeta
142        , base         :: NaturalExpr
143        , bits         :: NaturalExpr
144        }
145    deriving (Show)
146
147instance MetaAST NaturalRange where
148    meta = natRangeMeta
149
150data NaturalExpr
151    = Addition
152        { natExprMeta :: ASTMeta
153        , natExprOp1  :: NaturalExpr
154        , natExprOp2  :: NaturalExpr
155        }
156    | Subtraction
157        { natExprMeta :: ASTMeta
158        , natExprOp1  :: NaturalExpr
159        , natExprOp2  :: NaturalExpr
160        }
161    | Multiplication
162        { natExprMeta :: ASTMeta
163        , natExprOp1  :: NaturalExpr
164        , natExprOp2  :: NaturalExpr
165        }
166    | Slice
167        { natExprMeta :: ASTMeta
168        , natExprOp1  :: NaturalExpr
169        , bitRange    :: NaturalRange
170        }
171    | Concat
172        { natExprMeta :: ASTMeta
173        , natExprOp1  :: NaturalExpr
174        , natExprOp2  :: NaturalExpr
175        }
176    | Parameter
177        { natExprMeta :: ASTMeta
178        , varName     :: !String
179        }
180    | Constant
181        { natExprMeta :: ASTMeta
182        , varName     :: !String
183        }
184    | Variable
185        { natExprMeta :: ASTMeta
186        , varName     :: !String
187        }
188    | Literal
189        { natExprMeta :: ASTMeta
190        , natural     :: !Integer
191        }
192    deriving (Show)
193
194instance MetaAST NaturalExpr where
195    meta = natExprMeta
196
197data PropertyExpr
198    = And
199        { propExprMeta :: ASTMeta
200        , propExprOp1  :: PropertyExpr
201        , propExprOp2  :: PropertyExpr
202        }
203    | Or
204        { propExprMeta :: ASTMeta
205        , propExprOp1  :: PropertyExpr
206        , propExprOp2  :: PropertyExpr
207        }
208    | Not
209        { propExprMeta :: ASTMeta
210        , propExprOp1  :: PropertyExpr
211        }
212    | Property
213        { propExprMeta :: ASTMeta
214        , property     :: !String
215        }
216    | True
217    | False
218    deriving (Show)
219
220instance MetaAST PropertyExpr where
221    meta = propExprMeta
222