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