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