mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 13:29:12 +00:00 
			
		
		
		
	Some cleanups in freduce -inv mode (and switched from -noinv to -inv)
This commit is contained in:
		
							parent
							
								
									6dec0e0b3e
								
							
						
					
					
						commit
						c6b33f81eb
					
				
					 1 changed files with 29 additions and 26 deletions
				
			
		| 
						 | 
					@ -30,7 +30,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace {
 | 
					namespace {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool noinv_mode;
 | 
					bool inv_mode;
 | 
				
			||||||
int verbose_level;
 | 
					int verbose_level;
 | 
				
			||||||
typedef std::map<RTLIL::SigBit, std::pair<RTLIL::Cell*, std::set<RTLIL::SigBit>>> drivers_t;
 | 
					typedef std::map<RTLIL::SigBit, std::pair<RTLIL::Cell*, std::set<RTLIL::SigBit>>> drivers_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -154,6 +154,7 @@ struct PerformReduction
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	SigMap &sigmap;
 | 
						SigMap &sigmap;
 | 
				
			||||||
	drivers_t &drivers;
 | 
						drivers_t &drivers;
 | 
				
			||||||
 | 
						std::set<std::pair<RTLIL::SigBit, RTLIL::SigBit>> &inv_pairs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ezDefaultSAT ez;
 | 
						ezDefaultSAT ez;
 | 
				
			||||||
	SatGen satgen;
 | 
						SatGen satgen;
 | 
				
			||||||
| 
						 | 
					@ -191,8 +192,8 @@ struct PerformReduction
 | 
				
			||||||
		return sigdepth[out];
 | 
							return sigdepth[out];
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	PerformReduction(SigMap &sigmap, drivers_t &drivers, std::vector<RTLIL::SigBit> &bits) :
 | 
						PerformReduction(SigMap &sigmap, drivers_t &drivers, std::set<std::pair<RTLIL::SigBit, RTLIL::SigBit>> &inv_pairs, std::vector<RTLIL::SigBit> &bits) :
 | 
				
			||||||
			sigmap(sigmap), drivers(drivers), satgen(&ez, &sigmap), out_bits(bits)
 | 
								sigmap(sigmap), drivers(drivers), inv_pairs(inv_pairs), satgen(&ez, &sigmap), out_bits(bits)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		satgen.model_undef = true;
 | 
							satgen.model_undef = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -205,15 +206,14 @@ struct PerformReduction
 | 
				
			||||||
			sat_def.push_back(ez.NOT(satgen.importUndefSigSpec(bit).front()));
 | 
								sat_def.push_back(ez.NOT(satgen.importUndefSigSpec(bit).front()));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (noinv_mode) {
 | 
							if (inv_mode) {
 | 
				
			||||||
			out_inverted = std::vector<bool>(sat_out.size(), false);
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			if (!ez.solve(sat_out, out_inverted, ez.expression(ezSAT::OpAnd, sat_def)))
 | 
								if (!ez.solve(sat_out, out_inverted, ez.expression(ezSAT::OpAnd, sat_def)))
 | 
				
			||||||
				log_error("Solving for initial model failed!\n");
 | 
									log_error("Solving for initial model failed!\n");
 | 
				
			||||||
			for (size_t i = 0; i < sat_out.size(); i++)
 | 
								for (size_t i = 0; i < sat_out.size(); i++)
 | 
				
			||||||
				if (out_inverted.at(i))
 | 
									if (out_inverted.at(i))
 | 
				
			||||||
					sat_out[i] = ez.NOT(sat_out[i]);
 | 
										sat_out[i] = ez.NOT(sat_out[i]);
 | 
				
			||||||
		}
 | 
							} else
 | 
				
			||||||
 | 
								out_inverted = std::vector<bool>(sat_out.size(), false);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void analyze(std::vector<std::vector<equiv_bit_t>> &results, std::vector<int> &bucket, int level)
 | 
						void analyze(std::vector<std::vector<equiv_bit_t>> &results, std::vector<int> &bucket, int level)
 | 
				
			||||||
| 
						 | 
					@ -277,7 +277,14 @@ struct PerformReduction
 | 
				
			||||||
				for (auto &bit : result)
 | 
									for (auto &bit : result)
 | 
				
			||||||
					bit.inverted = !bit.inverted;
 | 
										bit.inverted = !bit.inverted;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			results.push_back(result);
 | 
								for (size_t i = 1; i < result.size(); i++) {
 | 
				
			||||||
 | 
									std::pair<RTLIL::SigBit, RTLIL::SigBit> p(result[0].bit, result[i].bit);
 | 
				
			||||||
 | 
									if (inv_pairs.count(p) != 0)
 | 
				
			||||||
 | 
										result.erase(result.begin() + i);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (result.size() > 1)
 | 
				
			||||||
 | 
									results.push_back(result);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -296,6 +303,7 @@ struct FreduceHelper
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SigMap sigmap;
 | 
						SigMap sigmap;
 | 
				
			||||||
	drivers_t drivers;
 | 
						drivers_t drivers;
 | 
				
			||||||
 | 
						std::set<std::pair<RTLIL::SigBit, RTLIL::SigBit>> inv_pairs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	FreduceHelper(RTLIL::Module *module) : module(module), sigmap(module)
 | 
						FreduceHelper(RTLIL::Module *module) : module(module), sigmap(module)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -310,7 +318,7 @@ struct FreduceHelper
 | 
				
			||||||
		ct.setup_stdcells();
 | 
							ct.setup_stdcells();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		std::vector<std::set<RTLIL::SigBit>> batches;
 | 
							std::vector<std::set<RTLIL::SigBit>> batches;
 | 
				
			||||||
		for (auto &it : module->cells)
 | 
							for (auto &it : module->cells) {
 | 
				
			||||||
			if (ct.cell_known(it.second->type)) {
 | 
								if (ct.cell_known(it.second->type)) {
 | 
				
			||||||
				std::set<RTLIL::SigBit> inputs, outputs;
 | 
									std::set<RTLIL::SigBit> inputs, outputs;
 | 
				
			||||||
				for (auto &port : it.second->connections) {
 | 
									for (auto &port : it.second->connections) {
 | 
				
			||||||
| 
						 | 
					@ -325,6 +333,9 @@ struct FreduceHelper
 | 
				
			||||||
					drivers[bit] = drv;
 | 
										drivers[bit] = drv;
 | 
				
			||||||
				batches.push_back(outputs);
 | 
									batches.push_back(outputs);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								if (inv_mode && it.second->type == "$_INV_")
 | 
				
			||||||
 | 
									inv_pairs.insert(std::pair<RTLIL::SigBit, RTLIL::SigBit>(sigmap(it.second->connections.at("\\A")), sigmap(it.second->connections.at("\\Y"))));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		int bits_count = 0;
 | 
							int bits_count = 0;
 | 
				
			||||||
		std::map<std::vector<RTLIL::SigBit>, std::vector<RTLIL::SigBit>> buckets;
 | 
							std::map<std::vector<RTLIL::SigBit>, std::vector<RTLIL::SigBit>> buckets;
 | 
				
			||||||
| 
						 | 
					@ -355,7 +366,7 @@ struct FreduceHelper
 | 
				
			||||||
			bucket_sig.optimize();
 | 
								bucket_sig.optimize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			log("  Trying to shatter bucket %s%c\n", log_signal(bucket_sig), verbose_level ? ':' : '.');
 | 
								log("  Trying to shatter bucket %s%c\n", log_signal(bucket_sig), verbose_level ? ':' : '.');
 | 
				
			||||||
			PerformReduction worker(sigmap, drivers, bucket.second);
 | 
								PerformReduction worker(sigmap, drivers, inv_pairs, bucket.second);
 | 
				
			||||||
			worker.analyze(equiv);
 | 
								worker.analyze(equiv);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -368,20 +379,12 @@ struct FreduceHelper
 | 
				
			||||||
			RTLIL::SigSpec inv_sig;
 | 
								RTLIL::SigSpec inv_sig;
 | 
				
			||||||
			for (size_t i = 1; i < grp.size(); i++)
 | 
								for (size_t i = 1; i < grp.size(); i++)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				RTLIL::Cell *drv = drivers.at(grp[i].bit).first;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				if (grp[i].inverted && drv->type == "$_INV_" && sigmap(drv->connections.at("\\A")) == grp[0].bit) {
 | 
					 | 
				
			||||||
					log("      Skipping inverted slave %s: already in reduced form\n", log_signal(grp[i].bit));
 | 
					 | 
				
			||||||
					continue;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				log("      Connect slave%s: %s\n", grp[i].inverted ? " using inverter" : "", log_signal(grp[i].bit));
 | 
									log("      Connect slave%s: %s\n", grp[i].inverted ? " using inverter" : "", log_signal(grp[i].bit));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									RTLIL::Cell *drv = drivers.at(grp[i].bit).first;
 | 
				
			||||||
				RTLIL::Wire *dummy_wire = module->new_wire(1, NEW_ID);
 | 
									RTLIL::Wire *dummy_wire = module->new_wire(1, NEW_ID);
 | 
				
			||||||
				for (auto &port : drv->connections) {
 | 
									for (auto &port : drv->connections)
 | 
				
			||||||
					RTLIL::SigSpec mapped = sigmap(port.second);
 | 
										sigmap(port.second).replace(grp[i].bit, dummy_wire, &port.second);
 | 
				
			||||||
					mapped.replace(grp[i].bit, dummy_wire, &port.second);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (grp[i].inverted)
 | 
									if (grp[i].inverted)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
| 
						 | 
					@ -428,14 +431,14 @@ struct FreducePass : public Pass {
 | 
				
			||||||
		log("    -v, -vv\n");
 | 
							log("    -v, -vv\n");
 | 
				
			||||||
		log("        enable verbose or very verbose output\n");
 | 
							log("        enable verbose or very verbose output\n");
 | 
				
			||||||
		log("\n");
 | 
							log("\n");
 | 
				
			||||||
		log("    -noinv\n");
 | 
							log("    -inv\n");
 | 
				
			||||||
		log("        do not consolidate inverted signals\n");
 | 
							log("        enable explicit handling of inverted signals\n");
 | 
				
			||||||
		log("\n");
 | 
							log("\n");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	virtual void execute(std::vector<std::string> args, RTLIL::Design *design)
 | 
						virtual void execute(std::vector<std::string> args, RTLIL::Design *design)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		verbose_level = 0;
 | 
							verbose_level = 0;
 | 
				
			||||||
		noinv_mode = false;
 | 
							inv_mode = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		log_header("Executing FREDUCE pass (perform functional reduction).\n");
 | 
							log_header("Executing FREDUCE pass (perform functional reduction).\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -449,8 +452,8 @@ struct FreducePass : public Pass {
 | 
				
			||||||
				verbose_level = 2;
 | 
									verbose_level = 2;
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if (args[argidx] == "-noinv") {
 | 
								if (args[argidx] == "-inv") {
 | 
				
			||||||
				noinv_mode = true;
 | 
									inv_mode = true;
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue