mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Added support for bufif0/bufif1 primitives
This commit is contained in:
		
							parent
							
								
									4214561890
								
							
						
					
					
						commit
						8656b1c08f
					
				
					 2 changed files with 57 additions and 31 deletions
				
			
		|  | @ -498,39 +498,65 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage) | ||||||
| 		} | 		} | ||||||
| 		children.clear(); | 		children.clear(); | ||||||
| 
 | 
 | ||||||
| 		AstNodeType op_type = AST_NONE; | 		if (str == "bufif0" || str == "bufif1") | ||||||
| 		bool invert_results = false; | 		{ | ||||||
|  | 			if (children_list.size() != 3) | ||||||
|  | 				log_error("Invalid number of arguments for primitive `%s' at %s:%d!\n", | ||||||
|  | 						str.c_str(), filename.c_str(), linenum); | ||||||
| 
 | 
 | ||||||
| 		if (str == "and") | 			std::vector<RTLIL::State> z_const(1, RTLIL::State::Sz); | ||||||
| 			op_type = AST_BIT_AND; |  | ||||||
| 		if (str == "nand") |  | ||||||
| 			op_type = AST_BIT_AND, invert_results = true; |  | ||||||
| 		if (str == "or") |  | ||||||
| 			op_type = AST_BIT_OR; |  | ||||||
| 		if (str == "nor") |  | ||||||
| 			op_type = AST_BIT_OR, invert_results = true; |  | ||||||
| 		if (str == "xor") |  | ||||||
| 			op_type = AST_BIT_XOR; |  | ||||||
| 		if (str == "xnor") |  | ||||||
| 			op_type = AST_BIT_XOR, invert_results = true; |  | ||||||
| 		if (str == "buf") |  | ||||||
| 			op_type = AST_POS; |  | ||||||
| 		if (str == "not") |  | ||||||
| 			op_type = AST_POS, invert_results = true; |  | ||||||
| 		assert(op_type != AST_NONE); |  | ||||||
| 
 | 
 | ||||||
| 		AstNode *node = children_list[1]; | 			AstNode *node = new AstNode(AST_TERNARY, children_list.at(2)); | ||||||
| 		if (op_type != AST_POS) | 			if (str == "bufif0") { | ||||||
| 			for (size_t i = 2; i < children_list.size(); i++) | 				node->children.push_back(AstNode::mkconst_bits(z_const, false)); | ||||||
| 				node = new AstNode(op_type, node, children_list[i]); | 				node->children.push_back(children_list.at(1)); | ||||||
| 		if (invert_results) | 			} else { | ||||||
| 			node = new AstNode(AST_BIT_NOT, node); | 				node->children.push_back(children_list.at(1)); | ||||||
|  | 				node->children.push_back(AstNode::mkconst_bits(z_const, false)); | ||||||
|  | 			} | ||||||
| 
 | 
 | ||||||
| 		str.clear(); | 			str.clear(); | ||||||
| 		type = AST_ASSIGN; | 			type = AST_ASSIGN; | ||||||
| 		children.push_back(children_list[0]); | 			children.push_back(children_list.at(0)); | ||||||
| 		children.push_back(node); | 			children.push_back(node); | ||||||
| 		did_something = true; | 			did_something = true; | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			AstNodeType op_type = AST_NONE; | ||||||
|  | 			bool invert_results = false; | ||||||
|  | 
 | ||||||
|  | 			if (str == "and") | ||||||
|  | 				op_type = AST_BIT_AND; | ||||||
|  | 			if (str == "nand") | ||||||
|  | 				op_type = AST_BIT_AND, invert_results = true; | ||||||
|  | 			if (str == "or") | ||||||
|  | 				op_type = AST_BIT_OR; | ||||||
|  | 			if (str == "nor") | ||||||
|  | 				op_type = AST_BIT_OR, invert_results = true; | ||||||
|  | 			if (str == "xor") | ||||||
|  | 				op_type = AST_BIT_XOR; | ||||||
|  | 			if (str == "xnor") | ||||||
|  | 				op_type = AST_BIT_XOR, invert_results = true; | ||||||
|  | 			if (str == "buf") | ||||||
|  | 				op_type = AST_POS; | ||||||
|  | 			if (str == "not") | ||||||
|  | 				op_type = AST_POS, invert_results = true; | ||||||
|  | 			assert(op_type != AST_NONE); | ||||||
|  | 
 | ||||||
|  | 			AstNode *node = children_list[1]; | ||||||
|  | 			if (op_type != AST_POS) | ||||||
|  | 				for (size_t i = 2; i < children_list.size(); i++) | ||||||
|  | 					node = new AstNode(op_type, node, children_list[i]); | ||||||
|  | 			if (invert_results) | ||||||
|  | 				node = new AstNode(AST_BIT_NOT, node); | ||||||
|  | 
 | ||||||
|  | 			str.clear(); | ||||||
|  | 			type = AST_ASSIGN; | ||||||
|  | 			children.push_back(children_list[0]); | ||||||
|  | 			children.push_back(node); | ||||||
|  | 			did_something = true; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// replace dynamic ranges in left-hand side expressions (e.g. "foo[bar] <= 1'b1;") with
 | 	// replace dynamic ranges in left-hand side expressions (e.g. "foo[bar] <= 1'b1;") with
 | ||||||
|  |  | ||||||
|  | @ -169,7 +169,7 @@ namespace VERILOG_FRONTEND { | ||||||
| } | } | ||||||
| <STRING>.	{ yymore(); } | <STRING>.	{ yymore(); } | ||||||
| 
 | 
 | ||||||
| and|nand|or|nor|xor|xnor|not|buf { | and|nand|or|nor|xor|xnor|not|buf|bufif0|bufif1 { | ||||||
| 	frontend_verilog_yylval.string = new std::string(yytext); | 	frontend_verilog_yylval.string = new std::string(yytext); | ||||||
| 	return TOK_PRIMITIVE; | 	return TOK_PRIMITIVE; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue