06de7f3185956b7bd8cf17878877e21ce43b4bd7
[barrelfish] / tools / sockeye / SockeyeASTParser.hs
1 {-
2     SockeyeASTParser.hs: AST for the Sockeye parser
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 SockeyeASTParser 
17 ( module SockeyeASTParser
18 , module SockeyeAST
19 ) where
20
21 import SockeyeAST
22     ( Identifier(SimpleIdent, TemplateIdent)
23     , prefix, varName, suffix
24     , ModuleParamType(NaturalParam, AddressParam)
25     , ModuleArg(AddressArg, NaturalArg, ParamArg)
26     , NodeSpec(NodeSpec)
27     , nodeType, accept, translate, overlay
28     , NodeType(Memory, Device)
29     , BlockSpec(SingletonBlock, RangeBlock, LengthBlock)
30     , base, limit, bits
31     , MapSpec(MapSpec)
32     , block, destNode, destBase
33     , Address(LiteralAddress, ParamAddress)
34     , ForLimit(LiteralLimit, ParamLimit)
35     )
36
37 data SockeyeSpec = SockeyeSpec
38     { modules :: [Module]
39     , net     :: [NetSpec]
40     } deriving (Show)
41
42 data Module = Module
43     { name       :: String
44     , parameters :: [ModuleParam]
45     , moduleBody :: ModuleBody
46     } deriving (Show)
47
48 data ModuleParam = ModuleParam
49     { paramName :: !String
50     , paramType :: ModuleParamType
51     } deriving (Show)
52
53 data ModuleBody = ModuleBody
54     { ports     :: [PortDef]
55     , moduleNet :: [NetSpec]
56     } deriving (Show)
57
58 data PortDef
59     = InputPortDef Identifier
60     | OutputPortDef Identifier
61     | MultiPortDef (For PortDef)
62     deriving (Show)
63
64 data NetSpec
65     = NodeDeclSpec NodeDecl
66     | ModuleInstSpec ModuleInst
67     deriving (Show)
68
69 data ModuleInst
70     = ModuleInst
71         { moduleName   :: String
72         , namespace    :: Identifier
73         , arguments    :: [ModuleArg]
74         , portMappings :: [PortMap]
75         }
76     | MultiModuleInst (For ModuleInst)
77     deriving (Show)
78
79 data PortMap
80     = InputPortMap
81         { mappedId   :: Identifier
82         , mappedPort :: Identifier
83         }
84     | OutputPortMap
85         { mappedId   :: Identifier
86         , mappedPort :: Identifier
87         }
88     | MultiPortMap (For PortMap)
89     deriving (Show)
90
91 data NodeDecl
92     = NodeDecl
93         { nodeId   :: Identifier
94         , nodeSpec :: NodeSpec
95         }
96     | MultiNodeDecl (For NodeDecl)
97     deriving (Show)
98
99 data For a 
100     = For
101         { varRanges :: [ForVarRange]
102         , body      :: a
103         } deriving (Show)
104
105 data ForVarRange
106     = ForVarRange
107     { var   :: !String
108     , start :: ForLimit
109     , end   :: ForLimit
110     } deriving (Show)