summaryrefslogtreecommitdiffstats
path: root/src/aig/gia/giaDeep.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2020-09-13 19:17:16 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2020-09-13 19:17:16 -0700
commit07bf95f48019dd5472ffffbd32587879e1bcbb9f (patch)
tree4d3b7257499d4b3c017f1f15dfda9ddbfad87ce2 /src/aig/gia/giaDeep.c
parenta2c3c21031d0e83f15c8182924a908f54bbb5ab7 (diff)
downloadabc-07bf95f48019dd5472ffffbd32587879e1bcbb9f.tar.gz
abc-07bf95f48019dd5472ffffbd32587879e1bcbb9f.tar.bz2
abc-07bf95f48019dd5472ffffbd32587879e1bcbb9f.zip
Experiments with iterative synthesis.
Diffstat (limited to 'src/aig/gia/giaDeep.c')
-rw-r--r--src/aig/gia/giaDeep.c107
1 files changed, 103 insertions, 4 deletions
diff --git a/src/aig/gia/giaDeep.c b/src/aig/gia/giaDeep.c
index f8b2930e..aa9e9cb2 100644
--- a/src/aig/gia/giaDeep.c
+++ b/src/aig/gia/giaDeep.c
@@ -19,14 +19,14 @@
***********************************************************************/
#include "gia.h"
+#include "base/main/main.h"
+#include "base/cmd/cmd.h"
ABC_NAMESPACE_IMPL_START
-
////////////////////////////////////////////////////////////////////////
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
-
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
@@ -43,9 +43,108 @@ ABC_NAMESPACE_IMPL_START
SeeAlso []
***********************************************************************/
-Gia_Man_t * Gia_ManDeepSyn( Gia_Man_t * pGia, int TimeOut, int nAnds, int Seed, int fVerbose )
+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++ )
+ {
+ 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[1000];
+ char * pComp = NULL;
+ if ( fCom == 3 )
+ pComp = "; &put; compress2rs; compress2rs; compress2rs; &get";
+ else if ( fCom == 2 )
+ pComp = "; &put; compress2rs; compress2rs; &get";
+ else if ( fCom == 1 )
+ pComp = "; &put; compress2rs; &get";
+ else if ( fCom == 0 )
+ pComp = "; &dc2";
+ sprintf( Command, "&dch%s; &if -a -K %d; &mfs -e -W 20 -L 20%s%s",
+ fDch ? " -f" : "", KLut, fFx ? "; &fx" : "", pComp );
+ if ( Cmd_CommandExecute(Abc_FrameGetGlobalFrame(), Command) )
+ {
+ Abc_Print( 1, "Something did not work out with the command \"%s\".\n", Command );
+ return NULL;
+ }
+ 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 )
+ {
+ 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 )
{
- return NULL;
+ 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;
}
////////////////////////////////////////////////////////////////////////