summaryrefslogtreecommitdiffstats
path: root/src/map
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2016-08-08 18:20:05 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2016-08-08 18:20:05 -0700
commit693b587c5cfa624e6cae086ab7ae47ab9f72d082 (patch)
treefcb90aa617c8195db2b6fa802f9c799a6e8ddd48 /src/map
parent713976f2cf07448212d997289714a12c976b010f (diff)
downloadabc-693b587c5cfa624e6cae086ab7ae47ab9f72d082.tar.gz
abc-693b587c5cfa624e6cae086ab7ae47ab9f72d082.tar.bz2
abc-693b587c5cfa624e6cae086ab7ae47ab9f72d082.zip
Adding truth table occurrence counters for 'if -c'.
Diffstat (limited to 'src/map')
-rw-r--r--src/map/if/if.h1
-rw-r--r--src/map/if/ifMan.c8
-rw-r--r--src/map/if/ifTruth.c5
3 files changed, 14 insertions, 0 deletions
diff --git a/src/map/if/if.h b/src/map/if/if.h
index 5f86ef5c..e822a0ad 100644
--- a/src/map/if/if.h
+++ b/src/map/if/if.h
@@ -253,6 +253,7 @@ struct If_Man_t_
Vec_Str_t * vTtPerms[IF_MAX_FUNC_LUTSIZE+1]; // mapping of truth table into permutations
Vec_Str_t * vTtVars[IF_MAX_FUNC_LUTSIZE+1]; // mapping of truth table into selected vars
Vec_Int_t * vTtDecs[IF_MAX_FUNC_LUTSIZE+1]; // mapping of truth table into decomposition pattern
+ Vec_Int_t * vTtOccurs[IF_MAX_FUNC_LUTSIZE+1];// truth table occurange counters
Hash_IntMan_t * vPairHash; // hashing pairs of truth tables
Vec_Int_t * vPairRes; // resulting truth table
Vec_Str_t * vPairPerms; // resulting permutation
diff --git a/src/map/if/ifMan.c b/src/map/if/ifMan.c
index 8f5a5c48..414a1911 100644
--- a/src/map/if/ifMan.c
+++ b/src/map/if/ifMan.c
@@ -125,6 +125,12 @@ If_Man_t * If_ManStart( If_Par_t * pPars )
Vec_StrFill( p->vPairPerms, p->pPars->nLutSize, 0 );
p->vPairRes = Vec_IntAlloc( 1000 );
Vec_IntPush( p->vPairRes, -1 );
+ for ( v = 6; v <= Abc_MaxInt(6,p->pPars->nLutSize); v++ )
+ p->vTtOccurs[v] = Vec_IntAlloc( 1000 );
+ for ( v = 0; v < 6; v++ )
+ p->vTtOccurs[v] = p->vTtOccurs[6];
+ for ( v = 6; v <= Abc_MaxInt(6,p->pPars->nLutSize); v++ )
+ Vec_IntPushTwo( p->vTtOccurs[v], 0, 0 );
}
if ( pPars->fUseCofVars )
{
@@ -274,6 +280,8 @@ void If_ManStop( If_Man_t * p )
Vec_MemFreeP( &p->vTtMem[i] );
for ( i = 6; i <= Abc_MaxInt(6,p->pPars->nLutSize); i++ )
Vec_WecFreeP( &p->vTtIsops[i] );
+ for ( i = 6; i <= Abc_MaxInt(6,p->pPars->nLutSize); i++ )
+ Vec_IntFreeP( &p->vTtOccurs[i] );
Mem_FixedStop( p->pMemObj, 0 );
ABC_FREE( p->pMemCi );
ABC_FREE( p->pMemAnd );
diff --git a/src/map/if/ifTruth.c b/src/map/if/ifTruth.c
index 91e6adcf..7c8892d3 100644
--- a/src/map/if/ifTruth.c
+++ b/src/map/if/ifTruth.c
@@ -244,10 +244,15 @@ p->timeCache[3] += Abc_Clock() - clk;
else
assert( pCut->uSign == If_ObjCutSignCompute( pCut ) );
+ assert( Vec_IntSize(p->vTtOccurs[pCut->nLeaves]) == Vec_MemEntryNum(p->vTtMem[pCut->nLeaves]) );
// hash function
fCompl = ((p->uCanonPhase >> pCut->nLeaves) & 1);
truthId = Vec_MemHashInsert( p->vTtMem[pCut->nLeaves], pTruth );
pCut->iCutFunc = Abc_Var2Lit( truthId, fCompl );
+ // count how many time this truth table is used
+ if ( Vec_IntSize(p->vTtOccurs[pCut->nLeaves]) < Vec_MemEntryNum(p->vTtMem[pCut->nLeaves]) )
+ Vec_IntPush( p->vTtOccurs[pCut->nLeaves], 0 );
+ Vec_IntAddToEntry( p->vTtOccurs[pCut->nLeaves], truthId, 1 );
if ( fVerbose )
{