summaryrefslogtreecommitdiffstats
path: root/src/aig/gia/giaOf.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2015-09-29 20:05:27 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2015-09-29 20:05:27 -0700
commitbc1eae790b9fd0346f7d079f2b2e303138521144 (patch)
tree285c43f1078f0a0217750a3e8a987fb86b717818 /src/aig/gia/giaOf.c
parentd4d1ae9869afb76f8e79dacbc25d766b0744d5b1 (diff)
downloadabc-bc1eae790b9fd0346f7d079f2b2e303138521144.tar.gz
abc-bc1eae790b9fd0346f7d079f2b2e303138521144.tar.bz2
abc-bc1eae790b9fd0346f7d079f2b2e303138521144.zip
Experiments with LUT structure mapping.
Diffstat (limited to 'src/aig/gia/giaOf.c')
-rw-r--r--src/aig/gia/giaOf.c53
1 files changed, 17 insertions, 36 deletions
diff --git a/src/aig/gia/giaOf.c b/src/aig/gia/giaOf.c
index c6837b5a..c0fe4ecc 100644
--- a/src/aig/gia/giaOf.c
+++ b/src/aig/gia/giaOf.c
@@ -37,7 +37,7 @@ ABC_NAMESPACE_IMPL_START
#define OF_LEAF_MAX 6
#define OF_CUT_MAX 32
#define OF_NO_LEAF 31
-#define OF_NO_FUNC 0x3FFFFFF
+#define OF_NO_FUNC 0x7FFFFFF
#define OF_INFINITY FLT_MAX
#define OF_CUT_EXTRA 4 // size; delay1, delay2; area
@@ -47,8 +47,7 @@ struct Of_Cut_t_
word Sign; // signature
int Delay; // delay
int Flow; // flow
- unsigned iFunc : 26; // function (OF_NO_FUNC)
- unsigned Useless : 1; // function
+ unsigned iFunc : 27; // function (OF_NO_FUNC)
unsigned nLeaves : 5; // leaf number (OF_NO_LEAF)
int pLeaves[OF_LEAF_MAX+1]; // leaves
};
@@ -82,7 +81,6 @@ struct Of_Man_t_
// statistics
abctime clkStart; // starting time
double CutCount[6]; // cut counts
- int nCutUseAll; // objects with useful cuts
};
#define OF_NUM 10
@@ -341,7 +339,6 @@ static inline int Of_CutCreateUnit( Of_Cut_t * p, int i )
p->iFunc = 2;
p->nLeaves = 1;
p->pLeaves[0] = i;
- p->Useless = 0;
p->Sign = ((word)1) << (i & 0x3F);
return 1;
}
@@ -353,8 +350,8 @@ static inline void Of_Cutprintf( Of_Man_t * p, Of_Cut_t * pCut )
printf( " %*d", nDigits, pCut->pLeaves[i] );
for ( ; i < (int)p->pPars->nLutSize; i++ )
printf( " %*s", nDigits, " " );
- printf( " } Useless = %d. D = %4d A = %9.4f F = %6d ",
- pCut->Useless, pCut->Delay, pCut->Flow, pCut->iFunc );
+ printf( " } D = %4d A = %9d F = %6d ",
+ pCut->Delay, pCut->Flow, pCut->iFunc );
if ( p->vTtMem )
Dau_DsdPrintFromTruth( Vec_MemReadEntry(p->vTtMem, Abc_Lit2Var(pCut->iFunc)), pCut->nLeaves );
else
@@ -382,37 +379,28 @@ static inline int Of_ManPrepareCuts( Of_Cut_t * pCuts, Of_Man_t * p, int iObj, i
}
return Of_CutCreateUnit( pCuts, iObj );
}
-static inline int Of_ManSaveCuts( Of_Man_t * p, Of_Cut_t ** pCuts, int nCuts, int fUseful )
+static inline int Of_ManSaveCuts( Of_Man_t * p, Of_Cut_t ** pCuts, int nCuts )
{
int i, * pPlace, iCur, nInts = 1, nCutsNew = 0;
for ( i = 0; i < nCuts; i++ )
- if ( !fUseful || !pCuts[i]->Useless )
- nInts += pCuts[i]->nLeaves + OF_CUT_EXTRA, nCutsNew++;
+ nInts += pCuts[i]->nLeaves + OF_CUT_EXTRA, nCutsNew++;
if ( (p->iCur & 0xFFFF) + nInts > 0xFFFF )
p->iCur = ((p->iCur >> 16) + 1) << 16;
if ( Vec_PtrSize(&p->vPages) == (p->iCur >> 16) )
- Vec_PtrPush( &p->vPages, ABC_ALLOC(int, (1<<16)) );
+ Vec_PtrPush( &p->vPages, ABC_CALLOC(int, (1<<16)) );
iCur = p->iCur; p->iCur += nInts;
pPlace = Of_ManCutSet( p, iCur );
*pPlace++ = nCutsNew;
for ( i = 0; i < nCuts; i++ )
- if ( !fUseful || !pCuts[i]->Useless )
- {
- *pPlace++ = Of_CutSetBoth( pCuts[i]->nLeaves, pCuts[i]->iFunc );
- memcpy( pPlace, pCuts[i]->pLeaves, sizeof(int) * pCuts[i]->nLeaves );
- pPlace += pCuts[i]->nLeaves;
- memset( pPlace, 0xFF, sizeof(int) * (OF_CUT_EXTRA - 1) );
- pPlace += OF_CUT_EXTRA - 1;
- }
+ {
+ *pPlace++ = Of_CutSetBoth( pCuts[i]->nLeaves, pCuts[i]->iFunc );
+ memcpy( pPlace, pCuts[i]->pLeaves, sizeof(int) * pCuts[i]->nLeaves );
+ pPlace += pCuts[i]->nLeaves;
+ memset( pPlace, 0xFF, sizeof(int) * (OF_CUT_EXTRA - 1) );
+ pPlace += OF_CUT_EXTRA - 1;
+ }
return iCur;
}
-static inline int Of_ManCountUseful( Of_Cut_t ** pCuts, int nCuts )
-{
- int i, Count = 0;
- for ( i = 0; i < nCuts; i++ )
- Count += !pCuts[i]->Useless;
- return Count;
-}
static inline void Of_ManLiftCuts( Of_Man_t * p, int iObj )
{
int i, k, * pCut, * pList = Of_ObjCutSet(p, iObj);
@@ -640,8 +628,6 @@ static inline int Of_SetLastCutContainsArea( Of_Cut_t ** pCuts, int nCuts )
}
static inline int Of_CutCompareArea( Of_Cut_t * pCut0, Of_Cut_t * pCut1 )
{
- if ( pCut0->Useless < pCut1->Useless ) return -1;
- if ( pCut0->Useless > pCut1->Useless ) return 1;
if ( pCut0->Delay < pCut1->Delay ) return -1;
if ( pCut0->Delay > pCut1->Delay ) return 1;
if ( pCut0->Flow < pCut1->Flow ) return -1;
@@ -701,7 +687,7 @@ void Of_ObjMergeOrder( Of_Man_t * p, int iObj )
int fComp1 = Gia_ObjFaninC1(pObj);
int iSibl = Gia_ObjSibl(p->pGia, iObj);
Of_Cut_t * pCut0, * pCut1, * pCut0Lim = pCuts0 + nCuts0, * pCut1Lim = pCuts1 + nCuts1;
- int i, nCutsUse, nCutsR = 0;
+ int i, nCutsR = 0;
assert( !Gia_ObjIsBuf(pObj) );
for ( i = 0; i < nCutNum; i++ )
pCutsR[i] = pCuts + i;
@@ -769,10 +755,8 @@ void Of_ObjMergeOrder( Of_Man_t * p, int iObj )
}
// debug printout
if ( 0 )
-// if ( iObj % 10000 == 0 )
-// if ( iObj == 1090 )
{
- printf( "*** Obj = %d Useful = %d\n", iObj, Of_ManCountUseful(pCutsR, nCutsR) );
+ printf( "*** Obj = %d\n", iObj );
for ( i = 0; i < nCutsR; i++ )
Of_Cutprintf( p, pCutsR[i] );
printf( "\n" );
@@ -783,11 +767,8 @@ void Of_ObjMergeOrder( Of_Man_t * p, int iObj )
// store the cutset
Of_ObjSetCutFlow( p, iObj, pCutsR[0]->Flow );
Of_ObjSetCutDelay( p, iObj, pCutsR[0]->Delay );
- *Vec_IntEntryP(&p->vCutSets, iObj) = Of_ManSaveCuts(p, pCutsR, nCutsR, 0);
+ *Vec_IntEntryP(&p->vCutSets, iObj) = Of_ManSaveCuts(p, pCutsR, nCutsR);
p->CutCount[3] += nCutsR;
- nCutsUse = Of_ManCountUseful(pCutsR, nCutsR);
- p->CutCount[4] += nCutsUse;
- p->nCutUseAll += nCutsUse == nCutsR;
}
void Of_ManComputeCuts( Of_Man_t * p )
{