Skip to content

Commit 8430e64

Browse files
committed
systemverilog-plugin: fix wires not starting from 0
Signed-off-by: Kamil Rakoczy <krakoczy@antmicro.com>
1 parent ae92491 commit 8430e64

File tree

1 file changed

+26
-7
lines changed

1 file changed

+26
-7
lines changed

systemverilog-plugin/UhdmAst.cc

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,16 @@ static void check_memories(AST::AstNode *module_node)
458458
});
459459
}
460460

461+
static void warn_start_range(const std::vector<AST::AstNode *> ranges)
462+
{
463+
for (size_t i = 0; i < ranges.size(); i++) {
464+
auto start_elem = min(ranges[i]->children[0]->integer, ranges[i]->children[1]->integer);
465+
if (start_elem != 0) {
466+
log_file_warning(ranges[i]->filename, ranges[i]->location.first_line, "Limited support for multirange wires that don't start from 0\n");
467+
}
468+
}
469+
}
470+
461471
// This function is workaround missing support for multirange (with n-ranges) packed/unpacked nodes
462472
// It converts multirange node to single-range node and translates access to this node
463473
// to correct range
@@ -476,9 +486,6 @@ static void convert_packed_unpacked_range(AST::AstNode *wire_node)
476486
wire_node->range_valid = true;
477487
return;
478488
}
479-
size_t size = 1;
480-
size_t packed_size = 1;
481-
size_t unpacked_size = 1;
482489
std::vector<AST::AstNode *> ranges;
483490

484491
// Convert only when node is not a memory and at least 1 of the ranges has more than 1 range
@@ -502,11 +509,23 @@ static void convert_packed_unpacked_range(AST::AstNode *wire_node)
502509
return false;
503510
}();
504511
if (convert_node) {
512+
// if not already converted
505513
if (wire_node->multirange_dimensions.empty()) {
506-
packed_size = add_multirange_attribute(wire_node, packed_ranges);
507-
unpacked_size = add_multirange_attribute(wire_node, unpacked_ranges);
508-
size = packed_size * unpacked_size;
509-
ranges.push_back(make_range(size - 1, 0));
514+
const size_t packed_size = add_multirange_attribute(wire_node, packed_ranges);
515+
const size_t unpacked_size = add_multirange_attribute(wire_node, unpacked_ranges);
516+
if (packed_ranges.size() == 1 && unpacked_ranges.empty()) {
517+
ranges.push_back(packed_ranges[0]->clone());
518+
} else if (unpacked_ranges.size() == 1 && packed_ranges.empty()) {
519+
ranges.push_back(unpacked_ranges[0]->clone());
520+
} else {
521+
// currently we have limited support
522+
// for multirange wires that doesn't start from 0
523+
warn_start_range(packed_ranges);
524+
warn_start_range(unpacked_ranges);
525+
const size_t size = packed_size * unpacked_size;
526+
log_assert(size >= 1);
527+
ranges.push_back(make_range(size - 1, 0));
528+
}
510529
}
511530
} else {
512531
for (auto r : packed_ranges) {

0 commit comments

Comments
 (0)