Commit e5d83352 by Alan Mishchenko

Experiments with AIG-based simulation.

parent 1743979b
...@@ -203,6 +203,8 @@ struct Gia_Man_t_ ...@@ -203,6 +203,8 @@ struct Gia_Man_t_
int fBuiltInSim; int fBuiltInSim;
int iPatsPi; int iPatsPi;
int nSimWords; int nSimWords;
int iPastPiMax;
int nSimWordsMax;
Vec_Wrd_t * vSims; Vec_Wrd_t * vSims;
Vec_Wrd_t * vSimsPi; Vec_Wrd_t * vSimsPi;
Vec_Int_t * vClassOld; Vec_Int_t * vClassOld;
...@@ -692,7 +694,12 @@ static inline int Gia_ManAppendAnd( Gia_Man_t * p, int iLit0, int iLit1 ) ...@@ -692,7 +694,12 @@ static inline int Gia_ManAppendAnd( Gia_Man_t * p, int iLit0, int iLit1 )
pObj->fPhase = (Gia_ObjPhase(pFan0) ^ Gia_ObjFaninC0(pObj)) & (Gia_ObjPhase(pFan1) ^ Gia_ObjFaninC1(pObj)); pObj->fPhase = (Gia_ObjPhase(pFan0) ^ Gia_ObjFaninC0(pObj)) & (Gia_ObjPhase(pFan1) ^ Gia_ObjFaninC1(pObj));
} }
if ( p->fBuiltInSim ) if ( p->fBuiltInSim )
{
Gia_Obj_t * pFan0 = Gia_ObjFanin0(pObj);
Gia_Obj_t * pFan1 = Gia_ObjFanin1(pObj);
pObj->fPhase = (Gia_ObjPhase(pFan0) ^ Gia_ObjFaninC0(pObj)) & (Gia_ObjPhase(pFan1) ^ Gia_ObjFaninC1(pObj));
Gia_ManBuiltInSimPerform( p, Gia_ObjId( p, pObj ) ); Gia_ManBuiltInSimPerform( p, Gia_ObjId( p, pObj ) );
}
if ( p->vSuppWords ) if ( p->vSuppWords )
Gia_ManQuantSetSuppAnd( p, pObj ); Gia_ManQuantSetSuppAnd( p, pObj );
return Gia_ObjId( p, pObj ) << 1; return Gia_ObjId( p, pObj ) << 1;
...@@ -1208,6 +1215,8 @@ extern Cbs_Man_t * Cbs_ManAlloc( Gia_Man_t * pGia ); ...@@ -1208,6 +1215,8 @@ extern Cbs_Man_t * Cbs_ManAlloc( Gia_Man_t * pGia );
extern void Cbs_ManStop( Cbs_Man_t * p ); extern void Cbs_ManStop( Cbs_Man_t * p );
extern int Cbs_ManSolve( Cbs_Man_t * p, Gia_Obj_t * pObj, Gia_Obj_t * pObj2 ); extern int Cbs_ManSolve( Cbs_Man_t * p, Gia_Obj_t * pObj, Gia_Obj_t * pObj2 );
extern Vec_Int_t * Cbs_ManSolveMiterNc( Gia_Man_t * pGia, int nConfs, Vec_Str_t ** pvStatus, int fVerbose ); extern Vec_Int_t * Cbs_ManSolveMiterNc( Gia_Man_t * pGia, int nConfs, Vec_Str_t ** pvStatus, int fVerbose );
extern void Cbs_ManSetConflictNum( Cbs_Man_t * p, int Num );
extern Vec_Int_t * Cbs_ReadModel( Cbs_Man_t * p );
/*=== giaCTas.c ============================================================*/ /*=== giaCTas.c ============================================================*/
extern Vec_Int_t * Tas_ManSolveMiterNc( Gia_Man_t * pGia, int nConfs, Vec_Str_t ** pvStatus, int fVerbose ); extern Vec_Int_t * Tas_ManSolveMiterNc( Gia_Man_t * pGia, int nConfs, Vec_Str_t ** pvStatus, int fVerbose );
/*=== giaCof.c =============================================================*/ /*=== giaCof.c =============================================================*/
...@@ -1504,8 +1513,11 @@ extern void Gia_ManSimInfoTransfer( Gia_ManSim_t * p ); ...@@ -1504,8 +1513,11 @@ extern void Gia_ManSimInfoTransfer( Gia_ManSim_t * p );
extern void Gia_ManSimulateRound( Gia_ManSim_t * p ); extern void Gia_ManSimulateRound( Gia_ManSim_t * p );
extern void Gia_ManBuiltInSimStart( Gia_Man_t * p, int nWords, int nObjs ); extern void Gia_ManBuiltInSimStart( Gia_Man_t * p, int nWords, int nObjs );
extern void Gia_ManBuiltInSimPerform( Gia_Man_t * p, int iObj ); extern void Gia_ManBuiltInSimPerform( Gia_Man_t * p, int iObj );
extern int Gia_ManBuiltInSimCheck( Gia_Man_t * p, int iLit0, int iLit1 ); extern int Gia_ManBuiltInSimCheckOver( Gia_Man_t * p, int iLit0, int iLit1 );
extern int Gia_ManObjCheckOverlap( Gia_Man_t * p, int iLit0, int iLit1, Vec_Int_t * vObjs ); extern int Gia_ManBuiltInSimCheckEqual( Gia_Man_t * p, int iLit0, int iLit1 );
extern void Gia_ManBuiltInSimResimulateCone( Gia_Man_t * p, int iLit0, int iLit1 );
extern void Gia_ManBuiltInSimResimulate( Gia_Man_t * p );
extern int Gia_ManBuiltInSimAddPat( Gia_Man_t * p, Vec_Int_t * vPat );
/*=== giaSpeedup.c ============================================================*/ /*=== giaSpeedup.c ============================================================*/
extern float Gia_ManDelayTraceLut( Gia_Man_t * p ); extern float Gia_ManDelayTraceLut( Gia_Man_t * p );
extern float Gia_ManDelayTraceLutPrint( Gia_Man_t * p, int fVerbose ); extern float Gia_ManDelayTraceLutPrint( Gia_Man_t * p, int fVerbose );
......
...@@ -134,6 +134,10 @@ void Cbs_SetDefaultParams( Cbs_Par_t * pPars ) ...@@ -134,6 +134,10 @@ void Cbs_SetDefaultParams( Cbs_Par_t * pPars )
pPars->fUseMaxFF = 0; // use node with the largest fanin fanout pPars->fUseMaxFF = 0; // use node with the largest fanin fanout
pPars->fVerbose = 1; // print detailed statistics pPars->fVerbose = 1; // print detailed statistics
} }
void Cbs_ManSetConflictNum( Cbs_Man_t * p, int Num )
{
p->Pars.nBTLimit = Num;
}
/**Function************************************************************* /**Function*************************************************************
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
***********************************************************************/ ***********************************************************************/
#include "gia.h" #include "gia.h"
#include "misc/util/utilTruth.h"
ABC_NAMESPACE_IMPL_START ABC_NAMESPACE_IMPL_START
...@@ -760,51 +761,102 @@ void Gia_ManSimSimulatePattern( Gia_Man_t * p, char * pFileIn, char * pFileOut ) ...@@ -760,51 +761,102 @@ void Gia_ManSimSimulatePattern( Gia_Man_t * p, char * pFileIn, char * pFileOut )
SeeAlso [] SeeAlso []
***********************************************************************/ ***********************************************************************/
static inline word * Gia_ManBuiltInDataPi( Gia_Man_t * p, int iCiId )
{
return Vec_WrdEntryP( p->vSimsPi, p->nSimWords * iCiId );
}
static inline word * Gia_ManBuiltInData( Gia_Man_t * p, int iObj ) static inline word * Gia_ManBuiltInData( Gia_Man_t * p, int iObj )
{ {
return Vec_WrdEntryP( p->vSims, p->nSimWords * iObj ); return Vec_WrdEntryP( p->vSims, p->nSimWords * iObj );
} }
static inline void Gia_ManBuiltInDataPrint( Gia_Man_t * p, int iObj )
{
// printf( "Obj %6d : ", iObj ); Extra_PrintBinary( stdout, Gia_ManBuiltInData(p, iObj), p->nSimWords * 64 ); printf( "\n" );
}
void Gia_ManBuiltInSimStart( Gia_Man_t * p, int nWords, int nObjs ) void Gia_ManBuiltInSimStart( Gia_Man_t * p, int nWords, int nObjs )
{ {
int i, k; int i, k;
assert( !p->fBuiltInSim ); assert( !p->fBuiltInSim );
assert( Gia_ManAndNum(p) == 0 ); assert( Gia_ManAndNum(p) == 0 );
p->fBuiltInSim = 1; p->fBuiltInSim = 1;
p->iPatsPi = 0;
p->iPastPiMax = 0;
p->nSimWords = nWords; p->nSimWords = nWords;
p->nSimWordsMax = 8;
Gia_ManRandomW( 1 );
// init PI care info
p->vSimsPi = Vec_WrdAlloc( p->nSimWords * Gia_ManCiNum(p) );
Vec_WrdFill( p->vSimsPi, p->nSimWords * Gia_ManCiNum(p), 0 );
// init object sim info
p->vSims = Vec_WrdAlloc( p->nSimWords * nObjs ); p->vSims = Vec_WrdAlloc( p->nSimWords * nObjs );
Vec_WrdFill( p->vSims, p->nSimWords, 0 ); Vec_WrdFill( p->vSims, p->nSimWords, 0 );
Gia_ManRandomW( 1 );
for ( i = 0; i < Gia_ManCiNum(p); i++ ) for ( i = 0; i < Gia_ManCiNum(p); i++ )
for ( k = 0; k < p->nSimWords; k++ ) for ( k = 0; k < p->nSimWords; k++ )
Vec_WrdPush( p->vSims, Gia_ManRandomW(0) ); Vec_WrdPush( p->vSims, Gia_ManRandomW(0) );
} }
void Gia_ManBuiltInSimPerform( Gia_Man_t * p, int iObj ) void Gia_ManBuiltInSimPerformInt( Gia_Man_t * p, int iObj )
{ {
Gia_Obj_t * pObj = Gia_ManObj( p, iObj ); Gia_Obj_t * pObj = Gia_ManObj( p, iObj ); int w;
word * pInfo = Gia_ManBuiltInData( p, iObj );
word * pInfo0 = Gia_ManBuiltInData( p, Gia_ObjFaninId0(pObj, iObj) ); word * pInfo0 = Gia_ManBuiltInData( p, Gia_ObjFaninId0(pObj, iObj) );
word * pInfo1 = Gia_ManBuiltInData( p, Gia_ObjFaninId1(pObj, iObj) ); int w; word * pInfo1 = Gia_ManBuiltInData( p, Gia_ObjFaninId1(pObj, iObj) );
assert( p->fBuiltInSim ); assert( p->fBuiltInSim );
if ( Gia_ObjFaninC0(pObj) ) if ( Gia_ObjFaninC0(pObj) )
{ {
if ( Gia_ObjFaninC1(pObj) ) if ( Gia_ObjFaninC1(pObj) )
for ( w = 0; w < p->nSimWords; w++ ) for ( w = 0; w < p->nSimWords; w++ )
Vec_WrdPush( p->vSims, ~(pInfo0[w] | pInfo1[w]) ); pInfo[w] = ~(pInfo0[w] | pInfo1[w]);
else else
for ( w = 0; w < p->nSimWords; w++ ) for ( w = 0; w < p->nSimWords; w++ )
Vec_WrdPush( p->vSims, ~pInfo0[w] & pInfo1[w] ); pInfo[w] = ~pInfo0[w] & pInfo1[w];
} }
else else
{ {
if ( Gia_ObjFaninC1(pObj) ) if ( Gia_ObjFaninC1(pObj) )
for ( w = 0; w < p->nSimWords; w++ ) for ( w = 0; w < p->nSimWords; w++ )
Vec_WrdPush( p->vSims, pInfo0[w] & ~pInfo1[w] ); pInfo[w] = pInfo0[w] & ~pInfo1[w];
else else
for ( w = 0; w < p->nSimWords; w++ ) for ( w = 0; w < p->nSimWords; w++ )
Vec_WrdPush( p->vSims, pInfo0[w] & pInfo1[w] ); pInfo[w] = pInfo0[w] & pInfo1[w];
} }
assert( Vec_WrdSize(p->vSims) == Gia_ManObjNum(p) * p->nSimWords ); assert( Vec_WrdSize(p->vSims) == Gia_ManObjNum(p) * p->nSimWords );
} }
int Gia_ManBuiltInSimCheck( Gia_Man_t * p, int iLit0, int iLit1 ) void Gia_ManBuiltInSimPerform( Gia_Man_t * p, int iObj )
{
int w;
for ( w = 0; w < p->nSimWords; w++ )
Vec_WrdPush( p->vSims, 0 );
Gia_ManBuiltInSimPerformInt( p, iObj );
}
void Gia_ManBuiltInSimResimulateCone_rec( Gia_Man_t * p, int iObj )
{
Gia_Obj_t * pObj;
if ( Gia_ObjIsTravIdCurrentId(p, iObj) )
return;
Gia_ObjSetTravIdCurrentId(p, iObj);
pObj = Gia_ManObj( p, iObj );
if ( Gia_ObjIsCi(pObj) )
return;
assert( Gia_ObjIsAnd(pObj) );
Gia_ManBuiltInSimResimulateCone_rec( p, Gia_ObjFaninId0(pObj, iObj) );
Gia_ManBuiltInSimResimulateCone_rec( p, Gia_ObjFaninId1(pObj, iObj) );
Gia_ManBuiltInSimPerformInt( p, iObj );
}
void Gia_ManBuiltInSimResimulateCone( Gia_Man_t * p, int iLit0, int iLit1 )
{
Gia_ManIncrementTravId( p );
Gia_ManBuiltInSimResimulateCone_rec( p, Abc_Lit2Var(iLit0) );
Gia_ManBuiltInSimResimulateCone_rec( p, Abc_Lit2Var(iLit1) );
}
void Gia_ManBuiltInSimResimulate( Gia_Man_t * p )
{
Gia_Obj_t * pObj; int iObj;
Gia_ManForEachAnd( p, pObj, iObj )
Gia_ManBuiltInSimPerformInt( p, iObj );
}
int Gia_ManBuiltInSimCheckOver( Gia_Man_t * p, int iLit0, int iLit1 )
{ {
word * pInfo0 = Gia_ManBuiltInData( p, Abc_Lit2Var(iLit0) ); word * pInfo0 = Gia_ManBuiltInData( p, Abc_Lit2Var(iLit0) );
word * pInfo1 = Gia_ManBuiltInData( p, Abc_Lit2Var(iLit1) ); int w; word * pInfo1 = Gia_ManBuiltInData( p, Abc_Lit2Var(iLit1) ); int w;
...@@ -818,28 +870,193 @@ int Gia_ManBuiltInSimCheck( Gia_Man_t * p, int iLit0, int iLit1 ) ...@@ -818,28 +870,193 @@ int Gia_ManBuiltInSimCheck( Gia_Man_t * p, int iLit0, int iLit1 )
if ( Abc_LitIsCompl(iLit0) ) if ( Abc_LitIsCompl(iLit0) )
{ {
if ( Abc_LitIsCompl(iLit1) ) if ( Abc_LitIsCompl(iLit1) )
{
for ( w = 0; w < p->nSimWords; w++ ) for ( w = 0; w < p->nSimWords; w++ )
if ( ~pInfo0[w] & ~pInfo1[w] ) if ( ~pInfo0[w] & ~pInfo1[w] )
return 1; return 1;
}
else else
{
for ( w = 0; w < p->nSimWords; w++ ) for ( w = 0; w < p->nSimWords; w++ )
if ( ~pInfo0[w] & pInfo1[w] ) if ( ~pInfo0[w] & pInfo1[w] )
return 1; return 1;
} }
}
else else
{ {
if ( Abc_LitIsCompl(iLit1) ) if ( Abc_LitIsCompl(iLit1) )
{
for ( w = 0; w < p->nSimWords; w++ ) for ( w = 0; w < p->nSimWords; w++ )
if ( pInfo0[w] & ~pInfo1[w] ) if ( pInfo0[w] & ~pInfo1[w] )
return 1; return 1;
}
else else
{
for ( w = 0; w < p->nSimWords; w++ ) for ( w = 0; w < p->nSimWords; w++ )
if ( pInfo0[w] & pInfo1[w] ) if ( pInfo0[w] & pInfo1[w] )
return 1; return 1;
} }
}
return 0;
}
int Gia_ManBuiltInSimCheckEqual( Gia_Man_t * p, int iLit0, int iLit1 )
{
word * pInfo0 = Gia_ManBuiltInData( p, Abc_Lit2Var(iLit0) );
word * pInfo1 = Gia_ManBuiltInData( p, Abc_Lit2Var(iLit1) ); int w;
assert( p->fBuiltInSim );
// printf( "%d %d\n", Abc_LitIsCompl(iLit0), Abc_LitIsCompl(iLit1) );
// Extra_PrintBinary( stdout, pInfo0, 64*p->nSimWords ); printf( "\n" );
// Extra_PrintBinary( stdout, pInfo1, 64*p->nSimWords ); printf( "\n" );
// printf( "\n" );
if ( Abc_LitIsCompl(iLit0) )
{
if ( Abc_LitIsCompl(iLit1) )
{
for ( w = 0; w < p->nSimWords; w++ )
if ( ~pInfo0[w] != ~pInfo1[w] )
return 0;
}
else
{
for ( w = 0; w < p->nSimWords; w++ )
if ( ~pInfo0[w] != pInfo1[w] )
return 0;
}
}
else
{
if ( Abc_LitIsCompl(iLit1) )
{
for ( w = 0; w < p->nSimWords; w++ )
if ( pInfo0[w] != ~pInfo1[w] )
return 0;
}
else
{
for ( w = 0; w < p->nSimWords; w++ )
if ( pInfo0[w] != pInfo1[w] )
return 0; return 0;
}
}
return 1;
} }
int Gia_ManBuiltInSimPack( Gia_Man_t * p, Vec_Int_t * vPat )
{
int i, k, iLit;
assert( Vec_IntSize(vPat) > 0 );
//printf( "%d ", Vec_IntSize(vPat) );
for ( i = 0; i < p->iPatsPi; i++ )
{
Vec_IntForEachEntry( vPat, iLit, k )
if ( Abc_TtGetBit(Gia_ManBuiltInDataPi(p, Abc_Lit2Var(iLit)), i) &&
Abc_TtGetBit(Gia_ManBuiltInData(p, 1+Abc_Lit2Var(iLit)), i) == Abc_LitIsCompl(iLit) )
break;
if ( k == Vec_IntSize(vPat) )
return i; // success
}
return -1; // failure
}
// adds PI pattern to storage; the pattern comes in terms of CiIds
int Gia_ManBuiltInSimAddPat( Gia_Man_t * p, Vec_Int_t * vPat )
{
int Period = 0xF;
int fOverflow = p->iPatsPi == 64 * p->nSimWords && p->nSimWords == p->nSimWordsMax;
int k, iLit, iPat = Gia_ManBuiltInSimPack( p, vPat );
if ( iPat == -1 )
{
if ( fOverflow )
{
if ( (p->iPastPiMax & Period) == 0 )
Gia_ManBuiltInSimResimulate( p );
iPat = p->iPastPiMax;
//if ( p->iPastPiMax == 64 * p->nSimWordsMax - 1 )
// printf( "Completed the cycle.\n" );
p->iPastPiMax = p->iPastPiMax == 64 * p->nSimWordsMax - 1 ? 0 : p->iPastPiMax + 1;
}
else
{
if ( p->iPatsPi && (p->iPatsPi & Period) == 0 )
Gia_ManBuiltInSimResimulate( p );
if ( p->iPatsPi == 64 * p->nSimWords )
{
Vec_Wrd_t * vTemp = Vec_WrdAlloc( 2 * Vec_WrdSize(p->vSims) );
word Data; int w, Count = 0, iObj = 0;
Vec_WrdForEachEntry( p->vSims, Data, w )
{
Vec_WrdPush( vTemp, Data );
if ( ++Count == p->nSimWords )
{
Gia_Obj_t * pObj = Gia_ManObj(p, iObj++);
if ( Gia_ObjIsCi(pObj) )
Vec_WrdPush( vTemp, Gia_ManRandomW(0) ); // Vec_WrdPush( vTemp, 0 );
else if ( Gia_ObjIsAnd(pObj) )
Vec_WrdPush( vTemp, pObj->fPhase ? ~(word)0 : 0 );
else
Vec_WrdPush( vTemp, 0 );
Count = 0;
}
}
assert( iObj == Gia_ManObjNum(p) );
Vec_WrdFree( p->vSims );
p->vSims = vTemp;
vTemp = Vec_WrdAlloc( 2 * Vec_WrdSize(p->vSimsPi) );
Count = 0;
Vec_WrdForEachEntry( p->vSimsPi, Data, w )
{
Vec_WrdPush( vTemp, Data );
if ( ++Count == p->nSimWords )
{
Vec_WrdPush( vTemp, 0 );
Count = 0;
}
}
Vec_WrdFree( p->vSimsPi );
p->vSimsPi = vTemp;
// update the word count
p->nSimWords++;
assert( Vec_WrdSize(p->vSims) == p->nSimWords * Gia_ManObjNum(p) );
assert( Vec_WrdSize(p->vSimsPi) == p->nSimWords * Gia_ManCiNum(p) );
//printf( "Resizing to %d words.\n", p->nSimWords );
}
iPat = p->iPatsPi++;
}
}
assert( iPat >= 0 && iPat < p->iPatsPi );
// add literals
if ( fOverflow )
{
int iVar;
Vec_IntForEachEntry( &p->vSuppVars, iVar, k )
if ( Abc_TtGetBit(Gia_ManBuiltInDataPi(p, iVar), iPat) )
Abc_TtXorBit(Gia_ManBuiltInDataPi(p, iVar), iPat);
Vec_IntForEachEntry( vPat, iLit, k )
{
if ( Abc_TtGetBit(Gia_ManBuiltInData(p, 1+Abc_Lit2Var(iLit)), iPat) == Abc_LitIsCompl(iLit) )
Abc_TtXorBit(Gia_ManBuiltInData(p, 1+Abc_Lit2Var(iLit)), iPat);
Abc_TtXorBit(Gia_ManBuiltInDataPi(p, Abc_Lit2Var(iLit)), iPat);
}
}
else
{
Vec_IntForEachEntry( vPat, iLit, k )
{
if ( Abc_TtGetBit(Gia_ManBuiltInDataPi(p, Abc_Lit2Var(iLit)), iPat) )
assert( Abc_TtGetBit(Gia_ManBuiltInData(p, 1+Abc_Lit2Var(iLit)), iPat) != Abc_LitIsCompl(iLit) );
else
{
if ( Abc_TtGetBit(Gia_ManBuiltInData(p, 1+Abc_Lit2Var(iLit)), iPat) == Abc_LitIsCompl(iLit) )
Abc_TtXorBit(Gia_ManBuiltInData(p, 1+Abc_Lit2Var(iLit)), iPat);
Abc_TtXorBit(Gia_ManBuiltInDataPi(p, Abc_Lit2Var(iLit)), iPat);
}
}
}
return 1;
}
/**Function************************************************************* /**Function*************************************************************
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment