From 48dc6ab98dbd74bd7eb00f14b4bd8429531166f3 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Sun, 15 Jun 2014 08:38:31 +0200 Subject: Improved AstNode::asReal for large integers --- frontends/ast/ast.cc | 21 ++++++++++++--------- frontends/ast/simplify.cc | 2 +- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/frontends/ast/ast.cc b/frontends/ast/ast.cc index 25ea3a824..cc7f442bb 100644 --- a/frontends/ast/ast.cc +++ b/frontends/ast/ast.cc @@ -775,17 +775,20 @@ int AstNode::isConst() double AstNode::asReal(bool is_signed) { if (type == AST_CONSTANT) { - RTLIL::Const val; - val.bits = bits; + RTLIL::Const val(bits); - double p = exp2(int(val.bits.size())-32); - if (val.bits.size() > 32) - val.bits.erase(val.bits.begin(), val.bits.begin()+(int(val.bits.size())-32)); - int32_t v = val.as_int() << (32-int(val.bits.size())); + bool is_negative = is_signed && val.bits.back() == RTLIL::State::S1; + if (is_negative) + val = const_neg(val, val, false, false, val.bits.size()); - if (is_signed) - return v * p; - return uint32_t(v) * p; + double v = 0; + for (size_t i = 0; i < val.bits.size(); i++) + if (val.bits.at(i) == RTLIL::State::S1) + v += exp2(i); + if (is_negative) + v *= -1; + + return v; } if (type == AST_REALVALUE) diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index ed5ee1721..80fd28d55 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -533,7 +533,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, if (children[0]->type == AST_REALVALUE) { RTLIL::Const constvalue = children[0]->realAsConst(width); log("Warning: converting real value %e to binary %s at %s:%d.\n", - realvalue, log_signal(constvalue), filename.c_str(), linenum); + children[0]->realvalue, log_signal(constvalue), filename.c_str(), linenum); delete children[0]; children[0] = mkconst_bits(constvalue.bits, sign_hint); did_something = true; -- cgit v1.2.3