| /**CFile**************************************************************** |
| |
| FileName [mfsInt.h] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [The good old minimization with complete don't-cares.] |
| |
| Synopsis [Internal declarations.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - June 20, 2005.] |
| |
| Revision [$Id: mfsInt.h,v 1.00 2005/06/20 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #ifndef ABC__opt__mfs__mfsInt_h |
| #define ABC__opt__mfs__mfsInt_h |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// INCLUDES /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| #include "base/abc/abc.h" |
| #include "mfs.h" |
| #include "aig/aig/aig.h" |
| #include "sat/cnf/cnf.h" |
| #include "sat/bsat/satSolver.h" |
| #include "sat/bsat/satStore.h" |
| #include "bool/bdc/bdc.h" |
| #include "aig/gia/gia.h" |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// PARAMETERS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| |
| ABC_NAMESPACE_HEADER_START |
| |
| |
| #define MFS_FANIN_MAX 12 |
| |
| typedef struct Mfs_Man_t_ Mfs_Man_t; |
| struct Mfs_Man_t_ |
| { |
| // input data |
| Mfs_Par_t * pPars; |
| Abc_Ntk_t * pNtk; |
| Aig_Man_t * pCare; |
| Vec_Ptr_t * vSuppsInv; |
| int nFaninMax; |
| // intermeditate data for the node |
| Vec_Ptr_t * vRoots; // the roots of the window |
| Vec_Ptr_t * vSupp; // the support of the window |
| Vec_Ptr_t * vNodes; // the internal nodes of the window |
| Vec_Ptr_t * vDivs; // the divisors of the node |
| Vec_Int_t * vDivLits; // the SAT literals of divisor nodes |
| Vec_Int_t * vProjVarsCnf; // the projection variables |
| Vec_Int_t * vProjVarsSat; // the projection variables |
| // intermediate simulation data |
| Vec_Ptr_t * vDivCexes; // the counter-example for dividors |
| int nDivWords; // the number of words |
| int nCexes; // the numbe rof current counter-examples |
| int nSatCalls; |
| int nSatCexes; |
| /* |
| // intermediate AIG data |
| Gia_Man_t * pGia; // replica of the AIG in the new package |
| // Gia_Obj_t ** pSat2Gia; // mapping of PO SAT var into internal GIA nodes |
| Tas_Man_t * pTas; // the SAT solver |
| Vec_Int_t * vCex; // the counter-example |
| Vec_Ptr_t * vGiaLits; // literals given as assumptions |
| */ |
| // used for bidecomposition |
| Vec_Int_t * vTruth; |
| Bdc_Man_t * pManDec; |
| int nNodesDec; |
| int nNodesGained; |
| int nNodesGainedLevel; |
| // solving data |
| Aig_Man_t * pAigWin; // window AIG with constraints |
| Cnf_Dat_t * pCnf; // the CNF for the window |
| sat_solver * pSat; // the SAT solver used |
| Int_Man_t * pMan; // interpolation manager; |
| Vec_Int_t * vMem; // memory for intermediate SOPs |
| Vec_Vec_t * vLevels; // levelized structure for updating |
| Vec_Ptr_t * vMfsFanins; // the new set of fanins |
| int nTotConfLim; // total conflict limit |
| int nTotConfLevel; // total conflicts on this level |
| // switching activity |
| Vec_Int_t * vProbs; |
| // the result of solving |
| int nFanins; // the number of fanins |
| int nWords; // the number of words |
| int nCares; // the number of care minterms |
| unsigned uCare[(MFS_FANIN_MAX<=5)?1:1<<(MFS_FANIN_MAX-5)]; // the computed care-set |
| // performance statistics |
| int nTryRemoves; // number of fanin removals |
| int nTryResubs; // number of resubstitutions |
| int nRemoves; // number of fanin removals |
| int nResubs; // number of resubstitutions |
| int nNodesTried; |
| int nNodesResub; |
| int nMintsCare; |
| int nMintsTotal; |
| int nNodesBad; |
| int nTotalDivs; |
| int nTimeOuts; |
| int nTimeOutsLevel; |
| int nDcMints; |
| int nMaxDivs; |
| double dTotalRatios; |
| // node/edge stats |
| int nTotalNodesBeg; |
| int nTotalNodesEnd; |
| int nTotalEdgesBeg; |
| int nTotalEdgesEnd; |
| float TotalSwitchingBeg; |
| float TotalSwitchingEnd; |
| // statistics |
| abctime timeWin; |
| abctime timeDiv; |
| abctime timeAig; |
| abctime timeGia; |
| abctime timeCnf; |
| abctime timeSat; |
| abctime timeInt; |
| abctime timeTotal; |
| }; |
| |
| static inline float Abc_MfsObjProb( Mfs_Man_t * p, Abc_Obj_t * pObj ) { return (p->vProbs && pObj->Id < Vec_IntSize(p->vProbs))? Abc_Int2Float(Vec_IntEntry(p->vProbs,pObj->Id)) : 0.0; } |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// BASIC TYPES /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// MACRO DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /*=== mfsDiv.c ==========================================================*/ |
| extern Vec_Ptr_t * Abc_MfsComputeDivisors( Mfs_Man_t * p, Abc_Obj_t * pNode, int nLevDivMax ); |
| /*=== mfsInter.c ==========================================================*/ |
| extern sat_solver * Abc_MfsCreateSolverResub( Mfs_Man_t * p, int * pCands, int nCands, int fInvert ); |
| extern Hop_Obj_t * Abc_NtkMfsInterplate( Mfs_Man_t * p, int * pCands, int nCands ); |
| extern int Abc_NtkMfsInterplateEval( Mfs_Man_t * p, int * pCands, int nCands ); |
| /*=== mfsMan.c ==========================================================*/ |
| extern Mfs_Man_t * Mfs_ManAlloc( Mfs_Par_t * pPars ); |
| extern void Mfs_ManStop( Mfs_Man_t * p ); |
| extern void Mfs_ManClean( Mfs_Man_t * p ); |
| /*=== mfsResub.c ==========================================================*/ |
| extern void Abc_NtkMfsPrintResubStats( Mfs_Man_t * p ); |
| extern int Abc_NtkMfsEdgeSwapEval( Mfs_Man_t * p, Abc_Obj_t * pNode ); |
| extern int Abc_NtkMfsEdgePower( Mfs_Man_t * p, Abc_Obj_t * pNode ); |
| extern int Abc_NtkMfsResubNode( Mfs_Man_t * p, Abc_Obj_t * pNode ); |
| extern int Abc_NtkMfsResubNode2( Mfs_Man_t * p, Abc_Obj_t * pNode ); |
| /*=== mfsSat.c ==========================================================*/ |
| extern int Abc_NtkMfsSolveSat( Mfs_Man_t * p, Abc_Obj_t * pNode ); |
| extern int Abc_NtkAddOneHotness( Mfs_Man_t * p ); |
| /*=== mfsStrash.c ==========================================================*/ |
| extern Aig_Man_t * Abc_NtkConstructAig( Mfs_Man_t * p, Abc_Obj_t * pNode ); |
| extern double Abc_NtkConstraintRatio( Mfs_Man_t * p, Abc_Obj_t * pNode ); |
| /*=== mfsWin.c ==========================================================*/ |
| extern Vec_Ptr_t * Abc_MfsComputeRoots( Abc_Obj_t * pNode, int nWinTfoMax, int nFanoutLimit ); |
| |
| /*=== mfsGia.c ==========================================================*/ |
| extern void Abc_NtkMfsConstructGia( Mfs_Man_t * p ); |
| extern void Abc_NtkMfsDeconstructGia( Mfs_Man_t * p ); |
| extern int Abc_NtkMfsTryResubOnceGia( Mfs_Man_t * p, int * pCands, int nCands ); |
| |
| |
| |
| ABC_NAMESPACE_HEADER_END |
| |
| |
| |
| #endif |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |