mirror of https://github.com/YosysHQ/abc.git
107 lines
3.4 KiB
C
107 lines
3.4 KiB
C
|
|
/**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 "dar.h"
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
/// DECLARATIONS ///
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
/// FUNCTION DEFINITIONS ///
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
/**Function*************************************************************
|
||
|
|
|
||
|
|
Synopsis []
|
||
|
|
|
||
|
|
Description []
|
||
|
|
|
||
|
|
SideEffects []
|
||
|
|
|
||
|
|
SeeAlso []
|
||
|
|
|
||
|
|
***********************************************************************/
|
||
|
|
int Dar_ManRewrite( Dar_Man_t * p )
|
||
|
|
{
|
||
|
|
ProgressBar * pProgress;
|
||
|
|
Dar_Obj_t * pObj, * pObjNew;
|
||
|
|
int i, k, nNodesOld, nNodeBefore, nNodeAfter, Required;
|
||
|
|
int clk = 0, clkStart = clock();
|
||
|
|
// remove dangling nodes
|
||
|
|
Dar_ManCleanup( p );
|
||
|
|
// set elementary cuts for the PIs
|
||
|
|
Dar_ManSetupPis( p );
|
||
|
|
// if ( p->pPars->fUpdateLevel )
|
||
|
|
// Dar_NtkStartReverseLevels( p );
|
||
|
|
// resynthesize each node once
|
||
|
|
nNodesOld = Vec_PtrSize( p->vObjs );
|
||
|
|
pProgress = Extra_ProgressBarStart( stdout, nNodesOld );
|
||
|
|
Dar_ManForEachObj( p, pObj, i )
|
||
|
|
{
|
||
|
|
Extra_ProgressBarUpdate( pProgress, i, NULL );
|
||
|
|
if ( !Dar_ObjIsNode(pObj) )
|
||
|
|
continue;
|
||
|
|
if ( i > nNodesOld )
|
||
|
|
break;
|
||
|
|
// compute cuts for the node
|
||
|
|
Dar_ObjComputeCuts_rec( p, pObj );
|
||
|
|
// go through the cuts of this node
|
||
|
|
Required = 1000000;
|
||
|
|
p->GainBest = -1;
|
||
|
|
for ( k = 1; k < (int)pObj->nCuts; k++ )
|
||
|
|
Dar_LibEval( p, pObj, (Dar_Cut_t *)pObj->pData + k, Required );
|
||
|
|
// check the best gain
|
||
|
|
if ( !(p->GainBest > 0 || p->GainBest == 0 && p->pPars->fUseZeros) )
|
||
|
|
continue;
|
||
|
|
// if we end up here, a rewriting step is accepted
|
||
|
|
nNodeBefore = Dar_ManNodeNum( p );
|
||
|
|
pObjNew = Dar_LibBuildBest( p );
|
||
|
|
pObjNew = Dar_NotCond( pObjNew, pObjNew->fPhase ^ pObj->fPhase );
|
||
|
|
// remove the old nodes
|
||
|
|
Dar_ObjReplace( p, pObj, pObjNew );
|
||
|
|
// compare the gains
|
||
|
|
nNodeAfter = Dar_ManNodeNum( p );
|
||
|
|
assert( p->GainBest == nNodeBefore - nNodeAfter );
|
||
|
|
assert( (int)pObjNew->Level <= Required );
|
||
|
|
}
|
||
|
|
Extra_ProgressBarStop( pProgress );
|
||
|
|
Dar_ManCutsFree( p );
|
||
|
|
// put the nodes into the DFS order and reassign their IDs
|
||
|
|
// Dar_NtkReassignIds( p );
|
||
|
|
|
||
|
|
// fix the levels
|
||
|
|
// if ( p->pPars->fUpdateLevel )
|
||
|
|
// Dar_NtkStopReverseLevels( p );
|
||
|
|
// check
|
||
|
|
if ( !Dar_ManCheck( p ) )
|
||
|
|
{
|
||
|
|
printf( "Dar_ManRewrite: The network check has failed.\n" );
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
return 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
/// END OF FILE ///
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
|