summaryrefslogtreecommitdiffstats
path: root/src/base/abci/abcNpn.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2012-08-23 22:20:27 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2012-08-23 22:20:27 -0700
commit12c776ed6e5a17a491fdb986ccce99649a06850e (patch)
tree145b38b8bc8af627be07e3d615fb3934cb66a6f7 /src/base/abci/abcNpn.c
parent261bd7f86555e2e0550fd622806d5995a8a8c390 (diff)
downloadabc-12c776ed6e5a17a491fdb986ccce99649a06850e.tar.gz
abc-12c776ed6e5a17a491fdb986ccce99649a06850e.tar.bz2
abc-12c776ed6e5a17a491fdb986ccce99649a06850e.zip
Added new algorithm for NPN semi-canonical form computation.
Diffstat (limited to 'src/base/abci/abcNpn.c')
-rw-r--r--src/base/abci/abcNpn.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/base/abci/abcNpn.c b/src/base/abci/abcNpn.c
index 5c21d98e..70c08da7 100644
--- a/src/base/abci/abcNpn.c
+++ b/src/base/abci/abcNpn.c
@@ -110,6 +110,8 @@ void Abc_TruthNpnPerform( Abc_TtStore_t * p, int NpnType, int fVerbose )
pAlgoName = "minimizing TT";
else if ( NpnType == 3 )
pAlgoName = "exact NPN ";
+ else if ( NpnType == 4 )
+ pAlgoName = "heuristic NPN";
assert( p->nVars <= 16 );
if ( pAlgoName )
@@ -150,7 +152,7 @@ void Abc_TruthNpnPerform( Abc_TtStore_t * p, int NpnType, int fVerbose )
{
if ( fVerbose )
printf( "%7d : ", i );
- *((word *)p->pFuncs[i]) = Extra_Truth6Minimum( *((word *)p->pFuncs[i]), pComp, pPerm );
+ *((word *)p->pFuncs[i]) = Extra_Truth6MinimumExact( *((word *)p->pFuncs[i]), pComp, pPerm );
if ( fVerbose )
Extra_PrintHex( stdout, (unsigned *)p->pFuncs[i], p->nVars ), printf( "\n" );
}
@@ -160,6 +162,23 @@ void Abc_TruthNpnPerform( Abc_TtStore_t * p, int NpnType, int fVerbose )
ABC_FREE( pComp );
ABC_FREE( pPerm );
}
+ else if ( NpnType == 4 )
+ {
+ if ( p->nVars == 6 )
+ {
+ for ( i = 0; i < p->nFuncs; i++ )
+ {
+ if ( fVerbose )
+ printf( "%7d : ", i );
+ Kit_TruthSemiCanonicize( (unsigned *)p->pFuncs[i], pAux, p->nVars, pCanonPerm, pStore );
+ *((word *)p->pFuncs[i]) = Extra_Truth6MinimumHeuristic( *((word *)p->pFuncs[i]) );
+ if ( fVerbose )
+ Extra_PrintHex( stdout, (unsigned *)p->pFuncs[i], p->nVars ), printf( "\n" );
+ }
+ }
+ else
+ printf( "This feature only works for 6-variable functions.\n" );
+ }
else assert( 0 );
clk = clock() - clk;
@@ -213,7 +232,7 @@ int Abc_NpnTest( char * pFileName, int NpnType, int fVerbose )
printf( "Using truth tables from file \"%s\"...\n", pFileName );
if ( NpnType == 0 )
Abc_TtStoreTest( pFileName );
- else if ( NpnType >= 1 && NpnType <= 3 )
+ else if ( NpnType >= 1 && NpnType <= 4 )
Abc_TruthNpnTest( pFileName, NpnType, fVerbose );
else
printf( "Unknown canonical form value (%d).\n", NpnType );