summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2018-09-08 19:37:38 +0300
committerAlan Mishchenko <alanmi@berkeley.edu>2018-09-08 19:37:38 +0300
commita628fb30155dbb1794a4ba9e14388e7c143497c3 (patch)
tree7c7de82c70cd795b55924ef8a4d2e60899f852dd
parentd798d61637ad632fdb3656194fcb8626e8f6df3d (diff)
downloadabc-a628fb30155dbb1794a4ba9e14388e7c143497c3.tar.gz
abc-a628fb30155dbb1794a4ba9e14388e7c143497c3.tar.bz2
abc-a628fb30155dbb1794a4ba9e14388e7c143497c3.zip
Suspected bug fix in exact NPN classification.
-rw-r--r--src/opt/dau/dauCanon.c40
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*************************************************************