/**Function************************************************************* Synopsis [Create mapping for the first nFrames timeframes of pAig.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Saig_ManCreateMapping( Aig_Man_t * pAig, Aig_Man_t * pFrames, int nFrames ) { Aig_Obj_t * pObj, * pObjFrame, * pObjRepr; int i, f, iNum, iFrame; assert( pFrames->pReprs != NULL ); // mapping from nodes into their representatives // start step mapping for both orignal manager and fraig Saig_ManStartMap2( pAig, nFrames ); Saig_ManStartMap2( pFrames, 1 ); // for each object in each frame for ( f = 0; f < nFrames; f++ ) Aig_ManForEachObj( pAig, pObj, i ) { // get the frame object iNum = Saig_ManGetMap1( pAig, pObj, f ); pObjFrame = Aig_ManObj( pFrames, iNum ); // if the node has no prototype, map it into itself if ( pObjFrame == NULL ) { Saig_ManSetMap2( pAig, pObj, f, pObj, f ); continue; } // get the representative object pObjRepr = Aig_ObjRepr( pFrames, pObjFrame ); if ( pObjRepr == NULL ) pObjRepr = pObjFrame; // check if this is the first time this object is reached if ( Saig_ManGetMap2( pFrames, pObjRepr, 0, &iFrame ) == -1 ) Saig_ManSetMap2( pFrames, pObjRepr, 0, pObj, f ); // set the map for the main object iNum = Saig_ManGetMap2( pFrames, pObjRepr, 0, &iFrame ); Saig_ManSetMap2( pAig, pObj, f, Aig_ManObj(pAig, iNum), iFrame ); }
/**Function************************************************************* Synopsis [Checks candidate equivalence classes.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Dch_ClassesCheck( Dch_Cla_t * p ) { Aig_Obj_t * pObj, * pPrev, ** ppClass; int i, k, nLits, nClasses, nCands1; nClasses = nLits = 0; Dch_ManForEachClass( p, ppClass, k ) { pPrev = NULL; Dch_ClassForEachNode( p, ppClass[0], pObj, i ) { if ( i == 0 ) assert( Aig_ObjRepr(p->pAig, pObj) == NULL ); else { assert( Aig_ObjRepr(p->pAig, pObj) == ppClass[0] ); assert( pPrev->Id < pObj->Id ); nLits++; } pPrev = pObj; } nClasses++; }
/**Function************************************************************* Synopsis [Create mapping of node IDs of pNtk into equiv classes of pMiter.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Vec_Int_t * Abc_NtkDressMapClasses( Aig_Man_t * pMiter, Abc_Ntk_t * pNtk ) { Vec_Int_t * vId2Lit; Abc_Obj_t * pObj, * pAnd; Aig_Obj_t * pObjMan, * pObjMiter, * pObjRepr; int i; vId2Lit = Vec_IntAlloc( 0 ); Vec_IntFill( vId2Lit, Abc_NtkObjNumMax(pNtk), -1 ); Abc_NtkForEachNode( pNtk, pObj, i ) { // get the pointer to the miter node corresponding to pObj if ( (pAnd = Abc_ObjRegular(pObj->pCopy)) && Abc_ObjType(pAnd) != ABC_OBJ_NONE && // strashed node is present and legal (pObjMan = Aig_Regular((Aig_Obj_t *)pAnd->pCopy)) && Aig_ObjType(pObjMan) != AIG_OBJ_NONE && // AIG node is present and legal (pObjMiter = Aig_Regular((Aig_Obj_t *)pObjMan->pData)) && Aig_ObjType(pObjMiter) != AIG_OBJ_NONE ) // miter node is present and legal { // get the representative of the miter node pObjRepr = Aig_ObjRepr( pMiter, pObjMiter ); pObjRepr = pObjRepr? pObjRepr : pObjMiter; // map pObj (whose ID is i) into the repr node ID (i.e. equiv class) Vec_IntWriteEntry( vId2Lit, i, Aig_ObjId(pObjRepr) ); } } return vId2Lit; }