mirror of https://github.com/YosysHQ/abc.git
Improvements to DSD manager.
This commit is contained in:
parent
883e21fe8a
commit
b085ba4b51
|
|
@ -63,9 +63,9 @@ struct If_DsdMan_t_
|
|||
int nBins; // table size
|
||||
unsigned * pBins; // hash table
|
||||
Mem_Flex_t * pMem; // memory for nodes
|
||||
Vec_Ptr_t * vObjs; // objects
|
||||
Vec_Int_t * vNexts; // next pointers
|
||||
Vec_Int_t * vTruths; // truth IDs of prime nodes
|
||||
Vec_Ptr_t vObjs; // objects
|
||||
Vec_Int_t vNexts; // next pointers
|
||||
Vec_Int_t vTruths; // truth IDs of prime nodes
|
||||
Vec_Int_t * vTemp1; // temp
|
||||
Vec_Int_t * vTemp2; // temp
|
||||
word ** pTtElems; // elementary TTs
|
||||
|
|
@ -85,9 +85,9 @@ struct If_DsdMan_t_
|
|||
};
|
||||
|
||||
static inline int If_DsdObjWordNum( int nFans ) { return sizeof(If_DsdObj_t) / 8 + nFans / 2 + ((nFans & 1) > 0); }
|
||||
static inline int If_DsdObjTruthId( If_DsdMan_t * p, If_DsdObj_t * pObj ) { return (pObj->Type == IF_DSD_PRIME && pObj->nFans > 2) ? Vec_IntEntry(p->vTruths, pObj->Id) : -1; }
|
||||
static inline int If_DsdObjTruthId( If_DsdMan_t * p, If_DsdObj_t * pObj ) { return (pObj->Type == IF_DSD_PRIME && pObj->nFans > 2) ? Vec_IntEntry(&p->vTruths, pObj->Id) : -1; }
|
||||
static inline word * If_DsdObjTruth( If_DsdMan_t * p, If_DsdObj_t * pObj ) { return Vec_MemReadEntry(p->vTtMem[pObj->nFans], If_DsdObjTruthId(p, pObj)); }
|
||||
static inline void If_DsdObjSetTruth( If_DsdMan_t * p, If_DsdObj_t * pObj, int Id ) { assert( pObj->Type == IF_DSD_PRIME && pObj->nFans > 2 ); Vec_IntWriteEntry(p->vTruths, pObj->Id, Id); }
|
||||
static inline void If_DsdObjSetTruth( If_DsdMan_t * p, If_DsdObj_t * pObj, int Id ) { assert( pObj->Type == IF_DSD_PRIME && pObj->nFans > 2 ); Vec_IntWriteEntry(&p->vTruths, pObj->Id, Id); }
|
||||
|
||||
static inline void If_DsdObjClean( If_DsdObj_t * pObj ) { memset( pObj, 0, sizeof(If_DsdObj_t) ); }
|
||||
static inline int If_DsdObjId( If_DsdObj_t * pObj ) { return pObj->Id; }
|
||||
|
|
@ -152,7 +152,7 @@ int If_DsdManLutSize( If_DsdMan_t * p )
|
|||
}
|
||||
int If_DsdManCheckDec( If_DsdMan_t * p, int iDsd )
|
||||
{
|
||||
return If_DsdVecObjMark( p->vObjs, Abc_Lit2Var(iDsd) );
|
||||
return If_DsdVecObjMark( &p->vObjs, Abc_Lit2Var(iDsd) );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -185,14 +185,14 @@ If_DsdObj_t * If_DsdObjAlloc( If_DsdMan_t * p, int Type, int nFans )
|
|||
If_DsdObjClean( pObj );
|
||||
pObj->Type = Type;
|
||||
pObj->nFans = nFans;
|
||||
pObj->Id = Vec_PtrSize( p->vObjs );
|
||||
pObj->Id = Vec_PtrSize( &p->vObjs );
|
||||
pObj->fMark = 0;
|
||||
pObj->Count = 0;
|
||||
Vec_PtrPush( p->vObjs, pObj );
|
||||
Vec_IntPush( p->vNexts, 0 );
|
||||
Vec_IntPush( p->vTruths, -1 );
|
||||
assert( Vec_IntSize(p->vNexts) == Vec_PtrSize(p->vObjs) );
|
||||
assert( Vec_IntSize(p->vTruths) == Vec_PtrSize(p->vObjs) );
|
||||
Vec_PtrPush( &p->vObjs, pObj );
|
||||
Vec_IntPush( &p->vNexts, 0 );
|
||||
Vec_IntPush( &p->vTruths, -1 );
|
||||
assert( Vec_IntSize(&p->vNexts) == Vec_PtrSize(&p->vObjs) );
|
||||
assert( Vec_IntSize(&p->vTruths) == Vec_PtrSize(&p->vObjs) );
|
||||
return pObj;
|
||||
}
|
||||
If_DsdMan_t * If_DsdManAlloc( int nVars, int LutSize )
|
||||
|
|
@ -208,9 +208,9 @@ If_DsdMan_t * If_DsdManAlloc( int nVars, int LutSize )
|
|||
p->nBins = Abc_PrimeCudd( 100000 );
|
||||
p->pBins = ABC_CALLOC( unsigned, p->nBins );
|
||||
p->pMem = Mem_FlexStart();
|
||||
p->vObjs = Vec_PtrAlloc( 10000 );
|
||||
p->vNexts = Vec_IntAlloc( 10000 );
|
||||
p->vTruths = Vec_IntAlloc( 10000 );
|
||||
Vec_PtrGrow( &p->vObjs, 10000 );
|
||||
Vec_IntGrow( &p->vNexts, 10000 );
|
||||
Vec_IntGrow( &p->vTruths, 10000 );
|
||||
If_DsdObjAlloc( p, IF_DSD_CONST0, 0 );
|
||||
If_DsdObjAlloc( p, IF_DSD_VAR, 0 )->nSupp = 1;
|
||||
p->vTemp1 = Vec_IntAlloc( 32 );
|
||||
|
|
@ -260,9 +260,9 @@ void If_DsdManFree( If_DsdMan_t * p, int fVerbose )
|
|||
}
|
||||
Vec_IntFreeP( &p->vTemp1 );
|
||||
Vec_IntFreeP( &p->vTemp2 );
|
||||
Vec_IntFreeP( &p->vNexts );
|
||||
Vec_IntFreeP( &p->vTruths );
|
||||
Vec_PtrFreeP( &p->vObjs );
|
||||
ABC_FREE( p->vObjs.pArray );
|
||||
ABC_FREE( p->vNexts.pArray );
|
||||
ABC_FREE( p->vTruths.pArray );
|
||||
Mem_FlexStop( p->pMem, 0 );
|
||||
Gia_ManStopP( &p->pTtGia );
|
||||
Vec_IntFreeP( &p->vCover );
|
||||
|
|
@ -286,7 +286,7 @@ void If_DsdManDumpDsd( If_DsdMan_t * p, int Support )
|
|||
for ( v = 3; v <= p->nVars; v++ )
|
||||
{
|
||||
vMap = Vec_IntStart( Vec_MemEntryNum(p->vTtMem[v]) );
|
||||
If_DsdVecForEachObj( p->vObjs, pObj, i )
|
||||
If_DsdVecForEachObj( &p->vObjs, pObj, i )
|
||||
{
|
||||
if ( Support && Support != If_DsdObjSuppSize(pObj) )
|
||||
continue;
|
||||
|
|
@ -317,7 +317,7 @@ void If_DsdManDumpAll( If_DsdMan_t * p, int Support )
|
|||
printf( "Cannot open file \"%s\".\n", pFileName );
|
||||
return;
|
||||
}
|
||||
If_DsdVecForEachObj( p->vObjs, pObj, i )
|
||||
If_DsdVecForEachObj( &p->vObjs, pObj, i )
|
||||
{
|
||||
if ( Support && Support != If_DsdObjSuppSize(pObj) )
|
||||
continue;
|
||||
|
|
@ -350,8 +350,8 @@ void If_DsdManHashProfile( If_DsdMan_t * p )
|
|||
for ( i = 0; i < p->nBins; i++ )
|
||||
{
|
||||
Counter = 0;
|
||||
for ( pSpot = p->pBins + i; *pSpot; pSpot = (unsigned *)Vec_IntEntryP(p->vNexts, pObj->Id), Counter++ )
|
||||
pObj = If_DsdVecObj( p->vObjs, *pSpot );
|
||||
for ( pSpot = p->pBins + i; *pSpot; pSpot = (unsigned *)Vec_IntEntryP(&p->vNexts, pObj->Id), Counter++ )
|
||||
pObj = If_DsdVecObj( &p->vObjs, *pSpot );
|
||||
// if ( Counter > 5 )
|
||||
// printf( "%d ", Counter );
|
||||
// if ( i > 10000 )
|
||||
|
|
@ -363,14 +363,14 @@ int If_DsdManCheckNonDec_rec( If_DsdMan_t * p, int Id )
|
|||
{
|
||||
If_DsdObj_t * pObj;
|
||||
int i, iFanin;
|
||||
pObj = If_DsdVecObj( p->vObjs, Id );
|
||||
pObj = If_DsdVecObj( &p->vObjs, Id );
|
||||
if ( If_DsdObjType(pObj) == IF_DSD_CONST0 )
|
||||
return 0;
|
||||
if ( If_DsdObjType(pObj) == IF_DSD_VAR )
|
||||
return 0;
|
||||
if ( If_DsdObjType(pObj) == IF_DSD_PRIME )
|
||||
return 1;
|
||||
If_DsdObjForEachFaninLit( p->vObjs, pObj, iFanin, i )
|
||||
If_DsdObjForEachFaninLit( &p->vObjs, pObj, iFanin, i )
|
||||
if ( If_DsdManCheckNonDec_rec( p, Abc_Lit2Var(iFanin) ) )
|
||||
return 1;
|
||||
return 0;
|
||||
|
|
@ -382,7 +382,7 @@ void If_DsdManPrint_rec( FILE * pFile, If_DsdMan_t * p, int iDsdLit, unsigned ch
|
|||
If_DsdObj_t * pObj;
|
||||
int i, iFanin;
|
||||
fprintf( pFile, "%s", Abc_LitIsCompl(iDsdLit) ? "!" : "" );
|
||||
pObj = If_DsdVecObj( p->vObjs, Abc_Lit2Var(iDsdLit) );
|
||||
pObj = If_DsdVecObj( &p->vObjs, Abc_Lit2Var(iDsdLit) );
|
||||
if ( If_DsdObjType(pObj) == IF_DSD_CONST0 )
|
||||
{ fprintf( pFile, "0" ); return; }
|
||||
if ( If_DsdObjType(pObj) == IF_DSD_VAR )
|
||||
|
|
@ -394,7 +394,7 @@ void If_DsdManPrint_rec( FILE * pFile, If_DsdMan_t * p, int iDsdLit, unsigned ch
|
|||
if ( If_DsdObjType(pObj) == IF_DSD_PRIME )
|
||||
Abc_TtPrintHexRev( pFile, If_DsdObjTruth(p, pObj), If_DsdObjFaninNum(pObj) );
|
||||
fprintf( pFile, "%c", OpenType[If_DsdObjType(pObj)] );
|
||||
If_DsdObjForEachFaninLit( p->vObjs, pObj, iFanin, i )
|
||||
If_DsdObjForEachFaninLit( &p->vObjs, pObj, iFanin, i )
|
||||
If_DsdManPrint_rec( pFile, p, iFanin, pPermLits, pnSupp );
|
||||
fprintf( pFile, "%c", CloseType[If_DsdObjType(pObj)] );
|
||||
}
|
||||
|
|
@ -402,13 +402,13 @@ void If_DsdManPrintOne( FILE * pFile, If_DsdMan_t * p, int iObjId, unsigned char
|
|||
{
|
||||
int nSupp = 0;
|
||||
fprintf( pFile, "%6d : ", iObjId );
|
||||
fprintf( pFile, "%2d ", If_DsdVecObjSuppSize(p->vObjs, iObjId) );
|
||||
fprintf( pFile, "%8d ", If_DsdVecObjRef(p->vObjs, iObjId) );
|
||||
fprintf( pFile, "%d ", If_DsdVecObjMark(p->vObjs, iObjId) );
|
||||
fprintf( pFile, "%2d ", If_DsdVecObjSuppSize(&p->vObjs, iObjId) );
|
||||
fprintf( pFile, "%8d ", If_DsdVecObjRef(&p->vObjs, iObjId) );
|
||||
fprintf( pFile, "%d ", If_DsdVecObjMark(&p->vObjs, iObjId) );
|
||||
If_DsdManPrint_rec( pFile, p, Abc_Var2Lit(iObjId, 0), pPermLits, &nSupp );
|
||||
if ( fNewLine )
|
||||
fprintf( pFile, "\n" );
|
||||
assert( nSupp == If_DsdVecObjSuppSize(p->vObjs, iObjId) );
|
||||
assert( nSupp == If_DsdVecObjSuppSize(&p->vObjs, iObjId) );
|
||||
}
|
||||
#define DSD_ARRAY_LIMIT 16
|
||||
void If_DsdManPrintDecs( FILE * pFile, If_DsdMan_t * p )
|
||||
|
|
@ -487,7 +487,7 @@ void If_DsdManPrintOccurs( FILE * pFile, If_DsdMan_t * p )
|
|||
int i, k, nSizeMax, Counter = 0;
|
||||
// determine the largest fanin and fanout
|
||||
nOccursMax = nOccursAll = 0;
|
||||
If_DsdVecForEachNode( p->vObjs, pObj, i )
|
||||
If_DsdVecForEachNode( &p->vObjs, pObj, i )
|
||||
{
|
||||
nOccurs = pObj->Count;
|
||||
nOccursAll += nOccurs;
|
||||
|
|
@ -497,7 +497,7 @@ void If_DsdManPrintOccurs( FILE * pFile, If_DsdMan_t * p )
|
|||
nSizeMax = 10 * (Abc_Base10Log(nOccursMax) + 1);
|
||||
vOccurs = Vec_IntStart( nSizeMax );
|
||||
// count the number of fanins and fanouts
|
||||
If_DsdVecForEachNode( p->vObjs, pObj, i )
|
||||
If_DsdVecForEachNode( &p->vObjs, pObj, i )
|
||||
{
|
||||
nOccurs = pObj->Count;
|
||||
if ( nOccurs < 10 )
|
||||
|
|
@ -529,11 +529,11 @@ void If_DsdManPrintOccurs( FILE * pFile, If_DsdMan_t * p )
|
|||
}
|
||||
fprintf( pFile, "%12d ", Vec_IntEntry(vOccurs, k) );
|
||||
Counter += Vec_IntEntry(vOccurs, k);
|
||||
fprintf( pFile, "(%6.2f %%)", 100.0*Counter/Vec_PtrSize(p->vObjs) );
|
||||
fprintf( pFile, "(%6.2f %%)", 100.0*Counter/Vec_PtrSize(&p->vObjs) );
|
||||
fprintf( pFile, "\n" );
|
||||
}
|
||||
Vec_IntFree( vOccurs );
|
||||
fprintf( pFile, "Fanins: Max = %d. Ave = %.2f.\n", nOccursMax, 1.0*nOccursAll/Vec_PtrSize(p->vObjs) );
|
||||
fprintf( pFile, "Fanins: Max = %d. Ave = %.2f.\n", nOccursMax, 1.0*nOccursAll/Vec_PtrSize(&p->vObjs) );
|
||||
}
|
||||
|
||||
void If_DsdManPrintDistrib( If_DsdMan_t * p )
|
||||
|
|
@ -550,7 +550,7 @@ void If_DsdManPrintDistrib( If_DsdMan_t * p )
|
|||
CountObjNpn[i] = Vec_MemEntryNum(p->vTtMem[i]);
|
||||
CountObjNpn[p->nVars+1] += Vec_MemEntryNum(p->vTtMem[i]);
|
||||
}
|
||||
If_DsdVecForEachObj( p->vObjs, pObj, i )
|
||||
If_DsdVecForEachObj( &p->vObjs, pObj, i )
|
||||
{
|
||||
CountObj[If_DsdObjFaninNum(pObj)]++, CountObj[p->nVars+1]++;
|
||||
if ( If_DsdObjType(pObj) == IF_DSD_PRIME )
|
||||
|
|
@ -558,7 +558,7 @@ void If_DsdManPrintDistrib( If_DsdMan_t * p )
|
|||
CountStr[If_DsdObjSuppSize(pObj)]++, CountStr[p->nVars+1]++;
|
||||
if ( If_DsdManCheckNonDec_rec(p, i) )
|
||||
CountStrNon[If_DsdObjSuppSize(pObj)]++, CountStrNon[p->nVars+1]++;
|
||||
if ( If_DsdVecObjMark(p->vObjs, i) )
|
||||
if ( If_DsdVecObjMark(&p->vObjs, i) )
|
||||
CountMarked[If_DsdObjSuppSize(pObj)]++, CountMarked[p->nVars+1]++;
|
||||
}
|
||||
printf( "***** DSD MANAGER STATISTICS *****\n" );
|
||||
|
|
@ -603,14 +603,14 @@ void If_DsdManPrint( If_DsdMan_t * p, char * pFileName, int Number, int Support,
|
|||
printf( "cannot open output file\n" );
|
||||
return;
|
||||
}
|
||||
If_DsdVecForEachObj( p->vObjs, pObj, i )
|
||||
If_DsdVecForEachObj( &p->vObjs, pObj, i )
|
||||
{
|
||||
if ( If_DsdObjType(pObj) == IF_DSD_PRIME )
|
||||
DsdMax = Abc_MaxInt( DsdMax, pObj->nFans );
|
||||
CountPrime += If_DsdObjType(pObj) == IF_DSD_PRIME;
|
||||
CountNonDsdStr += If_DsdManCheckNonDec_rec( p, pObj->Id );
|
||||
CountUsed += ( If_DsdVecObjRef(p->vObjs, pObj->Id) > 0 );
|
||||
CountMarked += If_DsdVecObjMark( p->vObjs, i );
|
||||
CountUsed += ( If_DsdVecObjRef(&p->vObjs, pObj->Id) > 0 );
|
||||
CountMarked += If_DsdVecObjMark( &p->vObjs, i );
|
||||
}
|
||||
for ( v = 3; v <= p->nVars; v++ )
|
||||
{
|
||||
|
|
@ -624,10 +624,10 @@ void If_DsdManPrint( If_DsdMan_t * p, char * pFileName, int Number, int Support,
|
|||
fprintf( pFile, "Unique table misses = %8d\n", p->nUniqueMisses );
|
||||
fprintf( pFile, "Unique table hits = %8d\n", p->nUniqueHits );
|
||||
fprintf( pFile, "Memory used for objects = %8.2f MB.\n", 1.0*Mem_FlexReadMemUsage(p->pMem)/(1<<20) );
|
||||
fprintf( pFile, "Memory used for functions = %8.2f MB.\n", 8.0*(MemSizeTTs+sizeof(int)*Vec_IntCap(p->vTruths))/(1<<20) );
|
||||
fprintf( pFile, "Memory used for hash table = %8.2f MB.\n", 1.0*sizeof(int)*(p->nBins+Vec_IntCap(p->vNexts))/(1<<20) );
|
||||
fprintf( pFile, "Memory used for functions = %8.2f MB.\n", 8.0*(MemSizeTTs+sizeof(int)*Vec_IntCap(&p->vTruths))/(1<<20) );
|
||||
fprintf( pFile, "Memory used for hash table = %8.2f MB.\n", 1.0*sizeof(int)*(p->nBins+Vec_IntCap(&p->vNexts))/(1<<20) );
|
||||
fprintf( pFile, "Memory used for bound sets = %8.2f MB.\n", 1.0*MemSizeDecs/(1<<20) );
|
||||
fprintf( pFile, "Memory used for array = %8.2f MB.\n", 1.0*sizeof(void *)*Vec_PtrCap(p->vObjs)/(1<<20) );
|
||||
fprintf( pFile, "Memory used for array = %8.2f MB.\n", 1.0*sizeof(void *)*Vec_PtrCap(&p->vObjs)/(1<<20) );
|
||||
if ( p->pTtGia )
|
||||
fprintf( pFile, "Memory used for AIG = %8.2f MB.\n", 8.0*Gia_ManAndNum(p->pTtGia)/(1<<20) );
|
||||
if ( p->timeDsd )
|
||||
|
|
@ -650,7 +650,7 @@ void If_DsdManPrint( If_DsdMan_t * p, char * pFileName, int Number, int Support,
|
|||
return;
|
||||
vStructs = Vec_IntAlloc( 1000 );
|
||||
vCounts = Vec_IntAlloc( 1000 );
|
||||
If_DsdVecForEachObj( p->vObjs, pObj, i )
|
||||
If_DsdVecForEachObj( &p->vObjs, pObj, i )
|
||||
{
|
||||
if ( Number && i % Number )
|
||||
continue;
|
||||
|
|
@ -665,7 +665,7 @@ void If_DsdManPrint( If_DsdMan_t * p, char * pFileName, int Number, int Support,
|
|||
for ( i = 0; i < Abc_MinInt(Vec_IntSize(vCounts), 20); i++ )
|
||||
{
|
||||
printf( "%2d : ", i+1 );
|
||||
pObj = If_DsdVecObj( p->vObjs, Vec_IntEntry(vStructs, pPerm[i]) );
|
||||
pObj = If_DsdVecObj( &p->vObjs, Vec_IntEntry(vStructs, pPerm[i]) );
|
||||
If_DsdManPrintOne( pFile, p, pObj->Id, NULL, 1 );
|
||||
}
|
||||
ABC_FREE( pPerm );
|
||||
|
|
@ -766,9 +766,9 @@ unsigned * If_DsdObjHashLookup( If_DsdMan_t * p, int Type, int * pLits, int nLit
|
|||
{
|
||||
If_DsdObj_t * pObj;
|
||||
unsigned * pSpot = p->pBins + If_DsdObjHashKey(p, Type, pLits, nLits, truthId);
|
||||
for ( ; *pSpot; pSpot = (unsigned *)Vec_IntEntryP(p->vNexts, pObj->Id) )
|
||||
for ( ; *pSpot; pSpot = (unsigned *)Vec_IntEntryP(&p->vNexts, pObj->Id) )
|
||||
{
|
||||
pObj = If_DsdVecObj( p->vObjs, *pSpot );
|
||||
pObj = If_DsdVecObj( &p->vObjs, *pSpot );
|
||||
if ( If_DsdObjType(pObj) == Type &&
|
||||
If_DsdObjFaninNum(pObj) == nLits &&
|
||||
!memcmp(pObj->pFans, pLits, sizeof(int)*If_DsdObjFaninNum(pObj)) &&
|
||||
|
|
@ -789,14 +789,14 @@ static void If_DsdObjHashResize( If_DsdMan_t * p )
|
|||
p->nBins = Abc_PrimeCudd( 2 * p->nBins );
|
||||
p->pBins = ABC_REALLOC( unsigned, p->pBins, p->nBins );
|
||||
memset( p->pBins, 0, sizeof(unsigned) * p->nBins );
|
||||
Vec_IntFill( p->vNexts, Vec_PtrSize(p->vObjs), 0 );
|
||||
If_DsdVecForEachNode( p->vObjs, pObj, i )
|
||||
Vec_IntFill( &p->vNexts, Vec_PtrSize(&p->vObjs), 0 );
|
||||
If_DsdVecForEachNode( &p->vObjs, pObj, i )
|
||||
{
|
||||
pSpot = If_DsdObjHashLookup( p, pObj->Type, (int *)pObj->pFans, pObj->nFans, If_DsdObjTruthId(p, pObj) );
|
||||
assert( *pSpot == 0 );
|
||||
*pSpot = pObj->Id;
|
||||
}
|
||||
assert( p->nUniqueMisses - Prev == Vec_PtrSize(p->vObjs) - 2 );
|
||||
assert( p->nUniqueMisses - Prev == Vec_PtrSize(&p->vObjs) - 2 );
|
||||
p->nUniqueMisses = Prev;
|
||||
}
|
||||
|
||||
|
|
@ -813,10 +813,10 @@ int If_DsdObjCreate( If_DsdMan_t * p, int Type, int * pLits, int nLits, int trut
|
|||
{
|
||||
for ( i = 0; i < nLits; i++ )
|
||||
{
|
||||
pFanin = If_DsdVecObj( p->vObjs, Abc_Lit2Var(pLits[i]) );
|
||||
pFanin = If_DsdVecObj( &p->vObjs, Abc_Lit2Var(pLits[i]) );
|
||||
assert( Type != DAU_DSD_AND || Abc_LitIsCompl(pLits[i]) || If_DsdObjType(pFanin) != DAU_DSD_AND );
|
||||
assert( Type != DAU_DSD_XOR || If_DsdObjType(pFanin) != DAU_DSD_XOR );
|
||||
assert( iPrev == -1 || If_DsdObjCompare(p, p->vObjs, iPrev, pLits[i]) <= 0 );
|
||||
assert( iPrev == -1 || If_DsdObjCompare(p, &p->vObjs, iPrev, pLits[i]) <= 0 );
|
||||
iPrev = pLits[i];
|
||||
}
|
||||
}
|
||||
|
|
@ -828,7 +828,7 @@ int If_DsdObjCreate( If_DsdMan_t * p, int Type, int * pLits, int nLits, int trut
|
|||
for ( i = 0; i < nLits; i++ )
|
||||
{
|
||||
pObj->pFans[i] = pLits[i];
|
||||
pObj->nSupp += If_DsdVecLitSuppSize(p->vObjs, pLits[i]);
|
||||
pObj->nSupp += If_DsdVecLitSuppSize(&p->vObjs, pLits[i]);
|
||||
}
|
||||
/*
|
||||
if ( Abc_Var2Lit(pObj->Id, 0) == 3274 || Abc_Var2Lit(pObj->Id, 0) == 1806 )
|
||||
|
|
@ -838,7 +838,7 @@ int If_DsdObjCreate( If_DsdMan_t * p, int Type, int * pLits, int nLits, int trut
|
|||
*/
|
||||
// check decomposability
|
||||
if ( p->LutSize && !If_DsdManCheckXY(p, Abc_Var2Lit(pObj->Id, 0), p->LutSize, 0, 0, 0) )
|
||||
If_DsdVecObjSetMark( p->vObjs, pObj->Id );
|
||||
If_DsdVecObjSetMark( &p->vObjs, pObj->Id );
|
||||
return pObj->Id;
|
||||
}
|
||||
int If_DsdObjFindOrAdd( If_DsdMan_t * p, int Type, int * pLits, int nLits, word * pTruth )
|
||||
|
|
@ -858,15 +858,15 @@ clk = Abc_Clock();
|
|||
}
|
||||
if ( p->pTtGia && truthId >= 0 && truthId == Vec_MemEntryNum(p->vTtMem[nLits])-1 )
|
||||
{
|
||||
int nObjOld = Gia_ManAndNum(p->pTtGia);
|
||||
// int nObjOld = Gia_ManAndNum(p->pTtGia);
|
||||
int Lit = Kit_TruthToGia( p->pTtGia, (unsigned *)pTruth, nLits, p->vCover, NULL, 1 );
|
||||
// printf( "%d ", Gia_ManAndNum(p->pTtGia)-nObjOld );
|
||||
Gia_ManAppendCo( p->pTtGia, Lit );
|
||||
}
|
||||
p->timeCheck += Abc_Clock() - clk;
|
||||
*pSpot = Vec_PtrSize( p->vObjs );
|
||||
*pSpot = Vec_PtrSize( &p->vObjs );
|
||||
objId = If_DsdObjCreate( p, Type, pLits, nLits, truthId );
|
||||
if ( Vec_PtrSize(p->vObjs) > p->nBins )
|
||||
if ( Vec_PtrSize(&p->vObjs) > p->nBins )
|
||||
If_DsdObjHashResize( p );
|
||||
return objId;
|
||||
}
|
||||
|
|
@ -901,15 +901,15 @@ void If_DsdManSave( If_DsdMan_t * p, char * pFileName )
|
|||
fwrite( &Num, 4, 1, pFile );
|
||||
Num = p->LutSize;
|
||||
fwrite( &Num, 4, 1, pFile );
|
||||
Num = Vec_PtrSize(p->vObjs);
|
||||
Num = Vec_PtrSize(&p->vObjs);
|
||||
fwrite( &Num, 4, 1, pFile );
|
||||
Vec_PtrForEachEntryStart( If_DsdObj_t *, p->vObjs, pObj, i, 2 )
|
||||
Vec_PtrForEachEntryStart( If_DsdObj_t *, &p->vObjs, pObj, i, 2 )
|
||||
{
|
||||
Num = If_DsdObjWordNum( pObj->nFans );
|
||||
fwrite( &Num, 4, 1, pFile );
|
||||
fwrite( pObj, sizeof(word)*Num, 1, pFile );
|
||||
if ( pObj->Type == IF_DSD_PRIME )
|
||||
fwrite( Vec_IntEntryP(p->vTruths, i), 4, 1, pFile );
|
||||
fwrite( Vec_IntEntryP(&p->vTruths, i), 4, 1, pFile );
|
||||
}
|
||||
for ( v = 3; v <= p->nVars; v++ )
|
||||
{
|
||||
|
|
@ -959,28 +959,28 @@ If_DsdMan_t * If_DsdManLoad( char * pFileName )
|
|||
p->pSat = If_ManSatBuildXY( p->LutSize );
|
||||
RetValue = fread( &Num, 4, 1, pFile );
|
||||
assert( Num >= 2 );
|
||||
Vec_PtrFillExtra( p->vObjs, Num, NULL );
|
||||
Vec_IntFill( p->vNexts, Num, 0 );
|
||||
Vec_IntFill( p->vTruths, Num, -1 );
|
||||
Vec_PtrFillExtra( &p->vObjs, Num, NULL );
|
||||
Vec_IntFill( &p->vNexts, Num, 0 );
|
||||
Vec_IntFill( &p->vTruths, Num, -1 );
|
||||
p->nBins = Abc_PrimeCudd( 2*Num );
|
||||
p->pBins = ABC_REALLOC( unsigned, p->pBins, p->nBins );
|
||||
memset( p->pBins, 0, sizeof(unsigned) * p->nBins );
|
||||
for ( i = 2; i < Vec_PtrSize(p->vObjs); i++ )
|
||||
for ( i = 2; i < Vec_PtrSize(&p->vObjs); i++ )
|
||||
{
|
||||
RetValue = fread( &Num, 4, 1, pFile );
|
||||
pObj = (If_DsdObj_t *)Mem_FlexEntryFetch( p->pMem, sizeof(word) * Num );
|
||||
RetValue = fread( pObj, sizeof(word)*Num, 1, pFile );
|
||||
Vec_PtrWriteEntry( p->vObjs, i, pObj );
|
||||
Vec_PtrWriteEntry( &p->vObjs, i, pObj );
|
||||
if ( pObj->Type == IF_DSD_PRIME )
|
||||
{
|
||||
RetValue = fread( &Num, 4, 1, pFile );
|
||||
Vec_IntWriteEntry( p->vTruths, i, Num );
|
||||
Vec_IntWriteEntry( &p->vTruths, i, Num );
|
||||
}
|
||||
pSpot = If_DsdObjHashLookup( p, pObj->Type, (int *)pObj->pFans, pObj->nFans, If_DsdObjTruthId(p, pObj) );
|
||||
assert( *pSpot == 0 );
|
||||
*pSpot = pObj->Id;
|
||||
}
|
||||
assert( p->nUniqueMisses == Vec_PtrSize(p->vObjs) - 2 );
|
||||
assert( p->nUniqueMisses == Vec_PtrSize(&p->vObjs) - 2 );
|
||||
p->nUniqueMisses = 0;
|
||||
pTruth = ABC_ALLOC( word, p->nWords );
|
||||
for ( v = 3; v <= p->nVars; v++ )
|
||||
|
|
@ -1024,24 +1024,24 @@ void If_DsdManMerge( If_DsdMan_t * p, If_DsdMan_t * pNew )
|
|||
printf( "LUT size should be the same.\n" );
|
||||
return;
|
||||
}
|
||||
vMap = Vec_IntAlloc( Vec_PtrSize(pNew->vObjs) );
|
||||
vMap = Vec_IntAlloc( Vec_PtrSize(&pNew->vObjs) );
|
||||
Vec_IntPush( vMap, 0 );
|
||||
Vec_IntPush( vMap, 1 );
|
||||
If_DsdVecForEachNode( pNew->vObjs, pObj, i )
|
||||
If_DsdVecForEachNode( &pNew->vObjs, pObj, i )
|
||||
{
|
||||
If_DsdObjForEachFaninLit( pNew->vObjs, pObj, iFanin, k )
|
||||
If_DsdObjForEachFaninLit( &pNew->vObjs, pObj, iFanin, k )
|
||||
pFanins[k] = Abc_Lit2LitV( Vec_IntArray(vMap), iFanin );
|
||||
Id = If_DsdObjFindOrAdd( p, pObj->Type, pFanins, pObj->nFans, pObj->Type == IF_DSD_PRIME ? If_DsdObjTruth(pNew, pObj) : NULL );
|
||||
Vec_IntPush( vMap, Id );
|
||||
}
|
||||
assert( Vec_IntSize(vMap) == Vec_PtrSize(pNew->vObjs) );
|
||||
assert( Vec_IntSize(vMap) == Vec_PtrSize(&pNew->vObjs) );
|
||||
Vec_IntFree( vMap );
|
||||
}
|
||||
void If_DsdManClean( If_DsdMan_t * p, int fVerbose )
|
||||
{
|
||||
If_DsdObj_t * pObj;
|
||||
int i;
|
||||
If_DsdVecForEachObj( p->vObjs, pObj, i )
|
||||
If_DsdVecForEachObj( &p->vObjs, pObj, i )
|
||||
pObj->Count = 0;
|
||||
}
|
||||
|
||||
|
|
@ -1059,7 +1059,7 @@ void If_DsdManClean( If_DsdMan_t * p, int fVerbose )
|
|||
void If_DsdManCollect_rec( If_DsdMan_t * p, int Id, Vec_Int_t * vNodes, Vec_Int_t * vFirsts, int * pnSupp )
|
||||
{
|
||||
int i, iFanin, iFirst;
|
||||
If_DsdObj_t * pObj = If_DsdVecObj( p->vObjs, Id );
|
||||
If_DsdObj_t * pObj = If_DsdVecObj( &p->vObjs, Id );
|
||||
if ( If_DsdObjType(pObj) == IF_DSD_CONST0 )
|
||||
return;
|
||||
if ( If_DsdObjType(pObj) == IF_DSD_VAR )
|
||||
|
|
@ -1068,7 +1068,7 @@ void If_DsdManCollect_rec( If_DsdMan_t * p, int Id, Vec_Int_t * vNodes, Vec_Int_
|
|||
return;
|
||||
}
|
||||
iFirst = *pnSupp;
|
||||
If_DsdObjForEachFaninLit( p->vObjs, pObj, iFanin, i )
|
||||
If_DsdObjForEachFaninLit( &p->vObjs, pObj, iFanin, i )
|
||||
If_DsdManCollect_rec( p, Abc_Lit2Var(iFanin), vNodes, vFirsts, pnSupp );
|
||||
Vec_IntPush( vNodes, Id );
|
||||
Vec_IntPush( vFirsts, iFirst );
|
||||
|
|
@ -1095,7 +1095,7 @@ void If_DsdManCollect( If_DsdMan_t * p, int Id, Vec_Int_t * vNodes, Vec_Int_t *
|
|||
void If_DsdManComputeTruth_rec( If_DsdMan_t * p, int iDsd, word * pRes, unsigned char * pPermLits, int * pnSupp )
|
||||
{
|
||||
int i, iFanin, fCompl = Abc_LitIsCompl(iDsd);
|
||||
If_DsdObj_t * pObj = If_DsdVecObj( p->vObjs, Abc_Lit2Var(iDsd) );
|
||||
If_DsdObj_t * pObj = If_DsdVecObj( &p->vObjs, Abc_Lit2Var(iDsd) );
|
||||
if ( If_DsdObjType(pObj) == IF_DSD_VAR )
|
||||
{
|
||||
int iPermLit = pPermLits ? (int)pPermLits[*pnSupp] : Abc_Var2Lit(*pnSupp, 0);
|
||||
|
|
@ -1111,7 +1111,7 @@ void If_DsdManComputeTruth_rec( If_DsdMan_t * p, int iDsd, word * pRes, unsigned
|
|||
Abc_TtConst1( pRes, p->nWords );
|
||||
else
|
||||
Abc_TtConst0( pRes, p->nWords );
|
||||
If_DsdObjForEachFaninLit( p->vObjs, pObj, iFanin, i )
|
||||
If_DsdObjForEachFaninLit( &p->vObjs, pObj, iFanin, i )
|
||||
{
|
||||
If_DsdManComputeTruth_rec( p, iFanin, pTtTemp, pPermLits, pnSupp );
|
||||
if ( If_DsdObjType(pObj) == IF_DSD_AND )
|
||||
|
|
@ -1125,7 +1125,7 @@ void If_DsdManComputeTruth_rec( If_DsdMan_t * p, int iDsd, word * pRes, unsigned
|
|||
if ( If_DsdObjType(pObj) == IF_DSD_MUX ) // mux
|
||||
{
|
||||
word pTtTemp[3][DAU_MAX_WORD];
|
||||
If_DsdObjForEachFaninLit( p->vObjs, pObj, iFanin, i )
|
||||
If_DsdObjForEachFaninLit( &p->vObjs, pObj, iFanin, i )
|
||||
If_DsdManComputeTruth_rec( p, iFanin, pTtTemp[i], pPermLits, pnSupp );
|
||||
assert( i == 3 );
|
||||
Abc_TtMux( pRes, pTtTemp[0], pTtTemp[1], pTtTemp[2], p->nWords );
|
||||
|
|
@ -1135,7 +1135,7 @@ void If_DsdManComputeTruth_rec( If_DsdMan_t * p, int iDsd, word * pRes, unsigned
|
|||
if ( If_DsdObjType(pObj) == IF_DSD_PRIME ) // function
|
||||
{
|
||||
word pFanins[DAU_MAX_VAR][DAU_MAX_WORD];
|
||||
If_DsdObjForEachFaninLit( p->vObjs, pObj, iFanin, i )
|
||||
If_DsdObjForEachFaninLit( &p->vObjs, pObj, iFanin, i )
|
||||
If_DsdManComputeTruth_rec( p, iFanin, pFanins[i], pPermLits, pnSupp );
|
||||
Dau_DsdTruthCompose_rec( If_DsdObjTruth(p, pObj), pFanins, pRes, pObj->nFans, p->nWords );
|
||||
if ( fCompl ) Abc_TtNot( pRes, p->nWords );
|
||||
|
|
@ -1148,7 +1148,7 @@ word * If_DsdManComputeTruth( If_DsdMan_t * p, int iDsd, unsigned char * pPermLi
|
|||
{
|
||||
int nSupp = 0;
|
||||
word * pRes = p->pTtElems[DAU_MAX_VAR];
|
||||
If_DsdObj_t * pObj = If_DsdVecObj( p->vObjs, Abc_Lit2Var(iDsd) );
|
||||
If_DsdObj_t * pObj = If_DsdVecObj( &p->vObjs, Abc_Lit2Var(iDsd) );
|
||||
if ( iDsd == 0 )
|
||||
Abc_TtConst0( pRes, p->nWords );
|
||||
else if ( iDsd == 1 )
|
||||
|
|
@ -1161,7 +1161,7 @@ word * If_DsdManComputeTruth( If_DsdMan_t * p, int iDsd, unsigned char * pPermLi
|
|||
}
|
||||
else
|
||||
If_DsdManComputeTruth_rec( p, iDsd, pRes, pPermLits, &nSupp );
|
||||
assert( nSupp == If_DsdVecLitSuppSize(p->vObjs, iDsd) );
|
||||
assert( nSupp == If_DsdVecLitSuppSize(&p->vObjs, iDsd) );
|
||||
return pRes;
|
||||
}
|
||||
|
||||
|
|
@ -1180,14 +1180,14 @@ int If_DsdManCheckInv_rec( If_DsdMan_t * p, int iLit )
|
|||
{
|
||||
If_DsdObj_t * pObj;
|
||||
int i, iFanin;
|
||||
pObj = If_DsdVecObj( p->vObjs, Abc_Lit2Var(iLit) );
|
||||
pObj = If_DsdVecObj( &p->vObjs, Abc_Lit2Var(iLit) );
|
||||
if ( If_DsdObjType(pObj) == IF_DSD_VAR )
|
||||
return 1;
|
||||
if ( If_DsdObjType(pObj) == IF_DSD_AND || If_DsdObjType(pObj) == IF_DSD_PRIME )
|
||||
return 0;
|
||||
if ( If_DsdObjType(pObj) == IF_DSD_XOR )
|
||||
{
|
||||
If_DsdObjForEachFaninLit( p->vObjs, pObj, iFanin, i )
|
||||
If_DsdObjForEachFaninLit( &p->vObjs, pObj, iFanin, i )
|
||||
if ( If_DsdManCheckInv_rec(p, iFanin) )
|
||||
return 1;
|
||||
return 0;
|
||||
|
|
@ -1201,27 +1201,27 @@ int If_DsdManPushInv_rec( If_DsdMan_t * p, int iLit, unsigned char * pPerm )
|
|||
{
|
||||
If_DsdObj_t * pObj;
|
||||
int i, iFanin;
|
||||
pObj = If_DsdVecObj( p->vObjs, Abc_Lit2Var(iLit) );
|
||||
pObj = If_DsdVecObj( &p->vObjs, Abc_Lit2Var(iLit) );
|
||||
if ( If_DsdObjType(pObj) == IF_DSD_VAR )
|
||||
pPerm[0] = (unsigned char)Abc_LitNot((int)pPerm[0]);
|
||||
else if ( If_DsdObjType(pObj) == IF_DSD_XOR )
|
||||
{
|
||||
If_DsdObjForEachFaninLit( p->vObjs, pObj, iFanin, i )
|
||||
If_DsdObjForEachFaninLit( &p->vObjs, pObj, iFanin, i )
|
||||
{
|
||||
if ( If_DsdManCheckInv_rec(p, iFanin) )
|
||||
{
|
||||
If_DsdManPushInv_rec( p, iFanin, pPerm );
|
||||
break;
|
||||
}
|
||||
pPerm += If_DsdVecLitSuppSize(p->vObjs, iFanin);
|
||||
pPerm += If_DsdVecLitSuppSize(&p->vObjs, iFanin);
|
||||
}
|
||||
}
|
||||
else if ( If_DsdObjType(pObj) == IF_DSD_MUX )
|
||||
{
|
||||
assert( If_DsdManCheckInv_rec(p, pObj->pFans[1]) && If_DsdManCheckInv_rec(p, pObj->pFans[2]) );
|
||||
pPerm += If_DsdVecLitSuppSize(p->vObjs, pObj->pFans[0]);
|
||||
pPerm += If_DsdVecLitSuppSize(&p->vObjs, pObj->pFans[0]);
|
||||
If_DsdManPushInv_rec(p, pObj->pFans[1], pPerm);
|
||||
pPerm += If_DsdVecLitSuppSize(p->vObjs, pObj->pFans[1]);
|
||||
pPerm += If_DsdVecLitSuppSize(&p->vObjs, pObj->pFans[1]);
|
||||
If_DsdManPushInv_rec(p, pObj->pFans[2], pPerm);
|
||||
}
|
||||
else assert( 0 );
|
||||
|
|
@ -1251,7 +1251,7 @@ int If_DsdManComputeFirstArray( If_DsdMan_t * p, int * pLits, int nLits, int * p
|
|||
for ( i = 0; i < nLits; i++ )
|
||||
{
|
||||
pFirsts[i] = nSSize;
|
||||
nSSize += If_DsdVecLitSuppSize(p->vObjs, pLits[i]);
|
||||
nSSize += If_DsdVecLitSuppSize(&p->vObjs, pLits[i]);
|
||||
}
|
||||
return nSSize;
|
||||
}
|
||||
|
|
@ -1274,15 +1274,15 @@ int If_DsdManOperation( If_DsdMan_t * p, int Type, int * pLits, int nLits, unsig
|
|||
pLits[k] = Abc_LitNot(pLits[k]);
|
||||
fCompl ^= 1;
|
||||
}
|
||||
pObj = If_DsdVecObj( p->vObjs, Abc_Lit2Var(pLits[k]) );
|
||||
pObj = If_DsdVecObj( &p->vObjs, Abc_Lit2Var(pLits[k]) );
|
||||
if ( Type == If_DsdObjType(pObj) && (Type == IF_DSD_XOR || !Abc_LitIsCompl(pLits[k])) )
|
||||
{
|
||||
If_DsdObjForEachFaninLit( p->vObjs, pObj, iFanin, i )
|
||||
If_DsdObjForEachFaninLit( &p->vObjs, pObj, iFanin, i )
|
||||
{
|
||||
assert( Type == IF_DSD_AND || !Abc_LitIsCompl(iFanin) );
|
||||
pChildren[nChildren] = iFanin;
|
||||
pBegEnd[nChildren++] = (nSSize << 16) | (nSSize + If_DsdVecLitSuppSize(p->vObjs, iFanin));
|
||||
nSSize += If_DsdVecLitSuppSize(p->vObjs, iFanin);
|
||||
pBegEnd[nChildren++] = (nSSize << 16) | (nSSize + If_DsdVecLitSuppSize(&p->vObjs, iFanin));
|
||||
nSSize += If_DsdVecLitSuppSize(&p->vObjs, iFanin);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -1293,7 +1293,7 @@ int If_DsdManOperation( If_DsdMan_t * p, int Type, int * pLits, int nLits, unsig
|
|||
}
|
||||
pPermStart += If_DsdObjSuppSize(pObj);
|
||||
}
|
||||
If_DsdObjSort( p, p->vObjs, pChildren, nChildren, pBegEnd );
|
||||
If_DsdObjSort( p, &p->vObjs, pChildren, nChildren, pBegEnd );
|
||||
// create permutation
|
||||
for ( j = i = 0; i < nChildren; i++ )
|
||||
for ( k = (pBegEnd[i] >> 16); k < (pBegEnd[i] & 0xFF); k++ )
|
||||
|
|
@ -1308,16 +1308,16 @@ int If_DsdManOperation( If_DsdMan_t * p, int Type, int * pLits, int nLits, unsig
|
|||
assert( nLits == 3 );
|
||||
for ( k = 0; k < nLits; k++ )
|
||||
{
|
||||
pFanin = If_DsdVecObj( p->vObjs, Abc_Lit2Var(pLits[k]) );
|
||||
pFanin = If_DsdVecObj( &p->vObjs, Abc_Lit2Var(pLits[k]) );
|
||||
pLits[k] = Abc_LitNotCond( pLits[k], If_DsdManPushInv(p, pLits[k], pPermStart) );
|
||||
pPermStart += pFanin->nSupp;
|
||||
}
|
||||
RetValue = If_DsdObjCompare( p, p->vObjs, pLits[1], pLits[2] );
|
||||
RetValue = If_DsdObjCompare( p, &p->vObjs, pLits[1], pLits[2] );
|
||||
if ( RetValue == 1 || (RetValue == 0 && Abc_LitIsCompl(pLits[0])) )
|
||||
{
|
||||
int nSupp0 = If_DsdVecLitSuppSize( p->vObjs, pLits[0] );
|
||||
int nSupp1 = If_DsdVecLitSuppSize( p->vObjs, pLits[1] );
|
||||
int nSupp2 = If_DsdVecLitSuppSize( p->vObjs, pLits[2] );
|
||||
int nSupp0 = If_DsdVecLitSuppSize( &p->vObjs, pLits[0] );
|
||||
int nSupp1 = If_DsdVecLitSuppSize( &p->vObjs, pLits[1] );
|
||||
int nSupp2 = If_DsdVecLitSuppSize( &p->vObjs, pLits[2] );
|
||||
pLits[0] = Abc_LitNot(pLits[0]);
|
||||
ABC_SWAP( int, pLits[1], pLits[2] );
|
||||
for ( j = k = 0; k < nSupp0; k++ )
|
||||
|
|
@ -1338,7 +1338,7 @@ int If_DsdManOperation( If_DsdMan_t * p, int Type, int * pLits, int nLits, unsig
|
|||
pPermStart = pPerm;
|
||||
for ( k = 0; k < nLits; k++ )
|
||||
{
|
||||
pFanin = If_DsdVecObj( p->vObjs, Abc_Lit2Var(pLits[k]) );
|
||||
pFanin = If_DsdVecObj( &p->vObjs, Abc_Lit2Var(pLits[k]) );
|
||||
pChildren[nChildren++] = Abc_LitNotCond( pLits[k], If_DsdManPushInv(p, pLits[k], pPermStart) );
|
||||
pPermStart += pFanin->nSupp;
|
||||
}
|
||||
|
|
@ -1353,7 +1353,7 @@ int If_DsdManOperation( If_DsdMan_t * p, int Type, int * pLits, int nLits, unsig
|
|||
for ( j = i = 0; i < nLits; i++ )
|
||||
{
|
||||
int iLitNew = Abc_LitNotCond( pLits[(int)pCanonPerm[i]], ((uCanonPhase>>i)&1) );
|
||||
pFanin = If_DsdVecObj( p->vObjs, Abc_Lit2Var(iLitNew) );
|
||||
pFanin = If_DsdVecObj( &p->vObjs, Abc_Lit2Var(iLitNew) );
|
||||
pPermStart = pPerm + pFirsts[(int)pCanonPerm[i]];
|
||||
pChildren[nChildren++] = Abc_LitNotCond( iLitNew, If_DsdManPushInv(p, iLitNew, pPermStart) );
|
||||
for ( k = 0; k < (int)pFanin->nSupp; k++ )
|
||||
|
|
@ -1490,13 +1490,13 @@ unsigned If_DsdSign_rec( If_DsdMan_t * p, If_DsdObj_t * pObj, int * pnSupp )
|
|||
If_DsdObj_t * pFanin;
|
||||
if ( If_DsdObjType(pObj) == IF_DSD_VAR )
|
||||
return (1 << (2*(*pnSupp)++));
|
||||
If_DsdObjForEachFanin( p->vObjs, pObj, pFanin, i )
|
||||
If_DsdObjForEachFanin( &p->vObjs, pObj, pFanin, i )
|
||||
uSign |= If_DsdSign_rec( p, pFanin, pnSupp );
|
||||
return uSign;
|
||||
}
|
||||
unsigned If_DsdSign( If_DsdMan_t * p, If_DsdObj_t * pObj, int iFan, int iFirst, int fShared )
|
||||
{
|
||||
If_DsdObj_t * pFanin = If_DsdObjFanin( p->vObjs, pObj, iFan );
|
||||
If_DsdObj_t * pFanin = If_DsdObjFanin( &p->vObjs, pObj, iFan );
|
||||
unsigned uSign = If_DsdSign_rec( p, pFanin, &iFirst );
|
||||
return fShared ? (uSign << 1) | uSign : uSign;
|
||||
}
|
||||
|
|
@ -1504,7 +1504,7 @@ unsigned If_DsdSign( If_DsdMan_t * p, If_DsdObj_t * pObj, int iFan, int iFirst,
|
|||
void If_DsdManGetSuppSizes( If_DsdMan_t * p, If_DsdObj_t * pObj, int * pSSizes )
|
||||
{
|
||||
If_DsdObj_t * pFanin; int i;
|
||||
If_DsdObjForEachFanin( p->vObjs, pObj, pFanin, i )
|
||||
If_DsdObjForEachFanin( &p->vObjs, pObj, pFanin, i )
|
||||
pSSizes[i] = If_DsdObjSuppSize(pFanin);
|
||||
}
|
||||
// checks if there is a way to package some fanins
|
||||
|
|
@ -1668,7 +1668,7 @@ unsigned If_DsdManCheckXY_int( If_DsdMan_t * p, int iDsd, int LutSize, int fDeri
|
|||
If_DsdManPrintOne( stdout, p, Abc_Lit2Var(iDsd), NULL, 1 );
|
||||
}
|
||||
*/
|
||||
pObj = If_DsdVecObj( p->vObjs, Abc_Lit2Var(iDsd) );
|
||||
pObj = If_DsdVecObj( &p->vObjs, Abc_Lit2Var(iDsd) );
|
||||
if ( fVerbose )
|
||||
If_DsdManPrintOne( stdout, p, Abc_Lit2Var(iDsd), NULL, 0 );
|
||||
if ( If_DsdObjSuppSize(pObj) <= LutSize )
|
||||
|
|
@ -1678,7 +1678,7 @@ unsigned If_DsdManCheckXY_int( If_DsdMan_t * p, int iDsd, int LutSize, int fDeri
|
|||
return ~0;
|
||||
}
|
||||
If_DsdManCollect( p, pObj->Id, p->vTemp1, p->vTemp2 );
|
||||
If_DsdVecForEachObjVec( p->vTemp1, p->vObjs, pTemp, i )
|
||||
If_DsdVecForEachObjVec( p->vTemp1, &p->vObjs, pTemp, i )
|
||||
if ( If_DsdObjSuppSize(pTemp) <= LutSize && If_DsdObjSuppSize(pObj) - If_DsdObjSuppSize(pTemp) <= LutSize - 1 )
|
||||
{
|
||||
if ( fVerbose )
|
||||
|
|
@ -1688,7 +1688,7 @@ unsigned If_DsdManCheckXY_int( If_DsdMan_t * p, int iDsd, int LutSize, int fDeri
|
|||
iFirst = Vec_IntEntry(p->vTemp2, i);
|
||||
return If_DsdSign_rec(p, pTemp, &iFirst);
|
||||
}
|
||||
If_DsdVecForEachObjVec( p->vTemp1, p->vObjs, pTemp, i )
|
||||
If_DsdVecForEachObjVec( p->vTemp1, &p->vObjs, pTemp, i )
|
||||
if ( (If_DsdObjType(pTemp) == IF_DSD_AND || If_DsdObjType(pTemp) == IF_DSD_XOR) && If_DsdObjFaninNum(pTemp) > 2 && If_DsdObjSuppSize(pTemp) > LutSize )
|
||||
{
|
||||
if ( (Mask = If_DsdManCheckAndXor(p, Vec_IntEntry(p->vTemp2, i), pTemp, If_DsdObjSuppSize(pObj), LutSize, fDerive, fVerbose)) )
|
||||
|
|
@ -1702,7 +1702,7 @@ unsigned If_DsdManCheckXY_int( If_DsdMan_t * p, int iDsd, int LutSize, int fDeri
|
|||
return Mask;
|
||||
}
|
||||
}
|
||||
If_DsdVecForEachObjVec( p->vTemp1, p->vObjs, pTemp, i )
|
||||
If_DsdVecForEachObjVec( p->vTemp1, &p->vObjs, pTemp, i )
|
||||
if ( If_DsdObjType(pTemp) == IF_DSD_MUX && If_DsdObjSuppSize(pTemp) > LutSize )
|
||||
{
|
||||
if ( (Mask = If_DsdManCheckMux(p, Vec_IntEntry(p->vTemp2, i), pTemp, If_DsdObjSuppSize(pObj), LutSize, fDerive, fVerbose)) )
|
||||
|
|
@ -1716,7 +1716,7 @@ unsigned If_DsdManCheckXY_int( If_DsdMan_t * p, int iDsd, int LutSize, int fDeri
|
|||
return Mask;
|
||||
}
|
||||
}
|
||||
If_DsdVecForEachObjVec( p->vTemp1, p->vObjs, pTemp, i )
|
||||
If_DsdVecForEachObjVec( p->vTemp1, &p->vObjs, pTemp, i )
|
||||
if ( If_DsdObjType(pTemp) == IF_DSD_PRIME && If_DsdObjSuppSize(pTemp) > LutSize )
|
||||
{
|
||||
if ( (Mask = If_DsdManCheckPrime(p, Vec_IntEntry(p->vTemp2, i), pTemp, If_DsdObjSuppSize(pObj), LutSize, fDerive, fVerbose)) )
|
||||
|
|
@ -1741,7 +1741,7 @@ unsigned If_DsdManCheckXY( If_DsdMan_t * p, int iDsd, int LutSize, int fDerive,
|
|||
if ( uSet == 0 && fHighEffort )
|
||||
{
|
||||
abctime clk = Abc_Clock();
|
||||
int nVars = If_DsdVecLitSuppSize( p->vObjs, iDsd );
|
||||
int nVars = If_DsdVecLitSuppSize( &p->vObjs, iDsd );
|
||||
word * pRes = If_DsdManComputeTruth( p, iDsd, NULL );
|
||||
uSet = If_ManSatCheckXYall( p->pSat, LutSize, pRes, nVars, p->vTemp1 );
|
||||
if ( uSet )
|
||||
|
|
@ -1819,7 +1819,7 @@ p->timeVerify += Abc_Clock() - clk;
|
|||
If_DsdManPrintOne( stdout, p, Abc_Lit2Var(iDsd), pPerm, 1 );
|
||||
printf( "\n" );
|
||||
}
|
||||
If_DsdVecObjIncRef( p->vObjs, Abc_Lit2Var(iDsd) );
|
||||
If_DsdVecObjIncRef( &p->vObjs, Abc_Lit2Var(iDsd) );
|
||||
return iDsd;
|
||||
}
|
||||
|
||||
|
|
@ -1864,14 +1864,14 @@ void If_DsdManTune( If_DsdMan_t * p, int LutSize, int fFast, int fAdd, int fSpec
|
|||
int i, Value, nVars;
|
||||
word * pTruth;
|
||||
if ( !fAdd || !LutSize )
|
||||
If_DsdVecForEachObj( p->vObjs, pObj, i )
|
||||
If_DsdVecForEachObj( &p->vObjs, pObj, i )
|
||||
pObj->fMark = 0;
|
||||
if ( LutSize == 0 )
|
||||
return;
|
||||
vLits = Vec_IntAlloc( 1000 );
|
||||
pSat = (sat_solver *)If_ManSatBuildXY( LutSize );
|
||||
pProgress = Extra_ProgressBarStart( stdout, Vec_PtrSize(p->vObjs) );
|
||||
If_DsdVecForEachObj( p->vObjs, pObj, i )
|
||||
pProgress = Extra_ProgressBarStart( stdout, Vec_PtrSize(&p->vObjs) );
|
||||
If_DsdVecForEachObj( &p->vObjs, pObj, i )
|
||||
{
|
||||
Extra_ProgressBarUpdate( pProgress, i, NULL );
|
||||
nVars = If_DsdObjSuppSize(pObj);
|
||||
|
|
@ -1891,7 +1891,7 @@ void If_DsdManTune( If_DsdMan_t * p, int LutSize, int fFast, int fAdd, int fSpec
|
|||
}
|
||||
if ( Value )
|
||||
continue;
|
||||
If_DsdVecObjSetMark( p->vObjs, i );
|
||||
If_DsdVecObjSetMark( &p->vObjs, i );
|
||||
}
|
||||
if ( pProgress )
|
||||
Extra_ProgressBarStop( pProgress );
|
||||
|
|
|
|||
Loading…
Reference in New Issue