Sockeye: Add possibility to add reserved blocks
authorDaniel Schwyn <schwyda@student.ethz.ch>
Thu, 20 Jul 2017 09:00:04 +0000 (11:00 +0200)
committerDaniel Schwyn <schwyda@student.ethz.ch>
Thu, 20 Jul 2017 09:00:04 +0000 (11:00 +0200)
Signed-off-by: Daniel Schwyn <schwyda@student.ethz.ch>

tools/sockeye/SockeyeAST.hs
tools/sockeye/SockeyeASTParser.hs
tools/sockeye/SockeyeChecker.hs
tools/sockeye/SockeyeNetBuilder.hs
tools/sockeye/SockeyeParser.hs

index 6c338c3..535ddf3 100644 (file)
@@ -97,6 +97,7 @@ data NodeSpec = NodeSpec
     { nodeType  :: Maybe NodeType
     , accept    :: [BlockSpec]
     , translate :: [MapSpec]
+    , reserved  :: [BlockSpec]
     , overlay   :: Maybe OverlaySpec
     } deriving (Show)
 
index e4b2b36..686f4ce 100644 (file)
@@ -24,7 +24,7 @@ import SockeyeAST
     , ModuleParamType(NaturalParam, AddressParam)
     , ModuleArg(AddressArg, NaturalArg, ParamArg)
     , NodeSpec(NodeSpec)
-    , nodeType, accept, translate, overlay
+    , nodeType, accept, translate, reserved, overlay
     , NodeType(Memory, Device)
     , BlockSpec(SingletonBlock, RangeBlock, LengthBlock)
     , base, limit, bits
index 96f1f58..ad27ba0 100644 (file)
@@ -342,8 +342,10 @@ instance Checkable ParseAST.NodeSpec AST.NodeSpec where
             accept = ParseAST.accept ast
             translate = ParseAST.translate ast
             overlay = ParseAST.overlay ast
+            reserved = ParseAST.reserved ast
         checkedAccept <- check context accept
         checkedTranslate <- check context translate
+        checkedReserved <- check context reserved
         checkedOverlay <- case overlay of
             Nothing    -> return Nothing
             Just ident -> do
@@ -353,6 +355,7 @@ instance Checkable ParseAST.NodeSpec AST.NodeSpec where
             { AST.nodeType  = nodeType
             , AST.accept    = checkedAccept
             , AST.translate = checkedTranslate
+            , AST.reserved  = checkedReserved
             , AST.overlay   = checkedOverlay
             }
 
index f0cccae..dee7e86 100644 (file)
@@ -300,14 +300,16 @@ instance NetTransformable AST.NodeSpec NetAST.NodeSpec where
             nodeType = AST.nodeType ast
             accept = AST.accept ast
             translate = AST.translate ast
+            reserved = AST.reserved ast
             overlay = AST.overlay ast
         netNodeType <- maybe (return NetAST.Other) (transform context) nodeType
         netAccept <- transform context accept
         netTranslate <- transform context translate
+        netReserved <- transform context reserved
         let
             mapBlocks = map NetAST.srcBlock netTranslate
             nodeContext = context
-                { mappedBlocks = netAccept ++ mapBlocks }
+                { mappedBlocks = netAccept ++ mapBlocks ++ netReserved }
         netOverlay <- case overlay of
                 Nothing -> return []
                 Just o  -> transform nodeContext o
index 0b15ace..3751382 100644 (file)
@@ -206,22 +206,27 @@ identifier = do
 nodeSpec = do
     nodeType <- optionMaybe $ try nodeType
     accept <- option [] accept 
-    translate <- option [] tranlsate 
+    translate <- option [] tranlsate
+    reserve <- option [] reserve
     overlay <- optionMaybe overlay
     return AST.NodeSpec 
         { AST.nodeType  = nodeType
         , AST.accept    = accept
         , AST.translate = translate
+        , AST.reserved  = reserve
         , AST.overlay   = overlay
         }
     where
         accept = do
-            reserved "accept"
+            try $ reserved "accept"
             brackets $ many blockSpec
         tranlsate = do
-            reserved "map"
+            try $ reserved "map"
             specs <- brackets $ many mapSpecs
             return $ concat specs
+        reserve = do
+            try $ reserved "reserved"
+            brackets $ many blockSpec
 
 nodeType = choice [memory, device]
     where memory = do
@@ -345,7 +350,7 @@ keywords = ["import", "module",
             "as", "with",
             "is", "are",
             "accept", "map",
-            "over",
+            "reserved", "over",
             "to", "at"]   
 
 identStart     = letter