| /**CFile**************************************************************** | |
| FileName [darInt.h] | |
| SystemName [ABC: Logic synthesis and verification system.] | |
| PackageName [DAG-aware AIG rewriting.] | |
| Synopsis [Internal declarations.] | |
| Author [Alan Mishchenko] | |
| Affiliation [UC Berkeley] | |
| Date [Ver. 1.0. Started - April 28, 2007.] | |
| Revision [$Id: darInt.h,v 1.00 2007/04/28 00:00:00 alanmi Exp $] | |
| ***********************************************************************/ | |
| #ifndef ABC__aig__dar__darInt_h | |
| #define ABC__aig__dar__darInt_h | |
| //////////////////////////////////////////////////////////////////////// | |
| /// INCLUDES /// | |
| //////////////////////////////////////////////////////////////////////// | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <assert.h> | |
| #include "misc/vec/vec.h" | |
| #include "aig/aig/aig.h" | |
| #include "dar.h" | |
| //////////////////////////////////////////////////////////////////////// | |
| /// PARAMETERS /// | |
| //////////////////////////////////////////////////////////////////////// | |
| ABC_NAMESPACE_HEADER_START | |
| //////////////////////////////////////////////////////////////////////// | |
| /// BASIC TYPES /// | |
| //////////////////////////////////////////////////////////////////////// | |
| typedef struct Dar_Man_t_ Dar_Man_t; | |
| typedef struct Dar_Cut_t_ Dar_Cut_t; | |
| // the AIG 4-cut | |
| struct Dar_Cut_t_ // 6 words | |
| { | |
| unsigned uSign; // cut signature | |
| unsigned uTruth : 16; // the truth table of the cut function | |
| unsigned Value : 11; // the value of the cut | |
| unsigned fBest : 1; // marks the best cut | |
| unsigned fUsed : 1; // marks the cut currently in use | |
| unsigned nLeaves : 3; // the number of leaves | |
| int pLeaves[4]; // the array of leaves | |
| }; | |
| // the AIG manager | |
| struct Dar_Man_t_ | |
| { | |
| // input data | |
| Dar_RwrPar_t * pPars; // rewriting parameters | |
| Aig_Man_t * pAig; // AIG manager | |
| // various data members | |
| Aig_MmFixed_t * pMemCuts; // memory manager for cuts | |
| void * pManCnf; // CNF managers | |
| Vec_Ptr_t * vCutNodes; // the nodes with cuts allocated | |
| // current rewriting step | |
| Vec_Ptr_t * vLeavesBest; // the best set of leaves | |
| int OutBest; // the best output (in the library) | |
| int OutNumBest; // the best number of the output | |
| int GainBest; // the best gain | |
| int LevelBest; // the level of node with the best gain | |
| int ClassBest; // the equivalence class of the best replacement | |
| // function statistics | |
| int nTotalSubgs; // the total number of subgraphs tried | |
| int ClassTimes[222];// the runtimes for each class | |
| int ClassGains[222];// the gains for each class | |
| int ClassSubgs[222];// the graphs for each class | |
| int nCutMemUsed; // memory used for cuts | |
| // rewriting statistics | |
| int nNodesInit; // the original number of nodes | |
| int nNodesTried; // the number of nodes attempted | |
| int nCutsAll; // all cut pairs | |
| int nCutsTried; // computed cuts | |
| int nCutsUsed; // used cuts | |
| int nCutsBad; // bad cuts due to absent fanin | |
| int nCutsGood; // good cuts | |
| int nCutsSkipped; // skipped bad cuts | |
| // timing statistics | |
| abctime timeCuts; | |
| abctime timeEval; | |
| abctime timeOther; | |
| abctime timeTotal; | |
| abctime time1; | |
| abctime time2; | |
| }; | |
| static inline Dar_Cut_t * Dar_ObjCuts( Aig_Obj_t * pObj ) { return (Dar_Cut_t *)pObj->pData; } | |
| static inline void Dar_ObjSetCuts( Aig_Obj_t * pObj, Dar_Cut_t * pCuts ) { assert( !Aig_ObjIsNone(pObj) ); pObj->pData = pCuts; } | |
| //////////////////////////////////////////////////////////////////////// | |
| /// MACRO DEFINITIONS /// | |
| //////////////////////////////////////////////////////////////////////// | |
| //////////////////////////////////////////////////////////////////////// | |
| /// ITERATORS /// | |
| //////////////////////////////////////////////////////////////////////// | |
| // iterator over all cuts of the node | |
| #define Dar_ObjForEachCutAll( pObj, pCut, i ) \ | |
| for ( (pCut) = Dar_ObjCuts(pObj), i = 0; i < (int)(pObj)->nCuts; i++, pCut++ ) | |
| #define Dar_ObjForEachCut( pObj, pCut, i ) \ | |
| for ( (pCut) = Dar_ObjCuts(pObj), i = 0; i < (int)(pObj)->nCuts; i++, pCut++ ) if ( (pCut)->fUsed==0 ) {} else | |
| // iterator over leaves of the cut | |
| #define Dar_CutForEachLeaf( p, pCut, pLeaf, i ) \ | |
| for ( i = 0; (i < (int)(pCut)->nLeaves) && (((pLeaf) = Aig_ManObj(p, (pCut)->pLeaves[i])), 1); i++ ) | |
| //////////////////////////////////////////////////////////////////////// | |
| /// FUNCTION DECLARATIONS /// | |
| //////////////////////////////////////////////////////////////////////// | |
| /*=== darBalance.c ========================================================*/ | |
| /*=== darCore.c ===========================================================*/ | |
| /*=== darCut.c ============================================================*/ | |
| extern void Dar_ManCutsRestart( Dar_Man_t * p, Aig_Obj_t * pRoot ); | |
| extern void Dar_ManCutsFree( Dar_Man_t * p ); | |
| extern Dar_Cut_t * Dar_ObjPrepareCuts( Dar_Man_t * p, Aig_Obj_t * pObj ); | |
| extern Dar_Cut_t * Dar_ObjComputeCuts_rec( Dar_Man_t * p, Aig_Obj_t * pObj ); | |
| extern Dar_Cut_t * Dar_ObjComputeCuts( Dar_Man_t * p, Aig_Obj_t * pObj, int fSkipTtMin ); | |
| extern void Dar_ObjCutPrint( Aig_Man_t * p, Aig_Obj_t * pObj ); | |
| /*=== darData.c ===========================================================*/ | |
| extern Vec_Int_t * Dar_LibReadNodes(); | |
| extern Vec_Int_t * Dar_LibReadOuts(); | |
| extern Vec_Int_t * Dar_LibReadPrios(); | |
| /*=== darLib.c ============================================================*/ | |
| extern void Dar_LibStart(); | |
| extern void Dar_LibStop(); | |
| extern void Dar_LibReturnCanonicals( unsigned * pCanons ); | |
| extern void Dar_LibEval( Dar_Man_t * p, Aig_Obj_t * pRoot, Dar_Cut_t * pCut, int Required, int * pnMffcSize ); | |
| extern Aig_Obj_t * Dar_LibBuildBest( Dar_Man_t * p ); | |
| /*=== darMan.c ============================================================*/ | |
| extern Dar_Man_t * Dar_ManStart( Aig_Man_t * pAig, Dar_RwrPar_t * pPars ); | |
| extern void Dar_ManStop( Dar_Man_t * p ); | |
| extern void Dar_ManPrintStats( Dar_Man_t * p ); | |
| /*=== darPrec.c ============================================================*/ | |
| extern char ** Dar_Permutations( int n ); | |
| extern void Dar_Truth4VarNPN( unsigned short ** puCanons, char ** puPhases, char ** puPerms, unsigned char ** puMap ); | |
| ABC_NAMESPACE_HEADER_END | |
| #endif | |
| //////////////////////////////////////////////////////////////////////// | |
| /// END OF FILE /// | |
| //////////////////////////////////////////////////////////////////////// | |