@@ -295,6 +295,11 @@ static void add_multirange_wire(AST::AstNode *node, std::vector<AST::AstNode *>
295295
296296static 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