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