summaryrefslogtreecommitdiff
path: root/frontends
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2014-06-15 08:38:31 +0200
committerClifford Wolf <clifford@clifford.at>2014-06-15 08:38:31 +0200
commit48dc6ab98dbd74bd7eb00f14b4bd8429531166f3 (patch)
tree064d1ca8b6b602fedcbffd9937cc93ec74de292c /frontends
parent11d2add1b9984a9dabe02e5073e09ca497024dd8 (diff)
Improved AstNode::asReal for large integers
Diffstat (limited to 'frontends')
-rw-r--r--frontends/ast/ast.cc21
-rw-r--r--frontends/ast/simplify.cc2
2 files changed, 13 insertions, 10 deletions
diff --git a/frontends/ast/ast.cc b/frontends/ast/ast.cc
index 25ea3a82..cc7f442b 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 ed5ee172..80fd28d5 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;