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;