| /**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 |
| |