4856eb20a85902be298a7e71d3470750cad5afdd
[barrelfish] / tools / sockeye / SockeyeAST.hs
1 {-
2   SockeyeAST.hs: AST for Sockeye
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 SockeyeAST where
17
18 import Data.Map (Map)
19
20 newtype SockeyeSpec = SockeyeSpec
21     { modules :: Map String Module }
22     deriving (Show)
23
24 data Module = Module
25     { paramNames   :: [String]
26     , paramTypeMap :: Map String ModuleParamType
27     , inputPorts   :: [Port]
28     , outputPorts  :: [Port]
29     , nodeDecls    :: [NodeDecl]
30     , moduleInsts  :: [ModuleInst]
31     } deriving (Show)
32
33 data ModuleParamType 
34     = NaturalParam
35     | AddressParam
36     deriving (Eq)
37
38 instance Show ModuleParamType where
39     show NaturalParam = "nat"
40     show AddressParam = "addr"
41
42 data Port
43     = InputPort 
44         { portId    :: Identifier
45         , portWidth :: !Integer
46         }
47     | OutputPort
48         { portId    :: Identifier
49         , portWidth :: !Integer
50         }
51     | MultiPort (For Port)
52     deriving (Show)
53
54 data ModuleInst
55     = ModuleInst
56         { namespace  :: Identifier
57         , moduleName :: String
58         , arguments  :: Map String ModuleArg
59         , inPortMap  :: [PortMap]
60         , outPortMap :: [PortMap]
61         }
62     | MultiModuleInst (For ModuleInst)
63     deriving (Show)
64
65 data ModuleArg
66     = AddressArg !Integer
67     | NaturalArg !Integer
68     | ParamArg !String
69     deriving (Show)
70
71 data PortMap
72     = PortMap
73         { mappedId   :: Identifier
74         , mappedPort :: Identifier
75         }
76     | MultiPortMap (For PortMap)
77     deriving (Show)
78
79 data NodeDecl
80     = NodeDecl
81         { nodeId   :: Identifier
82         , nodeSpec :: NodeSpec
83         }
84     | MultiNodeDecl (For NodeDecl)
85     deriving (Show)
86
87 data Identifier
88     = SimpleIdent 
89         { prefix  :: !String }
90     | TemplateIdent
91         { prefix  :: !String
92         , varName :: !String
93         , suffix  :: Maybe Identifier
94         }
95     deriving (Show)
96
97 data NodeSpec = NodeSpec
98     { nodeType  :: NodeType
99     , accept    :: [BlockSpec]
100     , translate :: [MapSpec]
101     , reserved  :: [BlockSpec]
102     , overlay   :: Maybe OverlaySpec
103     } deriving (Show)
104
105 data NodeType
106     = Memory
107     | Device
108     | Other
109     deriving (Show)
110
111 data BlockSpec 
112     = SingletonBlock
113         { base :: Address }
114     | RangeBlock
115         { base  :: Address
116         , limit :: Address
117         }
118     | LengthBlock
119         { base :: Address
120         , bits :: !Integer
121         }
122     deriving (Show)
123
124 data MapSpec 
125     = MapSpec
126         { block    :: BlockSpec
127         , destNode :: Identifier
128         , destBase :: Maybe Address
129         } deriving (Show)
130
131 data OverlaySpec
132     = OverlaySpec
133         { over  :: Identifier
134         , width :: !Integer
135         } deriving (Show)
136
137 data Address
138     = LiteralAddress !Integer
139     | ParamAddress !String
140     deriving (Show)
141
142 data For a 
143     = For
144         { varRanges :: Map String ForRange
145         , body      :: a
146         } deriving (Show)
147
148 data ForRange
149     = ForRange
150     { start :: ForLimit
151     , end   :: ForLimit
152     } deriving (Show)
153
154 data ForLimit 
155     = LiteralLimit !Integer
156     | ParamLimit !String
157     deriving (Show)