| /**CFile**************************************************************** |
| |
| FileName [fraPart.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [New FRAIG package.] |
| |
| Synopsis [Partitioning for induction.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - June 30, 2007.] |
| |
| Revision [$Id: fraPart.c,v 1.00 2007/06/30 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "fra.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Fra_ManPartitionTest( Aig_Man_t * p, int nComLim ) |
| { |
| // Bar_Progress_t * pProgress; |
| Vec_Vec_t * vSupps, * vSuppsIn; |
| Vec_Ptr_t * vSuppsNew; |
| Vec_Int_t * vSupNew, * vSup, * vSup2, * vTemp;//, * vSupIn; |
| Vec_Int_t * vOverNew, * vQuantNew; |
| Aig_Obj_t * pObj; |
| int i, k, nCommon, CountOver, CountQuant; |
| int nTotalSupp, nTotalSupp2, Entry, Largest;//, iVar; |
| double Ratio, R; |
| abctime clk; |
| |
| nTotalSupp = 0; |
| nTotalSupp2 = 0; |
| Ratio = 0.0; |
| |
| // compute supports |
| clk = Abc_Clock(); |
| vSupps = (Vec_Vec_t *)Aig_ManSupports( p ); |
| ABC_PRT( "Supports", Abc_Clock() - clk ); |
| // remove last entry |
| Aig_ManForEachCo( p, pObj, i ) |
| { |
| vSup = Vec_VecEntryInt( vSupps, i ); |
| Vec_IntPop( vSup ); |
| // remember support |
| // pObj->pNext = (Aig_Obj_t *)vSup; |
| } |
| |
| // create reverse supports |
| clk = Abc_Clock(); |
| vSuppsIn = Vec_VecStart( Aig_ManCiNum(p) ); |
| Aig_ManForEachCo( p, pObj, i ) |
| { |
| vSup = Vec_VecEntryInt( vSupps, i ); |
| Vec_IntForEachEntry( vSup, Entry, k ) |
| Vec_VecPush( vSuppsIn, Entry, (void *)(ABC_PTRUINT_T)i ); |
| } |
| ABC_PRT( "Inverse ", Abc_Clock() - clk ); |
| |
| clk = Abc_Clock(); |
| // compute extended supports |
| Largest = 0; |
| vSuppsNew = Vec_PtrAlloc( Aig_ManCoNum(p) ); |
| vOverNew = Vec_IntAlloc( Aig_ManCoNum(p) ); |
| vQuantNew = Vec_IntAlloc( Aig_ManCoNum(p) ); |
| // pProgress = Bar_ProgressStart( stdout, Aig_ManCoNum(p) ); |
| Aig_ManForEachCo( p, pObj, i ) |
| { |
| // Bar_ProgressUpdate( pProgress, i, NULL ); |
| // get old supports |
| vSup = Vec_VecEntryInt( vSupps, i ); |
| if ( Vec_IntSize(vSup) < 2 ) |
| continue; |
| // compute new supports |
| CountOver = CountQuant = 0; |
| vSupNew = Vec_IntDup( vSup ); |
| // go through the nodes where the first var appears |
| Aig_ManForEachCo( p, pObj, k ) |
| // iVar = Vec_IntEntry( vSup, 0 ); |
| // vSupIn = Vec_VecEntry( vSuppsIn, iVar ); |
| // Vec_IntForEachEntry( vSupIn, Entry, k ) |
| { |
| // pObj = Aig_ManObj( p, Entry ); |
| // get support of this output |
| // vSup2 = (Vec_Int_t *)pObj->pNext; |
| vSup2 = Vec_VecEntryInt( vSupps, k ); |
| // count the number of common vars |
| nCommon = Vec_IntTwoCountCommon(vSup, vSup2); |
| if ( nCommon < 2 ) |
| continue; |
| if ( nCommon > nComLim ) |
| { |
| vSupNew = Vec_IntTwoMerge( vTemp = vSupNew, vSup2 ); |
| Vec_IntFree( vTemp ); |
| CountOver++; |
| } |
| else |
| CountQuant++; |
| } |
| // save the results |
| Vec_PtrPush( vSuppsNew, vSupNew ); |
| Vec_IntPush( vOverNew, CountOver ); |
| Vec_IntPush( vQuantNew, CountQuant ); |
| |
| if ( Largest < Vec_IntSize(vSupNew) ) |
| Largest = Vec_IntSize(vSupNew); |
| |
| nTotalSupp += Vec_IntSize(vSup); |
| nTotalSupp2 += Vec_IntSize(vSupNew); |
| if ( Vec_IntSize(vSup) ) |
| R = Vec_IntSize(vSupNew) / Vec_IntSize(vSup); |
| else |
| R = 0; |
| Ratio += R; |
| |
| if ( R < 5.0 ) |
| continue; |
| |
| printf( "%6d : ", i ); |
| printf( "S = %5d. ", Vec_IntSize(vSup) ); |
| printf( "SNew = %5d. ", Vec_IntSize(vSupNew) ); |
| printf( "R = %7.2f. ", R ); |
| printf( "Over = %5d. ", CountOver ); |
| printf( "Quant = %5d. ", CountQuant ); |
| printf( "\n" ); |
| /* |
| Vec_IntForEachEntry( vSupNew, Entry, k ) |
| printf( "%d ", Entry ); |
| printf( "\n" ); |
| */ |
| } |
| // Bar_ProgressStop( pProgress ); |
| ABC_PRT( "Scanning", Abc_Clock() - clk ); |
| |
| // print cumulative statistics |
| printf( "PIs = %6d. POs = %6d. Lim = %3d. AveS = %3d. SN = %3d. R = %4.2f Max = %5d.\n", |
| Aig_ManCiNum(p), Aig_ManCoNum(p), nComLim, |
| nTotalSupp/Aig_ManCoNum(p), nTotalSupp2/Aig_ManCoNum(p), |
| Ratio/Aig_ManCoNum(p), Largest ); |
| |
| Vec_VecFree( vSupps ); |
| Vec_VecFree( vSuppsIn ); |
| Vec_VecFree( (Vec_Vec_t *)vSuppsNew ); |
| Vec_IntFree( vOverNew ); |
| Vec_IntFree( vQuantNew ); |
| } |
| |
| |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Fra_ManPartitionTest2( Aig_Man_t * p ) |
| { |
| Vec_Vec_t * vSupps, * vSuppsIn; |
| Vec_Int_t * vSup, * vSup2, * vSup3; |
| Aig_Obj_t * pObj; |
| int Entry, Entry2, Entry3, Counter; |
| int i, k, m, n; |
| abctime clk; |
| char * pSupp; |
| |
| // compute supports |
| clk = Abc_Clock(); |
| vSupps = (Vec_Vec_t *)Aig_ManSupports( p ); |
| ABC_PRT( "Supports", Abc_Clock() - clk ); |
| // remove last entry |
| Aig_ManForEachCo( p, pObj, i ) |
| { |
| vSup = Vec_VecEntryInt( vSupps, i ); |
| Vec_IntPop( vSup ); |
| // remember support |
| // pObj->pNext = (Aig_Obj_t *)vSup; |
| } |
| |
| // create reverse supports |
| clk = Abc_Clock(); |
| vSuppsIn = Vec_VecStart( Aig_ManCiNum(p) ); |
| Aig_ManForEachCo( p, pObj, i ) |
| { |
| if ( i == p->nAsserts ) |
| break; |
| vSup = Vec_VecEntryInt( vSupps, i ); |
| Vec_IntForEachEntry( vSup, Entry, k ) |
| Vec_VecPush( vSuppsIn, Entry, (void *)(ABC_PTRUINT_T)i ); |
| } |
| ABC_PRT( "Inverse ", Abc_Clock() - clk ); |
| |
| // create affective supports |
| clk = Abc_Clock(); |
| pSupp = ABC_ALLOC( char, Aig_ManCiNum(p) ); |
| Aig_ManForEachCo( p, pObj, i ) |
| { |
| if ( i % 50 != 0 ) |
| continue; |
| vSup = Vec_VecEntryInt( vSupps, i ); |
| memset( pSupp, 0, sizeof(char) * Aig_ManCiNum(p) ); |
| // go through each input of this output |
| Vec_IntForEachEntry( vSup, Entry, k ) |
| { |
| pSupp[Entry] = 1; |
| vSup2 = Vec_VecEntryInt( vSuppsIn, Entry ); |
| // go though each assert of this input |
| Vec_IntForEachEntry( vSup2, Entry2, m ) |
| { |
| vSup3 = Vec_VecEntryInt( vSupps, Entry2 ); |
| // go through each input of this assert |
| Vec_IntForEachEntry( vSup3, Entry3, n ) |
| { |
| pSupp[Entry3] = 1; |
| } |
| } |
| } |
| // count the entries |
| Counter = 0; |
| for ( m = 0; m < Aig_ManCiNum(p); m++ ) |
| Counter += pSupp[m]; |
| printf( "%d(%d) ", Vec_IntSize(vSup), Counter ); |
| } |
| printf( "\n" ); |
| ABC_PRT( "Extension ", Abc_Clock() - clk ); |
| |
| ABC_FREE( pSupp ); |
| Vec_VecFree( vSupps ); |
| Vec_VecFree( vSuppsIn ); |
| } |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |