From 5bfe865cec15c12e2a9e764a0a57c01f97f8235e Mon Sep 17 00:00:00 2001
From: Clifford Wolf <clifford@clifford.at>
Date: Mon, 16 Jun 2014 15:00:57 +0200
Subject: [PATCH] Added found_real feature to AstNode::detectSignWidth

---
 frontends/ast/ast.h       |  4 ++--
 frontends/ast/genrtlil.cc | 13 +++++++++----
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/frontends/ast/ast.h b/frontends/ast/ast.h
index 74a476b5e..f89af633e 100644
--- a/frontends/ast/ast.h
+++ b/frontends/ast/ast.h
@@ -214,8 +214,8 @@ namespace AST
 		void dumpVlog(FILE *f, std::string indent);
 
 		// used by genRTLIL() for detecting expression width and sign
-		void detectSignWidthWorker(int &width_hint, bool &sign_hint);
-		void detectSignWidth(int &width_hint, bool &sign_hint);
+		void detectSignWidthWorker(int &width_hint, bool &sign_hint, bool *found_real = NULL);
+		void detectSignWidth(int &width_hint, bool &sign_hint, bool *found_real = NULL);
 
 		// create RTLIL code for this AST node
 		// for expressions the resulting signal vector is returned
diff --git a/frontends/ast/genrtlil.cc b/frontends/ast/genrtlil.cc
index 8a57a0ee7..1f0ef4450 100644
--- a/frontends/ast/genrtlil.cc
+++ b/frontends/ast/genrtlil.cc
@@ -585,7 +585,7 @@ struct AST_INTERNAL::ProcessGenerator
 };
 
 // detect sign and width of an expression
-void AstNode::detectSignWidthWorker(int &width_hint, bool &sign_hint)
+void AstNode::detectSignWidthWorker(int &width_hint, bool &sign_hint, bool *found_real)
 {
 	std::string type_name;
 	bool sub_sign_hint = true;
@@ -603,6 +603,8 @@ void AstNode::detectSignWidthWorker(int &width_hint, bool &sign_hint)
 		break;
 
 	case AST_REALVALUE:
+		if (found_real)
+			*found_real = true;
 		width_hint = std::max(width_hint, 32);
 		break;
 
@@ -788,10 +790,13 @@ void AstNode::detectSignWidthWorker(int &width_hint, bool &sign_hint)
 }
 
 // detect sign and width of an expression
-void AstNode::detectSignWidth(int &width_hint, bool &sign_hint)
+void AstNode::detectSignWidth(int &width_hint, bool &sign_hint, bool *found_real)
 {
-	width_hint = -1, sign_hint = true;
-	detectSignWidthWorker(width_hint, sign_hint);
+	width_hint = -1;
+	sign_hint = true;
+	if (found_real)
+		*found_real = false;
+	detectSignWidthWorker(width_hint, sign_hint, found_real);
 }
 
 // create RTLIL from an AST node