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