summaryrefslogtreecommitdiffstats
path: root/src/base/cba/cbaBlast.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2015-01-31 19:52:32 -0800
committerAlan Mishchenko <alanmi@berkeley.edu>2015-01-31 19:52:32 -0800
commit77dbe2b6565dbc68a04a315fb51b50a35b763228 (patch)
tree8b8c4bddbd01a69314178d33a8b739867d38f78d /src/base/cba/cbaBlast.c
parenta523ab792c4627c11a57fce9a002f3a5bd4bae45 (diff)
downloadabc-77dbe2b6565dbc68a04a315fb51b50a35b763228.tar.gz
abc-77dbe2b6565dbc68a04a315fb51b50a35b763228.tar.bz2
abc-77dbe2b6565dbc68a04a315fb51b50a35b763228.zip
Major rehash of the CBA code.
Diffstat (limited to 'src/base/cba/cbaBlast.c')
-rw-r--r--src/base/cba/cbaBlast.c376
1 files changed, 182 insertions, 194 deletions
diff --git a/src/base/cba/cbaBlast.c b/src/base/cba/cbaBlast.c
index e4365d83..8fb10b00 100644
--- a/src/base/cba/cbaBlast.c
+++ b/src/base/cba/cbaBlast.c
@@ -4,9 +4,9 @@
SystemName [ABC: Logic synthesis and verification system.]
- PackageName [Verilog parser.]
+ PackageName [Hierarchical word-level netlist.]
- Synopsis [Parses several flavors of word-level Verilog.]
+ Synopsis [Bit-blasting of the netlist.]
Author [Alan Mishchenko]
@@ -49,14 +49,13 @@ void Cba_ManPrepareGates( Cba_Man_t * p )
Dec_Graph_t ** ppGraphs; int i;
if ( p->pMioLib == NULL )
return;
- ppGraphs = ABC_ALLOC( Dec_Graph_t *, Abc_NamObjNumMax(p->pFuncs) );
- ppGraphs[0] = NULL;
- for ( i = 1; i < Abc_NamObjNumMax(p->pFuncs); i++ )
+ ppGraphs = ABC_CALLOC( Dec_Graph_t *, Abc_NamObjNumMax(p->pMods) );
+ for ( i = 1; i < Abc_NamObjNumMax(p->pMods); i++ )
{
- char * pGateName = Abc_NamStr( p->pFuncs, i );
+ char * pGateName = Abc_NamStr( p->pMods, i );
Mio_Gate_t * pGate = Mio_LibraryReadGateByName( (Mio_Library_t *)p->pMioLib, pGateName, NULL );
- char * pSop = Mio_GateReadSop( pGate );
- ppGraphs[i] = Dec_Factor( pSop );
+ if ( pGate != NULL )
+ ppGraphs[i] = Dec_Factor( Mio_GateReadSop(pGate) );
}
assert( p->ppGraphs == NULL );
p->ppGraphs = (void **)ppGraphs;
@@ -66,8 +65,9 @@ void Cba_ManUndoGates( Cba_Man_t * p )
int i;
if ( p->pMioLib == NULL )
return;
- for ( i = 1; i < Abc_NamObjNumMax(p->pFuncs); i++ )
- Dec_GraphFree( (Dec_Graph_t *)p->ppGraphs[i] );
+ for ( i = 1; i < Abc_NamObjNumMax(p->pMods); i++ )
+ if ( p->ppGraphs[i] )
+ Dec_GraphFree( (Dec_Graph_t *)p->ppGraphs[i] );
ABC_FREE( p->ppGraphs );
}
@@ -106,88 +106,96 @@ int Cba_ManAddBarbuf( Gia_Man_t * pNew, int iRes, Cba_Man_t * p, int iLNtk, int
}
int Cba_ManExtract_rec( Gia_Man_t * pNew, Cba_Ntk_t * p, int i, int fBuffers, Vec_Int_t * vMap )
{
- int iRes = Cba_NtkCopy( p, i );
+ int iRes = Cba_ObjCopy( p, i );
if ( iRes >= 0 )
return iRes;
if ( Cba_ObjIsCo(p, i) )
- iRes = Cba_ManExtract_rec( pNew, p, Cba_ObjFanin0(p, i), fBuffers, vMap );
- else if ( Cba_ObjIsBo(p, 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, fBuffers, vMap );
- if ( fBuffers )
- iRes = Cba_ManAddBarbuf( pNew, iRes, p->pDesign, Cba_NtkId(p), i, Cba_NtkId(pBox), iObj, vMap );
- }
+ iRes = Cba_ManExtract_rec( pNew, p, Cba_ObjFanin(p, i), fBuffers, vMap );
else if ( Cba_ObjIsPi(p, i) )
{
Cba_Ntk_t * pHost = Cba_NtkHostNtk( p );
- int iObj = Cba_ObjBoxBi( pHost, Cba_NtkHostObj(p), Cba_ObjCioIndex(p, i) );
+ int iObj = Cba_BoxBi( pHost, Cba_NtkHostObj(p), Cba_ObjIndex(p, i) );
iRes = Cba_ManExtract_rec( pNew, pHost, iObj, fBuffers, vMap );
if ( fBuffers )
iRes = Cba_ManAddBarbuf( pNew, iRes, p->pDesign, Cba_NtkId(p), i, Cba_NtkId(pHost), iObj, vMap );
}
- else if ( Cba_ObjIsNode(p, i) && p->pDesign->ppGraphs )
- {
- extern int Gia_ManFactorGraph( Gia_Man_t * p, Dec_Graph_t * pFForm, Vec_Int_t * vLeaves );
- Dec_Graph_t * pGraph = (Dec_Graph_t *)p->pDesign->ppGraphs[Cba_ObjFuncId(p, i)];
- int k, pLits[32], * pFanins = Cba_ObjFaninArray(p, i);
- Vec_Int_t Leaves = { pFanins[0], pFanins[0], pLits };
- assert( pFanins[0] < 32 );
- for ( k = 0; k < pFanins[0]; k++ )
- pLits[k] = Cba_ManExtract_rec( pNew, p, pFanins[k+1], fBuffers, vMap );
- return Gia_ManFactorGraph( pNew, pGraph, &Leaves );
- }
- else if ( Cba_ObjIsNode(p, i) )
+ else if ( Cba_ObjIsBo(p, i) )
{
- int * pFanins = Cba_ObjFaninArray(p, i);
- int k, pLits[3], Type = Cba_ObjNodeType(p, i);
- assert( pFanins[0] <= 3 );
- if ( pFanins[0] == 0 )
+ int iBox = Cba_BoxBoBox(p, i);
+ if ( Cba_ObjIsBoxUser(p, iBox) ) // user box
{
- if ( Type == CBA_NODE_C0 )
- iRes = 0;
- else if ( Type == CBA_NODE_C1 )
- iRes = 1;
- else assert( 0 );
+ Cba_Ntk_t * pBox = Cba_BoxBoNtk( p, i );
+ int iObj = Cba_NtkPo( pBox, Cba_ObjIndex(p, i) );
+ iRes = Cba_ManExtract_rec( pNew, pBox, iObj, fBuffers, vMap );
+ if ( fBuffers )
+ iRes = Cba_ManAddBarbuf( pNew, iRes, p->pDesign, Cba_NtkId(p), i, Cba_NtkId(pBox), iObj, vMap );
}
- else if ( pFanins[0] == 1 )
- {
- if ( Type == CBA_NODE_BUF )
- iRes = Cba_ManExtract_rec( pNew, p, pFanins[1], fBuffers, vMap );
- else if ( Type == CBA_NODE_INV )
- iRes = Abc_LitNot( Cba_ManExtract_rec( pNew, p, pFanins[1], fBuffers, vMap ) );
- else assert( 0 );
- }
- else
+ else // primitive
{
- for ( k = 0; k < pFanins[0]; k++ )
- pLits[k] = Cba_ManExtract_rec( pNew, p, pFanins[k+1], fBuffers, vMap );
- 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_NOR )
- iRes = Abc_LitNot( 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 if ( Type == CBA_NODE_SHARP )
- iRes = Gia_ManHashAnd( pNew, pLits[0], Abc_LitNot(pLits[1]) );
- else assert( 0 );
+ int iFanin, nLits, pLits[16];
+ assert( Cba_ObjIsBoxPrim(p, iBox) );
+ Cba_BoxForEachFanin( p, iBox, iFanin, nLits )
+ pLits[nLits] = Cba_ManExtract_rec( pNew, p, iFanin, fBuffers, vMap );
+ assert( nLits <= 16 );
+ if ( p->pDesign->ppGraphs ) // mapped gate
+ {
+ extern int Gia_ManFactorGraph( Gia_Man_t * p, Dec_Graph_t * pFForm, Vec_Int_t * vLeaves );
+ Dec_Graph_t * pGraph = (Dec_Graph_t *)p->pDesign->ppGraphs[Cba_BoxNtkId(p, iBox)];
+ Vec_Int_t Leaves = { nLits, nLits, pLits };
+ assert( pGraph != NULL );
+ return Gia_ManFactorGraph( pNew, pGraph, &Leaves );
+ }
+ else
+ {
+ Cba_ObjType_t Type = Cba_ObjType(p, iBox);
+ if ( nLits == 0 )
+ {
+ if ( Type == CBA_BOX_C0 )
+ iRes = 0;
+ else if ( Type == CBA_BOX_C1 )
+ iRes = 1;
+ else assert( 0 );
+ }
+ else if ( nLits == 1 )
+ {
+ if ( Type == CBA_BOX_BUF )
+ iRes = pLits[0];
+ else if ( Type == CBA_BOX_INV )
+ iRes = Abc_LitNot( pLits[0] );
+ else assert( 0 );
+ }
+ else
+ {
+ assert( nLits == 2 );
+ if ( Type == CBA_BOX_AND )
+ iRes = Gia_ManHashAnd( pNew, pLits[0], pLits[1] );
+ else if ( Type == CBA_BOX_OR )
+ iRes = Gia_ManHashOr( pNew, pLits[0], pLits[1] );
+ else if ( Type == CBA_BOX_NOR )
+ iRes = Abc_LitNot( Gia_ManHashOr( pNew, pLits[0], pLits[1] ) );
+ else if ( Type == CBA_BOX_XOR )
+ iRes = Gia_ManHashXor( pNew, pLits[0], pLits[1] );
+ else if ( Type == CBA_BOX_XNOR )
+ iRes = Abc_LitNot( Gia_ManHashXor( pNew, pLits[0], pLits[1] ) );
+ else if ( Type == CBA_BOX_SHARP )
+ iRes = Gia_ManHashAnd( pNew, pLits[0], Abc_LitNot(pLits[1]) );
+ else assert( 0 );
+ }
+ //printf("%d input\n", nLits );
+ }
}
}
else assert( 0 );
- Cba_NtkSetCopy( p, i, iRes );
+ Cba_ObjSetCopy( p, i, iRes );
return iRes;
}
Gia_Man_t * Cba_ManExtract( Cba_Man_t * p, int fBuffers, int fVerbose )
{
- Cba_Ntk_t * pRoot = Cba_ManRoot(p);
+ Cba_Ntk_t * pNtk, * pRoot = Cba_ManRoot(p);
Gia_Man_t * pNew, * pTemp;
Vec_Int_t * vMap = NULL;
int i, iObj;
+
Vec_IntFreeP( &p->vBuf2LeafNtk );
Vec_IntFreeP( &p->vBuf2LeafObj );
Vec_IntFreeP( &p->vBuf2RootNtk );
@@ -197,15 +205,17 @@ Gia_Man_t * Cba_ManExtract( Cba_Man_t * p, int fBuffers, int fVerbose )
p->vBuf2RootNtk = Vec_IntAlloc( 1000 );
p->vBuf2RootObj = Vec_IntAlloc( 1000 );
+ Cba_ManForEachNtk( p, pNtk, i )
+ Cba_NtkStartCopies(pNtk);
+
// start the manager
- pNew = Gia_ManStart( Cba_ManObjNum(p) );
+ pNew = Gia_ManStart( Cba_ManNodeNum(p) );
pNew->pName = Abc_UtilStrsav(p->pName);
pNew->pSpec = Abc_UtilStrsav(p->pSpec);
- Vec_IntFill( &p->vCopies, Cba_ManObjNum(p), -1 );
// primary inputs
Cba_NtkForEachPi( pRoot, iObj, i )
- Cba_NtkSetCopy( pRoot, iObj, Gia_ManAppendCi(pNew) );
+ Cba_ObjSetCopy( pRoot, iObj, Gia_ManAppendCi(pNew) );
// internal nodes
Gia_ManHashAlloc( pNew );
@@ -220,7 +230,7 @@ Gia_Man_t * Cba_ManExtract( Cba_Man_t * p, int fBuffers, int fVerbose )
// primary outputs
Cba_NtkForEachPo( pRoot, iObj, i )
- Gia_ManAppendCo( pNew, Cba_NtkCopy(pRoot, iObj) );
+ Gia_ManAppendCo( pNew, Cba_ObjCopy(pRoot, iObj) );
assert( Vec_IntSize(p->vBuf2LeafNtk) == pNew->nBufs );
// cleanup
@@ -232,7 +242,7 @@ Gia_Man_t * Cba_ManExtract( Cba_Man_t * p, int fBuffers, int fVerbose )
/**Function*************************************************************
- Synopsis [Returns the number of objects in each network.]
+ Synopsis [Mark each GIA node with the network it belongs to.]
Description []
@@ -241,51 +251,29 @@ Gia_Man_t * Cba_ManExtract( Cba_Man_t * p, int fBuffers, int fVerbose )
SeeAlso []
***********************************************************************/
-Vec_Int_t * Cba_ManCountGia( Cba_Man_t * p, Gia_Man_t * pGia, int fAlwaysAdd )
+void Cba_ManMarkNodesGia( Cba_Man_t * p, Gia_Man_t * pGia )
{
- Cba_Ntk_t * pNtk;
- Gia_Obj_t * pObj;
- int i, iBox, Count = 0;
- Vec_Int_t * vNtkSizes = Vec_IntStart( Cba_ManNtkNum(p) + 1 );
- Vec_Int_t * vDrivenCos = Vec_IntStart( Cba_ManNtkNum(p) + 1 );
+ Gia_Obj_t * pObj; int i, Count = 0;
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_ManConst0(pGia)->Value = 0;
Gia_ManForEachPi( pGia, pObj, i )
- pObj->Value = 1;
+ pObj->Value = 0;
Gia_ManForEachAnd( pGia, pObj, i )
{
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 );
}
}
assert( Count == Gia_ManBufNum(pGia) );
Gia_ManForEachPo( pGia, pObj, i )
{
- assert( Gia_ObjFanin0(pObj)->Value == 1 );
- pObj->Value = Gia_ObjFanin0(pObj)->Value;
- if ( Gia_ObjIsAnd(Gia_ObjFanin0(pObj)) )
- Vec_IntAddToEntry( vDrivenCos, pObj->Value, 1 );
- }
- // for each network, count the total number of COs
- Cba_ManForEachNtk( p, pNtk, i )
- {
- Count = Cba_NtkPiNum(pNtk) + 2 * Cba_NtkPoNum(pNtk) - (fAlwaysAdd ? 0 : Vec_IntEntry(vDrivenCos, i));
- Cba_NtkForEachBox( pNtk, iBox )
- Count += Cba_ObjBoxSize(pNtk, iBox) + Cba_ObjBoxBiNum(pNtk, iBox);
- Vec_IntAddToEntry( vNtkSizes, i, Count );
+ assert( Gia_ObjFanin0(pObj)->Value == 0 );
+ pObj->Value = 0;
}
- Vec_IntFree( vDrivenCos );
- return vNtkSizes;
}
void Cba_ManRemapBarbufs( Cba_Man_t * pNew, Cba_Man_t * p )
{
@@ -299,34 +287,41 @@ void Cba_ManRemapBarbufs( Cba_Man_t * pNew, Cba_Man_t * p )
Vec_IntForEachEntry( p->vBuf2LeafObj, Entry, i )
{
pNtk = Cba_ManNtk( p, Vec_IntEntry(p->vBuf2LeafNtk, i) );
- Vec_IntWriteEntry( pNew->vBuf2LeafObj, i, Cba_NtkCopy(pNtk, Entry) );
+ Vec_IntWriteEntry( pNew->vBuf2LeafObj, i, Cba_ObjCopy(pNtk, Entry) );
}
Vec_IntForEachEntry( p->vBuf2RootObj, Entry, i )
{
pNtk = Cba_ManNtk( p, Vec_IntEntry(p->vBuf2RootNtk, i) );
- Vec_IntWriteEntry( pNew->vBuf2RootObj, i, Cba_NtkCopy(pNtk, Entry) );
+ Vec_IntWriteEntry( pNew->vBuf2RootObj, i, Cba_ObjCopy(pNtk, Entry) );
}
}
void Cba_NtkCreateAndConnectBuffer( Gia_Man_t * pGia, Gia_Obj_t * pObj, Cba_Ntk_t * p, int iTerm )
{
- Vec_IntWriteEntry( &p->vTypes, p->nObjs, CBA_OBJ_NODE );
+ int iObj;
+// Vec_IntWriteEntry( &p->vTypes, p->nObjs, CBA_OBJ_NODE );
if ( pGia && Gia_ObjFaninId0p(pGia, pObj) > 0 )
{
- Vec_IntWriteEntry( &p->vFuncs, p->nObjs, Gia_ObjFaninC0(pObj) ? CBA_NODE_INV : CBA_NODE_BUF );
- Vec_IntWriteEntry( &p->vFanins, p->nObjs, Cba_ManHandleBuffer(p->pDesign, Gia_ObjFanin0(pObj)->Value) );
+// Vec_IntWriteEntry( &p->vFuncs, p->nObjs, Gia_ObjFaninC0(pObj) ? CBA_BOX_INV : CBA_BOX_BUF );
+// Vec_IntWriteEntry( &p->vFanins, p->nObjs, Cba_ManHandleBuffer(p->pDesign, Gia_ObjFanin0(pObj)->Value) );
+ iObj = Cba_ObjAlloc( p, CBA_OBJ_BI, 0, Gia_ObjFanin0(pObj)->Value );
+ Cba_ObjSetName( p, iObj, Cba_ObjName(p, Gia_ObjFanin0(pObj)->Value) );
+ Cba_ObjAlloc( p, Gia_ObjFaninC0(pObj) ? CBA_BOX_INV : CBA_BOX_BUF, -1, -1 );
}
else
{
- Vec_IntWriteEntry( &p->vFuncs, p->nObjs, pGia && Gia_ObjFaninC0(pObj) ? CBA_NODE_C1 : CBA_NODE_C0 );
- Vec_IntWriteEntry( &p->vFanins, p->nObjs, Cba_ManHandleBuffer(p->pDesign, -1) );
+// Vec_IntWriteEntry( &p->vFuncs, p->nObjs, pGia && Gia_ObjFaninC0(pObj) ? CBA_BOX_C1 : CBA_BOX_C0 );
+// Vec_IntWriteEntry( &p->vFanins, p->nObjs, Cba_ManHandleBuffer(p->pDesign, -1) );
+ Cba_ObjAlloc( p, pGia && Gia_ObjFaninC0(pObj) ? CBA_BOX_C1 : CBA_BOX_C0, -1, -1 );
}
- Vec_IntWriteEntry( &p->vNameIds, p->nObjs, Cba_ObjNameId(p, iTerm) );
- Vec_IntWriteEntry( &p->vFanins, iTerm, p->nObjs++ );
+// Vec_IntWriteEntry( &p->vNameIds, p->nObjs, Cba_ObjNameId(p, iTerm) );
+// Vec_IntWriteEntry( &p->vFanins, iTerm, p->nObjs++ );
+ iObj = Cba_ObjAlloc( p, CBA_OBJ_BO, 0, -1 );
+ Cba_ObjSetName( p, iObj, Cba_ObjName(p, iTerm) );
+ Cba_ObjSetFanin( p, iTerm, iObj );
}
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;
@@ -348,53 +343,58 @@ void Cba_NtkInsertGia( Cba_Man_t * p, Gia_Man_t * pGia )
{
int iLit0 = Gia_ObjFanin0(pObj)->Value;
int iLit1 = Gia_ObjFanin1(pObj)->Value;
- Cba_NodeType_t Type;
+ Cba_ObjType_t Type;
pNtk = Cba_ManNtk( p, pObj->Value );
if ( Gia_ObjFaninC0(pObj) && Gia_ObjFaninC1(pObj) )
- Type = CBA_NODE_NOR;
+ Type = CBA_BOX_NOR;
else if ( Gia_ObjFaninC1(pObj) )
- Type = CBA_NODE_SHARP;
+ Type = CBA_BOX_SHARP;
else if ( Gia_ObjFaninC0(pObj) )
{
- Type = CBA_NODE_SHARP;
+ Type = CBA_BOX_SHARP;
ABC_SWAP( int, iLit0, iLit1 );
}
else
- Type = CBA_NODE_AND;
+ Type = CBA_BOX_AND;
+ // create box
+/*
Vec_IntFillTwo( vTemp, 2, iLit0, iLit1 );
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->nObjs++;
+*/
+ iTerm = Cba_ObjAlloc( pNtk, CBA_OBJ_BI, 1, iLit1 );
+ Cba_ObjSetName( pNtk, iTerm, Cba_ObjName(pNtk, iLit1) );
+ iTerm = Cba_ObjAlloc( pNtk, CBA_OBJ_BI, 0, iLit0 );
+ Cba_ObjSetName( pNtk, iTerm, Cba_ObjName(pNtk, iLit0) );
+ Cba_ObjAlloc( pNtk, Type, -1, -1 );
+ pObj->Value = Cba_ObjAlloc( pNtk, CBA_OBJ_BO, 0, -1 );
}
}
assert( Count == Gia_ManBufNum(pGia) );
- Vec_IntFree( vTemp );
// create constant 0 drivers for COs without barbufs
Cba_ManForEachNtk( p, pNtk, i )
{
Cba_NtkForEachBox( pNtk, iBox )
Cba_BoxForEachBi( pNtk, iBox, iTerm, j )
- if ( Cba_ObjFanin0(pNtk, iTerm) == -1 )
+ if ( Cba_ObjFanin(pNtk, iTerm) == -1 )
Cba_NtkCreateAndConnectBuffer( NULL, NULL, pNtk, iTerm );
Cba_NtkForEachPo( pNtk, iTerm, k )
- if ( pNtk != pRoot && Cba_ObjFanin0(pNtk, iTerm) == -1 )
+ if ( pNtk != pRoot && Cba_ObjFanin(pNtk, iTerm) == -1 )
Cba_NtkCreateAndConnectBuffer( NULL, NULL, pNtk, iTerm );
}
// create node and connect POs
Gia_ManForEachPo( pGia, pObj, i )
Cba_NtkCreateAndConnectBuffer( pGia, pObj, pRoot, Cba_NtkPo(pRoot, i) );
- Cba_ManForEachNtk( p, pNtk, i )
- assert( Cba_NtkObjNum(pNtk) == pNtk->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_Man_t * pNew = Cba_ManDupUserBoxes( p );
+ Cba_ManMarkNodesGia( p, pGia );
Cba_ManRemapBarbufs( pNew, p );
Cba_NtkInsertGia( pNew, pGia );
- Vec_IntFree( vNtkSizes );
return pNew;
}
@@ -414,14 +414,12 @@ Cba_Man_t * Cba_ManBlastTest( Cba_Man_t * p )
Gia_Man_t * pGia = Cba_ManExtract( p, 1, 0 );
Cba_Man_t * pNew = Cba_ManInsertGia( p, pGia );
Gia_ManStop( pGia );
- Cba_ManAssignInternNames( pNew );
return pNew;
}
-
/**Function*************************************************************
- Synopsis []
+ Synopsis [Mark each GIA node with the network it belongs to.]
Description []
@@ -432,79 +430,68 @@ Cba_Man_t * Cba_ManBlastTest( Cba_Man_t * p )
***********************************************************************/
static inline int Abc_NodeIsSeriousGate( Abc_Obj_t * p )
{
- return (Abc_ObjIsNode(p) && (Abc_ObjFaninNum(p) > 0) && !Abc_ObjIsBarBuf(p));// || Abc_ObjIsPi(p);
+ return Abc_ObjIsNode(p) && Abc_ObjFaninNum(p) > 0 && !Abc_ObjIsBarBuf(p);
}
-Vec_Int_t * Cba_ManCountAbc( Cba_Man_t * p, Abc_Ntk_t * pNtk, int fAlwaysAdd )
+void Cba_ManMarkNodesAbc( Cba_Man_t * p, Abc_Ntk_t * pNtk )
{
- Cba_Ntk_t * pCbaNtk;
- Abc_Obj_t * pObj, * pFanin;
- 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 );
+ Abc_Obj_t * pObj, * pFanin; int i, k, Count = 0;
assert( Vec_IntSize(p->vBuf2LeafNtk) == pNtk->nBarBufs2 );
- // assing for each GIA node, the network it belongs to and count nodes for all networks
Abc_NtkForEachPi( pNtk, pObj, i )
- pObj->iTemp = 1;
+ pObj->iTemp = 0;
Abc_NtkForEachNode( pNtk, pObj, i )
{
if ( Abc_ObjIsBarBuf(pObj) )
- {
- if ( Abc_NodeIsSeriousGate(Abc_ObjFanin0(pObj)) )
- Vec_IntAddToEntry( vDrivenCos, Abc_ObjFanin0(pObj)->iTemp, 1 );
pObj->iTemp = Vec_IntEntry( p->vBuf2LeafNtk, Count++ );
- }
else if ( Abc_NodeIsSeriousGate(pObj) )
{
pObj->iTemp = Abc_ObjFanin0(pObj)->iTemp;
Abc_ObjForEachFanin( pObj, pFanin, k )
assert( pObj->iTemp == pFanin->iTemp );
- Vec_IntAddToEntry( vNtkSizes, pObj->iTemp, 1 );
}
}
- assert( Count == pNtk->nBarBufs2 );
Abc_NtkForEachPo( pNtk, pObj, i )
{
if ( !Abc_NodeIsSeriousGate(Abc_ObjFanin0(pObj)) )
continue;
- assert( Abc_ObjFanin0(pObj)->iTemp == 1 );
+ assert( Abc_ObjFanin0(pObj)->iTemp == 0 );
pObj->iTemp = Abc_ObjFanin0(pObj)->iTemp;
- Vec_IntAddToEntry( vDrivenCos, pObj->iTemp, 1 );
- }
- // for each network, count the total number of COs
- Cba_ManForEachNtk( p, pCbaNtk, i )
- {
- Count = Cba_NtkPiNum(pCbaNtk) + 2 * Cba_NtkPoNum(pCbaNtk) - (fAlwaysAdd ? 0 : Vec_IntEntry(vDrivenCos, i));
- Cba_NtkForEachBox( pCbaNtk, iBox )
- Count += Cba_ObjBoxSize(pCbaNtk, iBox) + Cba_ObjBoxBiNum(pCbaNtk, iBox);
- Vec_IntAddToEntry( vNtkSizes, i, Count );
}
- Vec_IntFree( vDrivenCos );
- return vNtkSizes;
+ assert( Count == pNtk->nBarBufs2 );
}
-void Cba_NtkCreateOrConnectFanin( Abc_Ntk_t * pNtk, Abc_Obj_t * pFanin, Cba_Ntk_t * p, int iTerm )
+void Cba_NtkCreateOrConnectFanin( Abc_Obj_t * pFanin, Cba_Ntk_t * p, int iTerm )
{
- if ( pNtk && Abc_NodeIsSeriousGate(pFanin) )
+ int iObj;
+ if ( pFanin && Abc_NodeIsSeriousGate(pFanin) )
{
- Vec_IntWriteEntry( &p->vNameIds, pFanin->iTemp, Cba_ObjNameId(p, iTerm) );
- Vec_IntWriteEntry( &p->vFanins, iTerm, pFanin->iTemp );
+// Vec_IntWriteEntry( &p->vNameIds, pFanin->iTemp, Cba_ObjNameId(p, iTerm) );
+// Vec_IntWriteEntry( &p->vFanins, iTerm, pFanin->iTemp );
+ iObj = pFanin->iTemp;
}
- else if ( pNtk && (Abc_ObjIsPi(pFanin) || Abc_ObjIsBarBuf(pFanin)) )
+ else if ( pFanin && (Abc_ObjIsPi(pFanin) || Abc_ObjIsBarBuf(pFanin)) )
{
- Vec_IntWriteEntry( &p->vTypes, p->nObjs, CBA_OBJ_NODE );
- Vec_IntWriteEntry( &p->vFuncs, p->nObjs, 3 ); // assuming elem gates are added first
- Vec_IntWriteEntry( &p->vFanins, p->nObjs, Cba_ManHandleBuffer(p->pDesign, pFanin->iTemp) );
- Vec_IntWriteEntry( &p->vNameIds, p->nObjs, Cba_ObjNameId(p, iTerm) );
- Vec_IntWriteEntry( &p->vFanins, iTerm, p->nObjs++ );
+// Vec_IntWriteEntry( &p->vTypes, p->nObjs, CBA_OBJ_NODE );
+// Vec_IntWriteEntry( &p->vFuncs, p->nObjs, 3 ); // assuming elem gates are added first
+// Vec_IntWriteEntry( &p->vFanins, p->nObjs, Cba_ManHandleBuffer(p->pDesign, pFanin->iTemp) );
+// Vec_IntWriteEntry( &p->vNameIds, p->nObjs, Cba_ObjNameId(p, iTerm) );
+// Vec_IntWriteEntry( &p->vFanins, iTerm, p->nObjs++ );
+ iObj = Cba_ObjAlloc( p, CBA_OBJ_BI, 0, pFanin->iTemp );
+ Cba_ObjSetName( p, iObj, Cba_ObjName(p, pFanin->iTemp) );
+ Cba_ObjAlloc( p, CBA_BOX_GATE, p->pDesign->ElemGates[2], -1 );
+ iObj = Cba_ObjAlloc( p, CBA_OBJ_BO, 0, -1 );
}
else
{
assert( !pFanin || Abc_NodeIsConst0(pFanin) || Abc_NodeIsConst1(pFanin) );
- Vec_IntWriteEntry( &p->vTypes, p->nObjs, CBA_OBJ_NODE );
- Vec_IntWriteEntry( &p->vFuncs, p->nObjs, pNtk && Abc_NodeIsConst1(pFanin) ? 2 : 1 ); // assuming elem gates are added first
- Vec_IntWriteEntry( &p->vFanins, p->nObjs, Cba_ManHandleBuffer(p->pDesign, -1) );
- Vec_IntWriteEntry( &p->vNameIds, p->nObjs, Cba_ObjNameId(p, iTerm) );
- Vec_IntWriteEntry( &p->vFanins, iTerm, p->nObjs++ );
+// Vec_IntWriteEntry( &p->vTypes, p->nObjs, CBA_OBJ_NODE );
+// Vec_IntWriteEntry( &p->vFuncs, p->nObjs, pFanin && Abc_NodeIsConst1(pFanin) ? 2 : 1 ); // assuming elem gates are added first
+// Vec_IntWriteEntry( &p->vFanins, p->nObjs, Cba_ManHandleBuffer(p->pDesign, -1) );
+// Vec_IntWriteEntry( &p->vNameIds, p->nObjs, Cba_ObjNameId(p, iTerm) );
+// Vec_IntWriteEntry( &p->vFanins, iTerm, p->nObjs++ );
+ Cba_ObjAlloc( p, CBA_BOX_GATE, p->pDesign->ElemGates[(pFanin && Abc_NodeIsConst1(pFanin))], -1 );
+ iObj = Cba_ObjAlloc( p, CBA_OBJ_BO, 0, -1 );
}
+ Cba_ObjSetName( p, iObj, Cba_ObjName(p, iTerm) );
+ Cba_ObjSetFanin( p, iTerm, iObj );
}
void Cba_NtkPrepareLibrary( Cba_Man_t * p, Mio_Library_t * pLib )
{
@@ -517,22 +504,19 @@ void Cba_NtkPrepareLibrary( Cba_Man_t * p, Mio_Library_t * pLib )
printf( "The library does not have one of the elementary gates.\n" );
return;
}
- assert( Abc_NamObjNumMax(p->pFuncs) == 1 );
- Abc_NamStrFindOrAdd( p->pFuncs, Mio_GateReadName(pGate0), NULL );
- Abc_NamStrFindOrAdd( p->pFuncs, Mio_GateReadName(pGate1), NULL );
- Abc_NamStrFindOrAdd( p->pFuncs, Mio_GateReadName(pGate2), NULL );
- assert( Abc_NamObjNumMax(p->pFuncs) == 4 );
+ p->ElemGates[0] = Abc_NamStrFindOrAdd( p->pMods, Mio_GateReadName(pGate0), NULL );
+ p->ElemGates[1] = Abc_NamStrFindOrAdd( p->pMods, Mio_GateReadName(pGate1), NULL );
+ p->ElemGates[2] = Abc_NamStrFindOrAdd( p->pMods, Mio_GateReadName(pGate2), NULL );
Mio_LibraryForEachGate( pLib, pGate )
if ( pGate != pGate0 && pGate != pGate1 && pGate != pGate2 )
- Abc_NamStrFindOrAdd( p->pFuncs, Mio_GateReadName(pGate), NULL );
- assert( Abc_NamObjNumMax(p->pFuncs) > 1 );
+ Abc_NamStrFindOrAdd( p->pMods, Mio_GateReadName(pGate), NULL );
+ assert( Abc_NamObjNumMax(p->pMods) > 1 );
}
void Cba_NtkInsertNtk( Cba_Man_t * p, Abc_Ntk_t * pNtk )
{
Cba_Ntk_t * pCbaNtk, * pRoot = Cba_ManRoot( p );
- Vec_Int_t * vTemp = Vec_IntAlloc( 100 );
int i, j, k, iBox, iTerm, Count = 0;
- Abc_Obj_t * pObj, * pFanin;
+ Abc_Obj_t * pObj;
assert( Abc_NtkHasMapping(pNtk) );
Cba_NtkPrepareLibrary( p, (Mio_Library_t *)pNtk->pManFunc );
p->pMioLib = pNtk->pManFunc;
@@ -546,55 +530,59 @@ void Cba_NtkInsertNtk( Cba_Man_t * p, Abc_Ntk_t * pNtk )
pCbaNtk = Cba_ManNtk( p, Vec_IntEntry(p->vBuf2RootNtk, Count) );
iTerm = Vec_IntEntry( p->vBuf2RootObj, Count );
assert( Cba_ObjIsCo(pCbaNtk, iTerm) );
- Cba_NtkCreateOrConnectFanin( pNtk, Abc_ObjFanin0(pObj), pCbaNtk, iTerm );
+ Cba_NtkCreateOrConnectFanin( Abc_ObjFanin0(pObj), pCbaNtk, iTerm );
// prepare leaf
pObj->iTemp = Vec_IntEntry( p->vBuf2LeafObj, Count++ );
}
else if ( Abc_NodeIsSeriousGate(pObj) )
{
+/*
Vec_IntClear( vTemp );
Abc_ObjForEachFanin( pObj, pFanin, k )
Vec_IntPush( vTemp, pFanin->iTemp );
pCbaNtk = Cba_ManNtk( p, pObj->iTemp );
Vec_IntWriteEntry( &pCbaNtk->vTypes, pCbaNtk->nObjs, CBA_OBJ_NODE );
- Vec_IntWriteEntry( &pCbaNtk->vFuncs, pCbaNtk->nObjs, Abc_NamStrFind(p->pFuncs, Mio_GateReadName((Mio_Gate_t *)pObj->pData)) );
+ Vec_IntWriteEntry( &pCbaNtk->vFuncs, pCbaNtk->nObjs, Abc_NamStrFind(p->pMods, Mio_GateReadName((Mio_Gate_t *)pObj->pData)) );
Vec_IntWriteEntry( &pCbaNtk->vFanins, pCbaNtk->nObjs, Cba_ManHandleArray(p, vTemp) );
pObj->iTemp = pCbaNtk->nObjs++;
+*/
+ pCbaNtk = Cba_ManNtk( p, pObj->iTemp );
+ for ( k = Abc_ObjFaninNum(pObj)-1; k >= 0; k-- )
+ {
+ iTerm = Cba_ObjAlloc( pCbaNtk, CBA_OBJ_BI, k, Abc_ObjFanin(pObj, k)->iTemp );
+ Cba_ObjSetName( pCbaNtk, iTerm, Cba_ObjName(pCbaNtk, Abc_ObjFanin(pObj, k)->iTemp) );
+ }
+ Cba_ObjAlloc( pCbaNtk, CBA_BOX_GATE, Abc_NamStrFind(p->pMods, Mio_GateReadName((Mio_Gate_t *)pObj->pData)), -1 );
+ pObj->iTemp = Cba_ObjAlloc( pCbaNtk, CBA_OBJ_BO, 0, -1 );
}
}
assert( Count == pNtk->nBarBufs2 );
- Vec_IntFree( vTemp );
// create constant 0 drivers for COs without barbufs
Cba_ManForEachNtk( p, pCbaNtk, i )
{
Cba_NtkForEachBox( pCbaNtk, iBox )
Cba_BoxForEachBi( pCbaNtk, iBox, iTerm, j )
- if ( Cba_ObjFanin0(pCbaNtk, iTerm) == -1 )
- Cba_NtkCreateOrConnectFanin( NULL, NULL, pCbaNtk, iTerm );
+ if ( Cba_ObjFanin(pCbaNtk, iTerm) == -1 )
+ Cba_NtkCreateOrConnectFanin( NULL, pCbaNtk, iTerm );
Cba_NtkForEachPo( pCbaNtk, iTerm, k )
- if ( pCbaNtk != pRoot && Cba_ObjFanin0(pCbaNtk, iTerm) == -1 )
- Cba_NtkCreateOrConnectFanin( NULL, NULL, pCbaNtk, iTerm );
+ if ( pCbaNtk != pRoot && Cba_ObjFanin(pCbaNtk, iTerm) == -1 )
+ Cba_NtkCreateOrConnectFanin( NULL, pCbaNtk, iTerm );
}
// create node and connect POs
Abc_NtkForEachPo( pNtk, pObj, i )
- Cba_NtkCreateOrConnectFanin( pNtk, Abc_ObjFanin0(pObj), pRoot, Cba_NtkPo(pRoot, i) );
- Cba_ManForEachNtk( p, pCbaNtk, i )
- assert( Cba_NtkObjNum(pCbaNtk) == pCbaNtk->nObjs );
+ Cba_NtkCreateOrConnectFanin( Abc_ObjFanin0(pObj), pRoot, Cba_NtkPo(pRoot, i) );
}
void * Cba_ManInsertAbc( Cba_Man_t * p, void * pAbc )
{
Abc_Ntk_t * pNtk = (Abc_Ntk_t *)pAbc;
- Vec_Int_t * vNtkSizes = Cba_ManCountAbc( p, pNtk, 0 );
- Cba_Man_t * pNew = Cba_ManDupStart( p, vNtkSizes );
+ Cba_Man_t * pNew = Cba_ManDupUserBoxes( p );
+ Cba_ManMarkNodesAbc( p, pNtk );
Cba_ManRemapBarbufs( pNew, p );
Cba_NtkInsertNtk( pNew, pNtk );
- Vec_IntFree( vNtkSizes );
return pNew;
}
-
-
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////