/**Function************************************************************* Synopsis [Performs algebraic balancing of the AIG.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Ivy_Man_t * Ivy_ManBalance( Ivy_Man_t * p, int fUpdateLevel ) { Ivy_Man_t * pNew; Ivy_Obj_t * pObj, * pDriver; Vec_Vec_t * vStore; int i, NewNodeId; // clean the old manager Ivy_ManCleanTravId( p ); // create the new manager pNew = Ivy_ManStart(); // map the nodes Ivy_ManConst1(p)->TravId = Ivy_EdgeFromNode( Ivy_ManConst1(pNew) ); Ivy_ManForEachPi( p, pObj, i ) pObj->TravId = Ivy_EdgeFromNode( Ivy_ObjCreatePi(pNew) ); // if HAIG is defined, trasfer the pointers to the PIs/latches // if ( p->pHaig ) // Ivy_ManHaigTrasfer( p, pNew ); // balance the AIG vStore = Vec_VecAlloc( 50 ); Ivy_ManForEachPo( p, pObj, i ) { pDriver = Ivy_ObjReal( Ivy_ObjChild0(pObj) ); NewNodeId = Ivy_NodeBalance_rec( pNew, Ivy_Regular(pDriver), vStore, 0, fUpdateLevel ); NewNodeId = Ivy_EdgeNotCond( NewNodeId, Ivy_IsComplement(pDriver) ); Ivy_ObjCreatePo( pNew, Ivy_EdgeToNode(pNew, NewNodeId) ); }
/**Function************************************************************* Synopsis [Duplicates the AIG manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Ivy_Man_t * Ivy_ManDup( Ivy_Man_t * p ) { Vec_Int_t * vNodes, * vLatches; Ivy_Man_t * pNew; Ivy_Obj_t * pObj; int i; // collect latches and nodes in the DFS order vNodes = Ivy_ManDfsSeq( p, &vLatches ); // create the new manager pNew = Ivy_ManStart(); // create the PIs Ivy_ManConst1(p)->pEquiv = Ivy_ManConst1(pNew); Ivy_ManForEachPi( p, pObj, i ) pObj->pEquiv = Ivy_ObjCreatePi(pNew); // create the fake PIs for latches Ivy_ManForEachNodeVec( p, vLatches, pObj, i ) pObj->pEquiv = Ivy_ObjCreatePi(pNew); // duplicate internal nodes Ivy_ManForEachNodeVec( p, vNodes, pObj, i ) if ( Ivy_ObjIsBuf(pObj) ) pObj->pEquiv = Ivy_ObjChild0Equiv(pObj); else pObj->pEquiv = Ivy_And( pNew, Ivy_ObjChild0Equiv(pObj), Ivy_ObjChild1Equiv(pObj) ); // add the POs Ivy_ManForEachPo( p, pObj, i ) Ivy_ObjCreatePo( pNew, Ivy_ObjChild0Equiv(pObj) ); // transform additional PI nodes into latches and connect them Ivy_ManForEachNodeVec( p, vLatches, pObj, i ) { assert( !Ivy_ObjFaninC0(pObj) ); pObj->pEquiv->Type = IVY_LATCH; pObj->pEquiv->Init = pObj->Init; Ivy_ObjConnect( pNew, pObj->pEquiv, Ivy_ObjChild0Equiv(pObj), NULL ); }
/**Function************************************************************* Synopsis [Duplicates the AIG manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Ivy_Man_t * Ivy_ManStartFrom( Ivy_Man_t * p ) { Ivy_Man_t * pNew; Ivy_Obj_t * pObj; int i; // create the new manager pNew = Ivy_ManStart(); // create the PIs Ivy_ManConst1(p)->pEquiv = Ivy_ManConst1(pNew); Ivy_ManForEachPi( p, pObj, i ) pObj->pEquiv = Ivy_ObjCreatePi(pNew); return pNew; }