| /**CFile**************************************************************** |
| |
| FileName [hopObj.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [Minimalistic And-Inverter Graph package.] |
| |
| Synopsis [Adding/removing objects.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - May 11, 2006.] |
| |
| Revision [$Id: hopObj.c,v 1.00 2006/05/11 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "hop.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [Creates primary input.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Hop_Obj_t * Hop_ObjCreatePi( Hop_Man_t * p ) |
| { |
| Hop_Obj_t * pObj; |
| pObj = Hop_ManFetchMemory( p ); |
| pObj->Type = AIG_PI; |
| pObj->PioNum = Vec_PtrSize( p->vPis ); |
| Vec_PtrPush( p->vPis, pObj ); |
| p->nObjs[AIG_PI]++; |
| return pObj; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Creates primary output with the given driver.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Hop_Obj_t * Hop_ObjCreatePo( Hop_Man_t * p, Hop_Obj_t * pDriver ) |
| { |
| Hop_Obj_t * pObj; |
| pObj = Hop_ManFetchMemory( p ); |
| pObj->Type = AIG_PO; |
| Vec_PtrPush( p->vPos, pObj ); |
| // add connections |
| pObj->pFanin0 = pDriver; |
| if ( p->fRefCount ) |
| Hop_ObjRef( Hop_Regular(pDriver) ); |
| else |
| pObj->nRefs = Hop_ObjLevel( Hop_Regular(pDriver) ); |
| // set the phase |
| pObj->fPhase = Hop_ObjPhaseCompl(pDriver); |
| // update node counters of the manager |
| p->nObjs[AIG_PO]++; |
| return pObj; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Create the new node assuming it does not exist.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Hop_Obj_t * Hop_ObjCreate( Hop_Man_t * p, Hop_Obj_t * pGhost ) |
| { |
| Hop_Obj_t * pObj; |
| assert( !Hop_IsComplement(pGhost) ); |
| assert( Hop_ObjIsNode(pGhost) ); |
| assert( pGhost == &p->Ghost ); |
| // get memory for the new object |
| pObj = Hop_ManFetchMemory( p ); |
| pObj->Type = pGhost->Type; |
| // add connections |
| Hop_ObjConnect( p, pObj, pGhost->pFanin0, pGhost->pFanin1 ); |
| // update node counters of the manager |
| p->nObjs[Hop_ObjType(pObj)]++; |
| assert( pObj->pData == NULL ); |
| return pObj; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Connect the object to the fanin.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Hop_ObjConnect( Hop_Man_t * p, Hop_Obj_t * pObj, Hop_Obj_t * pFan0, Hop_Obj_t * pFan1 ) |
| { |
| assert( !Hop_IsComplement(pObj) ); |
| assert( Hop_ObjIsNode(pObj) ); |
| // add the first fanin |
| pObj->pFanin0 = pFan0; |
| pObj->pFanin1 = pFan1; |
| // increment references of the fanins and add their fanouts |
| if ( p->fRefCount ) |
| { |
| if ( pFan0 != NULL ) |
| Hop_ObjRef( Hop_ObjFanin0(pObj) ); |
| if ( pFan1 != NULL ) |
| Hop_ObjRef( Hop_ObjFanin1(pObj) ); |
| } |
| else |
| pObj->nRefs = Hop_ObjLevelNew( pObj ); |
| // set the phase |
| pObj->fPhase = Hop_ObjPhaseCompl(pFan0) & Hop_ObjPhaseCompl(pFan1); |
| // add the node to the structural hash table |
| Hop_TableInsert( p, pObj ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Connect the object to the fanin.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Hop_ObjDisconnect( Hop_Man_t * p, Hop_Obj_t * pObj ) |
| { |
| assert( !Hop_IsComplement(pObj) ); |
| assert( Hop_ObjIsNode(pObj) ); |
| // remove connections |
| if ( pObj->pFanin0 != NULL ) |
| Hop_ObjDeref(Hop_ObjFanin0(pObj)); |
| if ( pObj->pFanin1 != NULL ) |
| Hop_ObjDeref(Hop_ObjFanin1(pObj)); |
| // remove the node from the structural hash table |
| Hop_TableDelete( p, pObj ); |
| // add the first fanin |
| pObj->pFanin0 = NULL; |
| pObj->pFanin1 = NULL; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Deletes the node.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Hop_ObjDelete( Hop_Man_t * p, Hop_Obj_t * pObj ) |
| { |
| assert( !Hop_IsComplement(pObj) ); |
| assert( !Hop_ObjIsTerm(pObj) ); |
| assert( Hop_ObjRefs(pObj) == 0 ); |
| // update node counters of the manager |
| p->nObjs[pObj->Type]--; |
| p->nDeleted++; |
| // remove connections |
| Hop_ObjDisconnect( p, pObj ); |
| // remove PIs/POs from the arrays |
| if ( Hop_ObjIsPi(pObj) ) |
| Vec_PtrRemove( p->vPis, pObj ); |
| // free the node |
| Hop_ManRecycleMemory( p, pObj ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Deletes the MFFC of the node.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Hop_ObjDelete_rec( Hop_Man_t * p, Hop_Obj_t * pObj ) |
| { |
| Hop_Obj_t * pFanin0, * pFanin1; |
| assert( !Hop_IsComplement(pObj) ); |
| if ( Hop_ObjIsConst1(pObj) || Hop_ObjIsPi(pObj) ) |
| return; |
| assert( Hop_ObjIsNode(pObj) ); |
| pFanin0 = Hop_ObjFanin0(pObj); |
| pFanin1 = Hop_ObjFanin1(pObj); |
| Hop_ObjDelete( p, pObj ); |
| if ( pFanin0 && !Hop_ObjIsNone(pFanin0) && Hop_ObjRefs(pFanin0) == 0 ) |
| Hop_ObjDelete_rec( p, pFanin0 ); |
| if ( pFanin1 && !Hop_ObjIsNone(pFanin1) && Hop_ObjRefs(pFanin1) == 0 ) |
| Hop_ObjDelete_rec( p, pFanin1 ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Returns the representative of the node.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Hop_Obj_t * Hop_ObjRepr( Hop_Obj_t * pObj ) |
| { |
| assert( !Hop_IsComplement(pObj) ); |
| if ( pObj->pData == NULL || pObj->pData == pObj ) |
| return pObj; |
| return Hop_ObjRepr( (Hop_Obj_t *)pObj->pData ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Sets an equivalence relation between the nodes.] |
| |
| Description [Makes the representative of pNew point to the representaive of pOld.] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Hop_ObjCreateChoice( Hop_Obj_t * pOld, Hop_Obj_t * pNew ) |
| { |
| Hop_Obj_t * pOldRepr; |
| Hop_Obj_t * pNewRepr; |
| assert( pOld != NULL && pNew != NULL ); |
| pOldRepr = Hop_ObjRepr(pOld); |
| pNewRepr = Hop_ObjRepr(pNew); |
| if ( pNewRepr != pOldRepr ) |
| pNewRepr->pData = pOldRepr; |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |