From e27edf5e1ee777d9a4256d94dce849155d85fdd3 Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Thu, 15 Jan 2015 18:21:02 -0800 Subject: Various transformations of Cba_Ntk_t. --- src/base/cba/cbaBlast.c | 305 ++++++++++++++++++++++++++++++------------------ 1 file changed, 193 insertions(+), 112 deletions(-) (limited to 'src/base/cba/cbaBlast.c') diff --git a/src/base/cba/cbaBlast.c b/src/base/cba/cbaBlast.c index 8d2d53cd..26931e38 100644 --- a/src/base/cba/cbaBlast.c +++ b/src/base/cba/cbaBlast.c @@ -42,12 +42,15 @@ ABC_NAMESPACE_IMPL_START SeeAlso [] ***********************************************************************/ -void Cba_ManExtractSave( Cba_Man_t * p, int iLNtk, int iLObj, int iRNtk, int iRObj ) +int Cba_ManAddBarbuf( Gia_Man_t * pNew, int iRes, Cba_Man_t * p, int iLNtk, int iLObj, int iRNtk, int iRObj ) { +// if ( iRes == 0 || iRes == 1 ) +// return iRes; Vec_IntPush( p->vBuf2LeafNtk, iLNtk ); Vec_IntPush( p->vBuf2LeafObj, iLObj ); Vec_IntPush( p->vBuf2RootNtk, iRNtk ); Vec_IntPush( p->vBuf2RootObj, iRObj ); + return Gia_ManAppendBuf( pNew, iRes ); } int Cba_ManExtract_rec( Gia_Man_t * pNew, Cba_Ntk_t * p, int i ) { @@ -61,44 +64,64 @@ int Cba_ManExtract_rec( Gia_Man_t * pNew, Cba_Ntk_t * p, int i ) Cba_Ntk_t * pBox = Cba_ObjBoModel( p, i ); int iObj = Cba_NtkPo( pBox, Cba_ObjCioIndex(p, i) ); iRes = Cba_ManExtract_rec( pNew, pBox, iObj ); - iRes = Gia_ManAppendBuf( pNew, iRes ); - Cba_ManExtractSave( p->pDesign, Cba_NtkId(p), i, Cba_NtkId(pBox), iObj ); + iRes = Cba_ManAddBarbuf( pNew, iRes, p->pDesign, Cba_NtkId(p), i, Cba_NtkId(pBox), iObj ); } else if ( Cba_ObjIsPi(p, i) ) { - Cba_Ntk_t * pHost = Cba_NtkHost( p ); - int iObj = Cba_ObjBoxBi( pHost, p->iBoxObj, Cba_ObjCioIndex(p, i) ); + Cba_Ntk_t * pHost = Cba_NtkHostNtk( p ); + int iObj = Cba_ObjBoxBi( pHost, Cba_NtkHostObj(p), Cba_ObjCioIndex(p, i) ); iRes = Cba_ManExtract_rec( pNew, pHost, iObj ); - iRes = Gia_ManAppendBuf( pNew, iRes ); - Cba_ManExtractSave( p->pDesign, Cba_NtkId(p), i, Cba_NtkId(pHost), iObj ); + iRes = Cba_ManAddBarbuf( pNew, iRes, p->pDesign, Cba_NtkId(p), i, Cba_NtkId(pHost), iObj ); } else if ( Cba_ObjIsNode(p, i) ) { int * pFanins = Cba_ObjFaninArray(p, i); int k, pLits[3], Type = Cba_ObjNodeType(p, i); assert( pFanins[0] <= 3 ); - for ( k = 0; k < pFanins[0]; k++ ) - pLits[k] = Cba_ManExtract_rec( pNew, p, pFanins[k+1] ); - if ( Type == CBA_NODE_AND ) - iRes = Gia_ManHashAnd( pNew, pLits[0], pLits[1] ); - else if ( Type == CBA_NODE_OR ) - iRes = Gia_ManHashAnd( pNew, pLits[0], pLits[1] ); - else if ( Type == CBA_NODE_XOR ) - iRes = Gia_ManHashXor( pNew, pLits[0], pLits[1] ); - else if ( Type == CBA_NODE_XNOR ) - iRes = Abc_LitNot( Gia_ManHashXor( pNew, pLits[0], pLits[1] ) ); - else assert( 0 ), iRes = -1; + if ( pFanins[0] == 0 ) + { + if ( Type == CBA_NODE_C0 ) + iRes = 0; + else if ( Type == CBA_NODE_C1 ) + iRes = 1; + else assert( 0 ); + } + else if ( pFanins[0] == 1 ) + { + if ( Type == CBA_NODE_BUF ) + iRes = Cba_ManExtract_rec( pNew, p, pFanins[1] ); + else if ( Type == CBA_NODE_INV ) + iRes = Abc_LitNot( Cba_ManExtract_rec( pNew, p, pFanins[1] ) ); + else assert( 0 ); + } + else + { + for ( k = 0; k < pFanins[0]; k++ ) + pLits[k] = Cba_ManExtract_rec( pNew, p, pFanins[k+1] ); + if ( Type == CBA_NODE_AND ) + iRes = Gia_ManHashAnd( pNew, pLits[0], pLits[1] ); + else if ( Type == CBA_NODE_OR ) + iRes = Gia_ManHashOr( pNew, pLits[0], pLits[1] ); + else if ( Type == CBA_NODE_XOR ) + iRes = Gia_ManHashXor( pNew, pLits[0], pLits[1] ); + else if ( Type == CBA_NODE_XNOR ) + iRes = Abc_LitNot( Gia_ManHashXor( pNew, pLits[0], pLits[1] ) ); + else assert( 0 ); + } } else assert( 0 ); Cba_NtkSetCopy( p, i, iRes ); return iRes; } - Gia_Man_t * Cba_ManExtract( Cba_Man_t * p, int fVerbose ) { Cba_Ntk_t * pRoot = Cba_ManRoot(p); Gia_Man_t * pNew, * pTemp; int i, iObj; + Vec_IntFreeP( &p->vBuf2LeafNtk ); + Vec_IntFreeP( &p->vBuf2LeafObj ); + Vec_IntFreeP( &p->vBuf2RootNtk ); + Vec_IntFreeP( &p->vBuf2RootObj ); p->vBuf2LeafNtk = Vec_IntAlloc( 1000 ); p->vBuf2LeafObj = Vec_IntAlloc( 1000 ); p->vBuf2RootNtk = Vec_IntAlloc( 1000 ); @@ -108,12 +131,13 @@ Gia_Man_t * Cba_ManExtract( Cba_Man_t * p, int fVerbose ) pNew = Gia_ManStart( Cba_ManObjNum(p) ); pNew->pName = Abc_UtilStrsav(p->pName); pNew->pSpec = Abc_UtilStrsav(p->pSpec); - Vec_IntFill( &p->vCopies, Cba_ManObjNum(p), -1 ); Cba_NtkForEachPi( pRoot, iObj, i ) Cba_NtkSetCopy( pRoot, iObj, Gia_ManAppendCi(pNew) ); + Gia_ManHashAlloc( pNew ); Cba_NtkForEachPo( pRoot, iObj, i ) Cba_ManExtract_rec( pNew, pRoot, iObj ); + Gia_ManHashStop( pNew ); Cba_NtkForEachPo( pRoot, iObj, i ) Gia_ManAppendCo( pNew, Cba_NtkCopy(pRoot, iObj) ); assert( Vec_IntSize(p->vBuf2LeafNtk) == pNew->nBufs ); @@ -121,7 +145,7 @@ Gia_Man_t * Cba_ManExtract( Cba_Man_t * p, int fVerbose ) // cleanup pNew = Gia_ManCleanup( pTemp = pNew ); Gia_ManStop( pTemp ); -// Gia_ManPrintStats( pNew, NULL ); + Gia_ManPrintStats( pNew, NULL ); // pNew = Gia_ManSweepHierarchy( pTemp = pNew ); // Gia_ManStop( pTemp ); // Gia_ManPrintStats( pNew, NULL ); @@ -130,7 +154,7 @@ Gia_Man_t * Cba_ManExtract( Cba_Man_t * p, int fVerbose ) /**Function************************************************************* - Synopsis [] + Synopsis [Returns the number of objects in each network.] Description [] @@ -139,122 +163,179 @@ Gia_Man_t * Cba_ManExtract( Cba_Man_t * p, int fVerbose ) SeeAlso [] ***********************************************************************/ -// return the array of object counters for each network -void Cba_ManCountNodes_rec( Cba_Man_t * p, Abc_Obj_t * pObj, int iNtk, Vec_Int_t * vObjCounts, Vec_Int_t * vBufDrivers, Vec_Int_t * vObj2Ntk, Vec_Int_t * vObj2Obj ) +Vec_Int_t * Cba_ManCountGia( Cba_Man_t * p, Gia_Man_t * pGia, int fAlwaysAdd ) { - if ( Abc_ObjIsBarBuf(pObj) ) + Cba_Ntk_t * pNtk; + Gia_Obj_t * pObj; + int i, k, iBox, Count = 0; + Vec_Int_t * vNtkSizes = Vec_IntStart( Cba_ManNtkNum(p) + 1 ); + Vec_Int_t * vDrivenCos = Vec_IntStart( Cba_ManNtkNum(p) + 1 ); + assert( Vec_IntSize(p->vBuf2LeafNtk) == Gia_ManBufNum(pGia) ); + // assing for each GIA node, the network it belongs to and count nodes for all networks + Gia_ManConst0(pGia)->Value = 1; + Gia_ManForEachPi( pGia, pObj, i ) + pObj->Value = 1; + Gia_ManForEachAnd( pGia, pObj, i ) { - Abc_Obj_t * pFanin = Abc_ObjFanin0(pObj); - if ( Abc_ObjIsPi(pFanin) || (Abc_ObjIsNode(pFanin) && Abc_ObjFaninNum(pFanin) > 0) ) - Vec_IntAddToEntry( vBufDrivers, iNtk, 1 ); - Cba_ManCountNodes_rec( p, Abc_ObjFanin0(pObj), pObj->iTemp, vObjCounts, vBufDrivers, vObj2Ntk, vObj2Obj ); + if ( Gia_ObjIsBuf(pObj) ) + { + if ( Gia_ObjIsAnd(Gia_ObjFanin0(pObj)) ) + Vec_IntAddToEntry( vDrivenCos, Gia_ObjFanin0(pObj)->Value, 1 ); + pObj->Value = Vec_IntEntry( p->vBuf2LeafNtk, Count++ ); + } + else + { + pObj->Value = Gia_ObjFanin0(pObj)->Value; + assert( pObj->Value == Gia_ObjFanin1(pObj)->Value ); + Vec_IntAddToEntry( vNtkSizes, pObj->Value, 1 ); + } } - else if ( Abc_ObjFaninNum(pObj) > 0 ) + assert( Count == Gia_ManBufNum(pGia) ); + Gia_ManForEachPo( pGia, pObj, i ) { - Abc_Obj_t * pFanin; int i; - Abc_ObjForEachFanin( pObj, pFanin, i ) - Cba_ManCountNodes_rec( p, pFanin, iNtk, vObjCounts, vBufDrivers, vObj2Ntk, vObj2Obj ); - Vec_IntWriteEntry( vObj2Ntk, Abc_ObjId(pObj), iNtk ); - Vec_IntWriteEntry( vObj2Obj, Abc_ObjId(pObj), Vec_IntEntry(vObjCounts, iNtk) ); - Vec_IntAddToEntry( vObjCounts, iNtk, 1 ); + assert( Gia_ObjFanin0(pObj)->Value == 1 ); + pObj->Value = Gia_ObjFanin0(pObj)->Value; + if ( Gia_ObjIsAnd(Gia_ObjFanin0(pObj)) ) + Vec_IntAddToEntry( vDrivenCos, pObj->Value, 1 ); } -} -Vec_Int_t * Cba_ManCountNodes( Cba_Man_t * p, Abc_Ntk_t * pAbcNtk, Vec_Int_t * vBuf2RootNtk, Vec_Int_t ** pvObj2Ntk, Vec_Int_t ** pvObj2Obj ) -{ - Cba_Ntk_t * pNtk; - Abc_Obj_t * pObj; - Vec_Int_t * vObjCounts = Vec_IntStart( Cba_ManNtkNum(p) + 1 ); - Vec_Int_t * vBufDrivers = Vec_IntStart( Cba_ManNtkNum(p) + 1 ); - // set networks to which barbufs belong - int i, k, iBox, iBarBuf = Vec_IntSize( vBuf2RootNtk ); - assert( Vec_IntSize(vBuf2RootNtk) == pAbcNtk->nBarBufs2 ); - Abc_NtkForEachNodeReverse( pAbcNtk, pObj, i ) - pObj->iTemp = Vec_IntEntry( vBuf2RootNtk, --iBarBuf ); - assert( iBarBuf == 0 ); - // start with primary inputs + // for each network, count the total number of COs Cba_ManForEachNtk( p, pNtk, i ) { - Vec_IntAddToEntry( vObjCounts, i, Cba_NtkPiNum(pNtk) ); + Count = Cba_NtkPiNum(pNtk) + 2 * Cba_NtkPoNum(pNtk) - (fAlwaysAdd ? 0 : Vec_IntEntry(vDrivenCos, i)); Cba_NtkForEachBox( pNtk, iBox, k ) - Vec_IntAddToEntry( vObjCounts, i, Cba_NtkPiNum(Cba_ObjBoxModel(pNtk, iBox)) + Cba_NtkPoNum(Cba_ObjBoxModel(pNtk, iBox)) + 1 ); + Count += Cba_ObjBoxSize(pNtk, iBox) + Cba_ObjBoxBiNum(pNtk, iBox); + Vec_IntAddToEntry( vNtkSizes, i, Count ); } - // count internal nodes (network is in topo order) - *pvObj2Ntk = Vec_IntStartFull( Abc_NtkObjNumMax(pAbcNtk) ); - *pvObj2Obj = Vec_IntStartFull( Abc_NtkObjNumMax(pAbcNtk) ); - Abc_NtkForEachPo( pAbcNtk, pObj, i ) - Cba_ManCountNodes_rec( p, Abc_ObjFanin0(pObj), p->iRoot, vObjCounts, vBufDrivers, *pvObj2Ntk, *pvObj2Obj ); - // count PIs, POs, and PO drivers - Cba_ManForEachNtk( p, pNtk, i ) - Vec_IntAddToEntry( vObjCounts, i, 2 * Cba_NtkPoNum(pNtk) - Vec_IntEntry(vBufDrivers, i) ); - Vec_IntFree( vBufDrivers ); - return vObjCounts; + Vec_IntFree( vDrivenCos ); + return vNtkSizes; } -Cba_Man_t * Cba_ManInsert( Cba_Man_t * p, Abc_Ntk_t * pAbcNtk, int fVerbose ) +void Cba_ManRemapBarbufs( Cba_Man_t * pNew, Cba_Man_t * p ) { - Cba_Man_t * pNew; - Cba_Ntk_t * pNtk; - Abc_Obj_t * pObj, * pFanin; - Vec_Int_t * vObj2Ntk, * vObj2Obj; - Vec_Int_t * vObjCounts = Cba_ManCountNodes( p, pAbcNtk, p->vBuf2RootNtk, &vObj2Ntk, &vObj2Obj ); - Vec_Int_t * vFanins; - int i, k, iNtk, iBuf = 0; - // create initial mapping - pNew = Cba_ManDupStart( p, vObjCounts ); - // set PIs point to the leaves - Abc_NtkForEachPi( pAbcNtk, pObj, i ) + Cba_Ntk_t * pNtk; int Entry, i; + assert( p->vBuf2RootNtk != NULL ); + assert( pNew->vBuf2RootNtk == NULL ); + pNew->vBuf2RootNtk = Vec_IntDup( p->vBuf2RootNtk ); + pNew->vBuf2RootObj = Vec_IntDup( p->vBuf2RootObj ); + pNew->vBuf2LeafNtk = Vec_IntDup( p->vBuf2LeafNtk ); + pNew->vBuf2LeafObj = Vec_IntDup( p->vBuf2LeafObj ); + Vec_IntForEachEntry( p->vBuf2LeafObj, Entry, i ) { - Vec_IntWriteEntry( vObj2Ntk, Abc_ObjId(pObj), p->iRoot ); - Vec_IntWriteEntry( vObj2Obj, Abc_ObjId(pObj), i ); + pNtk = Cba_ManNtk( p, Vec_IntEntry(p->vBuf2LeafNtk, i) ); + Vec_IntWriteEntry( pNew->vBuf2LeafObj, i, Cba_NtkCopy(pNtk, Entry) ); } - // set buffers to point to the leaves - assert( Vec_IntSize(p->vBuf2LeafNtk) == pAbcNtk->nBarBufs2 ); - assert( Vec_IntSize(p->vBuf2LeafObj) == pAbcNtk->nBarBufs2 ); - Abc_NtkForEachBarBuf( pAbcNtk, pObj, i ) + Vec_IntForEachEntry( p->vBuf2RootObj, Entry, i ) { - Vec_IntWriteEntry( vObj2Ntk, Abc_ObjId(pObj), Vec_IntEntry(p->vBuf2LeafNtk, iBuf) ); - Vec_IntWriteEntry( vObj2Obj, Abc_ObjId(pObj), Vec_IntEntry(p->vBuf2LeafObj, iBuf) ); - iBuf++; + pNtk = Cba_ManNtk( p, Vec_IntEntry(p->vBuf2RootNtk, i) ); + Vec_IntWriteEntry( pNew->vBuf2RootObj, i, Cba_NtkCopy(pNtk, Entry) ); } - assert( iBuf == pAbcNtk->nBarBufs2 ); - // copy internal nodes - vFanins = Vec_IntAlloc( 100 ); - Abc_NtkForEachNode( pAbcNtk, pObj, i ) +} +void Cba_NtkCreateAndConnectBuffer( Gia_Man_t * pGia, Gia_Obj_t * pObj, Cba_Ntk_t * pNtk, int iTerm ) +{ + Vec_IntWriteEntry( &pNtk->vTypes, pNtk->nObjs, CBA_OBJ_NODE ); + if ( !pGia || !Gia_ObjFaninId0p(pGia, pObj) ) + { + Vec_IntWriteEntry( &pNtk->vFuncs, pNtk->nObjs, pGia && Gia_ObjFaninC0(pObj) ? CBA_NODE_C1 : CBA_NODE_C0 ); + Vec_IntWriteEntry( &pNtk->vFanins, pNtk->nObjs, Cba_ManHandleBuffer(pNtk->pDesign, -1) ); + } + else { - if ( Abc_ObjIsBarBuf(pObj) ) - continue; - if ( Abc_ObjFaninNum(pObj) == 0 ) - continue; - Vec_IntClear( vFanins ); - iNtk = Vec_IntEntry(vObj2Ntk, Abc_ObjId(pObj)); - Abc_ObjForEachFanin( pObj, pFanin, k ) + Vec_IntWriteEntry( &pNtk->vFuncs, pNtk->nObjs, Gia_ObjFaninC0(pObj) ? CBA_NODE_INV : CBA_NODE_BUF ); + Vec_IntWriteEntry( &pNtk->vFanins, pNtk->nObjs, Cba_ManHandleBuffer(pNtk->pDesign, Gia_ObjFanin0(pObj)->Value) ); + } + Vec_IntWriteEntry( &pNtk->vNameIds, pNtk->nObjs, Cba_ObjNameId(pNtk, iTerm) ); + Vec_IntWriteEntry( &pNtk->vFanins, iTerm, pNtk->nObjs++ ); +} +void Cba_NtkInsertGia( Cba_Man_t * p, Gia_Man_t * pGia ) +{ + Cba_Ntk_t * pNtk, * pRoot = Cba_ManRoot( p ); + Vec_Int_t * vTemp = Vec_IntAlloc( 100 ); + int i, j, k, iBox, iTerm, Count = 0; + Gia_Obj_t * pObj; + + Gia_ManConst0(pGia)->Value = ~0; + Gia_ManForEachPi( pGia, pObj, i ) + pObj->Value = Cba_NtkPi( pRoot, i ); + Gia_ManForEachAnd( pGia, pObj, i ) + { + if ( Gia_ObjIsBuf(pObj) ) + { + pNtk = Cba_ManNtk( p, Vec_IntEntry(p->vBuf2RootNtk, Count) ); + iTerm = Vec_IntEntry( p->vBuf2RootObj, Count ); + assert( Cba_ObjIsCo(pNtk, iTerm) ); + Cba_NtkCreateAndConnectBuffer( pGia, pObj, pNtk, iTerm ); + // prepare leaf + pObj->Value = Vec_IntEntry( p->vBuf2LeafObj, Count++ ); + } + else { - assert( Vec_IntEntry(vObj2Ntk, Abc_ObjId(pFanin)) == iNtk ); - Vec_IntPush( vFanins, Vec_IntEntry(vObj2Obj, Abc_ObjId(pFanin)) ); + Cba_NodeType_t Type; + pNtk = Cba_ManNtk( p, pObj->Value ); + if ( Gia_ObjFaninC0(pObj) && Gia_ObjFaninC1(pObj) ) + Type = CBA_NODE_AND00; + else if ( Gia_ObjFaninC0(pObj) ) + Type = CBA_NODE_AND01; + else if ( Gia_ObjFaninC1(pObj) ) + Type = CBA_NODE_AND10; + else + Type = CBA_NODE_AND; + Vec_IntFillTwo( vTemp, 2, Gia_ObjFanin0(pObj)->Value, Gia_ObjFanin1(pObj)->Value ); + Vec_IntWriteEntry( &pNtk->vTypes, pNtk->nObjs, CBA_OBJ_NODE ); + Vec_IntWriteEntry( &pNtk->vFuncs, pNtk->nObjs, Type ); + Vec_IntWriteEntry( &pNtk->vFanins, pNtk->nObjs, Cba_ManHandleArray(p, vTemp) ); + pObj->Value = pNtk->nObjs++; } - pNtk = Cba_ManNtk( pNew, iNtk ); - Vec_IntPush( &pNtk->vTypes, CBA_OBJ_NODE ); - Vec_IntPush( &pNtk->vFuncs, -1 ); - Vec_IntPush( &pNtk->vFanins, Cba_ManHandleArray(pNew, vFanins) ); } - // set buffers to point to the roots - assert( Vec_IntSize(p->vBuf2RootNtk) == pAbcNtk->nBarBufs2 ); - assert( Vec_IntSize(p->vBuf2RootObj) == pAbcNtk->nBarBufs2 ); - iBuf = 0; - Abc_NtkForEachBarBuf( pAbcNtk, pObj, i ) + assert( Count == Gia_ManBufNum(pGia) ); + Vec_IntFree( vTemp ); + + // create constant 0 drivers for COs without barbufs + Cba_ManForEachNtk( p, pNtk, i ) { - Vec_IntWriteEntry( vObj2Ntk, Abc_ObjId(pObj), Vec_IntEntry(p->vBuf2RootNtk, iBuf) ); - Vec_IntWriteEntry( vObj2Obj, Abc_ObjId(pObj), Vec_IntEntry(p->vBuf2RootObj, iBuf) ); - iBuf++; + Cba_NtkForEachBox( pNtk, iBox, k ) + Cba_BoxForEachBi( pNtk, iBox, iTerm, j ) + if ( Cba_ObjFanin0(pNtk, iTerm) == -1 ) + Cba_NtkCreateAndConnectBuffer( NULL, NULL, pNtk, iTerm ); + Cba_NtkForEachPo( pNtk, iTerm, k ) + if ( pNtk != pRoot && Cba_ObjFanin0(pNtk, iTerm) == -1 ) + Cba_NtkCreateAndConnectBuffer( NULL, NULL, pNtk, iTerm ); } - assert( iBuf == pAbcNtk->nBarBufs2 ); - // connect driven root nodes + // create node and connect POs + Gia_ManForEachPo( pGia, pObj, i ) + Cba_NtkCreateAndConnectBuffer( pGia, pObj, pRoot, Cba_NtkPo(pRoot, i) ); + assert( Cba_NtkObjNum(pRoot) == pRoot->nObjs ); +} +Cba_Man_t * Cba_ManInsertGia( Cba_Man_t * p, Gia_Man_t * pGia ) +{ + Vec_Int_t * vNtkSizes = Cba_ManCountGia( p, pGia, 1 ); + Cba_Man_t * pNew = Cba_ManDupStart( p, vNtkSizes ); + Cba_ManRemapBarbufs( pNew, p ); + Cba_NtkInsertGia( pNew, pGia ); + Vec_IntFree( vNtkSizes ); + return pNew; + +} +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] - Vec_IntFree( vObj2Ntk ); - Vec_IntFree( vObj2Obj ); +***********************************************************************/ +Cba_Man_t * Cba_ManBlastTest( Cba_Man_t * p ) +{ + Gia_Man_t * pGia = Cba_ManExtract( p, 0 ); + Cba_Man_t * pNew = Cba_ManInsertGia( p, pGia ); + Gia_ManStop( pGia ); + Cba_ManAssignInternNames( pNew ); return pNew; } + //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// -- cgit v1.2.3