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 | |
| parent | 11d2add1b9984a9dabe02e5073e09ca497024dd8 (diff) | |
| download | yosys-48dc6ab98dbd74bd7eb00f14b4bd8429531166f3.tar.gz yosys-48dc6ab98dbd74bd7eb00f14b4bd8429531166f3.tar.bz2 yosys-48dc6ab98dbd74bd7eb00f14b4bd8429531166f3.zip | |
Improved AstNode::asReal for large integers
| -rw-r--r-- | frontends/ast/ast.cc | 21 | ||||
| -rw-r--r-- | 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; | 
