diff options
Diffstat (limited to 'frontends/ast')
| -rw-r--r-- | frontends/ast/genrtlil.cc | 20 | ||||
| -rw-r--r-- | frontends/ast/simplify.cc | 28 | 
2 files changed, 39 insertions, 9 deletions
| diff --git a/frontends/ast/genrtlil.cc b/frontends/ast/genrtlil.cc index c0539252c..ab368fdb0 100644 --- a/frontends/ast/genrtlil.cc +++ b/frontends/ast/genrtlil.cc @@ -1326,20 +1326,25 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)  		{  			if (width_hint < 0)  				detectSignWidth(width_hint, sign_hint); +			is_signed = sign_hint;  			RTLIL::SigSpec cond = children[0]->genRTLIL();  			RTLIL::SigSpec sig; -			if (cond.is_fully_const()) { + +			if (cond.is_fully_def()) +			{  				if (cond.as_bool()) {  					sig = children[1]->genRTLIL(width_hint, sign_hint); -					widthExtend(this, sig, sig.size(), children[1]->is_signed); -				} -				else { +					log_assert(is_signed == children[1]->is_signed); +				} else {  					sig = children[2]->genRTLIL(width_hint, sign_hint); -					widthExtend(this, sig, sig.size(), children[2]->is_signed); +					log_assert(is_signed == children[2]->is_signed);  				} + +				widthExtend(this, sig, sig.size(), is_signed);  			} -			else { +			else +			{  				RTLIL::SigSpec val1 = children[1]->genRTLIL(width_hint, sign_hint);  				RTLIL::SigSpec val2 = children[2]->genRTLIL(width_hint, sign_hint); @@ -1347,7 +1352,8 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)  					cond = uniop2rtlil(this, ID($reduce_bool), 1, cond, false);  				int width = max(val1.size(), val2.size()); -				is_signed = children[1]->is_signed && children[2]->is_signed; +				log_assert(is_signed == children[1]->is_signed); +				log_assert(is_signed == children[2]->is_signed);  				widthExtend(this, val1, width, is_signed);  				widthExtend(this, val2, width, is_signed); diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index 5e7518f68..cb89f58ba 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -420,9 +420,10 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,  				current_scope[node->str] = node;  				for (auto enode : node->children) {  					log_assert(enode->type==AST_ENUM_ITEM); -					if (current_scope.count(enode->str) == 0) { +					if (current_scope.count(enode->str) == 0)  						current_scope[enode->str] = enode; -					} +					else +						log_file_error(filename, location.first_line, "enum item %s already exists\n", enode->str.c_str());  				}  			}  		} @@ -441,6 +442,29 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,  		}  	} +	// create name resolution entries for all objects with names +	if (type == AST_PACKAGE) { +		//add names to package scope +		for (size_t i = 0; i < children.size(); i++) { +			AstNode *node = children[i]; +			// these nodes appear at the top level in a package and can define names +			if (node->type == AST_PARAMETER || node->type == AST_LOCALPARAM || node->type == AST_TYPEDEF) { +				current_scope[node->str] = node; +			} +			if (node->type == AST_ENUM) { +				current_scope[node->str] = node; +				for (auto enode : node->children) { +					log_assert(enode->type==AST_ENUM_ITEM); +					if (current_scope.count(enode->str) == 0) +						current_scope[enode->str] = enode; +					else +						log_file_error(filename, location.first_line, "enum item %s already exists in package\n", enode->str.c_str()); +				} +			} +		} +	} + +  	auto backup_current_block = current_block;  	auto backup_current_block_child = current_block_child;  	auto backup_current_top_block = current_top_block; | 
