summaryrefslogtreecommitdiffstats
path: root/src/base/cba/cbaBlast.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2015-01-15 18:21:02 -0800
committerAlan Mishchenko <alanmi@berkeley.edu>2015-01-15 18:21:02 -0800
commite27edf5e1ee777d9a4256d94dce849155d85fdd3 (patch)
treeec95c73fa4e6cf10c2c4e6a5d37a821e0d0b7d33 /src/base/cba/cbaBlast.c
parent8ac8923a91a108718bd8af8b83a9671fc2d33900 (diff)
downloadabc-e27edf5e1ee777d9a4256d94dce849155d85fdd3.tar.gz
abc-e27edf5e1ee777d9a4256d94dce849155d85fdd3.tar.bz2
abc-e27edf5e1ee777d9a4256d94dce849155d85fdd3.zip
Various transformations of Cba_Ntk_t.
Diffstat (limited to 'src/base/cba/cbaBlast.c')
-rw-r--r--src/base/cba/cbaBlast.c305
1 files changed, 193 insertions, 112 deletions
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 ///
////////////////////////////////////////////////////////////////////////