Commit 2f926f2f by Alan Mishchenko

Improving cut computation.

parent 7d500c89
...@@ -1291,7 +1291,7 @@ Gia_Man_t * Gia_ManFromIfLogic( If_Man_t * pIfMan ) ...@@ -1291,7 +1291,7 @@ Gia_Man_t * Gia_ManFromIfLogic( If_Man_t * pIfMan )
{ {
pCutBest = If_ObjCutBest( pIfObj ); pCutBest = If_ObjCutBest( pIfObj );
// perform sorting of cut leaves by delay, so that the slowest pin drives the fastest input of the LUT // perform sorting of cut leaves by delay, so that the slowest pin drives the fastest input of the LUT
if ( !pIfMan->pPars->fDelayOpt && !pIfMan->pPars->pLutStruct && !pIfMan->pPars->fUserRecLib && !pIfMan->pPars->nGateSize && !pIfMan->pPars->fEnableCheck75 && !pIfMan->pPars->fEnableCheck75u && !pIfMan->pPars->fEnableCheck07 ) if ( !pIfMan->pPars->fUseTtPerm && !pIfMan->pPars->fDelayOpt && !pIfMan->pPars->pLutStruct && !pIfMan->pPars->fUserRecLib && !pIfMan->pPars->nGateSize && !pIfMan->pPars->fEnableCheck75 && !pIfMan->pPars->fEnableCheck75u && !pIfMan->pPars->fEnableCheck07 )
If_CutRotatePins( pIfMan, pCutBest ); If_CutRotatePins( pIfMan, pCutBest );
// collect leaves of the best cut // collect leaves of the best cut
Vec_IntClear( vLeaves ); Vec_IntClear( vLeaves );
......
...@@ -594,6 +594,8 @@ static inline int Jf_CutMergeOrder( int * pCut0, int * pCut1, int * pCut, int Lu ...@@ -594,6 +594,8 @@ static inline int Jf_CutMergeOrder( int * pCut0, int * pCut1, int * pCut, int Lu
} }
// compare two cuts with different numbers // compare two cuts with different numbers
i = k = c = s = 0; i = k = c = s = 0;
if ( nSize0 == 0 ) goto FlushCut1;
if ( nSize1 == 0 ) goto FlushCut0;
while ( 1 ) while ( 1 )
{ {
if ( c == LutSize ) return 0; if ( c == LutSize ) return 0;
......
...@@ -534,14 +534,7 @@ static inline int Kf_SetCutIsContainedSimple( Kf_Cut_t * pBase, Kf_Cut_t * pCut ...@@ -534,14 +534,7 @@ static inline int Kf_SetCutIsContainedSimple( Kf_Cut_t * pBase, Kf_Cut_t * pCut
int * pB = pBase->pLeaves; int * pB = pBase->pLeaves;
int * pC = pCut->pLeaves; int * pC = pCut->pLeaves;
int i, k; int i, k;
if ( nSizeB == nSizeC ) assert( nSizeB >= nSizeC );
{
for ( i = 0; i < nSizeB; i++ )
if ( pBase->pLeaves[i] != pCut->pLeaves[i] )
return 0;
return 1;
}
assert( nSizeB > nSizeC );
for ( i = 0; i < nSizeC; i++ ) for ( i = 0; i < nSizeC; i++ )
{ {
for ( k = 0; k < nSizeB; k++ ) for ( k = 0; k < nSizeB; k++ )
...@@ -560,17 +553,6 @@ static inline int Kf_SetMergeSimpleOne( Kf_Cut_t * pCut0, Kf_Cut_t * pCut1, Kf_C ...@@ -560,17 +553,6 @@ static inline int Kf_SetMergeSimpleOne( Kf_Cut_t * pCut0, Kf_Cut_t * pCut1, Kf_C
int * pC1 = pCut1->pLeaves; int * pC1 = pCut1->pLeaves;
int * pC = pCut->pLeaves; int * pC = pCut->pLeaves;
int i, k, c; int i, k, c;
// the case of the largest cut sizes
if ( nSize0 == nLutSize && nSize1 == nLutSize )
{
for ( i = 0; i < nSize0; i++ )
{
if ( pC0[i] != pC1[i] ) return 0;
pC[i] = pC0[i];
}
pCut->nLeaves = nLutSize;
return 1;
}
// compare two cuts with different numbers // compare two cuts with different numbers
c = nSize0; c = nSize0;
for ( i = 0; i < nSize1; i++ ) for ( i = 0; i < nSize1; i++ )
......
...@@ -15118,7 +15118,7 @@ int Abc_CommandIf( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -15118,7 +15118,7 @@ int Abc_CommandIf( Abc_Frame_t * pAbc, int argc, char ** argv )
pPars->fTruth = 1; pPars->fTruth = 1;
pPars->fCutMin = 1; pPars->fCutMin = 1;
pPars->fExpRed = 0; pPars->fExpRed = 0;
pPars->fUsePerm = 1; pPars->fUsePerm = pPars->fUseDsd;
} }
if ( pPars->fUseDsd ) if ( pPars->fUseDsd )
...@@ -29867,7 +29867,7 @@ int Abc_CommandAbc9If( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -29867,7 +29867,7 @@ int Abc_CommandAbc9If( Abc_Frame_t * pAbc, int argc, char ** argv )
pPars->fTruth = 1; pPars->fTruth = 1;
pPars->fCutMin = 1; pPars->fCutMin = 1;
pPars->fExpRed = 0; pPars->fExpRed = 0;
pPars->fUsePerm = 1; pPars->fUsePerm = pPars->fUseDsd;
} }
if ( pPars->fUseDsd ) if ( pPars->fUseDsd )
...@@ -29924,7 +29924,7 @@ usage: ...@@ -29924,7 +29924,7 @@ usage:
sprintf(LutSize, "library" ); sprintf(LutSize, "library" );
else else
sprintf(LutSize, "%d", pPars->nLutSize ); sprintf(LutSize, "%d", pPars->nLutSize );
Abc_Print( -2, "usage: &if [-KCFAGRT num] [-DEW float] [-S str] [-qarlepmsdbgyojikfucztncvh]\n" ); Abc_Print( -2, "usage: &if [-KCFAGRT num] [-DEW float] [-S str] [-qarlepmsdbgyojikfuztncvh]\n" );
Abc_Print( -2, "\t performs FPGA technology mapping of the network\n" ); Abc_Print( -2, "\t performs FPGA technology mapping of the network\n" );
Abc_Print( -2, "\t-K num : the number of LUT inputs (2 < num < %d) [default = %s]\n", IF_MAX_LUTSIZE+1, LutSize ); Abc_Print( -2, "\t-K num : the number of LUT inputs (2 < num < %d) [default = %s]\n", IF_MAX_LUTSIZE+1, LutSize );
Abc_Print( -2, "\t-C num : the max number of priority cuts (0 < num < 2^12) [default = %d]\n", pPars->nCutsMax ); Abc_Print( -2, "\t-C num : the max number of priority cuts (0 < num < 2^12) [default = %d]\n", pPars->nCutsMax );
...@@ -437,7 +437,7 @@ Abc_Obj_t * Abc_NodeFromIf_rec( Abc_Ntk_t * pNtkNew, If_Man_t * pIfMan, If_Obj_t ...@@ -437,7 +437,7 @@ Abc_Obj_t * Abc_NodeFromIf_rec( Abc_Ntk_t * pNtkNew, If_Man_t * pIfMan, If_Obj_t
pCutBest = If_ObjCutBest( pIfObj ); pCutBest = If_ObjCutBest( pIfObj );
// printf( "%d 0x%02X %d\n", pCutBest->nLeaves, 0xff & *If_CutTruth(pCutBest), pIfMan->pPars->pFuncCost(pCutBest) ); // printf( "%d 0x%02X %d\n", pCutBest->nLeaves, 0xff & *If_CutTruth(pCutBest), pIfMan->pPars->pFuncCost(pCutBest) );
// if ( pIfMan->pPars->pLutLib && pIfMan->pPars->pLutLib->fVarPinDelays ) // if ( pIfMan->pPars->pLutLib && pIfMan->pPars->pLutLib->fVarPinDelays )
if ( !pIfMan->pPars->fDelayOpt && !pIfMan->pPars->pLutStruct && !pIfMan->pPars->fUserRecLib && !pIfMan->pPars->nGateSize ) if ( !pIfMan->pPars->fUseTtPerm && !pIfMan->pPars->fDelayOpt && !pIfMan->pPars->pLutStruct && !pIfMan->pPars->fUserRecLib && !pIfMan->pPars->nGateSize )
If_CutRotatePins( pIfMan, pCutBest ); If_CutRotatePins( pIfMan, pCutBest );
if ( pIfMan->pPars->fUseCnfs || pIfMan->pPars->fUseMv ) if ( pIfMan->pPars->fUseCnfs || pIfMan->pPars->fUseMv )
{ {
......
...@@ -481,9 +481,11 @@ static inline void If_AndClear( If_And_t * pNode ) { * ...@@ -481,9 +481,11 @@ static inline void If_AndClear( If_And_t * pNode ) { *
extern int If_ManPerformMapping( If_Man_t * p ); extern int If_ManPerformMapping( If_Man_t * p );
extern int If_ManPerformMappingComb( If_Man_t * p ); extern int If_ManPerformMappingComb( If_Man_t * p );
/*=== ifCut.c ============================================================*/ /*=== ifCut.c ============================================================*/
extern int If_CutVerifyCuts( If_Set_t * pCutSet, int fOrdered );
extern int If_CutFilter( If_Set_t * pCutSet, If_Cut_t * pCut ); extern int If_CutFilter( If_Set_t * pCutSet, If_Cut_t * pCut );
extern void If_CutSort( If_Man_t * p, If_Set_t * pCutSet, If_Cut_t * pCut ); extern void If_CutSort( If_Man_t * p, If_Set_t * pCutSet, If_Cut_t * pCut );
extern void If_CutOrder( If_Cut_t * pCut ); extern void If_CutOrder( If_Cut_t * pCut );
extern int If_CutMergeOrdered( If_Man_t * p, If_Cut_t * pCut0, If_Cut_t * pCut1, If_Cut_t * pCut );
extern int If_CutMerge( If_Man_t * p, If_Cut_t * pCut0, If_Cut_t * pCut1, If_Cut_t * pCut ); extern int If_CutMerge( If_Man_t * p, If_Cut_t * pCut0, If_Cut_t * pCut1, If_Cut_t * pCut );
extern int If_CutCheck( If_Cut_t * pCut ); extern int If_CutCheck( If_Cut_t * pCut );
extern void If_CutPrint( If_Cut_t * pCut ); extern void If_CutPrint( If_Cut_t * pCut );
......
...@@ -79,14 +79,14 @@ void If_ManCacheAnalize( If_Man_t * p ) ...@@ -79,14 +79,14 @@ void If_ManCacheAnalize( If_Man_t * p )
{ {
uUnique = Vec_IntCountUnique(vTest[i]); uUnique = Vec_IntCountUnique(vTest[i]);
printf( "%2d-var entries = %8d. (%6.2f %%) Unique entries = %8d. (%6.2f %%)\n", printf( "%2d-var entries = %8d. (%6.2f %%) Unique entries = %8d. (%6.2f %%)\n",
i, Vec_IntSize(vTest[i]), 100.0*Vec_IntSize(vTest[i])/Vec_IntSize(vRes), i, Vec_IntSize(vTest[i]), 100.0*Vec_IntSize(vTest[i])/Abc_MaxInt(1, Vec_IntSize(vRes)),
uUnique, 100.0*uUnique/Vec_IntSize(vTest[i]) ); uUnique, 100.0*uUnique/Abc_MaxInt(1, Vec_IntSize(vTest[i])) );
} }
for ( i = 0; i <= p->pPars->nLutSize; i++ ) for ( i = 0; i <= p->pPars->nLutSize; i++ )
Vec_IntFree( vTest[i] ); Vec_IntFree( vTest[i] );
uUnique = Vec_IntCountUnique(vRes); uUnique = Vec_IntCountUnique(vRes);
printf( "Total entries = %8d. (%6.2f %%) Unique entries = %8d. (%6.2f %%)\n", printf( "Total entries = %8d. (%6.2f %%) Unique entries = %8d. (%6.2f %%)\n",
Vec_IntSize(p->vCutData)/4, 100.0, uUnique, 100.0*uUnique/(Vec_IntSize(p->vCutData)/4) ); Vec_IntSize(p->vCutData)/4, 100.0, uUnique, 100.0*uUnique/Abc_MaxInt(1, Vec_IntSize(p->vCutData)/4) );
Vec_IntFree( vRes ); Vec_IntFree( vRes );
} }
......
...@@ -33,7 +33,7 @@ ABC_NAMESPACE_IMPL_START ...@@ -33,7 +33,7 @@ ABC_NAMESPACE_IMPL_START
/**Function************************************************************* /**Function*************************************************************
Synopsis [Returns 1 if pDom is contained in pCut.] Synopsis [Check correctness of cuts.]
Description [] Description []
...@@ -42,24 +42,71 @@ ABC_NAMESPACE_IMPL_START ...@@ -42,24 +42,71 @@ ABC_NAMESPACE_IMPL_START
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
static inline int If_CutCheckDominance( If_Cut_t * pDom, If_Cut_t * pCut ) static inline int If_CutVerifyCut( If_Cut_t * pBase, If_Cut_t * pCut ) // check if pCut is contained in pBase
{ {
int nSizeB = pBase->nLeaves;
int nSizeC = pCut->nLeaves;
int * pB = pBase->pLeaves;
int * pC = pCut->pLeaves;
int i, k; int i, k;
for ( i = 0; i < (int)pDom->nLeaves; i++ ) for ( i = 0; i < nSizeC; i++ )
{ {
for ( k = 0; k < (int)pCut->nLeaves; k++ ) for ( k = 0; k < nSizeB; k++ )
if ( pDom->pLeaves[i] == pCut->pLeaves[k] ) if ( pC[i] == pB[k] )
break; break;
if ( k == (int)pCut->nLeaves ) // node i in pDom is not contained in pCut if ( k == nSizeB )
return 0; return 0;
} }
// every node in pDom is contained in pCut return 1;
}
int If_CutVerifyCuts( If_Set_t * pCutSet, int fOrdered )
{
static int Count = 0;
If_Cut_t * pCut0, * pCut1;
int i, k, m, n, Value;
assert( pCutSet->nCuts > 0 );
for ( i = 0; i < pCutSet->nCuts; i++ )
{
pCut0 = pCutSet->ppCuts[i];
if ( fOrdered )
{
// check duplicates
for ( m = 1; m < (int)pCut0->nLeaves; m++ )
assert( pCut0->pLeaves[m-1] < pCut0->pLeaves[m] );
}
else
{
// check duplicates
for ( m = 0; m < (int)pCut0->nLeaves; m++ )
for ( n = m+1; n < (int)pCut0->nLeaves; n++ )
assert( pCut0->pLeaves[m] != pCut0->pLeaves[n] );
}
// check pairs
for ( k = 0; k < pCutSet->nCuts; k++ )
{
pCut1 = pCutSet->ppCuts[k];
if ( pCut0 == pCut1 )
continue;
Count++;
// check containments
Value = If_CutVerifyCut( pCut0, pCut1 );
// assert( Value == 0 );
if ( Value )
{
assert( pCut0->uSign == If_ObjCutSignCompute(pCut0) );
assert( pCut1->uSign == If_ObjCutSignCompute(pCut1) );
If_CutPrint( pCut0 );
If_CutPrint( pCut1 );
assert( 0 );
}
}
}
return 1; return 1;
} }
/**Function************************************************************* /**Function*************************************************************
Synopsis [Returns 1 if pDom is equal to pCut.] Synopsis [Returns 1 if pDom is contained in pCut.]
Description [] Description []
...@@ -68,14 +115,19 @@ static inline int If_CutCheckDominance( If_Cut_t * pDom, If_Cut_t * pCut ) ...@@ -68,14 +115,19 @@ static inline int If_CutCheckDominance( If_Cut_t * pDom, If_Cut_t * pCut )
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
static inline int If_CutCheckEquality( If_Cut_t * pDom, If_Cut_t * pCut ) static inline int If_CutCheckDominance( If_Cut_t * pDom, If_Cut_t * pCut )
{ {
int i; int i, k;
if ( (int)pDom->nLeaves != (int)pCut->nLeaves ) assert( pDom->nLeaves <= pCut->nLeaves );
return 0;
for ( i = 0; i < (int)pDom->nLeaves; i++ ) for ( i = 0; i < (int)pDom->nLeaves; i++ )
if ( pDom->pLeaves[i] != pCut->pLeaves[i] ) {
for ( k = 0; k < (int)pCut->nLeaves; k++ )
if ( pDom->pLeaves[i] == pCut->pLeaves[k] )
break;
if ( k == (int)pCut->nLeaves ) // node i in pDom is not contained in pCut
return 0; return 0;
}
// every node in pDom is contained in pCut
return 1; return 1;
} }
...@@ -101,7 +153,7 @@ int If_CutFilter( If_Set_t * pCutSet, If_Cut_t * pCut ) ...@@ -101,7 +153,7 @@ int If_CutFilter( If_Set_t * pCutSet, If_Cut_t * pCut )
if ( pTemp->nLeaves > pCut->nLeaves ) if ( pTemp->nLeaves > pCut->nLeaves )
{ {
// do not fiter the first cut // do not fiter the first cut
if ( i == 0 ) if ( i == 0 && pCutSet->nCuts > 1 && pCutSet->ppCuts[1]->fUseless )
continue; continue;
// skip the non-contained cuts // skip the non-contained cuts
if ( (pTemp->uSign & pCut->uSign) != pCut->uSign ) if ( (pTemp->uSign & pCut->uSign) != pCut->uSign )
...@@ -136,93 +188,7 @@ int If_CutFilter( If_Set_t * pCutSet, If_Cut_t * pCut ) ...@@ -136,93 +188,7 @@ int If_CutFilter( If_Set_t * pCutSet, If_Cut_t * pCut )
/**Function************************************************************* /**Function*************************************************************
Synopsis [Merges two cuts.] Synopsis [Prepares the object for FPGA mapping.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
static inline int If_CutMergeOrderedOld( If_Cut_t * pC0, If_Cut_t * pC1, If_Cut_t * pC )
{
int i, k, c;
assert( pC0->nLeaves >= pC1->nLeaves );
// the case of the largest cut sizes
if ( pC0->nLeaves == pC->nLimit && pC1->nLeaves == pC->nLimit )
{
for ( i = 0; i < (int)pC0->nLeaves; i++ )
if ( pC0->pLeaves[i] != pC1->pLeaves[i] )
return 0;
for ( i = 0; i < (int)pC0->nLeaves; i++ )
pC->pLeaves[i] = pC0->pLeaves[i];
pC->nLeaves = pC0->nLeaves;
return 1;
}
// the case when one of the cuts is the largest
if ( pC0->nLeaves == pC->nLimit )
{
for ( i = 0; i < (int)pC1->nLeaves; i++ )
{
for ( k = (int)pC0->nLeaves - 1; k >= 0; k-- )
if ( pC0->pLeaves[k] == pC1->pLeaves[i] )
break;
if ( k == -1 ) // did not find
return 0;
}
for ( i = 0; i < (int)pC0->nLeaves; i++ )
pC->pLeaves[i] = pC0->pLeaves[i];
pC->nLeaves = pC0->nLeaves;
return 1;
}
// compare two cuts with different numbers
i = k = 0;
for ( c = 0; c < (int)pC->nLimit; c++ )
{
if ( k == (int)pC1->nLeaves )
{
if ( i == (int)pC0->nLeaves )
{
pC->nLeaves = c;
return 1;
}
pC->pLeaves[c] = pC0->pLeaves[i++];
continue;
}
if ( i == (int)pC0->nLeaves )
{
if ( k == (int)pC1->nLeaves )
{
pC->nLeaves = c;
return 1;
}
pC->pLeaves[c] = pC1->pLeaves[k++];
continue;
}
if ( pC0->pLeaves[i] < pC1->pLeaves[k] )
{
pC->pLeaves[c] = pC0->pLeaves[i++];
continue;
}
if ( pC0->pLeaves[i] > pC1->pLeaves[k] )
{
pC->pLeaves[c] = pC1->pLeaves[k++];
continue;
}
pC->pLeaves[c] = pC0->pLeaves[i++];
k++;
}
if ( i < (int)pC0->nLeaves || k < (int)pC1->nLeaves )
return 0;
pC->nLeaves = c;
return 1;
}
/**Function*************************************************************
Synopsis [Merges two cuts.]
Description [] Description []
...@@ -231,33 +197,35 @@ static inline int If_CutMergeOrderedOld( If_Cut_t * pC0, If_Cut_t * pC1, If_Cut_ ...@@ -231,33 +197,35 @@ static inline int If_CutMergeOrderedOld( If_Cut_t * pC0, If_Cut_t * pC1, If_Cut_
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
static inline int If_CutMergeOrdered( If_Man_t * p, If_Cut_t * pC0, If_Cut_t * pC1, If_Cut_t * pC ) int If_CutMergeOrdered_( If_Man_t * p, If_Cut_t * pC0, If_Cut_t * pC1, If_Cut_t * pC )
{ {
int nSizeC0 = pC0->nLeaves; int nSizeC0 = pC0->nLeaves;
int nSizeC1 = pC1->nLeaves; int nSizeC1 = pC1->nLeaves;
int nLimit = pC0->nLimit; int nLimit = pC0->nLimit;
int i, k, c, s; int i, k, c, s;
// the case when one of the cuts is the largest // both cuts are the largest
if ( nSizeC0 == nLimit ) if ( nSizeC0 == nLimit && nSizeC1 == nLimit )
{ {
// the case of the largest cut sizes for ( i = 0; i < nSizeC0; i++ )
if ( nSizeC1 == nLimit )
{ {
for ( i = 0; i < nSizeC0; i++ ) if ( pC0->pLeaves[i] != pC1->pLeaves[i] )
{ return 0;
if ( pC0->pLeaves[i] != pC1->pLeaves[i] ) p->pPerm[0][i] = p->pPerm[1][i] = p->pPerm[2][i] = i;
return 0; pC->pLeaves[i] = pC0->pLeaves[i];
p->pPerm[0][i] = p->pPerm[1][i] = p->pPerm[2][i] = i;
pC->pLeaves[i] = pC0->pLeaves[i];
}
pC->nLeaves = nLimit;
return 1;
} }
p->nShared = nLimit;
pC->nLeaves = nLimit;
pC->uSign = pC0->uSign | pC1->uSign;
p->uSharedMask = Abc_InfoMask( nLimit );
return 1;
} }
// compare two cuts with different numbers // compare two cuts with different numbers
i = k = c = s = 0; i = k = c = s = 0;
p->uSharedMask = 0;
if ( nSizeC0 == 0 ) goto FlushCut1;
if ( nSizeC1 == 0 ) goto FlushCut0;
while ( 1 ) while ( 1 )
{ {
if ( c == nLimit ) return 0; if ( c == nLimit ) return 0;
...@@ -265,20 +233,21 @@ static inline int If_CutMergeOrdered( If_Man_t * p, If_Cut_t * pC0, If_Cut_t * p ...@@ -265,20 +233,21 @@ static inline int If_CutMergeOrdered( If_Man_t * p, If_Cut_t * pC0, If_Cut_t * p
{ {
p->pPerm[0][i] = c; p->pPerm[0][i] = c;
pC->pLeaves[c++] = pC0->pLeaves[i++]; pC->pLeaves[c++] = pC0->pLeaves[i++];
if ( i >= nSizeC0 ) goto FlushCut1; if ( i == nSizeC0 ) goto FlushCut1;
} }
else if ( pC0->pLeaves[i] > pC1->pLeaves[k] ) else if ( pC0->pLeaves[i] > pC1->pLeaves[k] )
{ {
p->pPerm[1][k] = c; p->pPerm[1][k] = c;
pC->pLeaves[c++] = pC1->pLeaves[k++]; pC->pLeaves[c++] = pC1->pLeaves[k++];
if ( k >= nSizeC1 ) goto FlushCut0; if ( k == nSizeC1 ) goto FlushCut0;
} }
else else
{ {
p->uSharedMask |= (1 << c);
p->pPerm[0][i] = p->pPerm[1][k] = p->pPerm[2][s++] = c; p->pPerm[0][i] = p->pPerm[1][k] = p->pPerm[2][s++] = c;
pC->pLeaves[c++] = pC0->pLeaves[i++]; k++; pC->pLeaves[c++] = pC0->pLeaves[i++]; k++;
if ( i >= nSizeC0 ) goto FlushCut1; if ( i == nSizeC0 ) goto FlushCut1;
if ( k >= nSizeC1 ) goto FlushCut0; if ( k == nSizeC1 ) goto FlushCut0;
} }
} }
...@@ -289,7 +258,10 @@ FlushCut0: ...@@ -289,7 +258,10 @@ FlushCut0:
p->pPerm[0][i] = c; p->pPerm[0][i] = c;
pC->pLeaves[c++] = pC0->pLeaves[i++]; pC->pLeaves[c++] = pC0->pLeaves[i++];
} }
p->nShared = s;
pC->nLeaves = c; pC->nLeaves = c;
pC->uSign = pC0->uSign | pC1->uSign;
assert( c > 0 );
return 1; return 1;
FlushCut1: FlushCut1:
...@@ -299,91 +271,10 @@ FlushCut1: ...@@ -299,91 +271,10 @@ FlushCut1:
p->pPerm[1][k] = c; p->pPerm[1][k] = c;
pC->pLeaves[c++] = pC1->pLeaves[k++]; pC->pLeaves[c++] = pC1->pLeaves[k++];
} }
p->nShared = s;
pC->nLeaves = c; pC->nLeaves = c;
return 1; pC->uSign = pC0->uSign | pC1->uSign;
} assert( c > 0 );
/**Function*************************************************************
Synopsis [Merges two cuts.]
Description [Special case when the cut is known to exist.]
SideEffects []
SeeAlso []
***********************************************************************/
static inline int If_CutMergeOrdered2( If_Cut_t * pC0, If_Cut_t * pC1, If_Cut_t * pC )
{
int i, k, c;
assert( pC0->nLeaves >= pC1->nLeaves );
// copy the first cut
for ( i = 0; i < (int)pC0->nLeaves; i++ )
pC->pLeaves[i] = pC0->pLeaves[i];
pC->nLeaves = pC0->nLeaves;
// the case when one of the cuts is the largest
if ( pC0->nLeaves == pC->nLimit )
return 1;
// add nodes of the second cut
k = 0;
for ( i = 0; i < (int)pC1->nLeaves; i++ )
{
// find k-th node before which i-th node should be added
for ( ; k < (int)pC->nLeaves; k++ )
if ( pC->pLeaves[k] >= pC1->pLeaves[i] )
break;
// check the case when this should be the last node
if ( k == (int)pC->nLeaves )
{
pC->pLeaves[k++] = pC1->pLeaves[i];
pC->nLeaves++;
continue;
}
// check the case when equal node is found
if ( pC1->pLeaves[i] == pC->pLeaves[k] )
continue;
// add the node
for ( c = (int)pC->nLeaves; c > k; c-- )
pC->pLeaves[c] = pC->pLeaves[c-1];
pC->pLeaves[k++] = pC1->pLeaves[i];
pC->nLeaves++;
}
/*
assert( pC->nLeaves <= pC->nLimit );
for ( i = 1; i < (int)pC->nLeaves; i++ )
assert( pC->pLeaves[i-1] < pC->pLeaves[i] );
*/
return 1;
}
/**Function*************************************************************
Synopsis [Prepares the object for FPGA mapping.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int If_CutMerge2( If_Man_t * p, If_Cut_t * pCut0, If_Cut_t * pCut1, If_Cut_t * pCut )
{
assert( pCut->nLimit > 0 );
// merge the nodes
if ( pCut0->nLeaves < pCut1->nLeaves )
{
if ( !If_CutMergeOrdered( p, pCut1, pCut0, pCut ) )
return 0;
}
else
{
if ( !If_CutMergeOrdered( p, pCut0, pCut1, pCut ) )
return 0;
}
pCut->uSign = pCut0->uSign | pCut1->uSign;
assert( If_CutCheck( pCut ) );
return 1; return 1;
} }
...@@ -398,7 +289,7 @@ int If_CutMerge2( If_Man_t * p, If_Cut_t * pCut0, If_Cut_t * pCut1, If_Cut_t * p ...@@ -398,7 +289,7 @@ int If_CutMerge2( If_Man_t * p, If_Cut_t * pCut0, If_Cut_t * pCut1, If_Cut_t * p
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
int If_CutMerge( If_Man_t * p, If_Cut_t * pC0, If_Cut_t * pC1, If_Cut_t * pC ) int If_CutMergeOrdered( If_Man_t * p, If_Cut_t * pC0, If_Cut_t * pC1, If_Cut_t * pC )
{ {
int nSizeC0 = pC0->nLeaves; int nSizeC0 = pC0->nLeaves;
int nSizeC1 = pC1->nLeaves; int nSizeC1 = pC1->nLeaves;
...@@ -412,68 +303,33 @@ int If_CutMerge( If_Man_t * p, If_Cut_t * pC0, If_Cut_t * pC1, If_Cut_t * pC ) ...@@ -412,68 +303,33 @@ int If_CutMerge( If_Man_t * p, If_Cut_t * pC0, If_Cut_t * pC1, If_Cut_t * pC )
{ {
if ( pC0->pLeaves[i] != pC1->pLeaves[i] ) if ( pC0->pLeaves[i] != pC1->pLeaves[i] )
return 0; return 0;
p->pPerm[0][i] = p->pPerm[1][i] = p->pPerm[2][i] = i;
pC->pLeaves[i] = pC0->pLeaves[i]; pC->pLeaves[i] = pC0->pLeaves[i];
} }
p->nShared = nLimit;
pC->nLeaves = nLimit; pC->nLeaves = nLimit;
pC->uSign = pC0->uSign | pC1->uSign; pC->uSign = pC0->uSign | pC1->uSign;
p->uSharedMask = Abc_InfoMask( nLimit );
return 1;
}
// one cut is empty
if ( nSizeC0 == 0 )
{
assert( pC0->uSign == 0 );
for ( i = 0; i < nSizeC1; i++ )
{
pC->pLeaves[i] = pC1->pLeaves[i];
p->pPerm[1][i] = i;
}
p->nShared = 0;
pC->nLeaves = nSizeC1;
pC->uSign = pC0->uSign | pC1->uSign;
p->uSharedMask = 0;
return 1;
}
if ( nSizeC1 == 0 )
{
assert( pC1->uSign == 0 );
for ( i = 0; i < nSizeC0; i++ )
{
pC->pLeaves[i] = pC0->pLeaves[i];
p->pPerm[0][i] = i;
}
p->nShared = 0;
pC->nLeaves = nSizeC0;
pC->uSign = pC0->uSign | pC1->uSign;
p->uSharedMask = 0;
return 1; return 1;
} }
// compare two cuts with different numbers // compare two cuts with different numbers
i = k = c = s = 0; i = k = c = s = 0; p->nShared = 0;
p->uSharedMask = 0; if ( nSizeC0 == 0 ) goto FlushCut1;
if ( nSizeC1 == 0 ) goto FlushCut0;
while ( 1 ) while ( 1 )
{ {
if ( c == nLimit ) return 0; if ( c == nLimit ) return 0;
if ( pC0->pLeaves[i] < pC1->pLeaves[k] ) if ( pC0->pLeaves[i] < pC1->pLeaves[k] )
{ {
p->pPerm[0][i] = c;
pC->pLeaves[c++] = pC0->pLeaves[i++]; pC->pLeaves[c++] = pC0->pLeaves[i++];
if ( i == nSizeC0 ) goto FlushCut1; if ( i == nSizeC0 ) goto FlushCut1;
} }
else if ( pC0->pLeaves[i] > pC1->pLeaves[k] ) else if ( pC0->pLeaves[i] > pC1->pLeaves[k] )
{ {
p->pPerm[1][k] = c;
pC->pLeaves[c++] = pC1->pLeaves[k++]; pC->pLeaves[c++] = pC1->pLeaves[k++];
if ( k == nSizeC1 ) goto FlushCut0; if ( k == nSizeC1 ) goto FlushCut0;
} }
else else
{ {
p->uSharedMask |= (1 << c); pC->pLeaves[c++] = pC0->pLeaves[i++]; k++; p->nShared++;
p->pPerm[0][i] = p->pPerm[1][k] = p->pPerm[2][s++] = c;
pC->pLeaves[c++] = pC0->pLeaves[i++]; k++;
if ( i == nSizeC0 ) goto FlushCut1; if ( i == nSizeC0 ) goto FlushCut1;
if ( k == nSizeC1 ) goto FlushCut0; if ( k == nSizeC1 ) goto FlushCut0;
} }
...@@ -482,11 +338,7 @@ int If_CutMerge( If_Man_t * p, If_Cut_t * pC0, If_Cut_t * pC1, If_Cut_t * pC ) ...@@ -482,11 +338,7 @@ int If_CutMerge( If_Man_t * p, If_Cut_t * pC0, If_Cut_t * pC1, If_Cut_t * pC )
FlushCut0: FlushCut0:
if ( c + nSizeC0 > nLimit + i ) return 0; if ( c + nSizeC0 > nLimit + i ) return 0;
while ( i < nSizeC0 ) while ( i < nSizeC0 )
{
p->pPerm[0][i] = c;
pC->pLeaves[c++] = pC0->pLeaves[i++]; pC->pLeaves[c++] = pC0->pLeaves[i++];
}
p->nShared = s;
pC->nLeaves = c; pC->nLeaves = c;
pC->uSign = pC0->uSign | pC1->uSign; pC->uSign = pC0->uSign | pC1->uSign;
return 1; return 1;
...@@ -494,11 +346,7 @@ FlushCut0: ...@@ -494,11 +346,7 @@ FlushCut0:
FlushCut1: FlushCut1:
if ( c + nSizeC1 > nLimit + k ) return 0; if ( c + nSizeC1 > nLimit + k ) return 0;
while ( k < nSizeC1 ) while ( k < nSizeC1 )
{
p->pPerm[1][k] = c;
pC->pLeaves[c++] = pC1->pLeaves[k++]; pC->pLeaves[c++] = pC1->pLeaves[k++];
}
p->nShared = s;
pC->nLeaves = c; pC->nLeaves = c;
pC->uSign = pC0->uSign | pC1->uSign; pC->uSign = pC0->uSign | pC1->uSign;
return 1; return 1;
...@@ -515,6 +363,51 @@ FlushCut1: ...@@ -515,6 +363,51 @@ FlushCut1:
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
int If_CutMerge( If_Man_t * p, If_Cut_t * pCut0, If_Cut_t * pCut1, If_Cut_t * pCut )
{
int nLutSize = pCut0->nLimit;
int nSize0 = pCut0->nLeaves;
int nSize1 = pCut1->nLeaves;
int * pC0 = pCut0->pLeaves;
int * pC1 = pCut1->pLeaves;
int * pC = pCut->pLeaves;
int i, k, c;
// compare two cuts with different numbers
c = nSize0; p->nShared = 0;
for ( i = 0; i < nSize1; i++ )
{
for ( k = 0; k < nSize0; k++ )
if ( pC1[i] == pC0[k] )
break;
if ( k < nSize0 )
{
p->pPerm[1][i] = k;
p->nShared++;
continue;
}
if ( c == nLutSize )
return 0;
p->pPerm[1][i] = c;
pC[c++] = pC1[i];
}
for ( i = 0; i < nSize0; i++ )
pC[i] = pC0[i];
pCut->nLeaves = c;
pCut->uSign = pCut0->uSign | pCut1->uSign;
return 1;
}
/**Function*************************************************************
Synopsis [Prepares the object for FPGA mapping.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int If_CutCompareDelay( If_Man_t * p, If_Cut_t ** ppC0, If_Cut_t ** ppC1 ) int If_CutCompareDelay( If_Man_t * p, If_Cut_t ** ppC0, If_Cut_t ** ppC1 )
{ {
If_Cut_t * pC0 = *ppC0; If_Cut_t * pC0 = *ppC0;
...@@ -600,30 +493,6 @@ int If_CutCompareArea( If_Man_t * p, If_Cut_t ** ppC0, If_Cut_t ** ppC1 ) ...@@ -600,30 +493,6 @@ int If_CutCompareArea( If_Man_t * p, If_Cut_t ** ppC0, If_Cut_t ** ppC1 )
/**Function************************************************************* /**Function*************************************************************
Synopsis [Sorts the cuts.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void If_ManSortCuts( If_Man_t * p, int Mode )
{
/*
// sort the cuts
if ( Mode || p->pPars->fArea ) // area
qsort( p->ppCuts, p->nCuts, sizeof(If_Cut_t *), (int (*)(const void *, const void *))If_CutCompareArea );
else if ( p->pPars->fFancy )
qsort( p->ppCuts, p->nCuts, sizeof(If_Cut_t *), (int (*)(const void *, const void *))If_CutCompareDelayOld );
else
qsort( p->ppCuts, p->nCuts, sizeof(If_Cut_t *), (int (*)(const void *, const void *))If_CutCompareDelay );
*/
}
/**Function*************************************************************
Synopsis [Comparison function for two cuts.] Synopsis [Comparison function for two cuts.]
Description [] Description []
......
...@@ -154,21 +154,6 @@ void If_ManStop( If_Man_t * p ) ...@@ -154,21 +154,6 @@ void If_ManStop( If_Man_t * p )
extern void If_ManCacheAnalize( If_Man_t * p ); extern void If_ManCacheAnalize( If_Man_t * p );
if ( p->pPars->fVerbose && p->vCutData ) if ( p->pPars->fVerbose && p->vCutData )
If_ManCacheAnalize( p ); If_ManCacheAnalize( p );
/*
if ( p->pIfDsdMan )
{
If_DsdMan_t * pNew;
If_DsdManSave( p->pIfDsdMan, NULL );
pNew = If_DsdManLoad( If_DsdManFileName(p->pIfDsdMan) );
If_DsdManFree( pNew, 1 );
}
*/
{
// extern void If_CluHashFindMedian( If_Man_t * p );
// extern void If_CluHashTableCheck( If_Man_t * p );
// If_CluHashFindMedian( p );
// If_CluHashTableCheck( p );
}
if ( p->pPars->fVerbose && p->vTtMem ) if ( p->pPars->fVerbose && p->vTtMem )
printf( "Unique truth tables = %d. Memory = %.2f MB\n", Vec_MemEntryNum(p->vTtMem), Vec_MemMemory(p->vTtMem) / (1<<20) ); printf( "Unique truth tables = %d. Memory = %.2f MB\n", Vec_MemEntryNum(p->vTtMem), Vec_MemMemory(p->vTtMem) / (1<<20) );
if ( p->pPars->fVerbose && p->nCutsUselessAll ) if ( p->pPars->fVerbose && p->nCutsUselessAll )
...@@ -452,10 +437,10 @@ void If_ManSetupCutTriv( If_Man_t * p, If_Cut_t * pCut, int ObjId ) ...@@ -452,10 +437,10 @@ void If_ManSetupCutTriv( If_Man_t * p, If_Cut_t * pCut, int ObjId )
pCut->nLeaves = 1; pCut->nLeaves = 1;
pCut->pLeaves[0] = p->pPars->fLiftLeaves? (ObjId << 8) : ObjId; pCut->pLeaves[0] = p->pPars->fLiftLeaves? (ObjId << 8) : ObjId;
pCut->uSign = If_ObjCutSign( pCut->pLeaves[0] ); pCut->uSign = If_ObjCutSign( pCut->pLeaves[0] );
pCut->iCutFunc = p->pPars->fTruth ? 2 : -1; pCut->iCutFunc = (p->pPars->fTruth || p->pPars->fUseTtPerm) ? 2 : -1;
pCut->iCutDsd = (p->pPars->fUseDsd || p->pPars->fUseTtPerm) ? 2 : -1; pCut->iCutDsd = p->pPars->fUseDsd ? 2 : (p->pPars->fUseTtPerm ? 0: -1);
assert( pCut->pLeaves[0] < p->vObjs->nSize ); assert( pCut->pLeaves[0] < p->vObjs->nSize );
if ( p->pPars->fUseDsd || p->pPars->fUseTtPerm ) if ( p->pPars->fUseDsd )
pCut->pPerm[0] = 0; pCut->pPerm[0] = 0;
} }
......
...@@ -140,7 +140,7 @@ void If_ObjPerformMappingAnd( If_Man_t * p, If_Obj_t * pObj, int Mode, int fPrep ...@@ -140,7 +140,7 @@ void If_ObjPerformMappingAnd( If_Man_t * p, If_Obj_t * pObj, int Mode, int fPrep
{ {
If_Set_t * pCutSet; If_Set_t * pCutSet;
If_Cut_t * pCut0, * pCut1, * pCut; If_Cut_t * pCut0, * pCut1, * pCut;
int i, k, v; int i, k, v, fChange;
assert( p->pPars->fSeqMap || !If_ObjIsAnd(pObj->pFanin0) || pObj->pFanin0->pCutSet->nCuts > 0 ); assert( p->pPars->fSeqMap || !If_ObjIsAnd(pObj->pFanin0) || pObj->pFanin0->pCutSet->nCuts > 0 );
assert( p->pPars->fSeqMap || !If_ObjIsAnd(pObj->pFanin1) || pObj->pFanin1->pCutSet->nCuts > 0 ); assert( p->pPars->fSeqMap || !If_ObjIsAnd(pObj->pFanin1) || pObj->pFanin1->pCutSet->nCuts > 0 );
...@@ -197,28 +197,36 @@ void If_ObjPerformMappingAnd( If_Man_t * p, If_Obj_t * pObj, int Mode, int fPrep ...@@ -197,28 +197,36 @@ void If_ObjPerformMappingAnd( If_Man_t * p, If_Obj_t * pObj, int Mode, int fPrep
if ( If_WordCountOnes(pCut0->uSign | pCut1->uSign) > p->pPars->nLutSize ) if ( If_WordCountOnes(pCut0->uSign | pCut1->uSign) > p->pPars->nLutSize )
continue; continue;
// merge the cuts // merge the cuts
if ( !If_CutMerge( p, pCut0, pCut1, pCut ) ) if ( p->pPars->fUseTtPerm )
continue; {
assert( If_CutCheck( pCut ) ); if ( !If_CutMerge( p, pCut0, pCut1, pCut ) )
continue;
}
else
{
if ( !If_CutMergeOrdered( p, pCut0, pCut1, pCut ) )
continue;
}
if ( pObj->fSpec && pCut->nLeaves == (unsigned)p->pPars->nLutSize ) if ( pObj->fSpec && pCut->nLeaves == (unsigned)p->pPars->nLutSize )
continue; continue;
p->nCutsMerged++; p->nCutsMerged++;
p->nCutsTotal++; p->nCutsTotal++;
// check if this cut is contained in any of the available cuts // check if this cut is contained in any of the available cuts
// if ( p->pPars->pFuncCost == NULL && If_CutFilter( p, pCut ) ) // do not filter functionality cuts
if ( !p->pPars->fSkipCutFilter && If_CutFilter( pCutSet, pCut ) ) if ( !p->pPars->fSkipCutFilter && If_CutFilter( pCutSet, pCut ) )
continue; continue;
// compute the truth table // compute the truth table
pCut->fCompl = 0; pCut->fCompl = 0;
pCut->iCutFunc = -1; pCut->iCutFunc = -1;
pCut->iCutDsd = -1; pCut->iCutDsd = -1;
if ( p->pPars->fTruth ) if ( p->pPars->fTruth && !p->pPars->fUseTtPerm )
{ {
// abctime clk = Abc_Clock(); // abctime clk = Abc_Clock();
if ( p->pPars->fUseTtPerm ) if ( p->pPars->fUseTtPerm )
If_CutComputeTruthPerm( p, pCut, pCut0, pCut1, pObj->fCompl0, pObj->fCompl1 ); fChange = If_CutComputeTruthPerm( p, pCut, pCut0, pCut1, pObj->fCompl0, pObj->fCompl1 );
else else
If_CutComputeTruth( p, pCut, pCut0, pCut1, pObj->fCompl0, pObj->fCompl1 ); fChange = If_CutComputeTruth( p, pCut, pCut0, pCut1, pObj->fCompl0, pObj->fCompl1 );
if ( !p->pPars->fSkipCutFilter && fChange && If_CutFilter( pCutSet, pCut ) )
continue;
// p->timeTruth += Abc_Clock() - clk; // p->timeTruth += Abc_Clock() - clk;
if ( p->pPars->fUseDsd ) if ( p->pPars->fUseDsd )
{ {
...@@ -283,50 +291,6 @@ void If_ObjPerformMappingAnd( If_Man_t * p, If_Obj_t * pObj, int Mode, int fPrep ...@@ -283,50 +291,6 @@ void If_ObjPerformMappingAnd( If_Man_t * p, If_Obj_t * pObj, int Mode, int fPrep
p->nCuts5a++; p->nCuts5a++;
} }
} }
/*
if ( p->pPars->fUseDsd )
{
if ( p->pPars->pLutStruct )
{
int Value = If_DsdManCheckDec( p->pIfDsdMan, pCut->iCutDsd );
if ( Value != (int)pCut->fUseless )
{
if ( pCut->fUseless && !Value )
p->nCountNonDec[0]++;
if ( !pCut->fUseless && Value )
p->nCountNonDec[1]++;
// if ( pCut->fUseless && !Value )
// printf( "Old does not work. New works.\n" );
if ( !pCut->fUseless && Value )
printf( "Old works. New does not work. DSD = %d.\n", Abc_Lit2Var(pCut->iCutDsd) );
if ( !pCut->fUseless && Value )
{
extern word If_Dec6Perform( word t, int fDerive );
extern word * If_DsdManComputeTruth( If_DsdMan_t * p, int iDsd, unsigned char * pPermLits );
int s;
// word z, t = *If_CutTruthW(p, pCut);
word z, t = *If_DsdManComputeTruth( p->pIfDsdMan, pCut->iCutDsd, NULL );
Extra_PrintHex( stdout, (unsigned *)If_CutTruthW(p, pCut), pCut->nLeaves ); printf( "\n" );
Dau_DsdPrintFromTruth( &t, pCut->nLeaves );
// Dau_DsdPrintFromTruth( If_CutTruthW(p, pCut), pCut->nLeaves );
// If_DsdManPrintOne( stdout, p->pIfDsdMan, Abc_Lit2Var(pCut->iCutDsd), pCut->pPerm, 1 );
// printf( "Old works. New does not work. DSD = %d.\n", Abc_Lit2Var(pCut->iCutDsd) );
z = If_Dec6Perform( t, 1 );
If_DecPrintConfig( z );
s = If_DsdManCheckXY( p->pIfDsdMan, pCut->iCutDsd, 4, 0, 0, 1 );
printf( "Confirm %d\n", s );
s = 0;
}
}
}
}
*/
} }
// compute the application-specific cost and depth // compute the application-specific cost and depth
...@@ -362,6 +326,7 @@ void If_ObjPerformMappingAnd( If_Man_t * p, If_Obj_t * pObj, int Mode, int fPrep ...@@ -362,6 +326,7 @@ void If_ObjPerformMappingAnd( If_Man_t * p, If_Obj_t * pObj, int Mode, int fPrep
// If_CutTraverse( p, pObj, pCut ); // If_CutTraverse( p, pObj, pCut );
} }
assert( pCutSet->nCuts > 0 ); assert( pCutSet->nCuts > 0 );
// If_CutVerifyCuts( pCutSet, !p->pPars->fUseTtPerm );
// update the best cut // update the best cut
if ( !fPreprocess || pCutSet->ppCuts[0]->Delay <= pObj->Required + p->fEpsilon ) if ( !fPreprocess || pCutSet->ppCuts[0]->Delay <= pObj->Required + p->fEpsilon )
......
...@@ -27,7 +27,6 @@ ABC_NAMESPACE_IMPL_START ...@@ -27,7 +27,6 @@ ABC_NAMESPACE_IMPL_START
/// DECLARATIONS /// /// DECLARATIONS ///
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
static void If_ManImproveReduce( If_Man_t * p, int nLimit );
static void If_ManImproveExpand( If_Man_t * p, int nLimit ); static void If_ManImproveExpand( If_Man_t * p, int nLimit );
static void If_ManImproveNodeExpand( If_Man_t * p, If_Obj_t * pObj, int nLimit, Vec_Ptr_t * vFront, Vec_Ptr_t * vFrontOld, Vec_Ptr_t * vVisited ); static void If_ManImproveNodeExpand( If_Man_t * p, If_Obj_t * pObj, int nLimit, Vec_Ptr_t * vFront, Vec_Ptr_t * vFrontOld, Vec_Ptr_t * vVisited );
static void If_ManImproveNodePrepare( If_Man_t * p, If_Obj_t * pObj, int nLimit, Vec_Ptr_t * vFront, Vec_Ptr_t * vFrontOld, Vec_Ptr_t * vVisited ); static void If_ManImproveNodePrepare( If_Man_t * p, If_Obj_t * pObj, int nLimit, Vec_Ptr_t * vFront, Vec_Ptr_t * vFrontOld, Vec_Ptr_t * vVisited );
...@@ -62,29 +61,6 @@ void If_ManImproveMapping( If_Man_t * p ) ...@@ -62,29 +61,6 @@ void If_ManImproveMapping( If_Man_t * p )
p->RequiredGlo, p->AreaGlo, p->nNets, p->dPower, p->nCutsMerged ); p->RequiredGlo, p->AreaGlo, p->nNets, p->dPower, p->nCutsMerged );
Abc_PrintTime( 1, "T", Abc_Clock() - clk ); Abc_PrintTime( 1, "T", Abc_Clock() - clk );
} }
/*
clk = Abc_Clock();
If_ManImproveReduce( p, p->pPars->nLutSize );
If_ManComputeRequired( p, 0 );
if ( p->pPars->fVerbose )
{
Abc_Print( 1, "R: Del = %6.2f. Area = %8.2f. Nets = %6d. Cuts = %8d. Lim = %2d. Ave = %5.2f. ",
p->RequiredGlo, p->AreaGlo, p->nNets, p->nCutsMerged, p->nCutsUsed, 1.0 * p->nCutsMerged / If_ManAndNum(p) );
Abc_PrintTime( 1, "T", Abc_Clock() - clk );
}
*/
/*
clk = Abc_Clock();
If_ManImproveExpand( p, p->pPars->nLutSize );
If_ManComputeRequired( p, 0 );
if ( p->pPars->fVerbose )
{
Abc_Print( 1, "E: Del = %6.2f. Area = %8.2f. Nets = %6d. Cuts = %8d. Lim = %2d. Ave = %5.2f. ",
p->RequiredGlo, p->AreaGlo, p->nNets, p->nCutsMerged, p->nCutsUsed, 1.0 * p->nCutsMerged / If_ManAndNum(p) );
Abc_PrintTime( 1, "T", Abc_Clock() - clk );
}
*/
} }
/**Function************************************************************* /**Function*************************************************************
...@@ -267,6 +243,7 @@ void If_ManImproveNodeUpdate( If_Man_t * p, If_Obj_t * pObj, Vec_Ptr_t * vFront ...@@ -267,6 +243,7 @@ void If_ManImproveNodeUpdate( If_Man_t * p, If_Obj_t * pObj, Vec_Ptr_t * vFront
Vec_PtrForEachEntry( If_Obj_t *, vFront, pFanin, i ) Vec_PtrForEachEntry( If_Obj_t *, vFront, pFanin, i )
pCut->pLeaves[i] = pFanin->Id; pCut->pLeaves[i] = pFanin->Id;
If_CutOrder( pCut ); If_CutOrder( pCut );
pCut->uSign = If_ObjCutSignCompute(pCut);
// ref the new cut // ref the new cut
If_CutAreaRef( p, pCut ); If_CutAreaRef( p, pCut );
} }
...@@ -477,101 +454,6 @@ void If_ManImproveNodeFaninCompact( If_Man_t * p, If_Obj_t * pObj, int nLimit, V ...@@ -477,101 +454,6 @@ void If_ManImproveNodeFaninCompact( If_Man_t * p, If_Obj_t * pObj, int nLimit, V
} }
/**Function*************************************************************
Synopsis [Performs fast mapping for one node.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void If_ManImproveNodeReduce( If_Man_t * p, If_Obj_t * pObj, int nLimit )
{
/*
If_Cut_t * pCut, * pCut0, * pCut1, * pCutR;
If_Obj_t * pFanin0, * pFanin1;
float AreaBef, AreaAft;
int RetValue;
assert( nLimit <= 32 );
assert( If_ObjIsAnd(pObj) );
// get the fanins
pFanin0 = If_ObjFanin0(pObj);
pFanin1 = If_ObjFanin1(pObj);
// get the cuts
pCut = If_ObjCutBest(pObj);
pCut0 = If_ObjIsCi(pFanin0) ? If_ObjCutTriv(pFanin0) : If_ObjCutBest(pFanin0);
pCut1 = If_ObjIsCi(pFanin1) ? If_ObjCutTriv(pFanin1) : If_ObjCutBest(pFanin1);
assert( pCut->Delay <= pObj->Required + p->fEpsilon );
// deref the cut if the node is refed
if ( pObj->nRefs > 0 )
If_CutAreaDeref( p, pCut );
// get the area
AreaBef = If_CutAreaDerefed( p, pCut );
// get the fanin support
if ( pFanin0->nRefs > 2 && pCut0->Delay < pObj->Required + p->fEpsilon )
// if ( pSupp0->nRefs > 0 && pSupp0->Delay < pSupp->DelayR ) // this leads to 2% worse results
{
pCut0 = If_ObjCutTriv(pFanin0);
}
// get the fanin support
if ( pFanin1->nRefs > 2 && pCut1->Delay < pObj->Required + p->fEpsilon )
// if ( pSupp1->nRefs > 0 && pSupp1->Delay < pSupp->DelayR )
{
pCut1 = If_ObjCutTriv(pFanin1);
}
// merge the cuts
pCutR = p->ppCuts[0];
RetValue = If_CutMerge( pCut0, pCut1, pCutR );
// try very simple cut
if ( !RetValue )
{
RetValue = If_CutMerge( If_ObjCutTriv(pFanin0), If_ObjCutTriv(pFanin1), pCutR );
assert( RetValue == 1 );
}
if ( RetValue )
{
pCutR->Delay = If_CutDelay( p, pObj, pCutR );
AreaAft = If_CutAreaDerefed( p, pCutR );
// update the best cut
if ( AreaAft < AreaBef - p->fEpsilon && pCutR->Delay < pObj->Required + p->fEpsilon )
If_CutCopy( p, pCut, pCutR );
}
// recompute the delay of the best cut
pCut->Delay = If_CutDelay( p, pObj, pCut );
// ref the cut if the node is refed
if ( pObj->nRefs > 0 )
If_CutRef( p, pCut );
*/
}
/**Function*************************************************************
Synopsis [Performs area recovery for each node.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void If_ManImproveReduce( If_Man_t * p, int nLimit )
{
If_Obj_t * pObj;
int i;
If_ManForEachNode( p, pObj, i )
If_ManImproveNodeReduce( p, pObj, nLimit );
}
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
/// END OF FILE /// /// END OF FILE ///
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
......
...@@ -44,7 +44,7 @@ ABC_NAMESPACE_IMPL_START ...@@ -44,7 +44,7 @@ ABC_NAMESPACE_IMPL_START
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
void If_CutTruthPermute( word * pTruth, int nLeaves, int nVars, int nWords, float * pDelays, int * pVars, char * pPerm ) void If_CutTruthPermute( word * pTruth, int nLeaves, int nVars, int nWords, float * pDelays, int * pVars )
{ {
while ( 1 ) while ( 1 )
{ {
...@@ -55,8 +55,6 @@ void If_CutTruthPermute( word * pTruth, int nLeaves, int nVars, int nWords, floa ...@@ -55,8 +55,6 @@ void If_CutTruthPermute( word * pTruth, int nLeaves, int nVars, int nWords, floa
continue; continue;
ABC_SWAP( float, pDelays[i], pDelays[i+1] ); ABC_SWAP( float, pDelays[i], pDelays[i+1] );
ABC_SWAP( int, pVars[i], pVars[i+1] ); ABC_SWAP( int, pVars[i], pVars[i+1] );
if ( pPerm )
ABC_SWAP( char, pPerm[i], pPerm[i+1] );
if ( pTruth ) if ( pTruth )
Abc_TtSwapAdjacent( pTruth, nWords, i ); Abc_TtSwapAdjacent( pTruth, nWords, i );
fChange = 1; fChange = 1;
...@@ -70,20 +68,16 @@ void If_CutRotatePins( If_Man_t * p, If_Cut_t * pCut ) ...@@ -70,20 +68,16 @@ void If_CutRotatePins( If_Man_t * p, If_Cut_t * pCut )
If_Obj_t * pLeaf; If_Obj_t * pLeaf;
float PinDelays[IF_MAX_LUTSIZE]; float PinDelays[IF_MAX_LUTSIZE];
int i, truthId; int i, truthId;
assert( !p->pPars->fUseTtPerm );
If_CutForEachLeaf( p, pCut, pLeaf, i ) If_CutForEachLeaf( p, pCut, pLeaf, i )
PinDelays[i] = If_ObjCutBest(pLeaf)->Delay; PinDelays[i] = If_ObjCutBest(pLeaf)->Delay;
if ( p->vTtMem == NULL ) if ( p->vTtMem == NULL )
{ {
If_CutTruthPermute( NULL, If_CutLeaveNum(pCut), pCut->nLimit, p->nTruth6Words, PinDelays, If_CutLeaves(pCut), NULL ); If_CutTruthPermute( NULL, If_CutLeaveNum(pCut), pCut->nLimit, p->nTruth6Words, PinDelays, If_CutLeaves(pCut) );
return;
}
if ( p->pPars->fUseTtPerm )
{
If_CutTruthPermute( NULL, If_CutLeaveNum(pCut), pCut->nLimit, p->nTruth6Words, PinDelays, If_CutLeaves(pCut), pCut->pPerm );
return; return;
} }
Abc_TtCopy( p->puTempW, If_CutTruthWR(p, pCut), p->nTruth6Words, 0 ); Abc_TtCopy( p->puTempW, If_CutTruthWR(p, pCut), p->nTruth6Words, 0 );
If_CutTruthPermute( p->puTempW, If_CutLeaveNum(pCut), pCut->nLimit, p->nTruth6Words, PinDelays, If_CutLeaves(pCut), NULL ); If_CutTruthPermute( p->puTempW, If_CutLeaveNum(pCut), pCut->nLimit, p->nTruth6Words, PinDelays, If_CutLeaves(pCut) );
truthId = Vec_MemHashInsert( p->vTtMem, p->puTempW ); truthId = Vec_MemHashInsert( p->vTtMem, p->puTempW );
pCut->iCutFunc = Abc_Var2Lit( truthId, If_CutTruthIsCompl(pCut) ); pCut->iCutFunc = Abc_Var2Lit( truthId, If_CutTruthIsCompl(pCut) );
assert( (p->puTempW[0] & 1) == 0 ); assert( (p->puTempW[0] & 1) == 0 );
...@@ -102,7 +96,7 @@ void If_CutRotatePins( If_Man_t * p, If_Cut_t * pCut ) ...@@ -102,7 +96,7 @@ void If_CutRotatePins( If_Man_t * p, If_Cut_t * pCut )
***********************************************************************/ ***********************************************************************/
int If_CutComputeTruth( If_Man_t * p, If_Cut_t * pCut, If_Cut_t * pCut0, If_Cut_t * pCut1, int fCompl0, int fCompl1 ) int If_CutComputeTruth( If_Man_t * p, If_Cut_t * pCut, If_Cut_t * pCut0, If_Cut_t * pCut1, int fCompl0, int fCompl1 )
{ {
int fCompl, truthId, nLeavesNew; int fCompl, truthId, nLeavesNew, RetValue = 0;
int iFuncLit0 = pCut0->iCutFunc; int iFuncLit0 = pCut0->iCutFunc;
int iFuncLit1 = pCut1->iCutFunc; int iFuncLit1 = pCut1->iCutFunc;
int nWords = Abc_TtWordNum( pCut->nLimit ); int nWords = Abc_TtWordNum( pCut->nLimit );
...@@ -124,6 +118,7 @@ int If_CutComputeTruth( If_Man_t * p, If_Cut_t * pCut, If_Cut_t * pCut0, If_Cut_ ...@@ -124,6 +118,7 @@ int If_CutComputeTruth( If_Man_t * p, If_Cut_t * pCut, If_Cut_t * pCut0, If_Cut_
{ {
pCut->nLeaves = nLeavesNew; pCut->nLeaves = nLeavesNew;
pCut->uSign = If_ObjCutSignCompute( pCut ); pCut->uSign = If_ObjCutSignCompute( pCut );
RetValue = 1;
} }
} }
truthId = Vec_MemHashInsert( p->vTtMem, pTruth ); truthId = Vec_MemHashInsert( p->vTtMem, pTruth );
...@@ -137,7 +132,7 @@ int If_CutComputeTruth( If_Man_t * p, If_Cut_t * pCut, If_Cut_t * pCut0, If_Cut_ ...@@ -137,7 +132,7 @@ int If_CutComputeTruth( If_Man_t * p, If_Cut_t * pCut, If_Cut_t * pCut0, If_Cut_
Abc_TtCanonicize( pCopy, pCut->nLimit, pCanonPerm ); Abc_TtCanonicize( pCopy, pCut->nLimit, pCanonPerm );
} }
#endif #endif
return 1; return RetValue;
} }
/**Function************************************************************* /**Function*************************************************************
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment