2b661584866922d221063187997a174ca453632c
[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 SockeyeASTTypeChecker
19 ) where
20
21 import SockeyeASTTypeChecker
22     ( Identifier(SimpleIdent, TemplateIdent)
23     , prefix, varName, suffix
24     , ModuleParamType(NaturalParam, AddressParam)
25     , ModuleArg(AddressArg, NaturalArg, ParamArg)
26     , NodeSpec(NodeSpec)
27     , nodeType, accept, translate, reserved, overlay
28     , NodeType(Other, Memory, Device)
29     , BlockSpec(SingletonBlock, RangeBlock, LengthBlock)
30     , base, limit, bits
31     , MapSpec(MapSpec)
32     , OverlaySpec(OverlaySpec)
33     , over, width
34     , block, destNode, destBase
35     , Address(LiteralAddress, ParamAddress)
36     , ForLimit(LiteralLimit, ParamLimit)
37     )
38
39 data SockeyeSpec = SockeyeSpec
40     { imports :: [Import]
41     , modules :: [Module]
42     , net     :: [NetSpec]
43     } deriving (Show)
44
45 data Import = Import 
46     { filePath :: !FilePath }
47     deriving (Show)
48
49 data Module = Module
50     { name       :: String
51     , parameters :: [ModuleParam]
52     , moduleBody :: ModuleBody
53     } deriving (Show)
54
55 data ModuleParam = ModuleParam
56     { paramName :: !String
57     , paramType :: ModuleParamType
58     } deriving (Show)
59
60 data ModuleBody = ModuleBody
61     { ports     :: [Port]
62     , moduleNet :: [NetSpec]
63     } deriving (Show)
64
65 data NetSpec
66     = ModuleInstSpec ModuleInst
67     | NodeDeclSpec NodeDecl
68     deriving (Show)
69
70 data Port
71     = InputPort 
72         { portId    :: Identifier
73         , portWidth :: !Integer
74         }
75     | OutputPort
76         { portId    :: Identifier
77         , portWidth :: !Integer
78         }
79     | MultiPort (For Port)
80     deriving (Show)
81
82 data ModuleInst
83     = ModuleInst
84         { moduleName   :: String
85         , namespace    :: Identifier
86         , arguments    :: [ModuleArg]
87         , portMappings :: [PortMap]
88         }
89     | MultiModuleInst (For ModuleInst)
90     deriving (Show)
91
92 data PortMap
93     = InputPortMap
94         { mappedId   :: Identifier
95         , mappedPort :: Identifier
96         }
97     | OutputPortMap
98         { mappedId   :: Identifier
99         , mappedPort :: Identifier
100         }
101     | MultiPortMap (For PortMap)
102     deriving (Show)
103
104 data NodeDecl
105     = NodeDecl
106         { nodeId   :: Identifier
107         , nodeSpec :: NodeSpec
108         }
109     | MultiNodeDecl (For NodeDecl)
110     deriving (Show)
111
112 data For a 
113     = For
114         { varRanges :: [ForVarRange]
115         , body      :: a
116         } deriving (Show)
117
118 data ForVarRange
119     = ForVarRange
120     { var   :: !String
121     , start :: ForLimit
122     , end   :: ForLimit
123     } deriving (Show)