diff options
| author | Alan Mishchenko <alanmi@berkeley.edu> | 2014-11-25 19:37:01 -0800 | 
|---|---|---|
| committer | Alan Mishchenko <alanmi@berkeley.edu> | 2014-11-25 19:37:01 -0800 | 
| commit | 9e0c90d4c3f3c94afaf6ddd737f341f3bcfdd945 (patch) | |
| tree | 3628c800c79996833cfb305dbcf708b2212c95ef /src | |
| parent | dd3e5a90dea198bb8366f32bdef4dc8672974d05 (diff) | |
| download | abc-9e0c90d4c3f3c94afaf6ddd737f341f3bcfdd945.tar.gz abc-9e0c90d4c3f3c94afaf6ddd737f341f3bcfdd945.tar.bz2 abc-9e0c90d4c3f3c94afaf6ddd737f341f3bcfdd945.zip  | |
Adding integrity check for boxes and flops.
Diffstat (limited to 'src')
| -rw-r--r-- | src/aig/gia/gia.h | 4 | ||||
| -rw-r--r-- | src/aig/gia/giaMan.c | 21 | ||||
| -rw-r--r-- | src/aig/gia/giaMfs.c | 2 | ||||
| -rw-r--r-- | src/aig/gia/giaSweep.c | 99 | ||||
| -rw-r--r-- | src/aig/gia/giaTim.c | 12 | 
5 files changed, 115 insertions, 23 deletions
diff --git a/src/aig/gia/gia.h b/src/aig/gia/gia.h index 1e9bf6ef..e29689fc 100644 --- a/src/aig/gia/gia.h +++ b/src/aig/gia/gia.h @@ -1319,6 +1319,7 @@ extern Gia_Man_t *         Gia_ManStgRead( char * pFileName, int kHot, int fVerb  /*=== giaSweep.c ============================================================*/  extern Gia_Man_t *         Gia_ManFraigSweepSimple( Gia_Man_t * p, void * pPars );  extern Gia_Man_t *         Gia_ManSweepWithBoxes( Gia_Man_t * p, void * pParsC, void * pParsS, int fConst, int fEquiv, int fVerbose ); +extern void                Gia_ManCheckIntegrityWithBoxes( Gia_Man_t * p );  /*=== giaSweeper.c ============================================================*/  extern Gia_Man_t *         Gia_SweeperStart( Gia_Man_t * p );  extern void                Gia_SweeperStop( Gia_Man_t * p ); @@ -1351,6 +1352,9 @@ extern Vec_Flt_t *         Gia_ManPrintOutputProb( Gia_Man_t * p );  /*=== giaTim.c ===========================================================*/  extern int                 Gia_ManBoxNum( Gia_Man_t * p );  extern int                 Gia_ManRegBoxNum( Gia_Man_t * p ); +extern int                 Gia_ManNonRegBoxNum( Gia_Man_t * p ); +extern int                 Gia_ManBoxCiNum( Gia_Man_t * p ); +extern int                 Gia_ManBoxCoNum( Gia_Man_t * p );  extern int                 Gia_ManIsSeqWithBoxes( Gia_Man_t * p );  extern int                 Gia_ManIsNormalized( Gia_Man_t * p );  extern Gia_Man_t *         Gia_ManDupNormalize( Gia_Man_t * p ); diff --git a/src/aig/gia/giaMan.c b/src/aig/gia/giaMan.c index 533b6cad..69eda95e 100644 --- a/src/aig/gia/giaMan.c +++ b/src/aig/gia/giaMan.c @@ -403,13 +403,15 @@ void Gia_ManPrintStats( Gia_Man_t * p, Gps_Par_t * pPars )      if ( p->pName )          Abc_Print( 1, "%s%-8s%s : ", "\033[1;37m", p->pName, "\033[0m" );  // bright  #endif -    Abc_Print( 1, "i/o =%7d/%7d", Gia_ManPiNum(p), Gia_ManPoNum(p) ); +    Abc_Print( 1, "i/o =%7d/%7d",  +        Gia_ManPiNum(p) - Gia_ManBoxCiNum(p) - Gia_ManRegBoxNum(p),  +        Gia_ManPoNum(p) - Gia_ManBoxCoNum(p) - Gia_ManRegBoxNum(p) );      if ( Gia_ManConstrNum(p) )          Abc_Print( 1, "(c=%d)", Gia_ManConstrNum(p) );      if ( Gia_ManRegNum(p) )          Abc_Print( 1, "  ff =%7d", Gia_ManRegNum(p) ); -    if ( p->vRegClasses ) -        Abc_Print( 1, "  boxff =%d(%d)", Vec_IntSize(p->vRegClasses), Vec_IntFindMax(p->vRegClasses) ); +    if ( Gia_ManRegBoxNum(p) ) +        Abc_Print( 1, "  boxff =%d(%d)", Gia_ManRegBoxNum(p), Vec_IntFindMax(p->vRegClasses) );  #ifdef WIN32      { @@ -433,7 +435,7 @@ void Gia_ManPrintStats( Gia_Man_t * p, Gps_Par_t * pPars )      if ( Gia_ManHasChoices(p) )          Abc_Print( 1, "  ch =%5d", Gia_ManChoiceNum(p) );      if ( p->pManTime ) -        Abc_Print( 1, "  box = %d", Gia_ManBoxNum(p) - Gia_ManRegBoxNum(p) ); +        Abc_Print( 1, "  box = %d", Gia_ManNonRegBoxNum(p) );      if ( pPars && pPars->fMuxXor )          printf( "\nXOR/MUX " ), Gia_ManPrintMuxStats( p );      if ( pPars && pPars->fSwitch ) @@ -475,6 +477,17 @@ void Gia_ManPrintStats( Gia_Man_t * p, Gps_Par_t * pPars )  //    }      if ( p->vInitClasses )          Gia_ManPrintInitClasses( p->vInitClasses ); +    // check integrity of boxes +    Gia_ManCheckIntegrityWithBoxes( p ); +/* +    if ( Gia_ManRegBoxNum(p) ) +    { +        int i, Limit = Vec_IntFindMax(p->vRegClasses); +        for ( i = 1; i <= Limit; i++ ) +            printf( "%d ", Vec_IntCountEntry(p->vRegClasses, i) ); +        printf( "\n" ); +    } +*/      if ( pPars && pPars->fTents )      {  /* diff --git a/src/aig/gia/giaMfs.c b/src/aig/gia/giaMfs.c index 32322ab2..039b6654 100644 --- a/src/aig/gia/giaMfs.c +++ b/src/aig/gia/giaMfs.c @@ -404,6 +404,8 @@ Gia_Man_t * Gia_ManPerformMfs( Gia_Man_t * p, Sfm_Par_t * pPars )          pNew = Gia_ManInsertMfs( p, pNtk );          if( pPars->fVerbose )              Abc_Print( 1, "The network has %d nodes changed by \"&mfs\".\n", nNodes ); +        // check integrity +        //Gia_ManCheckIntegrityWithBoxes( pNew );      }      Sfm_NtkFree( pNtk );      return pNew; diff --git a/src/aig/gia/giaSweep.c b/src/aig/gia/giaSweep.c index 76176d80..682e39c9 100644 --- a/src/aig/gia/giaSweep.c +++ b/src/aig/gia/giaSweep.c @@ -361,6 +361,75 @@ Gia_Man_t * Gia_ManFraigReduceGia( Gia_Man_t * p, int * pReprs )  /**Function************************************************************* +  Synopsis    [Compute the set of CIs representing carry-outs of boxes.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +Vec_Int_t * Gia_ManComputeCarryOuts( Gia_Man_t * p ) +{ +    Gia_Obj_t * pObj; +    Tim_Man_t * pManTime = (Tim_Man_t *)p->pManTime; +    int i, iLast, iBox, nBoxes =  Tim_ManBoxNum( pManTime ); +    Vec_Int_t * vCarryOuts = Vec_IntAlloc( nBoxes ); +    for ( i = 0; i < nBoxes; i++ ) +    { +        iLast = Tim_ManBoxInputLast( pManTime, i ); +        pObj = Gia_ObjFanin0( Gia_ManCo(p, iLast) ); +        if ( !Gia_ObjIsCi(pObj) ) +            continue; +        iBox = Tim_ManBoxForCi( pManTime, Gia_ObjCioId(pObj) ); +        if ( iBox == -1 )  +            continue; +        assert( Gia_ObjIsCi(pObj) ); +        if ( Gia_ObjCioId(pObj) == Tim_ManBoxOutputLast(pManTime, iBox) ) +            Vec_IntPush( vCarryOuts, Gia_ObjId(p, pObj) ); +    } +    return vCarryOuts; +} + +/**Function************************************************************* + +  Synopsis    [Checks integriting of complex flops and carry-chains.] + +  Description [] +                +  SideEffects [] + +  SeeAlso     [] + +***********************************************************************/ +void Gia_ManCheckIntegrityWithBoxes( Gia_Man_t * p ) +{ +    Gia_Obj_t * pObj; +    Vec_Int_t * vCarryOuts; +    int i, nCountReg = 0, nCountCarry = 0; +    if ( p->pManTime == NULL ) +        return; +    Gia_ManCreateRefs( p ); +    for ( i = Gia_ManPoNum(p) - Gia_ManRegBoxNum(p); i < Gia_ManPoNum(p); i++ ) +    { +        pObj = Gia_ObjFanin0( Gia_ManPo(p, i) ); +        assert( Gia_ObjIsCi(pObj) ); +        if ( Gia_ObjRefNum(p, pObj) > 1 ) +            nCountReg++; +    } +    vCarryOuts = Gia_ManComputeCarryOuts( p ); +    Gia_ManForEachObjVec( vCarryOuts, p, pObj, i ) +        if ( Gia_ObjRefNum(p, pObj) > 1 ) +            nCountCarry++; +    Vec_IntFree( vCarryOuts ); +    if ( nCountReg || nCountCarry ) +        printf( "Warning: AIG with boxes has internal fanout in %d complex flops and %d carries.\n", nCountReg, nCountCarry ); +    ABC_FREE( p->pRefs ); +} + +/**Function************************************************************* +    Synopsis    [Computes representatives in terms of the original objects.]    Description [] @@ -373,11 +442,12 @@ Gia_Man_t * Gia_ManFraigReduceGia( Gia_Man_t * p, int * pReprs )  int * Gia_ManFraigSelectReprs( Gia_Man_t * p, Gia_Man_t * pClp, int fVerbose )  {      Gia_Obj_t * pObj; +    Vec_Int_t * vCarryOuts;      Tim_Man_t * pManTime = (Tim_Man_t *)p->pManTime;      int * pReprs   = ABC_FALLOC( int, Gia_ManObjNum(p) );      int * pClp2Gia = ABC_FALLOC( int, Gia_ManObjNum(pClp) ); -    int i, nBoxes, iLast, iBox, iLitClp, iLitClp2, iReprClp, fCompl; -    int nConsts = 0, nReprs = 0, Count1 = 0, Count2 = 0; +    int i, iLitClp, iLitClp2, iReprClp, fCompl; +    int nConsts = 0, nReprs = 0;      assert( pManTime != NULL );      // count the number of equivalent objects      Gia_ManForEachObj1( pClp, pObj, i ) @@ -402,26 +472,15 @@ int * Gia_ManFraigSelectReprs( Gia_Man_t * p, Gia_Man_t * pClp, int fVerbose )          pObj = Gia_ObjFanin0( Gia_ManPo(p, i) );          assert( Gia_ObjIsCi(pObj) );          pObj->fMark0 = 1; -        Count1++;      }      // mark connects between last box inputs and first box outputs -    nBoxes =  Tim_ManBoxNum( pManTime ); -    for ( i = 0; i < nBoxes; i++ ) -    { -        iLast = Tim_ManBoxInputLast( pManTime, i ); -        pObj = Gia_ObjFanin0( Gia_ManCo(p, iLast) ); -        if ( !Gia_ObjIsCi(pObj) ) -            continue; -        iBox = Tim_ManBoxForCi( pManTime, Gia_ObjCioId(pObj) ); -        if ( iBox == -1 )  -            continue; -        assert( Gia_ObjIsCi(pObj) ); -        if ( Gia_ObjCioId(pObj) == Tim_ManBoxOutputLast(pManTime, iBox) ) -            pObj->fMark0 = 1, Count2++; -    } +    vCarryOuts = Gia_ManComputeCarryOuts( p ); +    Gia_ManForEachObjVec( vCarryOuts, p, pObj, i ) +        pObj->fMark0 = 1;      if ( fVerbose ) -        printf( "Fixed %d flop inputs and %d box/box connections (out of %d boxes).\n",  -            Count1, Count2, nBoxes - Gia_ManRegBoxNum(p) ); +        printf( "Fixed %d flop inputs and %d box/box connections (out of %d non-flop boxes).\n",  +            Gia_ManRegBoxNum(p), Vec_IntSize(vCarryOuts), Gia_ManNonRegBoxNum(p) ); +    Vec_IntFree( vCarryOuts );      // compute representatives      pClp2Gia[0] = 0; @@ -553,6 +612,8 @@ Gia_Man_t * Gia_ManSweepWithBoxes( Gia_Man_t * p, void * pParsC, void * pParsS,      pNew = Gia_ManDupNormalize( pTemp = pNew );      Gia_ManTransferTiming( pNew, pTemp );      Gia_ManStop( pTemp ); +    // check integrity +    //Gia_ManCheckIntegrityWithBoxes( pNew );      return pNew;  } diff --git a/src/aig/gia/giaTim.c b/src/aig/gia/giaTim.c index e1054fa9..ed232e82 100644 --- a/src/aig/gia/giaTim.c +++ b/src/aig/gia/giaTim.c @@ -54,6 +54,18 @@ int Gia_ManRegBoxNum( Gia_Man_t * p )  {      return p->vRegClasses ? Vec_IntSize(p->vRegClasses) : 0;  } +int Gia_ManNonRegBoxNum( Gia_Man_t * p ) +{ +    return Gia_ManBoxNum(p) - Gia_ManRegBoxNum(p); +} +int Gia_ManBoxCiNum( Gia_Man_t * p ) +{ +    return p->pManTime ? Gia_ManCiNum(p) - Tim_ManPiNum((Tim_Man_t *)p->pManTime) : 0; +} +int Gia_ManBoxCoNum( Gia_Man_t * p ) +{ +    return p->pManTime ? Gia_ManCoNum(p) - Tim_ManPoNum((Tim_Man_t *)p->pManTime) : 0; +}  /**Function*************************************************************  | 
