ee93b29b9f98b0a3bbc209924159ea4a7f1d50e4
[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
60         { portId :: Identifier }
61     | OutputPortDef
62         { portId :: Identifier }
63     | MultiPortDef (For PortDef)
64     deriving (Show)
65
66 data NetSpec
67     = NodeDeclSpec NodeDecl
68     | ModuleInstSpec ModuleInst
69     deriving (Show)
70
71 data ModuleInst
72     = ModuleInst
73         { moduleName   :: String
74         , namespace    :: Identifier
75         , arguments    :: [ModuleArg]
76         , portMappings :: [PortMap]
77         }
78     | MultiModuleInst (For ModuleInst)
79     deriving (Show)
80
81 data PortMap
82     = InputPortMap
83         { mappedId   :: Identifier
84         , mappedPort :: Identifier
85         }
86     | OutputPortMap
87         { mappedId   :: Identifier
88         , mappedPort :: Identifier
89         }
90     | MultiPortMap (For PortMap)
91     deriving (Show)
92
93 data NodeDecl
94     = NodeDecl
95         { nodeId   :: Identifier
96         , nodeSpec :: NodeSpec
97         }
98     | MultiNodeDecl (For NodeDecl)
99     deriving (Show)
100
101 data For a 
102     = For
103         { varRanges :: [ForVarRange]
104         , body      :: a
105         } deriving (Show)
106
107 data ForVarRange
108     = ForVarRange
109     { var   :: !String
110     , start :: ForLimit
111     , end   :: ForLimit
112     } deriving (Show)