From 82d06b39155654f4d6d8c97aa266346250e58d67 Mon Sep 17 00:00:00 2001 From: Zachary Snow Date: Thu, 25 Jun 2020 17:36:09 -0700 Subject: [PATCH] elaboration avoid introducing illegal selects --- src/Convert/Simplify.hs | 13 ++++++++++++- test/basic/simplify_func.sv | 15 +++++++++++++++ test/basic/simplify_func.v | 6 ++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 test/basic/simplify_func.sv create mode 100644 test/basic/simplify_func.v diff --git a/src/Convert/Simplify.hs b/src/Convert/Simplify.hs index 3a963ae..72c3439 100644 --- a/src/Convert/Simplify.hs +++ b/src/Convert/Simplify.hs @@ -34,13 +34,24 @@ convertDescription = traverseDeclM :: Decl -> State Info Decl traverseDeclM decl = do case decl of - Param Localparam _ x e -> modify $ Map.insert x e + Param Localparam _ x e -> + when (isSimpleExpr e) $ modify $ Map.insert x e _ -> return () let mi = MIPackageItem $ Decl decl mi' <- traverseModuleItemM mi let MIPackageItem (Decl decl') = mi' return decl' +isSimpleExpr :: Expr -> Bool +isSimpleExpr Ident{} = True +isSimpleExpr PSIdent{} = True +isSimpleExpr Number{} = True +isSimpleExpr String{} = True +isSimpleExpr (Dot e _ ) = isSimpleExpr e +isSimpleExpr (Bit e _ ) = isSimpleExpr e +isSimpleExpr (Range e _ _) = isSimpleExpr e +isSimpleExpr _ = False + traverseModuleItemM :: ModuleItem -> State Info ModuleItem traverseModuleItemM (Instance m p x rs l) = do p' <- mapM paramBindingMapper p diff --git a/test/basic/simplify_func.sv b/test/basic/simplify_func.sv new file mode 100644 index 0000000..39fbbeb --- /dev/null +++ b/test/basic/simplify_func.sv @@ -0,0 +1,15 @@ +package PKG; + typedef struct packed { + int F; + } S; + function automatic S f(); + return '0; + endfunction +endpackage + +module top; + localparam PKG::S L0 = PKG::f(); + localparam int L1 = L0.F; + localparam int L2 = $clog2(L1); + initial $display("%b %b %b", L0, L1, L2); +endmodule diff --git a/test/basic/simplify_func.v b/test/basic/simplify_func.v new file mode 100644 index 0000000..f0d948d --- /dev/null +++ b/test/basic/simplify_func.v @@ -0,0 +1,6 @@ +module top; + localparam L0 = 0; + localparam L1 = L0; + localparam L2 = $clog2(L1); + initial $display("%b %b %b", L0, L1, L2); +endmodule