mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 19:52:31 +00:00 
			
		
		
		
	Generalize muxadd to muxorder
This commit is contained in:
		
							parent
							
								
									2749b6f31b
								
							
						
					
					
						commit
						fa97c4830e
					
				
					 5 changed files with 171 additions and 154 deletions
				
			
		|  | @ -32,7 +32,7 @@ PEEPOPT_PATTERN += passes/opt/peepopt_shiftmul_left.pmg | ||||||
| PEEPOPT_PATTERN += passes/opt/peepopt_shiftadd.pmg | PEEPOPT_PATTERN += passes/opt/peepopt_shiftadd.pmg | ||||||
| PEEPOPT_PATTERN += passes/opt/peepopt_muldiv.pmg | PEEPOPT_PATTERN += passes/opt/peepopt_muldiv.pmg | ||||||
| PEEPOPT_PATTERN += passes/opt/peepopt_muldiv_c.pmg | PEEPOPT_PATTERN += passes/opt/peepopt_muldiv_c.pmg | ||||||
| PEEPOPT_PATTERN += passes/opt/peepopt_muxadd.pmg | PEEPOPT_PATTERN += passes/opt/peepopt_muxorder.pmg | ||||||
| PEEPOPT_PATTERN += passes/opt/peepopt_formal_clockgateff.pmg | PEEPOPT_PATTERN += passes/opt/peepopt_formal_clockgateff.pmg | ||||||
| 
 | 
 | ||||||
