@@ -122,6 +122,8 @@ static void add_multirange_wire(AST::AstNode *node, std::vector<AST::AstNode *>
122122
123123 node->attributes [ID::unpacked_ranges] = AST::AstNode::mkconst_int (1 , false , 1 );
124124 if (!unpacked_ranges.empty ()) {
125+ if (reverse)
126+ std::reverse (unpacked_ranges.begin (), unpacked_ranges.end ());
125127 node->attributes [ID::unpacked_ranges]->children .insert (node->attributes [ID::unpacked_ranges]->children .end (), unpacked_ranges.begin (),
126128 unpacked_ranges.end ());
127129 }
@@ -140,8 +142,6 @@ static size_t add_multirange_attribute(AST::AstNode *wire_node, const std::vecto
140142 log_assert (ranges[i]->children [0 ]->type == AST::AST_CONSTANT);
141143 log_assert (ranges[i]->children [1 ]->type == AST::AST_CONSTANT);
142144 wire_node->multirange_dimensions .push_back (min (ranges[i]->children [0 ]->integer , ranges[i]->children [1 ]->integer ));
143- // TODO: add support for wires not starting with 0
144- log_assert (wire_node->multirange_dimensions .back () == 0 );
145145 wire_node->multirange_dimensions .push_back (max (ranges[i]->children [0 ]->integer , ranges[i]->children [1 ]->integer ) -
146146 min (ranges[i]->children [0 ]->integer , ranges[i]->children [1 ]->integer ) + 1 );
147147 wire_node->multirange_swapped .push_back (ranges[i]->range_swapped );
@@ -160,8 +160,8 @@ static AST::AstNode *convert_range(AST::AstNode *id, const std::vector<AST::AstN
160160 int elem_size = 1 ;
161161 std::vector<int > single_elem_size;
162162 single_elem_size.push_back (elem_size);
163- for (size_t j = 1 ; j < wire_node->multirange_dimensions .size (); j = j + 2 ) {
164- elem_size *= wire_node->multirange_dimensions [j];
163+ for (size_t j = 0 ; (j + 1 ) < wire_node->multirange_dimensions .size (); j = j + 2 ) {
164+ elem_size *= wire_node->multirange_dimensions [j + 1 ] - wire_node-> multirange_dimensions [j ];
165165 single_elem_size.push_back (elem_size);
166166 }
167167 std::reverse (single_elem_size.begin (), single_elem_size.end ());
@@ -188,13 +188,16 @@ static AST::AstNode *convert_range(AST::AstNode *id, const std::vector<AST::AstN
188188 if (!wire_node->multirange_swapped .empty ()) {
189189 bool is_swapped = wire_node->multirange_swapped [wire_node->multirange_swapped .size () - i - 1 ];
190190 if (is_swapped) {
191+ auto left_idx = wire_node->multirange_dimensions .size () - (i * 2 ) - 1 ;
192+ auto right_idx = wire_node->multirange_dimensions .size () - (i * 2 ) - 2 ;
193+ auto elem_size = wire_node->multirange_dimensions [left_idx] - wire_node->multirange_dimensions [right_idx];
191194 range_left = new AST::AstNode (
192195 AST::AST_SUB,
193- AST::AstNode::mkconst_int (wire_node-> multirange_dimensions [wire_node-> multirange_dimensions . size () - (i * 2 ) - 1 ] - 1 , false ),
196+ AST::AstNode::mkconst_int (elem_size - 1 , false ),
194197 range_left->clone ());
195198 range_right = new AST::AstNode (
196199 AST::AST_SUB,
197- AST::AstNode::mkconst_int (wire_node-> multirange_dimensions [wire_node-> multirange_dimensions . size () - (i * 2 ) - 1 ] - 1 , false ),
200+ AST::AstNode::mkconst_int (elem_size - 1 , false ),
198201 range_right->clone ());
199202 }
200203 }
@@ -1591,6 +1594,11 @@ void UhdmAst::process_array_var()
15911594#else
15921595 visit_one_to_many ({vpiRange}, reg_h, [&](AST::AstNode *node) { current_node->children .push_back (node); });
15931596#endif
1597+ } else if (vpi_get (vpiType, reg_h) == vpiIntVar) {
1598+ #ifdef BUILD_UPSTREAM
1599+ packed_ranges.push_back (make_range (31 , 0 ));
1600+ #endif
1601+ visit_default_expr (reg_h);
15941602 }
15951603 vpi_release_handle (reg_h);
15961604 }
0 commit comments