Commit c49739c3 by Alan Mishchenko

Changing default values.

parent 726e7039
...@@ -123,7 +123,10 @@ void Gia_ManSimplifyAnd( Vec_Int_t * vSuper ) ...@@ -123,7 +123,10 @@ void Gia_ManSimplifyAnd( Vec_Int_t * vSuper )
void Gia_ManSuperCollectXor_rec( Gia_Man_t * p, Gia_Obj_t * pObj ) void Gia_ManSuperCollectXor_rec( Gia_Man_t * p, Gia_Obj_t * pObj )
{ {
assert( !Gia_IsComplement(pObj) ); assert( !Gia_IsComplement(pObj) );
if ( !Gia_ObjIsXor(pObj) || Gia_ObjRefNum(p, pObj) > 1 || Vec_IntSize(p->vSuper) > 100 ) if ( !Gia_ObjIsXor(pObj) ||
Gia_ObjRefNum(p, pObj) > 2 ||
(Gia_ObjRefNum(p, pObj) == 2 && (Gia_ObjRefNum(p, Gia_ObjFanin0(pObj)) == 1 || Gia_ObjRefNum(p, Gia_ObjFanin1(pObj)) == 1)) ||
Vec_IntSize(p->vSuper) > 100 )
{ {
Vec_IntPush( p->vSuper, Gia_ObjToLit(p, pObj) ); Vec_IntPush( p->vSuper, Gia_ObjToLit(p, pObj) );
return; return;
...@@ -134,7 +137,11 @@ void Gia_ManSuperCollectXor_rec( Gia_Man_t * p, Gia_Obj_t * pObj ) ...@@ -134,7 +137,11 @@ void Gia_ManSuperCollectXor_rec( Gia_Man_t * p, Gia_Obj_t * pObj )
} }
void Gia_ManSuperCollectAnd_rec( Gia_Man_t * p, Gia_Obj_t * pObj ) void Gia_ManSuperCollectAnd_rec( Gia_Man_t * p, Gia_Obj_t * pObj )
{ {
if ( Gia_IsComplement(pObj) || !Gia_ObjIsAndReal(p, pObj) || Gia_ObjRefNum(p, pObj) > 1 || Vec_IntSize(p->vSuper) > 100 ) if ( Gia_IsComplement(pObj) ||
!Gia_ObjIsAndReal(p, pObj) ||
Gia_ObjRefNum(p, pObj) > 2 ||
(Gia_ObjRefNum(p, pObj) == 2 && (Gia_ObjRefNum(p, Gia_ObjFanin0(pObj)) == 1 || Gia_ObjRefNum(p, Gia_ObjFanin1(pObj)) == 1)) ||
Vec_IntSize(p->vSuper) > 100 )
{ {
Vec_IntPush( p->vSuper, Gia_ObjToLit(p, pObj) ); Vec_IntPush( p->vSuper, Gia_ObjToLit(p, pObj) );
return; return;
...@@ -454,6 +461,12 @@ void Dam_ManCollectSets( Dam_Man_t * p ) ...@@ -454,6 +461,12 @@ void Dam_ManCollectSets( Dam_Man_t * p )
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
int Dam_ManDivLevel( Gia_Man_t * p, int iLit0, int iLit1 )
{
int Lev0 = Gia_ObjLevel(p, Gia_ManObj(p, Abc_Lit2Var(iLit0)));
int Lev1 = Gia_ObjLevel(p, Gia_ManObj(p, Abc_Lit2Var(iLit1)));
return Abc_MaxInt(Lev0, Lev1) + 1 + (int)(iLit0 > iLit1);
}
void Dam_ManCreateMultiRefs( Dam_Man_t * p, Vec_Int_t ** pvRefsAnd, Vec_Int_t ** pvRefsXor ) void Dam_ManCreateMultiRefs( Dam_Man_t * p, Vec_Int_t ** pvRefsAnd, Vec_Int_t ** pvRefsXor )
{ {
Vec_Int_t * vRefsAnd, * vRefsXor; Vec_Int_t * vRefsAnd, * vRefsXor;
...@@ -489,6 +502,8 @@ void Dam_ManCreatePairs( Dam_Man_t * p, int fVerbose ) ...@@ -489,6 +502,8 @@ void Dam_ManCreatePairs( Dam_Man_t * p, int fVerbose )
int nPairsAll = 0, nPairsTried = 0, nPairsUsed = 0, nPairsXor = 0; int nPairsAll = 0, nPairsTried = 0, nPairsUsed = 0, nPairsXor = 0;
int nDivsAll = 0, nDivsUsed = 0, nDivsXor = 0; int nDivsAll = 0, nDivsUsed = 0, nDivsXor = 0;
Dam_ManCollectSets( p ); Dam_ManCollectSets( p );
Gia_ManLevelNum( p->pGia );
Vec_IntFillExtra( p->pGia->vLevels, 3*Gia_ManObjNum(p->pGia)/2, 0 );
vSuper = p->pGia->vSuper; vSuper = p->pGia->vSuper;
vDivs = Vec_IntAlloc( Gia_ManObjNum(p->pGia) ); vDivs = Vec_IntAlloc( Gia_ManObjNum(p->pGia) );
vHash = Hash_IntManStart( Gia_ManObjNum(p->pGia)/2 ); vHash = Hash_IntManStart( Gia_ManObjNum(p->pGia)/2 );
...@@ -502,11 +517,9 @@ void Dam_ManCreatePairs( Dam_Man_t * p, int fVerbose ) ...@@ -502,11 +517,9 @@ void Dam_ManCreatePairs( Dam_Man_t * p, int fVerbose )
Vec_IntClear(vSuper); Vec_IntClear(vSuper);
if ( Gia_ObjIsXor(pObj) ) if ( Gia_ObjIsXor(pObj) )
{ {
// printf( "%d -> ", pSet[0] );
for ( k = 1; k <= pSet[0]; k++ ) for ( k = 1; k <= pSet[0]; k++ )
if ( Vec_IntEntry(vRefsXor, Abc_Lit2Var(pSet[k])) > 1 ) if ( Vec_IntEntry(vRefsXor, Abc_Lit2Var(pSet[k])) > 1 )
Vec_IntPush( vSuper, pSet[k] ); Vec_IntPush( vSuper, pSet[k] );
// printf( "%d ", Vec_IntSize(vSuper) );
} }
else if ( Gia_ObjIsAndReal(p->pGia, pObj) ) else if ( Gia_ObjIsAndReal(p->pGia, pObj) )
{ {
...@@ -559,7 +572,7 @@ void Dam_ManCreatePairs( Dam_Man_t * p, int fVerbose ) ...@@ -559,7 +572,7 @@ void Dam_ManCreatePairs( Dam_Man_t * p, int fVerbose )
Num = Hash_Int2ManInsert( p->vHash, Hash_IntObjData0(vHash, i), Hash_IntObjData1(vHash, i), 0 ); Num = Hash_Int2ManInsert( p->vHash, Hash_IntObjData0(vHash, i), Hash_IntObjData1(vHash, i), 0 );
assert( Num == Hash_IntManEntryNum(p->vHash) ); assert( Num == Hash_IntManEntryNum(p->vHash) );
assert( Num == Vec_FltSize(p->vCounts) ); assert( Num == Vec_FltSize(p->vCounts) );
Vec_FltPush( p->vCounts, nRefs-1 ); Vec_FltPush( p->vCounts, nRefs ); //+ 0.01*Dam_ManDivLevel(p->pGia, Hash_IntObjData0(vHash, i), Hash_IntObjData1(vHash, i)) );
Vec_QuePush( p->vQue, Num ); Vec_QuePush( p->vQue, Num );
// remember divisors // remember divisors
assert( Num == Vec_IntSize(p->vDiv2Nod) ); assert( Num == Vec_IntSize(p->vDiv2Nod) );
...@@ -585,14 +598,13 @@ void Dam_ManCreatePairs( Dam_Man_t * p, int fVerbose ) ...@@ -585,14 +598,13 @@ void Dam_ManCreatePairs( Dam_Man_t * p, int fVerbose )
if ( Num == -1 ) if ( Num == -1 )
continue; continue;
pSet = Dam_DivSet( p, Num ); pSet = Dam_DivSet( p, Num );
assert( pSet[0] <= Vec_FltEntry(p->vCounts, Num) );
pSet[++pSet[0]] = iNode; pSet[++pSet[0]] = iNode;
} }
Vec_IntFree( vRemap ); Vec_IntFree( vRemap );
Vec_IntFree( vDivs ); Vec_IntFree( vDivs );
// make sure divisors are added correctly // make sure divisors are added correctly
for ( i = 1; i <= nDivsUsed; i++ ) // for ( i = 1; i <= nDivsUsed; i++ )
assert( Dam_DivSet(p, i)[0] == Vec_FltEntry(p->vCounts, i)+1 ); // assert( Dam_DivSet(p, i)[0] == Vec_FltEntry(p->vCounts, i)+1 );
if ( !fVerbose ) if ( !fVerbose )
return; return;
// print stats // print stats
...@@ -715,7 +727,7 @@ void Dam_PrintDiv( Dam_Man_t * p, int iDiv ) ...@@ -715,7 +727,7 @@ void Dam_PrintDiv( Dam_Man_t * p, int iDiv )
printf( "%c ", (iData0 < iData1) ? '*' : '+' ); printf( "%c ", (iData0 < iData1) ? '*' : '+' );
sprintf( Buffer, "%c%d", Abc_LitIsCompl(iData1)? '!':' ', Abc_Lit2Var(iData1) ); sprintf( Buffer, "%c%d", Abc_LitIsCompl(iData1)? '!':' ', Abc_Lit2Var(iData1) );
printf( "%8s ", Buffer ); printf( "%8s ", Buffer );
printf( "Weight %5d ", (int)Vec_FltEntry(p->vCounts, iDiv) ); printf( "Weight %9.2f ", Vec_FltEntry(p->vCounts, iDiv) );
} }
printf( "Divs =%8d ", Hash_IntManEntryNum(p->vHash) ); printf( "Divs =%8d ", Hash_IntManEntryNum(p->vHash) );
printf( "Ands =%8d ", p->nAnds - p->nGain ); printf( "Ands =%8d ", p->nAnds - p->nGain );
...@@ -730,7 +742,7 @@ void Dam_PrintQue( Dam_Man_t * p ) ...@@ -730,7 +742,7 @@ void Dam_PrintQue( Dam_Man_t * p )
int iLit0 = Hash_IntObjData0(p->vHash, i); int iLit0 = Hash_IntObjData0(p->vHash, i);
int iLit1 = Hash_IntObjData1(p->vHash, i); int iLit1 = Hash_IntObjData1(p->vHash, i);
printf( "Div %7d : ", i ); printf( "Div %7d : ", i );
printf( "Weight %5d ", (int)Vec_FltEntry(p->vCounts, i) ); printf( "Weight %9.2f ", Vec_FltEntry(p->vCounts, i) );
printf( "F = %c%c ", Abc_LitIsCompl(iLit0) ? '!': ' ', 'a' + Abc_Lit2Var(iLit0)-1 ); printf( "F = %c%c ", Abc_LitIsCompl(iLit0) ? '!': ' ', 'a' + Abc_Lit2Var(iLit0)-1 );
printf( "%c ", (Hash_IntObjData0(p->vHash, i) < Hash_IntObjData1(p->vHash, i)) ? '*':'+' ); printf( "%c ", (Hash_IntObjData0(p->vHash, i) < Hash_IntObjData1(p->vHash, i)) ? '*':'+' );
printf( "%c%c ", Abc_LitIsCompl(iLit1) ? '!': ' ', 'a' + Abc_Lit2Var(iLit1)-1 ); printf( "%c%c ", Abc_LitIsCompl(iLit1) ? '!': ' ', 'a' + Abc_Lit2Var(iLit1)-1 );
...@@ -773,10 +785,12 @@ int Dam_ManUpdateNode( Dam_Man_t * p, int iObj, int iLit0, int iLit1, int iLitNe ...@@ -773,10 +785,12 @@ int Dam_ManUpdateNode( Dam_Man_t * p, int iObj, int iLit0, int iLit1, int iLitNe
{ {
Vec_FltAddToEntry( p->vCounts, Num, -1 ); Vec_FltAddToEntry( p->vCounts, Num, -1 );
if ( Vec_QueIsMember(p->vQue, Num) ) if ( Vec_QueIsMember(p->vQue, Num) )
{
Vec_QueUpdate( p->vQue, Num ); Vec_QueUpdate( p->vQue, Num );
fPres |= (1 << c); fPres |= (1 << c);
} }
} }
}
if ( fPres != 3 ) if ( fPres != 3 )
continue; continue;
if ( (iLit > iLitNew) ^ (iLit0 > iLit1) ) if ( (iLit > iLitNew) ^ (iLit0 > iLit1) )
...@@ -803,6 +817,8 @@ void Dam_ManUpdate( Dam_Man_t * p, int iDiv ) ...@@ -803,6 +817,8 @@ void Dam_ManUpdate( Dam_Man_t * p, int iDiv )
iLitNew = Gia_ManAppendXorReal( p->pGia, iLit0, iLit1 ); iLitNew = Gia_ManAppendXorReal( p->pGia, iLit0, iLit1 );
else else
iLitNew = Gia_ManAppendAnd( p->pGia, iLit0, iLit1 ); iLitNew = Gia_ManAppendAnd( p->pGia, iLit0, iLit1 );
Gia_ObjSetGateLevel( p->pGia, Gia_ManObj(p->pGia, Abc_Lit2Var(iLitNew)) );
// printf( "%d ", Gia_ObjLevel(p->pGia, Gia_ManObj(p->pGia, Abc_Lit2Var(iLitNew))) );
// replace entries // replace entries
assert( pNods[0] >= 2 ); assert( pNods[0] >= 2 );
nPairsStart = Hash_IntManEntryNum(p->vHash) + 1; nPairsStart = Hash_IntManEntryNum(p->vHash) + 1;
...@@ -819,7 +835,7 @@ void Dam_ManUpdate( Dam_Man_t * p, int iDiv ) ...@@ -819,7 +835,7 @@ void Dam_ManUpdate( Dam_Man_t * p, int iDiv )
nRefs = Hash_IntObjData2(p->vHash, i); nRefs = Hash_IntObjData2(p->vHash, i);
if ( nRefs < 2 ) if ( nRefs < 2 )
continue; continue;
Vec_FltWriteEntry( p->vCounts, i, nRefs-1 ); Vec_FltWriteEntry( p->vCounts, i, nRefs + 0.01*Dam_ManDivLevel(p->pGia, Hash_IntObjData0(p->vHash, i), Hash_IntObjData1(p->vHash, i)) );
Vec_QuePush( p->vQue, i ); Vec_QuePush( p->vQue, i );
// remember divisors // remember divisors
Vec_IntWriteEntry( p->vDiv2Nod, i, Vec_IntSize(p->vNodStore) ); Vec_IntWriteEntry( p->vDiv2Nod, i, Vec_IntSize(p->vNodStore) );
...@@ -840,13 +856,12 @@ void Dam_ManUpdate( Dam_Man_t * p, int iDiv ) ...@@ -840,13 +856,12 @@ void Dam_ManUpdate( Dam_Man_t * p, int iDiv )
if ( Vec_IntEntry(p->vDiv2Nod, iDivTemp) == -1 ) if ( Vec_IntEntry(p->vDiv2Nod, iDivTemp) == -1 )
continue; continue;
pSet = Dam_DivSet( p, iDivTemp ); pSet = Dam_DivSet( p, iDivTemp );
assert( pSet[0] <= Vec_FltEntry(p->vCounts, iDivTemp) );
pSet[++pSet[0]] = iNode; pSet[++pSet[0]] = iNode;
} }
// make sure divisors are added correctly // make sure divisors are added correctly
for ( i = nPairsStart; i < nPairsStop; i++ ) for ( i = nPairsStart; i < nPairsStop; i++ )
if ( Vec_IntEntry(p->vDiv2Nod, i) > 0 ) if ( Vec_IntEntry(p->vDiv2Nod, i) > 0 )
assert( Dam_DivSet(p, i)[0] == Vec_FltEntry(p->vCounts, i)+1 ); assert( Dam_DivSet(p, i)[0] == Hash_IntObjData2(p->vHash, i) );
// update costs // update costs
Vec_FltWriteEntry( p->vCounts, iDiv, 0 ); Vec_FltWriteEntry( p->vCounts, iDiv, 0 );
p->nGain += (1 + 2 * fThisIsXor) * (nPresent - 1); p->nGain += (1 + 2 * fThisIsXor) * (nPresent - 1);
......
...@@ -48,6 +48,7 @@ Gia_Man_t * Gia_ManDupMuxes( Gia_Man_t * p ) ...@@ -48,6 +48,7 @@ Gia_Man_t * Gia_ManDupMuxes( Gia_Man_t * p )
Gia_Obj_t * pObj, * pFan0, * pFan1, * pFanC; Gia_Obj_t * pObj, * pFan0, * pFan1, * pFanC;
int i; int i;
assert( p->pMuxes == NULL ); assert( p->pMuxes == NULL );
Gia_ManCreateRefs( p );
// start the new manager // start the new manager
pNew = Gia_ManStart( 5000 ); pNew = Gia_ManStart( 5000 );
pNew->pName = Abc_UtilStrsav( p->pName ); pNew->pName = Abc_UtilStrsav( p->pName );
...@@ -62,7 +63,7 @@ Gia_Man_t * Gia_ManDupMuxes( Gia_Man_t * p ) ...@@ -62,7 +63,7 @@ Gia_Man_t * Gia_ManDupMuxes( Gia_Man_t * p )
Gia_ManHashStart( pNew ); Gia_ManHashStart( pNew );
Gia_ManForEachAnd( p, pObj, i ) Gia_ManForEachAnd( p, pObj, i )
{ {
if ( !Gia_ObjIsMuxType(pObj) ) if ( !Gia_ObjIsMuxType(pObj) || (Gia_ObjRefNum(p, Gia_ObjFanin0(pObj)) > 1 && Gia_ObjRefNum(p, Gia_ObjFanin1(pObj)) > 1) )
pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) ); pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
else if ( Gia_ObjRecognizeExor(pObj, &pFan0, &pFan1) ) else if ( Gia_ObjRecognizeExor(pObj, &pFan0, &pFan1) )
pObj->Value = Gia_ManHashXorReal( pNew, Gia_ObjLitCopy(p, Gia_ObjToLit(p, pFan0)), Gia_ObjLitCopy(p, Gia_ObjToLit(p, pFan1)) ); pObj->Value = Gia_ManHashXorReal( pNew, Gia_ObjLitCopy(p, Gia_ObjToLit(p, pFan0)), Gia_ObjLitCopy(p, Gia_ObjToLit(p, pFan1)) );
......
...@@ -496,7 +496,7 @@ int Gia_ManLevelNum( Gia_Man_t * p ) ...@@ -496,7 +496,7 @@ int Gia_ManLevelNum( Gia_Man_t * p )
Gia_ManForEachObj( p, pObj, i ) Gia_ManForEachObj( p, pObj, i )
{ {
if ( Gia_ObjIsAnd(pObj) ) if ( Gia_ObjIsAnd(pObj) )
Gia_ObjSetAndLevel( p, pObj ); Gia_ObjSetGateLevel( p, pObj );
else if ( Gia_ObjIsCo(pObj) ) else if ( Gia_ObjIsCo(pObj) )
Gia_ObjSetCoLevel( p, pObj ); Gia_ObjSetCoLevel( p, pObj );
else else
......
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