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