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
16module SockeyeASTTypeChecker
17 ( module SockeyeASTTypeChecker
18 , module SockeyeASTInstantiator
19 ) where
20
21import Data.Map (Map)
22
23import SockeyeASTInstantiator
24    ( NodeType(Core, Device, Memory, Other) )
25
26data SockeyeSpec = SockeyeSpec
27    { root    :: ModuleInst
28    , modules :: Map String Module }
29    deriving (Show)
30
31data Module = Module
32    { paramNames   :: [String]
33    , paramTypeMap :: Map String ModuleParamType
34    , ports        :: [Port]
35    , moduleInsts  :: [ModuleInst]
36    , nodeDecls    :: [NodeDecl]
37    } deriving (Show)
38
39data ModuleParamType
40    = NaturalParam
41    | AddressParam
42    deriving (Eq)
43
44instance Show ModuleParamType where
45    show NaturalParam = "nat"
46    show AddressParam = "addr"
47
48data 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
60data 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
71data ModuleArg
72    = NumericalArg !Integer
73    | ParamArg !String
74    deriving (Show)
75
76data PortMap
77    = PortMap
78        { mappedId   :: Identifier
79        , mappedPort :: Identifier
80        }
81    | MultiPortMap (For PortMap)
82    deriving (Show)
83
84data NodeDecl
85    = NodeDecl
86        { nodeId   :: Identifier
87        , nodeSpec :: NodeSpec
88        }
89    | MultiNodeDecl (For NodeDecl)
90    deriving (Show)
91
92data Identifier
93    = SimpleIdent
94        { prefix  :: !String }
95    | TemplateIdent
96        { prefix  :: !String
97        , varName :: !String
98        , suffix  :: Maybe Identifier
99        }
100    deriving (Show)
101
102data NodeSpec = NodeSpec
103    { nodeType  :: NodeType
104    , accept    :: [BlockSpec]
105    , translate :: [MapSpec]
106    , reserved  :: [BlockSpec]
107    , overlay   :: Maybe OverlaySpec
108    } deriving (Show)
109
110data BlockSpec
111    = SingletonBlock
112        { base :: Address
113        , props :: PropSpec}
114    | RangeBlock
115        { base  :: Address
116        , limit :: Address
117        , props :: PropSpec
118        }
119    | LengthBlock
120        { base :: Address
121        , bits :: !Integer
122        , props :: PropSpec
123        }
124    deriving (Show)
125
126data PropSpec
127    = PropSpec
128      { identifiers :: [String] }
129    deriving(Show)
130
131data MapSpec
132    = MapSpec
133        { block    :: BlockSpec
134        , destNode :: Identifier
135        , destBase :: Maybe Address
136        , destProps :: PropSpec
137        } deriving (Show)
138
139data OverlaySpec
140    = OverlaySpec
141        { over  :: Identifier
142        , width :: !Integer
143        } deriving (Show)
144
145data Address
146    = LiteralAddress !Integer
147    | ParamAddress !String
148    deriving (Show)
149
150data For a
151    = For
152        { varRanges :: Map String ForRange
153        , body      :: a
154        } deriving (Show)
155
156data ForRange
157    = ForRange
158    { start :: ForLimit
159    , end   :: ForLimit
160    } deriving (Show)
161
162data ForLimit
163    = LiteralLimit !Integer
164    | ParamLimit !String
165    deriving (Show)
166