@@ -458,6 +458,16 @@ static void check_memories(AST::AstNode *module_node)
458
458
});
459
459
}
460
460
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
+
461
471
// This function is workaround missing support for multirange (with n-ranges) packed/unpacked nodes
462
472
// It converts multirange node to single-range node and translates access to this node
463
473
// to correct range
@@ -476,9 +486,6 @@ static void convert_packed_unpacked_range(AST::AstNode *wire_node)
476
486
wire_node->range_valid = true ;
477
487
return ;
478
488
}
479
- size_t size = 1 ;
480
- size_t packed_size = 1 ;
481
- size_t unpacked_size = 1 ;
482
489
std::vector<AST::AstNode *> ranges;
483
490
484
491
// 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)
502
509
return false ;
503
510
}();
504
511
if (convert_node) {
512
+ // if not already converted
505
513
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
+ }
510
529
}
511
530
} else {
512
531
for (auto r : packed_ranges) {
0 commit comments