ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
bmcMulti.c File Reference
#include "bmc.h"
#include "proof/ssw/ssw.h"
#include "misc/extra/extra.h"
#include "aig/gia/giaAig.h"
#include "aig/ioa/ioa.h"
Include dependency graph for bmcMulti.c:

Go to the source code of this file.

Functions

ABC_NAMESPACE_IMPL_START Vec_Int_tGia_ManProcessOutputs (Vec_Ptr_t *vCexesIn, Vec_Ptr_t *vCexesOut, Vec_Int_t *vOutMap)
 DECLARATIONS ///.
 
int Gia_ManCountConst0PosGia (Gia_Man_t *p)
 
int Gia_ManCountConst0Pos (Aig_Man_t *p)
 
void Gia_ManMultiReport (Aig_Man_t *p, char *pStr, int nTotalPo, int nTotalSize, abctime clkStart)
 
Aig_Man_tGia_ManMultiProveSyn (Aig_Man_t *p, int fVerbose, int fVeryVerbose)
 
Vec_Ptr_tGia_ManMultiProveAig (Aig_Man_t *p, Bmc_MulPar_t *pPars)
 
int Gia_ManMultiProve (Gia_Man_t *p, Bmc_MulPar_t *pPars)
 

Function Documentation

◆ Gia_ManCountConst0Pos()

int Gia_ManCountConst0Pos ( Aig_Man_t * p)

Definition at line 95 of file bmcMulti.c.

96{
97 Aig_Obj_t * pObj;
98 int i, Counter = 0;
99 Saig_ManForEachPo( p, pObj, i )
100 Counter += (Aig_ObjChild0(pObj) == Aig_ManConst0(p));
101 return Counter;
102}
struct Aig_Obj_t_ Aig_Obj_t
Definition aig.h:51
Cube * p
Definition exorList.c:222
#define Saig_ManForEachPo(p, pObj, i)
Definition saig.h:93
Here is the caller graph for this function:

◆ Gia_ManCountConst0PosGia()

int Gia_ManCountConst0PosGia ( Gia_Man_t * p)

Function*************************************************************

Synopsis [Counts the number of constant 0 POs.]

Description []

SideEffects []

SeeAlso []

Definition at line 87 of file bmcMulti.c.

88{
89 Gia_Obj_t * pObj;
90 int i, Counter = 0;
91 Gia_ManForEachPo( p, pObj, i )
92 Counter += (Gia_ObjFaninLit0p(p, pObj) == 0);
93 return Counter;
94}
#define Gia_ManForEachPo(p, pObj, i)
Definition gia.h:1250
struct Gia_Obj_t_ Gia_Obj_t
Definition gia.h:76

◆ Gia_ManMultiProve()

int Gia_ManMultiProve ( Gia_Man_t * p,
Bmc_MulPar_t * pPars )

Definition at line 279 of file bmcMulti.c.

280{
281 Aig_Man_t * pAig;
282 if ( p->vSeqModelVec )
283 Vec_PtrFreeFree( p->vSeqModelVec ), p->vSeqModelVec = NULL;
284 pAig = Gia_ManToAig( p, 0 );
285 p->vSeqModelVec = Gia_ManMultiProveAig( pAig, pPars ); // deletes pAig
286 assert( Vec_PtrSize(p->vSeqModelVec) == Gia_ManPoNum(p) );
287 return Vec_PtrCountZero(p->vSeqModelVec) == Vec_PtrSize(p->vSeqModelVec) ? -1 : 0;
288}
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
Definition aig.h:50
Vec_Ptr_t * Gia_ManMultiProveAig(Aig_Man_t *p, Bmc_MulPar_t *pPars)
Definition bmcMulti.c:161
Aig_Man_t * Gia_ManToAig(Gia_Man_t *p, int fChoices)
Definition giaAig.c:318
#define assert(ex)
Definition util_old.h:213
Here is the call graph for this function:

◆ Gia_ManMultiProveAig()

Vec_Ptr_t * Gia_ManMultiProveAig ( Aig_Man_t * p,
Bmc_MulPar_t * pPars )

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 161 of file bmcMulti.c.

