1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
|
/**CFile****************************************************************
FileName [giaAbsPth.c]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [Scalable AIG package.]
Synopsis [Interface to pthreads.]
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [$Id: giaAbsPth.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
***********************************************************************/
#include "aig/ioa/ioa.h"
#include "proof/pdr/pdr.h"
// comment this out to disable 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_Ga2ProveAbsracted( char * pFileName, int fVerbose ) {}
void Gia_Ga2ProveCancel( int fVerbose ) {}
int Gia_Ga2ProveCheck( int fVerbose ) { return 0; }
#else // pthreads are used
// information given to the thread
typedef struct Abs_ThData_t_
{
char * pFileName;
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;
Aig_Man_t * pAig, * pTemp;
int RetValue, status;
pAig = Ioa_ReadAiger( pThData->pFileName, 0 );
if ( pAig == NULL )
Abc_Print( 1, "\nCannot open file \"%s\".\n", pThData->pFileName );
else
{
// synthesize abstraction
pAig = Aig_ManScl( pTemp = pAig, 1, 1, 0, -1, -1, 0, 0 );
Aig_ManStop( pTemp );
// call PDR
Pdr_ManSetDefaultParams( pPars );
pPars->fSilent = 1;
pPars->RunId = pThData->RunId;
pPars->pFuncStop = Abs_CallBackToStop;
RetValue = Pdr_ManSolve( 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 );
}
// free memory
Aig_ManStop( pAig );
// quit this thread
if ( pThData->fVerbose )
{
if ( RetValue == 1 )
Abc_Print( 1, "\nProved abstraction %d.\n", pThData->RunId );
else if ( RetValue == 0 )
Abc_Print( 1, "\nDisproved abstraction %d.\n", pThData->RunId );
else if ( RetValue == -1 )
Abc_Print( 1, "\nCancelled abstraction %d.\n", pThData->RunId );
else assert( 0 );
}
}
ABC_FREE( pThData->pFileName );
ABC_FREE( pThData );
// quit this thread
pthread_exit( NULL );
assert(0);
return NULL;
}
void Gia_Ga2ProveAbsracted( char * pFileName, int fVerbose )
{
Abs_ThData_t * pThData;
pthread_t ProverThread;
int status;
assert( pFileName != NULL );
// disable verbosity
fVerbose = 0;
// 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->pFileName = Abc_UtilStrsav( (void *)pFileName );
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_Ga2ProveCancel( 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_Ga2ProveCheck( 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
|