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