allow packages to reference their own items explicitly

This commit is contained in:
Zachary Snow 2021-04-13 14:44:42 -04:00
parent c0b8ba17de
commit eeeade3e19
9 changed files with 71 additions and 6 deletions

View File

@ -292,13 +292,13 @@ processItems topName packageName moduleItems = do
traverseDeclM :: Decl -> Scope Decl
traverseDeclM decl = do
decl' <- case decl of
decl' <- traverseDeclTypesM traverseTypeM decl
>>= traverseDeclExprsM traverseExprM
case decl' of
Variable d t x a e -> declHelp x $ \x' -> Variable d t x' a e
Param p t x e -> declHelp x $ \x' -> Param p t x' e
ParamType p x t -> declHelp x $ \x' -> ParamType p x' t
CommentDecl c -> return $ CommentDecl c
traverseDeclTypesM traverseTypeM decl' >>=
traverseDeclExprsM traverseExprM
where declHelp x f = prefixIdent x >>= return . f
traverseTypeM :: Type -> Scope Type
@ -307,7 +307,7 @@ processItems topName packageName moduleItems = do
x' <- lift $ resolveCSIdent p b scopeKeys x
return $ Alias x' rs
traverseTypeM (PSAlias p x rs) = do
x' <- lift $ resolvePSIdent p x
x' <- resolvePSIdent' p x
return $ Alias x' rs
traverseTypeM (Alias x rs) =
resolveIdent x >>= \x' -> return $ Alias x' rs
@ -324,7 +324,7 @@ processItems topName packageName moduleItems = do
x' <- lift $ resolveCSIdent p b scopeKeys x
return $ Ident x'
traverseExprM (PSIdent p x) = do
x' <- lift $ resolvePSIdent p x
x' <- resolvePSIdent' p x
return $ Ident x'
traverseExprM (Ident x) = resolveIdent x >>= return . Ident
traverseExprM other = traverseSinglyNestedExprsM traverseExprM other
@ -347,6 +347,19 @@ processItems topName packageName moduleItems = do
traverseStmtExprsM traverseExprM >=>
traverseStmtLHSsM traverseLHSM
-- wrapper allowing explicit reference to local package items
resolvePSIdent' :: Identifier -> Identifier -> Scope Identifier
resolvePSIdent' p x = do
if p /= packageName then
lift $ resolvePSIdent p x
else do
details <- lookupElemM $ Dot (Ident p) x
return $ case details of
Just ([_, _], _, Declared) -> p ++ '_' : x
Just ([_, _], _, Imported rootPkg) -> rootPkg ++ '_' : x
_ -> error $ "package " ++ show p ++ " references"
++ " undeclared local \"" ++ p ++ "::" ++ x ++ "\""
-- locate a package by name, processing its contents if necessary
findPackage :: Identifier -> PackagesState Package
findPackage packageName = do

View File

@ -0,0 +1,8 @@
package P;
localparam Bar = 1;
localparam Foo = P::Bar;
endpackage
module top;
import P::*;
initial $display(Foo);
endmodule

View File

@ -0,0 +1,4 @@
module top;
localparam Foo = 1;
initial $display(Foo);
endmodule

View File

@ -0,0 +1,11 @@
package Q;
localparam Bar = 1;
endpackage
package P;
import Q::Bar;
localparam Foo = P::Bar;
endpackage
module top;
import P::*;
initial $display(Foo);
endmodule

View File

@ -0,0 +1,4 @@
module top;
localparam Foo = 1;
initial $display(Foo);
endmodule

View File

@ -0,0 +1,11 @@
package P;
localparam Bar = 1;
function automatic integer func;
localparam Bar = 2;
func = Bar + P::Bar;
endfunction
endpackage
module top;
import P::*;
initial $display(func());
endmodule

View File

@ -0,0 +1,5 @@
module top;
localparam Foo = 1;
localparam Bar = 2;
initial $display(Foo + Bar);
endmodule

View File

@ -0,0 +1,9 @@
// pattern: package "P" references undeclared local "P::Bar"
package P;
localparam Foo = P::Bar;
localparam Bar = 1;
endpackage
module top;
import P::*;
initial $display(Foo);
endmodule

View File

@ -1,4 +1,4 @@
// pattern: package dependency loop: "P" depends on "P"
// pattern: package "P" references undeclared local "P::Foo"
package P;
localparam Foo = P::Foo;
endpackage