diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2013-02-17 19:10:54 -0800 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2013-02-17 19:10:54 -0800 |
commit | d415a1adce0e8db5e63f5aef41d4bf44524ca718 (patch) | |
tree | d3b26068e8feb2c1ab6d95497ec7ee70f5e2c9dd /src | |
parent | baa944e6a2abba6f7b4f9b4ef99982201913caa8 (diff) | |
download | abc-d415a1adce0e8db5e63f5aef41d4bf44524ca718.tar.gz abc-d415a1adce0e8db5e63f5aef41d4bf44524ca718.tar.bz2 abc-d415a1adce0e8db5e63f5aef41d4bf44524ca718.zip |
Integrating packing information.
Diffstat (limited to 'src')
-rw-r--r-- | src/aig/gia/gia.h | 1 | ||||
-rw-r--r-- | src/aig/gia/giaAiger.c | 6 | ||||
-rw-r--r-- | src/aig/gia/giaAigerExt.c | 2 | ||||
-rw-r--r-- | src/aig/gia/giaIf.c | 420 | ||||
-rw-r--r-- | src/aig/gia/giaMan.c | 2 |
5 files changed, 427 insertions, 4 deletions
diff --git a/src/aig/gia/gia.h b/src/aig/gia/gia.h index 7ea38cda..6a1ce0bc 100644 --- a/src/aig/gia/gia.h +++ b/src/aig/gia/gia.h @@ -900,6 +900,7 @@ extern void Gia_ManHashProfile( Gia_Man_t * p ); extern int Gia_ManHashLookup( Gia_Man_t * p, Gia_Obj_t * p0, Gia_Obj_t * p1 ); /*=== giaIf.c ===========================================================*/ extern void Gia_ManPrintMappingStats( Gia_Man_t * p ); +extern void Gia_ManPrintPackingStats( Gia_Man_t * p ); extern int Gia_ManLutFaninCount( Gia_Man_t * p ); extern int Gia_ManLutSizeMax( Gia_Man_t * p ); extern int Gia_ManLutNum( Gia_Man_t * p ); diff --git a/src/aig/gia/giaAiger.c b/src/aig/gia/giaAiger.c index bc338db8..0e2a4c4c 100644 --- a/src/aig/gia/giaAiger.c +++ b/src/aig/gia/giaAiger.c @@ -582,9 +582,11 @@ Gia_Man_t * Gia_AigerReadFromMemory( char * pContents, int nFileSize, int fSkipS else if ( *pCur == 'k' ) { extern Vec_Int_t * Gia_AigerReadPacking( unsigned char ** ppPos, int nSize ); + int nSize; pCur++; - pCurTemp = pCur + Gia_AigerReadInt(pCur) + 4; pCur += 4; - pNew->vPacking = Gia_AigerReadPacking( &pCur, pCurTemp - pCur ); + nSize = Gia_AigerReadInt(pCur); + pCurTemp = pCur + nSize + 4; pCur += 4; + pNew->vPacking = Gia_AigerReadPacking( &pCur, nSize ); assert( pCur == pCurTemp ); if ( fVerbose ) printf( "Finished reading extension \"k\".\n" ); } diff --git a/src/aig/gia/giaAigerExt.c b/src/aig/gia/giaAigerExt.c index 7a3e4c91..1a0dedac 100644 --- a/src/aig/gia/giaAigerExt.c +++ b/src/aig/gia/giaAigerExt.c @@ -253,7 +253,7 @@ Vec_Int_t * Gia_AigerReadPacking( unsigned char ** ppPos, int nSize ) Vec_Str_t * Gia_WritePacking( Vec_Int_t * vPacking ) { Vec_Str_t * vBuffer = Vec_StrStart( 4*Vec_IntSize(vPacking) ); - memcpy( Vec_StrArray(vBuffer), Vec_IntArray(vPacking), 4*sizeof(int) ); + memcpy( Vec_StrArray(vBuffer), Vec_IntArray(vPacking), 4*Vec_IntSize(vPacking) ); return vBuffer; } diff --git a/src/aig/gia/giaIf.c b/src/aig/gia/giaIf.c index b05e9106..00252f28 100644 --- a/src/aig/gia/giaIf.c +++ b/src/aig/gia/giaIf.c @@ -237,6 +237,53 @@ void Gia_ManPrintMappingStats( Gia_Man_t * p ) Abc_Print( 1, "\n" ); } +/**Function************************************************************* + + Synopsis [Prints mapping statistics.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Gia_ManPrintPackingStats( Gia_Man_t * p ) +{ + int fVerbose = 0; + int nObjToShow = 200; + int nNumStr[5] = {0}; + int i, k, Entry, nEntries, nEntries2, MaxSize = -1; + if ( p->vPacking == NULL ) + return; + nEntries = Vec_IntEntry( p->vPacking, 0 ); + nEntries2 = 0; + Vec_IntForEachEntryStart( p->vPacking, Entry, i, 1 ) + { + assert( Entry > 0 && Entry < 4 ); + nNumStr[Entry]++; + i++; + if ( fVerbose && nEntries2 < nObjToShow ) Abc_Print( 1, "{ " ); + for ( k = 0; k < Entry; k++, i++ ) + if ( fVerbose && nEntries2 < nObjToShow ) Abc_Print( 1, "%d ", Vec_IntEntry(p->vPacking, i) ); + if ( fVerbose && nEntries2 < nObjToShow ) Abc_Print( 1, "}\n" ); + i--; + nEntries2++; + } + assert( nEntries == nEntries2 ); + if ( nNumStr[3] > 0 ) + MaxSize = 3; + else if ( nNumStr[2] > 0 ) + MaxSize = 2; + else if ( nNumStr[1] > 0 ) + MaxSize = 1; + Abc_Print( 1, "packing (N=%d) : ", MaxSize ); + for ( i = 1; i <= MaxSize; i++ ) + Abc_Print( 1, "%d x LUT = %d ", i, nNumStr[i] ); + Abc_Print( 1, "Total = %d", nEntries2 ); + Abc_Print( 1, "\n" ); +} + /**Function************************************************************* @@ -455,6 +502,7 @@ Gia_Man_t * Gia_ManFromIf( If_Man_t * pIfMan ) unsigned * pTruth; int Counter, iOffset, nItems = 0; int i, k, w, GiaId; + assert( pIfMan->pPars->pLutStruct == NULL ); // create new manager pNew = Gia_ManStart( If_ManObjNum(pIfMan) ); Gia_ManHashAlloc( pNew ); @@ -608,6 +656,325 @@ Gia_Man_t * Gia_ManFromIf( If_Man_t * pIfMan ) return pNew; } + +/**Function************************************************************* + + Synopsis [Write mapping for LUT with given fanins.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Gia_ManFromIfStrCreateLut( Gia_Man_t * pNew, word * pRes, Vec_Int_t * vLeaves, Vec_Int_t * vCover, Vec_Int_t * vMapping, Vec_Int_t * vMapping2 ) +{ + int i, iLit, iObjLit1; + iObjLit1 = Kit_TruthToGia( pNew, (unsigned *)pRes, Vec_IntSize(vLeaves), vCover, vLeaves, 0 ); + // write mapping + Vec_IntSetEntry( vMapping, Abc_Lit2Var(iObjLit1), Vec_IntSize(vMapping2) ); + Vec_IntPush( vMapping2, Vec_IntSize(vLeaves) ); + Vec_IntForEachEntry( vLeaves, iLit, i ) + assert( Abc_Lit2Var(iLit) < Abc_Lit2Var(iObjLit1) ); + Vec_IntForEachEntry( vLeaves, iLit, i ) + Vec_IntPush( vMapping2, Abc_Lit2Var(iLit) ); + Vec_IntPush( vMapping2, Abc_Lit2Var(iObjLit1) ); + return iObjLit1; +} + + +/**Function************************************************************* + + Synopsis [Write the node into a file.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Gia_ManFromIfStrNode( Gia_Man_t * pNew, int iObj, Vec_Int_t * vLeaves, Vec_Int_t * vLeavesTemp, + word * pRes, char * pStr, Vec_Int_t * vCover, Vec_Int_t * vMapping, Vec_Int_t * vMapping2, Vec_Int_t * vPacking ) +{ + int nLeaves = Vec_IntSize(vLeaves); + int i, Length, nLutLeaf, nLutLeaf2, nLutRoot, iObjLit1, iObjLit2, iObjLit3; + + // quit if parameters are wrong + Length = strlen(pStr); + if ( Length != 2 && Length != 3 ) + { + printf( "Wrong LUT struct (%s)\n", pStr ); + return -1; + } + for ( i = 0; i < Length; i++ ) + if ( pStr[i] - '0' < 3 || pStr[i] - '0' > 6 ) + { + printf( "The LUT size (%d) should belong to {3,4,5,6}.\n", pStr[i] - '0' ); + return -1; + } + + nLutLeaf = pStr[0] - '0'; + nLutLeaf2 = ( Length == 3 ) ? pStr[1] - '0' : 0; + nLutRoot = pStr[Length-1] - '0'; + if ( nLeaves > nLutLeaf - 1 + (nLutLeaf2 ? nLutLeaf2 - 1 : 0) + nLutRoot ) + { + printf( "The node size (%d) is too large for the LUT structure %s.\n", nLeaves, pStr ); + return -1; + } + + // consider easy case + if ( nLeaves <= Abc_MaxInt( nLutLeaf2, Abc_MaxInt(nLutLeaf, nLutRoot) ) ) + { + // create mapping + iObjLit1 = Gia_ManFromIfStrCreateLut( pNew, pRes, vLeaves, vCover, vMapping, vMapping2 ); + // write packing + Vec_IntPush( vPacking, 1 ); + Vec_IntPush( vPacking, Abc_Lit2Var(iObjLit1) ); + Vec_IntAddToEntry( vPacking, 0, 1 ); + return iObjLit1; + } + else + { + extern int If_CluMinimumBase( word * t, int * pSupp, int nVarsAll, int * pnVars ); + + static word TruthStore[16][1<<10] = {{0}}, * pTruths[16]; + word Func0, Func1, Func2; + char pLut0[32], pLut1[32], pLut2[32] = {0}; + + if ( TruthStore[0][0] == 0 ) + { + static word Truth6[6] = { + 0xAAAAAAAAAAAAAAAA, + 0xCCCCCCCCCCCCCCCC, + 0xF0F0F0F0F0F0F0F0, + 0xFF00FF00FF00FF00, + 0xFFFF0000FFFF0000, + 0xFFFFFFFF00000000 + }; + int nVarsMax = 16; + int nWordsMax = (1 << 10); + int i, k; + assert( nVarsMax <= 16 ); + for ( i = 0; i < nVarsMax; i++ ) + pTruths[i] = TruthStore[i]; + for ( i = 0; i < 6; i++ ) + for ( k = 0; k < nWordsMax; k++ ) + pTruths[i][k] = Truth6[i]; + for ( i = 6; i < nVarsMax; i++ ) + for ( k = 0; k < nWordsMax; k++ ) + pTruths[i][k] = ((k >> (i-6)) & 1) ? ~(word)0 : 0; + } + // derive truth table + if ( Kit_TruthIsConst0((unsigned *)pRes, nLeaves) || Kit_TruthIsConst1((unsigned *)pRes, nLeaves) ) + { + assert( 0 ); +// fprintf( pFile, ".names %s\n %d\n", Abc_ObjName(Abc_ObjFanout0(pObj)), Kit_TruthIsConst1((unsigned *)pRes, nLeaves) ); + return -1; + } + + // perform decomposition + if ( Length == 2 ) + { + if ( !If_CluCheckExt( NULL, pRes, nLeaves, nLutLeaf, nLutRoot, pLut0, pLut1, &Func0, &Func1 ) ) + { + Extra_PrintHex( stdout, (unsigned *)pRes, nLeaves ); printf( " " ); + Kit_DsdPrintFromTruth( (unsigned*)pRes, nLeaves ); printf( "\n" ); + printf( "Node %d is not decomposable. Deriving LUT structures has failed.\n", iObj ); + return -1; + } + } + else + { + if ( !If_CluCheckExt3( NULL, pRes, nLeaves, nLutLeaf, nLutLeaf2, nLutRoot, pLut0, pLut1, pLut2, &Func0, &Func1, &Func2 ) ) + { + Extra_PrintHex( stdout, (unsigned *)pRes, nLeaves ); printf( " " ); + Kit_DsdPrintFromTruth( (unsigned*)pRes, nLeaves ); printf( "\n" ); + printf( "Node %d is not decomposable. Deriving LUT structures has failed.\n", iObj ); + return -1; + } + } + +/* + // write leaf node + Id = Abc2_NtkAllocObj( pNew, pLut1[0], Abc2_ObjType(pObj) ); + iObjLit1 = Abc_Var2Lit( Id, 0 ); + pObjNew = Abc2_NtkObj( pNew, Id ); + for ( i = 0; i < pLut1[0]; i++ ) + Abc2_ObjSetFaninLit( pObjNew, i, Abc2_ObjFaninCopy(pObj, pLut1[2+i]) ); + Abc2_ObjSetTruth( pObjNew, Func1 ); +*/ + // write leaf node + Vec_IntClear( vLeavesTemp ); + for ( i = 0; i < pLut1[0]; i++ ) + Vec_IntPush( vLeavesTemp, Vec_IntEntry(vLeaves, pLut1[2+i]) ); + iObjLit1 = Gia_ManFromIfStrCreateLut( pNew, &Func1, vLeavesTemp, vCover, vMapping, vMapping2 ); + + if ( Length == 3 && pLut2[0] > 0 ) + { + /* + Id = Abc2_NtkAllocObj( pNew, pLut2[0], Abc2_ObjType(pObj) ); + iObjLit2 = Abc_Var2Lit( Id, 0 ); + pObjNew = Abc2_NtkObj( pNew, Id ); + for ( i = 0; i < pLut2[0]; i++ ) + if ( pLut2[2+i] == nLeaves ) + Abc2_ObjSetFaninLit( pObjNew, i, iObjLit1 ); + else + Abc2_ObjSetFaninLit( pObjNew, i, Abc2_ObjFaninCopy(pObj, pLut2[2+i]) ); + Abc2_ObjSetTruth( pObjNew, Func2 ); + */ + + // write leaf node + Vec_IntClear( vLeavesTemp ); + for ( i = 0; i < pLut2[0]; i++ ) + if ( pLut2[2+i] == nLeaves ) + Vec_IntPush( vLeavesTemp, iObjLit1 ); + else + Vec_IntPush( vLeavesTemp, Vec_IntEntry(vLeaves, pLut2[2+i]) ); + iObjLit2 = Gia_ManFromIfStrCreateLut( pNew, &Func2, vLeavesTemp, vCover, vMapping, vMapping2 ); + + // write packing + Vec_IntPush( vPacking, 3 ); + Vec_IntPush( vPacking, Abc_Lit2Var(iObjLit1) ); + Vec_IntPush( vPacking, Abc_Lit2Var(iObjLit2) ); + } + else + { + // write packing + Vec_IntPush( vPacking, 2 ); + Vec_IntPush( vPacking, Abc_Lit2Var(iObjLit1) ); + } +/* + // write root node + Id = Abc2_NtkAllocObj( pNew, pLut0[0], Abc2_ObjType(pObj) ); + iObjLit3 = Abc_Var2Lit( Id, 0 ); + pObjNew = Abc2_NtkObj( pNew, Id ); + for ( i = 0; i < pLut0[0]; i++ ) + if ( pLut0[2+i] == nLeaves ) + Abc2_ObjSetFaninLit( pObjNew, i, iObjLit1 ); + else if ( pLut0[2+i] == nLeaves+1 ) + Abc2_ObjSetFaninLit( pObjNew, i, iObjLit2 ); + else + Abc2_ObjSetFaninLit( pObjNew, i, Abc2_ObjFaninCopy(pObj, pLut0[2+i]) ); + Abc2_ObjSetTruth( pObjNew, Func0 ); + Abc2_ObjSetCopy( pObj, iObjLit3 ); +*/ + // write root node + Vec_IntClear( vLeavesTemp ); + for ( i = 0; i < pLut0[0]; i++ ) + if ( pLut0[2+i] == nLeaves ) + Vec_IntPush( vLeavesTemp, iObjLit1 ); + else if ( pLut0[2+i] == nLeaves+1 ) + Vec_IntPush( vLeavesTemp, iObjLit2 ); + else + Vec_IntPush( vLeavesTemp, Vec_IntEntry(vLeaves, pLut0[2+i]) ); + iObjLit3 = Gia_ManFromIfStrCreateLut( pNew, &Func0, vLeavesTemp, vCover, vMapping, vMapping2 ); + + // write packing + Vec_IntPush( vPacking, Abc_Lit2Var(iObjLit3) ); + Vec_IntAddToEntry( vPacking, 0, 1 ); + } + return iObjLit3; +} + + +/**Function************************************************************* + + Synopsis [Converts IF into GIA manager.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Gia_Man_t * Gia_ManFromIfStr( If_Man_t * pIfMan ) +{ + Gia_Man_t * pNew; + If_Cut_t * pCutBest; + If_Obj_t * pIfObj, * pIfLeaf; + Vec_Int_t * vMapping, * vMapping2, * vPacking; + Vec_Int_t * vLeaves, * vLeaves2, * vCover; + int i, k, Entry; + assert( pIfMan->pPars->pLutStruct != NULL ); + assert( pIfMan->pPars->nLutSize >= 6 ); // if 5, need to change (word *)If_CutTruth(pCutBest) below + // start mapping and packing + vMapping = Vec_IntStart( If_ManObjNum(pIfMan) ); + vMapping2 = Vec_IntStart( 1 ); + vPacking = Vec_IntAlloc( 1000 ); + Vec_IntPush( vPacking, 0 ); + // create new manager + pNew = Gia_ManStart( If_ManObjNum(pIfMan) ); + // iterate through nodes used in the mapping + vCover = Vec_IntAlloc( 1 << 16 ); + vLeaves = Vec_IntAlloc( 16 ); + vLeaves2 = Vec_IntAlloc( 16 ); + If_ManCleanCutData( pIfMan ); + If_ManForEachObj( pIfMan, pIfObj, i ) + { + if ( pIfObj->nRefs == 0 && !If_ObjIsTerm(pIfObj) ) + continue; + if ( If_ObjIsAnd(pIfObj) ) + { + pCutBest = If_ObjCutBest( pIfObj ); + // collect leaves of the best cut + Vec_IntClear( vLeaves ); + If_CutForEachLeaf( pIfMan, pCutBest, pIfLeaf, k ) + Vec_IntPush( vLeaves, pIfLeaf->iCopy ); + // perform decomposition of the cut + pIfObj->iCopy = Gia_ManFromIfStrNode( pNew, i, vLeaves, vLeaves2, (word *)If_CutTruth(pCutBest), pIfMan->pPars->pLutStruct, vCover, vMapping, vMapping2, vPacking ); + pIfObj->iCopy = Abc_LitNotCond( pIfObj->iCopy, pCutBest->fCompl ); + } + else if ( If_ObjIsCi(pIfObj) ) + pIfObj->iCopy = Gia_ManAppendCi(pNew); + else if ( If_ObjIsCo(pIfObj) ) + pIfObj->iCopy = Gia_ManAppendCo( pNew, Abc_LitNotCond(If_ObjFanin0(pIfObj)->iCopy, If_ObjFaninC0(pIfObj)) ); + else if ( If_ObjIsConst1(pIfObj) ) + { + pIfObj->iCopy = 1; + // create const LUT + Vec_IntWriteEntry( vMapping, 0, Vec_IntSize(vMapping2) ); + Vec_IntPush( vMapping2, 0 ); + Vec_IntPush( vMapping2, 0 ); + } + else assert( 0 ); + } + Vec_IntFree( vCover ); + Vec_IntFree( vLeaves ); + Vec_IntFree( vLeaves2 ); + printf( "Mapping array size: IfMan = %d. Gia = %d. Increase = %.2f\n", + If_ManObjNum(pIfMan), Gia_ManObjNum(pNew), 1.0 * Gia_ManObjNum(pNew) / If_ManObjNum(pIfMan) ); + // finish mapping + if ( Vec_IntSize(vMapping) > Gia_ManObjNum(pNew) ) + Vec_IntShrink( vMapping, Gia_ManObjNum(pNew) ); + else + Vec_IntFillExtra( vMapping, Gia_ManObjNum(pNew), 0 ); + assert( Vec_IntSize(vMapping) == Gia_ManObjNum(pNew) ); + Vec_IntForEachEntry( vMapping, Entry, i ) + if ( Entry > 0 ) + Vec_IntAddToEntry( vMapping, i, Gia_ManObjNum(pNew) ); + Vec_IntAppend( vMapping, vMapping2 ); + Vec_IntFree( vMapping2 ); + // attach mapping and packing + pNew->nOffset = Vec_IntSize(vMapping); + pNew->pMapping = Vec_IntReleaseArray(vMapping); + pNew->vPacking = vPacking; + Vec_IntFree( vMapping ); + // verify that COs have mapping + { + Gia_Obj_t * pObj; + Gia_ManForEachCo( pNew, pObj, i ) + { + if ( Gia_ObjIsAnd(Gia_ObjFanin0(pObj)) ) + assert( pNew->pMapping[Gia_ObjFaninId0p(pNew, pObj)] != 0 ); + } + } + return pNew; +} + + /**Function************************************************************* Synopsis [Verifies mapping.] @@ -711,6 +1078,52 @@ void Gia_ManTransferMapping( Gia_Man_t * pGia, Gia_Man_t * p ) Gia_ManMappingVerify( p ); } +/**Function************************************************************* + + Synopsis [Transfers packing from hie GIA to normalized GIA.] + + Description [Hie GIA (pGia) points to normalized GIA (p).] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Gia_ManTransferPacking( Gia_Man_t * pGia, Gia_Man_t * p ) +{ + Vec_Int_t * vPackingNew; + Gia_Obj_t * pObj, * pObjNew; + int i, k, Entry, nEntries, nEntries2, MaxSize = -1; + if ( pGia->vPacking == NULL ) + return; + nEntries = Vec_IntEntry( pGia->vPacking, 0 ); + nEntries2 = 0; + // create new packing info + vPackingNew = Vec_IntAlloc( Vec_IntSize(pGia->vPacking) ); + Vec_IntPush( vPackingNew, nEntries ); + Vec_IntForEachEntryStart( pGia->vPacking, Entry, i, 1 ) + { + assert( Entry > 0 && Entry < 4 ); + Vec_IntPush( vPackingNew, Entry ); + i++; + for ( k = 0; k < Entry; k++, i++ ) + { + pObj = Gia_ManObj(pGia, Vec_IntEntry(pGia->vPacking, i)); + pObjNew = Gia_ManObj(p, Abc_Lit2Var(Gia_ObjValue(pObj))); + assert( Gia_ObjIsLut(pGia, Gia_ObjId(pGia, pObj)) ); + assert( Gia_ObjIsLut(p, Gia_ObjId(p, pObjNew)) ); + Vec_IntPush( vPackingNew, Gia_ObjId(p, pObjNew) ); +// printf( "%d -> %d ", Vec_IntEntry(pGia->vPacking, i), Gia_ObjId(p, pObjNew) ); + } + i--; + nEntries2++; + } + assert( nEntries == nEntries2 ); + // attach packing info + assert( p->vPacking == NULL ); + p->vPacking = vPackingNew; +} + /**Function************************************************************* @@ -759,7 +1172,10 @@ Gia_Man_t * Gia_ManPerformMapping( Gia_Man_t * p, void * pp ) return NULL; } // transform the result of mapping into the new network - pNew = Gia_ManFromIf( pIfMan ); + if ( pIfMan->pPars->pLutStruct ) + pNew = Gia_ManFromIfStr( pIfMan ); + else + pNew = Gia_ManFromIf( pIfMan ); If_ManStop( pIfMan ); // transfer name assert( pNew->pName == NULL ); @@ -776,8 +1192,10 @@ Gia_Man_t * Gia_ManPerformMapping( Gia_Man_t * p, void * pp ) // normalize and transfer mapping pNew = Gia_ManDupNormalize( p = pNew ); Gia_ManTransferMapping( p, pNew ); + Gia_ManTransferPacking( p, pNew ); pNew->pManTime = p->pManTime; p->pManTime = NULL; pNew->pAigExtra = p->pAigExtra; p->pAigExtra = NULL; +// pNew->vPacking = p->vPacking; p->vPacking = NULL; Gia_ManStop( p ); // printf( "PERFORMING VERIFICATION:\n" ); diff --git a/src/aig/gia/giaMan.c b/src/aig/gia/giaMan.c index 1bc6398a..9e05bd40 100644 --- a/src/aig/gia/giaMan.c +++ b/src/aig/gia/giaMan.c @@ -330,6 +330,8 @@ void Gia_ManPrintStats( Gia_Man_t * p, int fTents, int fSwitch, int fCut ) Gia_ManPrintChoiceStats( p ); if ( p->pMapping ) Gia_ManPrintMappingStats( p ); + if ( p->vPacking ) + Gia_ManPrintPackingStats( p ); if ( p->pPlacement ) Gia_ManPrintPlacement( p ); // print register classes |