/**CFile**************************************************************** FileName [fsimMan.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Fast sequential AIG simulator.] Synopsis [Simulation manager.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: fsimMan.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "fsimInt.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Creates fast simulation manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Fsim_ManCreate_rec( Fsim_Man_t * p, Aig_Obj_t * pObj ) { int iFan0, iFan1, iTemp; assert( !Aig_IsComplement(pObj) ); if ( pObj->iData ) return pObj->iData; assert( !Aig_ObjIsConst1(pObj) ); if ( Aig_ObjIsNode(pObj) ) { iFan0 = Fsim_ManCreate_rec( p, Aig_ObjFanin0(pObj) ); iFan1 = Fsim_ManCreate_rec( p, Aig_ObjFanin1(pObj) ); assert( iFan0 != iFan1 ); if ( --p->pRefs[iFan0] == 0 ) p->nCrossCut--; iFan0 = Fsim_Var2Lit( iFan0, Aig_ObjFaninC0(pObj) ); if ( --p->pRefs[iFan1] == 0 ) p->nCrossCut--; iFan1 = Fsim_Var2Lit( iFan1, Aig_ObjFaninC1(pObj) ); if ( p->pAig->pEquivs ) Fsim_ManCreate_rec( p, Aig_ObjEquiv(p->pAig, pObj) ); } else if ( Aig_ObjIsPo(pObj) ) { assert( Aig_ObjRefs(pObj) == 0 ); iFan0 = Fsim_ManCreate_rec( p, Aig_ObjFanin0(pObj) ); if ( --p->pRefs[iFan0] == 0 ) p->nCrossCut--; iFan0 = Fsim_Var2Lit( iFan0, Aig_ObjFaninC0(pObj) ); iFan1 = 0; } else { iFan0 = iFan1 = 0; Vec_IntPush( p->vCis2Ids, Aig_ObjPioNum(pObj) ); } if ( iFan0 < iFan1 ) iTemp = iFan0, iFan0 = iFan1, iFan1 = iTemp; p->pFans0[p->nObjs] = iFan0; p->pFans1[p->nObjs] = iFan1; p->pRefs[p->nObjs] = Aig_ObjRefs(pObj); if ( p->pRefs[p->nObjs] ) if ( p->nCrossCutMax < ++p->nCrossCut ) p->nCrossCutMax = p->nCrossCut; return pObj->iData = p->nObjs++; } /**Function************************************************************* Synopsis [Creates fast simulation manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Fsim_Man_t * Fsim_ManCreate( Aig_Man_t * pAig ) { Fsim_Man_t * p; Aig_Obj_t * pObj; int i, nObjs; Aig_ManCleanData( pAig ); p = (Fsim_Man_t *)ABC_ALLOC( Fsim_Man_t, 1 ); memset( p, 0, sizeof(Fsim_Man_t) ); p->pAig = pAig; p->nPis = Saig_ManPiNum(pAig); p->nPos = Saig_ManPoNum(pAig); p->nCis = Aig_ManPiNum(pAig); p->nCos = Aig_ManPoNum(pAig); p->nNodes = Aig_ManNodeNum(pAig); nObjs = p->nCis + p->nCos + p->nNodes + 2; p->pFans0 = ABC_ALLOC( int, nObjs ); p->pFans1 = ABC_ALLOC( int, nObjs ); p->pRefs = ABC_ALLOC( int, nObjs ); p->vCis2Ids = Vec_IntAlloc( Aig_ManPiNum(pAig) ); // add objects (0=unused; 1=const1) p->pFans0[0] = p->pFans1[0] = 0; p->pFans0[1] = p->pFans1[1] = 0; p->pRefs[0] = 0; p->nObjs = 2; pObj = Aig_ManConst1( pAig ); pObj->iData = 1; p->pRefs[1] = Aig_ObjRefs(pObj); if ( p->pRefs[1] ) p->nCrossCut = 1; Aig_ManForEachPi( pAig, pObj, i ) if ( Aig_ObjRefs(pObj) == 0 ) Fsim_ManCreate_rec( p, pObj ); Aig_ManForEachPo( pAig, pObj, i ) Fsim_ManCreate_rec( p, pObj ); assert( Vec_IntSize(p->vCis2Ids) == Aig_ManPiNum(pAig) ); assert( p->nObjs == nObjs ); // check references assert( p->nCrossCut == 0 ); Aig_ManForEachObj( pAig, pObj, i ) { assert( p->pRefs[pObj->iData] == 0 ); p->pRefs[pObj->iData] = Aig_ObjRefs(pObj); } // collect flop outputs p->vLos = Vec_IntAlloc( Aig_ManRegNum(pAig) ); Saig_ManForEachLo( pAig, pObj, i ) Vec_IntPush( p->vLos, pObj->iData ); // collect flop inputs p->vLis = Vec_IntAlloc( Aig_ManRegNum(pAig) ); Saig_ManForEachLi( pAig, pObj, i ) Vec_IntPush( p->vLis, pObj->iData ); // determine the frontier size p->nFront = 1 + (int)(1.1 * p->nCrossCutMax); return p; } /**Function************************************************************* Synopsis [Deletes fast simulation manager.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Fsim_ManDelete( Fsim_Man_t * p ) { Vec_IntFree( p->vCis2Ids ); Vec_IntFree( p->vLos ); Vec_IntFree( p->vLis ); ABC_FREE( p->pDataAig2 ); ABC_FREE( p->pDataAig ); ABC_FREE( p->pFans0 ); ABC_FREE( p->pFans1 ); ABC_FREE( p->pRefs ); ABC_FREE( p->pDataSim ); ABC_FREE( p->pDataSimCis ); ABC_FREE( p->pDataSimCos ); ABC_FREE( p->pData1 ); ABC_FREE( p->pData2 ); ABC_FREE( p ); } /**Function************************************************************* Synopsis [Testing procedure.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Fsim_ManTest( Aig_Man_t * pAig ) { Fsim_Man_t * p; p = Fsim_ManCreate( pAig ); Fsim_ManFront( p, 0 ); Fsim_ManDelete( p ); } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END