mirror of https://github.com/YosysHQ/abc.git
Version abc70901
This commit is contained in:
parent
9f5ef0d618
commit
b2470dd3da
6
abc.dsp
6
abc.dsp
|
|
@ -1542,7 +1542,7 @@ SOURCE=.\src\opt\lpk\lpk.h
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\src\opt\lpk\lpkAbcCore.c
|
||||
SOURCE=.\src\opt\lpk\lpkAbcDec.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
|
|
@ -1550,11 +1550,11 @@ SOURCE=.\src\opt\lpk\lpkAbcDsd.c
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\src\opt\lpk\lpkAbcFun.c
|
||||
SOURCE=.\src\opt\lpk\lpkAbcMux.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\src\opt\lpk\lpkAbcMux.c
|
||||
SOURCE=.\src\opt\lpk\lpkAbcUtil.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
|
|
|
|||
|
|
@ -425,9 +425,9 @@ extern void Aig_ObjOrderInsert( Aig_Man_t * p, int ObjId );
|
|||
extern void Aig_ObjOrderRemove( Aig_Man_t * p, int ObjId );
|
||||
extern void Aig_ObjOrderAdvance( Aig_Man_t * p );
|
||||
/*=== aigPart.c =========================================================*/
|
||||
extern Vec_Vec_t * Aig_ManSupports( Aig_Man_t * pMan );
|
||||
extern Vec_Vec_t * Aig_ManPartitionSmart( Aig_Man_t * p, int nPartSizeLimit, int fVerbose, Vec_Vec_t ** pvPartSupps );
|
||||
extern Vec_Vec_t * Aig_ManPartitionNaive( Aig_Man_t * p, int nPartSize );
|
||||
extern Vec_Ptr_t * Aig_ManSupports( Aig_Man_t * pMan );
|
||||
extern Vec_Ptr_t * Aig_ManPartitionSmart( Aig_Man_t * p, int nPartSizeLimit, int fVerbose, Vec_Ptr_t ** pvPartSupps );
|
||||
extern Vec_Ptr_t * Aig_ManPartitionNaive( Aig_Man_t * p, int nPartSize );
|
||||
/*=== aigRepr.c =========================================================*/
|
||||
extern void Aig_ManReprStart( Aig_Man_t * p, int nIdMax );
|
||||
extern void Aig_ManReprStop( Aig_Man_t * p );
|
||||
|
|
|
|||
|
|
@ -264,18 +264,23 @@ Vec_Int_t * Part_ManTransferEntry( Part_One_t * p )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Vec_Vec_t * Aig_ManSupports( Aig_Man_t * pMan )
|
||||
Vec_Ptr_t * Aig_ManSupports( Aig_Man_t * pMan )
|
||||
{
|
||||
Vec_Vec_t * vSupps;
|
||||
Vec_Ptr_t * vSupports;
|
||||
Vec_Int_t * vSupp;
|
||||
Part_Man_t * p;
|
||||
Part_One_t * pPart0, * pPart1;
|
||||
Aig_Obj_t * pObj;
|
||||
int i, iIns = 0, iOut = 0;
|
||||
int i;
|
||||
// set the number of PIs/POs
|
||||
Aig_ManForEachPi( pMan, pObj, i )
|
||||
pObj->pNext = (Aig_Obj_t *)i;
|
||||
Aig_ManForEachPo( pMan, pObj, i )
|
||||
pObj->pNext = (Aig_Obj_t *)i;
|
||||
// start the support computation manager
|
||||
p = Part_ManStart( 1 << 20, 1 << 6 );
|
||||
// consider objects in the topological order
|
||||
vSupps = Vec_VecAlloc( Aig_ManPoNum(pMan) );
|
||||
vSupports = Vec_PtrAlloc( Aig_ManPoNum(pMan) );
|
||||
Aig_ManCleanData(pMan);
|
||||
Aig_ManForEachObj( pMan, pObj, i )
|
||||
{
|
||||
|
|
@ -296,8 +301,8 @@ Vec_Vec_t * Aig_ManSupports( Aig_Man_t * pMan )
|
|||
{
|
||||
pPart0 = Aig_ObjFanin0(pObj)->pData;
|
||||
vSupp = Part_ManTransferEntry(pPart0);
|
||||
Vec_IntPush( vSupp, iOut++ );
|
||||
Vec_PtrPush( (Vec_Ptr_t *)vSupps, vSupp );
|
||||
Vec_IntPush( vSupp, (int)pObj->pNext );
|
||||
Vec_PtrPush( vSupports, vSupp );
|
||||
assert( pPart0->nRefs > 0 );
|
||||
if ( --pPart0->nRefs == 0 )
|
||||
Part_ManRecycleEntry( p, pPart0 );
|
||||
|
|
@ -308,7 +313,7 @@ Vec_Vec_t * Aig_ManSupports( Aig_Man_t * pMan )
|
|||
if ( pObj->nRefs )
|
||||
{
|
||||
pPart0 = Part_ManFetchEntry( p, 1, pObj->nRefs );
|
||||
pPart0->pOuts[ pPart0->nOuts++ ] = iIns++;
|
||||
pPart0->pOuts[ pPart0->nOuts++ ] = (int)pObj->pNext;
|
||||
pObj->pData = pPart0;
|
||||
}
|
||||
continue;
|
||||
|
|
@ -324,13 +329,18 @@ Vec_Vec_t * Aig_ManSupports( Aig_Man_t * pMan )
|
|||
//printf( "Memory usage = %d Mb.\n", Vec_PtrSize(p->vMemory) * p->nChunkSize / (1<<20) );
|
||||
Part_ManStop( p );
|
||||
// sort supports by size
|
||||
Vec_VecSort( vSupps, 1 );
|
||||
Vec_VecSort( (Vec_Vec_t *)vSupports, 1 );
|
||||
// clear the number of PIs/POs
|
||||
Aig_ManForEachPi( pMan, pObj, i )
|
||||
pObj->pNext = NULL;
|
||||
Aig_ManForEachPo( pMan, pObj, i )
|
||||
pObj->pNext = NULL;
|
||||
/*
|
||||
Aig_ManForEachPo( pMan, pObj, i )
|
||||
printf( "%d ", Vec_IntSize( (Vec_Int_t *)Vec_VecEntry(vSupps, i) ) );
|
||||
printf( "%d ", Vec_IntSize( (Vec_Int_t *)Vec_VecEntry(vSupports, i) ) );
|
||||
printf( "\n" );
|
||||
*/
|
||||
return vSupps;
|
||||
return vSupports;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -344,16 +354,17 @@ Vec_Vec_t * Aig_ManSupports( Aig_Man_t * pMan )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
char * Aig_ManSuppCharStart( Vec_Int_t * vOne, int nPis )
|
||||
unsigned * Aig_ManSuppCharStart( Vec_Int_t * vOne, int nPis )
|
||||
{
|
||||
char * pBuffer;
|
||||
unsigned * pBuffer;
|
||||
int i, Entry;
|
||||
pBuffer = ALLOC( char, nPis );
|
||||
memset( pBuffer, 0, sizeof(char) * nPis );
|
||||
int nWords = Aig_BitWordNum(nPis);
|
||||
pBuffer = ALLOC( unsigned, nWords );
|
||||
memset( pBuffer, 0, sizeof(unsigned) * nWords );
|
||||
Vec_IntForEachEntry( vOne, Entry, i )
|
||||
{
|
||||
assert( Entry < nPis );
|
||||
pBuffer[Entry] = 1;
|
||||
Aig_InfoSetBit( pBuffer, Entry );
|
||||
}
|
||||
return pBuffer;
|
||||
}
|
||||
|
|
@ -369,13 +380,13 @@ char * Aig_ManSuppCharStart( Vec_Int_t * vOne, int nPis )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Aig_ManSuppCharAdd( char * pBuffer, Vec_Int_t * vOne, int nPis )
|
||||
void Aig_ManSuppCharAdd( unsigned * pBuffer, Vec_Int_t * vOne, int nPis )
|
||||
{
|
||||
int i, Entry;
|
||||
Vec_IntForEachEntry( vOne, Entry, i )
|
||||
{
|
||||
assert( Entry < nPis );
|
||||
pBuffer[Entry] = 1;
|
||||
Aig_InfoSetBit( pBuffer, Entry );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -390,11 +401,11 @@ void Aig_ManSuppCharAdd( char * pBuffer, Vec_Int_t * vOne, int nPis )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Aig_ManSuppCharCommon( char * pBuffer, Vec_Int_t * vOne )
|
||||
int Aig_ManSuppCharCommon( unsigned * pBuffer, Vec_Int_t * vOne )
|
||||
{
|
||||
int i, Entry, nCommon = 0;
|
||||
Vec_IntForEachEntry( vOne, Entry, i )
|
||||
nCommon += pBuffer[Entry];
|
||||
nCommon += Aig_InfoHasBit(pBuffer, Entry);
|
||||
return nCommon;
|
||||
}
|
||||
|
||||
|
|
@ -409,24 +420,27 @@ int Aig_ManSuppCharCommon( char * pBuffer, Vec_Int_t * vOne )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Aig_ManPartitionSmartFindPart( Vec_Ptr_t * vPartSuppsAll, Vec_Ptr_t * vPartsAll, Vec_Ptr_t * vPartSuppsChar, int nPartSizeLimit, Vec_Int_t * vOne )
|
||||
int Aig_ManPartitionSmartFindPart( Vec_Ptr_t * vPartSuppsAll, Vec_Ptr_t * vPartsAll, Vec_Ptr_t * vPartSuppsBit, int nSuppSizeLimit, Vec_Int_t * vOne )
|
||||
{
|
||||
Vec_Int_t * vPartSupp, * vPart;
|
||||
Vec_Int_t * vPartSupp;//, * vPart;
|
||||
int Attract, Repulse, Value, ValueBest;
|
||||
int i, nCommon, iBest;
|
||||
iBest = -1;
|
||||
ValueBest = 0;
|
||||
Vec_PtrForEachEntry( vPartSuppsAll, vPartSupp, i )
|
||||
{
|
||||
vPart = Vec_PtrEntry( vPartsAll, i );
|
||||
if ( nPartSizeLimit > 0 && Vec_IntSize(vPart) >= nPartSizeLimit )
|
||||
continue;
|
||||
// vPart = Vec_PtrEntry( vPartsAll, i );
|
||||
// if ( nSuppSizeLimit > 0 && Vec_IntSize(vPart) >= nSuppSizeLimit )
|
||||
// continue;
|
||||
// nCommon = Vec_IntTwoCountCommon( vPartSupp, vOne );
|
||||
nCommon = Aig_ManSuppCharCommon( Vec_PtrEntry(vPartSuppsChar, i), vOne );
|
||||
nCommon = Aig_ManSuppCharCommon( Vec_PtrEntry(vPartSuppsBit, i), vOne );
|
||||
if ( nCommon == 0 )
|
||||
continue;
|
||||
if ( nCommon == Vec_IntSize(vOne) )
|
||||
return i;
|
||||
// skip partitions whose size exceeds the limit
|
||||
if ( nSuppSizeLimit > 0 && Vec_IntSize(vPartSupp) >= 2 * nSuppSizeLimit )
|
||||
continue;
|
||||
Attract = 1000 * nCommon / Vec_IntSize(vOne);
|
||||
if ( Vec_IntSize(vPartSupp) < 100 )
|
||||
Repulse = 1;
|
||||
|
|
@ -484,20 +498,20 @@ void Aig_ManPartitionPrint( Aig_Man_t * p, Vec_Ptr_t * vPartsAll, Vec_Ptr_t * vP
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Aig_ManPartitionCompact( Vec_Ptr_t * vPartsAll, Vec_Ptr_t * vPartSuppsAll, int nPartSizeLimit )
|
||||
void Aig_ManPartitionCompact( Vec_Ptr_t * vPartsAll, Vec_Ptr_t * vPartSuppsAll, int nSuppSizeLimit )
|
||||
{
|
||||
Vec_Int_t * vOne, * vPart, * vPartSupp, * vTemp;
|
||||
int i, iPart;
|
||||
|
||||
if ( nPartSizeLimit == 0 )
|
||||
nPartSizeLimit = 200;
|
||||
if ( nSuppSizeLimit == 0 )
|
||||
nSuppSizeLimit = 200;
|
||||
|
||||
// pack smaller partitions into larger blocks
|
||||
iPart = 0;
|
||||
vPart = vPartSupp = NULL;
|
||||
Vec_PtrForEachEntry( vPartSuppsAll, vOne, i )
|
||||
{
|
||||
if ( Vec_IntSize(vOne) < nPartSizeLimit )
|
||||
if ( Vec_IntSize(vOne) < nSuppSizeLimit )
|
||||
{
|
||||
if ( vPartSupp == NULL )
|
||||
{
|
||||
|
|
@ -513,7 +527,7 @@ void Aig_ManPartitionCompact( Vec_Ptr_t * vPartsAll, Vec_Ptr_t * vPartSuppsAll,
|
|||
Vec_IntFree( vTemp );
|
||||
Vec_IntFree( Vec_PtrEntry(vPartsAll, i) );
|
||||
}
|
||||
if ( Vec_IntSize(vPartSupp) < nPartSizeLimit )
|
||||
if ( Vec_IntSize(vPartSupp) < nSuppSizeLimit )
|
||||
continue;
|
||||
}
|
||||
else
|
||||
|
|
@ -556,34 +570,33 @@ void Aig_ManPartitionCompact( Vec_Ptr_t * vPartsAll, Vec_Ptr_t * vPartSuppsAll,
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Vec_Vec_t * Aig_ManPartitionSmart( Aig_Man_t * p, int nPartSizeLimit, int fVerbose, Vec_Vec_t ** pvPartSupps )
|
||||
Vec_Ptr_t * Aig_ManPartitionSmart( Aig_Man_t * p, int nSuppSizeLimit, int fVerbose, Vec_Ptr_t ** pvPartSupps )
|
||||
{
|
||||
Vec_Ptr_t * vPartSuppsChar;
|
||||
Vec_Ptr_t * vSupps, * vPartsAll, * vPartsAll2, * vPartSuppsAll;//, * vPartPtr;
|
||||
Vec_Ptr_t * vPartSuppsBit;
|
||||
Vec_Ptr_t * vSupports, * vPartsAll, * vPartsAll2, * vPartSuppsAll;//, * vPartPtr;
|
||||
Vec_Int_t * vOne, * vPart, * vPartSupp, * vTemp;
|
||||
int i, iPart, iOut, clk;
|
||||
|
||||
// compute the supports for all outputs
|
||||
clk = clock();
|
||||
vSupps = (Vec_Ptr_t *)Aig_ManSupports( p );
|
||||
vSupports = Aig_ManSupports( p );
|
||||
if ( fVerbose )
|
||||
{
|
||||
PRT( "Supps", clock() - clk );
|
||||
}
|
||||
// start char-based support representation
|
||||
vPartSuppsChar = Vec_PtrAlloc( 1000 );
|
||||
vPartSuppsBit = Vec_PtrAlloc( 1000 );
|
||||
|
||||
// create partitions
|
||||
clk = clock();
|
||||
vPartsAll = Vec_PtrAlloc( 256 );
|
||||
vPartSuppsAll = Vec_PtrAlloc( 256 );
|
||||
Vec_PtrForEachEntry( vSupps, vOne, i )
|
||||
Vec_PtrForEachEntry( vSupports, vOne, i )
|
||||
{
|
||||
// get the output number
|
||||
iOut = Vec_IntPop(vOne);
|
||||
// find closely matching part
|
||||
iPart = Aig_ManPartitionSmartFindPart( vPartSuppsAll, vPartsAll, vPartSuppsChar, nPartSizeLimit, vOne );
|
||||
//printf( "%4d->%4d ", i, iPart );
|
||||
iPart = Aig_ManPartitionSmartFindPart( vPartSuppsAll, vPartsAll, vPartSuppsBit, nSuppSizeLimit, vOne );
|
||||
if ( iPart == -1 )
|
||||
{
|
||||
// create new partition
|
||||
|
|
@ -595,7 +608,7 @@ clk = clock();
|
|||
Vec_PtrPush( vPartsAll, vPart );
|
||||
Vec_PtrPush( vPartSuppsAll, vPartSupp );
|
||||
|
||||
Vec_PtrPush( vPartSuppsChar, Aig_ManSuppCharStart(vOne, Aig_ManPiNum(p)) );
|
||||
Vec_PtrPush( vPartSuppsBit, Aig_ManSuppCharStart(vOne, Aig_ManPiNum(p)) );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -609,14 +622,14 @@ clk = clock();
|
|||
// reinsert new support
|
||||
Vec_PtrWriteEntry( vPartSuppsAll, iPart, vPartSupp );
|
||||
|
||||
Aig_ManSuppCharAdd( Vec_PtrEntry(vPartSuppsChar, iPart), vOne, Aig_ManPiNum(p) );
|
||||
Aig_ManSuppCharAdd( Vec_PtrEntry(vPartSuppsBit, iPart), vOne, Aig_ManPiNum(p) );
|
||||
}
|
||||
}
|
||||
|
||||
// stop char-based support representation
|
||||
Vec_PtrForEachEntry( vPartSuppsChar, vTemp, i )
|
||||
Vec_PtrForEachEntry( vPartSuppsBit, vTemp, i )
|
||||
free( vTemp );
|
||||
Vec_PtrFree( vPartSuppsChar );
|
||||
Vec_PtrFree( vPartSuppsBit );
|
||||
|
||||
//printf( "\n" );
|
||||
if ( fVerbose )
|
||||
|
|
@ -640,7 +653,7 @@ clk = clock();
|
|||
|
||||
// compact small partitions
|
||||
// Aig_ManPartitionPrint( p, vPartsAll, vPartSuppsAll );
|
||||
Aig_ManPartitionCompact( vPartsAll, vPartSuppsAll, nPartSizeLimit );
|
||||
Aig_ManPartitionCompact( vPartsAll, vPartSuppsAll, nSuppSizeLimit );
|
||||
if ( fVerbose )
|
||||
// Aig_ManPartitionPrint( p, vPartsAll, vPartSuppsAll );
|
||||
printf( "Created %d partitions.\n", Vec_PtrSize(vPartsAll) );
|
||||
|
|
@ -651,11 +664,11 @@ if ( fVerbose )
|
|||
}
|
||||
|
||||
// cleanup
|
||||
Vec_VecFree( (Vec_Vec_t *)vSupps );
|
||||
Vec_VecFree( (Vec_Vec_t *)vSupports );
|
||||
if ( pvPartSupps == NULL )
|
||||
Vec_VecFree( (Vec_Vec_t *)vPartSuppsAll );
|
||||
else
|
||||
*pvPartSupps = (Vec_Vec_t *)vPartSuppsAll;
|
||||
*pvPartSupps = vPartSuppsAll;
|
||||
/*
|
||||
// converts from intergers to nodes
|
||||
Vec_PtrForEachEntry( vPartsAll, vPart, iPart )
|
||||
|
|
@ -667,7 +680,7 @@ if ( fVerbose )
|
|||
Vec_PtrWriteEntry( vPartsAll, iPart, vPartPtr );
|
||||
}
|
||||
*/
|
||||
return (Vec_Vec_t *)vPartsAll;
|
||||
return vPartsAll;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -681,15 +694,15 @@ if ( fVerbose )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Vec_Vec_t * Aig_ManPartitionNaive( Aig_Man_t * p, int nPartSize )
|
||||
Vec_Ptr_t * Aig_ManPartitionNaive( Aig_Man_t * p, int nPartSize )
|
||||
{
|
||||
Vec_Vec_t * vParts;
|
||||
Vec_Ptr_t * vParts;
|
||||
Aig_Obj_t * pObj;
|
||||
int nParts, i;
|
||||
nParts = (Aig_ManPoNum(p) / nPartSize) + ((Aig_ManPoNum(p) % nPartSize) > 0);
|
||||
vParts = Vec_VecStart( nParts );
|
||||
vParts = (Vec_Ptr_t *)Vec_VecStart( nParts );
|
||||
Aig_ManForEachPo( p, pObj, i )
|
||||
Vec_VecPush( vParts, i / nPartSize, pObj );
|
||||
Vec_IntPush( Vec_PtrEntry(vParts, i / nPartSize), i );
|
||||
return vParts;
|
||||
}
|
||||
|
||||
|
|
@ -787,18 +800,18 @@ Vec_Ptr_t * Aig_ManMiterPartitioned( Aig_Man_t * p1, Aig_Man_t * p2, int nPartSi
|
|||
Aig_Man_t * pNew;
|
||||
Aig_Obj_t * pMiter;
|
||||
Vec_Ptr_t * vMiters, * vNodes1, * vNodes2;
|
||||
Vec_Vec_t * vParts, * vPartSupps;
|
||||
Vec_Ptr_t * vParts, * vPartSupps;
|
||||
Vec_Int_t * vPart, * vPartSupp;
|
||||
int i, k;
|
||||
// partition the first manager
|
||||
vParts = Aig_ManPartitionSmart( p1, nPartSize, 0, &vPartSupps );
|
||||
// derive miters
|
||||
vMiters = Vec_PtrAlloc( Vec_VecSize(vParts) );
|
||||
for ( i = 0; i < Vec_VecSize(vParts); i++ )
|
||||
vMiters = Vec_PtrAlloc( Vec_PtrSize(vParts) );
|
||||
for ( i = 0; i < Vec_PtrSize(vParts); i++ )
|
||||
{
|
||||
// get partitions and their support
|
||||
vPart = Vec_PtrEntry( (Vec_Ptr_t *)vParts, i );
|
||||
vPartSupp = Vec_PtrEntry( (Vec_Ptr_t *)vPartSupps, i );
|
||||
vPart = Vec_PtrEntry( vParts, i );
|
||||
vPartSupp = Vec_PtrEntry( vPartSupps, i );
|
||||
// create the new miter
|
||||
pNew = Aig_ManStart( 1000 );
|
||||
// create the PIs
|
||||
|
|
@ -815,8 +828,8 @@ Vec_Ptr_t * Aig_ManMiterPartitioned( Aig_Man_t * p1, Aig_Man_t * p2, int nPartSi
|
|||
Aig_ManCleanup( pNew );
|
||||
Vec_PtrPush( vMiters, pNew );
|
||||
}
|
||||
Vec_VecFree( vParts );
|
||||
Vec_VecFree( vPartSupps );
|
||||
Vec_VecFree( (Vec_Vec_t *)vParts );
|
||||
Vec_VecFree( (Vec_Vec_t *)vPartSupps );
|
||||
return vMiters;
|
||||
}
|
||||
|
||||
|
|
@ -837,7 +850,7 @@ Aig_Man_t * Aig_ManChoicePartitioned( Vec_Ptr_t * vAigs, int nPartSize )
|
|||
Aig_Man_t * pChoice, * pNew, * pAig, * p;
|
||||
Aig_Obj_t * pObj;
|
||||
Vec_Ptr_t * vMiters, * vNodes;
|
||||
Vec_Vec_t * vParts, * vPartSupps;
|
||||
Vec_Ptr_t * vParts, * vPartSupps;
|
||||
Vec_Int_t * vPart, * vPartSupp;
|
||||
int i, k, m;
|
||||
|
||||
|
|
@ -847,12 +860,12 @@ Aig_Man_t * Aig_ManChoicePartitioned( Vec_Ptr_t * vAigs, int nPartSize )
|
|||
vParts = Aig_ManPartitionSmart( pAig, nPartSize, 0, &vPartSupps );
|
||||
|
||||
// derive the AIG partitions
|
||||
vMiters = Vec_PtrAlloc( Vec_VecSize(vParts) );
|
||||
for ( i = 0; i < Vec_VecSize(vParts); i++ )
|
||||
vMiters = Vec_PtrAlloc( Vec_PtrSize(vParts) );
|
||||
for ( i = 0; i < Vec_PtrSize(vParts); i++ )
|
||||
{
|
||||
// get partitions and their support
|
||||
vPart = Vec_PtrEntry( (Vec_Ptr_t *)vParts, i );
|
||||
vPartSupp = Vec_PtrEntry( (Vec_Ptr_t *)vPartSupps, i );
|
||||
vPart = Vec_PtrEntry( vParts, i );
|
||||
vPartSupp = Vec_PtrEntry( vPartSupps, i );
|
||||
// create the new miter
|
||||
pNew = Aig_ManStart( 1000 );
|
||||
// create the PIs
|
||||
|
|
@ -884,13 +897,13 @@ Aig_Man_t * Aig_ManChoicePartitioned( Vec_Ptr_t * vAigs, int nPartSize )
|
|||
Vec_PtrForEachEntry( vMiters, p, i )
|
||||
{
|
||||
// get partitions and their support
|
||||
vPart = Vec_PtrEntry( (Vec_Ptr_t *)vParts, i );
|
||||
vPartSupp = Vec_PtrEntry( (Vec_Ptr_t *)vPartSupps, i );
|
||||
vPart = Vec_PtrEntry( vParts, i );
|
||||
vPartSupp = Vec_PtrEntry( vPartSupps, i );
|
||||
// copy the component
|
||||
vNodes = Aig_ManDupPart( pNew, p, vPart, vPartSupp, 1 );
|
||||
assert( Vec_PtrSize(vNodes) == Vec_VecSize(vParts) * Vec_PtrSize(vAigs) );
|
||||
assert( Vec_PtrSize(vNodes) == Vec_PtrSize(vParts) * Vec_PtrSize(vAigs) );
|
||||
// create choice node
|
||||
for ( k = 0; k < Vec_VecSize(vParts); k++ )
|
||||
for ( k = 0; k < Vec_PtrSize(vParts); k++ )
|
||||
{
|
||||
for ( m = 0; m < Vec_PtrSize(vAigs); m++ )
|
||||
{
|
||||
|
|
@ -901,8 +914,8 @@ Aig_Man_t * Aig_ManChoicePartitioned( Vec_Ptr_t * vAigs, int nPartSize )
|
|||
}
|
||||
Vec_PtrFree( vNodes );
|
||||
}
|
||||
Vec_VecFree( vParts );
|
||||
Vec_VecFree( vPartSupps );
|
||||
Vec_VecFree( (Vec_Vec_t *)vParts );
|
||||
Vec_VecFree( (Vec_Vec_t *)vPartSupps );
|
||||
|
||||
// trasfer representatives
|
||||
Aig_ManReprStart( pNew, Aig_ManObjIdMax(pNew)+1 );
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ void Fra_ManPartitionTest( Aig_Man_t * p, int nComLim )
|
|||
|
||||
// compute supports
|
||||
clk = clock();
|
||||
vSupps = Aig_ManSupports( p );
|
||||
vSupps = (Vec_Vec_t *)Aig_ManSupports( p );
|
||||
PRT( "Supports", clock() - clk );
|
||||
// remove last entry
|
||||
Aig_ManForEachPo( p, pObj, i )
|
||||
|
|
@ -192,7 +192,7 @@ void Fra_ManPartitionTest2( Aig_Man_t * p )
|
|||
|
||||
// compute supports
|
||||
clk = clock();
|
||||
vSupps = Aig_ManSupports( p );
|
||||
vSupps = (Vec_Vec_t *)Aig_ManSupports( p );
|
||||
PRT( "Supports", clock() - clk );
|
||||
// remove last entry
|
||||
Aig_ManForEachPo( p, pObj, i )
|
||||
|
|
|
|||
|
|
@ -729,6 +729,7 @@ extern void Abc_NtkFinalizeRead( Abc_Ntk_t * pNtk );
|
|||
extern Abc_Ntk_t * Abc_NtkDup( Abc_Ntk_t * pNtk );
|
||||
extern Abc_Ntk_t * Abc_NtkCreateCone( Abc_Ntk_t * pNtk, Abc_Obj_t * pNode, char * pNodeName, int fUseAllCis );
|
||||
extern Abc_Ntk_t * Abc_NtkCreateConeArray( Abc_Ntk_t * pNtk, Vec_Ptr_t * vRoots, int fUseAllCis );
|
||||
extern void Abc_NtkAppendToCone( Abc_Ntk_t * pNtkNew, Abc_Ntk_t * pNtk, Vec_Ptr_t * vRoots );
|
||||
extern Abc_Ntk_t * Abc_NtkCreateMffc( Abc_Ntk_t * pNtk, Abc_Obj_t * pNode, char * pNodeName );
|
||||
extern Abc_Ntk_t * Abc_NtkCreateTarget( Abc_Ntk_t * pNtk, Vec_Ptr_t * vRoots, Vec_Int_t * vValues );
|
||||
extern Abc_Ntk_t * Abc_NtkCreateFromNode( Abc_Ntk_t * pNtk, Abc_Obj_t * pNode );
|
||||
|
|
|
|||
|
|
@ -623,7 +623,7 @@ Abc_Ntk_t * Abc_NtkCreateConeArray( Abc_Ntk_t * pNtk, Vec_Ptr_t * vRoots, int fU
|
|||
}
|
||||
Vec_PtrFree( vNodes );
|
||||
|
||||
// add the PO corresponding to the nodes
|
||||
// add the POs corresponding to the root nodes
|
||||
Vec_PtrForEachEntry( vRoots, pObj, i )
|
||||
{
|
||||
// create the PO node
|
||||
|
|
@ -642,6 +642,59 @@ Abc_Ntk_t * Abc_NtkCreateConeArray( Abc_Ntk_t * pNtk, Vec_Ptr_t * vRoots, int fU
|
|||
return pNtkNew;
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Adds new nodes to the cone.]
|
||||
|
||||
Description []
|
||||
|
||||
SideEffects []
|
||||
|
||||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
void Abc_NtkAppendToCone( Abc_Ntk_t * pNtkNew, Abc_Ntk_t * pNtk, Vec_Ptr_t * vRoots )
|
||||
{
|
||||
Vec_Ptr_t * vNodes;
|
||||
Abc_Obj_t * pObj;
|
||||
int i, iNodeId;
|
||||
|
||||
assert( Abc_NtkIsStrash(pNtkNew) );
|
||||
assert( Abc_NtkIsStrash(pNtk) );
|
||||
|
||||
// collect the nodes in the TFI of the output (mark the TFI)
|
||||
vNodes = Abc_NtkDfsNodes( pNtk, (Abc_Obj_t **)Vec_PtrArray(vRoots), Vec_PtrSize(vRoots) );
|
||||
|
||||
// establish connection between the constant nodes
|
||||
Abc_AigConst1(pNtk)->pCopy = Abc_AigConst1(pNtkNew);
|
||||
|
||||
// create the PIs
|
||||
Abc_NtkForEachCi( pNtk, pObj, i )
|
||||
{
|
||||
// skip CIs that are not used
|
||||
if ( !Abc_NodeIsTravIdCurrent(pObj) )
|
||||
continue;
|
||||
// find the corresponding CI in the new network
|
||||
iNodeId = Nm_ManFindIdByNameTwoTypes( pNtkNew->pManName, Abc_ObjName(pObj), ABC_OBJ_PI, ABC_OBJ_BO );
|
||||
if ( iNodeId == -1 )
|
||||
{
|
||||
pObj->pCopy = Abc_NtkCreatePi(pNtkNew);
|
||||
Abc_ObjAssignName( pObj->pCopy, Abc_ObjName(pObj), NULL );
|
||||
}
|
||||
else
|
||||
pObj->pCopy = Abc_NtkObj( pNtkNew, iNodeId );
|
||||
}
|
||||
|
||||
// copy the nodes
|
||||
Vec_PtrForEachEntry( vNodes, pObj, i )
|
||||
pObj->pCopy = Abc_AigAnd( pNtkNew->pManFunc, Abc_ObjChild0Copy(pObj), Abc_ObjChild1Copy(pObj) );
|
||||
Vec_PtrFree( vNodes );
|
||||
|
||||
// do not add the COs
|
||||
if ( !Abc_NtkCheck( pNtkNew ) )
|
||||
fprintf( stdout, "Abc_NtkAppendToCone(): Network check has failed.\n" );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
||||
Synopsis [Creates the network composed of MFFC of one node.]
|
||||
|
|
|
|||
|
|
@ -2977,6 +2977,9 @@ int Abc_CommandLutpack( Abc_Frame_t * pAbc, int argc, char ** argv )
|
|||
pOut = Abc_FrameReadOut(pAbc);
|
||||
pErr = Abc_FrameReadErr(pAbc);
|
||||
|
||||
printf("This command will be available soon\n");
|
||||
return 0;
|
||||
|
||||
// set defaults
|
||||
memset( pPars, 0, sizeof(Lpk_Par_t) );
|
||||
pPars->nLutsMax = 4; // (N) the maximum number of LUTs in the structure
|
||||
|
|
|
|||
|
|
@ -648,46 +648,32 @@ Abc_Obj_t * Abc_NodeFraigTrust( Abc_Ntk_t * pNtkNew, Abc_Obj_t * pNode )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Abc_NtkFraigStore( Abc_Ntk_t * pNtk )
|
||||
int Abc_NtkFraigStore( Abc_Ntk_t * pNtkAdd )
|
||||
{
|
||||
Abc_Ntk_t * pStore;
|
||||
int nAndsOld;
|
||||
|
||||
if ( !Abc_NtkIsLogic(pNtk) && !Abc_NtkIsStrash(pNtk) )
|
||||
Vec_Ptr_t * vStore;
|
||||
Abc_Ntk_t * pNtk;
|
||||
// create the network to be stored
|
||||
pNtk = Abc_NtkStrash( pNtkAdd, 0, 0, 0 );
|
||||
if ( pNtk == NULL )
|
||||
{
|
||||
printf( "The netlist need to be converted into a logic network before adding it to storage.\n" );
|
||||
printf( "Abc_NtkFraigStore: Initial strashing has failed.\n" );
|
||||
return 0;
|
||||
}
|
||||
|
||||
// get the network currently stored
|
||||
pStore = Abc_FrameReadNtkStore();
|
||||
if ( pStore == NULL )
|
||||
vStore = Abc_FrameReadStore();
|
||||
if ( Vec_PtrSize(vStore) > 0 )
|
||||
{
|
||||
// start the stored network
|
||||
pStore = Abc_NtkStrash( pNtk, 0, 0, 0 );
|
||||
if ( pStore == NULL )
|
||||
// check that the networks have the same PIs
|
||||
// reorder PIs of pNtk2 according to pNtk1
|
||||
if ( !Abc_NtkCompareSignals( pNtk, Vec_PtrEntry(vStore, 0), 1, 1 ) )
|
||||
{
|
||||
printf( "Abc_NtkFraigStore: Initial strashing has failed.\n" );
|
||||
return 0;
|
||||
printf( "Trying to store the network with different primary inputs.\n" );
|
||||
printf( "The previously stored networks are deleted and this one is added.\n" );
|
||||
Abc_NtkFraigStoreClean();
|
||||
}
|
||||
// save the parameters
|
||||
Abc_FrameSetNtkStore( pStore );
|
||||
Abc_FrameSetNtkStoreSize( 1 );
|
||||
nAndsOld = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// add the new network to storage
|
||||
nAndsOld = Abc_NtkNodeNum( pStore );
|
||||
if ( !Abc_NtkAppend( pStore, pNtk, 0 ) )
|
||||
{
|
||||
printf( "The current network cannot be appended to the stored network.\n" );
|
||||
return 0;
|
||||
}
|
||||
// set the number of networks stored
|
||||
Abc_FrameSetNtkStoreSize( Abc_FrameReadNtkStoreSize() + 1 );
|
||||
}
|
||||
printf( "The number of AIG nodes added to storage = %5d.\n", Abc_NtkNodeNum(pStore) - nAndsOld );
|
||||
Vec_PtrPush( vStore, pNtk );
|
||||
printf( "The number of AIG nodes added to storage = %5d.\n", Abc_NtkNodeNum(pNtk) );
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -704,54 +690,48 @@ int Abc_NtkFraigStore( Abc_Ntk_t * pNtk )
|
|||
***********************************************************************/
|
||||
Abc_Ntk_t * Abc_NtkFraigRestore()
|
||||
{
|
||||
extern Abc_Ntk_t * Abc_NtkFraigPartitioned( Abc_Ntk_t * pNtk, void * pParams );
|
||||
|
||||
extern Abc_Ntk_t * Abc_NtkFraigPartitioned( Vec_Ptr_t * vStore, void * pParams );
|
||||
Fraig_Params_t Params;
|
||||
Abc_Ntk_t * pStore, * pFraig;
|
||||
Vec_Ptr_t * vStore;
|
||||
Abc_Ntk_t * pNtk, * pFraig;
|
||||
int nWords1, nWords2, nWordsMin;
|
||||
int clk = clock();
|
||||
|
||||
// get the stored network
|
||||
pStore = Abc_FrameReadNtkStore();
|
||||
Abc_FrameSetNtkStore( NULL );
|
||||
if ( pStore == NULL )
|
||||
vStore = Abc_FrameReadStore();
|
||||
if ( Vec_PtrSize(vStore) == 0 )
|
||||
{
|
||||
printf( "There are no network currently in storage.\n" );
|
||||
return NULL;
|
||||
}
|
||||
printf( "Currently stored %d networks with %d nodes will be fraiged.\n",
|
||||
Abc_FrameReadNtkStoreSize(), Abc_NtkNodeNum(pStore) );
|
||||
printf( "Currently stored %d networks will be fraiged.\n", Vec_PtrSize(vStore) );
|
||||
pNtk = Vec_PtrEntry( vStore, 0 );
|
||||
|
||||
// to determine the number of simulation patterns
|
||||
// use the following strategy
|
||||
// at least 64 words (32 words random and 32 words dynamic)
|
||||
// no more than 256M for one circuit (128M + 128M)
|
||||
nWords1 = 32;
|
||||
nWords2 = (1<<27) / (Abc_NtkNodeNum(pStore) + Abc_NtkCiNum(pStore));
|
||||
nWords2 = (1<<27) / (Abc_NtkNodeNum(pNtk) + Abc_NtkCiNum(pNtk));
|
||||
nWordsMin = ABC_MIN( nWords1, nWords2 );
|
||||
|
||||
// set parameters for fraiging
|
||||
Fraig_ParamsSetDefault( &Params );
|
||||
Params.nPatsRand = nWordsMin * 32; // the number of words of random simulation info
|
||||
Params.nPatsDyna = nWordsMin * 32; // the number of words of dynamic simulation info
|
||||
Params.nBTLimit = 999999; // the max number of backtracks to perform
|
||||
Params.fFuncRed = 1; // performs only one level hashing
|
||||
Params.fFeedBack = 1; // enables solver feedback
|
||||
Params.fDist1Pats = 1; // enables distance-1 patterns
|
||||
Params.fDoSparse = 1; // performs equiv tests for sparse functions
|
||||
Params.fChoicing = 1; // enables recording structural choices
|
||||
Params.fTryProve = 0; // tries to solve the final miter
|
||||
Params.fVerbose = 0; // the verbosiness flag
|
||||
Params.nPatsRand = nWordsMin * 32; // the number of words of random simulation info
|
||||
Params.nPatsDyna = nWordsMin * 32; // the number of words of dynamic simulation info
|
||||
Params.nBTLimit = 1000; // the max number of backtracks to perform
|
||||
Params.fFuncRed = 1; // performs only one level hashing
|
||||
Params.fFeedBack = 1; // enables solver feedback
|
||||
Params.fDist1Pats = 1; // enables distance-1 patterns
|
||||
Params.fDoSparse = 1; // performs equiv tests for sparse functions
|
||||
Params.fChoicing = 1; // enables recording structural choices
|
||||
Params.fTryProve = 0; // tries to solve the final miter
|
||||
Params.fVerbose = 0; // the verbosiness flag
|
||||
|
||||
// Fraig_ManReportChoices( p );
|
||||
// transform it into FRAIG
|
||||
// pFraig = Abc_NtkFraig( pStore, &Params, 1, 0 );
|
||||
pFraig = Abc_NtkFraigPartitioned( pStore, &Params );
|
||||
|
||||
PRT( "Total fraiging time", clock() - clk );
|
||||
if ( pFraig == NULL )
|
||||
return NULL;
|
||||
Abc_NtkDelete( pStore );
|
||||
// perform partitioned computation of structural choices
|
||||
pFraig = Abc_NtkFraigPartitioned( vStore, &Params );
|
||||
Abc_NtkFraigStoreClean();
|
||||
PRT( "Total choicing time", clock() - clk );
|
||||
return pFraig;
|
||||
}
|
||||
|
||||
|
|
@ -768,12 +748,13 @@ PRT( "Total fraiging time", clock() - clk );
|
|||
***********************************************************************/
|
||||
void Abc_NtkFraigStoreClean()
|
||||
{
|
||||
Abc_Ntk_t * pStore;
|
||||
// get the stored network
|
||||
pStore = Abc_FrameReadNtkStore();
|
||||
if ( pStore )
|
||||
Abc_NtkDelete( pStore );
|
||||
Abc_FrameSetNtkStore( NULL );
|
||||
Vec_Ptr_t * vStore;
|
||||
Abc_Ntk_t * pNtk;
|
||||
int i;
|
||||
vStore = Abc_FrameReadStore();
|
||||
Vec_PtrForEachEntry( vStore, pNtk, i )
|
||||
Abc_NtkDelete( pNtk );
|
||||
Vec_PtrClear( vStore );
|
||||
}
|
||||
|
||||
/**Function*************************************************************
|
||||
|
|
@ -794,7 +775,7 @@ void Abc_NtkFraigStoreCheck( Abc_Ntk_t * pFraig )
|
|||
int i, k;
|
||||
// check that the PO functions are correct
|
||||
nPoFinal = Abc_NtkPoNum(pFraig);
|
||||
nStored = Abc_FrameReadNtkStoreSize();
|
||||
nStored = Abc_FrameReadStoreSize();
|
||||
assert( nPoFinal % nStored == 0 );
|
||||
nPoOrig = nPoFinal / nStored;
|
||||
for ( i = 0; i < nPoOrig; i++ )
|
||||
|
|
|
|||
|
|
@ -314,7 +314,7 @@ void Abc_NtkMiterFinalize( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, Abc_Ntk_t * pNt
|
|||
Abc_ObjAddFanin( pNode, pMiter );
|
||||
// assign the name to the node
|
||||
if ( nPartSize == 1 )
|
||||
sprintf( Buffer, "%s", Abc_ObjName(Abc_NtkPo(pNtk1,i)) );
|
||||
sprintf( Buffer, "%s", Abc_ObjName(Abc_NtkCo(pNtk1,i)) );
|
||||
else
|
||||
sprintf( Buffer, "%d", i );
|
||||
Abc_ObjAssignName( pNode, "miter_", Buffer );
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -293,7 +293,7 @@ void Abc_NtkCecFraigPart( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds, in
|
|||
}
|
||||
else
|
||||
{
|
||||
printf( "Finished part %d (out of %d)\r", i+1, Abc_NtkPoNum(pMiter) );
|
||||
printf( "Finished part %5d (out of %5d)\r", i+1, Abc_NtkPoNum(pMiter) );
|
||||
nOutputs += nPartSize;
|
||||
}
|
||||
// if ( pMiter->pModel )
|
||||
|
|
@ -301,7 +301,7 @@ void Abc_NtkCecFraigPart( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds, in
|
|||
if ( pMiterPart )
|
||||
Abc_NtkDelete( pMiterPart );
|
||||
}
|
||||
|
||||
|
||||
Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "set progressbar" );
|
||||
|
||||
if ( Status == 1 )
|
||||
|
|
@ -325,12 +325,13 @@ void Abc_NtkCecFraigPart( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds, in
|
|||
void Abc_NtkCecFraigPartAuto( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds, int fVerbose )
|
||||
{
|
||||
extern int Abc_NtkCombinePos( Abc_Ntk_t * pNtk, int fAnd );
|
||||
extern Vec_Vec_t * Abc_NtkPartitionSmart( Abc_Ntk_t * pNtk, int nPartSizeLimit, int fVerbose );
|
||||
extern Vec_Ptr_t * Abc_NtkPartitionSmart( Abc_Ntk_t * pNtk, int nPartSizeLimit, int fVerbose );
|
||||
extern void Abc_NtkConvertCos( Abc_Ntk_t * pNtk, Vec_Int_t * vOuts, Vec_Ptr_t * vOnePtr );
|
||||
extern int Cmd_CommandExecute( void * pAbc, char * sCommand );
|
||||
extern void * Abc_FrameGetGlobalFrame();
|
||||
|
||||
Vec_Vec_t * vParts;
|
||||
Vec_Ptr_t * vOne;
|
||||
Vec_Ptr_t * vParts, * vOnePtr;
|
||||
Vec_Int_t * vOne;
|
||||
Prove_Params_t Params, * pParams = &Params;
|
||||
Abc_Ntk_t * pMiter, * pMiterPart;
|
||||
int i, RetValue, Status, nOutputs;
|
||||
|
|
@ -368,15 +369,17 @@ void Abc_NtkCecFraigPartAuto( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds
|
|||
Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "unset progressbar" );
|
||||
|
||||
// partition the outputs
|
||||
vParts = Abc_NtkPartitionSmart( pMiter, 50, 1 );
|
||||
vParts = Abc_NtkPartitionSmart( pMiter, 300, 0 );
|
||||
|
||||
// fraig each partition
|
||||
Status = 1;
|
||||
nOutputs = 0;
|
||||
Vec_VecForEachLevel( vParts, vOne, i )
|
||||
vOnePtr = Vec_PtrAlloc( 1000 );
|
||||
Vec_PtrForEachEntry( vParts, vOne, i )
|
||||
{
|
||||
// get this part of the miter
|
||||
pMiterPart = Abc_NtkCreateConeArray( pMiter, vOne, 0 );
|
||||
Abc_NtkConvertCos( pMiter, vOne, vOnePtr );
|
||||
pMiterPart = Abc_NtkCreateConeArray( pMiter, vOnePtr, 0 );
|
||||
Abc_NtkCombinePos( pMiterPart, 0 );
|
||||
// check the miter for being constant
|
||||
RetValue = Abc_NtkMiterIsConstant( pMiterPart );
|
||||
|
|
@ -391,6 +394,9 @@ void Abc_NtkCecFraigPartAuto( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds
|
|||
Abc_NtkDelete( pMiterPart );
|
||||
continue;
|
||||
}
|
||||
printf( "Verifying part %4d (out of %4d) PI = %5d. PO = %5d. And = %6d. Lev = %4d.\r",
|
||||
i+1, Vec_PtrSize(vParts), Abc_NtkPiNum(pMiterPart), Abc_NtkPoNum(pMiterPart),
|
||||
Abc_NtkNodeNum(pMiterPart), Abc_AigLevel(pMiterPart) );
|
||||
// solve the problem
|
||||
RetValue = Abc_NtkIvyProve( &pMiterPart, pParams );
|
||||
if ( RetValue == -1 )
|
||||
|
|
@ -412,12 +418,14 @@ void Abc_NtkCecFraigPartAuto( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, int nSeconds
|
|||
}
|
||||
else
|
||||
{
|
||||
printf( "Finished part %d (out of %d)\r", i+1, Vec_VecSize(vParts) );
|
||||
nOutputs += Vec_PtrSize(vOne);
|
||||
// printf( "Finished part %5d (out of %5d)\r", i+1, Vec_PtrSize(vParts) );
|
||||
nOutputs += Vec_IntSize(vOne);
|
||||
}
|
||||
Abc_NtkDelete( pMiterPart );
|
||||
}
|
||||
Vec_VecFree( vParts );
|
||||
printf( " \r" );
|
||||
Vec_VecFree( (Vec_Vec_t *)vParts );
|
||||
Vec_PtrFree( vOnePtr );
|
||||
|
||||
Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "set progressbar" );
|
||||
|
||||
|
|
|
|||
|
|
@ -92,8 +92,8 @@ extern void Abc_FrameDeleteAllNetworks( Abc_Frame_t * p );
|
|||
extern void Abc_FrameSetGlobalFrame( Abc_Frame_t * p );
|
||||
extern Abc_Frame_t * Abc_FrameGetGlobalFrame();
|
||||
|
||||
extern Abc_Ntk_t * Abc_FrameReadNtkStore();
|
||||
extern int Abc_FrameReadNtkStoreSize();
|
||||
extern Vec_Ptr_t * Abc_FrameReadStore();
|
||||
extern int Abc_FrameReadStoreSize();
|
||||
extern void * Abc_FrameReadLibLut();
|
||||
extern void * Abc_FrameReadLibGen();
|
||||
extern void * Abc_FrameReadLibSuper();
|
||||
|
|
|
|||
|
|
@ -43,8 +43,8 @@ static Abc_Frame_t * s_GlobalFrame = NULL;
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Abc_Ntk_t * Abc_FrameReadNtkStore() { return s_GlobalFrame->pStored; }
|
||||
int Abc_FrameReadNtkStoreSize() { return s_GlobalFrame->nStored; }
|
||||
Vec_Ptr_t * Abc_FrameReadStore() { return s_GlobalFrame->vStore; }
|
||||
int Abc_FrameReadStoreSize() { return Vec_PtrSize(s_GlobalFrame->vStore); }
|
||||
void * Abc_FrameReadLibLut() { return s_GlobalFrame->pLibLut; }
|
||||
void * Abc_FrameReadLibGen() { return s_GlobalFrame->pLibGen; }
|
||||
void * Abc_FrameReadLibSuper() { return s_GlobalFrame->pLibSuper; }
|
||||
|
|
@ -53,8 +53,6 @@ void * Abc_FrameReadManDd() { if ( s_GlobalFrame->dd ==
|
|||
void * Abc_FrameReadManDec() { if ( s_GlobalFrame->pManDec == NULL ) s_GlobalFrame->pManDec = Dec_ManStart(); return s_GlobalFrame->pManDec; }
|
||||
char * Abc_FrameReadFlag( char * pFlag ) { return Cmd_FlagReadByName( s_GlobalFrame, pFlag ); }
|
||||
|
||||
void Abc_FrameSetNtkStore( Abc_Ntk_t * pNtk ) { s_GlobalFrame->pStored = pNtk; }
|
||||
void Abc_FrameSetNtkStoreSize( int nStored ) { s_GlobalFrame->nStored = nStored; }
|
||||
void Abc_FrameSetLibLut( void * pLib ) { s_GlobalFrame->pLibLut = pLib; }
|
||||
void Abc_FrameSetLibGen( void * pLib ) { s_GlobalFrame->pLibGen = pLib; }
|
||||
void Abc_FrameSetLibSuper( void * pLib ) { s_GlobalFrame->pLibSuper = pLib; }
|
||||
|
|
@ -113,6 +111,8 @@ Abc_Frame_t * Abc_FrameAllocate()
|
|||
// set the starting step
|
||||
p->nSteps = 1;
|
||||
p->fBatchMode = 0;
|
||||
// networks to be used by choice
|
||||
p->vStore = Vec_PtrAlloc( 16 );
|
||||
// initialize decomposition manager
|
||||
define_cube_size(20);
|
||||
set_espresso_flags();
|
||||
|
|
@ -145,6 +145,7 @@ void Abc_FrameDeallocate( Abc_Frame_t * p )
|
|||
if ( p->pLibVer ) Abc_LibFree( p->pLibVer, NULL );
|
||||
if ( p->pManDec ) Dec_ManStop( p->pManDec );
|
||||
if ( p->dd ) Extra_StopManager( p->dd );
|
||||
if ( p->vStore ) Vec_PtrFree( p->vStore );
|
||||
Abc_FrameDeleteAllNetworks( p );
|
||||
free( p );
|
||||
s_GlobalFrame = NULL;
|
||||
|
|
|
|||
|
|
@ -63,8 +63,7 @@ struct Abc_Frame_t_
|
|||
int TimeCommand; // the runtime of the last command
|
||||
int TimeTotal; // the total runtime of all commands
|
||||
// temporary storage for structural choices
|
||||
Abc_Ntk_t * pStored; // the stored networks
|
||||
int nStored; // the number of stored networks
|
||||
Vec_Ptr_t * vStore; // networks to be used by choice
|
||||
// decomposition package
|
||||
void * pManDec; // decomposition manager
|
||||
DdManager * dd; // temporary BDD package
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/**CFile****************************************************************
|
||||
|
||||
FileName [lpkAbcCore.c]
|
||||
FileName [lpkAbcDec.c]
|
||||
|
||||
SystemName [ABC: Logic synthesis and verification system.]
|
||||
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
Date [Ver. 1.0. Started - April 28, 2007.]
|
||||
|
||||
Revision [$Id: lpkAbcCore.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $]
|
||||
Revision [$Id: lpkAbcDec.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $]
|
||||
|
||||
***********************************************************************/
|
||||
|
||||
|
|
@ -39,7 +39,7 @@
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Abc_Obj_t * Lpk_FunImplement( Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeaves, Lpk_Fun_t * p )
|
||||
Abc_Obj_t * Lpk_ImplementFun( Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeaves, Lpk_Fun_t * p )
|
||||
{
|
||||
Abc_Obj_t * pObjNew;
|
||||
int i;
|
||||
|
|
@ -73,7 +73,7 @@ Abc_Obj_t * Lpk_FunImplement( Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeaves, Lpk_Fun_t *
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Abc_Obj_t * Lpk_LptImplement( Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeaves, int nLeavesOld )
|
||||
Abc_Obj_t * Lpk_Implement( Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeaves, int nLeavesOld )
|
||||
{
|
||||
Lpk_Fun_t * pFun;
|
||||
Abc_Obj_t * pRes;
|
||||
|
|
@ -81,7 +81,7 @@ Abc_Obj_t * Lpk_LptImplement( Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeaves, int nLeaves
|
|||
for ( i = Vec_PtrSize(vLeaves) - 1; i >= nLeavesOld; i-- )
|
||||
{
|
||||
pFun = Vec_PtrEntry( vLeaves, i );
|
||||
pRes = Lpk_FunImplement( pNtk, vLeaves, pFun );
|
||||
pRes = Lpk_ImplementFun( pNtk, vLeaves, pFun );
|
||||
Vec_PtrWriteEntry( vLeaves, i, pRes );
|
||||
Lpk_FunFree( pFun );
|
||||
}
|
||||
|
|
@ -99,7 +99,7 @@ Abc_Obj_t * Lpk_LptImplement( Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeaves, int nLeaves
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Lpk_LpkDecompose_rec( Lpk_Fun_t * p )
|
||||
int Lpk_Decompose_rec( Lpk_Fun_t * p )
|
||||
{
|
||||
Lpk_Fun_t * p2;
|
||||
int VarPol;
|
||||
|
|
@ -107,14 +107,14 @@ int Lpk_LpkDecompose_rec( Lpk_Fun_t * p )
|
|||
if ( p->nVars <= p->nLutK )
|
||||
return 1;
|
||||
// check if decomposition exists
|
||||
VarPol = Lpk_FunAnalizeMux( p );
|
||||
VarPol = Lpk_MuxAnalize( p );
|
||||
if ( VarPol == -1 )
|
||||
return 0;
|
||||
// split and call recursively
|
||||
p2 = Lpk_FunSplitMux( p, VarPol );
|
||||
if ( !Lpk_LpkDecompose_rec( p2 ) )
|
||||
p2 = Lpk_MuxSplit( p, VarPol );
|
||||
if ( !Lpk_Decompose_rec( p2 ) )
|
||||
return 0;
|
||||
return Lpk_LpkDecompose_rec( p );
|
||||
return Lpk_Decompose_rec( p );
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -129,7 +129,7 @@ int Lpk_LpkDecompose_rec( Lpk_Fun_t * p )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Abc_Obj_t * Lpk_LpkDecompose( Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeaves, unsigned * pTruth, int nLutK, int AreaLim, int DelayLim )
|
||||
Abc_Obj_t * Lpk_Decompose( Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeaves, unsigned * pTruth, int nLutK, int AreaLim, int DelayLim )
|
||||
{
|
||||
Lpk_Fun_t * p;
|
||||
Abc_Obj_t * pObjNew = NULL;
|
||||
|
|
@ -139,8 +139,8 @@ Abc_Obj_t * Lpk_LpkDecompose( Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeaves, unsigned *
|
|||
p = Lpk_FunCreate( pNtk, vLeaves, pTruth, nLutK, AreaLim, DelayLim );
|
||||
Lpk_FunSuppMinimize( p );
|
||||
// decompose the function
|
||||
if ( Lpk_LpkDecompose_rec(p) )
|
||||
pObjNew = Lpk_LptImplement( pNtk, vLeaves, nLeaves );
|
||||
if ( Lpk_Decompose_rec(p) )
|
||||
pObjNew = Lpk_Implement( pNtk, vLeaves, nLeaves );
|
||||
else
|
||||
{
|
||||
for ( i = Vec_PtrSize(vLeaves) - 1; i >= nLeaves; i-- )
|
||||
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
PackageName [Fast Boolean matching for LUT structures.]
|
||||
|
||||
Synopsis []
|
||||
Synopsis [LUT-decomposition based on recursive DSD.]
|
||||
|
||||
Author [Alan Mishchenko]
|
||||
|
||||
|
|
@ -266,7 +266,7 @@ void Lpk_FunFreeTruthTables( Lpk_Fun_t * p, int nCofDepth, unsigned * ppTruths[5
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Lpk_Res_t * Lpk_FunAnalizeDsd( Lpk_Fun_t * p, int nCofDepth )
|
||||
Lpk_Res_t * Lpk_DsdAnalize( Lpk_Fun_t * p, int nCofDepth )
|
||||
{
|
||||
static Lpk_Res_t Res, * pRes = &Res;
|
||||
unsigned * ppTruths[5][16];
|
||||
|
|
@ -330,7 +330,7 @@ Lpk_Res_t * Lpk_FunAnalizeDsd( Lpk_Fun_t * p, int nCofDepth )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Lpk_Fun_t * Lpk_FunSplitDsd( Lpk_Fun_t * p, char * pCofVars, int nCofVars, unsigned uBoundSet )
|
||||
Lpk_Fun_t * Lpk_DsdSplit( Lpk_Fun_t * p, char * pCofVars, int nCofVars, unsigned uBoundSet )
|
||||
{
|
||||
Kit_DsdMan_t * pDsdMan;
|
||||
Kit_DsdNtk_t * pNtkDec, * pTemp;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
PackageName [Fast Boolean matching for LUT structures.]
|
||||
|
||||
Synopsis [Iterative MUX decomposition.]
|
||||
Synopsis [LUT-decomposition based on recursive MUX decomposition.]
|
||||
|
||||
Author [Alan Mishchenko]
|
||||
|
||||
|
|
@ -85,7 +85,7 @@ void Lpk_FunComputeCofSupps( Lpk_Fun_t * p, unsigned * puSupps )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
int Lpk_FunAnalizeMux( Lpk_Fun_t * p )
|
||||
int Lpk_MuxAnalize( Lpk_Fun_t * p )
|
||||
{
|
||||
unsigned puSupps[32] = {0};
|
||||
int nSuppSize0, nSuppSize1, Delay, Delay0, Delay1, DelayA, DelayB;
|
||||
|
|
@ -193,7 +193,7 @@ int Lpk_FunAnalizeMux( Lpk_Fun_t * p )
|
|||
SeeAlso []
|
||||
|
||||
***********************************************************************/
|
||||
Lpk_Fun_t * Lpk_FunSplitMux( Lpk_Fun_t * p, int VarPol )
|
||||
Lpk_Fun_t * Lpk_MuxSplit( Lpk_Fun_t * p, int VarPol )
|
||||
{
|
||||
Lpk_Fun_t * pNew;
|
||||
unsigned * pTruth = Lpk_FunTruth( p, 0 );
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/**CFile****************************************************************
|
||||
|
||||
FileName [lpkAbcFun.c]
|
||||
FileName [lpkAbcUtil.c]
|
||||
|
||||
SystemName [ABC: Logic synthesis and verification system.]
|
||||
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
Date [Ver. 1.0. Started - April 28, 2007.]
|
||||
|
||||
Revision [$Id: lpkAbcFun.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $]
|
||||
Revision [$Id: lpkAbcUtil.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $]
|
||||
|
||||
***********************************************************************/
|
||||
|
||||
|
|
@ -378,7 +378,7 @@ p->timeTruth += clock() - clk;
|
|||
|
||||
// update the network
|
||||
clk = clock();
|
||||
pObjNew = Lpk_LpkDecompose( p->pNtk, vLeaves, pTruth, p->pPars->nLutSize,
|
||||
pObjNew = Lpk_Decompose( p->pNtk, vLeaves, pTruth, p->pPars->nLutSize,
|
||||
(int)pCut->nNodes - (int)pCut->nNodesDup - 1, Abc_ObjRequiredLevel(p->pObj) );
|
||||
p->timeEval += clock() - clk;
|
||||
|
||||
|
|
|
|||
|
|
@ -118,21 +118,7 @@ struct Lpk_Man_t_
|
|||
};
|
||||
|
||||
|
||||
// preliminary decomposition result
|
||||
typedef struct Lpk_Res_t_ Lpk_Res_t;
|
||||
struct Lpk_Res_t_
|
||||
{
|
||||
int nBSVars;
|
||||
unsigned BSVars;
|
||||
int nCofVars;
|
||||
char pCofVars[4];
|
||||
int nSuppSizeS;
|
||||
int nSuppSizeL;
|
||||
int DelayEst;
|
||||
int AreaEst;
|
||||
};
|
||||
|
||||
// function to be decomposed
|
||||
// internal representation of the function to be decomposed
|
||||
typedef struct Lpk_Fun_t_ Lpk_Fun_t;
|
||||
struct Lpk_Fun_t_
|
||||
{
|
||||
|
|
@ -148,15 +134,23 @@ struct Lpk_Fun_t_
|
|||
unsigned pTruth[0]; // the truth table (contains room for three truth tables)
|
||||
};
|
||||
|
||||
#define Lpk_SuppForEachVar( Supp, Var )\
|
||||
for ( Var = 0; Var < 16; Var++ )\
|
||||
if ( !(Supp & (1<<Var)) ) {} else
|
||||
|
||||
static inline int Lpk_LutNumVars( int nLutsLim, int nLutK ) { return nLutsLim * (nLutK - 1) + 1; }
|
||||
static inline int Lpk_LutNumLuts( int nVarsMax, int nLutK ) { return (nVarsMax - 1) / (nLutK - 1) + (int)((nVarsMax - 1) % (nLutK - 1) > 0); }
|
||||
|
||||
static inline unsigned * Lpk_FunTruth( Lpk_Fun_t * p, int Num ) { assert( Num < 3 ); return p->pTruth + Kit_TruthWordNum(p->nVars) * Num; }
|
||||
// preliminary decomposition result
|
||||
typedef struct Lpk_Res_t_ Lpk_Res_t;
|
||||
struct Lpk_Res_t_
|
||||
{
|
||||
int nBSVars; // the number of bound set variables
|
||||
unsigned BSVars; // the bound set
|
||||
int nCofVars; // the number of cofactoring variables
|
||||
char pCofVars[4]; // the cofactoring variables
|
||||
int nSuppSizeS; // support size of the smaller (decomposed) function
|
||||
int nSuppSizeL; // support size of the larger (composition) function
|
||||
int DelayEst; // estimated delay of the decomposition
|
||||
int AreaEst; // estimated area of the decomposition
|
||||
};
|
||||
|
||||
static inline int Lpk_LutNumVars( int nLutsLim, int nLutK ) { return nLutsLim * (nLutK - 1) + 1; }
|
||||
static inline int Lpk_LutNumLuts( int nVarsMax, int nLutK ) { return (nVarsMax - 1) / (nLutK - 1) + (int)((nVarsMax - 1) % (nLutK - 1) > 0); }
|
||||
static inline unsigned * Lpk_FunTruth( Lpk_Fun_t * p, int Num ) { assert( Num < 3 ); return p->pTruth + Kit_TruthWordNum(p->nVars) * Num; }
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// MACRO DEFINITIONS ///
|
||||
|
|
@ -172,14 +166,23 @@ static inline unsigned * Lpk_FunTruth( Lpk_Fun_t * p, int Num ) { assert( Num <
|
|||
for ( i = 0; (i < (int)(pCut)->nNodes) && (((pObj) = Abc_NtkObj(pNtk, (pCut)->pNodes[i])), 1); i++ )
|
||||
#define Lpk_CutForEachNodeReverse( pNtk, pCut, pObj, i ) \
|
||||
for ( i = (int)(pCut)->nNodes - 1; (i >= 0) && (((pObj) = Abc_NtkObj(pNtk, (pCut)->pNodes[i])), 1); i-- )
|
||||
#define Lpk_SuppForEachVar( Supp, Var )\
|
||||
for ( Var = 0; Var < 16; Var++ )\
|
||||
if ( !(Supp & (1<<Var)) ) {} else
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
/// FUNCTION DECLARATIONS ///
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/*=== lpkAbcCore.c ============================================================*/
|
||||
extern Abc_Obj_t * Lpk_LpkDecompose( Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeaves, unsigned * pTruth, int nLutK, int AreaLim, int DelayLim );
|
||||
/*=== lpkAbcFun.c ============================================================*/
|
||||
/*=== lpkAbcDec.c ============================================================*/
|
||||
extern Abc_Obj_t * Lpk_Decompose( Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeaves, unsigned * pTruth, int nLutK, int AreaLim, int DelayLim );
|
||||
/*=== lpkAbcDsd.c ============================================================*/
|
||||
extern Lpk_Res_t * Lpk_DsdAnalize( Lpk_Fun_t * p, int nCofDepth );
|
||||
extern Lpk_Fun_t * Lpk_DsdSplit( Lpk_Fun_t * p, char * pCofVars, int nCofVars, unsigned uBoundSet );
|
||||
/*=== lpkAbcMux.c ============================================================*/
|
||||
extern int Lpk_MuxAnalize( Lpk_Fun_t * p );
|
||||
extern Lpk_Fun_t * Lpk_MuxSplit( Lpk_Fun_t * p, int VarPol );
|
||||
/*=== lpkAbcUtil.c ============================================================*/
|
||||
extern Lpk_Fun_t * Lpk_FunAlloc( int nVars );
|
||||
extern void Lpk_FunFree( Lpk_Fun_t * p );
|
||||
extern Lpk_Fun_t * Lpk_FunCreate( Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeaves, unsigned * pTruth, int nLutK, int AreaLim, int DelayLim );
|
||||
|
|
@ -187,12 +190,6 @@ extern Lpk_Fun_t * Lpk_FunDup( Lpk_Fun_t * p, unsigned * pTruth );
|
|||
extern void Lpk_FunSuppMinimize( Lpk_Fun_t * p );
|
||||
extern int Lpk_SuppDelay( unsigned uSupp, char * pDelays );
|
||||
extern int Lpk_SuppToVars( unsigned uBoundSet, char * pVars );
|
||||
/*=== lpkAbcDsd.c ============================================================*/
|
||||
extern Lpk_Res_t * Lpk_FunAnalizeDsd( Lpk_Fun_t * p, int nCofDepth );
|
||||
extern Lpk_Fun_t * Lpk_FunSplitDsd( Lpk_Fun_t * p, char * pCofVars, int nCofVars, unsigned uBoundSet );
|
||||
/*=== lpkAbcMux.c ============================================================*/
|
||||
extern int Lpk_FunAnalizeMux( Lpk_Fun_t * p );
|
||||
extern Lpk_Fun_t * Lpk_FunSplitMux( Lpk_Fun_t * p, int VarPol );
|
||||
|
||||
|
||||
/*=== lpkCut.c =========================================================*/
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
SRC += src/opt/lpk/lpkCore.c \
|
||||
src/opt/lpk/lpkAbcDec.c \
|
||||
src/opt/lpk/lpkAbcMux.c \
|
||||
src/opt/lpk/lpkAbcDsd.c \
|
||||
src/opt/lpk/lpkAbcUtil.c \
|
||||
src/opt/lpk/lpkCut.c \
|
||||
src/opt/lpk/lpkMan.c \
|
||||
src/opt/lpk/lpkMap.c \
|
||||
|
|
|
|||
Loading…
Reference in New Issue