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