987e51914a6cb5f88e7bdeefe14c3edf53e56d88
[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)
38
39 instance Show ModuleParamType where
40     show NumberParam = "int"
41     show AddressParam = "addr"
42
43 data ModuleBody = ModuleBody
44     { ports     :: [PortDef]
45     , moduleNet :: [NetSpec]
46     } deriving (Show)
47
48 data PortDef
49     = InputPortDef
50         { portId :: Identifier }
51     | OutputPortDef
52         { portId :: Identifier }
53     | MultiPortDef (For PortDef)
54     deriving (Show)
55
56 data NetSpec
57     = NodeDeclSpec NodeDecl
58     | ModuleInstSpec ModuleInst
59     deriving (Show)
60
61 data ModuleInst
62     = ModuleInst
63         { moduleName   :: String
64         , nameSpace    :: Identifier
65         , arguments    :: [ModuleArg]
66         , portMappings :: [PortMap]
67         }
68     | MultiModuleInst (For ModuleInst)
69     deriving (Show)
70
71 data ModuleArg
72     = AddressArg !Word
73     | NumberArg !Word
74     | ParamArg !String
75     deriving (Show)
76
77 data PortMap
78     = InputPortMap
79         { mappedId   :: Identifier
80         , mappedPort :: Identifier
81         }
82     | OutputPortMap
83         { mappedId   :: Identifier
84         , mappedPort :: Identifier
85         }
86     | MultiPortMap (For PortMap)
87     deriving (Show)
88
89 data NodeDecl
90     = NodeDecl
91         { nodeId   :: Identifier
92         , nodeSpec :: NodeSpec
93         }
94     | MultiNodeDecl (For NodeDecl)
95     deriving (Show)
96
97 data Identifier
98     = SimpleIdent !String
99     | TemplateIdent
100         { prefix  :: !String
101         , varName :: !String
102         , suffix  :: Maybe Identifier
103         }
104     deriving (Show)
105
106 data NodeSpec = NodeSpec
107     { nodeType  :: Maybe NodeType
108     , accept    :: [BlockSpec]
109     , translate :: [MapSpec]
110     , overlay   :: Maybe Identifier
111     } deriving (Show)
112
113 data NodeType
114     = Memory
115     | Device
116     deriving (Show)
117
118 data BlockSpec 
119     = SingletonBlock
120         { address :: !Address }
121     | RangeBlock
122         { base  :: !Address
123         , limit :: !Address
124         }
125     | LengthBlock
126         { base :: !Address
127         , bits :: !Word
128         }
129     deriving (Show)
130
131 data MapSpec 
132     = MapSpec
133         { block    :: BlockSpec
134         , destNode :: Identifier
135         , destBase :: Maybe Address
136         } deriving (Show)
137
138 data Address
139     = NumberAddress !Word
140     | ParamAddress !String
141     deriving (Show)
142
143 data For a 
144     = For
145         { varRanges :: [ForVarRange]
146         , body      :: a
147         } deriving (Show)
148
149 data ForVarRange
150     = ForVarRange
151     { var   :: !String
152     , start :: ForLimit
153     , end   :: ForLimit
154     } deriving (Show)
155
156 data ForLimit 
157     = NumberLimit !Word
158     | ParamLimit !String
159     deriving (Show)