Commit 066e8d1b by Alan Mishchenko

Experiments with SAT-based simulation.

parent 67e820a5
...@@ -150,6 +150,7 @@ struct Gia_Man_t_ ...@@ -150,6 +150,7 @@ struct Gia_Man_t_
Vec_Ptr_t * vSeqModelVec; // sequential counter-examples Vec_Ptr_t * vSeqModelVec; // sequential counter-examples
Vec_Int_t vCopies; // intermediate copies Vec_Int_t vCopies; // intermediate copies
Vec_Int_t vCopies2; // intermediate copies Vec_Int_t vCopies2; // intermediate copies
Vec_Int_t * vVar2Obj; // mapping of variables into objects
Vec_Int_t * vTruths; // used for truth table computation Vec_Int_t * vTruths; // used for truth table computation
Vec_Int_t * vFlopClasses; // classes of flops for retiming/merging/etc Vec_Int_t * vFlopClasses; // classes of flops for retiming/merging/etc
Vec_Int_t * vGateClasses; // classes of gates for abstraction Vec_Int_t * vGateClasses; // classes of gates for abstraction
...@@ -209,6 +210,11 @@ struct Gia_Man_t_ ...@@ -209,6 +210,11 @@ struct Gia_Man_t_
Vec_Wrd_t * vSimsPi; Vec_Wrd_t * vSimsPi;
Vec_Int_t * vClassOld; Vec_Int_t * vClassOld;
Vec_Int_t * vClassNew; Vec_Int_t * vClassNew;
// incremental simulation
int fIncrSim;
int iNextPi;
int iTimeStamp;
Vec_Int_t * vTimeStamps;
// truth table computation for small functions // truth table computation for small functions
int nTtVars; // truth table variables int nTtVars; // truth table variables
int nTtWords; // truth table words int nTtWords; // truth table words
...@@ -1518,6 +1524,10 @@ extern int Gia_ManBuiltInSimCheckEqual( Gia_Man_t * p, int iLit0 ...@@ -1518,6 +1524,10 @@ extern int Gia_ManBuiltInSimCheckEqual( Gia_Man_t * p, int iLit0
extern void Gia_ManBuiltInSimResimulateCone( 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 void Gia_ManBuiltInSimResimulate( Gia_Man_t * p );
extern int Gia_ManBuiltInSimAddPat( Gia_Man_t * p, Vec_Int_t * vPat ); extern int Gia_ManBuiltInSimAddPat( Gia_Man_t * p, Vec_Int_t * vPat );
extern void Gia_ManIncrSimStart( Gia_Man_t * p, int nWords, int nObjs );
extern void Gia_ManIncrSimSet( Gia_Man_t * p, Vec_Int_t * vObjLits );
extern int Gia_ManIncrSimCheckOver( Gia_Man_t * p, int iLit0, int iLit1 );
extern int Gia_ManIncrSimCheckEqual( Gia_Man_t * p, int iLit0, int iLit1 );
/*=== 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 );
......
...@@ -92,6 +92,7 @@ void Gia_ManStop( Gia_Man_t * p ) ...@@ -92,6 +92,7 @@ void Gia_ManStop( Gia_Man_t * p )
Vec_IntFreeP( &p->vClassOld ); Vec_IntFreeP( &p->vClassOld );
Vec_WrdFreeP( &p->vSims ); Vec_WrdFreeP( &p->vSims );
Vec_WrdFreeP( &p->vSimsPi ); Vec_WrdFreeP( &p->vSimsPi );
Vec_IntFreeP( &p->vTimeStamps );
Vec_FltFreeP( &p->vTiming ); Vec_FltFreeP( &p->vTiming );
Vec_VecFreeP( &p->vClockDoms ); Vec_VecFreeP( &p->vClockDoms );
Vec_IntFreeP( &p->vCofVars ); Vec_IntFreeP( &p->vCofVars );
...@@ -118,6 +119,7 @@ void Gia_ManStop( Gia_Man_t * p ) ...@@ -118,6 +119,7 @@ void Gia_ManStop( Gia_Man_t * p )
Vec_IntFreeP( &p->vTruths ); Vec_IntFreeP( &p->vTruths );
Vec_IntErase( &p->vCopies ); Vec_IntErase( &p->vCopies );
Vec_IntErase( &p->vCopies2 ); Vec_IntErase( &p->vCopies2 );
Vec_IntFreeP( &p->vVar2Obj );
Vec_IntErase( &p->vCopiesTwo ); Vec_IntErase( &p->vCopiesTwo );
Vec_IntErase( &p->vSuppVars ); Vec_IntErase( &p->vSuppVars );
Vec_WrdFreeP( &p->vSuppWords ); Vec_WrdFreeP( &p->vSuppWords );
......
...@@ -800,7 +800,7 @@ void Gia_ManBuiltInSimPerformInt( Gia_Man_t * p, int iObj ) ...@@ -800,7 +800,7 @@ void Gia_ManBuiltInSimPerformInt( Gia_Man_t * p, int iObj )
word * pInfo = Gia_ManBuiltInData( p, iObj ); 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) ); word * pInfo1 = Gia_ManBuiltInData( p, Gia_ObjFaninId1(pObj, iObj) );
assert( p->fBuiltInSim ); assert( p->fBuiltInSim || p->fIncrSim );
if ( Gia_ObjFaninC0(pObj) ) if ( Gia_ObjFaninC0(pObj) )
{ {
if ( Gia_ObjFaninC1(pObj) ) if ( Gia_ObjFaninC1(pObj) )
...@@ -860,7 +860,7 @@ int Gia_ManBuiltInSimCheckOver( Gia_Man_t * p, int iLit0, int iLit1 ) ...@@ -860,7 +860,7 @@ 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;
assert( p->fBuiltInSim ); assert( p->fBuiltInSim || p->fIncrSim );
// printf( "%d %d\n", Abc_LitIsCompl(iLit0), Abc_LitIsCompl(iLit1) ); // printf( "%d %d\n", Abc_LitIsCompl(iLit0), Abc_LitIsCompl(iLit1) );
// Extra_PrintBinary( stdout, pInfo0, 64*p->nSimWords ); printf( "\n" ); // Extra_PrintBinary( stdout, pInfo0, 64*p->nSimWords ); printf( "\n" );
...@@ -903,7 +903,7 @@ int Gia_ManBuiltInSimCheckEqual( Gia_Man_t * p, int iLit0, int iLit1 ) ...@@ -903,7 +903,7 @@ int Gia_ManBuiltInSimCheckEqual( 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;
assert( p->fBuiltInSim ); assert( p->fBuiltInSim || p->fIncrSim );
// printf( "%d %d\n", Abc_LitIsCompl(iLit0), Abc_LitIsCompl(iLit1) ); // printf( "%d %d\n", Abc_LitIsCompl(iLit0), Abc_LitIsCompl(iLit1) );
// Extra_PrintBinary( stdout, pInfo0, 64*p->nSimWords ); printf( "\n" ); // Extra_PrintBinary( stdout, pInfo0, 64*p->nSimWords ); printf( "\n" );
...@@ -1113,6 +1113,113 @@ int Gia_ManObjCheckOverlap( Gia_Man_t * p, int iLit0, int iLit1, Vec_Int_t * vOb ...@@ -1113,6 +1113,113 @@ int Gia_ManObjCheckOverlap( Gia_Man_t * p, int iLit0, int iLit1, Vec_Int_t * vOb
return Gia_ManObjCheckOverlap1( p, iLit1, iLit0, vObjs ); return Gia_ManObjCheckOverlap1( p, iLit1, iLit0, vObjs );
} }
/**Function*************************************************************
Synopsis [Bit-parallel simulation during AIG construction.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void Gia_ManIncrSimUpdate( Gia_Man_t * p )
{
int i, k;
// extend timestamp info
assert( Vec_IntSize(p->vTimeStamps) <= Gia_ManObjNum(p) );
Vec_IntFillExtra( p->vTimeStamps, Gia_ManObjNum(p), 0 );
// extend simulation info
assert( Vec_WrdSize(p->vSims) <= Gia_ManObjNum(p) * p->nSimWords );
Vec_WrdFillExtra( p->vSims, Gia_ManObjNum(p) * p->nSimWords, 0 );
// extend PI info
assert( p->iNextPi <= Gia_ManCiNum(p) );
for ( i = p->iNextPi; i < Gia_ManCiNum(p); i++ )
{
word * pSims = Gia_ManBuiltInData( p, Gia_ManCiIdToId(p, i) );
for ( k = 0; k < p->nSimWords; k++ )
pSims[k] = Gia_ManRandomW(0);
}
p->iNextPi = Gia_ManCiNum(p);
}
void Gia_ManIncrSimStart( Gia_Man_t * p, int nWords, int nObjs )
{
assert( !p->fIncrSim );
p->fIncrSim = 1;
p->iPatsPi = 0;
p->nSimWords = nWords;
// init time stamps
p->iTimeStamp = 1;
p->vTimeStamps = Vec_IntAlloc( p->nSimWords );
// init object sim info
p->iNextPi = 0;
p->vSims = Vec_WrdAlloc( p->nSimWords * nObjs );
Gia_ManRandomW( 1 );
}
void Gia_ManIncrSimStop( Gia_Man_t * p )
{
assert( p->fIncrSim );
p->fIncrSim = 0;
p->iPatsPi = 0;
p->nSimWords = 0;
p->iTimeStamp = 1;
Vec_IntFreeP( &p->vTimeStamps );
Vec_WrdFreeP( &p->vSims );
}
void Gia_ManIncrSimSet( Gia_Man_t * p, Vec_Int_t * vObjLits )
{
int i, iLit;
assert( Vec_IntSize(vObjLits) > 0 );
p->iTimeStamp++;
Vec_IntForEachEntry( vObjLits, iLit, i )
{
word * pSims = Gia_ManBuiltInData( p, Abc_Lit2Var(iLit) );
if ( Gia_ObjIsAnd(Gia_ManObj(p, Abc_Lit2Var(iLit))) )
continue;
//assert( Vec_IntEntry(p->vTimeStamps, Abc_Lit2Var(iLit)) == p->iTimeStamp-1 );
//Vec_IntWriteEntry(p->vTimeStamps, Abc_Lit2Var(iLit), p->iTimeStamp);
if ( Abc_TtGetBit(pSims, p->iPatsPi) == Abc_LitIsCompl(iLit) )
Abc_TtXorBit(pSims, p->iPatsPi);
}
p->iPatsPi = (p->iPatsPi == p->nSimWords * 64 - 1) ? 0 : p->iPatsPi + 1;
}
void Gia_ManIncrSimCone_rec( Gia_Man_t * p, int iObj )
{
Gia_Obj_t * pObj = Gia_ManObj( p, iObj );
if ( Gia_ObjIsCi(pObj) )
return;
if ( Vec_IntEntry(p->vTimeStamps, iObj) == p->iTimeStamp )
return;
assert( Vec_IntEntry(p->vTimeStamps, iObj) < p->iTimeStamp );
Vec_IntWriteEntry( p->vTimeStamps, iObj, p->iTimeStamp );
assert( Gia_ObjIsAnd(pObj) );
Gia_ManIncrSimCone_rec( p, Gia_ObjFaninId0(pObj, iObj) );
Gia_ManIncrSimCone_rec( p, Gia_ObjFaninId1(pObj, iObj) );
Gia_ManBuiltInSimPerformInt( p, iObj );
}
int Gia_ManIncrSimCheckOver( Gia_Man_t * p, int iLit0, int iLit1 )
{
assert( iLit0 > 1 && iLit1 > 1 );
Gia_ManIncrSimUpdate( p );
Gia_ManIncrSimCone_rec( p, Abc_Lit2Var(iLit0) );
Gia_ManIncrSimCone_rec( p, Abc_Lit2Var(iLit1) );
return Gia_ManBuiltInSimCheckOver( p, iLit0, iLit1 );
}
int Gia_ManIncrSimCheckEqual( Gia_Man_t * p, int iLit0, int iLit1 )
{
assert( iLit0 > 1 && iLit1 > 1 );
Gia_ManIncrSimUpdate( p );
Gia_ManIncrSimCone_rec( p, Abc_Lit2Var(iLit0) );
Gia_ManIncrSimCone_rec( p, Abc_Lit2Var(iLit1) );
return Gia_ManBuiltInSimCheckEqual( p, iLit0, iLit1 );
}
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
/// END OF FILE /// /// END OF FILE ///
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
......
...@@ -301,12 +301,19 @@ void Cec2_CollectSuper( Gia_Obj_t * pObj, int fUseMuxes, Vec_Ptr_t * vSuper ) ...@@ -301,12 +301,19 @@ void Cec2_CollectSuper( Gia_Obj_t * pObj, int fUseMuxes, Vec_Ptr_t * vSuper )
} }
void Cec2_ObjAddToFrontier( Gia_Man_t * p, Gia_Obj_t * pObj, Vec_Ptr_t * vFrontier, satoko_t * pSat ) void Cec2_ObjAddToFrontier( Gia_Man_t * p, Gia_Obj_t * pObj, Vec_Ptr_t * vFrontier, satoko_t * pSat )
{ {
int iVar;
assert( !Gia_IsComplement(pObj) ); assert( !Gia_IsComplement(pObj) );
assert( !Gia_ObjIsConst0(pObj) ); assert( !Gia_ObjIsConst0(pObj) );
if ( Cec2_ObjSatId(p, pObj) >= 0 ) if ( Cec2_ObjSatId(p, pObj) >= 0 )
return; return;
assert( Cec2_ObjSatId(p, pObj) == -1 ); assert( Cec2_ObjSatId(p, pObj) == -1 );
Cec2_ObjSetSatId( p, pObj, satoko_add_variable(pSat, 0) ); iVar = satoko_add_variable(pSat, 0);
if ( p->vVar2Obj )
{
assert( Vec_IntSize(p->vVar2Obj) == iVar );
Vec_IntPush( p->vVar2Obj, Gia_ObjId(p, pObj) );
}
Cec2_ObjSetSatId( p, pObj, iVar );
if ( Gia_ObjIsAnd(pObj) ) if ( Gia_ObjIsAnd(pObj) )
Vec_PtrPush( vFrontier, pObj ); Vec_PtrPush( vFrontier, pObj );
} }
...@@ -322,7 +329,15 @@ int Gia_ObjGetCnfVar( Gia_Man_t * pGia, int iObj, Vec_Ptr_t * vFrontier, Vec_Ptr ...@@ -322,7 +329,15 @@ int Gia_ObjGetCnfVar( Gia_Man_t * pGia, int iObj, Vec_Ptr_t * vFrontier, Vec_Ptr
return Cec2_ObjSatId(pGia,pObj); return Cec2_ObjSatId(pGia,pObj);
assert( iObj > 0 ); assert( iObj > 0 );
if ( Gia_ObjIsCi(pObj) ) if ( Gia_ObjIsCi(pObj) )
return Cec2_ObjSetSatId( pGia, pObj, satoko_add_variable(pSat, 0) ); {
int iVar = satoko_add_variable(pSat, 0);
if ( pGia->vVar2Obj )
{
assert( Vec_IntSize(pGia->vVar2Obj) == iVar );
Vec_IntPush( pGia->vVar2Obj, iObj );
}
return Cec2_ObjSetSatId( pGia, pObj, iVar );
}
assert( Gia_ObjIsAnd(pObj) ); assert( Gia_ObjIsAnd(pObj) );
// start the frontier // start the frontier
Vec_PtrClear( vFrontier ); Vec_PtrClear( vFrontier );
......
...@@ -281,7 +281,13 @@ int satoko_add_clause(solver_t *s, int *lits, int size) ...@@ -281,7 +281,13 @@ int satoko_add_clause(solver_t *s, int *lits, int size)
solver_enqueue(s, vec_uint_at(s->temp_lits, 0), UNDEF); solver_enqueue(s, vec_uint_at(s->temp_lits, 0), UNDEF);
return (s->status = (solver_propagate(s) == UNDEF)); return (s->status = (solver_propagate(s) == UNDEF));
} }
if ( 0 ) {
for ( i = 0; i < vec_uint_size(s->temp_lits); i++ ) {
int lit = vec_uint_at(s->temp_lits, i);
printf( "%s%d ", lit&1 ? "!":"", lit>>1 );
}
printf( "\n" );
}
cref = solver_clause_create(s, s->temp_lits, 0); cref = solver_clause_create(s, s->temp_lits, 0);
clause_watch(s, cref); clause_watch(s, cref);
return SATOKO_OK; return SATOKO_OK;
......
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