Sockeye: Fix empty top level namespace being compiled to empty atom in Prolog
authorDaniel Schwyn <schwyda@student.ethz.ch>
Wed, 2 Aug 2017 15:58:02 +0000 (17:58 +0200)
committerDaniel Schwyn <schwyda@student.ethz.ch>
Wed, 2 Aug 2017 15:58:02 +0000 (17:58 +0200)
Signed-off-by: Daniel Schwyn <schwyda@student.ethz.ch>

tools/sockeye/SockeyeASTInstantiator.hs
tools/sockeye/SockeyeASTTypeChecker.hs
tools/sockeye/SockeyeBackendProlog.hs
tools/sockeye/SockeyeInstantiator.hs
tools/sockeye/SockeyeNetBuilder.hs
tools/sockeye/SockeyeTypeChecker.hs

index a4d82de..61ca2e4 100644 (file)
@@ -52,7 +52,7 @@ data Port
 
 data ModuleInst
     = ModuleInst
-        { namespace  :: Identifier
+        { namespace  :: Maybe Identifier
         , moduleName :: Identifier
         , inPortMap  :: PortMap
         , outPortMap :: PortMap
index f384ab5..967abcc 100644 (file)
@@ -59,7 +59,7 @@ data Port
 
 data ModuleInst
     = ModuleInst
-        { namespace  :: Identifier
+        { namespace  :: Maybe Identifier
         , moduleName :: String
         , arguments  :: Map String ModuleArg
         , inPortMap  :: [PortMap]
index 5e4ffc5..4be1bcb 100644 (file)
@@ -47,7 +47,7 @@ instance PrologGenerator AST.NetSpec where
 instance PrologGenerator AST.NodeId where
     generate ast = let
         name = AST.name ast
-        namespace = filter ((> 0) . length) $ AST.namespace ast
+        namespace = AST.namespace ast
         in predicate "nodeId" [atom name, list $ map atom namespace]
 
 instance PrologGenerator AST.NodeSpec where
index 8fbff9e..bafabde 100644 (file)
@@ -25,7 +25,7 @@ import Control.Monad.State
 import Data.List (intercalate)
 import Data.Map (Map)
 import qualified Data.Map as Map
-import Data.Maybe (fromMaybe)
+import Data.Maybe (catMaybes, fromMaybe)
 
 import Numeric (showHex)
 
@@ -127,7 +127,7 @@ instance Instantiatable CheckAST.Module InstAST.Module where
                     declNodeIds = map InstAST.nodeId instDecls
                 lift $ checkDuplicates modName DuplicateInPort  inPortIds
                 lift $ checkDuplicates modName DuplicateOutPort outPortIds
-                lift $ checkDuplicates modName DuplicateNamespace $ (map InstAST.namespace instInsts)
+                lift $ checkDuplicates modName DuplicateNamespace (catMaybes $ map InstAST.namespace instInsts)
                 lift $ checkDuplicates modName DuplicateIdentifer $ outPortIds ++ inMapNodeIds ++ declNodeIds
                 return InstAST.Module
                     { InstAST.inputPorts  = instInPorts
@@ -176,7 +176,7 @@ instance Instantiatable CheckAST.ModuleInst [InstAST.ModuleInst] where
             outPortMap = CheckAST.outPortMap ast
             modPath = modulePath context
             mod = getModule context name
-        instNs <- instantiate context namespace
+        instNs <- maybe (return Nothing) (\ns -> instantiate context ns >>= return . Just) namespace
         instInMap <- do
             inMaps <- instantiate context inPortMap
             return $ concat (inMaps :: [[PortMapping]])
index ad26844..646028d 100644 (file)
@@ -161,16 +161,17 @@ instance NetTransformable InstAST.ModuleInst NetAST.NetSpec where
             mod = (modules context) Map.! name
             inPortIds = Set.fromList $ map InstAST.portId (InstAST.inputPorts mod)
             outPortIds = Set.fromList $ map InstAST.portId (InstAST.outputPorts mod)
-            instString = concat [name, " as ", namespace]
+            instString = concat [name, maybe  "" (" as " ++ ) namespace]
             errorContext = concat ["port mapping for '", instString, "'"]
         mapM_ (checkReference context $ UndefinedReference errorContext) $ (Map.elems inPortMap) ++ (Map.elems outPortMap)
         checkAllExist (UndefinedInPort instString) inPortIds $ Map.keysSet inPortMap
         checkAllExist (UndefinedOutPort instString) outPortIds $ Map.keysSet outPortMap
         netInMap <- transform context inPortMap
         netOutMap <- transform context outPortMap
-        let instContext = context
+        let curNs = curNamespace context
+            instContext = context
                 { curModule    = name
-                , curNamespace = namespace:(curNamespace context)
+                , curNamespace = maybe curNs (:curNs) namespace
                 , inPortMap    = netInMap
                 , outPortMap   = netOutMap
                 }
index c4dfeb9..e04dc29 100644 (file)
@@ -132,7 +132,7 @@ instance Checkable ParseAST.SockeyeSpec CheckAST.SockeyeSpec where
         checkedRootNetSpecs <- check rootModContext rootNetSpecs
         checkedModules <- check context mods
         let root = CheckAST.ModuleInst
-                { CheckAST.namespace  = CheckAST.SimpleIdent ""
+                { CheckAST.namespace  = Nothing
                 , CheckAST.moduleName = rootName
                 , CheckAST.arguments  = Map.empty
                 , CheckAST.inPortMap  = []
@@ -212,7 +212,7 @@ instance Checkable ParseAST.ModuleInst CheckAST.ModuleInst where
         inPortMap  <- check context $ filter isInMap  portMaps
         outPortMap <- check context $ filter isOutMap portMaps
         return CheckAST.ModuleInst
-            { CheckAST.namespace  = checkedNamespace
+            { CheckAST.namespace  = Just checkedNamespace
             , CheckAST.moduleName = name
             , CheckAST.arguments  = checkedArgs
             , CheckAST.inPortMap  = inPortMap