diff options
| -rw-r--r-- | src/aig/gia/giaAiger.c | 38 | ||||
| -rw-r--r-- | src/aig/gia/giaDup.c | 6 | ||||
| -rw-r--r-- | src/aig/gia/giaTim.c | 18 | 
3 files changed, 62 insertions, 0 deletions
| diff --git a/src/aig/gia/giaAiger.c b/src/aig/gia/giaAiger.c index 476a9d36..bc338db8 100644 --- a/src/aig/gia/giaAiger.c +++ b/src/aig/gia/giaAiger.c @@ -629,8 +629,28 @@ Gia_Man_t * Gia_AigerReadFromMemory( char * pContents, int nFileSize, int fSkipS                  pPlacement = ABC_ALLOC( Gia_Plc_t, Gia_ManObjNum(pNew) );                  memcpy( pPlacement, pCur, 4*Gia_ManObjNum(pNew) );      pCur += 4*Gia_ManObjNum(pNew);                  assert( pCur == pCurTemp ); +                pNew->pPlacement = pPlacement;                  if ( fVerbose ) printf( "Finished reading extension \"p\".\n" );              } +            // read choices +            else if ( *pCur == 'q' ) +            { +                int i, nPairs, iRepr, iNode; +                assert( pNew->pSibls == NULL ); +                pNew->pSibls = ABC_CALLOC( int, Gia_ManObjNum(pNew) ); +                pCur++; +                pCurTemp = pCur + Gia_AigerReadInt(pCur) + 4;           pCur += 4; +                nPairs = Gia_AigerReadInt(pCur);                        pCur += 4; +                for ( i = 0; i < nPairs; i++ ) +                { +                    iRepr = Gia_AigerReadInt(pCur);                     pCur += 4; +                    iNode = Gia_AigerReadInt(pCur);                     pCur += 4; +                    pNew->pSibls[iRepr] = iNode; +                    assert( iRepr > iNode ); +                } +                assert( pCur == pCurTemp ); +                if ( fVerbose ) printf( "Finished reading extension \"q\".\n" ); +            }              // read switching activity              else if ( *pCur == 's' )              {  @@ -1170,6 +1190,24 @@ void Gia_AigerWrite( Gia_Man_t * pInit, char * pFileName, int fWriteSymbols, int          Gia_FileWriteBufferSize( pFile, 4*Gia_ManObjNum(p) );          fwrite( p->pPlacement, 1, 4*Gia_ManObjNum(p), pFile );      } +    // write choices +    if ( p->pSibls ) +    { +        int i, nPairs = 0; +        fprintf( pFile, "q" ); +        for ( i = 0; i < Gia_ManObjNum(p); i++ ) +            nPairs += (Gia_ObjSibl(p, i) > 0); +        Gia_FileWriteBufferSize( pFile, 4*(nPairs * 2 + 1) ); +        Gia_FileWriteBufferSize( pFile, nPairs ); +        for ( i = 0; i < Gia_ManObjNum(p); i++ ) +            if ( Gia_ObjSibl(p, i) ) +            { +                assert( i > Gia_ObjSibl(p, i) ); +                Gia_FileWriteBufferSize( pFile, i ); +                Gia_FileWriteBufferSize( pFile, Gia_ObjSibl(p, i) ); +            } +        if ( fVerbose ) printf( "Finished writing extension \"q\".\n" ); +    }      // write switching activity      if ( p->pSwitching )      { diff --git a/src/aig/gia/giaDup.c b/src/aig/gia/giaDup.c index 14db2492..d1a115a5 100644 --- a/src/aig/gia/giaDup.c +++ b/src/aig/gia/giaDup.c @@ -412,11 +412,17 @@ Gia_Man_t * Gia_ManDup( Gia_Man_t * p )      pNew = Gia_ManStart( Gia_ManObjNum(p) );      pNew->pName = Abc_UtilStrsav( p->pName );      pNew->pSpec = Abc_UtilStrsav( p->pSpec ); +    if ( p->pSibls ) +        pNew->pSibls = ABC_CALLOC( int, Gia_ManObjNum(p) );      Gia_ManConst0(p)->Value = 0;      Gia_ManForEachObj1( p, pObj, i )      {          if ( Gia_ObjIsAnd(pObj) ) +        {              pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) ); +            if ( Gia_ObjSibl(p, Gia_ObjId(p, pObj)) ) +                pNew->pSibls[Abc_Lit2Var(pObj->Value)] = Abc_Lit2Var(Gia_ObjSiblObj(p, Gia_ObjId(p, pObj))->Value);   +        }          else if ( Gia_ObjIsCi(pObj) )              pObj->Value = Gia_ManAppendCi( pNew );          else if ( Gia_ObjIsCo(pObj) ) diff --git a/src/aig/gia/giaTim.c b/src/aig/gia/giaTim.c index 10841216..03018513 100644 --- a/src/aig/gia/giaTim.c +++ b/src/aig/gia/giaTim.c @@ -91,6 +91,8 @@ Gia_Man_t * Gia_ManDupUnnomalize( Gia_Man_t * p )      pNew->pName = Abc_UtilStrsav( p->pName );      pNew->pSpec = Abc_UtilStrsav( p->pSpec );      Gia_ManConst0(p)->Value = 0; +    if ( p->pSibls ) +        pNew->pSibls = ABC_CALLOC( int, Gia_ManObjNum(p) );      // copy primary inputs      for ( k = 0; k < Tim_ManPiNum(pTime); k++ )          Gia_ManPi(p, k)->Value = Gia_ManAppendCi(pNew); @@ -175,6 +177,8 @@ void Gia_ManDupFindOrderWithHie_rec( Gia_Man_t * p, Gia_Obj_t * pObj, Vec_Int_t          return;      Gia_ObjSetTravIdCurrent(p, pObj);      assert( Gia_ObjIsAnd(pObj) ); +    if ( Gia_ObjSibl(p, Gia_ObjId(p, pObj)) ) +        Gia_ManDupFindOrderWithHie_rec( p, Gia_ObjSiblObj(p, Gia_ObjId(p, pObj)), vNodes );      Gia_ManDupFindOrderWithHie_rec( p, Gia_ObjFanin0(pObj), vNodes );      Gia_ManDupFindOrderWithHie_rec( p, Gia_ObjFanin1(pObj), vNodes );      Vec_IntPush( vNodes, Gia_ObjId(p, pObj) ); @@ -276,11 +280,17 @@ Gia_Man_t * Gia_ManDupWithHierarchy( Gia_Man_t * p, Vec_Int_t ** pvNodes )      pNew = Gia_ManStart( Gia_ManObjNum(p) );      pNew->pName = Abc_UtilStrsav( p->pName );      pNew->pSpec = Abc_UtilStrsav( p->pSpec ); +    if ( p->pSibls ) +        pNew->pSibls = ABC_CALLOC( int, Gia_ManObjNum(p) );      vNodes = Gia_ManDupFindOrderWithHie( p );      Gia_ManForEachObjVec( vNodes, p, pObj, i )      {          if ( Gia_ObjIsAnd(pObj) ) +        {              pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) ); +            if ( Gia_ObjSibl(p, Gia_ObjId(p, pObj)) ) +                pNew->pSibls[Abc_Lit2Var(pObj->Value)] = Abc_Lit2Var(Gia_ObjSiblObj(p, Gia_ObjId(p, pObj))->Value);         +        }          else if ( Gia_ObjIsCi(pObj) )              pObj->Value = Gia_ManAppendCi( pNew );          else if ( Gia_ObjIsCo(pObj) ) @@ -315,10 +325,14 @@ void Gia_ManDupWithBoxes_rec( Gia_Man_t * p, Gia_Obj_t * pObj, Gia_Man_t * pNew          return;      Gia_ObjSetTravIdCurrent(p, pObj);      assert( Gia_ObjIsAnd(pObj) ); +    if ( Gia_ObjSibl(p, Gia_ObjId(p, pObj)) ) +        Gia_ManDupWithBoxes_rec( p, Gia_ObjSiblObj(p, Gia_ObjId(p, pObj)), pNew );      Gia_ManDupWithBoxes_rec( p, Gia_ObjFanin0(pObj), pNew );      Gia_ManDupWithBoxes_rec( p, Gia_ObjFanin1(pObj), pNew );  //    assert( !~pObj->Value );      pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) ); +    if ( Gia_ObjSibl(p, Gia_ObjId(p, pObj)) ) +        pNew->pSibls[Abc_Lit2Var(pObj->Value)] = Abc_Lit2Var(Gia_ObjSiblObj(p, Gia_ObjId(p, pObj))->Value);          }  Gia_Man_t * Gia_ManDupWithBoxes( Gia_Man_t * p, Gia_Man_t * pBoxes )  { @@ -331,6 +345,8 @@ Gia_Man_t * Gia_ManDupWithBoxes( Gia_Man_t * p, Gia_Man_t * pBoxes )      pNew = Gia_ManStart( Gia_ManObjNum(p) );      pNew->pName = Abc_UtilStrsav( p->pName );      pNew->pSpec = Abc_UtilStrsav( p->pSpec ); +    if ( p->pSibls ) +        pNew->pSibls = ABC_CALLOC( int, Gia_ManObjNum(p) );      Gia_ManHashAlloc( pNew );      // copy const and real PIs      Gia_ManFillValue( p ); @@ -414,6 +430,8 @@ void Gia_ManLevelWithBoxes_rec( Gia_Man_t * p, Gia_Obj_t * pObj )          return;      Gia_ObjSetTravIdCurrent(p, pObj);      assert( Gia_ObjIsAnd(pObj) ); +    if ( Gia_ObjSibl(p, Gia_ObjId(p, pObj)) ) +        Gia_ManLevelWithBoxes_rec( p, Gia_ObjSiblObj(p, Gia_ObjId(p, pObj)) );      Gia_ManLevelWithBoxes_rec( p, Gia_ObjFanin0(pObj) );      Gia_ManLevelWithBoxes_rec( p, Gia_ObjFanin1(pObj) );      Gia_ObjSetAndLevel( p, pObj ); | 
