Sockeye: Implement module instantiator
[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, 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
46 data Import = Import 
47     { filePath :: !FilePath }
48     deriving (Show)
49
50 data Module = Module
51     { name       :: String
52     , parameters :: [ModuleParam]
53     , moduleBody :: ModuleBody
54     } deriving (Show)
55
56 data ModuleParam = ModuleParam
57     { paramName :: !String
58     , paramType :: ModuleParamType
59     } deriving (Show)
60
61 data ModuleBody = ModuleBody
62     { ports     :: [PortDef]
63     , moduleNet :: [NetSpec]
64     } deriving (Show)
65
66 data PortDef
67     = InputPortDef
68         { portId    :: Identifier
69         , portWidth :: !Integer
70         }
71     | OutputPortDef
72         { portId    :: Identifier
73         , portWidth :: !Integer
74         }
75     | MultiPortDef (For PortDef)
76     deriving (Show)
77
78 data NetSpec
79     = NodeDeclSpec NodeDecl
80     | ModuleInstSpec ModuleInst
81     deriving (Show)
82
83 data ModuleInst
84     = ModuleInst
85         { moduleName   :: String
86         , namespace    :: Identifier
87         , arguments    :: [ModuleArg]
88         , portMappings :: [PortMap]
89         }
90     | MultiModuleInst (For ModuleInst)
91     deriving (Show)
92
93 data PortMap
94     = InputPortMap
95         { mappedId   :: Identifier
96         , mappedPort :: Identifier
97         }
98     | OutputPortMap
99         { mappedId   :: Identifier
100         , mappedPort :: Identifier
101         }
102     | MultiPortMap (For PortMap)
103     deriving (Show)
104
105 data NodeDecl
106     = NodeDecl
107         { nodeId   :: Identifier
108         , nodeSpec :: NodeSpec
109         }
110     | MultiNodeDecl (For NodeDecl)
111     deriving (Show)
112
113 data For a 
114     = For
115         { varRanges :: [ForVarRange]
116         , body      :: a
117         } deriving (Show)
118
119 data ForVarRange
120     = ForVarRange
121     { var   :: !String
122     , start :: ForLimit
123     , end   :: ForLimit
124     } deriving (Show)