mirror of https://github.com/YosysHQ/abc.git
115 lines
3.3 KiB
C
115 lines
3.3 KiB
C
|
|
/**CFile****************************************************************
|
||
|
|
|
||
|
|
FileName [sclUpsize.c]
|
||
|
|
|
||
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
||
|
|
|
||
|
|
PackageName [Standard-cell library representation.]
|
||
|
|
|
||
|
|
Synopsis [Selective increase of gate sizes.]
|
||
|
|
|
||
|
|
Author [Alan Mishchenko, Niklas Een]
|
||
|
|
|
||
|
|
Affiliation [UC Berkeley]
|
||
|
|
|
||
|
|
Date [Ver. 1.0. Started - August 24, 2012.]
|
||
|
|
|
||
|
|
Revision [$Id: sclUpsize.c,v 1.0 2012/08/24 00:00:00 alanmi Exp $]
|
||
|
|
|
||
|
|
***********************************************************************/
|
||
|
|
|
||
|
|
#include "sclInt.h"
|
||
|
|
#include "sclMan.h"
|
||
|
|
|
||
|
|
ABC_NAMESPACE_IMPL_START
|
||
|
|
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
/// DECLARATIONS ///
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
/// FUNCTION DEFINITIONS ///
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
/**Function*************************************************************
|
||
|
|
|
||
|
|
Synopsis [Begin by upsizing gates will many fanouts.]
|
||
|
|
|
||
|
|
Description []
|
||
|
|
|
||
|
|
SideEffects []
|
||
|
|
|
||
|
|
SeeAlso []
|
||
|
|
|
||
|
|
***********************************************************************/
|
||
|
|
int Abc_SclManUpsize( SC_Man * p, int Degree )
|
||
|
|
{
|
||
|
|
SC_Cell * pOld, * pNew;
|
||
|
|
Abc_Obj_t * pObj;
|
||
|
|
int i, Count = 0;
|
||
|
|
Abc_NtkForEachNode1( p->pNtk, pObj, i )
|
||
|
|
{
|
||
|
|
if ( Abc_ObjFanoutNum(pObj) < Degree )
|
||
|
|
continue;
|
||
|
|
// find new gate
|
||
|
|
pOld = Abc_SclObjCell( p, pObj );
|
||
|
|
pNew = Abc_SclObjResiable( p, pObj, 1 );
|
||
|
|
if ( pNew == NULL )
|
||
|
|
continue;
|
||
|
|
Vec_IntWriteEntry( p->vGates, Abc_ObjId(pObj), Abc_SclCellFind(p->pLib, pNew->pName) );
|
||
|
|
Count++;
|
||
|
|
}
|
||
|
|
return Count;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/**Function*************************************************************
|
||
|
|
|
||
|
|
Synopsis []
|
||
|
|
|
||
|
|
Description []
|
||
|
|
|
||
|
|
SideEffects []
|
||
|
|
|
||
|
|
SeeAlso []
|
||
|
|
|
||
|
|
***********************************************************************/
|
||
|
|
void Abc_SclUpsizingPerform( SC_Lib * pLib, Abc_Ntk_t * pNtk, int Degree, int nRange, int fVerbose )
|
||
|
|
{
|
||
|
|
SC_Man * p;
|
||
|
|
int nUpsizes;
|
||
|
|
|
||
|
|
// prepare the manager; collect init stats
|
||
|
|
p = Abc_SclManStart( pLib, pNtk, 1 );
|
||
|
|
|
||
|
|
// perform upsizing
|
||
|
|
nUpsizes = Abc_SclManUpsize( p, Degree );
|
||
|
|
|
||
|
|
// recompute timing
|
||
|
|
Abc_SclTimeNtkRecompute( p, &p->SumArea, &p->MaxDelay );
|
||
|
|
|
||
|
|
// print cumulative statistics
|
||
|
|
printf( "Resized: %d. ", nUpsizes );
|
||
|
|
printf( "Delay: " );
|
||
|
|
printf( "%.2f -> %.2f ps ", SC_LibTimePs(p->pLib, p->MaxDelay0), SC_LibTimePs(p->pLib, p->MaxDelay) );
|
||
|
|
printf( "(%+.1f %%). ", 100.0 * (p->MaxDelay - p->MaxDelay0)/ p->MaxDelay0 );
|
||
|
|
printf( "Area: " );
|
||
|
|
printf( "%.2f -> %.2f ", p->SumArea0, p->SumArea );
|
||
|
|
printf( "(%+.1f %%). ", 100.0 * (p->SumArea - p->SumArea0)/ p->SumArea0 );
|
||
|
|
Abc_PrintTime( 1, "Time", clock() - p->clkStart );
|
||
|
|
|
||
|
|
// save the result and quit
|
||
|
|
Abc_SclManSetGates( pLib, pNtk, p->vGates ); // updates gate pointers
|
||
|
|
Abc_SclManFree( p );
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
/// END OF FILE ///
|
||
|
|
////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
|
||
|
|
ABC_NAMESPACE_IMPL_END
|
||
|
|
|