Apply review comments Signed-off-by: Kamil Rakoczy <krakoczy@antmicro.com>
diff --git a/systemverilog-plugin/UhdmAst.cc b/systemverilog-plugin/UhdmAst.cc index 9c89170..5b2c9bc 100644 --- a/systemverilog-plugin/UhdmAst.cc +++ b/systemverilog-plugin/UhdmAst.cc
@@ -619,7 +619,8 @@ if (c->type == AST::AST_RANGE) { // Currently supporting only 1 range if (struct_range) { - log_error("Currently support for dot-access is limited to single range\n"); + log_file_error(struct_range->filename, struct_range->location.first_line, + "Currently support for dot-access is limited to single range\n"); } struct_range = c; } @@ -636,7 +637,8 @@ // with multirange // Currently support only special access to 2 dimensional packed element // when selecting single range - if (struct_range && current_struct_elem->multirange_swapped.size() == 2 /* 2 dimensional */) { + log_assert(current_struct_elem->multirange_dimensions.size() % 2 == 0); + if (struct_range && (current_struct_elem->multirange_dimensions.size() / 2) == 2) { // get element size in number of bits const int single_elem_size = current_struct_elem->children.front()->range_left + 1; left = AST::AstNode::mkconst_int(single_elem_size * current_struct_elem->multirange_dimensions.back(), true); @@ -847,9 +849,10 @@ // embedded struct or union width = simplify_struct(node, base_offset + offset, parent_node); if (!node->multirange_dimensions.empty()) { - // reverse-iterate over multiranges, skip right_range - for (auto rit = node->multirange_dimensions.rbegin(); rit != node->multirange_dimensions.rend(); rit += 2) { - width *= *rit; + // Multiply widths of all dimensions. + // `multirange_dimensions` stores (repeating) pairs of [offset, width]. + for (size_t i = 1; i < node->multirange_dimensions.size(); i += 2) { + width *= node->multirange_dimensions[i]; } } // set range of struct