blob: f04a20d1c677f4e18cd53bb52ec22a0ddf0a3164 [file] [log] [blame]
/**CFile****************************************************************
FileName [absPth.c]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [Abstraction package.]
Synopsis [Interface to pthreads.]
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [$Id: absPth.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
***********************************************************************/
#include "abs.h"
#include "proof/pdr/pdr.h"
#include "proof/ssw/ssw.h"
#ifdef ABC_USE_PTHREADS
#ifdef _WIN32
#include "../lib/pthread.h"
#else
#include <pthread.h>
#include <unistd.h>
#endif
#endif
ABC_NAMESPACE_IMPL_START
////////////////////////////////////////////////////////////////////////
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
#ifndef ABC_USE_PTHREADS
void Gia_GlaProveAbsracted( Gia_Man_t * p, int fSimpProver, int fVerbose ) {}
void Gia_GlaProveCancel( int fVerbose ) {}
int Gia_GlaProveCheck( int fVerbose ) { return 0; }
#else // pthreads are used
// information given to the thread
typedef struct Abs_ThData_t_
{
Aig_Man_t * pAig;
int fVerbose;
int RunId;
} Abs_ThData_t;
// mutext to control access to shared variables
pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
static volatile int g_nRunIds = 0; // the number of the last prover instance
static volatile int g_fAbstractionProved = 0; // set to 1 when prover successed to prove
// call back procedure for PDR
int Abs_CallBackToStop( int RunId ) { assert( RunId <= g_nRunIds ); return RunId < g_nRunIds; }
// test procedure to replace PDR
int Pdr_ManSolve_test( Aig_Man_t * pAig, Pdr_Par_t * pPars, Abc_Cex_t ** ppCex )
{
char * p = ABC_ALLOC( char, 111 );
while ( 1 )
{
if ( pPars->pFuncStop && pPars->pFuncStop(pPars->RunId) )
break;
}
ABC_FREE( p );
return -1;
}
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis [Create one thread]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void * Abs_ProverThread( void * pArg )
{
Abs_ThData_t * pThData = (Abs_ThData_t *)pArg;
Pdr_Par_t Pars, * pPars = &Pars;
int RetValue, status;
// call PDR
Pdr_ManSetDefaultParams( pPars );
pPars->fSilent = 1;
pPars->RunId = pThData->RunId;
pPars->pFuncStop = Abs_CallBackToStop;
RetValue = Pdr_ManSolve( pThData->pAig, pPars );
// update the result
if ( RetValue == 1 )
{
status = pthread_mutex_lock(&g_mutex); assert( status == 0 );
g_fAbstractionProved = 1;
status = pthread_mutex_unlock(&g_mutex); assert( status == 0 );
}
// quit this thread
if ( pThData->fVerbose )
{
if ( RetValue == 1 )
Abc_Print( 1, "Proved abstraction %d.\n", pThData->RunId );
else if ( RetValue == 0 )
Abc_Print( 1, "Disproved abstraction %d.\n", pThData->RunId );
else if ( RetValue == -1 )
Abc_Print( 1, "Cancelled abstraction %d.\n", pThData->RunId );
else assert( 0 );
}
// free memory
Aig_ManStop( pThData->pAig );
ABC_FREE( pThData );
// quit this thread
pthread_exit( NULL );
assert(0);
return NULL;
}
void Gia_GlaProveAbsracted( Gia_Man_t * pGia, int fSimpProver, int fVerbose )
{
extern Aig_Man_t * Dar_ManRwsat( Aig_Man_t * pAig, int fBalance, int fVerbose );
Abs_ThData_t * pThData;
Ssw_Pars_t Pars, * pPars = &Pars;
Aig_Man_t * pAig, * pTemp;
Gia_Man_t * pAbs;
pthread_t ProverThread;
int status;
// disable verbosity
// fVerbose = 0;
// create abstraction
assert( pGia->vGateClasses != NULL );
pAbs = Gia_ManDupAbsGates( pGia, pGia->vGateClasses );
Gia_ManCleanValue( pGia );
pAig = Gia_ManToAigSimple( pAbs );
Gia_ManStop( pAbs );
// simplify abstraction
if ( fSimpProver )
{
Ssw_ManSetDefaultParams( pPars );
pPars->nFramesK = 4;
pAig = Ssw_SignalCorrespondence( pTemp = pAig, pPars );
//printf( "\n" );
//Aig_ManPrintStats( pTemp );
//Aig_ManPrintStats( pAig );
Aig_ManStop( pTemp );
}
// synthesize abstraction
// pAig = Dar_ManRwsat( pTemp = pAig, 0, 0 );
// Aig_ManStop( pTemp );
// reset the proof
status = pthread_mutex_lock(&g_mutex); assert( status == 0 );
g_fAbstractionProved = 0;
status = pthread_mutex_unlock(&g_mutex); assert( status == 0 );
// collect thread data
pThData = ABC_CALLOC( Abs_ThData_t, 1 );
pThData->pAig = pAig;
pThData->fVerbose = fVerbose;
status = pthread_mutex_lock(&g_mutex); assert( status == 0 );
pThData->RunId = ++g_nRunIds;
status = pthread_mutex_unlock(&g_mutex); assert( status == 0 );
// create thread
if ( fVerbose ) Abc_Print( 1, "\nTrying to prove abstraction %d.\n", pThData->RunId );
status = pthread_create( &ProverThread, NULL, Abs_ProverThread, pThData );
assert( status == 0 );
}
void Gia_GlaProveCancel( int fVerbose )
{
int status;
status = pthread_mutex_lock(&g_mutex); assert( status == 0 );
g_nRunIds++;
status = pthread_mutex_unlock(&g_mutex); assert( status == 0 );
}
int Gia_GlaProveCheck( int fVerbose )
{
int status;
if ( g_fAbstractionProved == 0 )
return 0;
status = pthread_mutex_lock(&g_mutex); assert( status == 0 );
g_fAbstractionProved = 0;
status = pthread_mutex_unlock(&g_mutex); assert( status == 0 );
return 1;
}
#endif // pthreads are used
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_IMPL_END