| /**CFile**************************************************************** | |
| FileName [bdcInt.h] | |
| SystemName [ABC: Logic synthesis and verification system.] | |
| PackageName [Truth-table-based bi-decomposition engine.] | |
| Synopsis [Internal declarations.] | |
| Author [Alan Mishchenko] | |
| Affiliation [UC Berkeley] | |
| Date [Ver. 1.0. Started - January 15, 2007.] | |
| Revision [$Id: resInt.h,v 1.00 2007/01/15 00:00:00 alanmi Exp $] | |
| ***********************************************************************/ | |
| #ifndef ABC__aig__bdc__bdcInt_h | |
| #define ABC__aig__bdc__bdcInt_h | |
| //////////////////////////////////////////////////////////////////////// | |
| /// INCLUDES /// | |
| //////////////////////////////////////////////////////////////////////// | |
| #include "bool/kit/kit.h" | |
| #include "bdc.h" | |
| //////////////////////////////////////////////////////////////////////// | |
| /// PARAMETERS /// | |
| //////////////////////////////////////////////////////////////////////// | |
| ABC_NAMESPACE_HEADER_START | |
| #define BDC_SCALE 1000 // value used to compute the cost | |
| //////////////////////////////////////////////////////////////////////// | |
| /// BASIC TYPES /// | |
| //////////////////////////////////////////////////////////////////////// | |
| // network types | |
| typedef enum { | |
| BDC_TYPE_NONE = 0, // 0: unknown | |
| BDC_TYPE_CONST1, // 1: constant 1 | |
| BDC_TYPE_PI, // 2: primary input | |
| BDC_TYPE_AND, // 3: AND-gate | |
| BDC_TYPE_OR, // 4: OR-gate (temporary) | |
| BDC_TYPE_XOR, // 5: XOR-gate | |
| BDC_TYPE_MUX, // 6: MUX-gate | |
| BDC_TYPE_OTHER // 7: unused | |
| } Bdc_Type_t; | |
| struct Bdc_Fun_t_ | |
| { | |
| int Type; // Const1, PI, AND, XOR, MUX | |
| Bdc_Fun_t * pFan0; // fanin of the given node | |
| Bdc_Fun_t * pFan1; // fanin of the given node | |
| unsigned uSupp; // bit mask of current support | |
| unsigned * puFunc; // the function of the node | |
| Bdc_Fun_t * pNext; // next function with same support | |
| union { int iCopy; // the literal of the node (AIG) | |
| void * pCopy; }; // the function of the node (BDD or AIG) | |
| }; | |
| typedef struct Bdc_Isf_t_ Bdc_Isf_t; | |
| struct Bdc_Isf_t_ | |
| { | |
| unsigned uSupp; // the complete support of this component | |
| unsigned uUniq; // the unique variables of this component | |
| unsigned * puOn; // on-set | |
| unsigned * puOff; // off-set | |
| }; | |
| struct Bdc_Man_t_ | |
| { | |
| // external parameters | |
| Bdc_Par_t * pPars; // parameter set | |
| int nVars; // the number of variables | |
| int nWords; // the number of words | |
| int nNodesMax; // the limit on the number of new nodes | |
| int nDivsLimit; // the limit on the number of divisors | |
| // internal nodes | |
| Bdc_Fun_t * pNodes; // storage for decomposition nodes | |
| int nNodesAlloc; // the number of nodes allocated | |
| int nNodes; // the number of all nodes created so far | |
| int nNodesNew; // the number of new AND nodes created so far | |
| Bdc_Fun_t * pRoot; // the root node | |
| // resub candidates | |
| Bdc_Fun_t ** pTable; // hash table of candidates | |
| int nTableSize; // hash table size (1 << nVarsMax) | |
| Vec_Int_t * vSpots; // the occupied spots in the table | |
| // elementary truth tables | |
| Vec_Ptr_t * vTruths; // for const 1 and elementary variables | |
| unsigned * puTemp1; // temporary truth table | |
| unsigned * puTemp2; // temporary truth table | |
| unsigned * puTemp3; // temporary truth table | |
| unsigned * puTemp4; // temporary truth table | |
| // temporary ISFs | |
| Bdc_Isf_t * pIsfOL, IsfOL; | |
| Bdc_Isf_t * pIsfOR, IsfOR; | |
| Bdc_Isf_t * pIsfAL, IsfAL; | |
| Bdc_Isf_t * pIsfAR, IsfAR; | |
| // internal memory manager | |
| Vec_Int_t * vMemory; // memory for internal truth tables | |
| // statistics | |
| int numCalls; | |
| int numNodes; | |
| int numMuxes; | |
| int numAnds; | |
| int numOrs; | |
| int numWeaks; | |
| int numReuse; | |
| // runtime | |
| abctime timeCache; | |
| abctime timeCheck; | |
| abctime timeMuxes; | |
| abctime timeSupps; | |
| abctime timeTotal; | |
| }; | |
| static inline Bdc_Fun_t * Bdc_FunNew( Bdc_Man_t * p ) { Bdc_Fun_t * pRes; if ( p->nNodes >= p->nNodesAlloc || p->nNodesNew >= p->nNodesMax ) return NULL; pRes = p->pNodes + p->nNodes++; p->nNodesNew++; memset( pRes, 0, sizeof(Bdc_Fun_t) ); return pRes; } | |
| static inline Bdc_Fun_t * Bdc_FunWithId( Bdc_Man_t * p, int Id ) { assert( Id < p->nNodes ); return p->pNodes + Id; } | |
| static inline int Bdc_FunId( Bdc_Man_t * p, Bdc_Fun_t * pFun ) { return pFun - p->pNodes; } | |
| static inline void Bdc_IsfStart( Bdc_Man_t * p, Bdc_Isf_t * pF ) { pF->uSupp = 0; pF->uUniq = 0; pF->puOn = Vec_IntFetch( p->vMemory, p->nWords ); pF->puOff = Vec_IntFetch( p->vMemory, p->nWords ); assert( pF->puOff && pF->puOn ); } | |
| static inline void Bdc_IsfClean( Bdc_Isf_t * p ) { p->uSupp = 0; p->uUniq = 0; } | |
| static inline void Bdc_IsfCopy( Bdc_Isf_t * p, Bdc_Isf_t * q ) { Bdc_Isf_t T = *p; *p = *q; *q = T; } | |
| static inline void Bdc_IsfNot( Bdc_Isf_t * p ) { unsigned * puT = p->puOn; p->puOn = p->puOff; p->puOff = puT; } | |
| //////////////////////////////////////////////////////////////////////// | |
| /// MACRO DEFINITIONS /// | |
| //////////////////////////////////////////////////////////////////////// | |
| //////////////////////////////////////////////////////////////////////// | |
| /// FUNCTION DECLARATIONS /// | |
| //////////////////////////////////////////////////////////////////////// | |
| /*=== bdcDec.c ==========================================================*/ | |
| extern Bdc_Fun_t * Bdc_ManDecompose_rec( Bdc_Man_t * p, Bdc_Isf_t * pIsf ); | |
| extern void Bdc_SuppMinimize( Bdc_Man_t * p, Bdc_Isf_t * pIsf ); | |
| extern int Bdc_ManNodeVerify( Bdc_Man_t * p, Bdc_Isf_t * pIsf, Bdc_Fun_t * pFunc ); | |
| /*=== bdcTable.c ==========================================================*/ | |
| extern Bdc_Fun_t * Bdc_TableLookup( Bdc_Man_t * p, Bdc_Isf_t * pIsf ); | |
| extern void Bdc_TableAdd( Bdc_Man_t * p, Bdc_Fun_t * pFunc ); | |
| extern void Bdc_TableClear( Bdc_Man_t * p ); | |
| extern int Bdc_TableCheckContainment( Bdc_Man_t * p, Bdc_Isf_t * pIsf, unsigned * puTruth ); | |
| ABC_NAMESPACE_HEADER_END | |
| #endif | |
| //////////////////////////////////////////////////////////////////////// | |
| /// END OF FILE /// | |
| //////////////////////////////////////////////////////////////////////// | |