Sockeye: Checker now checks everything
[barrelfish] / tools / sockeye / SockeyeASTIntermediate.hs
1 {-
2   SockeyeASTIntermediate.hs: Intermediate 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 SockeyeASTIntermediate
17     ( module SockeyeASTIntermediate
18     , module SockeyeASTFrontend
19     ) where
20
21 import Data.Map (Map)
22 import Data.Set (Set)
23
24 import SockeyeASTFrontend
25     ( Identifier(SimpleIdent, TemplateIdent)
26     , prefix, varName, suffix
27     , ModuleParamType(NumberParam, AddressParam)
28     , ModuleArg(AddressArg, NumberArg, ParamArg)
29     , NodeSpec(NodeSpec)
30     , nodeType, accept, translate, overlay
31     , NodeType(Memory, Device)
32     , BlockSpec(SingletonBlock, RangeBlock, LengthBlock)
33     , address, base, limit, bits
34     , MapSpec(MapSpec)
35     , block, destNode, destBase
36     , Address(NumberAddress, ParamAddress)
37     , ForLimit(NumberLimit, ParamLimit)
38     )
39
40 newtype SockeyeSpec = SockeyeSpec
41     { modules :: Map String Module }
42     deriving (Show)
43
44 data Module = Module
45     { paramNames   :: [String]
46     , paramTypeMap :: Map String ModuleParamType
47     , inputPorts   :: [Port]
48     , outputPorts  :: [Port]
49     , nodeDecls    :: [NodeDecl]
50     , moduleInsts  :: [ModuleInst]
51     } deriving (Show)
52
53 data Port
54     = Port Identifier
55     | MultiPort (For Port)
56     deriving (Show)
57
58 data ModuleInst
59     = ModuleInst
60         { nameSpace  :: Identifier
61         , moduleName :: String
62         , arguments  :: Map String ModuleArg
63         , inPortMap  :: [PortMap]
64         , outPortMap :: [PortMap]
65         }
66     | MultiModuleInst (For ModuleInst)
67     deriving (Show)
68
69 data PortMap
70     = PortMap
71         { mappedId   :: Identifier
72         , mappedPort :: Identifier
73         }
74     | MultiPortMap (For PortMap)
75     deriving (Show)
76
77 data NodeDecl
78     = NodeDecl
79         { nodeId   :: Identifier
80         , nodeSpec :: NodeSpec
81         }
82     | MultiNodeDecl (For NodeDecl)
83     deriving (Show)
84
85 data For a 
86     = For
87         { varRanges :: Map String ForRange
88         , body      :: a
89         } deriving (Show)
90
91 data ForRange
92     = ForRange
93     { start :: ForLimit
94     , end   :: ForLimit
95     } deriving (Show)