mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-03 21:09:12 +00:00 
			
		
		
		
	ezSAT: Fixed handling of eliminated Literals, added auto-freeze for expressions
This commit is contained in:
		
							parent
							
								
									d500bd749f
								
							
						
					
					
						commit
						895e9fc70c
					
				
					 2 changed files with 23 additions and 8 deletions
				
			
		| 
						 | 
				
			
			@ -485,12 +485,16 @@ std::string ezSAT::cnfLiteralInfo(int idx) const
 | 
			
		|||
	return "<unnamed>";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ezSAT::bind(int id)
 | 
			
		||||
int ezSAT::bind(int id, bool auto_freeze)
 | 
			
		||||
{
 | 
			
		||||
	if (id >= 0) {
 | 
			
		||||
		assert(0 < id && id <= int(literals.size()));
 | 
			
		||||
		cnfLiteralVariables.resize(literals.size());
 | 
			
		||||
		if (cnfLiteralVariables[id-1] == 0 || eliminated(cnfLiteralVariables[id-1])) {
 | 
			
		||||
		if (eliminated(cnfLiteralVariables[id-1])) {
 | 
			
		||||
			fprintf(stderr, "ezSAT: Missing freeze on literal `%s'.\n", to_string(id).c_str());
 | 
			
		||||
			abort();
 | 
			
		||||
		}
 | 
			
		||||
		if (cnfLiteralVariables[id-1] == 0) {
 | 
			
		||||
			cnfLiteralVariables[id-1] = ++cnfVariableCount;
 | 
			
		||||
			if (id == TRUE)
 | 
			
		||||
				add_clause(+cnfLiteralVariables[id-1]);
 | 
			
		||||
| 
						 | 
				
			
			@ -503,7 +507,18 @@ int ezSAT::bind(int id)
 | 
			
		|||
	assert(0 < -id && -id <= int(expressions.size()));
 | 
			
		||||
	cnfExpressionVariables.resize(expressions.size());
 | 
			
		||||
 | 
			
		||||
	if (cnfExpressionVariables[-id-1] == 0 || eliminated(cnfExpressionVariables[-id-1]))
 | 
			
		||||
	if (eliminated(cnfExpressionVariables[-id-1]))
 | 
			
		||||
	{
 | 
			
		||||
		cnfExpressionVariables[-id-1] = 0;
 | 
			
		||||
 | 
			
		||||
		// this will recursively call bind(id). within the recursion
 | 
			
		||||
		// the cnf is pre-set to 0. an idx is allocated there, then it
 | 
			
		||||
		// is frozen, then it returns here with the new idx already set.
 | 
			
		||||
		if (auto_freeze)
 | 
			
		||||
			freeze(id);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (cnfExpressionVariables[-id-1] == 0)
 | 
			
		||||
	{
 | 
			
		||||
		OpId op;
 | 
			
		||||
		std::vector<int> args;
 | 
			
		||||
| 
						 | 
				
			
			@ -520,7 +535,7 @@ int ezSAT::bind(int id)
 | 
			
		|||
						newArgs.push_back(OR(AND(args[i], NOT(args[i+1])), AND(NOT(args[i]), args[i+1])));
 | 
			
		||||
				args.swap(newArgs);
 | 
			
		||||
			}
 | 
			
		||||
			idx = bind(args.at(0));
 | 
			
		||||
			idx = bind(args.at(0), false);
 | 
			
		||||
			goto assign_idx;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -528,17 +543,17 @@ int ezSAT::bind(int id)
 | 
			
		|||
			std::vector<int> invArgs;
 | 
			
		||||
			for (auto arg : args)
 | 
			
		||||
				invArgs.push_back(NOT(arg));
 | 
			
		||||
			idx = bind(OR(expression(OpAnd, args), expression(OpAnd, invArgs)));
 | 
			
		||||
			idx = bind(OR(expression(OpAnd, args), expression(OpAnd, invArgs)), false);
 | 
			
		||||
			goto assign_idx;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (op == OpITE) {
 | 
			
		||||
			idx = bind(OR(AND(args[0], args[1]), AND(NOT(args[0]), args[2])));
 | 
			
		||||
			idx = bind(OR(AND(args[0], args[1]), AND(NOT(args[0]), args[2])), false);
 | 
			
		||||
			goto assign_idx;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for (int i = 0; i < int(args.size()); i++)
 | 
			
		||||
			args[i] = bind(args[i]);
 | 
			
		||||
			args[i] = bind(args[i], false);
 | 
			
		||||
 | 
			
		||||
		switch (op)
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -143,7 +143,7 @@ public:
 | 
			
		|||
	virtual void freeze(int id);
 | 
			
		||||
	virtual bool eliminated(int idx);
 | 
			
		||||
	void assume(int id);
 | 
			
		||||
	int bind(int id);
 | 
			
		||||
	int bind(int id, bool auto_freeze = true);
 | 
			
		||||
	int bound(int id) const;
 | 
			
		||||
 | 
			
		||||
	int numCnfVariables() const { return cnfVariableCount; }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue