Skip to content

Commit 35a3c3c

Browse files
authored
Merge pull request #462 from antmicro/kr/wire_fix
systemverilog-plugin: fix wires not starting from 0
2 parents ab3e14f + 8430e64 commit 35a3c3c

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
@@ -496,6 +496,16 @@ static void check_memories(AST::AstNode *node)
496496
check_memories(node, "", memories);
497497
}
498498

499+
static void warn_start_range(const std::vector<AST::AstNode *> ranges)
500+
{
501+
for (size_t i = 0; i < ranges.size(); i++) {
502+
auto start_elem = min(ranges[i]->children[0]->integer, ranges[i]->children[1]->integer);
503+
if (start_elem != 0) {
504+
log_file_warning(ranges[i]->filename, ranges[i]->location.first_line, "Limited support for multirange wires that don't start from 0\n");
505+
}
506+
}
507+
}
508+
499509
// This function is workaround missing support for multirange (with n-ranges) packed/unpacked nodes
500510
// It converts multirange node to single-range node and translates access to this node
501511
// to correct range
@@ -514,9 +524,6 @@ static void convert_packed_unpacked_range(AST::AstNode *wire_node)
514524
wire_node->range_valid = true;
515525
return;
516526
}
517-
size_t size = 1;
518-
size_t packed_size = 1;
519-
size_t unpacked_size = 1;
520527
std::vector<AST::AstNode *> ranges;
521528

522529
// Convert only when node is not a memory and at least 1 of the ranges has more than 1 range
@@ -540,11 +547,23 @@ static void convert_packed_unpacked_range(AST::AstNode *wire_node)
540547
return false;
541548
}();
542549
if (convert_node) {
550+
// if not already converted
543551
if (wire_node->multirange_dimensions.empty()) {
544-
packed_size = add_multirange_attribute(wire_node, packed_ranges);
545-
unpacked_size = add_multirange_attribute(wire_node, unpacked_ranges);
546-
size = packed_size * unpacked_size;
547-
ranges.push_back(make_range(size - 1, 0));
552+
const size_t packed_size = add_multirange_attribute(wire_node, packed_ranges);
553+
const size_t unpacked_size = add_multirange_attribute(wire_node, unpacked_ranges);
554+
if (packed_ranges.size() == 1 && unpacked_ranges.empty()) {
555+
ranges.push_back(packed_ranges[0]->clone());
556+
} else if (unpacked_ranges.size() == 1 && packed_ranges.empty()) {
557+
ranges.push_back(unpacked_ranges[0]->clone());
558+
} else {
559+
// currently we have limited support
560+
// for multirange wires that doesn't start from 0
561+
warn_start_range(packed_ranges);
562+
warn_start_range(unpacked_ranges);
563+
const size_t size = packed_size * unpacked_size;
564+
log_assert(size >= 1);
565+
ranges.push_back(make_range(size - 1, 0));
566+
}
548567
}
549568
} else {
550569
for (auto r : packed_ranges) {

0 commit comments

Comments
 (0)