summaryrefslogtreecommitdiffstats
path: root/src/base/abc/abcNtk.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/abc/abcNtk.c')
-rw-r--r--src/base/abc/abcNtk.c970
1 files changed, 163 insertions, 807 deletions
diff --git a/src/base/abc/abcNtk.c b/src/base/abc/abcNtk.c
index d78a3a6a..5c199141 100644
--- a/src/base/abc/abcNtk.c
+++ b/src/base/abc/abcNtk.c
@@ -19,7 +19,6 @@
***********************************************************************/
#include "abc.h"
-#include "abcInt.h"
#include "main.h"
#include "mio.h"
@@ -27,8 +26,10 @@
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
+#define ABC_NUM_STEPS 10
+
////////////////////////////////////////////////////////////////////////
-/// FUNCTION DEFINITIONS ///
+/// FUNCTION DEFITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
@@ -42,7 +43,7 @@
SeeAlso []
***********************************************************************/
-Abc_Ntk_t * Abc_NtkAlloc( Abc_NtkType_t Type, Abc_NtkFunc_t Func, int fUseMemMan )
+Abc_Ntk_t * Abc_NtkAlloc( Abc_NtkType_t Type, Abc_NtkFunc_t Func )
{
Abc_Ntk_t * pNtk;
pNtk = ALLOC( Abc_Ntk_t, 1 );
@@ -51,35 +52,32 @@ Abc_Ntk_t * Abc_NtkAlloc( Abc_NtkType_t Type, Abc_NtkFunc_t Func, int fUseMemMan
pNtk->ntkFunc = Func;
// start the object storage
pNtk->vObjs = Vec_PtrAlloc( 100 );
- pNtk->vAsserts = Vec_PtrAlloc( 100 );
- pNtk->vPios = Vec_PtrAlloc( 100 );
- pNtk->vPis = Vec_PtrAlloc( 100 );
- pNtk->vPos = Vec_PtrAlloc( 100 );
+ pNtk->vLats = Vec_PtrAlloc( 100 );
pNtk->vCis = Vec_PtrAlloc( 100 );
pNtk->vCos = Vec_PtrAlloc( 100 );
- pNtk->vBoxes = Vec_PtrAlloc( 100 );
+ pNtk->vPtrTemp = Vec_PtrAlloc( 100 );
+ pNtk->vIntTemp = Vec_IntAlloc( 100 );
+ pNtk->vStrTemp = Vec_StrAlloc( 100 );
+ // start the hash table
+ pNtk->tName2Net = stmm_init_table(strcmp, stmm_strhash);
+ pNtk->tObj2Name = stmm_init_table(stmm_ptrcmp, stmm_ptrhash);
// start the memory managers
- pNtk->pMmObj = fUseMemMan? Extra_MmFixedStart( sizeof(Abc_Obj_t) ) : NULL;
- pNtk->pMmStep = fUseMemMan? Extra_MmStepStart( ABC_NUM_STEPS ) : NULL;
+ pNtk->pMmNames = Extra_MmFlexStart();
+ pNtk->pMmObj = Extra_MmFixedStart( sizeof(Abc_Obj_t) );
+ pNtk->pMmStep = Extra_MmStepStart( ABC_NUM_STEPS );
// get ready to assign the first Obj ID
pNtk->nTravIds = 1;
// start the functionality manager
- if ( Abc_NtkIsStrash(pNtk) )
- pNtk->pManFunc = Abc_AigAlloc( pNtk );
- else if ( Abc_NtkHasSop(pNtk) || Abc_NtkHasBlifMv(pNtk) )
+ if ( Abc_NtkHasSop(pNtk) )
pNtk->pManFunc = Extra_MmFlexStart();
else if ( Abc_NtkHasBdd(pNtk) )
pNtk->pManFunc = Cudd_Init( 20, 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
else if ( Abc_NtkHasAig(pNtk) )
- pNtk->pManFunc = Hop_ManStart();
+ pNtk->pManFunc = Abc_AigAlloc( pNtk );
else if ( Abc_NtkHasMapping(pNtk) )
- pNtk->pManFunc = Abc_FrameReadLibGen();
- else if ( !Abc_NtkHasBlackbox(pNtk) )
+ pNtk->pManFunc = Abc_FrameReadLibGen(Abc_FrameGetGlobalFrame());
+ else
assert( 0 );
- // name manager
- pNtk->pManName = Nm_ManCreate( 200 );
- // attribute manager
- pNtk->vAttrs = Vec_PtrStart( VEC_ATTR_TOTAL_NUM );
return pNtk;
}
@@ -97,44 +95,38 @@ Abc_Ntk_t * Abc_NtkAlloc( Abc_NtkType_t Type, Abc_NtkFunc_t Func, int fUseMemMan
Abc_Ntk_t * Abc_NtkStartFrom( Abc_Ntk_t * pNtk, Abc_NtkType_t Type, Abc_NtkFunc_t Func )
{
Abc_Ntk_t * pNtkNew;
- Abc_Obj_t * pObj;
- int fCopyNames, i;
+ Abc_Obj_t * pObj, * pObjNew;
+ int i;
if ( pNtk == NULL )
return NULL;
- // decide whether to copy the names
- fCopyNames = ( Type != ABC_NTK_NETLIST );
// start the network
- pNtkNew = Abc_NtkAlloc( Type, Func, 1 );
+ pNtkNew = Abc_NtkAlloc( Type, Func );
// duplicate the name and the spec
- pNtkNew->pName = Extra_UtilStrsav(pNtk->pName);
- pNtkNew->pSpec = Extra_UtilStrsav(pNtk->pSpec);
- // clean the node copy fields
- Abc_NtkCleanCopy( pNtk );
- // map the constant nodes
- if ( Abc_NtkIsStrash(pNtk) && Abc_NtkIsStrash(pNtkNew) )
- Abc_AigConst1(pNtk)->pCopy = Abc_AigConst1(pNtkNew);
- // clone CIs/CIs/boxes
+ pNtkNew->pName = util_strsav(pNtk->pName);
+ pNtkNew->pSpec = util_strsav(pNtk->pSpec);
+ // clone the PIs/POs/latches
Abc_NtkForEachPi( pNtk, pObj, i )
- Abc_NtkDupObj( pNtkNew, pObj, fCopyNames );
+ Abc_NtkDupObj(pNtkNew, pObj);
Abc_NtkForEachPo( pNtk, pObj, i )
- Abc_NtkDupObj( pNtkNew, pObj, fCopyNames );
- Abc_NtkForEachAssert( pNtk, pObj, i )
- Abc_NtkDupObj( pNtkNew, pObj, fCopyNames );
- Abc_NtkForEachBox( pNtk, pObj, i )
- Abc_NtkDupBox( pNtkNew, pObj, fCopyNames );
+ Abc_NtkDupObj(pNtkNew, pObj);
+ Abc_NtkForEachLatch( pNtk, pObj, i )
+ {
+ pObjNew = Abc_NtkDupObj(pNtkNew, pObj);
+ Vec_PtrPush( pNtkNew->vCis, pObjNew );
+ Vec_PtrPush( pNtkNew->vCos, pObjNew );
+ }
+ // clean the node copy fields
+ Abc_NtkForEachNode( pNtk, pObj, i )
+ pObj->pCopy = NULL;
// transfer the names
-// Abc_NtkTrasferNames( pNtk, pNtkNew );
+ Abc_NtkDupCioNamesTable( pNtk, pNtkNew );
Abc_ManTimeDup( pNtk, pNtkNew );
- // check that the CI/CO/latches are copied correctly
- assert( Abc_NtkCiNum(pNtk) == Abc_NtkCiNum(pNtkNew) );
- assert( Abc_NtkCoNum(pNtk) == Abc_NtkCoNum(pNtkNew) );
- assert( Abc_NtkLatchNum(pNtk) == Abc_NtkLatchNum(pNtkNew) );
return pNtkNew;
}
/**Function*************************************************************
- Synopsis [Starts a new network using existing network as a model.]
+ Synopsis [Finalizes the network using the existing network as a model.]
Description []
@@ -143,44 +135,17 @@ Abc_Ntk_t * Abc_NtkStartFrom( Abc_Ntk_t * pNtk, Abc_NtkType_t Type, Abc_NtkFunc_
SeeAlso []
***********************************************************************/
-Abc_Ntk_t * Abc_NtkStartFromNoLatches( Abc_Ntk_t * pNtk, Abc_NtkType_t Type, Abc_NtkFunc_t Func )
+void Abc_NtkFinalize( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew )
{
- Abc_Ntk_t * pNtkNew;
- Abc_Obj_t * pObj;
+ Abc_Obj_t * pObj, * pDriver, * pDriverNew;
int i;
- if ( pNtk == NULL )
- return NULL;
- assert( Type != ABC_NTK_NETLIST );
- // start the network
- pNtkNew = Abc_NtkAlloc( Type, Func, 1 );
- // duplicate the name and the spec
- pNtkNew->pName = Extra_UtilStrsav(pNtk->pName);
- pNtkNew->pSpec = Extra_UtilStrsav(pNtk->pSpec);
- // clean the node copy fields
- Abc_NtkCleanCopy( pNtk );
- // map the constant nodes
- if ( Abc_NtkIsStrash(pNtk) && Abc_NtkIsStrash(pNtkNew) )
- Abc_AigConst1(pNtk)->pCopy = Abc_AigConst1(pNtkNew);
- // clone CIs/CIs/boxes
- Abc_NtkForEachPi( pNtk, pObj, i )
- Abc_NtkDupObj( pNtkNew, pObj, 1 );
- Abc_NtkForEachPo( pNtk, pObj, i )
- Abc_NtkDupObj( pNtkNew, pObj, 1 );
- Abc_NtkForEachAssert( pNtk, pObj, i )
- Abc_NtkDupObj( pNtkNew, pObj, 1 );
- Abc_NtkForEachBox( pNtk, pObj, i )
+ // set the COs of the strashed network
+ Abc_NtkForEachCo( pNtk, pObj, i )
{
- if ( Abc_ObjIsLatch(pObj) )
- continue;
- Abc_NtkDupBox(pNtkNew, pObj, 1);
+ pDriver = Abc_ObjFanin0Ntk( Abc_ObjFanin0(pObj) );
+ pDriverNew = Abc_ObjNotCond(pDriver->pCopy, Abc_ObjFaninC0(pObj));
+ Abc_ObjAddFanin( pObj->pCopy, pDriverNew );
}
- // transfer the names
-// Abc_NtkTrasferNamesNoLatches( pNtk, pNtkNew );
- Abc_ManTimeDup( pNtk, pNtkNew );
- // check that the CI/CO/latches are copied correctly
- assert( Abc_NtkPiNum(pNtk) == Abc_NtkPiNum(pNtkNew) );
- assert( Abc_NtkPoNum(pNtk) == Abc_NtkPoNum(pNtkNew) );
- return pNtkNew;
}
/**Function*************************************************************
@@ -194,7 +159,7 @@ Abc_Ntk_t * Abc_NtkStartFromNoLatches( Abc_Ntk_t * pNtk, Abc_NtkType_t Type, Abc
SeeAlso []
***********************************************************************/
-void Abc_NtkFinalize( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew )
+void Abc_NtkFinalizeRegular( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew )
{
Abc_Obj_t * pObj, * pDriver, * pDriverNew;
int i;
@@ -202,13 +167,37 @@ void Abc_NtkFinalize( Abc_Ntk_t * pNtk, Abc_Ntk_t * pNtkNew )
Abc_NtkForEachCo( pNtk, pObj, i )
{
pDriver = Abc_ObjFanin0Ntk( Abc_ObjFanin0(pObj) );
- pDriverNew = Abc_ObjNotCond(pDriver->pCopy, Abc_ObjFaninC0(pObj));
+ pDriverNew = pDriver->pCopy;
Abc_ObjAddFanin( pObj->pCopy, pDriverNew );
}
}
/**Function*************************************************************
+ Synopsis [Finalizes the network adding latches to CI/CO lists and creates their names.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Abc_NtkFinalizeLatches( Abc_Ntk_t * pNtk )
+{
+ Abc_Obj_t * pLatch;
+ int i;
+ // set the COs of the strashed network
+ Abc_NtkForEachLatch( pNtk, pLatch, i )
+ {
+ Vec_PtrPush( pNtk->vCis, pLatch );
+ Vec_PtrPush( pNtk->vCos, pLatch );
+ Abc_NtkLogicStoreName( pLatch, Abc_ObjNameSuffix(pLatch, "L") );
+ }
+}
+
+/**Function*************************************************************
+
Synopsis [Starts a new network using existing network as a model.]
Description []
@@ -222,15 +211,10 @@ Abc_Ntk_t * Abc_NtkStartRead( char * pName )
{
Abc_Ntk_t * pNtkNew;
// allocate the empty network
- pNtkNew = Abc_NtkAlloc( ABC_NTK_NETLIST, ABC_FUNC_SOP, 1 );
+ pNtkNew = Abc_NtkAlloc( ABC_TYPE_NETLIST, ABC_FUNC_SOP );
// set the specs
- pNtkNew->pName = Extra_FileNameGeneric(pName);
- pNtkNew->pSpec = Extra_UtilStrsav(pName);
- if ( pNtkNew->pName == NULL || strlen(pNtkNew->pName) == 0 )
- {
- FREE( pNtkNew->pName );
- pNtkNew->pName = Extra_UtilStrsav("unknown");
- }
+ pNtkNew->pName = util_strsav( pName );
+ pNtkNew->pSpec = util_strsav( pName );
return pNtkNew;
}
@@ -247,50 +231,19 @@ Abc_Ntk_t * Abc_NtkStartRead( char * pName )
***********************************************************************/
void Abc_NtkFinalizeRead( Abc_Ntk_t * pNtk )
{
- Abc_Obj_t * pBox, * pObj, * pTerm, * pNet;
+ Abc_Obj_t * pLatch;
int i;
- if ( Abc_NtkHasBlackbox(pNtk) && Abc_NtkBoxNum(pNtk) == 0 )
- {
- pBox = Abc_NtkCreateBlackbox(pNtk);
- Abc_NtkForEachPi( pNtk, pObj, i )
- {
- pTerm = Abc_NtkCreateBi(pNtk);
- Abc_ObjAddFanin( pTerm, Abc_ObjFanout0(pObj) );
- Abc_ObjAddFanin( pBox, pTerm );
- }
- Abc_NtkForEachPo( pNtk, pObj, i )
- {
- pTerm = Abc_NtkCreateBo(pNtk);
- Abc_ObjAddFanin( pTerm, pBox );
- Abc_ObjAddFanin( Abc_ObjFanin0(pObj), pTerm );
- }
- return;
- }
assert( Abc_NtkIsNetlist(pNtk) );
-
- // check if constant 0 net is used
- pNet = Abc_NtkFindNet( pNtk, "1\'b0" );
- if ( pNet )
- {
- if ( Abc_ObjFanoutNum(pNet) == 0 )
- Abc_NtkDeleteObj(pNet);
- else if ( Abc_ObjFaninNum(pNet) == 0 )
- Abc_ObjAddFanin( pNet, Abc_NtkCreateNodeConst0(pNtk) );
- }
- // check if constant 1 net is used
- pNet = Abc_NtkFindNet( pNtk, "1\'b1" );
- if ( pNet )
- {
- if ( Abc_ObjFanoutNum(pNet) == 0 )
- Abc_NtkDeleteObj(pNet);
- else if ( Abc_ObjFaninNum(pNet) == 0 )
- Abc_ObjAddFanin( pNet, Abc_NtkCreateNodeConst1(pNtk) );
- }
// fix the net drivers
Abc_NtkFixNonDrivenNets( pNtk );
-
- // reorder the CI/COs to PI/POs first
- Abc_NtkOrderCisCos( pNtk );
+ // create the names table
+ Abc_NtkCreateCioNamesTable( pNtk );
+ // add latches to the CI/CO arrays
+ Abc_NtkForEachLatch( pNtk, pLatch, i )
+ {
+ Vec_PtrPush( pNtk->vCis, pLatch );
+ Vec_PtrPush( pNtk->vCos, pLatch );
+ }
}
/**Function*************************************************************
@@ -314,47 +267,30 @@ Abc_Ntk_t * Abc_NtkDup( Abc_Ntk_t * pNtk )
// start the network
pNtkNew = Abc_NtkStartFrom( pNtk, pNtk->ntkType, pNtk->ntkFunc );
// copy the internal nodes
- if ( Abc_NtkIsStrash(pNtk) )
- {
- // copy the AND gates
- Abc_AigForEachAnd( pNtk, pObj, i )
- pObj->pCopy = Abc_AigAnd( pNtkNew->pManFunc, Abc_ObjChild0Copy(pObj), Abc_ObjChild1Copy(pObj) );
- // relink the choice nodes
- Abc_AigForEachAnd( pNtk, pObj, i )
- if ( pObj->pData )
- pObj->pCopy->pData = ((Abc_Obj_t *)pObj->pData)->pCopy;
- // relink the CO nodes
- Abc_NtkForEachCo( pNtk, pObj, i )
- Abc_ObjAddFanin( pObj->pCopy, Abc_ObjChild0Copy(pObj) );
- // get the number of nodes before and after
- if ( Abc_NtkNodeNum(pNtk) != Abc_NtkNodeNum(pNtkNew) )
- printf( "Warning: Structural hashing during duplication reduced %d nodes (this is a minor bug).\n",
- Abc_NtkNodeNum(pNtk) - Abc_NtkNodeNum(pNtkNew) );
- }
+ if ( Abc_NtkHasAig(pNtk) )
+ Abc_AigDup( pNtk->pManFunc, pNtkNew->pManFunc );
else
{
// duplicate the nets and nodes (CIs/COs/latches already dupped)
Abc_NtkForEachObj( pNtk, pObj, i )
if ( pObj->pCopy == NULL )
- Abc_NtkDupObj(pNtkNew, pObj, 0);
+ Abc_NtkDupObj(pNtkNew, pObj);
// reconnect all objects (no need to transfer attributes on edges)
Abc_NtkForEachObj( pNtk, pObj, i )
- if ( !Abc_ObjIsBox(pObj) && !Abc_ObjIsBo(pObj) )
- Abc_ObjForEachFanin( pObj, pFanin, k )
- Abc_ObjAddFanin( pObj->pCopy, pFanin->pCopy );
+ Abc_ObjForEachFanin( pObj, pFanin, k )
+ Abc_ObjAddFanin( pObj->pCopy, pFanin->pCopy );
}
// duplicate the EXDC Ntk
if ( pNtk->pExdc )
pNtkNew->pExdc = Abc_NtkDup( pNtk->pExdc );
if ( !Abc_NtkCheck( pNtkNew ) )
fprintf( stdout, "Abc_NtkDup(): Network check has failed.\n" );
- pNtk->pCopy = pNtkNew;
return pNtkNew;
}
/**Function*************************************************************
- Synopsis [Duplicate the network.]
+ Synopsis [Creates the network composed of one output.]
Description []
@@ -363,173 +299,24 @@ Abc_Ntk_t * Abc_NtkDup( Abc_Ntk_t * pNtk )
SeeAlso []
***********************************************************************/
-Abc_Ntk_t * Abc_NtkDouble( Abc_Ntk_t * pNtk )
-{
- char Buffer[500];
- Abc_Ntk_t * pNtkNew;
- Abc_Obj_t * pObj, * pFanin;
- int i, k;
- assert( Abc_NtkIsLogic(pNtk) );
-
- // start the network
- pNtkNew = Abc_NtkAlloc( pNtk->ntkType, pNtk->ntkFunc, 1 );
- sprintf( Buffer, "%s%s", pNtk->pName, "_2x" );
- pNtkNew->pName = Extra_UtilStrsav(Buffer);
-
- // clean the node copy fields
- Abc_NtkCleanCopy( pNtk );
- // clone CIs/CIs/boxes
- Abc_NtkForEachPi( pNtk, pObj, i )
- Abc_NtkDupObj( pNtkNew, pObj, 0 );
- Abc_NtkForEachPo( pNtk, pObj, i )
- Abc_NtkDupObj( pNtkNew, pObj, 0 );
- Abc_NtkForEachAssert( pNtk, pObj, i )
- Abc_NtkDupObj( pNtkNew, pObj, 0 );
- Abc_NtkForEachBox( pNtk, pObj, i )
- Abc_NtkDupBox( pNtkNew, pObj, 0 );
- // copy the internal nodes
- // duplicate the nets and nodes (CIs/COs/latches already dupped)
- Abc_NtkForEachObj( pNtk, pObj, i )
- if ( pObj->pCopy == NULL )
- Abc_NtkDupObj(pNtkNew, pObj, 0);
- // reconnect all objects (no need to transfer attributes on edges)
- Abc_NtkForEachObj( pNtk, pObj, i )
- if ( !Abc_ObjIsBox(pObj) && !Abc_ObjIsBo(pObj) )
- Abc_ObjForEachFanin( pObj, pFanin, k )
- Abc_ObjAddFanin( pObj->pCopy, pFanin->pCopy );
-
- // clean the node copy fields
- Abc_NtkCleanCopy( pNtk );
- // clone CIs/CIs/boxes
- Abc_NtkForEachPi( pNtk, pObj, i )
- Abc_NtkDupObj( pNtkNew, pObj, 0 );
- Abc_NtkForEachPo( pNtk, pObj, i )
- Abc_NtkDupObj( pNtkNew, pObj, 0 );
- Abc_NtkForEachAssert( pNtk, pObj, i )
- Abc_NtkDupObj( pNtkNew, pObj, 0 );
- Abc_NtkForEachBox( pNtk, pObj, i )
- Abc_NtkDupBox( pNtkNew, pObj, 0 );
- // copy the internal nodes
- // duplicate the nets and nodes (CIs/COs/latches already dupped)
- Abc_NtkForEachObj( pNtk, pObj, i )
- if ( pObj->pCopy == NULL )
- Abc_NtkDupObj(pNtkNew, pObj, 0);
- // reconnect all objects (no need to transfer attributes on edges)
- Abc_NtkForEachObj( pNtk, pObj, i )
- if ( !Abc_ObjIsBox(pObj) && !Abc_ObjIsBo(pObj) )
- Abc_ObjForEachFanin( pObj, pFanin, k )
- Abc_ObjAddFanin( pObj->pCopy, pFanin->pCopy );
-
- // assign names
- Abc_NtkForEachCi( pNtk, pObj, i )
- {
- Abc_ObjAssignName( Abc_NtkCi(pNtkNew, i), "1_", Abc_ObjName(pObj) );
- Abc_ObjAssignName( Abc_NtkCi(pNtkNew, Abc_NtkCiNum(pNtk) + i), "2_", Abc_ObjName(pObj) );
- }
- Abc_NtkForEachCo( pNtk, pObj, i )
- {
- Abc_ObjAssignName( Abc_NtkCo(pNtkNew, i), "1_", Abc_ObjName(pObj) );
- Abc_ObjAssignName( Abc_NtkCo(pNtkNew, Abc_NtkCoNum(pNtk) + i), "2_", Abc_ObjName(pObj) );
- }
-
- // perform the final check
- if ( !Abc_NtkCheck( pNtkNew ) )
- fprintf( stdout, "Abc_NtkDup(): Network check has failed.\n" );
- return pNtkNew;
-}
-
-/**Function*************************************************************
-
- Synopsis [Attaches the second network at the bottom of the first.]
-
- Description [Returns the first network. Deletes the second network.]
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Abc_Ntk_t * Abc_NtkAttachBottom( Abc_Ntk_t * pNtkTop, Abc_Ntk_t * pNtkBottom )
+Abc_Ntk_t * Abc_NtkSplitOutput( Abc_Ntk_t * pNtk, Abc_Obj_t * pNode, int fUseAllCis )
{
- Abc_Obj_t * pObj, * pFanin, * pBuffer;
Vec_Ptr_t * vNodes;
- int i, k;
- assert( pNtkBottom != NULL );
- if ( pNtkTop == NULL )
- return pNtkBottom;
- // make sure the networks are combinational
- assert( Abc_NtkPiNum(pNtkTop) == Abc_NtkCiNum(pNtkTop) );
- assert( Abc_NtkPiNum(pNtkBottom) == Abc_NtkCiNum(pNtkBottom) );
- // make sure the POs of the bottom correspond to the PIs of the top
- assert( Abc_NtkPoNum(pNtkBottom) == Abc_NtkPiNum(pNtkTop) );
- assert( Abc_NtkPiNum(pNtkBottom) < Abc_NtkPiNum(pNtkTop) );
- // add buffers for the PIs of the top - save results in the POs of the bottom
- Abc_NtkForEachPi( pNtkTop, pObj, i )
- {
- pBuffer = Abc_NtkCreateNodeBuf( pNtkTop, NULL );
- Abc_ObjTransferFanout( pObj, pBuffer );
- Abc_NtkPo(pNtkBottom, i)->pCopy = pBuffer;
- }
- // remove useless PIs of the top
- for ( i = Abc_NtkPiNum(pNtkTop) - 1; i >= Abc_NtkPiNum(pNtkBottom); i-- )
- Abc_NtkDeleteObj( Abc_NtkPi(pNtkTop, i) );
- assert( Abc_NtkPiNum(pNtkBottom) == Abc_NtkPiNum(pNtkTop) );
- // copy the bottom network
- Abc_NtkForEachPi( pNtkBottom, pObj, i )
- Abc_NtkPi(pNtkBottom, i)->pCopy = Abc_NtkPi(pNtkTop, i);
- // construct all nodes
- vNodes = Abc_NtkDfs( pNtkBottom, 0 );
- Vec_PtrForEachEntry( vNodes, pObj, i )
- {
- Abc_NtkDupObj(pNtkTop, pObj, 0);
- Abc_ObjForEachFanin( pObj, pFanin, k )
- Abc_ObjAddFanin( pObj->pCopy, pFanin->pCopy );
- }
- Vec_PtrFree( vNodes );
- // connect the POs
- Abc_NtkForEachPo( pNtkBottom, pObj, i )
- Abc_ObjAddFanin( pObj->pCopy, Abc_ObjFanin0(pObj)->pCopy );
- // delete old network
- Abc_NtkDelete( pNtkBottom );
- // return the network
- if ( !Abc_NtkCheck( pNtkTop ) )
- fprintf( stdout, "Abc_NtkAttachBottom(): Network check has failed.\n" );
- return pNtkTop;
-}
-
-/**Function*************************************************************
-
- Synopsis [Creates the network composed of one logic cone.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Abc_Ntk_t * Abc_NtkCreateCone( Abc_Ntk_t * pNtk, Abc_Obj_t * pNode, char * pNodeName, int fUseAllCis )
-{
Abc_Ntk_t * pNtkNew;
- Vec_Ptr_t * vNodes;
- Abc_Obj_t * pObj, * pFanin, * pNodeCoNew;
+ Abc_Obj_t * pObj, * pFanin;
char Buffer[1000];
int i, k;
assert( Abc_NtkIsLogic(pNtk) || Abc_NtkIsStrash(pNtk) );
- assert( Abc_ObjIsNode(pNode) );
+ assert( Abc_ObjIsCo(pNode) );
// start the network
- pNtkNew = Abc_NtkAlloc( pNtk->ntkType, pNtk->ntkFunc, 1 );
+ pNtkNew = Abc_NtkAlloc( pNtk->ntkType, pNtk->ntkFunc );
// set the name
- sprintf( Buffer, "%s_%s", pNtk->pName, pNodeName );
- pNtkNew->pName = Extra_UtilStrsav(Buffer);
+ sprintf( Buffer, "%s_%s", pNtk->pName, Abc_ObjName(pNode) );
+ pNtkNew->pName = util_strsav(Buffer);
- // establish connection between the constant nodes
- if ( Abc_NtkIsStrash(pNtk) )
- Abc_AigConst1(pNtk)->pCopy = Abc_AigConst1(pNtkNew);
-
- // collect the nodes in the TFI of the output (mark the TFI)
+ // collect the nodes in the TFI of the output
vNodes = Abc_NtkDfsNodes( pNtk, &pNode, 1 );
// create the PIs
Abc_NtkForEachCi( pNtk, pObj, i )
@@ -537,79 +324,12 @@ Abc_Ntk_t * Abc_NtkCreateCone( Abc_Ntk_t * pNtk, Abc_Obj_t * pNode, char * pNode
if ( fUseAllCis || Abc_NodeIsTravIdCurrent(pObj) ) // TravId is set by DFS
{
pObj->pCopy = Abc_NtkCreatePi(pNtkNew);
- Abc_ObjAssignName( pObj->pCopy, Abc_ObjName(pObj), NULL );
- }
- }
- // add the PO corresponding to this output
- pNodeCoNew = Abc_NtkCreatePo( pNtkNew );
- Abc_ObjAssignName( pNodeCoNew, pNodeName, NULL );
- // copy the nodes
- Vec_PtrForEachEntry( vNodes, pObj, i )
- {
- // if it is an AIG, add to the hash table
- if ( Abc_NtkIsStrash(pNtk) )
- {
- pObj->pCopy = Abc_AigAnd( pNtkNew->pManFunc, Abc_ObjChild0Copy(pObj), Abc_ObjChild1Copy(pObj) );
- }
- else
- {
- Abc_NtkDupObj( pNtkNew, pObj, 0 );
- Abc_ObjForEachFanin( pObj, pFanin, k )
- Abc_ObjAddFanin( pObj->pCopy, pFanin->pCopy );
+ Abc_NtkLogicStoreName( pObj->pCopy, Abc_ObjName(pObj) );
}
}
- // connect the internal nodes to the new CO
- Abc_ObjAddFanin( pNodeCoNew, pNode->pCopy );
- Vec_PtrFree( vNodes );
-
- if ( !Abc_NtkCheck( pNtkNew ) )
- fprintf( stdout, "Abc_NtkCreateCone(): Network check has failed.\n" );
- return pNtkNew;
-}
-
-/**Function*************************************************************
-
- Synopsis [Creates the network composed of several logic cones.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Abc_Ntk_t * Abc_NtkCreateConeArray( Abc_Ntk_t * pNtk, Vec_Ptr_t * vRoots, int fUseAllCis )
-{
- Abc_Ntk_t * pNtkNew;
- Vec_Ptr_t * vNodes;
- Abc_Obj_t * pObj, * pFanin, * pNodeCoNew;
- char Buffer[1000];
- int i, k;
-
- assert( Abc_NtkIsLogic(pNtk) || Abc_NtkIsStrash(pNtk) );
-
- // start the network
- pNtkNew = Abc_NtkAlloc( pNtk->ntkType, pNtk->ntkFunc, 1 );
- // set the name
- sprintf( Buffer, "%s_part", pNtk->pName );
- pNtkNew->pName = Extra_UtilStrsav(Buffer);
-
// establish connection between the constant nodes
if ( Abc_NtkIsStrash(pNtk) )
- Abc_AigConst1(pNtk)->pCopy = Abc_AigConst1(pNtkNew);
-
- // collect the nodes in the TFI of the output (mark the TFI)
- vNodes = Abc_NtkDfsNodes( pNtk, (Abc_Obj_t **)Vec_PtrArray(vRoots), Vec_PtrSize(vRoots) );
-
- // create the PIs
- Abc_NtkForEachCi( pNtk, pObj, i )
- {
- if ( fUseAllCis || Abc_NodeIsTravIdCurrent(pObj) ) // TravId is set by DFS
- {
- pObj->pCopy = Abc_NtkCreatePi(pNtkNew);
- Abc_ObjAssignName( pObj->pCopy, Abc_ObjName(pObj), NULL );
- }
- }
+ Abc_AigConst1(pNtk->pManFunc)->pCopy = Abc_AigConst1(pNtkNew->pManFunc);
// copy the nodes
Vec_PtrForEachEntry( vNodes, pObj, i )
@@ -621,160 +341,26 @@ Abc_Ntk_t * Abc_NtkCreateConeArray( Abc_Ntk_t * pNtk, Vec_Ptr_t * vRoots, int fU
}
else
{
- Abc_NtkDupObj( pNtkNew, pObj, 0 );
+ Abc_NtkDupObj( pNtkNew, pObj );
Abc_ObjForEachFanin( pObj, pFanin, k )
Abc_ObjAddFanin( pObj->pCopy, pFanin->pCopy );
}
}
Vec_PtrFree( vNodes );
- // add the POs corresponding to the root nodes
- Vec_PtrForEachEntry( vRoots, pObj, i )
- {
- // create the PO node
- pNodeCoNew = Abc_NtkCreatePo( pNtkNew );
- // connect the internal nodes to the new CO
- if ( Abc_ObjIsCo(pObj) )
- Abc_ObjAddFanin( pNodeCoNew, Abc_ObjChild0Copy(pObj) );
- else
- Abc_ObjAddFanin( pNodeCoNew, pObj->pCopy );
- // assign the name
- Abc_ObjAssignName( pNodeCoNew, Abc_ObjName(pObj), NULL );
- }
-
- if ( !Abc_NtkCheck( pNtkNew ) )
- fprintf( stdout, "Abc_NtkCreateConeArray(): Network check has failed.\n" );
- return pNtkNew;
-}
-
-/**Function*************************************************************
-
- Synopsis [Adds new nodes to the cone.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Abc_NtkAppendToCone( Abc_Ntk_t * pNtkNew, Abc_Ntk_t * pNtk, Vec_Ptr_t * vRoots )
-{
- Vec_Ptr_t * vNodes;
- Abc_Obj_t * pObj;
- int i, iNodeId;
-
- assert( Abc_NtkIsStrash(pNtkNew) );
- assert( Abc_NtkIsStrash(pNtk) );
-
- // collect the nodes in the TFI of the output (mark the TFI)
- vNodes = Abc_NtkDfsNodes( pNtk, (Abc_Obj_t **)Vec_PtrArray(vRoots), Vec_PtrSize(vRoots) );
-
- // establish connection between the constant nodes
- Abc_AigConst1(pNtk)->pCopy = Abc_AigConst1(pNtkNew);
-
- // create the PIs
- Abc_NtkForEachCi( pNtk, pObj, i )
- {
- // skip CIs that are not used
- if ( !Abc_NodeIsTravIdCurrent(pObj) )
- continue;
- // find the corresponding CI in the new network
- iNodeId = Nm_ManFindIdByNameTwoTypes( pNtkNew->pManName, Abc_ObjName(pObj), ABC_OBJ_PI, ABC_OBJ_BO );
- if ( iNodeId == -1 )
- {
- pObj->pCopy = Abc_NtkCreatePi(pNtkNew);
- Abc_ObjAssignName( pObj->pCopy, Abc_ObjName(pObj), NULL );
- }
- else
- pObj->pCopy = Abc_NtkObj( pNtkNew, iNodeId );
- }
-
- // copy the nodes
- Vec_PtrForEachEntry( vNodes, pObj, i )
- pObj->pCopy = Abc_AigAnd( pNtkNew->pManFunc, Abc_ObjChild0Copy(pObj), Abc_ObjChild1Copy(pObj) );
- Vec_PtrFree( vNodes );
-
- // do not add the COs
- if ( !Abc_NtkCheck( pNtkNew ) )
- fprintf( stdout, "Abc_NtkAppendToCone(): Network check has failed.\n" );
-}
-
-/**Function*************************************************************
-
- Synopsis [Creates the network composed of MFFC of one node.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Abc_Ntk_t * Abc_NtkCreateMffc( Abc_Ntk_t * pNtk, Abc_Obj_t * pNode, char * pNodeName )
-{
- Abc_Ntk_t * pNtkNew;
- Abc_Obj_t * pObj, * pFanin, * pNodeCoNew;
- Vec_Ptr_t * vCone, * vSupp;
- char Buffer[1000];
- int i, k;
-
- assert( Abc_NtkIsLogic(pNtk) || Abc_NtkIsStrash(pNtk) );
- assert( Abc_ObjIsNode(pNode) );
-
- // start the network
- pNtkNew = Abc_NtkAlloc( pNtk->ntkType, pNtk->ntkFunc, 1 );
- // set the name
- sprintf( Buffer, "%s_%s", pNtk->pName, pNodeName );
- pNtkNew->pName = Extra_UtilStrsav(Buffer);
-
- // establish connection between the constant nodes
- if ( Abc_NtkIsStrash(pNtk) )
- Abc_AigConst1(pNtk)->pCopy = Abc_AigConst1(pNtkNew);
-
- // collect the nodes in MFFC
- vCone = Vec_PtrAlloc( 100 );
- vSupp = Vec_PtrAlloc( 100 );
- Abc_NodeDeref_rec( pNode );
- Abc_NodeMffsConeSupp( pNode, vCone, vSupp );
- Abc_NodeRef_rec( pNode );
- // create the PIs
- Vec_PtrForEachEntry( vSupp, pObj, i )
- {
- pObj->pCopy = Abc_NtkCreatePi(pNtkNew);
- Abc_ObjAssignName( pObj->pCopy, Abc_ObjName(pObj), NULL );
- }
- // create the PO
- pNodeCoNew = Abc_NtkCreatePo( pNtkNew );
- Abc_ObjAssignName( pNodeCoNew, pNodeName, NULL );
- // copy the nodes
- Vec_PtrForEachEntry( vCone, pObj, i )
- {
- // if it is an AIG, add to the hash table
- if ( Abc_NtkIsStrash(pNtk) )
- {
- pObj->pCopy = Abc_AigAnd( pNtkNew->pManFunc, Abc_ObjChild0Copy(pObj), Abc_ObjChild1Copy(pObj) );
- }
- else
- {
- Abc_NtkDupObj( pNtkNew, pObj, 0 );
- Abc_ObjForEachFanin( pObj, pFanin, k )
- Abc_ObjAddFanin( pObj->pCopy, pFanin->pCopy );
- }
- }
- // connect the topmost node
- Abc_ObjAddFanin( pNodeCoNew, pNode->pCopy );
- Vec_PtrFree( vCone );
- Vec_PtrFree( vSupp );
+ // add the PO corresponding to this output
+ pNode->pCopy = Abc_NtkCreatePo( pNtkNew );
+ Abc_ObjAddFanin( pNode->pCopy, Abc_ObjFanin0(pNode)->pCopy );
+ Abc_NtkLogicStoreName( pNode->pCopy, Abc_ObjName(pNode) );
if ( !Abc_NtkCheck( pNtkNew ) )
- fprintf( stdout, "Abc_NtkCreateMffc(): Network check has failed.\n" );
+ fprintf( stdout, "Abc_NtkSplitOutput(): Network check has failed.\n" );
return pNtkNew;
}
/**Function*************************************************************
- Synopsis [Creates the miter composed of one multi-output cone.]
+ Synopsis [Creates the network composed of one output.]
Description []
@@ -783,7 +369,7 @@ Abc_Ntk_t * Abc_NtkCreateMffc( Abc_Ntk_t * pNtk, Abc_Obj_t * pNode, char * pNode
SeeAlso []
***********************************************************************/
-Abc_Ntk_t * Abc_NtkCreateTarget( Abc_Ntk_t * pNtk, Vec_Ptr_t * vRoots, Vec_Int_t * vValues )
+Abc_Ntk_t * Abc_NtkCreateCone( Abc_Ntk_t * pNtk, Vec_Ptr_t * vRoots, Vec_Int_t * vValues )
{
Vec_Ptr_t * vNodes;
Abc_Ntk_t * pNtkNew;
@@ -794,8 +380,8 @@ Abc_Ntk_t * Abc_NtkCreateTarget( Abc_Ntk_t * pNtk, Vec_Ptr_t * vRoots, Vec_Int_t
// start the network
Abc_NtkCleanCopy( pNtk );
- pNtkNew = Abc_NtkAlloc( ABC_NTK_STRASH, ABC_FUNC_AIG, 1 );
- pNtkNew->pName = Extra_UtilStrsav(pNtk->pName);
+ pNtkNew = Abc_NtkAlloc( ABC_TYPE_STRASH, ABC_FUNC_AIG );
+ pNtkNew->pName = util_strsav(pNtk->pName);
// collect the nodes in the TFI of the output
vNodes = Abc_NtkDfsNodes( pNtk, (Abc_Obj_t **)vRoots->pArray, vRoots->nSize );
@@ -803,21 +389,18 @@ Abc_Ntk_t * Abc_NtkCreateTarget( Abc_Ntk_t * pNtk, Vec_Ptr_t * vRoots, Vec_Int_t
Abc_NtkForEachCi( pNtk, pObj, i )
{
pObj->pCopy = Abc_NtkCreatePi(pNtkNew);
- Abc_ObjAssignName( pObj->pCopy, Abc_ObjName(pObj), NULL );
+ Abc_NtkLogicStoreName( pObj->pCopy, Abc_ObjName(pObj) );
}
// copy the nodes
Vec_PtrForEachEntry( vNodes, pObj, i )
- pObj->pCopy = Abc_NodeStrash( pNtkNew, pObj, 0 );
+ pObj->pCopy = Abc_NodeStrash( pNtkNew->pManFunc, pObj );
Vec_PtrFree( vNodes );
// add the PO
- pFinal = Abc_AigConst1( pNtkNew );
+ pFinal = Abc_AigConst1( pNtkNew->pManFunc );
Vec_PtrForEachEntry( vRoots, pObj, i )
{
- if ( Abc_ObjIsCo(pObj) )
- pOther = Abc_ObjFanin0(pObj)->pCopy;
- else
- pOther = pObj->pCopy;
+ pOther = pObj->pCopy;
if ( Vec_IntEntry(vValues, i) == 0 )
pOther = Abc_ObjNot(pOther);
pFinal = Abc_AigAnd( pNtkNew->pManFunc, pFinal, pOther );
@@ -826,15 +409,15 @@ Abc_Ntk_t * Abc_NtkCreateTarget( Abc_Ntk_t * pNtk, Vec_Ptr_t * vRoots, Vec_Int_t
// add the PO corresponding to this output
pNodePo = Abc_NtkCreatePo( pNtkNew );
Abc_ObjAddFanin( pNodePo, pFinal );
- Abc_ObjAssignName( pNodePo, "miter", NULL );
+ Abc_NtkLogicStoreName( pNodePo, "miter" );
if ( !Abc_NtkCheck( pNtkNew ) )
- fprintf( stdout, "Abc_NtkCreateTarget(): Network check has failed.\n" );
+ fprintf( stdout, "Abc_NtkCreateCone(): Network check has failed.\n" );
return pNtkNew;
}
/**Function*************************************************************
- Synopsis [Creates the network composed of one node.]
+ Synopsis [Deletes the Ntk.]
Description []
@@ -843,71 +426,30 @@ Abc_Ntk_t * Abc_NtkCreateTarget( Abc_Ntk_t * pNtk, Vec_Ptr_t * vRoots, Vec_Int_t
SeeAlso []
***********************************************************************/
-Abc_Ntk_t * Abc_NtkCreateFromNode( Abc_Ntk_t * pNtk, Abc_Obj_t * pNode )
+Abc_Ntk_t * Abc_NtkSplitNode( Abc_Ntk_t * pNtk, Abc_Obj_t * pNode )
{
Abc_Ntk_t * pNtkNew;
Abc_Obj_t * pFanin, * pNodePo;
int i;
// start the network
- pNtkNew = Abc_NtkAlloc( pNtk->ntkType, pNtk->ntkFunc, 1 );
- pNtkNew->pName = Extra_UtilStrsav(Abc_ObjName(pNode));
+ pNtkNew = Abc_NtkAlloc( pNtk->ntkType, pNtk->ntkFunc );
+ pNtkNew->pName = util_strsav(Abc_ObjName(pNode));
// add the PIs corresponding to the fanins of the node
Abc_ObjForEachFanin( pNode, pFanin, i )
{
pFanin->pCopy = Abc_NtkCreatePi( pNtkNew );
- Abc_ObjAssignName( pFanin->pCopy, Abc_ObjName(pFanin), NULL );
+ Abc_NtkLogicStoreName( pFanin->pCopy, Abc_ObjName(pFanin) );
}
// duplicate and connect the node
- pNode->pCopy = Abc_NtkDupObj( pNtkNew, pNode, 0 );
+ pNode->pCopy = Abc_NtkDupObj( pNtkNew, pNode );
Abc_ObjForEachFanin( pNode, pFanin, i )
Abc_ObjAddFanin( pNode->pCopy, pFanin->pCopy );
// create the only PO
pNodePo = Abc_NtkCreatePo( pNtkNew );
Abc_ObjAddFanin( pNodePo, pNode->pCopy );
- Abc_ObjAssignName( pNodePo, Abc_ObjName(pNode), NULL );
- if ( !Abc_NtkCheck( pNtkNew ) )
- fprintf( stdout, "Abc_NtkCreateFromNode(): Network check has failed.\n" );
- return pNtkNew;
-}
-
-/**Function*************************************************************
-
- Synopsis [Creates the network composed of one node with the given SOP.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Abc_Ntk_t * Abc_NtkCreateWithNode( char * pSop )
-{
- Abc_Ntk_t * pNtkNew;
- Abc_Obj_t * pFanin, * pNode, * pNodePo;
- Vec_Ptr_t * vNames;
- int i, nVars;
- // start the network
- pNtkNew = Abc_NtkAlloc( ABC_NTK_LOGIC, ABC_FUNC_SOP, 1 );
- pNtkNew->pName = Extra_UtilStrsav("ex");
- // create PIs
- Vec_PtrPush( pNtkNew->vObjs, NULL );
- nVars = Abc_SopGetVarNum( pSop );
- vNames = Abc_NodeGetFakeNames( nVars );
- for ( i = 0; i < nVars; i++ )
- Abc_ObjAssignName( Abc_NtkCreatePi(pNtkNew), Vec_PtrEntry(vNames, i), NULL );
- Abc_NodeFreeNames( vNames );
- // create the node, add PIs as fanins, set the function
- pNode = Abc_NtkCreateNode( pNtkNew );
- Abc_NtkForEachPi( pNtkNew, pFanin, i )
- Abc_ObjAddFanin( pNode, pFanin );
- pNode->pData = Abc_SopRegister( pNtkNew->pManFunc, pSop );
- // create the only PO
- pNodePo = Abc_NtkCreatePo(pNtkNew);
- Abc_ObjAddFanin( pNodePo, pNode );
- Abc_ObjAssignName( pNodePo, "F", NULL );
+ Abc_NtkLogicStoreName( pNodePo, Abc_ObjName(pNode) );
if ( !Abc_NtkCheck( pNtkNew ) )
- fprintf( stdout, "Abc_NtkCreateWithNode(): Network check has failed.\n" );
+ fprintf( stdout, "Abc_NtkSplitNode(): Network check has failed.\n" );
return pNtkNew;
}
@@ -925,107 +467,64 @@ Abc_Ntk_t * Abc_NtkCreateWithNode( char * pSop )
void Abc_NtkDelete( Abc_Ntk_t * pNtk )
{
Abc_Obj_t * pObj;
- void * pAttrMan;
int TotalMemory, i;
int LargePiece = (4 << ABC_NUM_STEPS);
if ( pNtk == NULL )
return;
- // free the HAIG
- if ( pNtk->pHaig )
- Abc_NtkHaigStop( pNtk );
- // free EXDC Ntk
- if ( pNtk->pExdc )
- Abc_NtkDelete( pNtk->pExdc );
- // dereference the BDDs
- if ( Abc_NtkHasBdd(pNtk) )
- {
- Abc_NtkForEachNode( pNtk, pObj, i )
- Cudd_RecursiveDeref( pNtk->pManFunc, pObj->pData );
- }
// make sure all the marks are clean
Abc_NtkForEachObj( pNtk, pObj, i )
{
// free large fanout arrays
- if ( pNtk->pMmObj && pObj->vFanouts.nCap * 4 > LargePiece )
+ if ( pObj->vFanouts.nCap * 4 > LargePiece )
FREE( pObj->vFanouts.pArray );
- // these flags should be always zero
- // if this is not true, something is wrong somewhere
+ // check that the other things are okay
assert( pObj->fMarkA == 0 );
assert( pObj->fMarkB == 0 );
assert( pObj->fMarkC == 0 );
}
- // free the nodes
- if ( pNtk->pMmStep == NULL )
- {
- Abc_NtkForEachObj( pNtk, pObj, i )
- {
- FREE( pObj->vFanouts.pArray );
- FREE( pObj->vFanins.pArray );
- }
- }
- if ( pNtk->pMmObj == NULL )
- {
- Abc_NtkForEachObj( pNtk, pObj, i )
- free( pObj );
- }
+
+ // dereference the BDDs
+ if ( Abc_NtkHasBdd(pNtk) )
+ Abc_NtkForEachNode( pNtk, pObj, i )
+ Cudd_RecursiveDeref( pNtk->pManFunc, pObj->pData );
+ FREE( pNtk->pName );
+ FREE( pNtk->pSpec );
+ // copy the EXDC Ntk
+ if ( pNtk->pExdc )
+ Abc_NtkDelete( pNtk->pExdc );
// free the arrays
- Vec_PtrFree( pNtk->vPios );
- Vec_PtrFree( pNtk->vPis );
- Vec_PtrFree( pNtk->vPos );
+ Vec_PtrFree( pNtk->vObjs );
+ Vec_PtrFree( pNtk->vLats );
Vec_PtrFree( pNtk->vCis );
Vec_PtrFree( pNtk->vCos );
- Vec_PtrFree( pNtk->vAsserts );
- Vec_PtrFree( pNtk->vObjs );
- Vec_PtrFree( pNtk->vBoxes );
- if ( pNtk->vLevelsR ) Vec_IntFree( pNtk->vLevelsR );
- FREE( pNtk->pModel );
- FREE( pNtk->pSeqModel );
+ Vec_PtrFree( pNtk->vPtrTemp );
+ Vec_IntFree( pNtk->vIntTemp );
+ Vec_StrFree( pNtk->vStrTemp );
+ // free the hash table of Obj name into Obj ID
+ stmm_free_table( pNtk->tName2Net );
+ stmm_free_table( pNtk->tObj2Name );
TotalMemory = 0;
- TotalMemory += pNtk->pMmObj? Extra_MmFixedReadMemUsage(pNtk->pMmObj) : 0;
- TotalMemory += pNtk->pMmStep? Extra_MmStepReadMemUsage(pNtk->pMmStep) : 0;
+ TotalMemory += Extra_MmFlexReadMemUsage(pNtk->pMmNames);
+ TotalMemory += Extra_MmFixedReadMemUsage(pNtk->pMmObj);
+ TotalMemory += Extra_MmStepReadMemUsage(pNtk->pMmStep);
// fprintf( stdout, "The total memory allocated internally by the network = %0.2f Mb.\n", ((double)TotalMemory)/(1<<20) );
// free the storage
- if ( pNtk->pMmObj )
- Extra_MmFixedStop( pNtk->pMmObj );
- if ( pNtk->pMmStep )
- Extra_MmStepStop ( pNtk->pMmStep );
- // name manager
- Nm_ManFree( pNtk->pManName );
+ Extra_MmFlexStop ( pNtk->pMmNames, 0 );
+ Extra_MmFixedStop( pNtk->pMmObj, 0 );
+ Extra_MmStepStop ( pNtk->pMmStep, 0 );
// free the timing manager
if ( pNtk->pManTime )
Abc_ManTimeStop( pNtk->pManTime );
// start the functionality manager
- if ( Abc_NtkIsStrash(pNtk) )
- Abc_AigFree( pNtk->pManFunc );
- else if ( Abc_NtkHasSop(pNtk) || Abc_NtkHasBlifMv(pNtk) )
- Extra_MmFlexStop( pNtk->pManFunc );
+ if ( Abc_NtkHasSop(pNtk) )
+ Extra_MmFlexStop( pNtk->pManFunc, 0 );
else if ( Abc_NtkHasBdd(pNtk) )
Extra_StopManager( pNtk->pManFunc );
else if ( Abc_NtkHasAig(pNtk) )
- { if ( pNtk->pManFunc ) Hop_ManStop( pNtk->pManFunc ); }
- else if ( Abc_NtkHasMapping(pNtk) )
- pNtk->pManFunc = NULL;
- else if ( !Abc_NtkHasBlackbox(pNtk) )
+ Abc_AigFree( pNtk->pManFunc );
+ else if ( !Abc_NtkHasMapping(pNtk) )
assert( 0 );
- // free the hierarchy
- if ( pNtk->pDesign )
- {
- Abc_LibFree( pNtk->pDesign, pNtk );
- pNtk->pDesign = NULL;
- }
-// if ( pNtk->pBlackBoxes )
-// Vec_IntFree( pNtk->pBlackBoxes );
- // free node attributes
- Vec_PtrForEachEntry( pNtk->vAttrs, pAttrMan, i )
- if ( pAttrMan )
- {
-//printf( "deleting attr\n" );
- Vec_AttFree( pAttrMan, 1 );
- }
- Vec_PtrFree( pNtk->vAttrs );
- FREE( pNtk->pName );
- FREE( pNtk->pSpec );
free( pNtk );
}
@@ -1046,9 +545,6 @@ void Abc_NtkFixNonDrivenNets( Abc_Ntk_t * pNtk )
Abc_Obj_t * pNet, * pNode;
int i;
- if ( Abc_NtkNodeNum(pNtk) == 0 && Abc_NtkBoxNum(pNtk) == 0 )
- return;
-
// check for non-driven nets
vNets = Vec_PtrAlloc( 100 );
Abc_NtkForEachNet( pNtk, pNet, i )
@@ -1056,24 +552,28 @@ void Abc_NtkFixNonDrivenNets( Abc_Ntk_t * pNtk )
if ( Abc_ObjFaninNum(pNet) > 0 )
continue;
// add the constant 0 driver
- pNode = Abc_NtkCreateNodeConst0( pNtk );
+ pNode = Abc_NtkCreateNode( pNtk );
+ // set the constant function
+ Abc_ObjSetData( pNode, Abc_SopRegister(pNtk->pManFunc, " 0\n") );
// add the fanout net
Abc_ObjAddFanin( pNet, pNode );
// add the net to those for which the warning will be printed
- Vec_PtrPush( vNets, pNet );
+ Vec_PtrPush( vNets, pNet->pData );
}
// print the warning
if ( vNets->nSize > 0 )
{
- printf( "Warning: Constant-0 drivers added to %d non-driven nets in network \"%s\":\n", Vec_PtrSize(vNets), pNtk->pName );
- Vec_PtrForEachEntry( vNets, pNet, i )
+ printf( "Constant-zero drivers were added to %d non-driven nets:\n", vNets->nSize );
+ for ( i = 0; i < vNets->nSize; i++ )
{
- printf( "%s%s", (i? ", ": ""), Abc_ObjName(pNet) );
- if ( i == 3 )
+ if ( i == 0 )
+ printf( "%s", vNets->pArray[i] );
+ else if ( i == 1 )
+ printf( ", %s", vNets->pArray[i] );
+ else if ( i == 2 )
{
- if ( Vec_PtrSize(vNets) > 3 )
- printf( " ..." );
+ printf( ", %s, etc.", vNets->pArray[i] );
break;
}
}
@@ -1083,150 +583,6 @@ void Abc_NtkFixNonDrivenNets( Abc_Ntk_t * pNtk )
}
-/**Function*************************************************************
-
- Synopsis [Converts the network to combinational.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Abc_NtkMakeComb( Abc_Ntk_t * pNtk )
-{
- Abc_Obj_t * pObj;
- int i;
-
- if ( Abc_NtkIsComb(pNtk) )
- return;
-
- assert( !Abc_NtkIsNetlist(pNtk) );
- assert( Abc_NtkHasOnlyLatchBoxes(pNtk) );
-
- // detach the latches
-// Abc_NtkForEachLatch( pNtk, pObj, i )
- Vec_PtrForEachEntryReverse( pNtk->vBoxes, pObj, i )
- Abc_NtkDeleteObj( pObj );
- assert( Abc_NtkLatchNum(pNtk) == 0 );
- assert( Abc_NtkBoxNum(pNtk) == 0 );
-
- // move CIs to become PIs
- Vec_PtrClear( pNtk->vPis );
- Abc_NtkForEachCi( pNtk, pObj, i )
- {
- if ( Abc_ObjIsBo(pObj) )
- {
- pObj->Type = ABC_OBJ_PI;
- pNtk->nObjCounts[ABC_OBJ_PI]++;
- pNtk->nObjCounts[ABC_OBJ_BO]--;
- }
- Vec_PtrPush( pNtk->vPis, pObj );
- }
- assert( Abc_NtkBoNum(pNtk) == 0 );
-
- // move COs to become POs
- Vec_PtrClear( pNtk->vPos );
- Abc_NtkForEachCo( pNtk, pObj, i )
- {
- if ( Abc_ObjIsBi(pObj) )
- {
- pObj->Type = ABC_OBJ_PO;
- pNtk->nObjCounts[ABC_OBJ_PO]++;
- pNtk->nObjCounts[ABC_OBJ_BI]--;
- }
- Vec_PtrPush( pNtk->vPos, pObj );
- }
- assert( Abc_NtkBiNum(pNtk) == 0 );
-
- if ( !Abc_NtkCheck( pNtk ) )
- fprintf( stdout, "Abc_NtkMakeComb(): Network check has failed.\n" );
-}
-
-
-/**Function*************************************************************
-
- Synopsis [Removes POs with suppsize less than 2 and PIs without fanout.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Abc_Ntk_t * Abc_NtkTrim( Abc_Ntk_t * pNtk )
-{
- Abc_Obj_t * pObj;
- int i, k, m;
-
- // filter POs
- k = m = 0;
- Abc_NtkForEachCo( pNtk, pObj, i )
- {
- if ( Abc_ObjIsPo(pObj) )
- {
- // remove constant nodes and PI pointers
- if ( Abc_ObjFaninNum(Abc_ObjFanin0(pObj)) == 0 )
- {
- Abc_ObjDeleteFanin( pObj, Abc_ObjFanin0(pObj) );
- if ( Abc_ObjFanoutNum(Abc_ObjFanin0(pObj)) == 0 && !Abc_ObjIsPi(Abc_ObjFanin0(pObj)) )
- Abc_NtkDeleteObj_rec( Abc_ObjFanin0(pObj), 1 );
- pNtk->vObjs->pArray[pObj->Id] = NULL;
- pObj->Id = (1<<26)-1;
- pNtk->nObjCounts[pObj->Type]--;
- pNtk->nObjs--;
- Abc_ObjRecycle( pObj );
- continue;
- }
- // remove buffers/inverters of PIs
- if ( Abc_ObjFaninNum(Abc_ObjFanin0(pObj)) == 1 )
- {
- if ( Abc_ObjIsPi(Abc_ObjFanin0(Abc_ObjFanin0(pObj))) )
- {
- Abc_ObjDeleteFanin( pObj, Abc_ObjFanin0(pObj) );
- if ( Abc_ObjFanoutNum(Abc_ObjFanin0(pObj)) == 0 )
- Abc_NtkDeleteObj_rec( Abc_ObjFanin0(pObj), 1 );
- pNtk->vObjs->pArray[pObj->Id] = NULL;
- pObj->Id = (1<<26)-1;
- pNtk->nObjCounts[pObj->Type]--;
- pNtk->nObjs--;
- Abc_ObjRecycle( pObj );
- continue;
- }
- }
- Vec_PtrWriteEntry( pNtk->vPos, m++, pObj );
- }
- Vec_PtrWriteEntry( pNtk->vCos, k++, pObj );
- }
- Vec_PtrShrink( pNtk->vPos, m );
- Vec_PtrShrink( pNtk->vCos, k );
-
- // filter PIs
- k = m = 0;
- Abc_NtkForEachCi( pNtk, pObj, i )
- {
- if ( Abc_ObjIsPi(pObj) )
- {
- if ( Abc_ObjFanoutNum(pObj) == 0 )
- {
- pNtk->vObjs->pArray[pObj->Id] = NULL;
- pObj->Id = (1<<26)-1;
- pNtk->nObjCounts[pObj->Type]--;
- pNtk->nObjs--;
- Abc_ObjRecycle( pObj );
- continue;
- }
- Vec_PtrWriteEntry( pNtk->vPis, m++, pObj );
- }
- Vec_PtrWriteEntry( pNtk->vCis, k++, pObj );
- }
- Vec_PtrShrink( pNtk->vPis, m );
- Vec_PtrShrink( pNtk->vCis, k );
-
- return Abc_NtkDup( pNtk );
-}
////////////////////////////////////////////////////////////////////////