diff options
author | Clifford Wolf <clifford@clifford.at> | 2014-06-15 08:38:31 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2014-06-15 08:38:31 +0200 |
commit | 48dc6ab98dbd74bd7eb00f14b4bd8429531166f3 (patch) | |
tree | 064d1ca8b6b602fedcbffd9937cc93ec74de292c /frontends/ast/ast.cc | |
parent | 11d2add1b9984a9dabe02e5073e09ca497024dd8 (diff) | |
download | yosys-48dc6ab98dbd74bd7eb00f14b4bd8429531166f3.tar.gz yosys-48dc6ab98dbd74bd7eb00f14b4bd8429531166f3.tar.bz2 yosys-48dc6ab98dbd74bd7eb00f14b4bd8429531166f3.zip |
Improved AstNode::asReal for large integers
Diffstat (limited to 'frontends/ast/ast.cc')
-rw-r--r-- | frontends/ast/ast.cc | 21 |
1 files changed, 12 insertions, 9 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) |