summaryrefslogtreecommitdiffstats
path: root/src/sat/bmc
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2017-12-06 11:18:43 -0800
committerAlan Mishchenko <alanmi@berkeley.edu>2017-12-06 11:18:43 -0800
commit67181d0446de9f0b0b5df685701ceb420373790f (patch)
treede5e34447189f050bf3cbf9f6403fec1b6b40514 /src/sat/bmc
parentc4322a0afd740d85fe850e0811d629627a062403 (diff)
downloadabc-67181d0446de9f0b0b5df685701ceb420373790f.tar.gz
abc-67181d0446de9f0b0b5df685701ceb420373790f.tar.bz2
abc-67181d0446de9f0b0b5df685701ceb420373790f.zip
An improvement to 'twoexact' and 'lutexact'.
Diffstat (limited to 'src/sat/bmc')
-rw-r--r--src/sat/bmc/bmcMaj.c20
-rw-r--r--src/sat/bmc/bmcMaj2.c22
2 files changed, 42 insertions, 0 deletions
diff --git a/src/sat/bmc/bmcMaj.c b/src/sat/bmc/bmcMaj.c
index 4f5dadef..db56f98b 100644
--- a/src/sat/bmc/bmcMaj.c
+++ b/src/sat/bmc/bmcMaj.c
@@ -628,6 +628,16 @@ int Exa_ManAddCnfStart( Exa_Man_t * p, int fOnlyAnd )
return 0;
}
}
+ // node ordering
+ for ( j = p->nVars; j < i; j++ )
+ for ( n = 0; n < p->nObjs; n++ ) if ( p->VarMarks[i][0][n] )
+ for ( m = n+1; m < p->nObjs; m++ ) if ( p->VarMarks[j][0][m] )
+ {
+ pLits2[0] = Abc_Var2Lit( p->VarMarks[i][0][n], 1 );
+ pLits2[1] = Abc_Var2Lit( p->VarMarks[j][0][m], 1 );
+ if ( !bmcg_sat_solver_addclause( p->pSat, pLits2, 2 ) )
+ return 0;
+ }
// two input functions
for ( k = 0; k < 3; k++ )
{
@@ -1007,6 +1017,16 @@ static int Exa3_ManAddCnfStart( Exa3_Man_t * p, int fOnlyAnd )
return 0;
}
}
+ // node ordering
+ for ( j = p->nVars; j < i; j++ )
+ for ( n = 0; n < p->nObjs; n++ ) if ( p->VarMarks[i][0][n] )
+ for ( m = n+1; m < p->nObjs; m++ ) if ( p->VarMarks[j][0][m] )
+ {
+ pLits2[0] = Abc_Var2Lit( p->VarMarks[i][0][n], 1 );
+ pLits2[1] = Abc_Var2Lit( p->VarMarks[j][0][m], 1 );
+ if ( !bmcg_sat_solver_addclause( p->pSat, pLits2, 2 ) )
+ return 0;
+ }
if ( p->nLutSize != 2 )
continue;
// two-input functions
diff --git a/src/sat/bmc/bmcMaj2.c b/src/sat/bmc/bmcMaj2.c
index 23b5cf41..aed84474 100644
--- a/src/sat/bmc/bmcMaj2.c
+++ b/src/sat/bmc/bmcMaj2.c
@@ -735,6 +735,16 @@ static int Exa_ManAddCnfStart( Exa_Man_t * p, int fOnlyAnd )
return 0;
}
}
+ // node ordering
+ for ( j = p->nVars; j < i; j++ )
+ for ( n = 0; n < p->nObjs; n++ ) if ( p->VarMarks[i][0][n] )
+ for ( m = n+1; m < p->nObjs; m++ ) if ( p->VarMarks[j][0][m] )
+ {
+ pLits2[0] = Abc_Var2Lit( p->VarMarks[i][0][n], 1 );
+ pLits2[1] = Abc_Var2Lit( p->VarMarks[j][0][m], 1 );
+ if ( !sat_solver_addclause( p->pSat, pLits2, pLits2+2 ) )
+ return 0;
+ }
// two input functions
for ( k = 0; k < 3; k++ )
{
@@ -1126,6 +1136,18 @@ static int Exa3_ManAddCnfStart( Exa3_Man_t * p, int fOnlyAnd )
return 0;
}
}
+ //printf( "Node %d:\n", i );
+ //sat_solver_flip_print_clause( p->pSat );
+ // node ordering
+ for ( j = p->nVars; j < i; j++ )
+ for ( n = 0; n < p->nObjs; n++ ) if ( p->VarMarks[i][0][n] )
+ for ( m = n+1; m < p->nObjs; m++ ) if ( p->VarMarks[j][0][m] )
+ {
+ pLits2[0] = Abc_Var2Lit( p->VarMarks[i][0][n], 1 );
+ pLits2[1] = Abc_Var2Lit( p->VarMarks[j][0][m], 1 );
+ if ( !sat_solver_addclause( p->pSat, pLits2, pLits2+2 ) )
+ return 0;
+ }
if ( p->nLutSize != 2 )
continue;
// two-input functions