Sockeye: clean up
[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 !String
89     | TemplateIdent
90         { prefix  :: !String
91         , varName :: !String
92         , suffix  :: Maybe Identifier
93         }
94     deriving (Show)
95
96 data NodeSpec = NodeSpec
97     { nodeType  :: Maybe NodeType
98     , accept    :: [BlockSpec]
99     , translate :: [MapSpec]
100     , overlay   :: Maybe OverlaySpec
101     } deriving (Show)
102
103 data NodeType
104     = Memory
105     | Device
106     deriving (Show)
107
108 data BlockSpec 
109     = SingletonBlock
110         { base :: Address }
111     | RangeBlock
112         { base  :: Address
113         , limit :: Address
114         }
115     | LengthBlock
116         { base :: Address
117         , bits :: !Integer
118         }
119     deriving (Show)
120
121 data MapSpec 
122     = MapSpec
123         { block    :: BlockSpec
124         , destNode :: Identifier
125         , destBase :: Maybe Address
126         } deriving (Show)
127
128 data OverlaySpec
129     = OverlaySpec
130         { over  :: Identifier
131         , width :: !Integer
132         } deriving (Show)
133
134 data Address
135     = LiteralAddress !Integer
136     | ParamAddress !String
137     deriving (Show)
138
139 data For a 
140     = For
141         { varRanges :: Map String ForRange
142         , body      :: a
143         } deriving (Show)
144
145 data ForRange
146     = ForRange
147     { start :: ForLimit
148     , end   :: ForLimit
149     } deriving (Show)
150
151 data ForLimit 
152     = LiteralLimit !Integer
153     | ParamLimit !String
154     deriving (Show)