diff options
| author | Clifford Wolf <clifford@clifford.at> | 2016-04-21 15:31:54 +0200 | 
|---|---|---|
| committer | Clifford Wolf <clifford@clifford.at> | 2016-04-21 15:31:54 +0200 | 
| commit | 5a09fa45535ffceae90359be727d2ff6e0ac2c58 (patch) | |
| tree | d41d328e4dcf94154bbbec0124a94b0d2f8f3894 /frontends/ast | |
| parent | f38ca3e18fb27472595d59be8c0cea7ef50b7c4c (diff) | |
| download | yosys-5a09fa45535ffceae90359be727d2ff6e0ac2c58.tar.gz yosys-5a09fa45535ffceae90359be727d2ff6e0ac2c58.tar.bz2 yosys-5a09fa45535ffceae90359be727d2ff6e0ac2c58.zip | |
Fixed handling of parameters and const functions in casex/casez pattern
Diffstat (limited to 'frontends/ast')
| -rw-r--r-- | frontends/ast/ast.cc | 11 | ||||
| -rw-r--r-- | frontends/ast/ast.h | 2 | ||||
| -rw-r--r-- | frontends/ast/genrtlil.cc | 6 | ||||
| -rw-r--r-- | frontends/ast/simplify.cc | 18 | 
4 files changed, 31 insertions, 6 deletions
| diff --git a/frontends/ast/ast.cc b/frontends/ast/ast.cc index 834ee82ab..c49f29ce7 100644 --- a/frontends/ast/ast.cc +++ b/frontends/ast/ast.cc @@ -146,6 +146,8 @@ std::string AST::type2str(AstNodeType type)  	X(AST_ASSIGN_LE)  	X(AST_CASE)  	X(AST_COND) +	X(AST_CONDX) +	X(AST_CONDZ)  	X(AST_DEFAULT)  	X(AST_FOR)  	X(AST_WHILE) @@ -501,7 +503,12 @@ void AstNode::dumpVlog(FILE *f, std::string indent)  		break;  	case AST_CASE: -		fprintf(f, "%s" "case (", indent.c_str()); +		if (!children.empty() && children[0]->type == AST_CONDX) +			fprintf(f, "%s" "casex (", indent.c_str()); +		else if (!children.empty() && children[0]->type == AST_CONDZ) +			fprintf(f, "%s" "casez (", indent.c_str()); +		else +			fprintf(f, "%s" "case (", indent.c_str());  		children[0]->dumpVlog(f, "");  		fprintf(f, ")\n");  		for (size_t i = 1; i < children.size(); i++) { @@ -512,6 +519,8 @@ void AstNode::dumpVlog(FILE *f, std::string indent)  		break;  	case AST_COND: +	case AST_CONDX: +	case AST_CONDZ:  		for (auto child : children) {  			if (child->type == AST_BLOCK) {  				fprintf(f, ":\n"); diff --git a/frontends/ast/ast.h b/frontends/ast/ast.h index b5349db5e..b4e58d79f 100644 --- a/frontends/ast/ast.h +++ b/frontends/ast/ast.h @@ -122,6 +122,8 @@ namespace AST  		AST_ASSIGN_LE,  		AST_CASE,  		AST_COND, +		AST_CONDX, +		AST_CONDZ,  		AST_DEFAULT,  		AST_FOR,  		AST_WHILE, diff --git a/frontends/ast/genrtlil.cc b/frontends/ast/genrtlil.cc index 9fc590376..173930a1b 100644 --- a/frontends/ast/genrtlil.cc +++ b/frontends/ast/genrtlil.cc @@ -338,12 +338,14 @@ struct AST_INTERNAL::ProcessGenerator  		case AST_CASE:  			for (auto child : ast->children)  				if (child != ast->children[0]) { -					log_assert(child->type == AST_COND); +					log_assert(child->type == AST_COND || child->type == AST_CONDX || child->type == AST_CONDZ);  					collect_lvalues(reg, child, type_eq, type_le, false);  				}  			break;  		case AST_COND: +		case AST_CONDX: +		case AST_CONDZ:  		case AST_ALWAYS:  		case AST_INITIAL:  			for (auto child : ast->children) @@ -467,7 +469,7 @@ struct AST_INTERNAL::ProcessGenerator  				{  					if (child == ast->children[0])  						continue; -					log_assert(child->type == AST_COND); +					log_assert(child->type == AST_COND || child->type == AST_CONDX || child->type == AST_CONDZ);  					subst_lvalue_map.save();  					subst_rvalue_map.save(); diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc index c56ac7d5f..e00087280 100644 --- a/frontends/ast/simplify.cc +++ b/frontends/ast/simplify.cc @@ -540,6 +540,18 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,  		}  	} +	if (type == AST_CONDX && children.size() > 0 && children.at(0)->type == AST_CONSTANT) { +		for (auto &bit : children.at(0)->bits) +			if (bit == State::Sz || bit == State::Sx) +				bit = State::Sa; +	} + +	if (type == AST_CONDZ && children.size() > 0 && children.at(0)->type == AST_CONSTANT) { +		for (auto &bit : children.at(0)->bits) +			if (bit == State::Sz) +				bit = State::Sa; +	} +  	if (const_fold && type == AST_CASE)  	{  		while (children[0]->simplify(const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param)) { } @@ -548,7 +560,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,  			new_children.push_back(children[0]);  			for (int i = 1; i < GetSize(children); i++) {  				AstNode *child = children[i]; -				log_assert(child->type == AST_COND); +				log_assert(child->type == AST_COND || child->type == AST_CONDX || child->type == AST_CONDZ);  				for (auto v : child->children) {  					if (v->type == AST_DEFAULT)  						goto keep_const_cond; @@ -1125,7 +1137,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,  		AstNode *selected_case = NULL;  		for (size_t i = 1; i < children.size(); i++)  		{ -			log_assert(children.at(i)->type == AST_COND); +			log_assert(children.at(i)->type == AST_COND || children.at(i)->type == AST_CONDX || children.at(i)->type == AST_CONDZ);  			AstNode *this_genblock = NULL;  			for (auto child : children.at(i)->children) { @@ -2984,7 +2996,7 @@ AstNode *AstNode::eval_const_function(AstNode *fcall)  			for (size_t i = 1; i < stmt->children.size(); i++)  			{  				bool found_match = false; -				log_assert(stmt->children.at(i)->type == AST_COND); +				log_assert(stmt->children.at(i)->type == AST_COND || stmt->children.at(i)->type == AST_CONDX || stmt->children.at(i)->type == AST_CONDZ);  				if (stmt->children.at(i)->children.front()->type == AST_DEFAULT) {  					sel_case = stmt->children.at(i)->children.back(); | 
