| /**CFile**************************************************************** |
| |
| FileName [resStrash.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [Resynthesis package.] |
| |
| Synopsis [Structural hashing of the nodes in the window.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - January 15, 2007.] |
| |
| Revision [$Id: resStrash.c,v 1.00 2007/01/15 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "base/abc/abc.h" |
| #include "resInt.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| extern Abc_Obj_t * Abc_ConvertAigToAig( Abc_Ntk_t * pAig, Abc_Obj_t * pObjOld ); |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [Structurally hashes the given window.] |
| |
| Description [The first PO is the observability condition. The second |
| is the node's function. The remaining POs are the candidate divisors.] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Abc_Ntk_t * Res_WndStrash( Res_Win_t * p ) |
| { |
| Vec_Ptr_t * vPairs; |
| Abc_Ntk_t * pAig; |
| Abc_Obj_t * pObj, * pMiter; |
| int i; |
| assert( Abc_NtkHasAig(p->pNode->pNtk) ); |
| // Abc_NtkCleanCopy( p->pNode->pNtk ); |
| // create the network |
| pAig = Abc_NtkAlloc( ABC_NTK_STRASH, ABC_FUNC_AIG, 1 ); |
| pAig->pName = Extra_UtilStrsav( "window" ); |
| // create the inputs |
| Vec_PtrForEachEntry( Abc_Obj_t *, p->vLeaves, pObj, i ) |
| pObj->pCopy = Abc_NtkCreatePi( pAig ); |
| Vec_PtrForEachEntry( Abc_Obj_t *, p->vBranches, pObj, i ) |
| pObj->pCopy = Abc_NtkCreatePi( pAig ); |
| // go through the nodes in the topological order |
| Vec_PtrForEachEntry( Abc_Obj_t *, p->vNodes, pObj, i ) |
| { |
| pObj->pCopy = Abc_ConvertAigToAig( pAig, pObj ); |
| if ( pObj == p->pNode ) |
| pObj->pCopy = Abc_ObjNot( pObj->pCopy ); |
| } |
| // collect the POs |
| vPairs = Vec_PtrAlloc( 2 * Vec_PtrSize(p->vRoots) ); |
| Vec_PtrForEachEntry( Abc_Obj_t *, p->vRoots, pObj, i ) |
| { |
| Vec_PtrPush( vPairs, pObj->pCopy ); |
| Vec_PtrPush( vPairs, NULL ); |
| } |
| // mark the TFO of the node |
| Abc_NtkIncrementTravId( p->pNode->pNtk ); |
| Res_WinSweepLeafTfo_rec( p->pNode, (int)p->pNode->Level + p->nWinTfoMax ); |
| // update strashing of the node |
| p->pNode->pCopy = Abc_ObjNot( p->pNode->pCopy ); |
| Abc_NodeSetTravIdPrevious( p->pNode ); |
| // redo strashing in the TFO |
| Vec_PtrForEachEntry( Abc_Obj_t *, p->vNodes, pObj, i ) |
| { |
| if ( Abc_NodeIsTravIdCurrent(pObj) ) |
| pObj->pCopy = Abc_ConvertAigToAig( pAig, pObj ); |
| } |
| // collect the POs |
| Vec_PtrForEachEntry( Abc_Obj_t *, p->vRoots, pObj, i ) |
| Vec_PtrWriteEntry( vPairs, 2 * i + 1, pObj->pCopy ); |
| // add the miter |
| pMiter = Abc_AigMiter( (Abc_Aig_t *)pAig->pManFunc, vPairs, 0 ); |
| Abc_ObjAddFanin( Abc_NtkCreatePo(pAig), pMiter ); |
| Vec_PtrFree( vPairs ); |
| // add the node |
| Abc_ObjAddFanin( Abc_NtkCreatePo(pAig), p->pNode->pCopy ); |
| // add the fanins |
| Abc_ObjForEachFanin( p->pNode, pObj, i ) |
| Abc_ObjAddFanin( Abc_NtkCreatePo(pAig), pObj->pCopy ); |
| // add the divisors |
| Vec_PtrForEachEntry( Abc_Obj_t *, p->vDivs, pObj, i ) |
| Abc_ObjAddFanin( Abc_NtkCreatePo(pAig), pObj->pCopy ); |
| // add the names |
| Abc_NtkAddDummyPiNames( pAig ); |
| Abc_NtkAddDummyPoNames( pAig ); |
| // check the resulting network |
| if ( !Abc_NtkCheck( pAig ) ) |
| fprintf( stdout, "Res_WndStrash(): Network check has failed.\n" ); |
| return pAig; |
| } |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |