summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAna Petkovska <lee.anna.loo@gmail.com>2016-06-18 18:51:38 +0200
committerAna Petkovska <lee.anna.loo@gmail.com>2016-06-18 18:51:38 +0200
commit8e5af90c41d9c0c364e01ae3e413a4e40cb8a1e0 (patch)
tree7822a3ba78daf4b3081ad1b554633bbb7979b382
parent6842b8cdbcf0605cdb12369e270bd61e0ea89276 (diff)
downloadabc-8e5af90c41d9c0c364e01ae3e413a4e40cb8a1e0.tar.gz
abc-8e5af90c41d9c0c364e01ae3e413a4e40cb8a1e0.tar.bz2
abc-8e5af90c41d9c0c364e01ae3e413a4e40cb8a1e0.zip
Return the class representative of each function.
-rw-r--r--src/base/abci/abcNpn.c6
-rw-r--r--src/opt/dau/dauCanon.c74
2 files changed, 62 insertions, 18 deletions
diff --git a/src/base/abci/abcNpn.c b/src/base/abci/abcNpn.c
index d2cac715..8335edda 100644
--- a/src/base/abci/abcNpn.c
+++ b/src/base/abci/abcNpn.c
@@ -181,7 +181,7 @@ void Abc_TruthNpnPerform( Abc_TtStore_t * p, int NpnType, int fVerbose )
char pCanonPerm[16];
unsigned uCanonPhase=0;
abctime clk = Abc_Clock();
- int i, nClasses = -1;
+ int i;
char * pAlgoName = NULL;
if ( NpnType == 0 )
@@ -309,12 +309,12 @@ void Abc_TruthNpnPerform( Abc_TtStore_t * p, int NpnType, int fVerbose )
// Extra_PrintHex( stdout, (unsigned *)p->pFuncs[i], p->nVars ), Abc_TruthNpnPrint(NULL, uCanonPhase, p->nVars), printf( "\n" );
printf( "\n" );
}
- nClasses = Abc_TtManNumClasses( pMan );
+ // nClasses = Abc_TtManNumClasses( pMan );
Abc_TtManStop( pMan );
}
else assert( 0 );
clk = Abc_Clock() - clk;
- printf( "Classes =%9d ", nClasses == -1 ? Abc_TruthNpnCountUnique(p) : nClasses );
+ printf( "Classes =%9d ", Abc_TruthNpnCountUnique(p) );
Abc_PrintTime( 1, "Time", clk );
}
diff --git a/src/opt/dau/dauCanon.c b/src/opt/dau/dauCanon.c
index dab214bb..c6ac8288 100644
--- a/src/opt/dau/dauCanon.c
+++ b/src/opt/dau/dauCanon.c
@@ -1059,8 +1059,27 @@ unsigned Abc_TtCanonicizePhase( word * pTruth, int nVars )
struct Abc_TtMan_t_
{
Vec_Mem_t * vTtMem[TT_NUM_TABLES]; // truth table memory and hash tables
+ Vec_Int_t ** vRepres; // pointers to the representatives from the last hierarchical level
};
+Vec_Int_t ** Abc_TtRepresStart() {
+ Vec_Int_t ** vRepres = ABC_ALLOC(Vec_Int_t *, TT_NUM_TABLES - 1);
+ int i;
+ // create a list of pointers for each level of the hierarchy
+ for (i = 0; i < (TT_NUM_TABLES - 1); i++) {
+ vRepres[i] = Vec_IntAlloc(1);
+ }
+ return vRepres;
+}
+
+void Abc_TtRepresStop(Vec_Int_t ** vRepres) {
+ int i;
+ for (i = 0; i < (TT_NUM_TABLES - 1); i++) {
+ Vec_IntFree(vRepres[i]);
+ }
+ ABC_FREE( vRepres );
+}
+
Abc_TtMan_t * Abc_TtManStart( int nVars )
{
Abc_TtMan_t * p = ABC_CALLOC( Abc_TtMan_t, 1 );
@@ -1070,6 +1089,7 @@ Abc_TtMan_t * Abc_TtManStart( int nVars )
p->vTtMem[i] = Vec_MemAlloc( nWords, 12 );
Vec_MemHashAlloc( p->vTtMem[i], 10000 );
}
+ p->vRepres = Abc_TtRepresStart();
return p;
}
void Abc_TtManStop( Abc_TtMan_t * p )
@@ -1080,6 +1100,7 @@ void Abc_TtManStop( Abc_TtMan_t * p )
Vec_MemHashFree( p->vTtMem[i] );
Vec_MemFreeP( &p->vTtMem[i] );
}
+ Abc_TtRepresStop(p->vRepres);
ABC_FREE( p );
}
int Abc_TtManNumClasses( Abc_TtMan_t * p )
@@ -1096,6 +1117,9 @@ unsigned Abc_TtCanonicizeHie( Abc_TtMan_t * p, word * pTruthInit, int nVars, cha
int nOnes, nWords = Abc_TtWordNum( nVars );
int i, k, truthId;
int * pSpot;
+ int vTruthId[TT_NUM_TABLES-1];
+ int fLevelFound;
+ word * pRepTruth;
assert( nVars <= 16 );
Abc_TtCopy( pTruth, pTruthInit, nWords, 0 );
@@ -1113,9 +1137,11 @@ unsigned Abc_TtCanonicizeHie( Abc_TtMan_t * p, word * pTruthInit, int nVars, cha
}
// check cache
pSpot = Vec_MemHashLookup( p->vTtMem[0], pTruth );
- if ( *pSpot != -1 )
- return 0;
- truthId = Vec_MemHashInsert( p->vTtMem[0], pTruth );
+ if ( *pSpot != -1 ) {
+ fLevelFound = 0;
+ goto end_repres;
+ }
+ vTruthId[0] = Vec_MemHashInsert( p->vTtMem[0], pTruth );
// normalize phase
Abc_TtCountOnesInCofs( pTruth, nVars, pStore );
@@ -1130,9 +1156,11 @@ unsigned Abc_TtCanonicizeHie( Abc_TtMan_t * p, word * pTruthInit, int nVars, cha
}
// check cache
pSpot = Vec_MemHashLookup( p->vTtMem[1], pTruth );
- if ( *pSpot != -1 )
- return 0;
- truthId = Vec_MemHashInsert( p->vTtMem[1], pTruth );
+ if ( *pSpot != -1 ) {
+ fLevelFound = 1;
+ goto end_repres;
+ }
+ vTruthId[1] = Vec_MemHashInsert( p->vTtMem[1], pTruth );
// normalize permutation
{
@@ -1157,9 +1185,11 @@ unsigned Abc_TtCanonicizeHie( Abc_TtMan_t * p, word * pTruthInit, int nVars, cha
}
// check cache
pSpot = Vec_MemHashLookup( p->vTtMem[2], pTruth );
- if ( *pSpot != -1 )
- return 0;
- truthId = Vec_MemHashInsert( p->vTtMem[2], pTruth );
+ if ( *pSpot != -1 ) {
+ fLevelFound = 2;
+ goto end_repres;
+ }
+ vTruthId[2] = Vec_MemHashInsert( p->vTtMem[2], pTruth );
// iterate TT permutations for tied variables
for ( k = 0; k < 5; k++ )
@@ -1179,9 +1209,11 @@ unsigned Abc_TtCanonicizeHie( Abc_TtMan_t * p, word * pTruthInit, int nVars, cha
}
// check cache
pSpot = Vec_MemHashLookup( p->vTtMem[3], pTruth );
- if ( *pSpot != -1 )
- return 0;
- truthId = Vec_MemHashInsert( p->vTtMem[3], pTruth );
+ if ( *pSpot != -1 ) {
+ fLevelFound = 3;
+ goto end_repres;
+ }
+ vTruthId[3] = Vec_MemHashInsert( p->vTtMem[3], pTruth );
// perform exact NPN using groups
if ( fExact ) {
@@ -1224,9 +1256,21 @@ unsigned Abc_TtCanonicizeHie( Abc_TtMan_t * p, word * pTruthInit, int nVars, cha
}
// check cache
pSpot = Vec_MemHashLookup( p->vTtMem[4], pTruth );
- if ( *pSpot != -1 )
- return 0;
- truthId = Vec_MemHashInsert( p->vTtMem[4], pTruth );
+ fLevelFound = 4;
+ if ( *pSpot != -1 ) {
+ goto end_repres;
+ }
+ *pSpot = Vec_MemHashInsert( p->vTtMem[4], pTruth );
+
+end_repres:
+ // return the class representative
+ if(fLevelFound < (TT_NUM_TABLES - 1))
+ truthId = Vec_IntEntry(p->vRepres[fLevelFound], *pSpot);
+ else truthId = *pSpot;
+ for(i = 0; i < fLevelFound; i++)
+ Vec_IntSetEntry(p->vRepres[i], vTruthId[i], truthId);
+ pRepTruth = Vec_MemReadEntry(p->vTtMem[TT_NUM_TABLES-1], truthId);
+ Abc_TtCopy( pTruthInit, pRepTruth, nWords, 0 );
return 0;
}