mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	assert feature
This commit is contained in:
		
							parent
							
								
									b7adf4c7a0
								
							
						
					
					
						commit
						c347f2825f
					
				
					 1 changed files with 40 additions and 9 deletions
				
			
		| 
						 | 
					@ -96,13 +96,16 @@ struct BtorDumper
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		curr_cell.clear();
 | 
							curr_cell.clear();
 | 
				
			||||||
		cell_type_translation = { 
 | 
							cell_type_translation = { 
 | 
				
			||||||
 | 
										//assert
 | 
				
			||||||
 | 
										{"$assert","root"},					
 | 
				
			||||||
					//unary
 | 
										//unary
 | 
				
			||||||
					{"$not","not"},{"$neg","neg"},{"$reduce_and","redand"},
 | 
										{"$not","not"},{"$neg","neg"},{"$reduce_and","redand"},
 | 
				
			||||||
					{"$reduce_or","redor"},{"$reduce_xor","redxor"},{"$reduce_bool","redor"},
 | 
										{"$reduce_or","redor"},{"$reduce_xor","redxor"},{"$reduce_bool","redor"},
 | 
				
			||||||
					//binary
 | 
										//binary
 | 
				
			||||||
					{"$and","and"},{"$or","or"},{"$xor","xor"},{"$xnor","xnor"},
 | 
										{"$and","and"},{"$or","or"},{"$xor","xor"},{"$xnor","xnor"},
 | 
				
			||||||
					{"$shr","srl"},{"$shl","sll"},{"$sshr","sra"},{"$sshl","sll"},
 | 
										{"$shr","srl"},{"$shl","sll"},{"$sshr","sra"},{"$sshl","sll"},
 | 
				
			||||||
					{"$lt","ult"},{"$le","ulte"},{"$eq","eq"},{"$ne","ne"},{"$gt","ugt"},{"$ge","ugte"},
 | 
										{"$lt","ult"},{"$le","ulte"},{"$gt","ugt"},{"$ge","ugte"},
 | 
				
			||||||
 | 
										{"$eq","eq"},{"$eqx","eq"},{"$ne","ne"},{"$nex","ne"},
 | 
				
			||||||
					{"$add","add"},{"$sub","sub"},{"$mul","mul"},{"$mod","urem"},{"$div","udiv"},
 | 
										{"$add","add"},{"$sub","sub"},{"$mul","mul"},{"$mod","urem"},{"$div","udiv"},
 | 
				
			||||||
					//mux
 | 
										//mux
 | 
				
			||||||
					{"$mux","cond"},
 | 
										{"$mux","cond"},
 | 
				
			||||||
| 
						 | 
					@ -365,6 +368,31 @@ struct BtorDumper
 | 
				
			||||||
		if(it==std::end(line_ref))
 | 
							if(it==std::end(line_ref))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			curr_cell = cell->name;
 | 
								curr_cell = cell->name;
 | 
				
			||||||
 | 
								//assert cell
 | 
				
			||||||
 | 
								if(cell->type == "$assert")
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									log("writing assert cell - %s\n", cstr(cell->type));
 | 
				
			||||||
 | 
									const RTLIL::SigSpec* expr = &cell->connections.at(RTLIL::IdString("\\A"));
 | 
				
			||||||
 | 
									const RTLIL::SigSpec* en = &cell->connections.at(RTLIL::IdString("\\EN"));
 | 
				
			||||||
 | 
									assert(expr->width == 1);
 | 
				
			||||||
 | 
									assert(en->width == 1);
 | 
				
			||||||
 | 
									int expr_line = dump_sigspec(expr, 1);
 | 
				
			||||||
 | 
									int en_line = dump_sigspec(en, 1);
 | 
				
			||||||
 | 
									int one_line = ++line_num;
 | 
				
			||||||
 | 
									str = stringf("%d one 1", line_num);
 | 
				
			||||||
 | 
									fprintf(f, "%s\n", str.c_str());
 | 
				
			||||||
 | 
									++line_num;
 | 
				
			||||||
 | 
									str = stringf("%d %s %d %d %d", line_num, cell_type_translation.at("$eq").c_str(), 1, en_line, one_line);
 | 
				
			||||||
 | 
									fprintf(f, "%s\n", str.c_str());
 | 
				
			||||||
 | 
									++line_num;
 | 
				
			||||||
 | 
									str = stringf("%d %s %d %d %d %d", line_num, cell_type_translation.at("$mux").c_str(), 1, line_num-1,
 | 
				
			||||||
 | 
										expr_line, one_line);
 | 
				
			||||||
 | 
									fprintf(f, "%s\n", str.c_str());
 | 
				
			||||||
 | 
									int cell_line = ++line_num;
 | 
				
			||||||
 | 
									str = stringf("%d %s %d %d", line_num, cell_type_translation.at("$assert").c_str(), 1, line_num-1);
 | 
				
			||||||
 | 
									fprintf(f, "%s\n", str.c_str());
 | 
				
			||||||
 | 
									line_ref[cell->name]=cell_line;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			//unary cells
 | 
								//unary cells
 | 
				
			||||||
			if(cell->type == "$not" || cell->type == "$neg" || cell->type == "$pos" || cell->type == "$reduce_and" ||
 | 
								if(cell->type == "$not" || cell->type == "$neg" || cell->type == "$pos" || cell->type == "$reduce_and" ||
 | 
				
			||||||
				cell->type == "$reduce_or" || cell->type == "$reduce_xor" || cell->type == "$reduce_bool")
 | 
									cell->type == "$reduce_or" || cell->type == "$reduce_xor" || cell->type == "$reduce_bool")
 | 
				
			||||||
| 
						 | 
					@ -417,12 +445,13 @@ struct BtorDumper
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			//binary cells
 | 
								//binary cells
 | 
				
			||||||
			else if(cell->type == "$and" || cell->type == "$or" || cell->type == "$xor" || cell->type == "$xnor" ||
 | 
								else if(cell->type == "$and" || cell->type == "$or" || cell->type == "$xor" || cell->type == "$xnor" ||
 | 
				
			||||||
				 cell->type == "$lt" || cell->type == "$le" || cell->type == "$eq" || 
 | 
									 cell->type == "$lt" || cell->type == "$le" || cell->type == "$eq" || cell->type == "$ne" || 
 | 
				
			||||||
				 cell->type == "$ne" || cell->type == "$ge" || cell->type == "$gt" )
 | 
									 cell->type == "$eqx" || cell->type == "$nex" || cell->type == "$ge" || cell->type == "$gt" )
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				log("writing binary cell - %s\n", cstr(cell->type));
 | 
									log("writing binary cell - %s\n", cstr(cell->type));
 | 
				
			||||||
				int output_width = cell->parameters.at(RTLIL::IdString("\\Y_WIDTH")).as_int();
 | 
									int output_width = cell->parameters.at(RTLIL::IdString("\\Y_WIDTH")).as_int();
 | 
				
			||||||
				assert(!(cell->type == "$eq" || cell->type == "$ne" || cell->type == "$ge" || cell->type == "$gt") || output_width == 1);
 | 
									assert(!(cell->type == "$eq" || cell->type == "$ne" || cell->type == "$eqx" || cell->type == "$nex" ||
 | 
				
			||||||
 | 
										cell->type == "$ge" || cell->type == "$gt") || output_width == 1);
 | 
				
			||||||
				bool l1_signed = cell->parameters.at(RTLIL::IdString("\\A_SIGNED")).as_bool();
 | 
									bool l1_signed = cell->parameters.at(RTLIL::IdString("\\A_SIGNED")).as_bool();
 | 
				
			||||||
				bool l2_signed = cell->parameters.at(RTLIL::IdString("\\B_SIGNED")).as_bool();
 | 
									bool l2_signed = cell->parameters.at(RTLIL::IdString("\\B_SIGNED")).as_bool();
 | 
				
			||||||
				int l1_width = cell->parameters.at(RTLIL::IdString("\\A_WIDTH")).as_int();
 | 
									int l1_width = cell->parameters.at(RTLIL::IdString("\\A_WIDTH")).as_int();
 | 
				
			||||||
| 
						 | 
					@ -439,7 +468,8 @@ struct BtorDumper
 | 
				
			||||||
				++line_num;
 | 
									++line_num;
 | 
				
			||||||
				std::string op = cell_type_translation.at(cell->type);
 | 
									std::string op = cell_type_translation.at(cell->type);
 | 
				
			||||||
				if(cell->type == "$lt" || cell->type == "$le" ||
 | 
									if(cell->type == "$lt" || cell->type == "$le" ||
 | 
				
			||||||
				 cell->type == "$eq" || cell->type == "$ne" || cell->type == "$ge" || cell->type == "$gt")
 | 
									 cell->type == "$eq" || cell->type == "$ne" || cell->type == "$eqx" || cell->type == "$nex" ||
 | 
				
			||||||
 | 
									 cell->type == "$ge" || cell->type == "$gt")
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					if(l1_signed)
 | 
										if(l1_signed)
 | 
				
			||||||
						op = s_cell_type_translation.at(cell->type);
 | 
											op = s_cell_type_translation.at(cell->type);
 | 
				
			||||||
| 
						 | 
					@ -717,7 +747,7 @@ struct BtorDumper
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			output_sig = &cell->connections.at(RTLIL::IdString("\\DATA"));
 | 
								output_sig = &cell->connections.at(RTLIL::IdString("\\DATA"));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else if(cell->type == "$memwr")
 | 
							else if(cell->type == "$memwr" || cell->type == "$assert")
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			//no output
 | 
								//no output
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -884,8 +914,9 @@ struct BtorBackend : public Backend {
 | 
				
			||||||
					top_module_name = mod_it.first;
 | 
										top_module_name = mod_it.first;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		fprintf(f, "; Generated by %s\n", yosys_version_str);
 | 
							fprintf(f, "; Generated by %s\n", yosys_version_str);
 | 
				
			||||||
		fprintf(f, "; BTOR Backend developed by Ahmed Irfan <irfan@fbk.eu>\n");
 | 
							fprintf(f, ";  %s developed and maintained by Clifford Wolf <clifford@clifford.at>\n", yosys_version_str);
 | 
				
			||||||
		fprintf(f, ";  at Fondazione Bruno Kessler, Trento, Italy\n");
 | 
							fprintf(f, "; BTOR Backend developed by Ahmed Irfan <irfan@fbk.eu> - Fondazione Bruno Kessler, Trento, Italy\n");
 | 
				
			||||||
 | 
							fprintf(f, ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n");
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		std::vector<RTLIL::Module*> mod_list;
 | 
							std::vector<RTLIL::Module*> mod_list;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue