1{- 2 SockeyeAST.hs: AST for Sockeye 3 4 Part of Sockeye 5 6 Copyright (c) 2018, 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, Universitaetstrasse 6, CH-8092 Zurich, 13 Attn: Systems Group. 14-} 15 16module SockeyeAST where 17 18import SockeyeASTMeta 19 20{- This transformation should do +/- linking for modules: 21 - Resolve multiple files 22 by using the symbol table to resolve module names 23 - Inserts constants 24 - Returns a list module declartions, no more info about file 25 - Group NodeDeclarations with their Definitions 26-} 27 28{- TODO: This is just a placeholder -} 29data Sockeye = Sockeye 30 deriving (Show) 31 32{- TODO: This is very rough -} 33{- 34data Sockeye = Sockeye { 35 modules :: Map UniqueModuleId ModuleSpec 36 } 37 deriving (Show) 38 39data UniqueModuleId = UniqueModuleId { 40 name :: !String, 41 file :: !String 42} 43 44data ModuleSpec = ModuleSpec 45 { moduleMeta :: ASTMeta 46 , name :: String 47 , parameters :: [ModuleParameter] 48 , nodeDecls :: [NodeDeclaration] 49 , instDecls :: [QualifiedInstanceDeclaration] 50 , definitions :: [Definition] 51 } 52 53data QualifiedInstanceDeclaration = QualifiedInstanceDeclaration 54 { instDeclMeta :: ASTMeta 55 , instName :: !String 56 , instModName :: !String -- CHANGE ME 57 } 58 -} 59 60 61 62 63{- 64 - From here the data structures are shared with the Parse AST 65 - If they should be different, either change the parser to directly parse them differently 66 - or move them to the ParserAST 67 -} 68data UnqualifiedRef = UnqualifiedRef 69 { refMeta :: ASTMeta 70 , refName :: String 71 , refIndex :: Maybe ArrayIndex 72 } 73 deriving (Show) 74 75instance MetaAST UnqualifiedRef where 76 meta = refMeta 77 78data NodeReference 79 = InternalNodeRef 80 { nodeRefMeta :: ASTMeta 81 , nodeRef :: UnqualifiedRef 82 } 83 | InputPortRef 84 { nodeRefMeta :: ASTMeta 85 , instRef :: UnqualifiedRef 86 , nodeRef :: UnqualifiedRef 87 } 88 deriving (Show) 89 90instance MetaAST NodeReference where 91 meta = nodeRefMeta 92 93data ArrayIndex = ArrayIndex ASTMeta [WildcardSet] 94 deriving (Show) 95 96instance MetaAST ArrayIndex where 97 meta (ArrayIndex m _) = m 98 99data Address = Address ASTMeta [WildcardSet] 100 deriving (Show) 101 102instance MetaAST Address where 103 meta (Address m _) = m 104 105data AddressBlock = AddressBlock 106 { addrBlockMeta :: ASTMeta 107 , addresses :: Address 108 , properties :: PropertyExpr 109 } 110 deriving (Show) 111 112instance MetaAST AddressBlock where 113 meta = addrBlockMeta 114 115data WildcardSet 116 = ExplicitSet ASTMeta NaturalSet 117 | Wildcard ASTMeta 118 deriving (Show) 119 120instance MetaAST WildcardSet where 121 meta (ExplicitSet m _) = m 122 meta (Wildcard m) = m 123 124data NaturalSet = NaturalSet ASTMeta [NaturalRange] 125 deriving (Show) 126 127instance MetaAST NaturalSet where 128 meta (NaturalSet m _) = m 129 130data NaturalRange 131 = SingletonRange 132 { natRangeMeta :: ASTMeta 133 , base :: NaturalExpr 134 } 135 | LimitRange 136 { natRangeMeta :: ASTMeta 137 , base :: NaturalExpr 138 , limit :: NaturalExpr 139 } 140 | BitsRange 141 { natRangeMeta :: ASTMeta 142 , base :: NaturalExpr 143 , bits :: NaturalExpr 144 } 145 deriving (Show) 146 147instance MetaAST NaturalRange where 148 meta = natRangeMeta 149 150data NaturalExpr 151 = Addition 152 { natExprMeta :: ASTMeta 153 , natExprOp1 :: NaturalExpr 154 , natExprOp2 :: NaturalExpr 155 } 156 | Subtraction 157 { natExprMeta :: ASTMeta 158 , natExprOp1 :: NaturalExpr 159 , natExprOp2 :: NaturalExpr 160 } 161 | Multiplication 162 { natExprMeta :: ASTMeta 163 , natExprOp1 :: NaturalExpr 164 , natExprOp2 :: NaturalExpr 165 } 166 | Slice 167 { natExprMeta :: ASTMeta 168 , natExprOp1 :: NaturalExpr 169 , bitRange :: NaturalRange 170 } 171 | Concat 172 { natExprMeta :: ASTMeta 173 , natExprOp1 :: NaturalExpr 174 , natExprOp2 :: NaturalExpr 175 } 176 | Parameter 177 { natExprMeta :: ASTMeta 178 , varName :: !String 179 } 180 | Constant 181 { natExprMeta :: ASTMeta 182 , varName :: !String 183 } 184 | Variable 185 { natExprMeta :: ASTMeta 186 , varName :: !String 187 } 188 | Literal 189 { natExprMeta :: ASTMeta 190 , natural :: !Integer 191 } 192 deriving (Show) 193 194instance MetaAST NaturalExpr where 195 meta = natExprMeta 196 197data PropertyExpr 198 = And 199 { propExprMeta :: ASTMeta 200 , propExprOp1 :: PropertyExpr 201 , propExprOp2 :: PropertyExpr 202 } 203 | Or 204 { propExprMeta :: ASTMeta 205 , propExprOp1 :: PropertyExpr 206 , propExprOp2 :: PropertyExpr 207 } 208 | Not 209 { propExprMeta :: ASTMeta 210 , propExprOp1 :: PropertyExpr 211 } 212 | Property 213 { propExprMeta :: ASTMeta 214 , property :: !String 215 } 216 | True 217 | False 218 deriving (Show) 219 220instance MetaAST PropertyExpr where 221 meta = propExprMeta 222