diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2012-01-21 04:30:10 -0800 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2012-01-21 04:30:10 -0800 |
commit | 8014f25f6db719fa62336f997963532a14c568f6 (patch) | |
tree | c691ee91a3a2d452a2bd24ac89a8c717beaa7af7 /src/aig/dar/darCore.c | |
parent | c44cc5de9429e6b4f1c05045fcf43c9cb96437b5 (diff) | |
download | abc-8014f25f6db719fa62336f997963532a14c568f6.tar.gz abc-8014f25f6db719fa62336f997963532a14c568f6.tar.bz2 abc-8014f25f6db719fa62336f997963532a14c568f6.zip |
Major restructuring of the code.
Diffstat (limited to 'src/aig/dar/darCore.c')
-rw-r--r-- | src/aig/dar/darCore.c | 344 |
1 files changed, 0 insertions, 344 deletions
diff --git a/src/aig/dar/darCore.c b/src/aig/dar/darCore.c deleted file mode 100644 index 6ca3082d..00000000 --- a/src/aig/dar/darCore.c +++ /dev/null @@ -1,344 +0,0 @@ -/**CFile**************************************************************** - - FileName [darCore.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [DAG-aware AIG rewriting.] - - Synopsis [Core of the rewriting package.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - April 28, 2007.] - - Revision [$Id: darCore.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "darInt.h" - -ABC_NAMESPACE_IMPL_START - - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -// iterator over the nodes in the topological order -#define Aig_ManForEachNodeInOrder( p, pObj ) \ - for ( assert(p->pOrderData), p->iPrev = 0, p->iNext = p->pOrderData[1]; \ - p->iNext && (((pObj) = Aig_ManObj(p, p->iNext)), 1); \ - p->iNext = p->pOrderData[2*p->iPrev+1] ) - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Returns the structure with default assignment of parameters.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Dar_ManDefaultRwrParams( Dar_RwrPar_t * pPars ) -{ - memset( pPars, 0, sizeof(Dar_RwrPar_t) ); - pPars->nCutsMax = 8; // 8 - pPars->nSubgMax = 5; // 5 is a "magic number" - pPars->fFanout = 1; - pPars->fUpdateLevel = 0; - pPars->fUseZeros = 0; - pPars->fPower = 0; - pPars->fRecycle = 1; - pPars->fVerbose = 0; - pPars->fVeryVerbose = 0; -} - -#define MAX_VAL 10 - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Dar_ManRewrite( Aig_Man_t * pAig, Dar_RwrPar_t * pPars ) -{ - extern Vec_Int_t * Saig_ManComputeSwitchProbs( Aig_Man_t * p, int nFrames, int nPref, int fProbOne ); - Dar_Man_t * p; -// Bar_Progress_t * pProgress; - Dar_Cut_t * pCut; - Aig_Obj_t * pObj, * pObjNew; - int i, k, nNodesOld, nNodeBefore, nNodeAfter, Required; - int clk = 0, clkStart, Counter = 0; - int nMffcSize, nMffcGains[MAX_VAL+1][MAX_VAL+1] = {{0}}; - // prepare the library - Dar_LibPrepare( pPars->nSubgMax ); - // create rewriting manager - p = Dar_ManStart( pAig, pPars ); - if ( pPars->fPower ) - pAig->vProbs = Saig_ManComputeSwitchProbs( pAig, 48, 16, 1 ); - // remove dangling nodes - Aig_ManCleanup( pAig ); - // if updating levels is requested, start fanout and timing - if ( p->pPars->fFanout ) - Aig_ManFanoutStart( pAig ); - if ( p->pPars->fUpdateLevel ) - Aig_ManStartReverseLevels( pAig, 0 ); - // set elementary cuts for the PIs -// Dar_ManCutsStart( p ); - // resynthesize each node once - clkStart = clock(); - p->nNodesInit = Aig_ManNodeNum(pAig); - nNodesOld = Vec_PtrSize( pAig->vObjs ); - -// pProgress = Bar_ProgressStart( stdout, nNodesOld ); - Aig_ManForEachObj( pAig, pObj, i ) -// pProgress = Bar_ProgressStart( stdout, 100 ); -// Aig_ManOrderStart( pAig ); -// Aig_ManForEachNodeInOrder( pAig, pObj ) - { -// Bar_ProgressUpdate( pProgress, 100*pAig->nAndPrev/pAig->nAndTotal, NULL ); -// Bar_ProgressUpdate( pProgress, i, NULL ); - if ( !Aig_ObjIsNode(pObj) ) - continue; - if ( i > nNodesOld ) -// if ( p->pPars->fUseZeros && i > nNodesOld ) - break; - if ( pPars->fRecycle && ++Counter % 50000 == 0 && Aig_DagSize(pObj) < Vec_PtrSize(p->vCutNodes)/100 ) - { -// printf( "Counter = %7d. Node = %7d. Dag = %5d. Vec = %5d.\n", -// Counter, i, Aig_DagSize(pObj), Vec_PtrSize(p->vCutNodes) ); -// fflush( stdout ); - Dar_ManCutsRestart( p, pObj ); - } - - // consider freeing the cuts -// if ( (i & 0xFFF) == 0 && Aig_MmFixedReadMemUsage(p->pMemCuts)/(1<<20) > 100 ) -// Dar_ManCutsStart( p ); - - // compute cuts for the node - p->nNodesTried++; -clk = clock(); - Dar_ObjSetCuts( pObj, NULL ); - Dar_ObjComputeCuts_rec( p, pObj ); -p->timeCuts += clock() - clk; - - // check if there is a trivial cut - Dar_ObjForEachCut( pObj, pCut, k ) - if ( pCut->nLeaves == 0 || (pCut->nLeaves == 1 && pCut->pLeaves[0] != pObj->Id && Aig_ManObj(p->pAig, pCut->pLeaves[0])) ) - break; - if ( k < (int)pObj->nCuts ) - { - assert( pCut->nLeaves < 2 ); - if ( pCut->nLeaves == 0 ) // replace by constant - { - assert( pCut->uTruth == 0 || pCut->uTruth == 0xFFFF ); - pObjNew = Aig_NotCond( Aig_ManConst1(p->pAig), pCut->uTruth==0 ); - } - else - { - assert( pCut->uTruth == 0xAAAA || pCut->uTruth == 0x5555 ); - pObjNew = Aig_NotCond( Aig_ManObj(p->pAig, pCut->pLeaves[0]), pCut->uTruth==0x5555 ); - } - // remove the old cuts - Dar_ObjSetCuts( pObj, NULL ); - // replace the node - Aig_ObjReplace( pAig, pObj, pObjNew, p->pPars->fUpdateLevel ); - continue; - } - - // evaluate the cuts - p->GainBest = -1; - nMffcSize = -1; - Required = pAig->vLevelR? Aig_ObjRequiredLevel(pAig, pObj) : ABC_INFINITY; - Dar_ObjForEachCut( pObj, pCut, k ) - { - int nLeavesOld = pCut->nLeaves; - if ( pCut->nLeaves == 3 ) - pCut->pLeaves[pCut->nLeaves++] = 0; - Dar_LibEval( p, pObj, pCut, Required, &nMffcSize ); - pCut->nLeaves = nLeavesOld; - } - // check the best gain - if ( !(p->GainBest > 0 || (p->GainBest == 0 && p->pPars->fUseZeros)) ) - { -// Aig_ObjOrderAdvance( pAig ); - continue; - } -// nMffcGains[p->GainBest < MAX_VAL ? p->GainBest : MAX_VAL][nMffcSize < MAX_VAL ? nMffcSize : MAX_VAL]++; - // remove the old cuts - Dar_ObjSetCuts( pObj, NULL ); - // if we end up here, a rewriting step is accepted - nNodeBefore = Aig_ManNodeNum( pAig ); - pObjNew = Dar_LibBuildBest( p ); // pObjNew can be complemented! - pObjNew = Aig_NotCond( pObjNew, Aig_ObjPhaseReal(pObjNew) ^ pObj->fPhase ); - assert( (int)Aig_Regular(pObjNew)->Level <= Required ); - // replace the node - Aig_ObjReplace( pAig, pObj, pObjNew, p->pPars->fUpdateLevel ); - // compare the gains - nNodeAfter = Aig_ManNodeNum( pAig ); - assert( p->GainBest <= nNodeBefore - nNodeAfter ); - // count gains of this class - p->ClassGains[p->ClassBest] += nNodeBefore - nNodeAfter; - } -// Aig_ManOrderStop( pAig ); -/* - printf( "Distribution of gain (row) by MFFC size (column) %s 0-costs:\n", p->pPars->fUseZeros? "with":"without" ); - for ( k = 0; k <= MAX_VAL; k++ ) - printf( "<%4d> ", k ); - printf( "\n" ); - for ( i = 0; i <= MAX_VAL; i++ ) - { - for ( k = 0; k <= MAX_VAL; k++ ) - printf( "%6d ", nMffcGains[i][k] ); - printf( "\n" ); - } -*/ - -p->timeTotal = clock() - clkStart; -p->timeOther = p->timeTotal - p->timeCuts - p->timeEval; - -// Bar_ProgressStop( pProgress ); - Dar_ManCutsFree( p ); - // put the nodes into the DFS order and reassign their IDs -// Aig_NtkReassignIds( p ); - // fix the levels -// Aig_ManVerifyLevel( pAig ); - if ( p->pPars->fFanout ) - Aig_ManFanoutStop( pAig ); - if ( p->pPars->fUpdateLevel ) - { -// Aig_ManVerifyReverseLevel( pAig ); - Aig_ManStopReverseLevels( pAig ); - } - if ( pAig->vProbs ) - { - Vec_IntFree( pAig->vProbs ); - pAig->vProbs = NULL; - } - // stop the rewriting manager - Dar_ManStop( p ); - Aig_ManCheckPhase( pAig ); - // check - if ( !Aig_ManCheck( pAig ) ) - { - printf( "Aig_ManRewrite: The network check has failed.\n" ); - return 0; - } - return 1; -} - -/**Function************************************************************* - - Synopsis [Computes the total number of cuts.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Dar_ManCutCount( Aig_Man_t * pAig, int * pnCutsK ) -{ - Dar_Cut_t * pCut; - Aig_Obj_t * pObj; - int i, k, nCuts = 0, nCutsK = 0; - Aig_ManForEachNode( pAig, pObj, i ) - Dar_ObjForEachCut( pObj, pCut, k ) - { - nCuts++; - if ( pCut->nLeaves == 4 ) - nCutsK++; - } - if ( pnCutsK ) - *pnCutsK = nCutsK; - return nCuts; -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_MmFixed_t * Dar_ManComputeCuts( Aig_Man_t * pAig, int nCutsMax, int fVerbose ) -{ - Dar_Man_t * p; - Dar_RwrPar_t Pars, * pPars = &Pars; - Aig_Obj_t * pObj; - Aig_MmFixed_t * pMemCuts; - int i, nNodes, clk = clock(); - // remove dangling nodes - if ( (nNodes = Aig_ManCleanup( pAig )) ) - { -// printf( "Removing %d nodes.\n", nNodes ); - } - // create default parameters - Dar_ManDefaultRwrParams( pPars ); - pPars->nCutsMax = nCutsMax; - // create rewriting manager - p = Dar_ManStart( pAig, pPars ); - // set elementary cuts for the PIs -// Dar_ManCutsStart( p ); - Aig_MmFixedRestart( p->pMemCuts ); - Dar_ObjPrepareCuts( p, Aig_ManConst1(p->pAig) ); - Aig_ManForEachPi( pAig, pObj, i ) - Dar_ObjPrepareCuts( p, pObj ); - // compute cuts for each nodes in the topological order - Aig_ManForEachNode( pAig, pObj, i ) - Dar_ObjComputeCuts( p, pObj ); - // print verbose stats - if ( fVerbose ) - { -// Aig_Obj_t * pObj; - int nCuts, nCutsK;//, i; - nCuts = Dar_ManCutCount( pAig, &nCutsK ); - printf( "Nodes = %6d. Total cuts = %6d. 4-input cuts = %6d.\n", - Aig_ManObjNum(pAig), nCuts, nCutsK ); - printf( "Cut size = %2d. Truth size = %2d. Total mem = %5.2f Mb ", - (int)sizeof(Dar_Cut_t), (int)4, 1.0*Aig_MmFixedReadMemUsage(p->pMemCuts)/(1<<20) ); - ABC_PRT( "Runtime", clock() - clk ); -/* - Aig_ManForEachNode( pAig, pObj, i ) - if ( i % 300 == 0 ) - Dar_ObjCutPrint( pAig, pObj ); -*/ - } - // free the cuts - pMemCuts = p->pMemCuts; - p->pMemCuts = NULL; -// Dar_ManCutsFree( p ); - // stop the rewriting manager - Dar_ManStop( p ); - return pMemCuts; -} - - - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - -ABC_NAMESPACE_IMPL_END - |