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