diff options
Diffstat (limited to 'src/aig/ntl/ntlInsert.c')
-rw-r--r-- | src/aig/ntl/ntlInsert.c | 614 |
1 files changed, 0 insertions, 614 deletions
diff --git a/src/aig/ntl/ntlInsert.c b/src/aig/ntl/ntlInsert.c deleted file mode 100644 index 8b0e3493..00000000 --- a/src/aig/ntl/ntlInsert.c +++ /dev/null @@ -1,614 +0,0 @@ -/**CFile**************************************************************** - - FileName [ntlInsert.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Netlist representation.] - - Synopsis [Procedures to insert mapping into a design.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: ntlInsert.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "ntl.h" -#include "kit.h" - -ABC_NAMESPACE_IMPL_START - - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Inserts the given mapping into the netlist.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Ntl_Man_t * Ntl_ManInsertMapping( Ntl_Man_t * p, Vec_Ptr_t * vMapping, Aig_Man_t * pAig ) -{ - char Buffer[1000]; - Vec_Ptr_t * vCopies; - Vec_Int_t * vCover; - Ntl_Mod_t * pRoot; - Ntl_Obj_t * pNode; - Ntl_Net_t * pNet, * pNetCo; - Ntl_Lut_t * pLut; - int i, k, nDigits; - assert( Vec_PtrSize(p->vCis) == Aig_ManPiNum(pAig) ); - assert( Vec_PtrSize(p->vCos) == Aig_ManPoNum(pAig) ); - p = Ntl_ManStartFrom( p ); - pRoot = Ntl_ManRootModel( p ); - assert( Ntl_ModelNodeNum(pRoot) == 0 ); - // map the AIG back onto the design - Ntl_ManForEachCiNet( p, pNet, i ) - pNet->pCopy = Aig_ManPi( pAig, i ); - // start mapping of AIG nodes into their copies - vCopies = Vec_PtrStart( Aig_ManObjNumMax(pAig) ); - Ntl_ManForEachCiNet( p, pNet, i ) - Vec_PtrWriteEntry( vCopies, ((Aig_Obj_t *)pNet->pCopy)->Id, pNet ); - // create a new node for each LUT - vCover = Vec_IntAlloc( 1 << 16 ); - nDigits = Aig_Base10Log( Vec_PtrSize(vMapping) ); - Vec_PtrForEachEntry( Ntl_Lut_t *, vMapping, pLut, i ) - { - pNode = Ntl_ModelCreateNode( pRoot, pLut->nFanins ); - pNode->pSop = Kit_PlaFromTruth( p->pMemSops, pLut->pTruth, pLut->nFanins, vCover ); - if ( !Kit_TruthIsConst0(pLut->pTruth, pLut->nFanins) && !Kit_TruthIsConst1(pLut->pTruth, pLut->nFanins) ) - { - for ( k = 0; k < pLut->nFanins; k++ ) - { - pNet = (Ntl_Net_t *)Vec_PtrEntry( vCopies, pLut->pFanins[k] ); - if ( pNet == NULL ) - { - printf( "Ntl_ManInsert(): Internal error: Net not found.\n" ); - return 0; - } - Ntl_ObjSetFanin( pNode, pNet, k ); - } - } - else - pNode->nFanins = 0; - sprintf( Buffer, "lut%0*d", nDigits, i ); - if ( (pNet = Ntl_ModelFindNet( pRoot, Buffer )) ) - { - printf( "Ntl_ManInsert(): Internal error: Intermediate net name is not unique.\n" ); - return 0; - } - pNet = Ntl_ModelFindOrCreateNet( pRoot, Buffer ); - if ( !Ntl_ModelSetNetDriver( pNode, pNet ) ) - { - printf( "Ntl_ManInsert(): Internal error: Net has more than one fanin.\n" ); - return 0; - } - Vec_PtrWriteEntry( vCopies, pLut->Id, pNet ); - } - Vec_IntFree( vCover ); - // mark CIs and outputs of the registers - Ntl_ManForEachCiNet( p, pNetCo, i ) - pNetCo->fMark = 1; - // update the CO pointers - Ntl_ManForEachCoNet( p, pNetCo, i ) - { - if ( pNetCo->fMark ) - continue; - pNetCo->fMark = 1; - pNet = (Ntl_Net_t *)Vec_PtrEntry( vCopies, Aig_Regular((Aig_Obj_t *)pNetCo->pCopy)->Id ); - pNode = Ntl_ModelCreateNode( pRoot, 1 ); - pNode->pSop = Aig_IsComplement((Aig_Obj_t *)pNetCo->pCopy)? Ntl_ManStoreSop( p->pMemSops, "0 1\n" ) : Ntl_ManStoreSop( p->pMemSops, "1 1\n" ); - Ntl_ObjSetFanin( pNode, pNet, 0 ); - // update the CO driver net - assert( pNetCo->pDriver == NULL ); - if ( !Ntl_ModelSetNetDriver( pNode, pNetCo ) ) - { - printf( "Ntl_ManInsert(): Internal error: PO net has more than one fanin.\n" ); - return 0; - } - } - Vec_PtrFree( vCopies ); - // clean CI/CO marks - Ntl_ManUnmarkCiCoNets( p ); - if ( !Ntl_ManCheck( p ) ) - printf( "Ntl_ManInsertNtk: The check has failed for design %s.\n", p->pName ); - return p; -} - -/**Function************************************************************* - - Synopsis [Inserts the given mapping into the netlist.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Ntl_Man_t * Ntl_ManInsertAig( Ntl_Man_t * p, Aig_Man_t * pAig ) -{ - char Buffer[1000]; - Ntl_Mod_t * pRoot; - Ntl_Obj_t * pNode; - Ntl_Net_t * pNet, * pNetCo; - Aig_Obj_t * pObj, * pFanin; - int i, nDigits, Counter; - assert( Vec_PtrSize(p->vCis) == Aig_ManPiNum(pAig) ); - assert( Vec_PtrSize(p->vCos) == Aig_ManPoNum(pAig) ); - p = Ntl_ManStartFrom( p ); - pRoot = Ntl_ManRootModel( p ); - assert( Ntl_ModelNodeNum(pRoot) == 0 ); - // set the correspondence between the PI/PO nodes - Aig_ManCleanData( pAig ); - Ntl_ManForEachCiNet( p, pNet, i ) - Aig_ManPi( pAig, i )->pData = pNet; - // create constant node if needed - if ( Aig_ManConst1(pAig)->nRefs > 0 ) - { - pNode = Ntl_ModelCreateNode( pRoot, 0 ); - pNode->pSop = Ntl_ManStoreSop( p->pMemSops, " 1\n" ); - if ( (pNet = Ntl_ModelFindNet( pRoot, "Const1" )) ) - { - printf( "Ntl_ManInsertAig(): Internal error: Intermediate net name is not unique.\n" ); - return 0; - } - pNet = Ntl_ModelFindOrCreateNet( pRoot, "Const1" ); - if ( !Ntl_ModelSetNetDriver( pNode, pNet ) ) - { - printf( "Ntl_ManInsertAig(): Internal error: Net has more than one fanin.\n" ); - return 0; - } - Aig_ManConst1(pAig)->pData = pNet; - } - // create a new node for each LUT - Counter = 0; - nDigits = Aig_Base10Log( Aig_ManNodeNum(pAig) ); - Aig_ManForEachObj( pAig, pObj, i ) - { - if ( !Aig_ObjIsNode(pObj) ) - continue; - if ( Aig_ObjFanin0(pObj)->pData == NULL || Aig_ObjFanin1(pObj)->pData == NULL ) - { - printf( "Ntl_ManInsertAig(): Internal error: Net not found.\n" ); - return 0; - } - pNode = Ntl_ModelCreateNode( pRoot, 2 ); - Ntl_ObjSetFanin( pNode, (Ntl_Net_t *)Aig_ObjFanin0(pObj)->pData, 0 ); - Ntl_ObjSetFanin( pNode, (Ntl_Net_t *)Aig_ObjFanin1(pObj)->pData, 1 ); - if ( Aig_ObjFaninC0(pObj) && Aig_ObjFaninC1(pObj) ) - pNode->pSop = Ntl_ManStoreSop( p->pMemSops, "00 1\n" ); - else if ( Aig_ObjFaninC0(pObj) && !Aig_ObjFaninC1(pObj) ) - pNode->pSop = Ntl_ManStoreSop( p->pMemSops, "01 1\n" ); - else if ( !Aig_ObjFaninC0(pObj) && Aig_ObjFaninC1(pObj) ) - pNode->pSop = Ntl_ManStoreSop( p->pMemSops, "10 1\n" ); - else // if ( Aig_ObjFaninC0(pObj) && Aig_ObjFaninC1(pObj) ) - pNode->pSop = Ntl_ManStoreSop( p->pMemSops, "11 1\n" ); - sprintf( Buffer, "and%0*d", nDigits, Counter++ ); - if ( (pNet = Ntl_ModelFindNet( pRoot, Buffer )) ) - { - printf( "Ntl_ManInsertAig(): Internal error: Intermediate net name is not unique.\n" ); - return 0; - } - pNet = Ntl_ModelFindOrCreateNet( pRoot, Buffer ); - if ( !Ntl_ModelSetNetDriver( pNode, pNet ) ) - { - printf( "Ntl_ManInsertAig(): Internal error: Net has more than one fanin.\n" ); - return 0; - } - pObj->pData = pNet; - } - // mark CIs and outputs of the registers - Ntl_ManForEachCiNet( p, pNetCo, i ) - pNetCo->fMark = 1; - // update the CO pointers - Ntl_ManForEachCoNet( p, pNetCo, i ) - { - if ( pNetCo->fMark ) - continue; - pNetCo->fMark = 1; - // get the corresponding PO and its driver - pObj = Aig_ManPo( pAig, i ); - pFanin = Aig_ObjFanin0( pObj ); - // get the net driving the driver - pNet = (Ntl_Net_t *)pFanin->pData; - pNode = Ntl_ModelCreateNode( pRoot, 1 ); - pNode->pSop = Aig_ObjFaninC0(pObj)? Ntl_ManStoreSop( p->pMemSops, "0 1\n" ) : Ntl_ManStoreSop( p->pMemSops, "1 1\n" ); - Ntl_ObjSetFanin( pNode, pNet, 0 ); - // update the CO driver net - assert( pNetCo->pDriver == NULL ); - if ( !Ntl_ModelSetNetDriver( pNode, pNetCo ) ) - { - printf( "Ntl_ManInsertAig(): Internal error: PO net has more than one fanin.\n" ); - return 0; - } - } - // clean CI/CO marks - Ntl_ManUnmarkCiCoNets( p ); - if ( !Ntl_ManCheck( p ) ) - printf( "Ntl_ManInsertAig: The check has failed for design %s.\n", p->pName ); - return p; -} - -/**Function************************************************************* - - Synopsis [Find drivers of the given net.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Ntl_ManFindDriver( Ntl_Man_t * p, char * pName ) -{ - Ntl_Mod_t * pRoot; - Ntl_Obj_t * pNode; - Ntl_Net_t * pNet, * pNetThis; - int i, k; - pRoot = Ntl_ManRootModel( p ); - pNetThis = Ntl_ModelFindNet( pRoot, pName ); - printf( "\n*** Net %d \"%s\":\n", pNetThis->NetId, pName ); - // mark from the nodes - Ntl_ModelForEachPo( pRoot, pNode, i ) - if ( pNetThis == Ntl_ObjFanin0(pNode) ) - printf( "driven by PO %d\n", i ); - Ntl_ModelForEachNode( pRoot, pNode, i ) - Ntl_ObjForEachFanin( pNode, pNet, k ) - if ( pNetThis == pNet ) - printf( "driven by node %d with %d fanins and %d fanouts\n (%s)\n", - pNode->Id, Ntl_ObjFaninNum(pNode), Ntl_ObjFanoutNum(pNode), Ntl_ObjFanout(pNode,0)->pName ); - Ntl_ModelForEachBox( pRoot, pNode, i ) - Ntl_ObjForEachFanin( pNode, pNet, k ) - if ( pNetThis == pNet ) - printf( "driven by box %d with %d fanins and %d fanouts\n (%s)\n", - pNode->Id, Ntl_ObjFaninNum(pNode), Ntl_ObjFanoutNum(pNode), Ntl_ObjFanout(pNode,0)->pName ); -} - -/**Function************************************************************* - - Synopsis [Inserts the given mapping into the netlist.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Ntl_Man_t * Ntl_ManInsertNtk2( Ntl_Man_t * p, Nwk_Man_t * pNtk ) -{ - int fWriteConstants = 1; - char Buffer[1000]; - Vec_Ptr_t * vObjs; - Vec_Int_t * vTruth; - Vec_Int_t * vCover; - Ntl_Mod_t * pRoot; - Ntl_Obj_t * pNode; - Ntl_Net_t * pNet, * pNetCo; - Nwk_Obj_t * pObj, * pFanin; - int i, k, nDigits; - unsigned * pTruth; - assert( Vec_PtrSize(p->vCis) == Nwk_ManCiNum(pNtk) ); - assert( Vec_PtrSize(p->vCos) == Nwk_ManCoNum(pNtk) ); - p = Ntl_ManStartFrom( p ); - pRoot = Ntl_ManRootModel( p ); - assert( Ntl_ModelNodeNum(pRoot) == 0 ); - // set the correspondence between the PI/PO nodes - Ntl_ManForEachCiNet( p, pNet, i ) - Nwk_ManCi( pNtk, i )->pCopy = pNet; - // create a new node for each LUT - vTruth = Vec_IntAlloc( 1 << 16 ); - vCover = Vec_IntAlloc( 1 << 16 ); - nDigits = Aig_Base10Log( Nwk_ManNodeNum(pNtk) ); - // go through the nodes in the topological order - vObjs = Nwk_ManDfs( pNtk ); - Vec_PtrForEachEntry( Nwk_Obj_t *, vObjs, pObj, i ) - { - if ( !Nwk_ObjIsNode(pObj) ) - continue; -/* - if ( fWriteConstants && Nwk_ObjFaninNum(pObj) == 0 ) - { - pObj->pCopy = NULL; - continue; - } -*/ - // skip constant drivers if they only drive COs - if ( fWriteConstants && Nwk_ObjFaninNum(pObj) == 0 ) - { - Nwk_Obj_t * pFanout; - int i; - Nwk_ObjForEachFanout( pObj, pFanout, i ) - if ( Nwk_ObjIsNode(pFanout) ) - break; - if ( i == Nwk_ObjFanoutNum(pObj) ) - { - pObj->pCopy = NULL; - continue; - } - } - - pNode = Ntl_ModelCreateNode( pRoot, Nwk_ObjFaninNum(pObj) ); - pTruth = Hop_ManConvertAigToTruth( pNtk->pManHop, Hop_Regular(pObj->pFunc), Nwk_ObjFaninNum(pObj), vTruth, 0 ); - if ( Hop_IsComplement(pObj->pFunc) ) - Kit_TruthNot( pTruth, pTruth, Nwk_ObjFaninNum(pObj) ); - if ( !Kit_TruthIsConst0(pTruth, Nwk_ObjFaninNum(pObj)) && !Kit_TruthIsConst1(pTruth, Nwk_ObjFaninNum(pObj)) ) - { - Nwk_ObjForEachFanin( pObj, pFanin, k ) - { - pNet = (Ntl_Net_t *)pFanin->pCopy; - if ( pNet == NULL ) - { - printf( "Ntl_ManInsertNtk(): Internal error: Net not found.\n" ); - return 0; - } - Ntl_ObjSetFanin( pNode, pNet, k ); - } - } - else if ( Kit_TruthIsConst0(pTruth, Nwk_ObjFaninNum(pObj)) ) - { - pObj->pFunc = Hop_ManConst0(pNtk->pManHop); - pNode->nFanins = 0; - } - else if ( Kit_TruthIsConst1(pTruth, Nwk_ObjFaninNum(pObj)) ) - { - pObj->pFunc = Hop_ManConst1(pNtk->pManHop); - pNode->nFanins = 0; - } - pNode->pSop = Kit_PlaFromTruth( p->pMemSops, pTruth, Nwk_ObjFaninNum(pObj), vCover ); - sprintf( Buffer, "lut%0*d", nDigits, i ); - if ( (pNet = Ntl_ModelFindNet( pRoot, Buffer )) ) - { - printf( "Ntl_ManInsertNtk(): Internal error: Intermediate net name is not unique.\n" ); - return 0; - } - pNet = Ntl_ModelFindOrCreateNet( pRoot, Buffer ); - if ( !Ntl_ModelSetNetDriver( pNode, pNet ) ) - { - printf( "Ntl_ManInsertNtk(): Internal error: Net has more than one fanin.\n" ); - return 0; - } - pObj->pCopy = pNet; - } - Vec_PtrFree( vObjs ); - Vec_IntFree( vCover ); - Vec_IntFree( vTruth ); - // mark the nets driving special boxes - if ( p->pNalR ) - p->pNalR( p ); - // mark CIs and outputs of the registers - Ntl_ManForEachCiNet( p, pNetCo, i ) - pNetCo->fMark = 1; - // update the CO pointers - Ntl_ManForEachCoNet( p, pNetCo, i ) - { - if ( pNetCo->fMark ) - continue; - pNetCo->fMark = 1; - // get the corresponding PO and its driver - pObj = Nwk_ManCo( pNtk, i ); - pFanin = Nwk_ObjFanin0( pObj ); - // get the net driving this PO - pNet = (Ntl_Net_t *)pFanin->pCopy; - if ( pNet == NULL ) // constant net - { - assert( fWriteConstants ); - pNode = Ntl_ModelCreateNode( pRoot, 0 ); - pNode->pSop = pObj->fInvert? Ntl_ManStoreSop( p->pMemSops, " 0\n" ) : Ntl_ManStoreSop( p->pMemSops, " 1\n" ); - } - else - if ( Nwk_ObjFanoutNum(pFanin) == 1 && Ntl_ObjIsNode(pNet->pDriver) && !pNet->fMark2 ) - { - pNode = pNet->pDriver; - if ( !Ntl_ModelClearNetDriver( pNode, pNet ) ) - { - printf( "Ntl_ManInsertNtk(): Internal error! Net already has no driver.\n" ); - return NULL; - } - // remove this net - Ntl_ModelDeleteNet( pRoot, pNet ); - Vec_PtrWriteEntry( pRoot->vNets, pNet->NetId, NULL ); - // update node's function - if ( pObj->fInvert ) - Kit_PlaComplement( pNode->pSop ); - } - else - { -/* - if ( fWriteConstants && Ntl_ObjFaninNum(pNet->pDriver) == 0 ) - { - pNode = Ntl_ModelCreateNode( pRoot, 0 ); - pNode->pSop = pObj->fInvert? Ntl_ManStoreSop( p->pMemSops, " 0\n" ) : Ntl_ManStoreSop( p->pMemSops, " 1\n" ); - } - else -*/ - { -// assert( Ntl_ObjFaninNum(pNet->pDriver) != 0 ); - pNode = Ntl_ModelCreateNode( pRoot, 1 ); - pNode->pSop = pObj->fInvert? Ntl_ManStoreSop( p->pMemSops, "0 1\n" ) : Ntl_ManStoreSop( p->pMemSops, "1 1\n" ); - Ntl_ObjSetFanin( pNode, pNet, 0 ); - } - } - // update the CO driver net - assert( pNetCo->pDriver == NULL ); - if ( !Ntl_ModelSetNetDriver( pNode, pNetCo ) ) - { - printf( "Ntl_ManInsertNtk(): Internal error: PO net has more than one fanin.\n" ); - return NULL; - } - } - // clean CI/CO marks - Ntl_ManUnmarkCiCoNets( p ); - if ( !Ntl_ManCheck( p ) ) - { - printf( "Ntl_ManInsertNtk: The check has failed for design %s.\n", p->pName ); - return NULL; - } - return p; -} - - -/**Function************************************************************* - - Synopsis [Inserts the given mapping into the netlist.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Ntl_Man_t * Ntl_ManInsertNtk( Ntl_Man_t * p, Nwk_Man_t * pNtk ) -{ - char Buffer[1000]; - Vec_Ptr_t * vObjs; - Vec_Int_t * vTruth; - Vec_Int_t * vCover; - Ntl_Mod_t * pRoot; - Ntl_Obj_t * pNode; - Ntl_Net_t * pNet, * pNetCo; - Nwk_Obj_t * pObj, * pFanin; - int i, k, nDigits; - unsigned * pTruth; - assert( Vec_PtrSize(p->vCis) == Nwk_ManCiNum(pNtk) ); - assert( Vec_PtrSize(p->vCos) == Nwk_ManCoNum(pNtk) ); - p = Ntl_ManStartFrom( p ); - pRoot = Ntl_ManRootModel( p ); - assert( Ntl_ModelNodeNum(pRoot) == 0 ); - // set the correspondence between the PI/PO nodes - Ntl_ManForEachCiNet( p, pNet, i ) - Nwk_ManCi( pNtk, i )->pCopy = pNet; - // create a new node for each LUT - vTruth = Vec_IntAlloc( 1 << 16 ); - vCover = Vec_IntAlloc( 1 << 16 ); - nDigits = Aig_Base10Log( Nwk_ManNodeNum(pNtk) ); - // go through the nodes in the topological order - vObjs = Nwk_ManDfs( pNtk ); - Vec_PtrForEachEntry( Nwk_Obj_t *, vObjs, pObj, i ) - { - if ( !Nwk_ObjIsNode(pObj) ) - continue; - pNode = Ntl_ModelCreateNode( pRoot, Nwk_ObjFaninNum(pObj) ); - pTruth = Hop_ManConvertAigToTruth( pNtk->pManHop, Hop_Regular(pObj->pFunc), Nwk_ObjFaninNum(pObj), vTruth, 0 ); - if ( Hop_IsComplement(pObj->pFunc) ) - Kit_TruthNot( pTruth, pTruth, Nwk_ObjFaninNum(pObj) ); - if ( !Kit_TruthIsConst0(pTruth, Nwk_ObjFaninNum(pObj)) && !Kit_TruthIsConst1(pTruth, Nwk_ObjFaninNum(pObj)) ) - { - Nwk_ObjForEachFanin( pObj, pFanin, k ) - { - pNet = (Ntl_Net_t *)pFanin->pCopy; - if ( pNet == NULL ) - { - printf( "Ntl_ManInsertNtk(): Internal error: Net not found.\n" ); - return 0; - } - Ntl_ObjSetFanin( pNode, pNet, k ); - } - } - else if ( Kit_TruthIsConst0(pTruth, Nwk_ObjFaninNum(pObj)) ) - { - pObj->pFunc = Hop_ManConst0(pNtk->pManHop); - pNode->nFanins = 0; - } - else if ( Kit_TruthIsConst1(pTruth, Nwk_ObjFaninNum(pObj)) ) - { - pObj->pFunc = Hop_ManConst1(pNtk->pManHop); - pNode->nFanins = 0; - } - pNode->pSop = Kit_PlaFromTruth( p->pMemSops, pTruth, Nwk_ObjFaninNum(pObj), vCover ); - sprintf( Buffer, "lut%0*d", nDigits, i ); - if ( (pNet = Ntl_ModelFindNet( pRoot, Buffer )) ) - { - printf( "Ntl_ManInsertNtk(): Internal error: Intermediate net name is not unique.\n" ); - return 0; - } - pNet = Ntl_ModelFindOrCreateNet( pRoot, Buffer ); - if ( !Ntl_ModelSetNetDriver( pNode, pNet ) ) - { - printf( "Ntl_ManInsertNtk(): Internal error: Net has more than one fanin.\n" ); - return 0; - } - pObj->pCopy = pNet; - } - Vec_PtrFree( vObjs ); - Vec_IntFree( vCover ); - Vec_IntFree( vTruth ); - // mark CIs and outputs of the registers - Ntl_ManForEachCiNet( p, pNetCo, i ) - pNetCo->fMark = 1; - // update the CO pointers - Ntl_ManForEachCoNet( p, pNetCo, i ) - { - if ( pNetCo->fMark ) - continue; - pNetCo->fMark = 1; - // get the corresponding PO and its driver - pObj = Nwk_ManCo( pNtk, i ); - pFanin = Nwk_ObjFanin0( pObj ); - // get the net driving this PO - pNet = (Ntl_Net_t *)pFanin->pCopy; - if ( Nwk_ObjFanoutNum(pFanin) == 1 && Ntl_ObjIsNode(pNet->pDriver) ) - { - pNode = pNet->pDriver; - if ( !Ntl_ModelClearNetDriver( pNode, pNet ) ) - { - printf( "Ntl_ManInsertNtk(): Internal error! Net already has no driver.\n" ); - return NULL; - } - // remove this net - Ntl_ModelDeleteNet( pRoot, pNet ); - Vec_PtrWriteEntry( pRoot->vNets, pNet->NetId, NULL ); - // update node's function - if ( pObj->fInvert ) - Kit_PlaComplement( pNode->pSop ); - } - else - { - pNode = Ntl_ModelCreateNode( pRoot, 1 ); - pNode->pSop = pObj->fInvert? Ntl_ManStoreSop( p->pMemSops, "0 1\n" ) : Ntl_ManStoreSop( p->pMemSops, "1 1\n" ); - Ntl_ObjSetFanin( pNode, pNet, 0 ); - } - // update the CO driver net - assert( pNetCo->pDriver == NULL ); - if ( !Ntl_ModelSetNetDriver( pNode, pNetCo ) ) - { - printf( "Ntl_ManInsertNtk(): Internal error: PO net has more than one fanin.\n" ); - return NULL; - } - } - // clean CI/CO marks - Ntl_ManUnmarkCiCoNets( p ); - if ( !Ntl_ManCheck( p ) ) - { - printf( "Ntl_ManInsertNtk: The check has failed for design %s.\n", p->pName ); - return NULL; - } - return p; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - -ABC_NAMESPACE_IMPL_END - |