| passes/opt/peepopt_pm.h: passes/pmgen/pmgen.py $(PEEPOPT_PATTERN) | passes/opt/peepopt_pm.h: passes/pmgen/pmgen.py $(PEEPOPT_PATTERN) | ||||||
|  |  | ||||||
|  | @ -68,9 +68,11 @@ struct PeepoptPass : public Pass { | ||||||
| 		log("                   based pattern to prevent combinational paths from the\n"); | 		log("                   based pattern to prevent combinational paths from the\n"); | ||||||
| 		log("                   output to the enable input after running clk2fflogic.\n"); | 		log("                   output to the enable input after running clk2fflogic.\n"); | ||||||
| 		log("\n"); | 		log("\n"); | ||||||
| 		log("If -withmuxadd is specified it adds the following rule:\n"); | 		log("If -muxorder is specified it adds the following rule:\n"); | ||||||
| 		log("\n"); | 		log("\n"); | ||||||
| 		log("   * muxadd - Replace S?(A+B):A with A+(S?B:0)\n"); | 		log("   * muxorder - Replace S?(A OP B):A with A OP (S?B:I) where I is identity of OP\n"); | ||||||
|  | 		log("                Ex 1:   S?(A + B):A   --->   A + (S?B:0)\n"); | ||||||
|  | 		log("                Ex 2:   S?(A * B):A   --->   A & (S?B:1)\n"); | ||||||
| 		log("\n"); | 		log("\n"); | ||||||
| 	} | 	} | ||||||
| 	void execute(std::vector<std::string> args, RTLIL::Design *design) override | 	void execute(std::vector<std::string> args, RTLIL::Design *design) override | ||||||
|  | @ -78,7 +80,7 @@ struct PeepoptPass : public Pass { | ||||||
| 		log_header(design, "Executing PEEPOPT pass (run peephole optimizers).\n"); | 		log_header(design, "Executing PEEPOPT pass (run peephole optimizers).\n"); | ||||||
| 
 | 
 | ||||||
| 		bool formalclk = false; | 		bool formalclk = false; | ||||||
| 		bool withmuxadd = false; | 		bool muxorder = false; | ||||||
| 		size_t argidx; | 		size_t argidx; | ||||||
| 		for (argidx = 1; argidx < args.size(); argidx++) | 		for (argidx = 1; argidx < args.size(); argidx++) | ||||||
| 		{ | 		{ | ||||||
|  | @ -86,8 +88,8 @@ struct PeepoptPass : public Pass { | ||||||
| 				formalclk = true; | 				formalclk = true; | ||||||
| 				continue; | 				continue; | ||||||
| 			} | 			} | ||||||
| 			if (args[argidx] == "-withmuxadd") { | 			if (args[argidx] == "-muxorder") { | ||||||
| 				withmuxadd = true; | 				muxorder = true; | ||||||
| 				continue; | 				continue; | ||||||
| 			} | 			} | ||||||
| 			break; | 			break; | ||||||
|  | @ -119,8 +121,8 @@ struct PeepoptPass : public Pass { | ||||||
| 					pm.run_shiftmul_left(); | 					pm.run_shiftmul_left(); | ||||||
| 					pm.run_muldiv(); | 					pm.run_muldiv(); | ||||||
| 					pm.run_muldiv_c(); | 					pm.run_muldiv_c(); | ||||||
| 					if (withmuxadd) | 					if (muxorder) | ||||||
| 						pm.run_muxadd(); | 						pm.run_muxorder(); | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -1,128 +0,0 @@ | ||||||
| pattern muxadd |  | ||||||
| // |  | ||||||
| // Authored by Akash Levy and Alain Dargelas of Silimate, Inc. under ISC license. |  | ||||||
| // Transforms add->mux into mux->add: |  | ||||||
| // y = s ? (a + b) : a   ===>   y = a + (s ? b : 0) |  | ||||||
| // or |  | ||||||
| // y = s ? a : (a + b)   ===>   y = a + (s ? 0 : b) |  | ||||||
| 
 |  | ||||||
| state <SigSpec> add_a add_b add_y add_a_ext mux_a mux_b mux_y |  | ||||||
| state <Const> add_a_signed |  | ||||||
| state <IdString> add_a_id add_b_id mux_a_id mux_b_id |  | ||||||
| 
 |  | ||||||
| match add |  | ||||||
| 	// Select adder |  | ||||||
| 	select add->type == $add |  | ||||||
| 
 |  | ||||||
| 	// Set ports, allowing A and B to be swapped |  | ||||||
| 	choice <IdString> A {\A, \B} |  | ||||||
| 	define <IdString> B (A == \A ? \B : \A) |  | ||||||
| 	set add_a port(add, A) |  | ||||||
| 	set add_b port(add, B) |  | ||||||
| 	set add_y port(add, \Y) |  | ||||||
| 
 |  | ||||||
| 	// Get signedness |  | ||||||
| 	set add_a_signed param(add, (A == \A) ? \A_SIGNED : \B_SIGNED) |  | ||||||
| 
 |  | ||||||
| 	// Choice ids |  | ||||||
| 	set add_a_id A |  | ||||||
| 	set add_b_id B |  | ||||||
| endmatch |  | ||||||
| 
 |  | ||||||
| code add_y add_a add_b add_a_ext |  | ||||||
| 	// Get adder signals |  | ||||||
| 	add_a_ext = SigSpec(port(add, add_a_id)); |  | ||||||
| 	add_a_ext.extend_u0(GetSize(add_y), add_a_signed.as_bool()); |  | ||||||
| 
 |  | ||||||
| 	// Fanout of each adder Y bit should be 1 (no bit-split) |  | ||||||
| 	if (nusers(add_y) != 2) |  | ||||||
| 		reject; |  | ||||||
| endcode |  | ||||||
| 
 |  | ||||||
| match mux  |  | ||||||
| 	// Select mux of form: s ? (a + b) : a |  | ||||||
| 	// Allow leading 0s when A_WIDTH != Y_WIDTH or s ? a : (a + b) |  | ||||||
| 	select mux->type == $mux |  | ||||||
| 	choice <IdString> AB {\A, \B} |  | ||||||
| 	define <IdString> BA (AB == \A ? \B : \A) |  | ||||||
| 	set mux_y port(mux, \Y) |  | ||||||
| 	set mux_a port(mux, AB) |  | ||||||
| 	set mux_b port(mux, BA) |  | ||||||
| 	set mux_a_id AB |  | ||||||
| 	set mux_b_id BA |  | ||||||
| 	index <SigSpec> port(mux, AB) === add_a_ext |  | ||||||
| 	index <SigSpec> port(mux, BA) === add_y |  | ||||||
| endmatch |  | ||||||
| 
 |  | ||||||
| code add_y add_a add_b add_a_ext add_a_id add_b_id  mux_y mux_a mux_b mux_a_id mux_b_id |  | ||||||
| 	// Get mux signal |  | ||||||
| 	SigSpec mid;  |  | ||||||
| 	std::string adder_y_name; |  | ||||||
| 	if (add_y.is_wire())  |  | ||||||
| 		adder_y_name = add_y.as_wire()->name.c_str(); |  | ||||||
| 	else |  | ||||||
| 		adder_y_name = add_y.as_string(); |  | ||||||
| 
 |  | ||||||
| 	// Start by renaming the LHS of an eventual assign statement |  | ||||||
| 	// where the RHS is the adder output (that is getting rewired). |  | ||||||
| 	// Renaming the signal allows equiv_opt to function as it would |  | ||||||
| 	// otherwise try to match the functionality which would fail |  | ||||||
| 	// as the LHS signal has indeed changed function. |  | ||||||
| 
 |  | ||||||
| 	// Adder output could be assigned |  | ||||||
| 	for (auto it = module->connections().begin(); it != module->connections().end(); ++it) { |  | ||||||
| 		RTLIL::SigSpec rhs = it->second; |  | ||||||
| 		if (rhs.is_wire()) { |  | ||||||
| 			const std::string& rhs_name = rhs.as_wire()->name.c_str(); |  | ||||||
| 			if (rhs_name == adder_y_name) { |  | ||||||
| 				RTLIL::SigSpec lhs = it->first; |  | ||||||
| 				if (lhs.is_wire()) { |  | ||||||
| 					const std::string& lhs_name =  lhs.as_wire()->name.c_str(); |  | ||||||
| 					module->rename(lhs_name, module->uniquify("$" + lhs_name)); |  | ||||||
| 					break; |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	// Alternatively, the port name could be a wire name |  | ||||||
| 	if (add_y.is_wire()) { |  | ||||||
| 		if (GetSize(adder_y_name)) { |  | ||||||
| 			if (adder_y_name[0] != '$') { |  | ||||||
| 				module->rename(adder_y_name, module->uniquify("$" + adder_y_name)); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} else { |  | ||||||
| 		for (auto chunk : add_y.chunks()) { |  | ||||||
| 			if (chunk.is_wire()) { |  | ||||||
| 				const std::string& name = chunk.wire->name.c_str(); |  | ||||||
| 				if (name[0] != '$') { |  | ||||||
| 					module->rename(name, module->uniquify("$" + name)); |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Create new mid wire |  | ||||||
| 	Cell *cell = mux; |  | ||||||
| 	mid = module->addWire(NEW_ID2_SUFFIX("mid"), GetSize(add_b)); |  | ||||||
| 
 |  | ||||||
| 	// Connect ports |  | ||||||
| 	add->setPort(add_b_id, mid); |  | ||||||
| 	add->setPort(add_a_id, add_a); |  | ||||||
| 	add->setPort(\Y, add_y); |  | ||||||
| 	cell = add; |  | ||||||
| 	module->rename(add, NEW_ID2_SUFFIX("rot")); |  | ||||||
| 	mux->setPort(mux_a_id, Const(State::S0, GetSize(add_b))); |  | ||||||
| 	mux->setPort(mux_b_id, add_b); |  | ||||||
| 	mux->setPort(\Y, mid); |  | ||||||
| 	cell = mux; |  | ||||||
| 	module->rename(mux, NEW_ID2_SUFFIX("rot")); |  | ||||||
| 	module->connect(mux_y, add_y); |  | ||||||
| 
 |  | ||||||
| 	// Log, fixup, accept |  | ||||||
| 	log("muxadd pattern in %s: mux=%s, add=%s\n", log_id(module), log_id(mux), log_id(add)); |  | ||||||
| 	add->fixup_parameters(); |  | ||||||
| 	mux->fixup_parameters(); |  | ||||||
| 	did_something = true; |  | ||||||
| 	accept; |  | ||||||
| endcode |  | ||||||
							
								
								
									
										143
									
								
								passes/opt/peepopt_muxorder.pmg
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								passes/opt/peepopt_muxorder.pmg
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,143 @@ | ||||||
|  | pattern muxorder | ||||||
|  | // | ||||||
|  | // Authored by Akash Levy and Alain Dargelas of Silimate, Inc. under ISC license. | ||||||
|  | // | ||||||
|  | // Transforms OP->mux into mux->OP using identity input for two-input OP. Example: | ||||||
|  | // y = s ? (a + b) : a   ===>   y = a + (s ? b : 0) | ||||||
|  | // or | ||||||
|  | // y = s ? a : (a + b)   ===>   y = a + (s ? 0 : b) | ||||||
|  | // | ||||||
|  | // Supported OPs: +, *, &, |, ^, ^~ | ||||||
|  | // | ||||||
|  | 
 | ||||||
|  | state <SigSpec> op_a op_b op_y op_a_ext mux_a mux_b mux_y | ||||||
|  | state <Const> op_a_signed | ||||||
|  | state <IdString> op_a_id op_b_id mux_a_id mux_b_id | ||||||
|  | 
 | ||||||
|  | match op | ||||||
|  | 	// Select OP | ||||||
|  | 	select op->type.in($add, $mul, $and, $or, $xor, $xnor) | ||||||
|  | 
 | ||||||
|  | 	// Set ports, allowing A and B to be swapped | ||||||
|  | 	choice <IdString> A {\A, \B} | ||||||
|  | 	define <IdString> B (A == \A ? \B : \A) | ||||||
|  | 	set op_a port(op, A) | ||||||
|  | 	set op_b port(op, B) | ||||||
|  | 	set op_y port(op, \Y) | ||||||
|  | 
 | ||||||
|  | 	// Get signedness | ||||||
|  | 	set op_a_signed param(op, (A == \A) ? \A_SIGNED : \B_SIGNED) | ||||||
|  | 
 | ||||||
|  | 	// Choice ids | ||||||
|  | 	set op_a_id A | ||||||
|  | 	set op_b_id B | ||||||
|  | endmatch | ||||||
|  | 
 | ||||||
|  | code op_y op_a op_b op_a_ext | ||||||
|  | 	// Get OP signals | ||||||
|  | 	op_a_ext = SigSpec(port(op, op_a_id)); | ||||||
|  | 	op_a_ext.extend_u0(GetSize(op_y), op_a_signed.as_bool()); | ||||||
|  | 
 | ||||||
|  | 	// Fanout of each OP Y bit should be 1 (no bit-split) | ||||||
|  | 	if (nusers(op_y) != 2) | ||||||
|  | 		reject; | ||||||
|  | endcode | ||||||
|  | 
 | ||||||
|  | match mux  | ||||||
|  | 	// Select mux of form: s ? (a + b) : a | ||||||
|  | 	// Allow leading 0s when A_WIDTH != Y_WIDTH or s ? a : (a + b) | ||||||
|  | 	select mux->type == $mux | ||||||
|  | 	choice <IdString> AB {\A, \B} | ||||||
|  | 	define <IdString> BA (AB == \A ? \B : \A) | ||||||
|  | 	set mux_y port(mux, \Y) | ||||||
|  | 	set mux_a port(mux, AB) | ||||||
|  | 	set mux_b port(mux, BA) | ||||||
|  | 	set mux_a_id AB | ||||||
|  | 	set mux_b_id BA | ||||||
|  | 	index <SigSpec> port(mux, AB) === op_a_ext | ||||||
|  | 	index <SigSpec> port(mux, BA) === op_y | ||||||
|  | endmatch | ||||||
|  | 
 | ||||||
|  | code op_y op_a op_b op_a_ext op_a_id op_b_id  mux_y mux_a mux_b mux_a_id mux_b_id | ||||||
|  | 	// Get mux signal | ||||||
|  | 	SigSpec mid;  | ||||||
|  | 	std::string op_y_name; | ||||||
|  | 	if (op_y.is_wire())  | ||||||
|  | 		op_y_name = op_y.as_wire()->name.c_str(); | ||||||
|  | 	else | ||||||
|  | 		op_y_name = op_y.as_string(); | ||||||
|  | 
 | ||||||
|  | 	// Start by renaming the LHS of an eventual assign statement | ||||||
|  | 	// where the RHS is the OP output (that is getting rewired). | ||||||
|  | 	// Renaming the signal allows equiv_opt to function as it would | ||||||
|  | 	// otherwise try to match the functionality which would fail | ||||||
|  | 	// as the LHS signal has indeed changed function. | ||||||
|  | 
 | ||||||
|  | 	// OP output could be assigned | ||||||
|  | 	for (auto it = module->connections().begin(); it != module->connections().end(); ++it) { | ||||||
|  | 		RTLIL::SigSpec rhs = it->second; | ||||||
|  | 		if (rhs.is_wire()) { | ||||||
|  | 			const std::string& rhs_name = rhs.as_wire()->name.c_str(); | ||||||
|  | 			if (rhs_name == op_y_name) { | ||||||
|  | 				RTLIL::SigSpec lhs = it->first; | ||||||
|  | 				if (lhs.is_wire()) { | ||||||
|  | 					const std::string& lhs_name =  lhs.as_wire()->name.c_str(); | ||||||
|  | 					module->rename(lhs_name, module->uniquify("$" + lhs_name)); | ||||||
|  | 					break; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	// Alternatively, the port name could be a wire name | ||||||
|  | 	if (op_y.is_wire()) { | ||||||
|  | 		if (GetSize(op_y_name)) { | ||||||
|  | 			if (op_y_name[0] != '$') { | ||||||
|  | 				module->rename(op_y_name, module->uniquify("$" + op_y_name)); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		for (auto chunk : op_y.chunks()) { | ||||||
|  | 			if (chunk.is_wire()) { | ||||||
|  | 				const std::string& name = chunk.wire->name.c_str(); | ||||||
|  | 				if (name[0] != '$') { | ||||||
|  | 					module->rename(name, module->uniquify("$" + name)); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Create new mid wire | ||||||
|  | 	Cell *cell = mux; | ||||||
|  | 	mid = module->addWire(NEW_ID2_SUFFIX("mid"), GetSize(op_b)); | ||||||
|  | 
 | ||||||
|  | 	// Determine identity input of operator | ||||||
|  | 	Const identity; | ||||||
|  | 	if (op->type.in($add, $or, $xor)) | ||||||
|  | 	  identity = Const(0, GetSize(op_b)); | ||||||
|  | 	else if (op->type == $mul) | ||||||
|  | 		identity = Const(1, GetSize(op_b)); | ||||||
|  | 	else if (op->type.in($and, $xnor)) | ||||||
|  | 	  identity = Const(State::S1, GetSize(op_b)); | ||||||
|  | 	else | ||||||
|  | 		log_assert(0); // invalid operator, should never happen | ||||||
|  | 
 | ||||||
|  | 	// Connect ports | ||||||
|  | 	op->setPort(op_b_id, mid); | ||||||
|  | 	op->setPort(op_a_id, op_a); | ||||||
|  | 	op->setPort(\Y, op_y); | ||||||
|  | 	cell = op; | ||||||
|  | 	module->rename(op, NEW_ID2_SUFFIX("reord")); | ||||||
|  | 	mux->setPort(mux_a_id, identity); | ||||||
|  | 	mux->setPort(mux_b_id, op_b); | ||||||
|  | 	mux->setPort(\Y, mid); | ||||||
|  | 	cell = mux; | ||||||
|  | 	module->rename(mux, NEW_ID2_SUFFIX("reord")); | ||||||
|  | 	module->connect(mux_y, op_y); | ||||||
|  | 
 | ||||||
|  | 	// Log, fixup, accept | ||||||
|  | 	log("muxorder pattern in %s: mux=%s, op=%s, optype=%s\n", log_id(module), log_id(mux), log_id(op), log_id(op->type)); | ||||||
|  | 	op->fixup_parameters(); | ||||||
|  | 	mux->fixup_parameters(); | ||||||
|  | 	did_something = true; | ||||||
|  | 	accept; | ||||||
|  | endcode | ||||||
|  | @ -18,7 +18,7 @@ module top(a, b, s, y); | ||||||
| endmodule | endmodule | ||||||
| EOF | EOF | ||||||
| check -assert | check -assert | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | ||||||
| log -pop | log -pop | ||||||
|  | @ -36,7 +36,7 @@ module top(a, b, s, y); | ||||||
| endmodule | endmodule | ||||||
| EOF | EOF | ||||||
| check -assert | check -assert | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | ||||||
| log -pop | log -pop | ||||||
|  | @ -56,7 +56,7 @@ module top(a, b, s, y); | ||||||
| endmodule | endmodule | ||||||
| EOF | EOF | ||||||
| check -assert | check -assert | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | ||||||
| log -pop | log -pop | ||||||
|  | @ -77,7 +77,7 @@ module top(a_, b, s, y); | ||||||
| endmodule | endmodule | ||||||
| EOF | EOF | ||||||
| check -assert | check -assert | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | ||||||
| log -pop | log -pop | ||||||
|  | @ -101,7 +101,7 @@ module top(a, b_, f, s, y_); | ||||||
| endmodule | endmodule | ||||||
| EOF | EOF | ||||||
| check -assert | check -assert | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | ||||||
| log -pop | log -pop | ||||||
|  | @ -121,7 +121,7 @@ module top(a, b, ab, s, y); | ||||||
| endmodule | endmodule | ||||||
| EOF | EOF | ||||||
| check -assert | check -assert | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-none t:$add %co1 %a w:y %i | select -assert-none t:$add %co1 %a w:y %i | ||||||
| log -pop | log -pop | ||||||
|  | @ -141,7 +141,7 @@ module top(a, b, s, y, z); | ||||||
| endmodule | endmodule | ||||||
| EOF | EOF | ||||||
| check -assert | check -assert | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-none t:$add %co1 %a w:y %i | select -assert-none t:$add %co1 %a w:y %i | ||||||
| 
 | 
 | ||||||
|  | @ -162,7 +162,7 @@ EOF | ||||||
| check -assert | check -assert | ||||||
| wreduce | wreduce | ||||||
| opt_clean | opt_clean | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-none t:$add %co1 %a w:y %i | select -assert-none t:$add %co1 %a w:y %i | ||||||
| 
 | 
 | ||||||
|  | @ -183,7 +183,7 @@ EOF | ||||||
| check -assert | check -assert | ||||||
| wreduce | wreduce | ||||||
| opt_clean | opt_clean | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-none t:$add %co1 %a w:y %i | select -assert-none t:$add %co1 %a w:y %i | ||||||
| 
 | 
 | ||||||
|  | @ -204,7 +204,7 @@ EOF | ||||||
| check -assert | check -assert | ||||||
| wreduce | wreduce | ||||||
| opt_clean | opt_clean | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-none t:$add %co1 %a w:y %i | select -assert-none t:$add %co1 %a w:y %i | ||||||
| 
 | 
 | ||||||
|  | @ -226,7 +226,7 @@ EOF | ||||||
| check -assert | check -assert | ||||||
| wreduce | wreduce | ||||||
| opt_clean | opt_clean | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-none t:$add %co1 %a w:y %i | select -assert-none t:$add %co1 %a w:y %i | ||||||
| 
 | 
 | ||||||
|  | @ -247,7 +247,7 @@ EOF | ||||||
| check -assert | check -assert | ||||||
| wreduce | wreduce | ||||||
| opt_clean | opt_clean | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-any t:$add %co1 %a w:y %i | select -assert-any t:$add %co1 %a w:y %i | ||||||
| 
 | 
 | ||||||
|  | @ -268,7 +268,7 @@ EOF | ||||||
| check -assert | check -assert | ||||||
| wreduce | wreduce | ||||||
| opt_clean | opt_clean | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-any t:$add %co1 %a w:y %i | select -assert-any t:$add %co1 %a w:y %i | ||||||
| 
 | 
 | ||||||
|  | @ -289,7 +289,7 @@ EOF | ||||||
| check -assert | check -assert | ||||||
| wreduce | wreduce | ||||||
| opt_clean | opt_clean | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | ||||||
| 
 | 
 | ||||||
|  | @ -310,7 +310,7 @@ EOF | ||||||
| check -assert | check -assert | ||||||
| wreduce | wreduce | ||||||
| opt_clean | opt_clean | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | ||||||
| 
 | 
 | ||||||
|  | @ -331,7 +331,7 @@ EOF | ||||||
| check -assert | check -assert | ||||||
| wreduce | wreduce | ||||||
| opt_clean | opt_clean | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | ||||||
| 
 | 
 | ||||||
|  | @ -352,7 +352,7 @@ EOF | ||||||
| check -assert | check -assert | ||||||
| wreduce | wreduce | ||||||
| opt_clean | opt_clean | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | ||||||
| 
 | 
 | ||||||
|  | @ -373,6 +373,6 @@ EOF | ||||||
| check -assert | check -assert | ||||||
| wreduce | wreduce | ||||||
| opt_clean | opt_clean | ||||||
| equiv_opt -assert peepopt -withmuxadd | equiv_opt -assert peepopt -muxorder | ||||||
| design -load postopt | design -load postopt | ||||||
| select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | select -assert-any t:$add %co1 %a w:y %i # assert adder rewired | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue