Fixed procedural assignments to non-unique lvalues, e.g. {y,y} = {a,b}
authorClifford Wolf <clifford@clifford.at>
Fri, 27 May 2016 15:55:03 +0000 (17:55 +0200)
committerClifford Wolf <clifford@clifford.at>
Fri, 27 May 2016 15:55:03 +0000 (17:55 +0200)
frontends/ast/genrtlil.cc

index e5446dae6bd1cf0802f97234e6e5e8d1a85652c4..0e5029eb40ef978cf021c99a13012e27ddcd4c3b 100644 (file)
@@ -429,6 +429,17 @@ struct AST_INTERNAL::ProcessGenerator
                        {
                                RTLIL::SigSpec unmapped_lvalue = ast->children[0]->genRTLIL(), lvalue = unmapped_lvalue;
                                RTLIL::SigSpec rvalue = ast->children[1]->genWidthRTLIL(lvalue.size(), &subst_rvalue_map.stdmap());
+
+                               pool<SigBit> lvalue_sigbits;
+                               for (int i = 0; i < GetSize(lvalue); i++) {
+                                       if (lvalue_sigbits.count(lvalue[i]) > 0) {
+                                               unmapped_lvalue.remove(i);
+                                               lvalue.remove(i);
+                                               rvalue.remove(i--);
+                                       } else
+                                               lvalue_sigbits.insert(lvalue[i]);
+                               }
+
                                lvalue.replace(subst_lvalue_map.stdmap());
 
                                if (ast->type == AST_ASSIGN_EQ) {