diff options
Diffstat (limited to 'frontends/ast')
| -rw-r--r-- | frontends/ast/ast.cc | 17 | ||||
| -rw-r--r-- | frontends/ast/ast.h | 4 | ||||
| -rw-r--r-- | frontends/ast/genrtlil.cc | 9 | 
3 files changed, 26 insertions, 4 deletions
| diff --git a/frontends/ast/ast.cc b/frontends/ast/ast.cc index 5623541b2..29e175c15 100644 --- a/frontends/ast/ast.cc +++ b/frontends/ast/ast.cc @@ -194,6 +194,7 @@ AstNode::AstNode(AstNodeType type, AstNode *child1, AstNode *child2, AstNode *ch  	is_logic = false;  	is_signed = false;  	is_string = false; +	is_unsized = false;  	was_checked = false;  	range_valid = false;  	range_swapped = false; @@ -722,7 +723,7 @@ AstNode *AstNode::mkconst_int(uint32_t v, bool is_signed, int width)  }  // create an AST node for a constant (using a bit vector as value) -AstNode *AstNode::mkconst_bits(const std::vector<RTLIL::State> &v, bool is_signed) +AstNode *AstNode::mkconst_bits(const std::vector<RTLIL::State> &v, bool is_signed, bool is_unsized)  {  	AstNode *node = new AstNode(AST_CONSTANT);  	node->is_signed = is_signed; @@ -736,9 +737,15 @@ AstNode *AstNode::mkconst_bits(const std::vector<RTLIL::State> &v, bool is_signe  	node->range_valid = true;  	node->range_left = node->bits.size()-1;  	node->range_right = 0; +	node->is_unsized = is_unsized;  	return node;  } +AstNode *AstNode::mkconst_bits(const std::vector<RTLIL::State> &v, bool is_signed) +{ +	return mkconst_bits(v, is_signed, false); +} +  // create an AST node for a constant (using a string in bit vector form as value)  AstNode *AstNode::mkconst_str(const std::vector<RTLIL::State> &v)  { @@ -775,6 +782,14 @@ bool AstNode::bits_only_01() const  	return true;  } +RTLIL::Const AstNode::bitsAsUnsizedConst(int width) +{ +	RTLIL::State extbit = bits.back(); +	while (width > int(bits.size())) +		bits.push_back(extbit); +	return RTLIL::Const(bits); +} +  RTLIL::Const AstNode::bitsAsConst(int width, bool is_signed)  {  	std::vector<RTLIL::State> bits = this->bits; diff --git a/frontends/ast/ast.h b/frontends/ast/ast.h index 281cbe086..f90e683ad 100644 --- a/frontends/ast/ast.h +++ b/frontends/ast/ast.h @@ -173,7 +173,7 @@ namespace AST  		// node content - most of it is unused in most node types  		std::string str;  		std::vector<RTLIL::State> bits; -		bool is_input, is_output, is_reg, is_logic, is_signed, is_string, range_valid, range_swapped, was_checked; +		bool is_input, is_output, is_reg, is_logic, is_signed, is_string, range_valid, range_swapped, was_checked, is_unsized;  		int port_id, range_left, range_right;  		uint32_t integer;  		double realvalue; @@ -262,6 +262,7 @@ namespace AST  		// helper functions for creating AST nodes for constants  		static AstNode *mkconst_int(uint32_t v, bool is_signed, int width = 32); +		static AstNode *mkconst_bits(const std::vector<RTLIL::State> &v, bool is_signed, bool is_unsized);  		static AstNode *mkconst_bits(const std::vector<RTLIL::State> &v, bool is_signed);  		static AstNode *mkconst_str(const std::vector<RTLIL::State> &v);  		static AstNode *mkconst_str(const std::string &str); @@ -269,6 +270,7 @@ namespace AST  		// helper function for creating sign-extended const objects  		RTLIL::Const bitsAsConst(int width, bool is_signed);  		RTLIL::Const bitsAsConst(int width = -1); +		RTLIL::Const bitsAsUnsizedConst(int width);  		RTLIL::Const asAttrConst();  		RTLIL::Const asParaConst();  		uint64_t asInt(bool is_signed); diff --git a/frontends/ast/genrtlil.cc b/frontends/ast/genrtlil.cc index 379fed641..d9dfc17cc 100644 --- a/frontends/ast/genrtlil.cc +++ b/frontends/ast/genrtlil.cc @@ -963,8 +963,13 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)  				detectSignWidth(width_hint, sign_hint);  			is_signed = sign_hint; -			if (type == AST_CONSTANT) -				return RTLIL::SigSpec(bitsAsConst()); +			if (type == AST_CONSTANT) { +				if (is_unsized) { +					return RTLIL::SigSpec(bitsAsUnsizedConst(width_hint)); +				} else { +					return RTLIL::SigSpec(bitsAsConst()); +				} +			}  			RTLIL::SigSpec sig = realAsConst(width_hint);  			log_file_warning(filename, linenum, "converting real value %e to binary %s.\n", realvalue, log_signal(sig)); | 
