summaryrefslogtreecommitdiffstats
path: root/src/aig/gia/giaJf.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2013-09-12 14:47:45 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2013-09-12 14:47:45 -0700
commit9b02a26a80e59bede18c4bd2650ad7f39a3a71f3 (patch)
tree13b241ac1be22a92676e48488dafb43af3073b68 /src/aig/gia/giaJf.c
parent68df9f0f59d86e12a337a0ea5082dc9333e2aa14 (diff)
downloadabc-9b02a26a80e59bede18c4bd2650ad7f39a3a71f3.tar.gz
abc-9b02a26a80e59bede18c4bd2650ad7f39a3a71f3.tar.bz2
abc-9b02a26a80e59bede18c4bd2650ad7f39a3a71f3.zip
Improvements to the new technology mapper.
Diffstat (limited to 'src/aig/gia/giaJf.c')
-rw-r--r--src/aig/gia/giaJf.c51
1 files changed, 32 insertions, 19 deletions
diff --git a/src/aig/gia/giaJf.c b/src/aig/gia/giaJf.c
index 328bf28a..7a99d466 100644
--- a/src/aig/gia/giaJf.c
+++ b/src/aig/gia/giaJf.c
@@ -63,6 +63,7 @@ struct Jf_Man_t_
static inline int Jf_ObjIsUnit( Gia_Obj_t * p ) { return !p->fMark0; }
static inline void Jf_ObjCleanUnit( Gia_Obj_t * p ) { assert(Jf_ObjIsUnit(p)); p->fMark0 = 1; }
+static inline void Jf_ObjSetUnit( Gia_Obj_t * p ) { p->fMark0 = 0; }
static inline int Jf_ObjCutH( Jf_Man_t * p, int i ) { return Vec_IntEntry(&p->vCuts, i); }
static inline int * Jf_ObjCuts( Jf_Man_t * p, int i ) { return (int *)Vec_SetEntry(&p->pMem, Jf_ObjCutH(p, i)); }
@@ -82,6 +83,7 @@ static inline int * Jf_CutLits( int * pCut ) { return pCut + 1;
static inline int Jf_CutLit( int * pCut, int i ) { assert(i);return pCut[i]; }
//static inline int Jf_CutVar( int * pCut, int i ) { assert(i); return pCut[i]; }
static inline int Jf_CutVar( int * pCut, int i ) { assert(i);return Abc_Lit2Var(pCut[i]); }
+static inline int Jf_CutIsTriv( int * pCut, int i ) { return Jf_CutSize(pCut) == 1 && Jf_CutVar(pCut, 1) == i; }
#define Jf_ObjForEachCut( pList, pCut, i ) for ( i = 0, pCut = pList + 1; i < pList[0]; i++, pCut += Jf_CutSize(pCut) + 1 )
#define Jf_CutForEachLit( pCut, Lit, i ) for ( i = 1; i <= Jf_CutSize(pCut) && (Lit = Jf_CutLit(pCut, i)); i++ )
@@ -135,10 +137,18 @@ float * Jf_ManInitRefs( Jf_Man_t * pMan )
{
if ( !Gia_ObjIsMuxType(pObj) )
continue;
- if ( !Gia_ObjIsMuxType(Gia_ObjFanin0(pObj)) && Gia_ObjRefNum(p, Gia_ObjFanin0(pObj)) == 1 )
+ if ( Gia_ObjRefNum(p, Gia_ObjFanin0(pObj)) == 1 )
+ {
+ Jf_ObjSetUnit(Gia_ObjFanin0(Gia_ObjFanin0(pObj)));
+ Jf_ObjSetUnit(Gia_ObjFanin0(Gia_ObjFanin1(pObj)));
Jf_ObjCleanUnit(Gia_ObjFanin0(pObj)), pMan->nCoarse++;
- if ( !Gia_ObjIsMuxType(Gia_ObjFanin1(pObj)) && Gia_ObjRefNum(p, Gia_ObjFanin1(pObj)) == 1 )
+ }
+ if ( Gia_ObjRefNum(p, Gia_ObjFanin1(pObj)) == 1 )
+ {
+ Jf_ObjSetUnit(Gia_ObjFanin1(Gia_ObjFanin0(pObj)));
+ Jf_ObjSetUnit(Gia_ObjFanin1(Gia_ObjFanin1(pObj)));
Jf_ObjCleanUnit(Gia_ObjFanin1(pObj)), pMan->nCoarse++;
+ }
}
}
// multiply by factor
@@ -664,9 +674,10 @@ int Jf_CutRef_rec( Jf_Man_t * p, int * pCut, int fEdge, int Limit )
if ( Limit == 0 ) // terminal
return 0;
Jf_CutForEachVar( pCut, Var, i )
- if ( Gia_ObjRefIncId( p->pGia, Var ) == 0 && Var != Jf_CutVar(Jf_ObjCutBest(p, Var), 1) )
+ if ( Gia_ObjRefIncId( p->pGia, Var ) == 0 && !Jf_CutIsTriv(Jf_ObjCutBest(p, Var), Var) )
Count += Jf_CutRef_rec( p, Jf_ObjCutBest(p, Var), fEdge, Limit - 1 );
- return Count + (fEdge ? (1 << 16) + Jf_CutSize(pCut) : 1);
+ return Count + (fEdge ? (1 << 5) + Jf_CutSize(pCut) : 1);
+// return Count + (fEdge ? Jf_CutSize(pCut) : 1);
}
int Jf_CutDeref_rec( Jf_Man_t * p, int * pCut, int fEdge, int Limit )
{
@@ -674,9 +685,10 @@ int Jf_CutDeref_rec( Jf_Man_t * p, int * pCut, int fEdge, int Limit )
if ( Limit == 0 ) // terminal
return 0;
Jf_CutForEachVar( pCut, Var, i )
- if ( Gia_ObjRefDecId( p->pGia, Var ) == 0 && Var != Jf_CutVar(Jf_ObjCutBest(p, Var), 1) )
+ if ( Gia_ObjRefDecId( p->pGia, Var ) == 0 && !Jf_CutIsTriv(Jf_ObjCutBest(p, Var), Var) )
Count += Jf_CutDeref_rec( p, Jf_ObjCutBest(p, Var), fEdge, Limit - 1 );
- return Count + (fEdge ? (1 << 16) + Jf_CutSize(pCut) : 1);
+ return Count + (fEdge ? (1 << 5) + Jf_CutSize(pCut) : 1);
+// return Count + (fEdge ? Jf_CutSize(pCut) : 1);
}
static inline int Jf_CutElaOld( Jf_Man_t * p, int * pCut, int fEdge )
{
@@ -692,11 +704,12 @@ int Jf_CutRef2_rec( Jf_Man_t * p, int * pCut, int fEdge, int Limit )
return 0;
Jf_CutForEachVar( pCut, Var, i )
{
- if ( Gia_ObjRefIncId( p->pGia, Var ) == 0 && Var != Jf_CutVar(Jf_ObjCutBest(p, Var), 1) )
+ if ( Gia_ObjRefIncId( p->pGia, Var ) == 0 && !Jf_CutIsTriv(Jf_ObjCutBest(p, Var), Var) )
Count += Jf_CutRef2_rec( p, Jf_ObjCutBest(p, Var), fEdge, Limit - 1 );
Vec_IntPush( p->vTemp, Var );
}
- return Count + (fEdge ? (1 << 16) + Jf_CutSize(pCut) : 1);
+ return Count + (fEdge ? (1 << 5) + Jf_CutSize(pCut) : 1);
+// return Count + (fEdge ? Jf_CutSize(pCut) : 1);
}
static inline int Jf_CutEla( Jf_Man_t * p, int * pCut, int fEdge )
{
@@ -875,7 +888,7 @@ static inline int Jf_ObjHasCutWithSize( Jf_Cut_t ** pSto, int c, int nSize )
return 1;
return 0;
}
-void Jf_ObjComputeCuts( Jf_Man_t * p, Gia_Obj_t * pObj )
+void Jf_ObjComputeCuts( Jf_Man_t * p, Gia_Obj_t * pObj, int fEdge )
{
int LutSize = p->pPars->nLutSize;
int CutNum = p->pPars->nCutNum;
@@ -962,8 +975,7 @@ void Jf_ObjComputeCuts( Jf_Man_t * p, Gia_Obj_t * pObj )
// save best info
assert( pSto[0]->Flow >= 0 );
Vec_IntWriteEntry( &p->vArr, iObj, pSto[0]->Time );
- Vec_FltWriteEntry( &p->vFlow, iObj, (pSto[0]->Flow + 1) / Jf_ObjRefs(p, iObj) );
-// Vec_FltWriteEntry( &p->vFlow, iObj, (pSto[0]->Flow + ((1 << 6) + pSto[0]->pCut[0])) / Jf_ObjRefs(p, iObj) );
+ Vec_FltWriteEntry( &p->vFlow, iObj, (pSto[0]->Flow + (fEdge ? pSto[0]->pCut[0] : 1)) / Jf_ObjRefs(p, iObj) );
// add cuts to storage cuts
Vec_IntClear( p->vTemp );
Vec_IntPush( p->vTemp, c );
@@ -976,7 +988,7 @@ void Jf_ObjComputeCuts( Jf_Man_t * p, Gia_Obj_t * pObj )
}
Vec_IntWriteEntry( &p->vCuts, iObj, Vec_SetAppend(&p->pMem, Vec_IntArray(p->vTemp), Vec_IntSize(p->vTemp)) );
}
-void Jf_ManComputeCuts( Jf_Man_t * p )
+void Jf_ManComputeCuts( Jf_Man_t * p, int fEdge )
{
Gia_Obj_t * pObj; int i;
if ( p->pPars->fVerbose )
@@ -993,7 +1005,7 @@ void Jf_ManComputeCuts( Jf_Man_t * p )
if ( Gia_ObjIsBuf(pObj) )
Jf_ObjPropagateBuf( p, pObj, 0 );
else if ( Gia_ObjIsAnd(pObj) )
- Jf_ObjComputeCuts( p, pObj );
+ Jf_ObjComputeCuts( p, pObj, fEdge );
}
if ( p->pPars->fVerbose )
{
@@ -1065,7 +1077,8 @@ int Jf_ManComputeRefs( Jf_Man_t * p )
p->pPars->Area++;
}
// blend references and normalize flow
- nRefsNew = Abc_MaxFloat( 1, 0.25 * pRefs[i] + 0.75 * p->pGia->pRefs[i] );
+// nRefsNew = Abc_MaxFloat( 1, 0.25 * pRefs[i] + 0.75 * p->pGia->pRefs[i] );
+ nRefsNew = Abc_MaxFloat( 1, 0.9 * pRefs[i] + 0.2 * p->pGia->pRefs[i] );
pFlow[i] = pFlow[i] * pRefs[i] / nRefsNew;
pRefs[i] = nRefsNew;
assert( pFlow[i] >= 0 );
@@ -1094,14 +1107,14 @@ void Jf_ObjComputeBestCut( Jf_Man_t * p, Gia_Obj_t * pObj, int fEdge, int fEla )
float Area, AreaBest = ABC_INFINITY;
Jf_ObjForEachCut( pCuts, pCut, i )
{
- if ( Jf_CutSize(pCut) == 1 && Jf_CutVar(pCut, 1) == iObj ) continue;
+ if ( Jf_CutIsTriv(pCut, iObj) ) continue;
Area = fEla ? Jf_CutEla(p, pCut, fEdge) : Jf_CutFlow(p, pCut);
if ( pCutBest == NULL || AreaBest > Area || (AreaBest == Area && TimeBest > (Time = Jf_CutArr(p, pCut))) )
pCutBest = pCut, AreaBest = Area, TimeBest = Time;
}
Vec_IntWriteEntry( &p->vArr, iObj, Jf_CutArr(p, pCutBest) );
if ( !fEla )
- Vec_FltWriteEntry( &p->vFlow, iObj, (AreaBest + (fEdge ? Jf_CutSize(pCut) : 1)) / Jf_ObjRefs(p, iObj) );
+ Vec_FltWriteEntry( &p->vFlow, iObj, (AreaBest + (fEdge ? 10 + Jf_CutSize(pCut) : 1)) / Jf_ObjRefs(p, iObj) );
Jf_ObjSetBestCut( pCuts, pCutBest, p->vTemp );
// Jf_CutPrint( Jf_ObjCutBest(p, iObj) ); printf( "\n" );
}
@@ -1278,7 +1291,7 @@ void Jf_ManSetDefaultPars( Jf_Par_t * pPars )
pPars->nRounds = 1;
pPars->DelayTarget = -1;
pPars->fAreaOnly = 1;
- pPars->fCoarsen = 1;
+ pPars->fCoarsen = 0;
pPars->fCutMin = 0;
pPars->fVerbose = 0;
pPars->fVeryVerbose = 0;
@@ -1302,11 +1315,11 @@ Gia_Man_t * Jf_ManPerformMapping( Gia_Man_t * pGia, Jf_Par_t * pPars )
Jf_Man_t * p; int i;
p = Jf_ManAlloc( pGia, pPars );
p->pCutCmp = pPars->fAreaOnly ? Jf_CutCompareArea : Jf_CutCompareDelay;
- Jf_ManComputeCuts( p );
+ Jf_ManComputeCuts( p, 0 );
Jf_ManComputeRefs( p ); Jf_ManPrintStats( p, "Start" );
for ( i = 0; i < pPars->nRounds; i++ )
{
- Jf_ManPropagateFlow( p, 0 ); Jf_ManPrintStats( p, "Flow " );
+ Jf_ManPropagateFlow( p, 1 ); Jf_ManPrintStats( p, "Flow " );
Jf_ManPropagateEla( p, 0 ); Jf_ManPrintStats( p, "Area " );
Jf_ManPropagateEla( p, 1 ); Jf_ManPrintStats( p, "Edge " );
}