summaryrefslogtreecommitdiffstats
path: root/src/opt
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2012-10-31 00:11:30 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2012-10-31 00:11:30 -0700
commit6f3425150b2b4c0fc2e86036da6cc543973162a0 (patch)
treef7f480cdd7b1140b1a3360362e8856dfe9f9018e /src/opt
parent66c044c688282dc7c4dc1f6ca82358fe2958a86e (diff)
downloadabc-6f3425150b2b4c0fc2e86036da6cc543973162a0.tar.gz
abc-6f3425150b2b4c0fc2e86036da6cc543973162a0.tar.bz2
abc-6f3425150b2b4c0fc2e86036da6cc543973162a0.zip
Improvements to the truth table computations.
Diffstat (limited to 'src/opt')
-rw-r--r--src/opt/dau/dauCanon.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/opt/dau/dauCanon.c b/src/opt/dau/dauCanon.c
index 8646fc89..0e8f2d1b 100644
--- a/src/opt/dau/dauCanon.c
+++ b/src/opt/dau/dauCanon.c
@@ -526,6 +526,93 @@ void Abc_TtConfactorTest( word * pTruth, int nVars, int N )
}
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Abc_TtCountOnesInCofsFast6_rec( word Truth, int iVar, int nBytes, int * pStore )
+{
+ static int bit_count[256] = {
+ 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
+ 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
+ 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
+ 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
+ 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
+ 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8
+ };
+ int nMints0, nMints1;
+ if ( Truth == 0 )
+ return 0;
+ if ( ~Truth == 0 )
+ {
+ int i;
+ for ( i = 0; i <= iVar; i++ )
+ pStore[i] += nBytes * 4;
+ return nBytes * 8;
+ }
+ if ( nBytes == 1 )
+ {
+ assert( iVar == 2 );
+ pStore[0] += bit_count[ Truth & 0x55 ];
+ pStore[1] += bit_count[ Truth & 0x33 ];
+ pStore[2] += bit_count[ Truth & 0x0F ];
+ return bit_count[ Truth & 0xFF ];
+ }
+ nMints0 = Abc_TtCountOnesInCofsFast6_rec( Abc_Tt6Cof0(Truth, iVar), iVar - 1, nBytes/2, pStore );
+ nMints1 = Abc_TtCountOnesInCofsFast6_rec( Abc_Tt6Cof1(Truth, iVar), iVar - 1, nBytes/2, pStore );
+ pStore[iVar] += nMints0;
+ return nMints0 + nMints1;
+}
+
+int Abc_TtCountOnesInCofsFast_rec( word * pTruth, int iVar, int nWords, int * pStore )
+{
+ int nMints0, nMints1;
+ if ( nWords == 1 )
+ {
+ assert( iVar == 5 );
+ return Abc_TtCountOnesInCofsFast6_rec( pTruth[0], iVar, 8, pStore );
+ }
+ assert( nWords > 1 );
+ assert( iVar > 5 );
+ if ( pTruth[0] & 1 )
+ {
+ if ( Abc_TtIsConst1( pTruth, nWords ) )
+ {
+ int i;
+ for ( i = 0; i <= iVar; i++ )
+ pStore[i] += nWords * 32;
+ return nWords * 64;
+ }
+ }
+ else
+ {
+ if ( Abc_TtIsConst0( pTruth, nWords ) )
+ return 0;
+ }
+ nMints0 = Abc_TtCountOnesInCofsFast_rec( pTruth, iVar - 1, nWords/2, pStore );
+ nMints1 = Abc_TtCountOnesInCofsFast_rec( pTruth + nWords/2, iVar - 1, nWords/2, pStore );
+ pStore[iVar] += nMints0;
+ return nMints0 + nMints1;
+}
+int Abc_TtCountOnesInCofsFast( word * pTruth, int nVars, int * pStore )
+{
+ memset( pStore, 0, sizeof(int) * nVars );
+ assert( nVars >= 3 );
+ if ( nVars <= 6 )
+ return Abc_TtCountOnesInCofsFast6_rec( pTruth[0], nVars - 1, Abc_TtByteNum( nVars ), pStore );
+ else
+ return Abc_TtCountOnesInCofsFast_rec( pTruth, nVars - 1, Abc_TtWordNum( nVars ), pStore );
+}
+
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///