162{
163 Ssw_RarPars_t ParsSim, * pParsSim = &ParsSim;
164 Saig_ParBmc_t ParsBmc, * pParsBmc = &ParsBmc;
165 Vec_Int_t * vOutMap, * vLeftOver;
166 Vec_Ptr_t * vCexes;
167 Aig_Man_t * pTemp;
168 abctime clkStart = Abc_Clock();
169 abctime nTimeToStop = pPars->TimeOutGlo ? Abc_Clock() + pPars->TimeOutGlo * CLOCKS_PER_SEC : 0;
170 int nTotalPo = Saig_ManPoNum(p);
171 int nTotalSize = Aig_ManObjNum(p);
172 int TimeOutLoc = pPars->TimeOutLoc;
173 int i, RetValue = -1;
174 if ( pPars->fVerbose )
175 printf( "MultiProve parameters: Global timeout = %d sec. Local timeout = %d sec. Time increase = %d %%.\n",
176 pPars->TimeOutGlo, pPars->TimeOutLoc, pPars->TimeOutInc );
177 if ( pPars->fVerbose )
178 printf( "Gap timeout = %d sec. Per-output timeout = %d msec. Use synthesis = %d. Dump final = %d. Verbose = %d.\n",
179 pPars->TimeOutGap, pPars->TimePerOut, pPars->fUseSyn, pPars->fDumpFinal, pPars->fVerbose );
180 // create output map
181 vOutMap = Vec_IntStartNatural( Saig_ManPoNum(p) ); // maps current outputs into their original IDs
182 vCexes = Vec_PtrStart( Saig_ManPoNum(p) ); // maps solved outputs into their CEXes (or markers)
183 for ( i = 0; i < 1000; i++ )
184 {
185 int nSolved = Vec_PtrCountZero(vCexes);
186 // perform SIM3
187 Ssw_RarSetDefaultParams( pParsSim );
188 pParsSim->fSolveAll = 1;
189 pParsSim->fNotVerbose = 1;
190 pParsSim->fSilent = !pPars->fVeryVerbose;
191 pParsSim->TimeOut = TimeOutLoc;
192 pParsSim->nRandSeed = (i * 17) % 500;
193 pParsSim->nWords = 5;
194 RetValue *= Ssw_RarSimulate( p, pParsSim );
195 // sort outputs
196 if ( p->vSeqModelVec )
197 {
198 vLeftOver = Gia_ManProcessOutputs( p->vSeqModelVec, vCexes, vOutMap );
199 if ( Vec_IntSize(vLeftOver) == 0 )
200 break;
201 // remove solved
202 p = Saig_ManDupCones( pTemp = p, Vec_IntArray(vLeftOver), Vec_IntSize(vLeftOver) );
203 Vec_IntFree( vLeftOver );
204 Aig_ManStop( pTemp );
205 }
206 if ( pPars->fVerbose )
207 Gia_ManMultiReport( p, "SIM", nTotalPo, nTotalSize, clkStart );
208
209 // check timeout
210 if ( nTimeToStop && Abc_Clock() + TimeOutLoc * CLOCKS_PER_SEC > nTimeToStop )
211 {
212 printf( "Global timeout (%d sec) is reached.\n", pPars->TimeOutGlo );
213 break;
214 }
215
216 // perform BMC
217 Saig_ParBmcSetDefaultParams( pParsBmc );
218 pParsBmc->fSolveAll = 1;
219 pParsBmc->fNotVerbose = 1;
220 pParsBmc->fSilent = !pPars->fVeryVerbose;
221 pParsBmc->nTimeOut = TimeOutLoc;
222 pParsBmc->nTimeOutOne = pPars->TimePerOut;
223 RetValue *= Saig_ManBmcScalable( p, pParsBmc );
224 if ( pPars->fVeryVerbose )
225 Abc_Print( 1, "Some outputs are SAT (%d out of %d) after %d frames.\n",
226 Saig_ManPoNum(p) - Vec_PtrCountZero(p->vSeqModelVec), Saig_ManPoNum(p), pParsBmc->iFrame );
227 // sort outputs
228 if ( p->vSeqModelVec )
229 {
230 vLeftOver = Gia_ManProcessOutputs( p->vSeqModelVec, vCexes, vOutMap );
231 if ( Vec_IntSize(vLeftOver) == 0 )
232 break;
233 // remove solved
234 p = Saig_ManDupCones( pTemp = p, Vec_IntArray(vLeftOver), Vec_IntSize(vLeftOver) );
235 Vec_IntFree( vLeftOver );
236 Aig_ManStop( pTemp );
237 }
238 if ( pPars->fVerbose )
239 Gia_ManMultiReport( p, "BMC", nTotalPo, nTotalSize, clkStart );
240
241 // check timeout
242 if ( nTimeToStop && Abc_Clock() + TimeOutLoc * CLOCKS_PER_SEC > nTimeToStop )
243 {
244 printf( "Global timeout (%d sec) is reached.\n", pPars->TimeOutGlo );
245 break;
246 }
247
248 // check gap timeout
249 if ( pPars->TimeOutGap && pPars->TimeOutGap <= TimeOutLoc && nSolved == Vec_PtrCountZero(vCexes) )
250 {
251 printf( "Gap timeout (%d sec) is reached.\n", pPars->TimeOutGap );
252 break;
253 }
254
255 // synthesize
256 if ( pPars->fUseSyn )
257 {
258 p = Gia_ManMultiProveSyn( pTemp = p, pPars->fVerbose, pPars->fVeryVerbose );
259 Aig_ManStop( pTemp );
260 if ( pPars->fVerbose )
261 Gia_ManMultiReport( p, "SYN", nTotalPo, nTotalSize, clkStart );
262 }
263
264 // increase timeout
265 TimeOutLoc += TimeOutLoc * pPars->TimeOutInc / 100;
266 }
267 Vec_IntFree( vOutMap );
268 if ( pPars->fVerbose )
269 printf( "The number of POs proved UNSAT by synthesis = %d.\n", Gia_ManCountConst0Pos(p) );
270 if ( pPars->fDumpFinal )
271 {
272 char * pFileName = Extra_FileNameGenericAppend( p->pName, "_out.aig" );
273 Ioa_WriteAiger( p, pFileName, 0, 0 );
274 printf( "Final AIG was dumped into file \"%s\".\n", pFileName );
275 }
276 Aig_ManStop( p );
277 return vCexes;
278}
ABC_INT64_T abctime
Definition abc_global.h:332
void Aig_ManStop(Aig_Man_t *p)
Definition aigMan.c:187
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
int Gia_ManCountConst0Pos(Aig_Man_t *p)
Definition bmcMulti.c:95
Aig_Man_t * Gia_ManMultiProveSyn(Aig_Man_t *p, int fVerbose, int fVeryVerbose)
Definition bmcMulti.c:138
ABC_NAMESPACE_IMPL_START Vec_Int_t * Gia_ManProcessOutputs(Vec_Ptr_t *vCexesIn, Vec_Ptr_t *vCexesOut, Vec_Int_t *vOutMap)
DECLARATIONS ///.
Definition bmcMulti.c:50
void Gia_ManMultiReport(Aig_Man_t *p, char *pStr, int nTotalPo, int nTotalSize, abctime clkStart)
Definition bmcMulti.c:115
void Saig_ParBmcSetDefaultParams(Saig_ParBmc_t *p)
Definition bmcBmc3.c:1334
int Saig_ManBmcScalable(Aig_Man_t *pAig, Saig_ParBmc_t *pPars)
Definition bmcBmc3.c:1461
struct Saig_ParBmc_t_ Saig_ParBmc_t
Definition bmc.h:105
char * Extra_FileNameGenericAppend(char *pBase, char *pSuffix)
void Ioa_WriteAiger(Aig_Man_t *pMan, char *pFileName, int fWriteSymbols, int fCompact)
Aig_Man_t * Saig_ManDupCones(Aig_Man_t *pAig, int *pPos, int nPos)
Definition saigDup.c:545
void Ssw_RarSetDefaultParams(Ssw_RarPars_t *p)
FUNCTION DEFINITIONS ///.
Definition sswRarity.c:102
struct Ssw_RarPars_t_ Ssw_RarPars_t
Definition ssw.h:94
int Ssw_RarSimulate(Aig_Man_t *pAig, Ssw_RarPars_t *pPars)
Definition sswRarity.c:973
int fVeryVerbose
Definition bmc.h:191
int TimeOutGlo
Definition bmc.h:183
int fDumpFinal
Definition bmc.h:189
int fUseSyn
Definition bmc.h:188
int TimeOutLoc
Definition bmc.h:184
int TimeOutGap
Definition bmc.h:186
int fVerbose
Definition bmc.h:190
int TimePerOut
Definition bmc.h:187
int TimeOutInc
Definition bmc.h:185
int nTimeOut
Definition bmc.h:113
int nTimeOutOne
Definition bmc.h:115
int fSolveAll
Definition bmc.h:117
int fNotVerbose
Definition bmc.h:130
int fSilent
Definition bmc.h:132
int iFrame
Definition bmc.h:133
int nRandSeed
Definition ssw.h:102
int fSolveAll
Definition ssw.h:105
int TimeOut
Definition ssw.h:103
int fNotVerbose
Definition ssw.h:108
int fSilent
Definition ssw.h:109
int nWords
Definition ssw.h:98
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
Definition vecPtr.h:42
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManMultiProveSyn()

