mirror of https://github.com/YosysHQ/abc.git
172 lines
6.3 KiB
C
172 lines
6.3 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [giaDeep.c]
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
PackageName [Scalable AIG package.]
|
|
|
|
Synopsis [Experiments with synthesis.]
|
|
|
|
Author [Alan Mishchenko]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - June 20, 2005.]
|
|
|
|
Revision [$Id: giaDeep.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#include "gia.h"
|
|
#include "base/main/main.h"
|
|
#include "base/cmd/cmd.h"
|
|
|
|
ABC_NAMESPACE_IMPL_START
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DEFINITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Gia_Man_t * Gia_ManDeepSynOne( int nNoImpr, int TimeOut, int nAnds, int Seed, int fUseTwo, int fVerbose )
|
|
{
|
|
abctime nTimeToStop = TimeOut ? Abc_Clock() + TimeOut * CLOCKS_PER_SEC : 0;
|
|
abctime clkStart = Abc_Clock();
|
|
int s, i, IterMax = 100000, nAndsMin = -1, iIterLast = -1;
|
|
Gia_Man_t * pTemp = Abc_FrameReadGia(Abc_FrameGetGlobalFrame());
|
|
Gia_Man_t * pNew = Gia_ManDup( pTemp );
|
|
Abc_Random(1);
|
|
for ( s = 0; s < 10+Seed; s++ )
|
|
Abc_Random(0);
|
|
for ( i = 0; i < IterMax; i++ )
|
|
{
|
|
char * pCompress2rs = "balance -l; resub -K 6 -l; rewrite -l; resub -K 6 -N 2 -l; refactor -l; resub -K 8 -l; balance -l; resub -K 8 -N 2 -l; rewrite -l; resub -K 10 -l; rewrite -z -l; resub -K 10 -N 2 -l; balance -l; resub -K 12 -l; refactor -z -l; resub -K 12 -N 2 -l; rewrite -z -l; balance -l";
|
|
unsigned Rand = Abc_Random(0);
|
|
int fDch = Rand & 1;
|
|
//int fCom = (Rand >> 1) & 3;
|
|
int fCom = (Rand >> 1) & 1;
|
|
int fFx = (Rand >> 2) & 1;
|
|
int KLut = fUseTwo ? 2 + (i % 5) : 3 + (i % 4);
|
|
int fChange = 0;
|
|
char Command[2000];
|
|
char pComp[1000];
|
|
if ( fCom == 3 )
|
|
sprintf( pComp, "; &put; %s; %s; %s; &get", pCompress2rs, pCompress2rs, pCompress2rs );
|
|
else if ( fCom == 2 )
|
|
sprintf( pComp, "; &put; %s; %s; &get", pCompress2rs, pCompress2rs );
|
|
else if ( fCom == 1 )
|
|
sprintf( pComp, "; &put; %s; &get", pCompress2rs );
|
|
else if ( fCom == 0 )
|
|
sprintf( pComp, "; &dc2" );
|
|
sprintf( Command, "&dch%s; &if -a -K %d; &mfs -e -W 20 -L 20%s%s",
|
|
fDch ? " -f" : "", KLut, fFx ? "; &fx; &st" : "", pComp );
|
|
if ( Abc_FrameIsBatchMode() )
|
|
{
|
|
if ( Cmd_CommandExecute(Abc_FrameGetGlobalFrame(), Command) )
|
|
{
|
|
Abc_Print( 1, "Something did not work out with the command \"%s\".\n", Command );
|
|
return NULL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Abc_FrameSetBatchMode( 1 );
|
|
if ( Cmd_CommandExecute(Abc_FrameGetGlobalFrame(), Command) )
|
|
{
|
|
Abc_Print( 1, "Something did not work out with the command \"%s\".\n", Command );
|
|
return NULL;
|
|
}
|
|
Abc_FrameSetBatchMode( 0 );
|
|
}
|
|
pTemp = Abc_FrameReadGia(Abc_FrameGetGlobalFrame());
|
|
if ( Gia_ManAndNum(pNew) > Gia_ManAndNum(pTemp) )
|
|
{
|
|
Gia_ManStop( pNew );
|
|
pNew = Gia_ManDup( pTemp );
|
|
fChange = 1;
|
|
iIterLast = i;
|
|
}
|
|
else if ( Gia_ManAndNum(pNew) + Gia_ManAndNum(pNew)/10 < Gia_ManAndNum(pTemp) )
|
|
{
|
|
//printf( "Updating\n" );
|
|
//Abc_FrameUpdateGia( Abc_FrameGetGlobalFrame(), Gia_ManDup(pNew) );
|
|
}
|
|
if ( fChange && fVerbose )
|
|
{
|
|
printf( "Iter %6d : ", i );
|
|
printf( "Time %8.2f sec : ", (float)1.0*(Abc_Clock() - clkStart)/CLOCKS_PER_SEC );
|
|
printf( "And = %6d ", Gia_ManAndNum(pNew) );
|
|
printf( "Lev = %3d ", Gia_ManLevelNum(pNew) );
|
|
if ( fChange )
|
|
printf( "<== best : " );
|
|
else if ( fVerbose )
|
|
printf( " " );
|
|
printf( "%s", Command );
|
|
printf( "\n" );
|
|
}
|
|
if ( nTimeToStop && Abc_Clock() > nTimeToStop )
|
|
{
|
|
if ( !Abc_FrameIsBatchMode() )
|
|
printf( "Runtime limit (%d sec) is reached after %d iterations.\n", TimeOut, i );
|
|
break;
|
|
}
|
|
if ( i - iIterLast > nNoImpr )
|
|
{
|
|
printf( "Completed %d iterations without improvement in %.2f seconds.\n",
|
|
nNoImpr, (float)1.0*(Abc_Clock() - clkStart)/CLOCKS_PER_SEC );
|
|
break;
|
|
}
|
|
}
|
|
if ( i == IterMax )
|
|
printf( "Iteration limit (%d iters) is reached after %.2f seconds.\n", IterMax, (float)1.0*(Abc_Clock() - clkStart)/CLOCKS_PER_SEC );
|
|
else if ( nAnds && nAndsMin <= nAnds )
|
|
printf( "Quality goal (%d nodes <= %d nodes) is achieved after %d iterations and %.2f seconds.\n",
|
|
nAndsMin, nAnds, i, (float)1.0*(Abc_Clock() - clkStart)/CLOCKS_PER_SEC );
|
|
return pNew;
|
|
}
|
|
Gia_Man_t * Gia_ManDeepSyn( Gia_Man_t * pGia, int nIters, int nNoImpr, int TimeOut, int nAnds, int Seed, int fUseTwo, int fVerbose )
|
|
{
|
|
Gia_Man_t * pInit = Gia_ManDup(pGia);
|
|
Gia_Man_t * pBest = Gia_ManDup(pGia);
|
|
Gia_Man_t * pThis;
|
|
int i;
|
|
for ( i = 0; i < nIters; i++ )
|
|
{
|
|
Abc_FrameUpdateGia( Abc_FrameGetGlobalFrame(), Gia_ManDup(pInit) );
|
|
pThis = Gia_ManDeepSynOne( nNoImpr, TimeOut, nAnds, Seed+i, fUseTwo, fVerbose );
|
|
if ( Gia_ManAndNum(pBest) > Gia_ManAndNum(pThis) )
|
|
{
|
|
Gia_ManStop( pBest );
|
|
pBest = pThis;
|
|
}
|
|
else
|
|
Gia_ManStop( pThis );
|
|
|
|
}
|
|
Gia_ManStop( pInit );
|
|
return pBest;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
ABC_NAMESPACE_IMPL_END
|
|
|