/**CFile**************************************************************** FileName [simSymSim.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Network and node package.] Synopsis [Simulation to determine two-variable symmetries.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: simSymSim.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "base/abc/abc.h" #include "sim.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// static void Sim_SymmsCreateSquare( Sym_Man_t * p, unsigned * pPat ); static void Sim_SymmsDeriveInfo( Sym_Man_t * p, unsigned * pPat, Abc_Obj_t * pNode, Vec_Ptr_t * vMatrsNonSym, int Output ); //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Detects non-symmetric pairs using one pattern.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Sim_SymmsSimulate( Sym_Man_t * p, unsigned * pPat, Vec_Ptr_t * vMatrsNonSym ) { Abc_Obj_t * pNode; int i, nPairsTotal, nPairsSym, nPairsNonSym; abctime clk; // create the simulation matrix Sim_SymmsCreateSquare( p, pPat ); // simulate each node in the DFS order clk = Abc_Clock(); Vec_PtrForEachEntry( Abc_Obj_t *, p->vNodes, pNode, i ) { // if ( Abc_NodeIsConst(pNode) ) // continue; Sim_UtilSimulateNodeOne( pNode, p->vSim, p->nSimWords, 0 ); } p->timeSim += Abc_Clock() - clk; // collect info into the CO matrices clk = Abc_Clock(); Abc_NtkForEachCo( p->pNtk, pNode, i ) { pNode = Abc_ObjFanin0(pNode); // if ( Abc_ObjIsCi(pNode) || Abc_AigNodeIsConst(pNode) ) // continue; nPairsTotal = Vec_IntEntry(p->vPairsTotal, i); nPairsSym = Vec_IntEntry(p->vPairsSym, i); nPairsNonSym = Vec_IntEntry(p->vPairsNonSym,i); assert( nPairsTotal >= nPairsSym + nPairsNonSym ); if ( nPairsTotal == nPairsSym + nPairsNonSym ) continue; Sim_SymmsDeriveInfo( p, pPat, pNode, vMatrsNonSym, i ); } p->timeMatr += Abc_Clock() - clk; } /**Function************************************************************* Synopsis [Creates the square matrix of simulation info.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Sim_SymmsCreateSquare( Sym_Man_t * p, unsigned * pPat ) { unsigned * pSimInfo; Abc_Obj_t * pNode; int i, w; // for each PI var copy the pattern Abc_NtkForEachCi( p->pNtk, pNode, i ) { pSimInfo = (unsigned *)Vec_PtrEntry( p->vSim, pNode->Id ); if ( Sim_HasBit(pPat, i) ) { for ( w = 0; w < p->nSimWords; w++ ) pSimInfo[w] = SIM_MASK_FULL; } else { for ( w = 0; w < p->nSimWords; w++ ) pSimInfo[w] = 0; } // flip one bit Sim_XorBit( pSimInfo, i ); } } /**Function************************************************************* Synopsis [Transfers the info to the POs.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Sim_SymmsDeriveInfo( Sym_Man_t * p, unsigned * pPat, Abc_Obj_t * pNode, Vec_Ptr_t * vMatrsNonSym, int Output ) { Extra_BitMat_t * pMat; Vec_Int_t * vSupport; unsigned * pSupport; unsigned * pSimInfo; int i, w, Index; // get the matrix, the support, and the simulation info pMat = (Extra_BitMat_t *)Vec_PtrEntry( vMatrsNonSym, Output ); vSupport = Vec_VecEntryInt( p->vSupports, Output ); pSupport = (unsigned *)Vec_PtrEntry( p->vSuppFun, Output ); pSimInfo = (unsigned *)Vec_PtrEntry( p->vSim, pNode->Id ); // generate vectors A1 and A2 for ( w = 0; w < p->nSimWords; w++ ) { p->uPatCol[w] = pSupport[w] & pPat[w] & pSimInfo[w]; p->uPatRow[w] = pSupport[w] & pPat[w] & ~pSimInfo[w]; } // add two dimensions Vec_IntForEachEntry( vSupport, i, Index ) if ( Sim_HasBit( p->uPatCol, i ) ) Extra_BitMatrixOr( pMat, i, p->uPatRow ); // add two dimensions Vec_IntForEachEntry( vSupport, i, Index ) if ( Sim_HasBit( p->uPatRow, i ) ) Extra_BitMatrixOr( pMat, i, p->uPatCol ); // generate vectors B1 and B2 for ( w = 0; w < p->nSimWords; w++ ) { p->uPatCol[w] = pSupport[w] & ~pPat[w] & pSimInfo[w]; p->uPatRow[w] = pSupport[w] & ~pPat[w] & ~pSimInfo[w]; } // add two dimensions Vec_IntForEachEntry( vSupport, i, Index ) if ( Sim_HasBit( p->uPatCol, i ) ) Extra_BitMatrixOr( pMat, i, p->uPatRow ); // add two dimensions Vec_IntForEachEntry( vSupport, i, Index ) if ( Sim_HasBit( p->uPatRow, i ) ) Extra_BitMatrixOr( pMat, i, p->uPatCol ); } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END