c0cd605da12551524c0d17007d382663b9dae3b2
[barrelfish] / tools / sockeye / SockeyeASTFrontend.hs
1 {-
2     SockeyeASTFrontend.hs: Frontend AST for Sockeye
3
4     Part of Sockeye
5
6     Copyright (c) 2017, 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, Universitaetstr. 6, CH-8092 Zurich,
13     Attn: Systems Group.
14 -}
15
16 module SockeyeASTFrontend where
17
18 data SockeyeSpec = SockeyeSpec
19     { modules :: [Module]
20     , net     :: [NetSpec]
21     } deriving (Show)
22
23 data Module = Module
24     { name       :: String
25     , parameters :: [ModuleParam]
26     , moduleBody :: ModuleBody
27     } deriving (Show)
28
29 data ModuleParam = ModuleParam
30     { paramName :: !String
31     , paramType :: ModuleParamType
32     } deriving (Show)
33
34 data ModuleParamType 
35     = NumberParam
36     | AddressParam
37     deriving (Eq, Show)
38
39 data ModuleBody = ModuleBody
40     { ports     :: [PortDef]
41     , moduleNet :: [NetSpec]
42     } deriving (Show)
43
44 data PortDef
45     = InputPortDef
46         { portId :: Identifier }
47     | OutputPortDef
48         { portId :: Identifier }
49     | MultiPortDef (For PortDef)
50     deriving (Show)
51
52 data NetSpec
53     = NodeDeclSpec NodeDecl
54     | ModuleInstSpec ModuleInst
55     deriving (Show)
56
57 data ModuleInst
58     = ModuleInst
59         { moduleName   :: String
60         , nameSpace    :: Identifier
61         , arguments    :: [ModuleArg]
62         , portMappings :: [PortMap]
63         }
64     | MultiModuleInst (For ModuleInst)
65     deriving (Show)
66
67 data ModuleArg
68     = AddressArg !Word
69     | NumberArg !Word
70     | ParamArg !String
71     deriving (Show)
72
73 data PortMap
74     = InputPortMap
75         { mappedId   :: Identifier
76         , mappedPort :: Identifier
77         }
78     | OutputPortMap
79         { mappedId   :: Identifier
80         , mappedPort :: Identifier
81         }
82     | MultiPortMap (For PortMap)
83     deriving (Show)
84
85 data NodeDecl
86     = NodeDecl
87         { nodeId   :: Identifier
88         , nodeSpec :: NodeSpec
89         }
90     | MultiNodeDecl (For NodeDecl)
91     deriving (Show)
92
93 data Identifier
94     = SimpleIdent !String
95     | TemplateIdent
96         { prefix  :: !String
97         , varName :: !String
98         , suffix  :: Maybe Identifier
99         }
100     deriving (Show)
101
102 data NodeSpec = NodeSpec
103     { nodeType  :: Maybe NodeType
104     , accept    :: [BlockSpec]
105     , translate :: [MapSpec]
106     , overlay   :: Maybe Identifier
107     } deriving (Show)
108
109 data NodeType
110     = Memory
111     | Device
112     deriving (Show)
113
114 data BlockSpec 
115     = SingletonBlock
116         { address :: !Address }
117     | RangeBlock
118         { base  :: !Address
119         , limit :: !Address
120         }
121     | LengthBlock
122         { base :: !Address
123         , bits :: !Word
124         }
125     deriving (Show)
126
127 data MapSpec 
128     = MapSpec
129         { block    :: BlockSpec
130         , destNode :: Identifier
131         , destBase :: Maybe Address
132         } deriving (Show)
133
134 data Address
135     = NumberAddress !Word
136     | ParamAddress !String
137     deriving (Show)
138
139 data For a 
140     = For
141         { varRanges :: [ForVarRange]
142         , body      :: a
143         } deriving (Show)
144
145 data ForVarRange
146     = ForVarRange
147     { var   :: !String
148     , start :: ForLimit
149     , end   :: ForLimit
150     } deriving (Show)
151
152 data ForLimit 
153     = NumberLimit !Word
154     | ParamLimit !String
155     deriving (Show)