Commit ce8dbc4a by Alan Mishchenko

Exact synthesis of majority gates.

parent d3152aef
...@@ -1751,6 +1751,22 @@ static inline int Abc_TtFindFirstBit2( word * pIn, int nWords ) ...@@ -1751,6 +1751,22 @@ static inline int Abc_TtFindFirstBit2( word * pIn, int nWords )
return 64*w + Abc_Tt6FirstBit(pIn[w]); return 64*w + Abc_Tt6FirstBit(pIn[w]);
return -1; return -1;
} }
static inline int Abc_TtFindLastBit( word * pIn, int nVars )
{
int w, nWords = Abc_TtWordNum(nVars);
for ( w = nWords - 1; w >= 0; w-- )
if ( pIn[w] )
return 64*w + Abc_Tt6LastBit(pIn[w]);
return -1;
}
static inline int Abc_TtFindLastBit2( word * pIn, int nWords )
{
int w;
for ( w = nWords - 1; w >= 0; w-- )
if ( pIn[w] )
return 64*w + Abc_Tt6LastBit(pIn[w]);
return -1;
}
static inline int Abc_TtFindFirstDiffBit( word * pIn1, word * pIn2, int nVars ) static inline int Abc_TtFindFirstDiffBit( word * pIn1, word * pIn2, int nVars )
{ {
int w, nWords = Abc_TtWordNum(nVars); int w, nWords = Abc_TtWordNum(nVars);
...@@ -1767,20 +1783,28 @@ static inline int Abc_TtFindFirstDiffBit2( word * pIn1, word * pIn2, int nWords ...@@ -1767,20 +1783,28 @@ static inline int Abc_TtFindFirstDiffBit2( word * pIn1, word * pIn2, int nWords
return 64*w + Abc_Tt6FirstBit(pIn1[w] ^ pIn2[w]); return 64*w + Abc_Tt6FirstBit(pIn1[w] ^ pIn2[w]);
return -1; return -1;
} }
static inline int Abc_TtFindFirstZero( word * pIn, int nVars ) static inline int Abc_TtFindLastDiffBit( word * pIn1, word * pIn2, int nVars )
{ {
int w, nWords = Abc_TtWordNum(nVars); int w, nWords = Abc_TtWordNum(nVars);
for ( w = 0; w < nWords; w++ ) for ( w = nWords - 1; w >= 0; w-- )
if ( ~pIn[w] ) if ( pIn1[w] ^ pIn2[w] )
return 64*w + Abc_Tt6FirstBit(~pIn[w]); return 64*w + Abc_Tt6LastBit(pIn1[w] ^ pIn2[w]);
return -1; return -1;
} }
static inline int Abc_TtFindLastBit( word * pIn, int nVars ) static inline int Abc_TtFindLastDiffBit2( word * pIn1, word * pIn2, int nWords )
{ {
int w, nWords = Abc_TtWordNum(nVars); int w;
for ( w = nWords - 1; w >= 0; w-- ) for ( w = nWords - 1; w >= 0; w-- )
if ( pIn[w] ) if ( pIn1[w] ^ pIn2[w] )
return 64*w + Abc_Tt6LastBit(pIn[w]); return 64*w + Abc_Tt6LastBit(pIn1[w] ^ pIn2[w]);
return -1;
}
static inline int Abc_TtFindFirstZero( word * pIn, int nVars )
{
int w, nWords = Abc_TtWordNum(nVars);
for ( w = 0; w < nWords; w++ )
if ( ~pIn[w] )
return 64*w + Abc_Tt6FirstBit(~pIn[w]);
return -1; return -1;
} }
static inline int Abc_TtFindLastZero( word * pIn, int nVars ) static inline int Abc_TtFindLastZero( word * pIn, int nVars )
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
***********************************************************************/ ***********************************************************************/
#include "bmc.h" #include "bmc.h"
#include "misc/extra/extra.h"
#include "misc/util/utilTruth.h" #include "misc/util/utilTruth.h"
#include "sat/glucose/AbcGlucose.h" #include "sat/glucose/AbcGlucose.h"
...@@ -174,6 +175,7 @@ static inline int Maj_ManFindFanin( Maj_Man_t * p, int i, int k ) ...@@ -174,6 +175,7 @@ static inline int Maj_ManFindFanin( Maj_Man_t * p, int i, int k )
} }
static inline int Maj_ManEval( Maj_Man_t * p ) static inline int Maj_ManEval( Maj_Man_t * p )
{ {
static int Flag = 0;
int i, k, iMint; word * pFanins[3]; int i, k, iMint; word * pFanins[3];
for ( i = p->nVars + 2; i < p->nObjs; i++ ) for ( i = p->nVars + 2; i < p->nObjs; i++ )
{ {
...@@ -181,7 +183,12 @@ static inline int Maj_ManEval( Maj_Man_t * p ) ...@@ -181,7 +183,12 @@ static inline int Maj_ManEval( Maj_Man_t * p )
pFanins[k] = Maj_ManTruth( p, Maj_ManFindFanin(p, i, k) ); pFanins[k] = Maj_ManTruth( p, Maj_ManFindFanin(p, i, k) );
Abc_TtMaj( Maj_ManTruth(p, i), pFanins[0], pFanins[1], pFanins[2], p->nWords ); Abc_TtMaj( Maj_ManTruth(p, i), pFanins[0], pFanins[1], pFanins[2], p->nWords );
} }
iMint = Abc_TtFindFirstDiffBit( Maj_ManTruth(p, p->nObjs-1), Maj_ManTruth(p, p->nObjs), p->nWords ); if ( Flag && p->nVars >= 6 )
iMint = Abc_TtFindLastDiffBit( Maj_ManTruth(p, p->nObjs-1), Maj_ManTruth(p, p->nObjs), p->nVars );
else
iMint = Abc_TtFindFirstDiffBit( Maj_ManTruth(p, p->nObjs-1), Maj_ManTruth(p, p->nObjs), p->nVars );
//Flag ^= 1;
assert( iMint < (1 << p->nVars) );
return iMint; return iMint;
} }
...@@ -290,7 +297,6 @@ int Maj_ManAddCnf( Maj_Man_t * p, int iMint ) ...@@ -290,7 +297,6 @@ int Maj_ManAddCnf( Maj_Man_t * p, int iMint )
int iBaseSatVarI = p->iVar + 4*(i - p->nVars - 2); int iBaseSatVarI = p->iVar + 4*(i - p->nVars - 2);
for ( k = 0; k < 3; k++ ) for ( k = 0; k < 3; k++ )
{ {
int nLits2 = 0;
for ( j = 0; j < p->nObjs; j++ ) if ( p->VarMarks[i][k][j] ) for ( j = 0; j < p->nObjs; j++ ) if ( p->VarMarks[i][k][j] )
{ {
int iBaseSatVarJ = p->iVar + 4*(j - p->nVars - 2); int iBaseSatVarJ = p->iVar + 4*(j - p->nVars - 2);
...@@ -346,9 +352,10 @@ void Maj_ManExactSynthesis( int nVars, int nNodes, int fUseConst, int fVerbose ) ...@@ -346,9 +352,10 @@ void Maj_ManExactSynthesis( int nVars, int nNodes, int fUseConst, int fVerbose )
if ( fVerbose ) if ( fVerbose )
{ {
printf( "Iter %3d : ", i ); printf( "Iter %3d : ", i );
printf( "Vars = %5d ", p->iVar ); Extra_PrintBinary( stdout, (unsigned *)&iMint, p->nVars );
printf( "Clauses = %5d ", bmcg_sat_solver_clausenum(p->pSat) ); printf( " Var =%5d ", p->iVar );
printf( "Conflicts = %7d ", bmcg_sat_solver_conflictnum(p->pSat) ); printf( "Cla =%6d ", bmcg_sat_solver_clausenum(p->pSat) );
printf( "Conf =%8d ", bmcg_sat_solver_conflictnum(p->pSat) );
Abc_PrintTime( 1, "Time", Abc_Clock() - clk ); Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
} }
if ( status == GLUCOSE_UNSAT ) if ( status == GLUCOSE_UNSAT )
......
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