Aig_Man_t * Gia_ManMultiProveSyn ( Aig_Man_t * p,
int fVerbose,
int fVeryVerbose )

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 138 of file bmcMulti.c.

139{
140 Aig_Man_t * pAig;
141 Gia_Man_t * pGia, * pTemp;
142 pGia = Gia_ManFromAig( p );
143 pGia = Gia_ManAigSyn2( pTemp = pGia, 1, 0, 0, 0, 0, 0, 0 );
144 Gia_ManStop( pTemp );
145 pAig = Gia_ManToAig( pGia, 0 );
146 Gia_ManStop( pGia );
147 return pAig;
148}
Gia_Man_t * Gia_ManFromAig(Aig_Man_t *p)
INCLUDES ///.
Definition giaAig.c:76
void Gia_ManStop(Gia_Man_t *p)
Definition giaMan.c:82
struct Gia_Man_t_ Gia_Man_t
Definition gia.h:96
Gia_Man_t * Gia_ManAigSyn2(Gia_Man_t *p, int fOldAlgo, int fCoarsen, int fCutMin, int nRelaxRatio, int fDelayMin, int fVerbose, int fVeryVerbose)
Definition giaScript.c:69
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManMultiReport()

void Gia_ManMultiReport ( Aig_Man_t * p,
char * pStr,
int nTotalPo,
int nTotalSize,
abctime clkStart )

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 115 of file bmcMulti.c.

