From 6464e8fee6e0a87e6f527aec5142b1aaa8f10a7f Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Tue, 25 Sep 2012 19:27:00 -0400 Subject: [PATCH] Misc code cleanups. Merge from assignment pattern branch. No functional change. --- src/V3Width.cpp | 30 +++++++++++++--------- test_regress/t/t_array_packed_value_list.v | 22 +++------------- 2 files changed, 21 insertions(+), 31 deletions(-) diff --git a/src/V3Width.cpp b/src/V3Width.cpp index e3e4506c0..8e76277ef 100644 --- a/src/V3Width.cpp +++ b/src/V3Width.cpp @@ -1006,6 +1006,23 @@ private: m_assDTypep = m_assDTypep->skipRefp(); UINFO(9," adtypep "<dtypep(m_assDTypep); + for (AstPatMember* patp = nodep->itemsp()->castPatMember(); patp; patp = patp->nextp()->castPatMember()) { + // Determine replication count, and replicate initial value as widths need to be individually determined + int times = visitPatMemberRep(patp); + for (int i=1; icloneTree(false); + patp->addNextHere(newp); + // This loop will see the new elements as part of nextp() + } + } + AstPatMember* defaultp = NULL; + for (AstPatMember* patp = nodep->itemsp()->castPatMember(); patp; patp = patp->nextp()->castPatMember()) { + if (patp->isDefault()) { + if (defaultp) nodep->v3error("Multiple '{ default: } clauses"); + defaultp = patp; + patp->unlinkFrBack(); + } + } if (AstNodeClassDType* classp = m_assDTypep->castNodeClassDType()) { // Due to "default" and tagged patterns, we need to determine // which member each AstPatMember corresponds to before we can @@ -1013,19 +1030,11 @@ private: // width the initial value appropriately. typedef map PatMap; PatMap patmap; - AstPatMember* defaultp = NULL; { AstMemberDType* memp = classp->membersp(); AstPatMember* patp = nodep->itemsp()->castPatMember(); for (; memp || patp; ) { - // Determine replication count, and replicate initial value as widths need to be individually determined if (patp) { - int times = visitPatMemberRep(patp); - for (int i=1; icloneTree(false); - patp->addNextHere(newp); - // This loop will see the new elements as part of nextp() - } if (patp->keyp()) { if (AstText* textp = patp->keyp()->castText()) { memp = classp->findMember(textp->text()); @@ -1038,10 +1047,7 @@ private: } } } - if (patp && patp->isDefault()) { - if (defaultp) nodep->v3error("Multiple '{ default: } clauses"); - defaultp = patp; - } else if (memp && !patp) { + if (memp && !patp) { // Missing init elements, warn below memp=NULL; patp=NULL; break; } else if (!memp && patp) { patp->v3error("Assignment pattern contains too many elements"); diff --git a/test_regress/t/t_array_packed_value_list.v b/test_regress/t/t_array_packed_value_list.v index 5e049db11..b296c15e0 100644 --- a/test_regress/t/t_array_packed_value_list.v +++ b/test_regress/t/t_array_packed_value_list.v @@ -58,12 +58,8 @@ module t (/*AUTOARG*/ else if (cnt[30:2]== 2) array_bg <= '{default:13}; else if (cnt[30:2]== 3) array_bg <= '{0:4, 1:5, 2:6, 3:7}; else if (cnt[30:2]== 4) array_bg <= '{2:15, default:13}; - else if (cnt[30:2]== 5) array_bg <= '{WA { {WB/2 {2'b10}} }}; - else if (cnt[30:2]== 6) array_bg <= '{WA { {3'b101, {WB/2-1{2'b10}}} }}; - else if (cnt[30:2]== 7) array_bg <= '{WA { {WB/2-1{2'b10}} }}; - else if (cnt[30:2]== 8) array_bg [WA/2-1:0 ] <= '{WA/2{ {WB/2 {2'b10}} }}; - else if (cnt[30:2]== 9) array_bg [WA -1:WA/2] <= '{WA/2{ {WB/2 {2'b01}} }}; - else if (cnt[30:2]==10) array_bg <= '{cnt+0, cnt+1, cnt+2, cnt+3}; + else if (cnt[30:2]== 5) array_bg <= '{WA { {WB {2'b10}} }}; + else if (cnt[30:2]== 6) array_bg <= '{cnt+0, cnt+1, cnt+2, cnt+3}; end else if (cnt[1:0]==2'd2) begin // chack array agains expected value if (cnt[30:2]== 0) begin if (array_bg !== 16'b0000000000000000) begin $display("%b", array_bg); $stop(); end end @@ -72,11 +68,7 @@ module t (/*AUTOARG*/ else if (cnt[30:2]== 3) begin if (array_bg !== 16'b0111011001010100) begin $display("%b", array_bg); $stop(); end end else if (cnt[30:2]== 4) begin if (array_bg !== 16'b1101111111011101) begin $display("%b", array_bg); $stop(); end end else if (cnt[30:2]== 5) begin if (array_bg !== 16'b1010101010101010) begin $display("%b", array_bg); $stop(); end end - else if (cnt[30:2]== 6) begin if (array_bg !== 16'b0110011001100110) begin $display("%b", array_bg); $stop(); end end - else if (cnt[30:2]== 7) begin if (array_bg !== 16'b0010001000100010) begin $display("%b", array_bg); $stop(); end end - else if (cnt[30:2]== 8) begin if (array_bg !== 16'b1010101000000000) begin $display("%b", array_bg); $stop(); end end - else if (cnt[30:2]== 9) begin if (array_bg !== 16'b0000000010101010) begin $display("%b", array_bg); $stop(); end end - else if (cnt[30:2]==10) begin if (array_bg !== 16'b1001101010111100) begin $display("%b", array_bg); $stop(); end end + else if (cnt[30:2]== 6) begin if (array_bg !== 16'b1001101010111100) begin $display("%b", array_bg); $stop(); end end end // little endian @@ -102,10 +94,6 @@ module t (/*AUTOARG*/ else if (cnt[30:2]== 3) array_lt <= '{3:4, 2:5, 1:6, 0:7}; else if (cnt[30:2]== 4) array_lt <= '{1:15, default:13}; else if (cnt[30:2]== 5) array_lt <= '{WA { {WB/2 {2'b10}} }}; - else if (cnt[30:2]== 6) array_lt <= '{WA { {3'b101, {WB/2-1{2'b10}}} }}; - else if (cnt[30:2]== 7) array_lt <= '{WA { {WB/2-1{2'b10}} }}; - else if (cnt[30:2]== 8) array_lt [0 :WA/2-1] <= '{WA/2{ {WB/2 {2'b10}} }}; - else if (cnt[30:2]== 9) array_lt [WA/2:WA -1] <= '{WA/2{ {WB/2 {2'b01}} }}; else if (cnt[30:2]==10) array_lt <= '{cnt+0, cnt+1, cnt+2, cnt+3}; end else if (cnt[1:0]==2'd2) begin // chack array agains expected value @@ -115,10 +103,6 @@ module t (/*AUTOARG*/ else if (cnt[30:2]== 3) begin if (array_lt !== 16'b0111011001010100) begin $display("%b", array_lt); $stop(); end end else if (cnt[30:2]== 4) begin if (array_lt !== 16'b1101111111011101) begin $display("%b", array_lt); $stop(); end end else if (cnt[30:2]== 5) begin if (array_lt !== 16'b1010101010101010) begin $display("%b", array_lt); $stop(); end end - else if (cnt[30:2]== 6) begin if (array_lt !== 16'b0110011001100110) begin $display("%b", array_lt); $stop(); end end - else if (cnt[30:2]== 7) begin if (array_lt !== 16'b0010001000100010) begin $display("%b", array_lt); $stop(); end end - else if (cnt[30:2]== 8) begin if (array_lt !== 16'b1010101000000000) begin $display("%b", array_lt); $stop(); end end - else if (cnt[30:2]== 9) begin if (array_lt !== 16'b0000000010101010) begin $display("%b", array_lt); $stop(); end end else if (cnt[30:2]==10) begin if (array_lt !== 16'b1001101010111100) begin $display("%b", array_lt); $stop(); end end end