Skip to content

Commit c14110b

Browse files
committed
fix multirange for struct items
1 parent 38a8a5d commit c14110b

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

systemverilog-plugin/UhdmAst.cc

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,11 @@ static void add_multirange_wire(AST::AstNode *node, std::vector<AST::AstNode *>
295295

296296
static size_t add_multirange_attribute(AST::AstNode *wire_node, const std::vector<AST::AstNode *> ranges)
297297
{
298+
// node->multirange_dimensions stores dimensions' offsets and widths.
299+
// It shall have even number of elements.
300+
// For a range of [A:B] it should be appended with {min(A,B)} and {max(A,B)-min(A,B)+1}
301+
// For a range of [A] it should be appended with {0} and {A}
302+
298303
size_t size = 1;
299304
for (size_t i = 0; i < ranges.size(); i++) {
300305
log_assert(AST_INTERNAL::current_ast_mod);
@@ -320,17 +325,15 @@ static size_t add_multirange_attribute(AST::AstNode *wire_node, const std::vecto
320325
}
321326
log_assert(ranges[i]->children[0]->type == AST::AST_CONSTANT);
322327
log_assert(ranges[i]->children[1]->type == AST::AST_CONSTANT);
323-
if (wire_node->type != AST::AST_STRUCT_ITEM) {
324-
wire_node->multirange_dimensions.push_back(min(ranges[i]->children[0]->integer, ranges[i]->children[1]->integer));
325-
wire_node->multirange_swapped.push_back(ranges[i]->range_swapped);
326-
}
327328
auto elem_size = max(ranges[i]->children[0]->integer, ranges[i]->children[1]->integer) -
328329
min(ranges[i]->children[0]->integer, ranges[i]->children[1]->integer) + 1;
329-
if (wire_node->type != AST::AST_STRUCT_ITEM || (wire_node->type == AST::AST_STRUCT_ITEM && i == 0)) {
330-
wire_node->multirange_dimensions.push_back(elem_size);
331-
}
330+
wire_node->multirange_dimensions.push_back(min(ranges[i]->children[0]->integer, ranges[i]->children[1]->integer));
331+
wire_node->multirange_dimensions.push_back(elem_size);
332+
wire_node->multirange_swapped.push_back(ranges[i]->range_swapped);
332333
size *= elem_size;
333334
}
335+
log_assert(wire_node->multirange_dimensions.size() % 2 == 0);
336+
334337
return size;
335338
}
336339

0 commit comments

Comments
 (0)