Merge pull request #359 from antmicro/shift-unsigned

SystemVerilog: Fix children handling in shift operations
diff --git a/systemverilog-plugin/UhdmAst.cc b/systemverilog-plugin/UhdmAst.cc
index 7f1d2b3..e982c6f 100644
--- a/systemverilog-plugin/UhdmAst.cc
+++ b/systemverilog-plugin/UhdmAst.cc
@@ -972,18 +972,6 @@
     AST_INTERNAL::current_ast_mod = nullptr;
 }
 
-static void mark_as_unsigned(AST::AstNode *node, const UHDM::BaseClass *object)
-{
-    if (node->children.empty() || node->children.size() == 1) {
-        node->is_signed = false;
-    } else if (node->children.size() == 2) {
-        node->children[0]->is_signed = false;
-        node->children[1]->is_signed = false;
-    } else {
-        log_error("%s:%d: Unsupported expression in mark_as_unsigned!\n", object->VpiFile().c_str(), object->VpiLineNo());
-    }
-}
-
 void UhdmAst::visit_one_to_many(const std::vector<int> child_node_types, vpiHandle parent_handle, const std::function<void(AST::AstNode *)> &f)
 {
     for (auto child : child_node_types) {
@@ -2672,16 +2660,20 @@
         case vpiBitXnorOp:
             current_node->type = AST::AST_BIT_XNOR;
             break;
-        case vpiLShiftOp:
+        case vpiLShiftOp: {
             current_node->type = AST::AST_SHIFT_LEFT;
             log_assert(current_node->children.size() == 2);
-            mark_as_unsigned(current_node->children[1], object);
+            auto unsigned_node = new AST::AstNode(AST::AST_TO_UNSIGNED, current_node->children[1]);
+            current_node->children[1] = unsigned_node;
             break;
-        case vpiRShiftOp:
+        }
+        case vpiRShiftOp: {
             current_node->type = AST::AST_SHIFT_RIGHT;
             log_assert(current_node->children.size() == 2);
-            mark_as_unsigned(current_node->children[1], object);
+            auto unsigned_node = new AST::AstNode(AST::AST_TO_UNSIGNED, current_node->children[1]);
+            current_node->children[1] = unsigned_node;
             break;
+        }
         case vpiNotOp:
             current_node->type = AST::AST_LOGIC_NOT;
             break;
@@ -2733,16 +2725,20 @@
         case vpiModOp:
             current_node->type = AST::AST_MOD;
             break;
-        case vpiArithLShiftOp:
+        case vpiArithLShiftOp: {
             current_node->type = AST::AST_SHIFT_SLEFT;
             log_assert(current_node->children.size() == 2);
-            mark_as_unsigned(current_node->children[1], object);
+            auto unsigned_node = new AST::AstNode(AST::AST_TO_UNSIGNED, current_node->children[1]);
+            current_node->children[1] = unsigned_node;
             break;
-        case vpiArithRShiftOp:
+        }
+        case vpiArithRShiftOp: {
             current_node->type = AST::AST_SHIFT_SRIGHT;
             log_assert(current_node->children.size() == 2);
-            mark_as_unsigned(current_node->children[1], object);
+            auto unsigned_node = new AST::AstNode(AST::AST_TO_UNSIGNED, current_node->children[1]);
+            current_node->children[1] = unsigned_node;
             break;
+        }
         case vpiPowerOp:
             current_node->type = AST::AST_POW;
             break;