3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2026-07-04 06:26:09 +00:00

Merge pull request #5887 from YosysHQ/nella/fix-signedness-4402

Fix: `read_verilog` doesn't respect `signed` keyword
This commit is contained in:
nella 2026-06-18 16:53:37 +00:00 committed by GitHub
commit 5d7486115a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 112 additions and 16 deletions

View file

@ -2619,21 +2619,27 @@ bool AstNode::simplify(bool const_fold, int stage, int width_hint, bool sign_hin
input_error("Right hand side of 1st expression of %s for-loop is not constant!\n", loop_type_str);
auto resolved = current_scope.at(init_ast->children[0]->str);
if (resolved->range_valid) {
int const_size = varbuf->range_left - varbuf->range_right;
int resolved_size = resolved->range_left - resolved->range_right;
if (const_size < resolved_size) {
for (int i = const_size; i < resolved_size; i++)
varbuf->bits.push_back(resolved->is_signed ? varbuf->bits.back() : State::S0);
varbuf->range_left = resolved->range_left;
varbuf->range_right = resolved->range_right;
varbuf->range_swapped = resolved->range_swapped;
varbuf->range_valid = resolved->range_valid;
auto apply_loop_var_type = [&resolved](std::unique_ptr<AstNode> &value) {
if (resolved->range_valid) {
int const_size = value->range_left - value->range_right;
int resolved_size = resolved->range_left - resolved->range_right;
if (const_size < resolved_size) {
for (int i = const_size; i < resolved_size; i++)
value->bits.push_back(resolved->is_signed ? value->bits.back() : State::S0);
value->range_left = resolved->range_left;
value->range_right = resolved->range_right;
value->range_swapped = resolved->range_swapped;
value->range_valid = resolved->range_valid;
}
}
}
value->is_signed = resolved->is_signed;
};
apply_loop_var_type(varbuf);
varbuf = std::make_unique<AstNode>(location, AST_LOCALPARAM, std::move(varbuf));
varbuf->str = init_ast->children[0]->str;
varbuf->is_signed = resolved->is_signed;
AstNode *backup_scope_varbuf = current_scope[varbuf->str];
current_scope[varbuf->str] = varbuf.get();
@ -2708,6 +2714,7 @@ bool AstNode::simplify(bool const_fold, int stage, int width_hint, bool sign_hin
if (buf->type != AST_CONSTANT)
input_error("Right hand side of 3rd expression of %s for-loop is not constant (%s)!\n", loop_type_str, type2str(buf->type));
apply_loop_var_type(buf);
varbuf->children[0] = std::move(buf);
}