@@ -496,6 +496,16 @@ static void check_memories(AST::AstNode *node)
496
496
check_memories (node, " " , memories);
497
497
}
498
498
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
+
499
509
// This function is workaround missing support for multirange (with n-ranges) packed/unpacked nodes
500
510
// It converts multirange node to single-range node and translates access to this node
501
511
// to correct range
@@ -514,9 +524,6 @@ static void convert_packed_unpacked_range(AST::AstNode *wire_node)
514
524
wire_node->range_valid = true ;
515
525
return ;
516
526
}
517
- size_t size = 1 ;
518
- size_t packed_size = 1 ;
519
- size_t unpacked_size = 1 ;
520
527
std::vector<AST::AstNode *> ranges;
521
528
522
529
// 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)
540
547
return false ;
541
548
}();
542
549
if (convert_node) {
550
+ // if not already converted
543
551
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
+ }
548
567
}
549
568
} else {
550
569
for (auto r : packed_ranges) {
0 commit comments