Sockeye: Start implementing overley to map translation
[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 
45         { portId    :: Identifier
46         , portWidth :: !Word
47         }
48     | OutputPort
49         { portId    :: Identifier
50         , portWidth :: !Word
51         }
52     | MultiPort (For Port)
53     deriving (Show)
54
55 data ModuleInst
56     = ModuleInst
57         { namespace  :: Identifier
58         , moduleName :: String
59         , arguments  :: Map String ModuleArg
60         , inPortMap  :: [PortMap]
61         , outPortMap :: [PortMap]
62         }
63     | MultiModuleInst (For ModuleInst)
64     deriving (Show)
65
66 data ModuleArg
67     = AddressArg !Word
68     | NaturalArg !Word
69     | ParamArg !String
70     deriving (Show)
71
72 data PortMap
73     = PortMap
74         { mappedId   :: Identifier
75         , mappedPort :: Identifier
76         }
77     | MultiPortMap (For PortMap)
78     deriving (Show)
79
80 data NodeDecl
81     = NodeDecl
82         { nodeId   :: Identifier
83         , nodeSpec :: NodeSpec
84         }
85     | MultiNodeDecl (For NodeDecl)
86     deriving (Show)
87
88 data Identifier
89     = SimpleIdent !String
90     | TemplateIdent
91         { prefix  :: !String
92         , varName :: !String
93         , suffix  :: Maybe Identifier
94         }
95     deriving (Show)
96
97 data NodeSpec = NodeSpec
98     { nodeType  :: Maybe NodeType
99     , accept    :: [BlockSpec]
100     , translate :: [MapSpec]
101     , overlay   :: Maybe OverlaySpec
102     } deriving (Show)
103
104 data NodeType
105     = Memory
106     | Device
107     deriving (Show)
108
109 data BlockSpec 
110     = SingletonBlock
111         { base :: Address }
112     | RangeBlock
113         { base  :: Address
114         , limit :: Address
115         }
116     | LengthBlock
117         { base :: Address
118         , bits :: !Word
119         }
120     deriving (Show)
121
122 data MapSpec 
123     = MapSpec
124         { block    :: BlockSpec
125         , destNode :: Identifier
126         , destBase :: Maybe Address
127         } deriving (Show)
128
129 data OverlaySpec
130     = OverlaySpec
131         { over  :: Identifier
132         , width :: !Word
133         } deriving (Show)
134
135 data Address
136     = LiteralAddress !Word
137     | ParamAddress !String
138     deriving (Show)
139
140 data For a 
141     = For
142         { varRanges :: Map String ForRange
143         , body      :: a
144         } deriving (Show)
145
146 data ForRange
147     = ForRange
148     { start :: ForLimit
149     , end   :: ForLimit
150     } deriving (Show)
151
152 data ForLimit 
153     = LiteralLimit !Word
154     | ParamLimit !String
155     deriving (Show)