summaryrefslogtreecommitdiffstats
path: root/src/map/mpm/mpmTruth.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2013-07-12 19:33:46 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2013-07-12 19:33:46 -0700
commit7efe9f2afd033b4e9d171e87317d29d195255dc4 (patch)
treecca9eef9643290e403549ef75781c39a68ecf51e /src/map/mpm/mpmTruth.c
parent634dd6d030f5f54cfd0032be83ab10ec064530f1 (diff)
downloadabc-7efe9f2afd033b4e9d171e87317d29d195255dc4.tar.gz
abc-7efe9f2afd033b4e9d171e87317d29d195255dc4.tar.bz2
abc-7efe9f2afd033b4e9d171e87317d29d195255dc4.zip
New technology mapper.
Diffstat (limited to 'src/map/mpm/mpmTruth.c')
-rw-r--r--src/map/mpm/mpmTruth.c98
1 files changed, 97 insertions, 1 deletions
diff --git a/src/map/mpm/mpmTruth.c b/src/map/mpm/mpmTruth.c
index 0f9e877f..160ccee5 100644
--- a/src/map/mpm/mpmTruth.c
+++ b/src/map/mpm/mpmTruth.c
@@ -19,6 +19,7 @@
***********************************************************************/
#include "mpmInt.h"
+#include "misc/util/utilTruth.h"
ABC_NAMESPACE_IMPL_START
@@ -33,7 +34,7 @@ ABC_NAMESPACE_IMPL_START
/**Function*************************************************************
- Synopsis []
+ Synopsis [Performs truth table computation.]
Description []
@@ -42,6 +43,101 @@ ABC_NAMESPACE_IMPL_START
SeeAlso []
***********************************************************************/
+static inline int Mpm_CutTruthMinimize6( Mpm_Man_t * p, Mpm_Cut_t * pCut )
+{
+ unsigned uSupport;
+ int i, k, nSuppSize;
+ word t = *Mpm_CutTruth( p, Abc_Lit2Var(pCut->iFunc) );
+ // compute the support of the cut's function
+ uSupport = Abc_Tt6SupportAndSize( t, Mpm_CutLeafNum(pCut), &nSuppSize );
+ if ( nSuppSize == Mpm_CutLeafNum(pCut) )
+ return 0;
+ if ( nSuppSize < 2 )
+ p->nSmallSupp++;
+ // update leaves and signature
+ for ( i = k = 0; i < Mpm_CutLeafNum(pCut); i++ )
+ {
+ if ( !(uSupport & (1 << i)) )
+ continue;
+ if ( k < i )
+ {
+ pCut->pLeaves[k] = pCut->pLeaves[i];
+ Abc_TtSwapVars( &t, p->nLutSize, k, i );
+ }
+ k++;
+ }
+ assert( k == nSuppSize );
+ pCut->nLeaves = nSuppSize;
+ assert( nSuppSize == Abc_TtSupportSize(&t, Mpm_CutLeafNum(pCut)) );
+ // save the result
+ if ( t & 1 )
+ {
+ t = ~t;
+ pCut->iFunc = Abc_Var2Lit( Vec_MemHashInsert( p->vTtMem, &t ), 1 );
+ }
+ else
+ pCut->iFunc = Abc_Var2Lit( Vec_MemHashInsert( p->vTtMem, &t ), 0 );
+ return 1;
+}
+static inline word Mpm_TruthStretch6( word Truth, Mpm_Cut_t * pCut, Mpm_Cut_t * pCut0, int nLimit )
+{
+ int i, k;
+ for ( i = (int)pCut->nLeaves - 1, k = (int)pCut0->nLeaves - 1; i >= 0 && k >= 0; i-- )
+ {
+ if ( pCut0->pLeaves[k] < pCut->pLeaves[i] )
+ continue;
+ assert( pCut0->pLeaves[k] == pCut->pLeaves[i] );
+ if ( k < i )
+ Abc_TtSwapVars( &Truth, nLimit, k, i );
+ k--;
+ }
+ return Truth;
+}
+int Mpm_CutComputeTruth6( Mpm_Man_t * p, Mpm_Cut_t * pCut, Mpm_Cut_t * pCut0, Mpm_Cut_t * pCut1, Mpm_Cut_t * pCutC, int fCompl0, int fCompl1, int fComplC, int Type )
+{
+ word * pTruth0 = Mpm_CutTruth( p, Abc_Lit2Var(pCut0->iFunc) );
+ word * pTruth1 = Mpm_CutTruth( p, Abc_Lit2Var(pCut1->iFunc) );
+ word * pTruthC = NULL;
+ word t0 = (fCompl0 ^ pCut0->fCompl ^ Abc_LitIsCompl(pCut0->iFunc)) ? ~*pTruth0 : *pTruth0;
+ word t1 = (fCompl1 ^ pCut1->fCompl ^ Abc_LitIsCompl(pCut1->iFunc)) ? ~*pTruth1 : *pTruth1;
+ word tC, t;
+ t0 = Mpm_TruthStretch6( t0, pCut, pCut0, p->nLutSize );
+ t1 = Mpm_TruthStretch6( t1, pCut, pCut1, p->nLutSize );
+ if ( pCutC )
+ {
+ pTruthC = Mpm_CutTruth( p, Abc_Lit2Var(pCutC->iFunc) );
+ tC = (fComplC ^ pCutC->fCompl ^ Abc_LitIsCompl(pCutC->iFunc)) ? ~*pTruthC : *pTruthC;
+ tC = Mpm_TruthStretch6( tC, pCut, pCutC, p->nLutSize );
+ }
+ assert( p->nLutSize <= 6 );
+ if ( Type == 1 )
+ t = t0 & t1;
+ else if ( Type == 2 )
+ t = t0 ^ t1;
+ else if ( Type == 3 )
+ t = (tC & t1) | (~tC & t0);
+ else assert( 0 );
+ // save the result
+ if ( t & 1 )
+ {
+ t = ~t;
+ pCut->iFunc = Abc_Var2Lit( Vec_MemHashInsert( p->vTtMem, &t ), 1 );
+ }
+ else
+ pCut->iFunc = Abc_Var2Lit( Vec_MemHashInsert( p->vTtMem, &t ), 0 );
+
+#ifdef MPM_TRY_NEW
+ {
+ word tCopy = t;
+ char pCanonPerm[16];
+ Abc_TtCanonicize( &tCopy, pCut->nLimit, pCanonPerm );
+ }
+#endif
+
+// if ( p->pPars->fCutMin )
+// return Mpm_CutTruthMinimize6( p, pCut );
+ return 0;
+}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///