mirror of https://github.com/YosysHQ/abc.git
194 lines
5.7 KiB
C
194 lines
5.7 KiB
C
/**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"
|
|
|
|
// to compile on Linux, add -lpthread to LIBS in Makefile
|
|
|
|
// uncomment this line to enable pthreads
|
|
#define ABC_USE_PTHREADS
|
|
|
|
#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 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, NULL );
|
|
// RetValue = Pdr_ManSolve_test( pAig, pPars, NULL );
|
|
// 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 fVerbose )
|
|
{
|
|
Abs_ThData_t * pThData;
|
|
Gia_Man_t * pAbs;
|
|
Aig_Man_t * pAig;
|
|
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 );
|
|
// 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
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
ABC_NAMESPACE_IMPL_END
|
|
|