From e7381c4db217802fea9286d338d14dbccc386d8c Mon Sep 17 00:00:00 2001 From: Zachary Snow Date: Tue, 24 Mar 2020 22:02:38 -0400 Subject: [PATCH] fix double multipack conversion of Exprs in LHSs --- src/Convert/MultiplePacked.hs | 19 ++++++++++++------- test/basic/multipack_expr_in_lhs.sv | 12 ++++++++++++ test/basic/multipack_expr_in_lhs.v | 12 ++++++++++++ 3 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 test/basic/multipack_expr_in_lhs.sv create mode 100644 test/basic/multipack_expr_in_lhs.v diff --git a/src/Convert/MultiplePacked.hs b/src/Convert/MultiplePacked.hs index 1409caf..f2e22e3 100644 --- a/src/Convert/MultiplePacked.hs +++ b/src/Convert/MultiplePacked.hs @@ -115,13 +115,18 @@ traverseExprM = traverseNestedExprsM $ stately traverseExpr -- LHSs need to be converted too. Rather than duplicating the procedures, we -- turn LHSs into expressions temporarily and use the expression conversion. traverseLHSM :: LHS -> State Info LHS -traverseLHSM lhs = do - let expr = lhsToExpr lhs - expr' <- traverseExprM expr - case exprToLHS expr' of - Just lhs' -> return lhs' - Nothing -> error $ "multi-packed conversion created non-LHS from " - ++ (show expr) ++ " to " ++ (show expr') +traverseLHSM = traverseNestedLHSsM traverseLHSSingleM + where + -- We can't use traverseExprM directly because that would cause Exprs + -- inside of LHSs to be converted twice in a single cycle! + traverseLHSSingleM :: LHS -> State Info LHS + traverseLHSSingleM lhs = do + let expr = lhsToExpr lhs + expr' <- stately traverseExpr expr + case exprToLHS expr' of + Just lhs' -> return lhs' + Nothing -> error $ "multi-packed conversion created non-LHS from " + ++ (show expr) ++ " to " ++ (show expr') traverseExpr :: Info -> Expr -> Expr traverseExpr typeMap = diff --git a/test/basic/multipack_expr_in_lhs.sv b/test/basic/multipack_expr_in_lhs.sv new file mode 100644 index 0000000..eed719c --- /dev/null +++ b/test/basic/multipack_expr_in_lhs.sv @@ -0,0 +1,12 @@ +module top; + logic [3:0][7:0] arr; + logic [3:0][1:0] idx; + assign idx = { 2'b01, 2'b11, 2'b00, 2'b10 }; + initial begin + arr[idx[0]] = 8'hDE; + arr[idx[1]] = 8'hAD; + arr[idx[2]] = 8'hBE; + arr[idx[3]] = 8'hEF; + $display("%h", arr); + end +endmodule diff --git a/test/basic/multipack_expr_in_lhs.v b/test/basic/multipack_expr_in_lhs.v new file mode 100644 index 0000000..48c84cd --- /dev/null +++ b/test/basic/multipack_expr_in_lhs.v @@ -0,0 +1,12 @@ +module top; + reg [31:0] arr; + wire [7:0] idx; + assign idx = { 2'b01, 2'b11, 2'b00, 2'b10 }; + initial begin + arr[idx[0 * 2 +: 2] * 8 +: 8] = 8'hDE; + arr[idx[1 * 2 +: 2] * 8 +: 8] = 8'hAD; + arr[idx[2 * 2 +: 2] * 8 +: 8] = 8'hBE; + arr[idx[3 * 2 +: 2] * 8 +: 8] = 8'hEF; + $display("%h", arr); + end +endmodule