Sockeye: implement reference check inside node declarations
[barrelfish] / tools / sockeye / SockeyeASTInstantiator.hs
1 {-
2   SockeyeASTInstantiator.hs: AST with instantiated modules 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 SockeyeASTInstantiator
17     ( module SockeyeASTInstantiator
18     , module SockeyeASTDecodingNet
19     ) where
20
21 import Data.Map (Map)
22
23 import SockeyeASTDecodingNet
24     ( NodeType(Other, Memory, Device)
25     , BlockSpec(BlockSpec)
26     , base, limit
27     , Address
28     )
29
30 data SockeyeSpec = SockeyeSpec
31     { root :: ModuleInst
32     , modules :: Map Identifier Module
33     } deriving (Show)
34
35 data Module = Module
36     { inputPorts   :: [Port]
37     , outputPorts  :: [Port]
38     , moduleInsts  :: [ModuleInst]
39     , nodeDecls    :: [NodeDecl]
40     } deriving (Show)
41
42 data Port
43     = InputPort 
44         { portId    :: Identifier
45         , portWidth :: !Integer
46         }
47     | OutputPort
48         { portId    :: Identifier
49         , portWidth :: !Integer
50         }
51     deriving (Show)
52
53 data ModuleInst
54     = ModuleInst
55         { namespace  :: Identifier
56         , moduleName :: Identifier
57         , inPortMap  :: PortMap
58         , outPortMap :: PortMap
59         } deriving (Show)
60
61 type PortMap = Map Identifier Identifier
62
63 data NodeDecl
64     = NodeDecl
65         { nodeId   :: Identifier
66         , nodeSpec :: NodeSpec
67         } deriving (Show)
68
69 type Identifier = String
70
71 data NodeSpec = NodeSpec
72     { nodeType  :: NodeType
73     , accept    :: [BlockSpec]
74     , translate :: [MapSpec]
75     , reserved  :: [BlockSpec]
76     , overlay   :: Maybe OverlaySpec
77     } deriving (Show)
78
79 data MapSpec 
80     = MapSpec
81         { srcBlock :: BlockSpec
82         , destNode :: !Identifier
83         , destBase :: !Address
84         } deriving (Show)
85
86 data OverlaySpec
87     = OverlaySpec
88         { over  :: !Identifier
89         , width :: !Integer
90         } deriving (Show)