From 52baeaef74739d7d3f8910b5c50b815483397841 Mon Sep 17 00:00:00 2001 From: nella Date: Tue, 12 May 2026 15:53:14 +0200 Subject: [PATCH] Fixup sign. --- frontends/ast/ast.cc | 5 +---- passes/cmds/setattr.cc | 7 +++++++ passes/hierarchy/hierarchy.cc | 20 ++++++++++++++++++-- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/frontends/ast/ast.cc b/frontends/ast/ast.cc index 979ff9f1e..50271bc91 100644 --- a/frontends/ast/ast.cc +++ b/frontends/ast/ast.cc @@ -1876,10 +1876,7 @@ std::string AstModule::derive_common(RTLIL::Design *design, const dictsecond.flags & RTLIL::CONST_FLAG_STRING) != 0) child->children[0] = AstNode::mkconst_str(loc, it->second.decode_string()); else { - bool is_signed = child->is_signed; - if (!is_signed && !child->children.empty() && child->children[0] && child->children[0]->type == AST_CONSTANT) - is_signed = child->children[0]->is_signed; - is_signed = is_signed || ((it->second.flags & RTLIL::CONST_FLAG_SIGNED) != 0); + bool is_signed = child->is_signed || ((it->second.flags & RTLIL::CONST_FLAG_SIGNED) != 0); child->children[0] = AstNode::mkconst_bits(loc, it->second.to_bits(), is_signed, (it->second.flags & RTLIL::CONST_FLAG_UNSIZED) != 0); } rewritten.insert(it->first); diff --git a/passes/cmds/setattr.cc b/passes/cmds/setattr.cc index 25d8fd34c..6b30deb00 100644 --- a/passes/cmds/setattr.cc +++ b/passes/cmds/setattr.cc @@ -41,6 +41,13 @@ struct setunset_t if (!RTLIL::SigSpec::parse(sig_value, nullptr, set_value)) log_cmd_error("Can't decode value '%s'!\n", set_value); value = sig_value.as_const(); + + if (!set_value.empty() && set_value.find('\'') == std::string::npos) { + size_t start = (set_value[0] == '-' || set_value[0] == '+') ? 1 : 0; + if (start < set_value.size() && std::all_of(set_value.begin() + start, set_value.end(), ::isdigit)) { + value.flags |= RTLIL::CONST_FLAG_SIGNED; + } + } } } }; diff --git a/passes/hierarchy/hierarchy.cc b/passes/hierarchy/hierarchy.cc index 416997bee..b81255305 100644 --- a/passes/hierarchy/hierarchy.cc +++ b/passes/hierarchy/hierarchy.cc @@ -985,7 +985,15 @@ struct HierarchyPass : public Pass { SigSpec sig_value; if (!RTLIL::SigSpec::parse(sig_value, NULL, para.second)) log_cmd_error("Can't decode value '%s'!\n", para.second); - top_parameters[RTLIL::escape_id(para.first)] = sig_value.as_const(); + RTLIL::Const c = sig_value.as_const(); + + if (!para.second.empty() && para.second.find('\'') == std::string::npos) { + size_t start = (para.second[0] == '-' || para.second[0] == '+') ? 1 : 0; + if (start < para.second.size() && std::all_of(para.second.begin() + start, para.second.end(), ::isdigit)) + c.flags |= RTLIL::CONST_FLAG_SIGNED; + } + + top_parameters[RTLIL::escape_id(para.first)] = c; } } @@ -1073,7 +1081,15 @@ struct HierarchyPass : public Pass { SigSpec sig_value; if (!RTLIL::SigSpec::parse(sig_value, NULL, para.second)) log_cmd_error("Can't decode value '%s'!\n", para.second); - top_parameters[RTLIL::escape_id(para.first)] = sig_value.as_const(); + RTLIL::Const c = sig_value.as_const(); + + if (!para.second.empty() && para.second.find('\'') == std::string::npos) { + size_t start = (para.second[0] == '-' || para.second[0] == '+') ? 1 : 0; + if (start < para.second.size() && std::all_of(para.second.begin() + start, para.second.end(), ::isdigit)) + c.flags |= RTLIL::CONST_FLAG_SIGNED; + } + + top_parameters[RTLIL::escape_id(para.first)] = c; } top_mod = design->module(top_mod->derive(design, top_parameters));