Skip to content

Commit 3aefa9a

Browse files
committed
Add support for accessing multiranges not starting with 0
Signed-off-by: Kamil Rakoczy <[email protected]>
1 parent 666195e commit 3aefa9a

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

uhdm-plugin/UhdmAst.cc

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)