mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Improved AstNode::asReal for large integers
This commit is contained in:
		
							parent
							
								
									11d2add1b9
								
							
						
					
					
						commit
						48dc6ab98d
					
				
					 2 changed files with 13 additions and 10 deletions
				
			
		|  | @ -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) | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue