diff --git a/src/Convert/SizeCast.hs b/src/Convert/SizeCast.hs index 49a7f02..7943e8f 100644 --- a/src/Convert/SizeCast.hs +++ b/src/Convert/SizeCast.hs @@ -84,8 +84,6 @@ traverseExprM = sizesMatch = numberToInteger s == Just (numberBitLength n) fallback = convertCastM (Number s) (Number n) num = return . Number - convertExprM (orig @ (Cast (Right DimsFn{}) _)) = - return orig convertExprM (Cast (Right (Ident x)) e) = do typeMap <- get -- can't convert this cast yet because x could be a typename @@ -93,7 +91,9 @@ traverseExprM = then return $ Cast (Right $ Ident x) e else convertCastM (Ident x) e convertExprM (Cast (Right s) e) = - convertCastM s e + if isSimpleExpr s + then convertCastM s e + else return $ Cast (Right s) e convertExprM (Cast (Left (IntegerVector _ Signed rs)) e) = convertCastWithSigningM (dimensionsSize rs) e Signed convertExprM (Cast (Left (IntegerVector _ _ rs)) e) = @@ -121,6 +121,17 @@ traverseExprM = let args = Args [e] [] return $ Call (Ident f) args +isSimpleExpr :: Expr -> Bool +isSimpleExpr = + null . execWriter . collectNestedExprsM collectUnresolvedExprM + where + collectUnresolvedExprM :: Expr -> Writer [Expr] () + collectUnresolvedExprM (expr @ PSIdent{}) = tell [expr] + collectUnresolvedExprM (expr @ CSIdent{}) = tell [expr] + collectUnresolvedExprM (expr @ DimsFn{}) = tell [expr] + collectUnresolvedExprM (expr @ DimFn {}) = tell [expr] + collectUnresolvedExprM _ = return () + castFn :: Expr -> Signing -> Description castFn e sg = PackageItem $ diff --git a/test/basic/package_function_cast.sv b/test/basic/package_function_cast.sv new file mode 100644 index 0000000..b79ecea --- /dev/null +++ b/test/basic/package_function_cast.sv @@ -0,0 +1,20 @@ +package P; + function automatic logic [7:0] f(input logic [2:0] p); + logic [7:0] r; + r = '0; + r[p+:2] = '1; + return r; + endfunction +endpackage + +module top; + logic [2:0] p; + logic [7:0] q; + assign q = P::f(p); + initial begin + $monitor("%0d, p=%b q=%b", $time, p, q); + #1 p = 0; + while (p != 7) + #1 p = p + 1; + end +endmodule diff --git a/test/basic/package_function_cast.v b/test/basic/package_function_cast.v new file mode 100644 index 0000000..f9d26b8 --- /dev/null +++ b/test/basic/package_function_cast.v @@ -0,0 +1,18 @@ +module top; + function automatic [7:0] f; + input [2:0] p; + begin + f = 7'b0; + f[p+:2] = 2'b11; + end + endfunction + reg [2:0] p; + wire [7:0] q; + assign q = f(p); + initial begin + $monitor("%0d, p=%b q=%b", $time, p, q); + #1 p = 0; + while (p != 7) + #1 p = p + 1; + end +endmodule