summaryrefslogtreecommitdiffstats
path: root/src/aig
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
parenta2c3c21031d0e83f15c8182924a908f54bbb5ab7 (diff)
downloadabc-07bf95f48019dd5472ffffbd32587879e1bcbb9f.tar.gz
abc-07bf95f48019dd5472ffffbd32587879e1bcbb9f.tar.bz2
abc-07bf95f48019dd5472ffffbd32587879e1bcbb9f.zip
Experiments with iterative synthesis.
Diffstat (limited to 'src/aig')
-rw-r--r--src/aig/gia/giaDeep.c107
-rw-r--r--src/aig/gia/giaSimBase.c22
2 files changed, 124 insertions, 5 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;
}
////////////////////////////////////////////////////////////////////////
diff --git a/src/aig/gia/giaSimBase.c b/src/aig/gia/giaSimBase.c
index efa4c187..f12cc83f 100644
--- a/src/aig/gia/giaSimBase.c
+++ b/src/aig/gia/giaSimBase.c
@@ -113,7 +113,13 @@ static inline void Gia_ManSimPatSimPo( Gia_Man_t * p, int i, Gia_Obj_t * pObj, i
word * pSims0 = pSims + nWords*Gia_ObjFaninId0(pObj, i);
word * pSims2 = pSims + nWords*i; int w;
for ( w = 0; w < nWords; w++ )
- pSims2[w] = (pSims0[w] ^ Diff0);
+ pSims2[w] = (pSims0[w] ^ Diff0);
+}
+static inline void Gia_ManSimPatSimNot( Gia_Man_t * p, int i, Gia_Obj_t * pObj, int nWords, Vec_Wrd_t * vSims )
+{
+ word * pSims = Vec_WrdArray(vSims) + nWords*i; int w;
+ for ( w = 0; w < nWords; w++ )
+ pSims[w] = ~pSims[w];
}
Vec_Wrd_t * Gia_ManSimPatSim( Gia_Man_t * pGia )
{
@@ -128,6 +134,20 @@ Vec_Wrd_t * Gia_ManSimPatSim( Gia_Man_t * pGia )
Gia_ManSimPatSimPo( pGia, Gia_ObjId(pGia, pObj), pObj, nWords, vSims );
return vSims;
}
+void Gia_ManSimPatResim( Gia_Man_t * pGia, Vec_Int_t * vObjs, int nWords, Vec_Wrd_t * vSims )
+{
+ Gia_Obj_t * pObj; int i;
+ Gia_ManForEachObjVec( vObjs, pGia, pObj, i )
+ if ( i == 0 )
+ Gia_ManSimPatSimNot( pGia, Gia_ObjId(pGia, pObj), pObj, nWords, vSims );
+ else if ( Gia_ObjIsAnd(pObj) )
+ Gia_ManSimPatSimAnd( pGia, Gia_ObjId(pGia, pObj), pObj, nWords, vSims );
+ else if ( !Gia_ObjIsCo(pObj) ) assert(0);
+}
+void Gia_ManSimPatWrite( char * pFileName, Vec_Wrd_t * vSimsIn, int nWords )
+{
+ Vec_WrdDumpHex( pFileName, vSimsIn, nWords, 0 );
+}
/**Function*************************************************************