mirror of https://github.com/zachjs/sv2v.git
fix inadvertent duplicate casts
This commit is contained in:
parent
03b6ece939
commit
90de4aa121
|
|
@ -8,6 +8,7 @@
|
||||||
module Convert.SizeCast (convert) where
|
module Convert.SizeCast (convert) where
|
||||||
|
|
||||||
import Control.Monad.Writer
|
import Control.Monad.Writer
|
||||||
|
import Data.List (isPrefixOf)
|
||||||
|
|
||||||
import Convert.ExprUtils
|
import Convert.ExprUtils
|
||||||
import Convert.Scoper
|
import Convert.Scoper
|
||||||
|
|
@ -18,17 +19,30 @@ convert :: [AST] -> [AST]
|
||||||
convert = map $ traverseDescriptions convertDescription
|
convert = map $ traverseDescriptions convertDescription
|
||||||
|
|
||||||
convertDescription :: Description -> Description
|
convertDescription :: Description -> Description
|
||||||
convertDescription = partScoper
|
convertDescription =
|
||||||
|
traverseModuleItems dropDuplicateCaster . partScoper
|
||||||
traverseDeclM traverseModuleItemM traverseGenItemM traverseStmtM
|
traverseDeclM traverseModuleItemM traverseGenItemM traverseStmtM
|
||||||
|
|
||||||
traverseDeclM :: Decl -> Scoper Type Decl
|
traverseDeclM :: Decl -> Scoper Type Decl
|
||||||
traverseDeclM decl = do
|
traverseDeclM decl = do
|
||||||
case decl of
|
decl' <- case decl of
|
||||||
Variable _ t x _ _ -> insertElem x t
|
Variable _ t x _ _ -> do
|
||||||
Param _ t x _ -> insertElem x t
|
details <- lookupElemM x
|
||||||
ParamType _ _ _ -> return ()
|
if isPrefixOf "sv2v_cast_" x && details /= Nothing
|
||||||
CommentDecl _ -> return ()
|
then return $ Variable Local DuplicateTag x [] Nil
|
||||||
traverseDeclExprsM traverseExprM decl
|
else insertElem x t >> return decl
|
||||||
|
Param _ t x _ -> insertElem x t >> return decl
|
||||||
|
ParamType _ _ _ -> return decl
|
||||||
|
CommentDecl _ -> return decl
|
||||||
|
traverseDeclExprsM traverseExprM decl'
|
||||||
|
|
||||||
|
pattern DuplicateTag :: Type
|
||||||
|
pattern DuplicateTag = Alias ":duplicate_cast_to_be_removed:" []
|
||||||
|
|
||||||
|
dropDuplicateCaster :: ModuleItem -> ModuleItem
|
||||||
|
dropDuplicateCaster (MIPackageItem (Function _ DuplicateTag _ _ _)) =
|
||||||
|
Generate []
|
||||||
|
dropDuplicateCaster other = other
|
||||||
|
|
||||||
traverseModuleItemM :: ModuleItem -> Scoper Type ModuleItem
|
traverseModuleItemM :: ModuleItem -> Scoper Type ModuleItem
|
||||||
traverseModuleItemM (Genvar x) =
|
traverseModuleItemM (Genvar x) =
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
package PKG;
|
||||||
|
localparam P = 1'b1;
|
||||||
|
typedef struct packed {
|
||||||
|
logic f;
|
||||||
|
} foo_t;
|
||||||
|
endpackage
|
||||||
|
|
||||||
|
module top;
|
||||||
|
PKG::foo_t b;
|
||||||
|
logic [1:0] a;
|
||||||
|
assign b = '{default: PKG::P};
|
||||||
|
assign a = '{default: PKG::P};
|
||||||
|
initial #1 $display("%b %b", a, b);
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
module top;
|
||||||
|
wire b;
|
||||||
|
wire [1:0] a;
|
||||||
|
function automatic val;
|
||||||
|
input inp;
|
||||||
|
val = inp;
|
||||||
|
endfunction
|
||||||
|
assign b = val(1);
|
||||||
|
assign a = {2 {val(1)}};
|
||||||
|
initial #1 $display("%b %b", a, b);
|
||||||
|
endmodule
|
||||||
Loading…
Reference in New Issue