/**CFile**************************************************************** FileName [simSym.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: simSym.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 /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Computes two variable symmetries.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Sim_ComputeTwoVarSymms( Abc_Ntk_t * pNtk, int fVerbose ) { Sym_Man_t * p; Vec_Ptr_t * vResult; int Result; int i; abctime clk, clkTotal = Abc_Clock(); srand( 0xABC ); // start the simulation manager p = Sym_ManStart( pNtk, fVerbose ); p->nPairsTotal = p->nPairsRem = Sim_UtilCountAllPairs( p->vSuppFun, p->nSimWords, p->vPairsTotal ); if ( fVerbose ) printf( "Total = %8d. Sym = %8d. NonSym = %8d. Remaining = %8d.\n", p->nPairsTotal, p->nPairsSymm, p->nPairsNonSymm, p->nPairsRem ); // detect symmetries using circuit structure clk = Abc_Clock(); Sim_SymmsStructCompute( pNtk, p->vMatrSymms, p->vSuppFun ); p->timeStruct = Abc_Clock() - clk; Sim_UtilCountPairsAll( p ); p->nPairsSymmStr = p->nPairsSymm; if ( fVerbose ) printf( "Total = %8d. Sym = %8d. NonSym = %8d. Remaining = %8d.\n", p->nPairsTotal, p->nPairsSymm, p->nPairsNonSymm, p->nPairsRem ); // detect symmetries using simulation for ( i = 1; i <= 1000; i++ ) { // simulate this pattern Sim_UtilSetRandom( p->uPatRand, p->nSimWords ); Sim_SymmsSimulate( p, p->uPatRand, p->vMatrNonSymms ); if ( i % 50 != 0 ) continue; // check disjointness assert( Sim_UtilMatrsAreDisjoint( p ) ); // count the number of pairs Sim_UtilCountPairsAll( p ); if ( i % 500 != 0 ) continue; if ( fVerbose ) printf( "Total = %8d. Sym = %8d. NonSym = %8d. Remaining = %8d.\n", p->nPairsTotal, p->nPairsSymm, p->nPairsNonSymm, p->nPairsRem ); } // detect symmetries using SAT for ( i = 1; Sim_SymmsGetPatternUsingSat( p, p->uPatRand ); i++ ) { // simulate this pattern in four polarities Sim_SymmsSimulate( p, p->uPatRand, p->vMatrNonSymms ); Sim_XorBit( p->uPatRand, p->iVar1 ); Sim_SymmsSimulate( p, p->uPatRand, p->vMatrNonSymms ); Sim_XorBit( p->uPatRand, p->iVar2 ); Sim_SymmsSimulate( p, p->uPatRand, p->vMatrNonSymms ); Sim_XorBit( p->uPatRand, p->iVar1 ); Sim_SymmsSimulate( p, p->uPatRand, p->vMatrNonSymms ); Sim_XorBit( p->uPatRand, p->iVar2 ); /* // try the previuos pair Sim_XorBit( p->uPatRand, p->iVar1Old ); Sim_SymmsSimulate( p, p->uPatRand, p->vMatrNonSymms ); Sim_XorBit( p->uPatRand, p->iVar2Old ); Sim_SymmsSimulate( p, p->uPatRand, p->vMatrNonSymms ); Sim_XorBit( p->uPatRand, p->iVar1Old ); Sim_SymmsSimulate( p, p->uPatRand, p->vMatrNonSymms ); */ if ( i % 10 != 0 ) continue; // check disjointness assert( Sim_UtilMatrsAreDisjoint( p ) ); // count the number of pairs Sim_UtilCountPairsAll( p ); if ( i % 50 != 0 ) continue; if ( fVerbose ) printf( "Total = %8d. Sym = %8d. NonSym = %8d. Remaining = %8d.\n", p->nPairsTotal, p->nPairsSymm, p->nPairsNonSymm, p->nPairsRem ); } // count the number of pairs Sim_UtilCountPairsAll( p ); if ( fVerbose ) printf( "Total = %8d. Sym = %8d. NonSym = %8d. Remaining = %8d.\n", p->nPairsTotal, p->nPairsSymm, p->nPairsNonSymm, p->nPairsRem ); // Sim_UtilCountPairsAllPrint( p ); Result = p->nPairsSymm; vResult = p->vMatrSymms; p->timeTotal = Abc_Clock() - clkTotal; // p->vMatrSymms = NULL; Sym_ManStop( p ); return Result; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END