summaryrefslogtreecommitdiffstats
path: root/src/aig/gia/giaJf.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2017-01-27 15:22:23 -0800
committerAlan Mishchenko <alanmi@berkeley.edu>2017-01-27 15:22:23 -0800
commit596276152c0933f4251c53206ff1d98533b45ab2 (patch)
tree469302cb3eeff9fc26003f457253391444cae5e5 /src/aig/gia/giaJf.c
parentf701a0c659c57b8aa452bed93143a45cf5dcfeb8 (diff)
downloadabc-596276152c0933f4251c53206ff1d98533b45ab2.tar.gz
abc-596276152c0933f4251c53206ff1d98533b45ab2.tar.bz2
abc-596276152c0933f4251c53206ff1d98533b45ab2.zip
Fixing non-reproducability related to floating-point numbers.
Diffstat (limited to 'src/aig/gia/giaJf.c')
-rw-r--r--src/aig/gia/giaJf.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/aig/gia/giaJf.c b/src/aig/gia/giaJf.c
index 2d75581d..205ab408 100644
--- a/src/aig/gia/giaJf.c
+++ b/src/aig/gia/giaJf.c
@@ -36,6 +36,7 @@ ABC_NAMESPACE_IMPL_START
#define JF_LEAF_MAX 8
#define JF_WORD_MAX ((JF_LEAF_MAX > 6) ? 1 << (JF_LEAF_MAX-6) : 1)
#define JF_CUT_MAX 16
+#define JF_EPSILON 0.005
typedef struct Jf_Cut_t_ Jf_Cut_t;
struct Jf_Cut_t_
@@ -940,15 +941,16 @@ float Jf_CutCompareDelay( Jf_Cut_t * pOld, Jf_Cut_t * pNew )
{
if ( pOld->Time != pNew->Time ) return pOld->Time - pNew->Time;
if ( pOld->pCut[0] != pNew->pCut[0] ) return pOld->pCut[0] - pNew->pCut[0];
- if ( pOld->Flow != pNew->Flow ) return pOld->Flow - pNew->Flow;
+// if ( pOld->Flow != pNew->Flow ) return pOld->Flow - pNew->Flow;
+ if ( pOld->Flow < pNew->Flow - JF_EPSILON ) return -1;
+ if ( pOld->Flow > pNew->Flow + JF_EPSILON ) return 1;
return 0;
}
float Jf_CutCompareArea( Jf_Cut_t * pOld, Jf_Cut_t * pNew )
{
-// float Epsilon = (float)0.001;
-// if ( pOld->Flow > pNew->Flow + Epsilon ) return 1;
-// if ( pOld->Flow < pNew->Flow - Epsilon ) return -1;
- if ( pOld->Flow != pNew->Flow ) return pOld->Flow - pNew->Flow;
+// if ( pOld->Flow != pNew->Flow ) return pOld->Flow - pNew->Flow;
+ if ( pOld->Flow < pNew->Flow - JF_EPSILON ) return -1;
+ if ( pOld->Flow > pNew->Flow + JF_EPSILON ) return 1;
if ( pOld->pCut[0] != pNew->pCut[0] ) return pOld->pCut[0] - pNew->pCut[0];
if ( pOld->Time != pNew->Time ) return pOld->Time - pNew->Time;
return 0;
@@ -1367,7 +1369,7 @@ void Jf_ObjComputeBestCut( Jf_Man_t * p, Gia_Obj_t * pObj, int fEdge, int fEla )
if ( fEdge && !fEla )
Jf_CutSetCost(pCut, Jf_CutSize(pCut));
Area = fEla ? Jf_CutArea(p, pCut, fEdge) : Jf_CutFlow(p, pCut) + Jf_CutCost(pCut);
- if ( pCutBest == NULL || AreaBest > Area || (AreaBest == Area && TimeBest > (Time = Jf_CutArr(p, pCut))) )
+ if ( pCutBest == NULL || AreaBest > Area + JF_EPSILON || (AreaBest > Area - JF_EPSILON && TimeBest > (Time = Jf_CutArr(p, pCut))) )
pCutBest = pCut, AreaBest = Area, TimeBest = Time;
}
Vec_IntWriteEntry( &p->vArr, iObj, Jf_CutArr(p, pCutBest) );