mirror of https://github.com/YosysHQ/abc.git
211 lines
7.2 KiB
C
211 lines
7.2 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [cadicalTest.c]
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
PackageName []
|
|
|
|
Synopsis []
|
|
|
|
Author [Alan Mishchenko]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - June 20, 2005.]
|
|
|
|
Revision [$Id: cadicalTest.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#include "cadicalSolver.h"
|
|
|
|
ABC_NAMESPACE_IMPL_START
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DEFINITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
void cadical_solver_test() {
|
|
int RetValue;
|
|
int Lits[3];
|
|
// test 1
|
|
{
|
|
cadical_solver *pSat = cadical_solver_new();
|
|
int a = cadical_solver_addvar(pSat);
|
|
int b = cadical_solver_addvar(pSat);
|
|
int c = cadical_solver_addvar(pSat);
|
|
assert(cadical_solver_nvars(pSat) == 3);
|
|
Lits[0] = Abc_Var2Lit(a, 0);
|
|
Lits[1] = Abc_Var2Lit(b, 0);
|
|
Lits[2] = Abc_Var2Lit(c, 0);
|
|
printf("adding (a, b, c)\n");
|
|
RetValue = cadical_solver_addclause(pSat, Lits, Lits + 3);
|
|
assert(RetValue);
|
|
Lits[0] = Abc_Var2Lit(a, 0);
|
|
Lits[1] = Abc_Var2Lit(b, 1);
|
|
printf("adding (a, !b)\n");
|
|
RetValue = cadical_solver_addclause(pSat, Lits, Lits + 2);
|
|
assert(RetValue);
|
|
Lits[0] = Abc_Var2Lit(a, 1);
|
|
printf("adding (!a)\n");
|
|
RetValue = cadical_solver_addclause(pSat, Lits, Lits + 1);
|
|
assert(RetValue);
|
|
RetValue = cadical_solver_solve(pSat, NULL, NULL, 0, 0, 0, 0);
|
|
printf("solved: %d\n", RetValue);
|
|
assert(RetValue == 1);
|
|
int a_val = cadical_solver_get_var_value(pSat, a);
|
|
int b_val = cadical_solver_get_var_value(pSat, b);
|
|
int c_val = cadical_solver_get_var_value(pSat, c);
|
|
printf("a = %d, b = %d, c = %d\n", a_val, b_val, c_val);
|
|
assert(a_val == 0);
|
|
assert(b_val == 0);
|
|
assert(c_val == 1);
|
|
cadical_solver_delete(pSat);
|
|
printf("test 1 passed\n");
|
|
}
|
|
// test 2
|
|
{
|
|
cadical_solver *pSat = cadical_solver_new();
|
|
cadical_solver_setnvars(pSat, 2);
|
|
assert(cadical_solver_nvars(pSat) == 2);
|
|
Lits[0] = Abc_Var2Lit(0, 0);
|
|
Lits[1] = Abc_Var2Lit(1, 0);
|
|
printf("adding (x0, x1)\n");
|
|
RetValue = cadical_solver_addclause(pSat, Lits, Lits + 2);
|
|
assert(RetValue);
|
|
Lits[0] = Abc_Var2Lit(0, 0);
|
|
Lits[1] = Abc_Var2Lit(1, 1);
|
|
printf("adding (x0, !x1)\n");
|
|
RetValue = cadical_solver_addclause(pSat, Lits, Lits + 2);
|
|
assert(RetValue);
|
|
Lits[0] = Abc_Var2Lit(0, 1);
|
|
Lits[1] = Abc_Var2Lit(1, 1);
|
|
printf("adding (!x0, !x1)\n");
|
|
RetValue = cadical_solver_addclause(pSat, Lits, Lits + 2);
|
|
assert(RetValue);
|
|
RetValue = cadical_solver_solve(pSat, NULL, NULL, 0, 0, 0, 0);
|
|
printf("solved: %d\n", RetValue);
|
|
assert(RetValue == 1);
|
|
printf("x0 = %d, x1 = %d\n", cadical_solver_get_var_value(pSat, 0), cadical_solver_get_var_value(pSat, 1));
|
|
assert(cadical_solver_get_var_value(pSat, 0) == 1);
|
|
assert(cadical_solver_get_var_value(pSat, 1) == 0);
|
|
cadical_solver_delete(pSat);
|
|
printf("test 2 passed\n");
|
|
}
|
|
// test 3
|
|
{
|
|
cadical_solver *pSat = cadical_solver_new();
|
|
cadical_solver_setnvars(pSat, 3);
|
|
assert(cadical_solver_nvars(pSat) == 3);
|
|
Lits[0] = Abc_Var2Lit(0, 1);
|
|
Lits[1] = Abc_Var2Lit(1, 0);
|
|
Lits[2] = Abc_Var2Lit(2, 1);
|
|
printf("adding (!x0, x1, !x2)\n");
|
|
RetValue = cadical_solver_addclause(pSat, Lits, Lits + 3);
|
|
assert(RetValue);
|
|
Lits[0] = Abc_Var2Lit(0, 0);
|
|
printf("adding (x0)\n");
|
|
RetValue = cadical_solver_addclause(pSat, Lits, Lits + 1);
|
|
assert(RetValue);
|
|
Lits[0] = Abc_Var2Lit(1, 1);
|
|
printf("adding (!x1)\n");
|
|
RetValue = cadical_solver_addclause(pSat, Lits, Lits + 1);
|
|
assert(RetValue);
|
|
Lits[0] = Abc_Var2Lit(2, 0);
|
|
printf("adding (x2)\n");
|
|
RetValue = cadical_solver_addclause(pSat, Lits, Lits + 1);
|
|
RetValue = cadical_solver_solve(pSat, NULL, NULL, 0, 0, 0, 0);
|
|
printf("solved: %d\n", RetValue);
|
|
assert(RetValue == -1);
|
|
cadical_solver_delete(pSat);
|
|
printf("test 3 passed\n");
|
|
}
|
|
// test 4
|
|
{
|
|
cadical_solver *pSat = cadical_solver_new();
|
|
cadical_solver_setnvars(pSat, 3);
|
|
assert(cadical_solver_nvars(pSat) == 3);
|
|
Lits[0] = Abc_Var2Lit(0, 1);
|
|
Lits[1] = Abc_Var2Lit(1, 0);
|
|
Lits[2] = Abc_Var2Lit(2, 1);
|
|
printf("adding (!x0, x1, !x2)\n");
|
|
RetValue = cadical_solver_addclause(pSat, Lits, Lits + 3);
|
|
assert(RetValue);
|
|
Lits[0] = Abc_Var2Lit(0, 0);
|
|
printf("adding (x0)\n");
|
|
RetValue = cadical_solver_addclause(pSat, Lits, Lits + 1);
|
|
assert(RetValue);
|
|
Lits[0] = Abc_Var2Lit(1, 1);
|
|
printf("assume (!x1)\n");
|
|
RetValue = cadical_solver_solve(pSat, Lits, Lits + 1, 0, 0, 0, 0);
|
|
printf("solved: %d\n", RetValue);
|
|
assert(RetValue == 1);
|
|
printf("x0 = %d, x1 = %d, x2 = %d\n", cadical_solver_get_var_value(pSat, 0), cadical_solver_get_var_value(pSat, 1), cadical_solver_get_var_value(pSat, 2));
|
|
assert(cadical_solver_get_var_value(pSat, 0) == 1);
|
|
assert(cadical_solver_get_var_value(pSat, 1) == 0);
|
|
assert(cadical_solver_get_var_value(pSat, 2) == 0);
|
|
cadical_solver_delete(pSat);
|
|
printf("test 4 passed\n");
|
|
}
|
|
// test 5
|
|
{
|
|
cadical_solver *pSat = cadical_solver_new();
|
|
cadical_solver_setnvars(pSat, 3);
|
|
assert(cadical_solver_nvars(pSat) == 3);
|
|
Lits[0] = Abc_Var2Lit(0, 1);
|
|
Lits[1] = Abc_Var2Lit(1, 0);
|
|
Lits[2] = Abc_Var2Lit(2, 1);
|
|
printf("adding (!x0, x1, !x2)\n");
|
|
RetValue = cadical_solver_addclause(pSat, Lits, Lits + 3);
|
|
assert(RetValue);
|
|
Lits[0] = Abc_Var2Lit(0, 1);
|
|
Lits[1] = Abc_Var2Lit(1, 1);
|
|
Lits[2] = Abc_Var2Lit(2, 1);
|
|
printf("adding (!x0, !x1, !x2)\n");
|
|
RetValue = cadical_solver_addclause(pSat, Lits, Lits + 3);
|
|
assert(RetValue);
|
|
Lits[0] = Abc_Var2Lit(0, 0);
|
|
printf("adding (x0)\n");
|
|
RetValue = cadical_solver_addclause(pSat, Lits, Lits + 1);
|
|
assert(RetValue);
|
|
Lits[0] = Abc_Var2Lit(1, 0);
|
|
Lits[1] = Abc_Var2Lit(2, 0);
|
|
printf("assume (x1, x2)\n");
|
|
RetValue = cadical_solver_solve(pSat, Lits, Lits + 2, 0, 0, 0, 0);
|
|
printf("solved: %d\n", RetValue);
|
|
assert(RetValue == -1);
|
|
int *pCore;
|
|
int nSize = cadical_solver_final(pSat, &pCore);
|
|
printf("core: ");
|
|
for(int i = 0; i < nSize; i++) {
|
|
if(i) {
|
|
printf(", ");
|
|
}
|
|
if(Abc_LitIsCompl(pCore[i])) {
|
|
printf("!");
|
|
}
|
|
printf("x%d", Abc_Lit2Var(pCore[i]));
|
|
}
|
|
printf("\n");
|
|
int neg_x2_in_core = 0;
|
|
for(int i = 0; i < nSize; i++) {
|
|
if(Abc_LitIsCompl(pCore[i]) && Abc_Lit2Var(pCore[i]) == 2) {
|
|
neg_x2_in_core = 1;
|
|
}
|
|
}
|
|
assert(neg_x2_in_core);
|
|
cadical_solver_delete(pSat);
|
|
printf("test 5 passed\n");
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
ABC_NAMESPACE_IMPL_END
|