summaryrefslogtreecommitdiffstats
path: root/src/aig/hop/hopObj.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2007-10-01 08:01:00 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2007-10-01 08:01:00 -0700
commit4812c90424dfc40d26725244723887a2d16ddfd9 (patch)
treeb32ace96e7e2d84d586e09ba605463b6f49c3271 /src/aig/hop/hopObj.c
parente54d9691616b9a0326e2fdb3156bb4eeb8abfcd7 (diff)
downloadabc-4812c90424dfc40d26725244723887a2d16ddfd9.tar.gz
abc-4812c90424dfc40d26725244723887a2d16ddfd9.tar.bz2
abc-4812c90424dfc40d26725244723887a2d16ddfd9.zip
Version abc71001
Diffstat (limited to 'src/aig/hop/hopObj.c')
-rw-r--r--src/aig/hop/hopObj.c271
1 files changed, 271 insertions, 0 deletions
diff --git a/src/aig/hop/hopObj.c b/src/aig/hop/hopObj.c
new file mode 100644
index 00000000..c8e70dd3
--- /dev/null
+++ b/src/aig/hop/hopObj.c
@@ -0,0 +1,271 @@
+/**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"
+
+////////////////////////////////////////////////////////////////////////
+/// 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;
+ 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_ObjFaninPhase(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_ObjFaninPhase(pFan0) & Hop_ObjFaninPhase(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( 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 ///
+////////////////////////////////////////////////////////////////////////
+
+