535ddf318e097897631d5fd853d0cdccd8d040c9
[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     , reserved  :: [BlockSpec]
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 :: !Integer
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 :: !Integer
133         } deriving (Show)
134
135 data Address
136     = LiteralAddress !Integer
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 !Integer
154     | ParamLimit !String
155     deriving (Show)