diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2018-09-08 19:37:38 +0300 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2018-09-08 19:37:38 +0300 |
commit | a628fb30155dbb1794a4ba9e14388e7c143497c3 (patch) | |
tree | 7c7de82c70cd795b55924ef8a4d2e60899f852dd | |
parent | d798d61637ad632fdb3656194fcb8626e8f6df3d (diff) | |
download | abc-a628fb30155dbb1794a4ba9e14388e7c143497c3.tar.gz abc-a628fb30155dbb1794a4ba9e14388e7c143497c3.tar.bz2 abc-a628fb30155dbb1794a4ba9e14388e7c143497c3.zip |
Suspected bug fix in exact NPN classification.
-rw-r--r-- | src/opt/dau/dauCanon.c | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/src/opt/dau/dauCanon.c b/src/opt/dau/dauCanon.c index 0c93cc85..393fc95b 100644 --- a/src/opt/dau/dauCanon.c +++ b/src/opt/dau/dauCanon.c @@ -1220,7 +1220,7 @@ int Abc_TtHieRetrieveOrInsert(Abc_TtHieMan_t * p, int level, word * pTruth, word return 0; } -unsigned Abc_TtCanonicizeHie( Abc_TtHieMan_t * p, word * pTruthInit, int nVars, char * pCanonPerm, int fExact ) +unsigned Abc_TtCanonicizeHie_int( Abc_TtHieMan_t * p, word * pTruthInit, int nVars, char * pCanonPerm, int fExact ) { int fNaive = 1; int pStore[17]; @@ -1230,13 +1230,6 @@ unsigned Abc_TtCanonicizeHie( Abc_TtHieMan_t * p, word * pTruthInit, int nVars, int i, k; assert( nVars <= 16 ); - // handle constant - if ( nVars == 0 ) - { - Abc_TtClear( pTruthInit, nWords ); - return 0; - } - Abc_TtCopy( pTruth, pTruthInit, nWords, 0 ); for ( i = 0; i < nVars; i++ ) @@ -1354,6 +1347,37 @@ unsigned Abc_TtCanonicizeHie( Abc_TtHieMan_t * p, word * pTruthInit, int nVars, return 0; } +unsigned Abc_TtCanonicizeHie( Abc_TtHieMan_t * p, word * pTruthInit, int nVars, char * pCanonPerm, int fExact ) +{ + int nOnes, nWords = Abc_TtWordNum( nVars ); + static word pTruth0[1024], pTruth1[1024]; + // handle constant + if ( nVars == 0 ) + { + Abc_TtClear( pTruthInit, nWords ); + return 0; + } + if ( !fExact ) + return Abc_TtCanonicizeHie_int(p, pTruthInit, nVars, pCanonPerm, fExact ); + + // normalize polarity + nOnes = Abc_TtCountOnesInTruth( pTruthInit, nVars ); + if ( nOnes != nWords * 32 ) + return Abc_TtCanonicizeHie_int(p, pTruthInit, nVars, pCanonPerm, fExact ); + + Abc_TtCopy( pTruth0, pTruthInit, nWords, 0 ); + Abc_TtCopy( pTruth1, pTruthInit, nWords, 0 ); + Abc_TtNot( pTruth0, nWords ); + + Abc_TtCanonicizeHie_int(p, pTruth0, nVars, pCanonPerm, fExact ); + Abc_TtCanonicizeHie_int(p, pTruth1, nVars, pCanonPerm, fExact ); + + if ( memcmp(pTruth0, pTruth1, sizeof(word)*nWords) < 0 ) + Abc_TtCopy( pTruthInit, pTruth0, nWords, 0 ); + else + Abc_TtCopy( pTruthInit, pTruth1, nWords, 0 ); + return 0; +} /**Function************************************************************* |