Sockeye: Consier input mappings and output ports in duplicate identifier check
authorDaniel Schwyn <schwyda@student.ethz.ch>
Wed, 2 Aug 2017 12:17:51 +0000 (14:17 +0200)
committerDaniel Schwyn <schwyda@student.ethz.ch>
Wed, 2 Aug 2017 12:17:51 +0000 (14:17 +0200)
Signed-off-by: Daniel Schwyn <schwyda@student.ethz.ch>

tools/sockeye/Main.hs
tools/sockeye/SockeyeASTParser.hs
tools/sockeye/SockeyeASTTypeChecker.hs
tools/sockeye/SockeyeChecks.hs
tools/sockeye/SockeyeInstantiator.hs
tools/sockeye/SockeyeNetBuilder.hs

index 0a55652..2b2e054 100644 (file)
@@ -265,7 +265,7 @@ main = do
             output f out
     ast <- typeCheck parsedAst
     instAst <- instanitateModules ast
-    -- putStrLn $ groom instAST
+    -- putStrLn $ groom instAst
     netAst <- buildNet instAst
     -- putStrLn $ groom netAst
     out <- compile (optTarget opts) netAst
index 8e11910..2b66158 100644 (file)
@@ -63,8 +63,8 @@ data ModuleBody = ModuleBody
     } deriving (Show)
 
 data NetSpec
-    = NodeDeclSpec NodeDecl
-    | ModuleInstSpec ModuleInst
+    = ModuleInstSpec ModuleInst
+    | NodeDeclSpec NodeDecl
     deriving (Show)
 
 data Port
index a8213d0..f384ab5 100644 (file)
@@ -32,8 +32,8 @@ data Module = Module
     { paramNames   :: [String]
     , paramTypeMap :: Map String ModuleParamType
     , ports        :: [Port]
-    , nodeDecls    :: [NodeDecl]
     , moduleInsts  :: [ModuleInst]
+    , nodeDecls    :: [NodeDecl]
     } deriving (Show)
 
 data ModuleParamType 
index f43f998..da32f27 100644 (file)
@@ -41,7 +41,8 @@ instance (Show t) => Show (FailedChecks t) where
             showFails indentLevel fs =
                 let
                     indent = replicate (indentLevel * 4) ' '
-                in map ((indent ++) . showFail) fs
+                    failStrings = nub $ map showFail fs
+                in map (indent ++) failStrings
             showFail f = (show $ failed f)
 
 type Checks f = Writer [FailedCheck f]
index 0e345b0..2974b5a 100644 (file)
@@ -61,7 +61,7 @@ instance Show InstFail where
     show (DuplicateOutMap  inst port)    = concat ["Multiple mappings for output port '", port, "' in module instantiation '", inst, "'"]
     show (UndefinedInPort  inst port)    = concat ["Mapping to undefined input port '",   port, "' in module instantiation '", inst, "'"]
     show (UndefinedOutPort inst port)    = concat ["Mapping to undefined output port '",  port, "' in module instantiation '", inst, "'"]
-    show (UndefinedReference decl ident) = concat ["Reference to undefined node '", ident, "' in declaration of node '", decl, "'"]
+    show (UndefinedReference decl ident) = concat ["Reference to undefined node '", ident, "' in port or declaration of node '", decl, "'"]
 
 type PortMapping = (InstAST.Identifier, InstAST.Identifier)
 
@@ -105,8 +105,8 @@ instance Instantiatable CheckAST.SockeyeSpec InstAST.SockeyeSpec where
 instance Instantiatable CheckAST.Module InstAST.Module where
     instantiate context ast = do
         let ports = CheckAST.ports ast
-            nodeDecls = CheckAST.nodeDecls ast
             moduleInsts = CheckAST.moduleInsts ast
+            nodeDecls = CheckAST.nodeDecls ast
             modName = head $ modulePath context
         modules <- get
         if modName `Map.member` modules
@@ -122,16 +122,21 @@ instance Instantiatable CheckAST.Module InstAST.Module where
                 instPorts <- do
                     instPorts <- instantiate context ports
                     return $ concat (instPorts :: [[InstAST.Port]])
-                instDecls <- do
-                    decls <- instantiate context nodeDecls
-                    return $ concat (decls :: [[InstAST.NodeDecl]])
                 instInsts <- do
                     insts <- instantiate context moduleInsts
                     return $ concat (insts :: [[InstAST.ModuleInst]])
-                lift $ checkDuplicates modName DuplicateInPort    $ (map InstAST.portId $ filter isInPort  instPorts)
-                lift $ checkDuplicates modName DuplicateOutPort   $ (map InstAST.portId $ filter isOutPort instPorts)
-                lift $ checkDuplicates modName DuplicateIdentifer $ (map InstAST.nodeId instDecls)
+                instDecls <- do
+                    decls <- instantiate context nodeDecls
+                    return $ concat (decls :: [[InstAST.NodeDecl]])
+                let
+                    inPortIds = map InstAST.portId $ filter isInPort instPorts
+                    outPortIds = map InstAST.portId $ filter isOutPort instPorts
+                    inMapNodeIds = concat $ map (Map.elems . InstAST.inPortMap) instInsts
+                    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 DuplicateIdentifer $ outPortIds ++ inMapNodeIds ++ declNodeIds
                 -- TODO: check duplicates with input/output ports
                 return InstAST.Module
                     { InstAST.ports       = instPorts
@@ -194,8 +199,8 @@ instance Instantiatable CheckAST.ModuleInst [InstAST.ModuleInst] where
                     , varValues   = Map.empty
                     }
         lift $ checkSelfInst modPath instName
-        lift $ checkDuplicates name (DuplicateInMap  instName) $ map fst instInMap
-        lift $ checkDuplicates name (DuplicateOutMap instName) $ map fst instOutMap
+        lift $ checkDuplicates (head modPath) (DuplicateInMap  instName) $ map fst instInMap
+        lift $ checkDuplicates (head modPath) (DuplicateOutMap instName) $ map fst instOutMap
         let instantiated = InstAST.ModuleInst
                 { InstAST.moduleName = instName
                 , InstAST.namespace  = instNs
index f8249aa..15a1f28 100644 (file)
@@ -45,7 +45,7 @@ data NetBuildFail
 instance Show NetBuildFail where
     show (UndefinedInPort  inst port)    = concat ["Mapping to undefined input port '",   port, "' in module instantiation '", inst, "'"]
     show (UndefinedOutPort inst port)    = concat ["Mapping to undefined output port '",  port, "' in module instantiation '", inst, "'"]
-    show (UndefinedReference decl ident) = concat ["Reference to undefined node '", ident, "' in declaration of node '", decl, "'"]
+    show (UndefinedReference decl ident) = concat ["Reference to undefined node '", ident, "' in input port or node declaration'", decl, "'"]
 
 type PortMap = Map InstAST.Identifier NetAST.NodeId