116{
117 printf( "%3s : ", pStr );
118 printf( "PI =%6d ", Saig_ManPiNum(p) );
119 printf( "PO =%6d ", Saig_ManPoNum(p) );
120 printf( "FF =%7d ", Saig_ManRegNum(p) );
121 printf( "ND =%7d ", Aig_ManNodeNum(p) );
122 printf( "Solved =%7d (%5.1f %%) ", nTotalPo-Saig_ManPoNum(p), 100.0*(nTotalPo-Saig_ManPoNum(p))/Abc_MaxInt(1, nTotalPo) );
123 printf( "Size =%7d (%5.1f %%) ", Aig_ManObjNum(p), 100.0*Aig_ManObjNum(p)/Abc_MaxInt(1, nTotalSize) );
124 Abc_PrintTime( 1, "Time", Abc_Clock() - clkStart );
125}
Here is the caller graph for this function:

◆ Gia_ManProcessOutputs()

ABC_NAMESPACE_IMPL_START Vec_Int_t * Gia_ManProcessOutputs ( Vec_Ptr_t * vCexesIn,
Vec_Ptr_t * vCexesOut,
Vec_Int_t * vOutMap )

DECLARATIONS ///.

CFile****************************************************************

FileName [bmcMulti.c]

SystemName [ABC: Logic synthesis and verification system.]

PackageName [SAT-based bounded model checking.]

Synopsis [Proving multi-output properties.]

Author [Alan Mishchenko]

Affiliation [UC Berkeley]

Date [Ver. 1.0. Started - June 20, 2005.]

Revision [

Id
bmcMulti.c,v 1.00 2005/06/20 00:00:00 alanmi Exp

] FUNCTION DEFINITIONS /// Function*************************************************************

Synopsis [Divides outputs into solved and unsolved.]

Description [Return array of unsolved outputs to extract into a new AIG. Updates the resulting CEXes (vCexesOut) and current output map (vOutMap).]

SideEffects []

SeeAlso []

Definition at line 50 of file bmcMulti.c.

51{
52 Abc_Cex_t * pCex;
53 Vec_Int_t * vLeftOver;
54 int i, iOut;
55 assert( Vec_PtrSize(vCexesIn) == Vec_IntSize(vOutMap) );
56 vLeftOver = Vec_IntAlloc( Vec_PtrSize(vCexesIn) );
57 Vec_IntForEachEntry( vOutMap, iOut, i )
58 {
59 assert( Vec_PtrEntry(vCexesOut, iOut) == NULL );
60 pCex = (Abc_Cex_t *)Vec_PtrEntry( vCexesIn, i );
61 if ( pCex ) // found a CEX for output iOut
62 {
63 Vec_PtrWriteEntry( vCexesIn, i, NULL );
64 Vec_PtrWriteEntry( vCexesOut, iOut, pCex );
65 }
66 else // still unsolved
67 {
68 Vec_IntWriteEntry( vOutMap, Vec_IntSize(vLeftOver), iOut );
69 Vec_IntPush( vLeftOver, i );
70 }
71 }
72 Vec_IntShrink( vOutMap, Vec_IntSize(vLeftOver) );
73 return vLeftOver;
74}
typedefABC_NAMESPACE_HEADER_START struct Abc_Cex_t_ Abc_Cex_t
INCLUDES ///.
Definition utilCex.h:39
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
Here is the caller graph for this function: