905162a9a3381f934358b215ee263104b7bf4dc4
[barrelfish] / tools / sockeye / SockeyeASTTypeChecker.hs
1 {-
2   SockeyeASTTypeChecker.hs: Type checked 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 SockeyeASTTypeChecker
17  ( module SockeyeASTTypeChecker
18  , module SockeyeASTInstantiator
19  ) where
20
21 import Data.Map (Map)
22
23 import SockeyeASTInstantiator
24     ( NodeType(Other, Device, Memory) )
25
26 data SockeyeSpec = SockeyeSpec
27     { root    :: ModuleInst
28     , modules :: Map String Module }
29     deriving (Show)
30
31 data Module = Module
32     { paramNames   :: [String]
33     , paramTypeMap :: Map String ModuleParamType
34     , ports        :: [Port]
35     , moduleInsts  :: [ModuleInst]
36     , nodeDecls    :: [NodeDecl]
37     } deriving (Show)
38
39 data ModuleParamType 
40     = NaturalParam
41     | AddressParam
42     deriving (Eq)
43
44 instance Show ModuleParamType where
45     show NaturalParam = "nat"
46     show AddressParam = "addr"
47
48 data Port
49     = InputPort 
50         { portId    :: Identifier
51         , portWidth :: !Integer
52         }
53     | OutputPort
54         { portId    :: Identifier
55         , portWidth :: !Integer
56         }
57     | MultiPort (For Port)
58     deriving (Show)
59
60 data ModuleInst
61     = ModuleInst
62         { namespace  :: Maybe Identifier
63         , moduleName :: String
64         , arguments  :: Map String ModuleArg
65         , inPortMap  :: [PortMap]
66         , outPortMap :: [PortMap]
67         }
68     | MultiModuleInst (For ModuleInst)
69     deriving (Show)
70
71 data ModuleArg
72     = AddressArg !Integer
73     | NaturalArg !Integer
74     | ParamArg !String
75     deriving (Show)
76
77 data PortMap
78     = PortMap
79         { mappedId   :: Identifier
80         , mappedPort :: Identifier
81         }
82     | MultiPortMap (For PortMap)
83     deriving (Show)
84
85 data NodeDecl
86     = NodeDecl
87         { nodeId   :: Identifier
88         , nodeSpec :: NodeSpec
89         }
90     | MultiNodeDecl (For NodeDecl)
91     deriving (Show)
92
93 data Identifier
94     = SimpleIdent 
95         { prefix  :: !String }
96     | TemplateIdent
97         { prefix  :: !String
98         , varName :: !String
99         , suffix  :: Maybe Identifier
100         }
101     deriving (Show)
102
103 data NodeSpec = NodeSpec
104     { nodeType  :: NodeType
105     , accept    :: [BlockSpec]
106     , translate :: [MapSpec]
107     , reserved  :: [BlockSpec]
108     , overlay   :: Maybe OverlaySpec
109     } deriving (Show)
110
111 data BlockSpec 
112     = SingletonBlock
113         { base :: Address }
114     | RangeBlock
115         { base  :: Address
116         , limit :: Address
117         }
118     | LengthBlock
119         { base :: Address
120         , bits :: !Integer
121         }
122     deriving (Show)
123
124 data MapSpec 
125     = MapSpec
126         { block    :: BlockSpec
127         , destNode :: Identifier
128         , destBase :: Maybe Address
129         } deriving (Show)
130
131 data OverlaySpec
132     = OverlaySpec
133         { over  :: Identifier
134         , width :: !Integer
135         } deriving (Show)
136
137 data Address
138     = LiteralAddress !Integer
139     | ParamAddress !String
140     deriving (Show)
141
142 data For a 
143     = For
144         { varRanges :: Map String ForRange
145         , body      :: a
146         } deriving (Show)
147
148 data ForRange
149     = ForRange
150     { start :: ForLimit
151     , end   :: ForLimit
152     } deriving (Show)
153
154 data ForLimit 
155     = LiteralLimit !Integer
156     | ParamLimit !String
157     deriving (Show)