summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2013-09-09 10:44:19 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2013-09-09 10:44:19 -0700
commit649222e4d021fb01584d940de91d82d0d319bc1d (patch)
tree3e78375f1613b114b8460a6e59b18d0af1ce26b1 /src
parentc05e141d1f7e3ad8f491fe0a4e185137f95fea5e (diff)
downloadabc-649222e4d021fb01584d940de91d82d0d319bc1d.tar.gz
abc-649222e4d021fb01584d940de91d82d0d319bc1d.tar.bz2
abc-649222e4d021fb01584d940de91d82d0d319bc1d.zip
Improvements to the new technology mapper.
Diffstat (limited to 'src')
-rw-r--r--src/aig/gia/giaJf.c44
1 files changed, 25 insertions, 19 deletions
diff --git a/src/aig/gia/giaJf.c b/src/aig/gia/giaJf.c
index 7e48efd2..f8ac2b29 100644
--- a/src/aig/gia/giaJf.c
+++ b/src/aig/gia/giaJf.c
@@ -319,16 +319,18 @@ static inline float Jf_CutFlow( Jf_Man_t * p, int * pCut )
SeeAlso []
***********************************************************************/
-static inline int Jf_CutMerge2( int * pCut0, int * pCut1, int * pCut, int LutSize )
+static inline int Jf_CutMergeOrder( int * pCut0, int * pCut1, int * pCut, int LutSize )
{
+ int nSize0 = Jf_CutSize(pCut0);
+ int nSize1 = Jf_CutSize(pCut1);
int * pC0 = pCut0 + 1;
int * pC1 = pCut1 + 1;
int * pC = pCut + 1;
int i, k, c, s;
// the case of the largest cut sizes
- if ( pCut0[0] == LutSize && pCut1[0] == LutSize )
+ if ( nSize0 == LutSize && nSize1 == LutSize )
{
- for ( i = 0; i < pCut0[0]; i++ )
+ for ( i = 0; i < nSize0; i++ )
{
if ( pC0[i] != pC1[i] )
return 0;
@@ -345,31 +347,31 @@ static inline int Jf_CutMerge2( int * pCut0, int * pCut1, int * pCut, int LutSiz
if ( pC0[i] < pC1[k] )
{
pC[c++] = pC0[i++];
- if ( i >= pCut0[0] ) goto FlushCut1;
+ if ( i >= nSize0 ) goto FlushCut1;
}
else if ( pC0[i] > pC1[k] )
{
pC[c++] = pC1[k++];
- if ( k >= pCut1[0] ) goto FlushCut0;
+ if ( k >= nSize1 ) goto FlushCut0;
}
else
{
pC[c++] = pC0[i++]; k++;
- if ( i >= pCut0[0] ) goto FlushCut1;
- if ( k >= pCut1[0] ) goto FlushCut0;
+ if ( i >= nSize0 ) goto FlushCut1;
+ if ( k >= nSize1 ) goto FlushCut0;
}
}
FlushCut0:
- if ( c + pCut0[0] > LutSize + i ) return 0;
- while ( i < pCut0[0] )
+ if ( c + nSize0 > LutSize + i ) return 0;
+ while ( i < nSize0 )
pC[c++] = pC0[i++];
pCut[0] = c;
return 1;
FlushCut1:
- if ( c + pCut1[0] > LutSize + k ) return 0;
- while ( k < pCut1[0] )
+ if ( c + nSize1 > LutSize + k ) return 0;
+ while ( k < nSize1 )
pC[c++] = pC1[k++];
pCut[0] = c;
return 1;
@@ -445,7 +447,7 @@ static inline int Jf_CutIsContained( int * pBase, int * pCut ) // check if pCut
return 0;
return 1;
}
-static inline int Jf_CutMerge8( int * pCut0, int * pCut1, int * pCut, int LutSize )
+static inline int Jf_CutMerge1( int * pCut0, int * pCut1, int * pCut, int LutSize )
{
int nSize0 = Jf_CutSize(pCut0);
int nSize1 = Jf_CutSize(pCut1), i;
@@ -766,10 +768,11 @@ void Jf_ObjComputeCuts( Jf_Man_t * p, Gia_Obj_t * pObj )
Jf_Cut_t Sto[JF_CUT_MAX+1]; // cut storage
Jf_Cut_t * pSto[JF_CUT_MAX+1]; // pointers to cut storage
int * pCut0, * pCut1, * pCuts0, * pCuts1;
+ int iDsdLit0, iDsdLit1;
int Config, i, k, c = 0;
// prepare cuts
for ( i = 0; i <= CutNum; i++ )
- pSto[i] = Sto + i;
+ pSto[i] = Sto + i, pSto[i]->iFunc = pSto[i]->Cost = 0;
// compute signatures
pCuts0 = Jf_ObjCuts( p, Gia_ObjFaninId0(pObj, iObj) );
Jf_ObjForEachCut( pCuts0, pCut0, i )
@@ -786,19 +789,22 @@ void Jf_ObjComputeCuts( Jf_Man_t * p, Gia_Obj_t * pObj )
if ( Jf_CountBits(Sign0[i] | Sign1[k]) > LutSize )
continue;
p->CutCount[1]++;
- if ( !(Config = Jf_CutMerge(pCut0, pCut1, pSto[c]->pCut, LutSize)) )
- continue;
- pSto[c]->iFunc = pSto[c]->Cost = 0;
if ( p->pPars->fCutMin )
{
- int iDsdLit0 = Abc_LitNotCond( Jf_CutFunc(pCut0), Gia_ObjFaninC0(pObj) );
- int iDsdLit1 = Abc_LitNotCond( Jf_CutFunc(pCut1), Gia_ObjFaninC1(pObj) );
+ if ( !(Config = Jf_CutMerge(pCut0, pCut1, pSto[c]->pCut, LutSize)) )
+ continue;
+ iDsdLit0 = Abc_LitNotCond( Jf_CutFunc(pCut0), Gia_ObjFaninC0(pObj) );
+ iDsdLit1 = Abc_LitNotCond( Jf_CutFunc(pCut1), Gia_ObjFaninC1(pObj) );
pSto[c]->iFunc = Sdm_ManComputeFunc( p->pDsd, iDsdLit0, iDsdLit1, pSto[c]->pCut, Config, 0 );
-// pSto[c]->iFunc = Sdm_ManComputeFunc( p->pDsd, iDsdLit0, iDsdLit1, NULL, Config, 0 );
if ( pSto[c]->iFunc == -1 )
continue;
//pSto[c]->Cost = Sdm_ManReadCnfSize( p->pDsd, Abc_Lit2Var(pSto[c]->iFunc) );
}
+ else
+ {
+ if ( !Jf_CutMergeOrder(pCut0, pCut1, pSto[c]->pCut, LutSize) )
+ continue;
+ }
// Jf_CutCheck( pSto[c]->pCut );
p->CutCount[2]++;
pSto[c]->Sign = p->pPars->fCutMin ? Jf_CutGetSign(pSto[c]->pCut) : Sign0[i] | Sign1[k];