mirror of https://github.com/YosysHQ/abc.git
Experiment with bit-packing.
This commit is contained in:
parent
5222f382af
commit
93fef036d5
|
|
@ -230,6 +230,13 @@ int Aig_ObjTerSimulate( Aig_Man_t * pAig, Aig_Obj_t * pNode, Vec_Int_t * vSuppLi
|
||||||
return Aig_ObjTerSimulate_rec( pAig, pNode );
|
return Aig_ObjTerSimulate_rec( pAig, pNode );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct Aig_ManPack_t_ Aig_ManPack_t;
|
||||||
|
extern Aig_ManPack_t * Aig_ManPackStart( Aig_Man_t * pAig );
|
||||||
|
extern void Aig_ManPackStop( Aig_ManPack_t * p );
|
||||||
|
extern void Aig_ManPackAddPattern( Aig_ManPack_t * p, Vec_Int_t * vLits );
|
||||||
|
extern Vec_Int_t * Aig_ManPackConstNodes( Aig_ManPack_t * p );
|
||||||
|
|
||||||
/**Function*************************************************************
|
/**Function*************************************************************
|
||||||
|
|
||||||
Synopsis [Testing of the framework.]
|
Synopsis [Testing of the framework.]
|
||||||
|
|
@ -241,24 +248,29 @@ int Aig_ObjTerSimulate( Aig_Man_t * pAig, Aig_Obj_t * pNode, Vec_Int_t * vSuppLi
|
||||||
SeeAlso []
|
SeeAlso []
|
||||||
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
void Aig_ManTerSimulate( Aig_Man_t * pAig )
|
void Aig_ManJustExperiment( Aig_Man_t * pAig )
|
||||||
{
|
{
|
||||||
Vec_Int_t * vSuppLits;
|
Aig_ManPack_t * pPack;
|
||||||
|
Vec_Int_t * vSuppLits, * vNodes;
|
||||||
Aig_Obj_t * pObj;
|
Aig_Obj_t * pObj;
|
||||||
int i, clk = clock(), Count0 = 0, Count0f = 0, Count1 = 0, Count1f = 0;
|
int i, clk = clock(), Count0 = 0, Count0f = 0, Count1 = 0, Count1f = 0;
|
||||||
int nTotalLits = 0;
|
int nTotalLits = 0;
|
||||||
vSuppLits = Vec_IntAlloc( 100 );
|
vSuppLits = Vec_IntAlloc( 100 );
|
||||||
Aig_ManForEachPo( pAig, pObj, i )
|
pPack = Aig_ManPackStart( pAig );
|
||||||
|
vNodes = Aig_ManPackConstNodes( pPack );
|
||||||
|
// Aig_ManForEachPo( pAig, pObj, i )
|
||||||
|
Aig_ManForEachNodeVec( pAig, vNodes, pObj, i )
|
||||||
{
|
{
|
||||||
if ( pObj->fPhase ) // const 1
|
if ( pObj->fPhase ) // const 1
|
||||||
{
|
{
|
||||||
if ( Aig_ObjFindSatAssign(pAig, pObj, 0, vSuppLits) )
|
if ( Aig_ObjFindSatAssign(pAig, pObj, 0, vSuppLits) )
|
||||||
{
|
{
|
||||||
// assert( Aig_ObjTerSimulate(pAig, pObj, vSuppLits) == AIG_VAL0 );
|
// assert( Aig_ObjTerSimulate(pAig, pObj, vSuppLits) == AIG_VAL0 );
|
||||||
if ( Aig_ObjTerSimulate(pAig, pObj, vSuppLits) != AIG_VAL0 )
|
// if ( Aig_ObjTerSimulate(pAig, pObj, vSuppLits) != AIG_VAL0 )
|
||||||
printf( "Justification error!\n" );
|
// printf( "Justification error!\n" );
|
||||||
Count0++;
|
Count0++;
|
||||||
nTotalLits += Vec_IntSize(vSuppLits);
|
nTotalLits += Vec_IntSize(vSuppLits);
|
||||||
|
Aig_ManPackAddPattern( pPack, vSuppLits );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Count0f++;
|
Count0f++;
|
||||||
|
|
@ -268,10 +280,11 @@ void Aig_ManTerSimulate( Aig_Man_t * pAig )
|
||||||
if ( Aig_ObjFindSatAssign(pAig, pObj, 1, vSuppLits) )
|
if ( Aig_ObjFindSatAssign(pAig, pObj, 1, vSuppLits) )
|
||||||
{
|
{
|
||||||
// assert( Aig_ObjTerSimulate(pAig, pObj, vSuppLits) == AIG_VAL1 );
|
// assert( Aig_ObjTerSimulate(pAig, pObj, vSuppLits) == AIG_VAL1 );
|
||||||
if ( Aig_ObjTerSimulate(pAig, pObj, vSuppLits) != AIG_VAL1 )
|
// if ( Aig_ObjTerSimulate(pAig, pObj, vSuppLits) != AIG_VAL1 )
|
||||||
printf( "Justification error!\n" );
|
// printf( "Justification error!\n" );
|
||||||
Count1++;
|
Count1++;
|
||||||
nTotalLits += Vec_IntSize(vSuppLits);
|
nTotalLits += Vec_IntSize(vSuppLits);
|
||||||
|
Aig_ManPackAddPattern( pPack, vSuppLits );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Count1f++;
|
Count1f++;
|
||||||
|
|
@ -282,6 +295,8 @@ void Aig_ManTerSimulate( Aig_Man_t * pAig )
|
||||||
Aig_ManPoNum(pAig), Count0, Count0f, Count1, Count1f, 100.0*(Count0+Count1)/Aig_ManPoNum(pAig), 1.0*nTotalLits/(Count0+Count1) );
|
Aig_ManPoNum(pAig), Count0, Count0f, Count1, Count1f, 100.0*(Count0+Count1)/Aig_ManPoNum(pAig), 1.0*nTotalLits/(Count0+Count1) );
|
||||||
Abc_PrintTime( 1, "T", clock() - clk );
|
Abc_PrintTime( 1, "T", clock() - clk );
|
||||||
Aig_ManCleanMarkAB( pAig );
|
Aig_ManCleanMarkAB( pAig );
|
||||||
|
Aig_ManPackStop( pPack );
|
||||||
|
Vec_IntFree( vNodes );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,25 @@ ABC_NAMESPACE_IMPL_START
|
||||||
/// DECLARATIONS ///
|
/// DECLARATIONS ///
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// resubstitution manager
|
||||||
|
typedef struct Aig_ManPack_t_ Aig_ManPack_t;
|
||||||
|
struct Aig_ManPack_t_
|
||||||
|
{
|
||||||
|
Aig_Man_t * pAig; // working manager
|
||||||
|
Vec_Wrd_t * vSigns; // object signatures
|
||||||
|
Vec_Wrd_t * vPiPats; // PI assignments
|
||||||
|
Vec_Wrd_t * vPiCare; // PI care set
|
||||||
|
int iPatCur; // current pattern
|
||||||
|
int fVerbose; // verbosiness flag
|
||||||
|
// statistics
|
||||||
|
int nPatTotal; // number of all patterns
|
||||||
|
int nPatSkip; // number of skipped patterns
|
||||||
|
int nPatRepeat; // number of repeated patterns
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline int Aig_Word6CountOnes( word t ) { return Aig_WordCountOnes( (unsigned)(t >> 32) ) + Aig_WordCountOnes( (unsigned)(t & 0xFFFFFFFF) ); }
|
||||||
|
static inline int Aig_Word6HasOneBit( word t ) { return (t & (t-1)) == 0; }
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
/// FUNCTION DEFINITIONS ///
|
/// FUNCTION DEFINITIONS ///
|
||||||
|
|
@ -43,7 +62,338 @@ ABC_NAMESPACE_IMPL_START
|
||||||
SeeAlso []
|
SeeAlso []
|
||||||
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
Aig_ManPack_t * Aig_ManPackAlloc( Aig_Man_t * pAig )
|
||||||
|
{
|
||||||
|
Aig_ManPack_t * p;
|
||||||
|
p = ABC_CALLOC( Aig_ManPack_t, 1 );
|
||||||
|
p->pAig = pAig;
|
||||||
|
p->vSigns = Vec_WrdStart( Aig_ManObjNumMax(pAig) );
|
||||||
|
p->vPiPats = Vec_WrdStart( Aig_ManPiNum(pAig) );
|
||||||
|
p->vPiCare = Vec_WrdStart( Aig_ManPiNum(pAig) );
|
||||||
|
p->iPatCur = 1;
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis []
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
int Aig_ManPackCountCares( Aig_ManPack_t * p )
|
||||||
|
{
|
||||||
|
Aig_Obj_t * pObj;
|
||||||
|
int i, Total = 0;
|
||||||
|
Aig_ManForEachPi( p->pAig, pObj, i )
|
||||||
|
Total += Aig_Word6CountOnes( Vec_WrdEntry(p->vPiCare, i) );
|
||||||
|
return Total;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis []
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
void Aig_ManPackPrintCare( Aig_ManPack_t * p )
|
||||||
|
{
|
||||||
|
Aig_Obj_t * pObj;
|
||||||
|
word Sign;
|
||||||
|
int i;
|
||||||
|
Aig_ManForEachPi( p->pAig, pObj, i )
|
||||||
|
{
|
||||||
|
Sign = Vec_WrdEntry( p->vPiCare, i );
|
||||||
|
Extra_PrintBinary( stdout, (unsigned *)&Sign, 64 );
|
||||||
|
printf( "\n" );
|
||||||
|
}
|
||||||
|
printf( "\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis []
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
void Aig_ManPackFree( Aig_ManPack_t * p )
|
||||||
|
{
|
||||||
|
// Aig_ManPackPrintCare( p );
|
||||||
|
printf( "Patterns: " );
|
||||||
|
printf( "Total = %6d. ", p->nPatTotal );
|
||||||
|
printf( "Skipped = %6d. ", p->nPatSkip );
|
||||||
|
printf( "Cares = %6.2f %% ", 100.0*Aig_ManPackCountCares(p)/Aig_ManPiNum(p->pAig)/64 );
|
||||||
|
printf( "\n" );
|
||||||
|
Vec_WrdFree( p->vSigns );
|
||||||
|
Vec_WrdFree( p->vPiPats );
|
||||||
|
Vec_WrdFree( p->vPiCare );
|
||||||
|
ABC_FREE( p );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis []
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
void Aig_ManPackSetRandom( Aig_ManPack_t * p )
|
||||||
|
{
|
||||||
|
Aig_Obj_t * pObj;
|
||||||
|
word Sign;
|
||||||
|
int i;
|
||||||
|
Aig_ManForEachPi( p->pAig, pObj, i )
|
||||||
|
{
|
||||||
|
Sign = (((word)Aig_ManRandom(0)) << 32) | ((word)Aig_ManRandom(0));
|
||||||
|
Vec_WrdWriteEntry( p->vPiPats, i, Sign << 1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis []
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
void Aig_ManPackSimulate( Aig_ManPack_t * p )
|
||||||
|
{
|
||||||
|
Aig_Obj_t * pObj;
|
||||||
|
word Sign, Sign0, Sign1;
|
||||||
|
int i;
|
||||||
|
// set the constant
|
||||||
|
Vec_WrdWriteEntry( p->vSigns, 0, (word)~0 );
|
||||||
|
// transfer into the array
|
||||||
|
Aig_ManForEachPi( p->pAig, pObj, i )
|
||||||
|
Vec_WrdWriteEntry( p->vSigns, Aig_ObjId(pObj), Vec_WrdEntry(p->vPiPats, i) );
|
||||||
|
// simulate internal nodes
|
||||||
|
Aig_ManForEachNode( p->pAig, pObj, i )
|
||||||
|
{
|
||||||
|
Sign0 = Vec_WrdEntry( p->vSigns, Aig_ObjFaninId0(pObj) );
|
||||||
|
Sign1 = Vec_WrdEntry( p->vSigns, Aig_ObjFaninId1(pObj) );
|
||||||
|
if ( Aig_ObjFaninC0(pObj) && Aig_ObjFaninC1(pObj) )
|
||||||
|
Sign = ~(Sign0 | Sign1);
|
||||||
|
else if ( Aig_ObjFaninC0(pObj) )
|
||||||
|
Sign = ~Sign0 & Sign1;
|
||||||
|
else if ( Aig_ObjFaninC1(pObj) )
|
||||||
|
Sign = Sign0 & ~Sign1;
|
||||||
|
else
|
||||||
|
Sign = Sign0 & Sign1;
|
||||||
|
Vec_WrdWriteEntry( p->vSigns, Aig_ObjId(pObj), Sign );
|
||||||
|
}
|
||||||
|
// set the outputs
|
||||||
|
Aig_ManForEachPo( p->pAig, pObj, i )
|
||||||
|
{
|
||||||
|
Sign0 = Vec_WrdEntry( p->vSigns, Aig_ObjFaninId0(pObj) );
|
||||||
|
Sign = Aig_ObjFaninC0(pObj) ? ~Sign0 : Sign0;
|
||||||
|
Vec_WrdWriteEntry( p->vSigns, Aig_ObjId(pObj), Sign );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis []
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
void Aig_ManPackPrintStats( Aig_ManPack_t * p )
|
||||||
|
{
|
||||||
|
word Sign;
|
||||||
|
Aig_Obj_t * pObj;
|
||||||
|
int i, Total, Count, Counts[33] = {0}; // the number of nodes having that many patterns
|
||||||
|
Aig_ManForEachNode( p->pAig, pObj, i )
|
||||||
|
{
|
||||||
|
Sign = Vec_WrdEntry( p->vSigns, Aig_ObjId(pObj) );
|
||||||
|
Count = Aig_Word6CountOnes( Sign );
|
||||||
|
if ( Count > 32 )
|
||||||
|
Count = 64 - Count;
|
||||||
|
Counts[Count]++;
|
||||||
|
}
|
||||||
|
// print statistics
|
||||||
|
Total = 0;
|
||||||
|
for ( i = 0; i <= 32; i++ )
|
||||||
|
{
|
||||||
|
Total += Counts[i];
|
||||||
|
printf( "%2d : ", i );
|
||||||
|
printf( "%6d ", Counts[i] );
|
||||||
|
printf( "%6.1f %%", 100.0*Counts[i]/Aig_ManNodeNum(p->pAig) );
|
||||||
|
printf( "%6.1f %%", 100.0*Total/Aig_ManNodeNum(p->pAig) );
|
||||||
|
printf( "\n" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis []
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
Vec_Int_t * Aig_ManPackConstNodes( Aig_ManPack_t * p )
|
||||||
|
{
|
||||||
|
Vec_Int_t * vNodes;
|
||||||
|
Aig_Obj_t * pObj;
|
||||||
|
word Sign;
|
||||||
|
int i;
|
||||||
|
vNodes = Vec_IntAlloc( 1000 );
|
||||||
|
Aig_ManForEachNode( p->pAig, pObj, i )
|
||||||
|
{
|
||||||
|
Sign = Vec_WrdEntry( p->vSigns, Aig_ObjId(pObj) );
|
||||||
|
if ( Sign == 0 || ~Sign == 0 || Aig_Word6HasOneBit(Sign) || Aig_Word6HasOneBit(~Sign) )
|
||||||
|
Vec_IntPush( vNodes, Aig_ObjId(pObj) );
|
||||||
|
}
|
||||||
|
return vNodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis [Packs patterns into array of simulation info.]
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
*************************************`**********************************/
|
||||||
|
int Aig_ManPackAddPatternTry( Aig_ManPack_t * p, int iBit, Vec_Int_t * vLits )
|
||||||
|
{
|
||||||
|
word * pInfo, * pPres;
|
||||||
|
int i, Lit;
|
||||||
|
Vec_IntForEachEntry( vLits, Lit, i )
|
||||||
|
{
|
||||||
|
pInfo = Vec_WrdEntryP( p->vPiPats, Aig_Lit2Var(Lit) );
|
||||||
|
pPres = Vec_WrdEntryP( p->vPiCare, Aig_Lit2Var(Lit) );
|
||||||
|
if ( Aig_InfoHasBit( (unsigned *)pPres, iBit ) &&
|
||||||
|
Aig_InfoHasBit( (unsigned *)pInfo, iBit ) == Aig_LitIsCompl(Lit) )
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
Vec_IntForEachEntry( vLits, Lit, i )
|
||||||
|
{
|
||||||
|
pInfo = Vec_WrdEntryP( p->vPiPats, Aig_Lit2Var(Lit) );
|
||||||
|
pPres = Vec_WrdEntryP( p->vPiCare, Aig_Lit2Var(Lit) );
|
||||||
|
Aig_InfoSetBit( (unsigned *)pPres, iBit );
|
||||||
|
if ( Aig_InfoHasBit( (unsigned *)pInfo, iBit ) == Aig_LitIsCompl(Lit) )
|
||||||
|
Aig_InfoXorBit( (unsigned *)pInfo, iBit );
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis []
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
void Aig_ManPackAddPattern( Aig_ManPack_t * p, Vec_Int_t * vLits )
|
||||||
|
{
|
||||||
|
int k;
|
||||||
|
for ( k = 1; k < 64; k++ )
|
||||||
|
if ( Aig_ManPackAddPatternTry( p, k, vLits ) )
|
||||||
|
break;
|
||||||
|
if ( k == 64 )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
word * pInfo, * pPres;
|
||||||
|
int i, Lit;
|
||||||
|
Vec_IntForEachEntry( vLits, Lit, i )
|
||||||
|
printf( "%d", Aig_LitIsCompl(Lit) );
|
||||||
|
printf( "\n\n" );
|
||||||
|
for ( k = 1; k < 64; k++ )
|
||||||
|
{
|
||||||
|
Vec_IntForEachEntry( vLits, Lit, i )
|
||||||
|
{
|
||||||
|
pInfo = Vec_WrdEntryP( p->vPiPats, Aig_Lit2Var(Lit) );
|
||||||
|
pPres = Vec_WrdEntryP( p->vPiCare, Aig_Lit2Var(Lit) );
|
||||||
|
if ( Aig_InfoHasBit( (unsigned *)pPres, k ) )
|
||||||
|
printf( "%d", Aig_InfoHasBit( (unsigned *)pInfo, k ) );
|
||||||
|
else
|
||||||
|
printf( "-" );
|
||||||
|
}
|
||||||
|
printf( "\n" );
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
p->nPatSkip++;
|
||||||
|
}
|
||||||
|
p->nPatTotal++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis []
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
Aig_ManPack_t * Aig_ManPackStart( Aig_Man_t * pAig )
|
||||||
|
{
|
||||||
|
Aig_ManPack_t * p;
|
||||||
|
p = Aig_ManPackAlloc( pAig );
|
||||||
|
Aig_ManPackSetRandom( p );
|
||||||
|
Aig_ManPackSimulate( p );
|
||||||
|
Aig_ManPackPrintStats( p );
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis []
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
void Aig_ManPackStop( Aig_ManPack_t * p )
|
||||||
|
{
|
||||||
|
Aig_ManPackSimulate( p );
|
||||||
|
Aig_ManPackPrintStats( p );
|
||||||
|
Aig_ManPackFree( p );
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
/// END OF FILE ///
|
/// END OF FILE ///
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue