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