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