/**CFile**************************************************************** FileName [sim.h] SystemName [ABC: Logic synthesis and verification system.] PackageName [Simulation package.] Synopsis [External declarations.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: sim.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #ifndef ABC__opt__sim__sim_h #define ABC__opt__sim__sim_h /* The ideas realized in this package are described in the paper: "Detecting Symmetries in Boolean Functions using Circuit Representation, Simulation, and Satisfiability". */ //////////////////////////////////////////////////////////////////////// /// INCLUDES /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// PARAMETERS /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_HEADER_START //////////////////////////////////////////////////////////////////////// /// BASIC TYPES /// //////////////////////////////////////////////////////////////////////// typedef struct Sym_Man_t_ Sym_Man_t; struct Sym_Man_t_ { // info about the network Abc_Ntk_t * pNtk; // the network Vec_Ptr_t * vNodes; // internal nodes in topological order int nInputs; int nOutputs; // internal simulation information int nSimWords; // the number of bits in simulation info Vec_Ptr_t * vSim; // simulation info // support information Vec_Ptr_t * vSuppFun; // bit representation Vec_Vec_t * vSupports; // integer representation // symmetry info for each output Vec_Ptr_t * vMatrSymms; // symmetric pairs Vec_Ptr_t * vMatrNonSymms; // non-symmetric pairs Vec_Int_t * vPairsTotal; // total pairs Vec_Int_t * vPairsSym; // symmetric pairs Vec_Int_t * vPairsNonSym; // non-symmetric pairs // temporary simulation info unsigned * uPatRand; unsigned * uPatCol; unsigned * uPatRow; // temporary Vec_Int_t * vVarsU; Vec_Int_t * vVarsV; int iOutput; int iVar1; int iVar2; int iVar1Old; int iVar2Old; // internal data structures int nSatRuns; int nSatRunsSat; int nSatRunsUnsat; // pairs int nPairsSymm; int nPairsSymmStr; int nPairsNonSymm; int nPairsRem; int nPairsTotal; // runtime statistics abctime timeStruct; abctime timeCount; abctime timeMatr; abctime timeSim; abctime timeFraig; abctime timeSat; abctime timeTotal; }; typedef struct Sim_Man_t_ Sim_Man_t; struct Sim_Man_t_ { // info about the network Abc_Ntk_t * pNtk; int nInputs; int nOutputs; int fLightweight; // internal simulation information int nSimBits; // the number of bits in simulation info int nSimWords; // the number of words in simulation info Vec_Ptr_t * vSim0; // simulation info 1 Vec_Ptr_t * vSim1; // simulation info 2 // support information int nSuppBits; // the number of bits in support info int nSuppWords; // the number of words in support info Vec_Ptr_t * vSuppStr; // structural supports Vec_Ptr_t * vSuppFun; // functional supports // simulation targets Vec_Vec_t * vSuppTargs; // support targets int iInput; // the input current processed // internal data structures Extra_MmFixed_t * pMmPat; Vec_Ptr_t * vFifo; Vec_Int_t * vDiffs; int nSatRuns; int nSatRunsSat; int nSatRunsUnsat; // runtime statistics abctime timeSim; abctime timeTrav; abctime timeFraig; abctime timeSat; abctime timeTotal; }; typedef struct Sim_Pat_t_ Sim_Pat_t; struct Sim_Pat_t_ { int Input; // the input which it has detected int Output; // the output for which it was collected unsigned * pData; // the simulation data }; //////////////////////////////////////////////////////////////////////// /// MACRO DEFINITIONS /// //////////////////////////////////////////////////////////////////////// #define SIM_NUM_WORDS(n) (((n)>>5) + (((n)&31) > 0)) #define SIM_LAST_BITS(n) ((((n)&31) > 0)? (n)&31 : 32) #define SIM_MASK_FULL (0xFFFFFFFF) #define SIM_MASK_BEG(n) (SIM_MASK_FULL >> (32-n)) #define SIM_MASK_END(n) (SIM_MASK_FULL << (n)) #define SIM_SET_0_FROM(m,n) ((m) & ~SIM_MASK_BEG(n)) #define SIM_SET_1_FROM(m,n) ((m) | SIM_MASK_END(n)) // generating random unsigned (#define RAND_MAX 0x7fff) #define SIM_RANDOM_UNSIGNED ((((unsigned)rand()) << 24) ^ (((unsigned)rand()) << 12) ^ ((unsigned)rand())) // macros to get hold of bits in a bit string #define Sim_SetBit(p,i) ((p)[(i)>>5] |= (1<<((i) & 31))) #define Sim_XorBit(p,i) ((p)[(i)>>5] ^= (1<<((i) & 31))) #define Sim_HasBit(p,i) (((p)[(i)>>5] & (1<<((i) & 31))) > 0) // macros to get hold of the support info #define Sim_SuppStrSetVar(vSupps,pNode,v) Sim_SetBit((unsigned*)(vSupps)->pArray[(pNode)->Id],(v)) #define Sim_SuppStrHasVar(vSupps,pNode,v) Sim_HasBit((unsigned*)(vSupps)->pArray[(pNode)->Id],(v)) #define Sim_SuppFunSetVar(vSupps,Output,v) Sim_SetBit((unsigned*)(vSupps)->pArray[Output],(v)) #define Sim_SuppFunHasVar(vSupps,Output,v) Sim_HasBit((unsigned*)(vSupps)->pArray[Output],(v)) #define Sim_SimInfoSetVar(vSupps,pNode,v) Sim_SetBit((unsigned*)(vSupps)->pArray[(pNode)->Id],(v)) #define Sim_SimInfoHasVar(vSupps,pNode,v) Sim_HasBit((unsigned*)(vSupps)->pArray[(pNode)->Id],(v)) #define Sim_SimInfoGet(vInfo,pNode) ((unsigned *)((vInfo)->pArray[(pNode)->Id])) //////////////////////////////////////////////////////////////////////// /// FUNCTION DECLARATIONS /// //////////////////////////////////////////////////////////////////////// /*=== simMan.c ==========================================================*/ extern Sym_Man_t * Sym_ManStart( Abc_Ntk_t * pNtk, int fVerbose ); extern void Sym_ManStop( Sym_Man_t * p ); extern void Sym_ManPrintStats( Sym_Man_t * p ); extern Sim_Man_t * Sim_ManStart( Abc_Ntk_t * pNtk, int fLightweight ); extern void Sim_ManStop( Sim_Man_t * p ); extern void Sim_ManPrintStats( Sim_Man_t * p ); extern Sim_Pat_t * Sim_ManPatAlloc( Sim_Man_t * p ); extern void Sim_ManPatFree( Sim_Man_t * p, Sim_Pat_t * pPat ); /*=== simSeq.c ==========================================================*/ extern Vec_Ptr_t * Sim_SimulateSeqRandom( Abc_Ntk_t * pNtk, int nFrames, int nWords ); extern Vec_Ptr_t * Sim_SimulateSeqModel( Abc_Ntk_t * pNtk, int nFrames, int * pModel ); /*=== simSupp.c ==========================================================*/ extern Vec_Ptr_t * Sim_ComputeStrSupp( Abc_Ntk_t * pNtk ); extern Vec_Ptr_t * Sim_ComputeFunSupp( Abc_Ntk_t * pNtk, int fVerbose ); /*=== simSym.c ==========================================================*/ extern int Sim_ComputeTwoVarSymms( Abc_Ntk_t * pNtk, int fVerbose ); /*=== simSymSat.c ==========================================================*/ extern int Sim_SymmsGetPatternUsingSat( Sym_Man_t * p, unsigned * pPattern ); /*=== simSymStr.c ==========================================================*/ extern void Sim_SymmsStructCompute( Abc_Ntk_t * pNtk, Vec_Ptr_t * vMatrs, Vec_Ptr_t * vSuppFun ); /*=== simSymSim.c ==========================================================*/ extern void Sim_SymmsSimulate( Sym_Man_t * p, unsigned * pPatRand, Vec_Ptr_t * vMatrsNonSym ); /*=== simUtil.c ==========================================================*/ extern Vec_Ptr_t * Sim_UtilInfoAlloc( int nSize, int nWords, int fClean ); extern void Sim_UtilInfoFree( Vec_Ptr_t * p ); extern void Sim_UtilInfoAdd( unsigned * pInfo1, unsigned * pInfo2, int nWords ); extern void Sim_UtilInfoDetectDiffs( unsigned * pInfo1, unsigned * pInfo2, int nWords, Vec_Int_t * vDiffs ); extern void Sim_UtilInfoDetectNews( unsigned * pInfo1, unsigned * pInfo2, int nWords, Vec_Int_t * vDiffs ); extern void Sim_UtilInfoFlip( Sim_Man_t * p, Abc_Obj_t * pNode ); extern int Sim_UtilInfoCompare( Sim_Man_t * p, Abc_Obj_t * pNode ); extern void Sim_UtilSimulate( Sim_Man_t * p, int fFirst ); extern void Sim_UtilSimulateNode( Sim_Man_t * p, Abc_Obj_t * pNode, int fType, int fType1, int fType2 ); extern void Sim_UtilSimulateNodeOne( Abc_Obj_t * pNode, Vec_Ptr_t * vSimInfo, int nSimWords, int nOffset ); extern void Sim_UtilTransferNodeOne( Abc_Obj_t * pNode, Vec_Ptr_t * vSimInfo, int nSimWords, int nOffset, int fShift ); extern int Sim_UtilCountSuppSizes( Sim_Man_t * p, int fStruct ); extern int Sim_UtilCountOnes( unsigned * pSimInfo, int nSimWords ); extern Vec_Int_t * Sim_UtilCountOnesArray( Vec_Ptr_t * vInfo, int nSimWords ); extern void Sim_UtilSetRandom( unsigned * pPatRand, int nSimWords ); extern void Sim_UtilSetCompl( unsigned * pPatRand, int nSimWords ); extern void Sim_UtilSetConst( unsigned * pPatRand, int nSimWords, int fConst1 ); extern int Sim_UtilInfoIsEqual( unsigned * pPats1, unsigned * pPats2, int nSimWords ); extern int Sim_UtilInfoIsImp( unsigned * pPats1, unsigned * pPats2, int nSimWords ); extern int Sim_UtilInfoIsClause( unsigned * pPats1, unsigned * pPats2, int nSimWords ); extern int Sim_UtilCountAllPairs( Vec_Ptr_t * vSuppFun, int nSimWords, Vec_Int_t * vCounters ); extern void Sim_UtilCountPairsAll( Sym_Man_t * p ); extern int Sim_UtilMatrsAreDisjoint( Sym_Man_t * p ); ABC_NAMESPACE_HEADER_END #endif //////////////////////////////////////////////////////////////////////// /// END OF FILE /// ////////////////////////////////////////////////////////////////////////