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