From afdaebe1b4288cc6a3cf6394996b04f3dc8506ab Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Thu, 23 May 2019 11:22:43 -0700 Subject: Experiments with counting care bits. --- src/sat/bmc/bmcCexTools.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) (limited to 'src/sat/bmc/bmcCexTools.c') diff --git a/src/sat/bmc/bmcCexTools.c b/src/sat/bmc/bmcCexTools.c index 5a29c8bc..7a1c86a6 100644 --- a/src/sat/bmc/bmcCexTools.c +++ b/src/sat/bmc/bmcCexTools.c @@ -843,6 +843,112 @@ void Bmc_CexTest( Gia_Man_t * p, Abc_Cex_t * pCex, int fVerbose ) // Bmc_CexPerformUnrollingTest( p, pCex ); } + + +/**Function************************************************************* + + Synopsis [Count the number of care bits.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Gia_ManCountCareBits( Gia_Man_t * p, Vec_Wec_t * vPats ) +{ + Gia_Obj_t * pObj; + int i, k, fCompl0, fCompl1; + word Counter = 0; + Vec_Int_t * vPat; + Vec_WecForEachLevel( vPats, vPat, i ) + { + int Count = 0; + assert( Vec_IntSize(vPat) == Gia_ManCiNum(p) ); + + // propagate forward + Gia_ManConst0(p)->fMark0 = 0; + Gia_ManConst0(p)->fMark1 = 0; + Gia_ManForEachCi( p, pObj, k ) + { + pObj->fMark0 = Vec_IntEntry(vPat, k); + pObj->fMark1 = 0; + } + Gia_ManForEachAnd( p, pObj, k ) + { + fCompl0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj); + fCompl1 = Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj); + pObj->fMark0 = fCompl0 & fCompl1; + pObj->fMark1 = 0; + } + Gia_ManForEachCo( p, pObj, k ) + { + pObj->fMark0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj); + Gia_ObjFanin0(pObj)->fMark1 = 1; + } + // propagate backward + Gia_ManForEachAndReverse( p, pObj, k ) + { + if ( !pObj->fMark1 ) + continue; + if ( pObj->fMark0 == 0 ) + { + fCompl0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj); + fCompl1 = Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj); + assert( fCompl0 == 0 || fCompl1 == 0 ); + if ( fCompl1 == 0 ) + Gia_ObjFanin1(pObj)->fMark1 = 1; + else if ( fCompl0 == 0 ) + Gia_ObjFanin0(pObj)->fMark1 = 1; + + } + else + { + Gia_ObjFanin0(pObj)->fMark1 = 1; + Gia_ObjFanin1(pObj)->fMark1 = 1; + } + } + Gia_ManForEachAnd( p, pObj, k ) + Count += pObj->fMark1; + Counter += Count; + + //printf( "%3d = %8d\n", i, Count ); + } + Counter /= Vec_WecSize(vPats); + printf( "Stats over %d patterns: Average care-nodes = %d (%6.2f %%)\n", Vec_WecSize(vPats), (int)Counter, 100.0*(int)Counter/Gia_ManAndNum(p) ); +} + +unsigned char * Mnist_ReadImages1_() +{ + int Size = 60000 * 28 * 28 + 16; + unsigned char * pData = malloc( Size ); + FILE * pFile = fopen( "train-images.idx3-ubyte", "rb" ); + int RetValue = fread( pData, 1, Size, pFile ); + assert( RetValue == Size ); + fclose( pFile ); + return pData; +} +Vec_Wec_t * Mnist_ReadImages_( int nPats ) +{ + Vec_Wec_t * vPats = Vec_WecStart( nPats ); + unsigned char * pL1 = Mnist_ReadImages1_(); + int i, k, x; + for ( i = 0; i < nPats; i++ ) + for ( x = 0; x < 784; x++ ) + for ( k = 0; k < 8; k++ ) + Vec_WecPush( vPats, i, (pL1[16 + i * 784 + x] >> k) & 1 ); + free( pL1 ); + return vPats; +} +void Gia_ManCountCareBitsTest( Gia_Man_t * p ) +{ + Vec_Wec_t * vPats = Mnist_ReadImages_( 100 ); + Gia_ManCountCareBits( p, vPats ); + Vec_WecFree( vPats ); +} + + //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// -- cgit v1.2.3