Commit 596f387b by Alan Mishchenko

Improvements to Boolean matching.

parent a0ed3479
...@@ -448,7 +448,7 @@ void Ifn_TtComparisonConstr( word * pTruth, int nVars, int fMore, int fEqual ) ...@@ -448,7 +448,7 @@ void Ifn_TtComparisonConstr( word * pTruth, int nVars, int fMore, int fEqual )
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
void Ifn_AddClause( sat_solver * pSat, int * pBeg, int * pEnd ) int Ifn_AddClause( sat_solver * pSat, int * pBeg, int * pEnd )
{ {
int fVerbose = 0; int fVerbose = 0;
int RetValue = sat_solver_addclause( pSat, pBeg, pEnd ); int RetValue = sat_solver_addclause( pSat, pBeg, pEnd );
...@@ -458,11 +458,11 @@ void Ifn_AddClause( sat_solver * pSat, int * pBeg, int * pEnd ) ...@@ -458,11 +458,11 @@ void Ifn_AddClause( sat_solver * pSat, int * pBeg, int * pEnd )
printf( "%c%d ", Abc_LitIsCompl(*pBeg) ? '-':'+', Abc_Lit2Var(*pBeg) ); printf( "%c%d ", Abc_LitIsCompl(*pBeg) ? '-':'+', Abc_Lit2Var(*pBeg) );
printf( "\n" ); printf( "\n" );
} }
assert( RetValue ); return RetValue;
} }
void Ifn_NtkAddConstrOne( sat_solver * pSat, Vec_Int_t * vCover, int * pVars, int nVars ) void Ifn_NtkAddConstrOne( sat_solver * pSat, Vec_Int_t * vCover, int * pVars, int nVars )
{ {
int k, c, Cube, Literal, nLits, pLits[IFN_INS]; int RetValue, k, c, Cube, Literal, nLits, pLits[IFN_INS];
Vec_IntForEachEntry( vCover, Cube, c ) Vec_IntForEachEntry( vCover, Cube, c )
{ {
nLits = 0; nLits = 0;
...@@ -476,7 +476,8 @@ void Ifn_NtkAddConstrOne( sat_solver * pSat, Vec_Int_t * vCover, int * pVars, in ...@@ -476,7 +476,8 @@ void Ifn_NtkAddConstrOne( sat_solver * pSat, Vec_Int_t * vCover, int * pVars, in
else if ( Literal != 0 ) else if ( Literal != 0 )
assert( 0 ); assert( 0 );
} }
Ifn_AddClause( pSat, pLits, pLits + nLits ); RetValue = Ifn_AddClause( pSat, pLits, pLits + nLits );
assert( RetValue );
} }
} }
void Ifn_NtkAddConstraints( Ifn_Ntk_t * p, sat_solver * pSat ) void Ifn_NtkAddConstraints( Ifn_Ntk_t * p, sat_solver * pSat )
...@@ -563,7 +564,8 @@ int Ifn_NtkAddClauses( Ifn_Ntk_t * p, int * pValues, sat_solver * pSat ) ...@@ -563,7 +564,8 @@ int Ifn_NtkAddClauses( Ifn_Ntk_t * p, int * pValues, sat_solver * pSat )
// add clause literals // add clause literals
for ( f = 0; f < p->nParsVNum; f++ ) for ( f = 0; f < p->nParsVNum; f++ )
pLits[f+1] = Abc_Var2Lit( iParStart + f, (v >> f) & 1 ); pLits[f+1] = Abc_Var2Lit( iParStart + f, (v >> f) & 1 );
Ifn_AddClause( pSat, pLits, pLits+p->nParsVNum+1 ); if ( !Ifn_AddClause( pSat, pLits, pLits+p->nParsVNum+1 ) )
return 0;
} }
} }
//printf( "\n" ); //printf( "\n" );
...@@ -581,10 +583,12 @@ int Ifn_NtkAddClauses( Ifn_Ntk_t * p, int * pValues, sat_solver * pSat ) ...@@ -581,10 +583,12 @@ int Ifn_NtkAddClauses( Ifn_Ntk_t * p, int * pValues, sat_solver * pSat )
// add small clause // add small clause
pLits2[0] = Abc_Var2Lit( p->Nodes[i].Var, 1 ); pLits2[0] = Abc_Var2Lit( p->Nodes[i].Var, 1 );
pLits2[1] = Abc_Var2Lit( p->Nodes[pFans[f]].Var, 0 ); pLits2[1] = Abc_Var2Lit( p->Nodes[pFans[f]].Var, 0 );
Ifn_AddClause( pSat, pLits2, pLits2 + 2 ); if ( !Ifn_AddClause( pSat, pLits2, pLits2 + 2 ) )
return 0;
} }
// add big clause // add big clause
Ifn_AddClause( pSat, pLits, pLits + nLits ); if ( !Ifn_AddClause( pSat, pLits, pLits + nLits ) )
return 0;
} }
else if ( p->Nodes[i].Type == IF_DSD_XOR ) else if ( p->Nodes[i].Type == IF_DSD_XOR )
{ {
...@@ -601,7 +605,8 @@ int Ifn_NtkAddClauses( Ifn_Ntk_t * p, int * pValues, sat_solver * pSat ) ...@@ -601,7 +605,8 @@ int Ifn_NtkAddClauses( Ifn_Ntk_t * p, int * pValues, sat_solver * pSat )
pLits[0] = Abc_Var2Lit( p->Nodes[i].Var, (m >> nFans) & 1 ); pLits[0] = Abc_Var2Lit( p->Nodes[i].Var, (m >> nFans) & 1 );
for ( v = 0; v < nFans; v++ ) for ( v = 0; v < nFans; v++ )
pLits[v+1] = Abc_Var2Lit( p->Nodes[pFans[v]].Var, (m >> v) & 1 ); pLits[v+1] = Abc_Var2Lit( p->Nodes[pFans[v]].Var, (m >> v) & 1 );
Ifn_AddClause( pSat, pLits, pLits + nFans + 1 ); if ( !Ifn_AddClause( pSat, pLits, pLits + nFans + 1 ) )
return 0;
} }
} }
else if ( p->Nodes[i].Type == IF_DSD_MUX ) else if ( p->Nodes[i].Type == IF_DSD_MUX )
...@@ -609,22 +614,26 @@ int Ifn_NtkAddClauses( Ifn_Ntk_t * p, int * pValues, sat_solver * pSat ) ...@@ -609,22 +614,26 @@ int Ifn_NtkAddClauses( Ifn_Ntk_t * p, int * pValues, sat_solver * pSat )
pLits[0] = Abc_Var2Lit( p->Nodes[i].Var, 0 ); pLits[0] = Abc_Var2Lit( p->Nodes[i].Var, 0 );
pLits[1] = Abc_Var2Lit( p->Nodes[pFans[0]].Var, 1 ); // ctrl pLits[1] = Abc_Var2Lit( p->Nodes[pFans[0]].Var, 1 ); // ctrl
pLits[2] = Abc_Var2Lit( p->Nodes[pFans[1]].Var, 1 ); pLits[2] = Abc_Var2Lit( p->Nodes[pFans[1]].Var, 1 );
Ifn_AddClause( pSat, pLits, pLits + 3 ); if ( !Ifn_AddClause( pSat, pLits, pLits + 3 ) )
return 0;
pLits[0] = Abc_Var2Lit( p->Nodes[i].Var, 1 ); pLits[0] = Abc_Var2Lit( p->Nodes[i].Var, 1 );
pLits[1] = Abc_Var2Lit( p->Nodes[pFans[0]].Var, 1 ); // ctrl pLits[1] = Abc_Var2Lit( p->Nodes[pFans[0]].Var, 1 ); // ctrl
pLits[2] = Abc_Var2Lit( p->Nodes[pFans[1]].Var, 0 ); pLits[2] = Abc_Var2Lit( p->Nodes[pFans[1]].Var, 0 );
Ifn_AddClause( pSat, pLits, pLits + 3 ); if ( !Ifn_AddClause( pSat, pLits, pLits + 3 ) )
return 0;
pLits[0] = Abc_Var2Lit( p->Nodes[i].Var, 0 ); pLits[0] = Abc_Var2Lit( p->Nodes[i].Var, 0 );
pLits[1] = Abc_Var2Lit( p->Nodes[pFans[0]].Var, 0 ); // ctrl pLits[1] = Abc_Var2Lit( p->Nodes[pFans[0]].Var, 0 ); // ctrl
pLits[2] = Abc_Var2Lit( p->Nodes[pFans[2]].Var, 1 ); pLits[2] = Abc_Var2Lit( p->Nodes[pFans[2]].Var, 1 );
Ifn_AddClause( pSat, pLits, pLits + 3 ); if ( !Ifn_AddClause( pSat, pLits, pLits + 3 ) )
return 0;
pLits[0] = Abc_Var2Lit( p->Nodes[i].Var, 1 ); pLits[0] = Abc_Var2Lit( p->Nodes[i].Var, 1 );
pLits[1] = Abc_Var2Lit( p->Nodes[pFans[0]].Var, 0 ); // ctrl pLits[1] = Abc_Var2Lit( p->Nodes[pFans[0]].Var, 0 ); // ctrl
pLits[2] = Abc_Var2Lit( p->Nodes[pFans[2]].Var, 0 ); pLits[2] = Abc_Var2Lit( p->Nodes[pFans[2]].Var, 0 );
Ifn_AddClause( pSat, pLits, pLits + 3 ); if ( !Ifn_AddClause( pSat, pLits, pLits + 3 ) )
return 0;
} }
else if ( p->Nodes[i].Type == IF_DSD_PRIME ) else if ( p->Nodes[i].Type == IF_DSD_PRIME )
{ {
...@@ -645,9 +654,15 @@ int Ifn_NtkAddClauses( Ifn_Ntk_t * p, int * pValues, sat_solver * pSat ) ...@@ -645,9 +654,15 @@ int Ifn_NtkAddClauses( Ifn_Ntk_t * p, int * pValues, sat_solver * pSat )
pLits2[nLits] = Abc_Var2Lit( iParStart + v, 0 ); pLits2[nLits] = Abc_Var2Lit( iParStart + v, 0 );
nLits++; nLits++;
if ( pValues[i] != 0 ) if ( pValues[i] != 0 )
Ifn_AddClause( pSat, pLits2, pLits2 + nLits ); {
if ( !Ifn_AddClause( pSat, pLits2, pLits2 + nLits ) )
return 0;
}
if ( pValues[i] != 1 ) if ( pValues[i] != 1 )
Ifn_AddClause( pSat, pLits, pLits + nLits ); {
if ( !Ifn_AddClause( pSat, pLits, pLits + nLits ) )
return 0;
}
} }
} }
else assert( 0 ); else assert( 0 );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment