summaryrefslogtreecommitdiffstats
path: root/src/opt/mfs/mfsResub.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/opt/mfs/mfsResub.c')
-rw-r--r--src/opt/mfs/mfsResub.c67
1 files changed, 65 insertions, 2 deletions
diff --git a/src/opt/mfs/mfsResub.c b/src/opt/mfs/mfsResub.c
index b6c7299b..e9ea2c40 100644
--- a/src/opt/mfs/mfsResub.c
+++ b/src/opt/mfs/mfsResub.c
@@ -80,8 +80,8 @@ void Abc_NtkMfsPrintResubStats( Mfs_Man_t * p )
nAreaExpanse += (int)(Abc_ObjFaninNum(pNode) < nFaninMax);
}
}
- printf( "Total area-critical fanins = %d. Belonging to expandable nodes = %d.\n",
- nAreaCrits, nAreaExpanse );
+// printf( "Total area-critical fanins = %d. Belonging to expandable nodes = %d.\n",
+// nAreaCrits, nAreaExpanse );
}
/**Function*************************************************************
@@ -209,6 +209,8 @@ p->timeInt += clock() - clk;
iVar = -1;
while ( 1 )
{
+ float * pProbab = (float *)(p->vProbs? p->vProbs->pArray : NULL);
+ assert( (pProbab != NULL) == p->pPars->fPower );
if ( fVeryVerbose )
{
printf( "%3d: %2d ", p->nCexes, iVar );
@@ -225,6 +227,13 @@ p->timeInt += clock() - clk;
assert( nWords <= p->nDivWords );
for ( iVar = 0; iVar < Vec_PtrSize(p->vDivs)-Abc_ObjFaninNum(pNode); iVar++ )
{
+ if ( p->pPars->fPower )
+ {
+ Abc_Obj_t * pDiv = Vec_PtrEntry(p->vDivs, iVar);
+ // only accept the divisor if it is "cool"
+ if ( pProbab[Abc_ObjId(pDiv)] >= 0.15 )
+ continue;
+ }
pData = Vec_PtrEntry( p->vDivCexes, iVar );
for ( w = 0; w < nWords; w++ )
if ( pData[w] != ~0 )
@@ -345,6 +354,10 @@ p->timeInt += clock() - clk;
iVar = iVar2 = -1;
while ( 1 )
{
+#if 1 // sjang
+ float * pProbab = (float *)(p->vProbs? p->vProbs->pArray : NULL);
+ assert( (pProbab != NULL) == p->pPars->fPower );
+#endif
if ( fVeryVerbose )
{
printf( "%3d: %2d %2d ", p->nCexes, iVar, iVar2 );
@@ -363,9 +376,27 @@ p->timeInt += clock() - clk;
for ( iVar = 1; iVar < Vec_PtrSize(p->vDivs)-Abc_ObjFaninNum(pNode); iVar++ )
{
pData = Vec_PtrEntry( p->vDivCexes, iVar );
+#if 1 // sjang
+ if ( p->pPars->fPower )
+ {
+ Abc_Obj_t * pDiv = Vec_PtrEntry(p->vDivs, iVar);
+ // only accept the divisor if it is "cool"
+ if ( pProbab[Abc_ObjId(pDiv)] >= 0.12 )
+ continue;
+ }
+#endif
for ( iVar2 = 0; iVar2 < iVar; iVar2++ )
{
pData2 = Vec_PtrEntry( p->vDivCexes, iVar2 );
+#if 1 // sjang
+ if ( p->pPars->fPower )
+ {
+ Abc_Obj_t * pDiv = Vec_PtrEntry(p->vDivs, iVar2);
+ // only accept the divisor if it is "cool"
+ if ( pProbab[Abc_ObjId(pDiv)] >= 0.12 )
+ continue;
+ }
+#endif
for ( w = 0; w < nWords; w++ )
if ( (pData[w] | pData2[w]) != ~0 )
break;
@@ -434,6 +465,38 @@ int Abc_NtkMfsEdgeSwapEval( Mfs_Man_t * p, Abc_Obj_t * pNode )
/**Function*************************************************************
+ Synopsis [Evaluates the possibility of replacing given edge by another edge.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Abc_NtkMfsEdgePower( Mfs_Man_t * p, Abc_Obj_t * pNode )
+{
+ Abc_Obj_t * pFanin;
+ float * pProbab = (float *)p->vProbs->pArray;
+ int i;
+ // try replacing area critical fanins
+ Abc_ObjForEachFanin( pNode, pFanin, i )
+ {
+ if ( pProbab[pFanin->Id] >= 0.35 )
+ {
+ if ( Abc_NtkMfsSolveSatResub( p, pNode, i, 0, 0 ) )
+ return 1;
+ } else if ( pProbab[pFanin->Id] >= 0.25 ) // sjang
+ {
+ if ( Abc_NtkMfsSolveSatResub( p, pNode, i, 1, 0 ) )
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/**Function*************************************************************
+
Synopsis [Performs resubstitution for the node.]
Description []