ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
bmcUnroll.c File Reference
#include "bmc.h"
Include dependency graph for bmcUnroll.c:

Go to the source code of this file.

Classes

struct  Unr_Obj_t_
 
struct  Unr_Man_t_
 

Macros

#define UNR_DIFF_NULL   0x7FFF
 DECLARATIONS ///.
 

Typedefs

typedef struct Unr_Obj_t_ Unr_Obj_t
 

Functions

void Unr_ManProfileRanks (Vec_Int_t *vRanks)
 
void Unr_ManSetup_rec (Unr_Man_t *p, int iObj, int iTent, Vec_Int_t *vRoots)
 
void Unr_ManSetup (Unr_Man_t *p, int fVerbose)
 
Unr_Man_tUnr_ManAlloc (Gia_Man_t *pGia)
 
void Unr_ManFree (Unr_Man_t *p)
 
Unr_Man_tUnr_ManUnrollStart (Gia_Man_t *pGia, int fVerbose)
 
Gia_Man_tUnr_ManUnrollFrame (Unr_Man_t *p, int f)
 
Gia_Man_tUnr_ManUnroll (Gia_Man_t *pGia, int nFrames)
 
Gia_Man_tUnr_ManUnrollSimple (Gia_Man_t *pGia, int nFrames)
 
void Unr_ManTest (Gia_Man_t *pGia, int nFrames)
 

Macro Definition Documentation

◆ UNR_DIFF_NULL

#define UNR_DIFF_NULL   0x7FFF

DECLARATIONS ///.

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

FileName [bmcUnroll.c]

SystemName [ABC: Logic synthesis and verification system.]

PackageName [SAT-based bounded model checking.]

Synopsis [Unrolling manager.]

Author [Alan Mishchenko]

Affiliation [UC Berkeley]

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

Revision [

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

]

Definition at line 29 of file bmcUnroll.c.

Typedef Documentation

◆ Unr_Obj_t

typedef struct Unr_Obj_t_ Unr_Obj_t

Definition at line 31 of file bmcUnroll.c.

Function Documentation

◆ Unr_ManAlloc()

Unr_Man_t * Unr_ManAlloc ( Gia_Man_t * pGia)

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

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 321 of file bmcUnroll.c.

322{
323 Unr_Man_t * p;
324 p = ABC_CALLOC( Unr_Man_t, 1 );
325 p->pGia = pGia;
326 p->nObjs = Gia_ManObjNum(pGia);
327 p->vOrder = Vec_IntAlloc( p->nObjs );
328 p->vOrderLim = Vec_IntAlloc( 100 );
329 p->vTents = Vec_IntStartFull( p->nObjs );
330 p->vRanks = Vec_IntStart( p->nObjs );
331 p->vObjLim = Vec_IntAlloc( 100 );
332 p->vCiMap = Vec_IntAlloc( Gia_ManCiNum(pGia) );
333 p->vCoMap = Vec_IntAlloc( Gia_ManCoNum(pGia) );
334 p->vPiLits = Vec_IntAlloc( 10000 );
335 p->pFrames = Gia_ManStart( 10000 );
336 p->pFrames->pName = Abc_UtilStrsav( pGia->pName );
337 Gia_ManHashStart( p->pFrames );
338 return p;
339}
#define ABC_CALLOC(type, num)
Definition abc_global.h:265
struct Unr_Man_t_ Unr_Man_t
Definition bmc.h:103
Cube * p
Definition exorList.c:222
void Gia_ManHashStart(Gia_Man_t *p)
Definition giaHash.c:125
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
Definition giaMan.c:57
char * pName
Definition gia.h:99
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Unr_ManFree()

void Unr_ManFree ( Unr_Man_t * p)

Definition at line 340 of file bmcUnroll.c.

341{
342 Gia_ManStop( p->pFrames );
343 // intermediate data
344 Vec_IntFreeP( &p->vOrder );
345 Vec_IntFreeP( &p->vOrderLim );
346 Vec_IntFreeP( &p->vTents );
347 Vec_IntFreeP( &p->vRanks );
348 // unrolling data
349 Vec_IntFreeP( &p->vObjLim );
350 Vec_IntFreeP( &p->vCiMap );
351 Vec_IntFreeP( &p->vCoMap );
352 Vec_IntFreeP( &p->vPiLits );
353 ABC_FREE( p->pObjs );
354 ABC_FREE( p );
355}
#define ABC_FREE(obj)
Definition abc_global.h:267
void Gia_ManStop(Gia_Man_t *p)
Definition giaMan.c:82
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Unr_ManProfileRanks()

void Unr_ManProfileRanks ( Vec_Int_t * vRanks)

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

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 132 of file bmcUnroll.c.

133{
134 int RankMax = Vec_IntFindMax( vRanks );
135 Vec_Int_t * vCounts = Vec_IntStart( RankMax+1 );
136 int i, Rank, Count, nExtras = 0;
137 Vec_IntForEachEntry( vRanks, Rank, i )
138 Vec_IntAddToEntry( vCounts, Rank, 1 );
139 Vec_IntForEachEntry( vCounts, Count, i )
140 {
141 if ( Count == 0 )
142 continue;
143 printf( "%2d : %8d (%6.2f %%)\n", i, Count, 100.0 * Count / Vec_IntSize(vRanks) );
144 nExtras += Count * i;
145 }
146 printf( "Extra space = %d (%6.2f %%) ", nExtras, 100.0 * nExtras / Vec_IntSize(vRanks) );
147 Vec_IntFree( vCounts );
148}
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
Here is the caller graph for this function:

◆ Unr_ManSetup()

void Unr_ManSetup ( Unr_Man_t * p,
int fVerbose )

Definition at line 186 of file bmcUnroll.c.

187{
188 Vec_Int_t * vRoots, * vRoots2, * vMap;
189 Unr_Obj_t * pUnrObj;
190 Gia_Obj_t * pObj;
191 int i, k, t, iObj, nInts, * pInts;
192 abctime clk = Abc_Clock();
193 // create zero rank
194 assert( Vec_IntSize(p->vOrder) == 0 );
195 Vec_IntPush( p->vOrder, 0 );
196 Vec_IntPush( p->vOrderLim, Vec_IntSize(p->vOrder) );
197 Vec_IntWriteEntry( p->vTents, 0, 0 );
198 Vec_IntWriteEntry( p->vRanks, 0, 0 );
199 // start from the POs
200 vRoots = Vec_IntAlloc( 100 );
201 vRoots2 = Vec_IntAlloc( 100 );
202 Gia_ManForEachPo( p->pGia, pObj, i )
203 Unr_ManSetup_rec( p, Gia_ObjId(p->pGia, pObj), 0, vRoots );
204 // collect tents
205 while ( Vec_IntSize(vRoots) > 0 )
206 {
207 Vec_IntPush( p->vOrderLim, Vec_IntSize(p->vOrder) );
208 Vec_IntClear( vRoots2 );
209 Vec_IntForEachEntry( vRoots, iObj, i )
210 Unr_ManSetup_rec( p, iObj, Vec_IntSize(p->vOrderLim)-1, vRoots2 );
211 ABC_SWAP( Vec_Int_t *, vRoots, vRoots2 );
212 }
213 Vec_IntPush( p->vOrderLim, Vec_IntSize(p->vOrder) );
214 Vec_IntFree( vRoots );
215 Vec_IntFree( vRoots2 );
216 // allocate memory
217 nInts = 0;
218 Vec_IntForEachEntry( p->vOrder, iObj, i )
219 nInts += Unr_ObjSizeInt( Vec_IntEntry(p->vRanks, iObj) + 1 );
220 p->pObjs = pInts = ABC_CALLOC( int, nInts );
221 p->pEnd = p->pObjs + nInts;
222 // create const0 node
223 pUnrObj = Unr_ManObj( p, pInts - p->pObjs );
224 pUnrObj->RankMax = Vec_IntEntry(p->vRanks, 0) + 1;
225 pUnrObj->uRDiff0 = pUnrObj->uRDiff1 = UNR_DIFF_NULL;
226 pUnrObj->Res[0] = 0; // const0
227 // map the objects
228 vMap = Vec_IntStartFull( p->nObjs );
229 Vec_IntWriteEntry( vMap, 0, pInts - p->pObjs );
230 pInts += Unr_ObjSize(pUnrObj);
231 // mark up the entries
232 assert( Vec_IntSize(p->vObjLim) == 0 );
233 for ( t = Vec_IntSize(p->vOrderLim) - 2; t >= 0; t-- )
234 {
235 int Beg = Vec_IntEntry(p->vOrderLim, t);
236 int End = Vec_IntEntry(p->vOrderLim, t+1);
237 Vec_IntPush( p->vObjLim, pInts - p->pObjs );
238 Vec_IntForEachEntryStartStop( p->vOrder, iObj, i, Beg, End )
239 {
240 pObj = Gia_ManObj( p->pGia, iObj );
241 pUnrObj = Unr_ManObj( p, pInts - p->pObjs );
242 pUnrObj->uRDiff0 = pUnrObj->uRDiff1 = UNR_DIFF_NULL;
243 if ( Gia_ObjIsAnd(pObj) || Gia_ObjIsCo(pObj) )
244 pUnrObj->uRDiff0 = Abc_MaxInt(0, Vec_IntEntry(p->vTents, iObj) - Vec_IntEntry(p->vTents, Gia_ObjFaninId0(pObj, iObj)) - 1);
245 if ( Gia_ObjIsAnd(pObj) )
246 pUnrObj->uRDiff1 = Abc_MaxInt(0, Vec_IntEntry(p->vTents, iObj) - Vec_IntEntry(p->vTents, Gia_ObjFaninId1(pObj, iObj)) - 1);
247 else if ( Gia_ObjIsRo(p->pGia, pObj) )
248 pUnrObj->uRDiff0 = 0;
249 pUnrObj->RankMax = Vec_IntEntry(p->vRanks, iObj) + 1;
250 pUnrObj->RankCur = UNR_DIFF_NULL;
251 pUnrObj->OrigId = iObj;
252 for ( k = 0; k < (int)pUnrObj->RankMax; k++ )
253 pUnrObj->Res[k] = -1;
254 assert( ((pInts - p->pObjs) & 1) == 0 ); // align for 64-bits
255 Vec_IntWriteEntry( vMap, iObj, pInts - p->pObjs );
256 pInts += Unr_ObjSize( pUnrObj );
257 }
258 }
259 assert( pInts - p->pObjs == nInts );
260 // label the objects
261 Gia_ManForEachObj( p->pGia, pObj, i )
262 {
263 if ( Vec_IntEntry(vMap, i) == -1 )
264 continue;
265 pUnrObj = Unr_ManObj( p, Vec_IntEntry(vMap, i) );
266 if ( Gia_ObjIsAnd(pObj) || Gia_ObjIsCo(pObj) )
267 {
268 pUnrObj->hFan0 = Vec_IntEntry( vMap, Gia_ObjFaninId0(pObj, i) );
269 pUnrObj->fCompl0 = Gia_ObjFaninC0(pObj);
270 pUnrObj->fItIsPo = Gia_ObjIsPo(p->pGia, pObj);
271 }
272 if ( Gia_ObjIsAnd(pObj) )
273 {
274 pUnrObj->hFan1 = Vec_IntEntry( vMap, Gia_ObjFaninId1(pObj, i) );
275 pUnrObj->fCompl1 = Gia_ObjFaninC1(pObj);
276 }
277 else if ( Gia_ObjIsRo(p->pGia, pObj) )
278 {
279 pUnrObj->hFan0 = Vec_IntEntry( vMap, Gia_ObjId(p->pGia, Gia_ObjRoToRi(p->pGia, pObj)) );
280 pUnrObj->fCompl0 = 0;
281 }
282 else if ( Gia_ObjIsPi(p->pGia, pObj) )
283 {
284 pUnrObj->hFan0 = Gia_ObjCioId(pObj); // remember CIO id
285 pUnrObj->hFan1 = Vec_IntEntry(p->vTents, i); // remember tent
286 pUnrObj->fItIsPi = 1;
287 }
288 }
289 // store CI/PO objects;
290 Gia_ManForEachCi( p->pGia, pObj, i )
291 Vec_IntPush( p->vCiMap, Vec_IntEntry(vMap, Gia_ObjId(p->pGia, pObj)) );
292 Gia_ManForEachCo( p->pGia, pObj, i )
293 Vec_IntPush( p->vCoMap, Vec_IntEntry(vMap, Gia_ObjId(p->pGia, pObj)) );
294 Vec_IntFreeP( &vMap );
295 // print stats
296 if ( fVerbose )
297 {
298 Unr_ManProfileRanks( p->vRanks );
299 printf( "Memory usage = %6.2f MB ", 4.0 * nInts / (1<<20) );
300 Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
301 }
302 Vec_IntFreeP( &p->vOrder );
303 Vec_IntFreeP( &p->vOrderLim );
304 Vec_IntFreeP( &p->vRanks );
305 Vec_IntFreeP( &p->vTents );
306}
#define ABC_SWAP(Type, a, b)
Definition abc_global.h:253
ABC_INT64_T abctime
Definition abc_global.h:332
#define UNR_DIFF_NULL
DECLARATIONS ///.
Definition bmcUnroll.c:29
void Unr_ManSetup_rec(Unr_Man_t *p, int iObj, int iTent, Vec_Int_t *vRoots)
Definition bmcUnroll.c:161
void Unr_ManProfileRanks(Vec_Int_t *vRanks)
Definition bmcUnroll.c:132
struct Unr_Obj_t_ Unr_Obj_t
Definition bmcUnroll.c:31
#define Gia_ManForEachPo(p, pObj, i)
Definition gia.h:1250
struct Gia_Obj_t_ Gia_Obj_t
Definition gia.h:76
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
Definition gia.h:1190
#define Gia_ManForEachCo(p, pObj, i)
Definition gia.h:1236
#define Gia_ManForEachCi(p, pObj, i)
Definition gia.h:1228
unsigned hFan1
Definition bmcUnroll.c:35
unsigned RankCur
Definition bmcUnroll.c:43
unsigned fCompl1
Definition bmcUnroll.c:37
unsigned fItIsPi
Definition bmcUnroll.c:40
unsigned fItIsPo
Definition bmcUnroll.c:41
unsigned uRDiff1
Definition bmcUnroll.c:39
unsigned fCompl0
Definition bmcUnroll.c:36
unsigned RankMax
Definition bmcUnroll.c:42
unsigned OrigId
Definition bmcUnroll.c:44
unsigned hFan0
Definition bmcUnroll.c:34
unsigned uRDiff0
Definition bmcUnroll.c:38
unsigned Res[1]
Definition bmcUnroll.c:45
#define assert(ex)
Definition util_old.h:213
#define Vec_IntForEachEntryStartStop(vVec, Entry, i, Start, Stop)
Definition vecInt.h:60
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Unr_ManSetup_rec()

void Unr_ManSetup_rec ( Unr_Man_t * p,
int iObj,
int iTent,
Vec_Int_t * vRoots )

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

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 161 of file bmcUnroll.c.

162{
163 Gia_Obj_t * pObj;
164 int iFanin;
165 if ( Vec_IntEntry(p->vTents, iObj) >= 0 )
166 return;
167 Vec_IntWriteEntry(p->vTents, iObj, iTent);
168 pObj = Gia_ManObj( p->pGia, iObj );
169 if ( Gia_ObjIsAnd(pObj) || Gia_ObjIsCo(pObj) )
170 {
171 Unr_ManSetup_rec( p, (iFanin = Gia_ObjFaninId0(pObj, iObj)), iTent, vRoots );
172 Vec_IntWriteMaxEntry( p->vRanks, iFanin, Abc_MaxInt(0, iTent - Vec_IntEntry(p->vTents, iFanin) - 1) );
173 }
174 if ( Gia_ObjIsAnd(pObj) )
175 {
176 Unr_ManSetup_rec( p, (iFanin = Gia_ObjFaninId1(pObj, iObj)), iTent, vRoots );
177 Vec_IntWriteMaxEntry( p->vRanks, iFanin, Abc_MaxInt(0, iTent - Vec_IntEntry(p->vTents, iFanin) - 1) );
178 }
179 else if ( Gia_ObjIsRo(p->pGia, pObj) )
180 {
181 Vec_IntPush( vRoots, (iFanin = Gia_ObjId(p->pGia, Gia_ObjRoToRi(p->pGia, pObj))) );
182 Vec_IntWriteMaxEntry( p->vRanks, iFanin, 0 );
183 }
184 Vec_IntPush( p->vOrder, iObj );
185}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Unr_ManTest()

void Unr_ManTest ( Gia_Man_t * pGia,
int nFrames )

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

Synopsis [Perform evaluation.]

Description []

SideEffects []

SeeAlso []

Definition at line 480 of file bmcUnroll.c.

481{
482 Gia_Man_t * pFrames0, * pFrames1;
483 abctime clk = Abc_Clock();
484 pFrames0 = Unr_ManUnroll( pGia, nFrames );
485 Abc_PrintTime( 1, "Unroll ", Abc_Clock() - clk );
486 clk = Abc_Clock();
487 pFrames1 = Unr_ManUnrollSimple( pGia, nFrames );
488 Abc_PrintTime( 1, "UnrollS", Abc_Clock() - clk );
489
490Gia_ManPrintStats( pFrames0, NULL );
491Gia_ManPrintStats( pFrames1, NULL );
492Gia_AigerWrite( pFrames0, "frames0.aig", 0, 0, 0 );
493Gia_AigerWrite( pFrames1, "frames1.aig", 0, 0, 0 );
494
495 Gia_ManStop( pFrames0 );
496 Gia_ManStop( pFrames1 );
497}
Gia_Man_t * Unr_ManUnrollSimple(Gia_Man_t *pGia, int nFrames)
Definition bmcUnroll.c:438
Gia_Man_t * Unr_ManUnroll(Gia_Man_t *pGia, int nFrames)
Definition bmcUnroll.c:414
struct Gia_Man_t_ Gia_Man_t
Definition gia.h:96
void Gia_ManPrintStats(Gia_Man_t *p, Gps_Par_t *pPars)
Definition giaMan.c:495
void Gia_AigerWrite(Gia_Man_t *p, char *pFileName, int fWriteSymbols, int fCompact, int fWriteNewLine)
Definition giaAiger.c:1595
Here is the call graph for this function:

◆ Unr_ManUnroll()

Gia_Man_t * Unr_ManUnroll ( Gia_Man_t * pGia,
int nFrames )

Definition at line 414 of file bmcUnroll.c.

415{
416 Unr_Man_t * p;
417 Gia_Man_t * pFrames;
418 int f;
419 p = Unr_ManUnrollStart( pGia, 1 );
420 for ( f = 0; f < nFrames; f++ )
421 Unr_ManUnrollFrame( p, f );
422 pFrames = Gia_ManCleanup( p->pFrames );
423 Unr_ManFree( p );
424 return pFrames;
425}
Gia_Man_t * Unr_ManUnrollFrame(Unr_Man_t *p, int f)
Definition bmcUnroll.c:379
Unr_Man_t * Unr_ManUnrollStart(Gia_Man_t *pGia, int fVerbose)
Definition bmcUnroll.c:368
void Unr_ManFree(Unr_Man_t *p)
Definition bmcUnroll.c:340
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
Definition giaScl.c:84
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Unr_ManUnrollFrame()

Gia_Man_t * Unr_ManUnrollFrame ( Unr_Man_t * p,
int f )

Definition at line 379 of file bmcUnroll.c.

380{
381 int i, iLit, iLit0, iLit1, hStart;
382 for ( i = 0; i < Gia_ManPiNum(p->pGia); i++ )
383 Vec_IntPush( p->vPiLits, Gia_ManAppendCi(p->pFrames) );
384 hStart = Vec_IntEntry( p->vObjLim, Abc_MaxInt(0, Vec_IntSize(p->vObjLim)-1-f) );
385 while ( p->pObjs + hStart < p->pEnd )
386 {
387 Unr_Obj_t * pUnrObj = Unr_ManObj( p, hStart );
388 if ( pUnrObj->uRDiff0 != UNR_DIFF_NULL && pUnrObj->uRDiff1 != UNR_DIFF_NULL ) // AND node
389 {
390 iLit0 = Unr_ManFanin0Value( p, pUnrObj );
391 iLit1 = Unr_ManFanin1Value( p, pUnrObj );
392 iLit = Gia_ManHashAnd( p->pFrames, iLit0, iLit1 );
393 Unr_ManObjSetValue( pUnrObj, iLit );
394 }
395 else if ( pUnrObj->uRDiff0 != UNR_DIFF_NULL && pUnrObj->uRDiff1 == UNR_DIFF_NULL ) // PO/RI/RO
396 {
397 iLit = Unr_ManFanin0Value( p, pUnrObj );
398 Unr_ManObjSetValue( pUnrObj, iLit );
399 if ( pUnrObj->fItIsPo )
400 Gia_ManAppendCo( p->pFrames, iLit );
401 }
402 else // PI (pUnrObj->hFan0 is CioId; pUnrObj->hFan1 is tent)
403 {
404 assert( pUnrObj->fItIsPi && f >= (int)pUnrObj->hFan1 );
405 iLit = Vec_IntEntry( p->vPiLits, Gia_ManPiNum(p->pGia) * (f - pUnrObj->hFan1) + pUnrObj->hFan0 );
406 Unr_ManObjSetValue( pUnrObj, iLit );
407 }
408 hStart += Unr_ObjSize( pUnrObj );
409 }
410 assert( p->pObjs + hStart == p->pEnd );
411 assert( Gia_ManPoNum(p->pFrames) == (f + 1) * Gia_ManPoNum(p->pGia) );
412 return p->pFrames;
413}
int Gia_ManHashAnd(Gia_Man_t *p, int iLit0, int iLit1)
Definition giaHash.c:576
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Unr_ManUnrollSimple()

Gia_Man_t * Unr_ManUnrollSimple ( Gia_Man_t * pGia,
int nFrames )

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

Synopsis [Perform naive unrolling.]

Description []

SideEffects []

SeeAlso []

Definition at line 438 of file bmcUnroll.c.

439{
440 Gia_Man_t * pFrames;
441 Gia_Obj_t * pObj, * pObjRi;
442 int f, i;
443 pFrames = Gia_ManStart( 10000 );
444 pFrames->pName = Abc_UtilStrsav( pGia->pName );
445 Gia_ManHashAlloc( pFrames );
446 Gia_ManConst0(pGia)->Value = 0;
447 Gia_ManForEachRi( pGia, pObj, i )
448 pObj->Value = 0;
449 for ( f = 0; f < nFrames; f++ )
450 {
451 Gia_ManForEachPi( pGia, pObj, i )
452 pObj->Value = Gia_ManAppendCi(pFrames);
453 Gia_ManForEachRiRo( pGia, pObjRi, pObj, i )
454 pObj->Value = pObjRi->Value;
455 Gia_ManForEachAnd( pGia, pObj, i )
456 pObj->Value = Gia_ManHashAnd( pFrames, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
457 Gia_ManForEachCo( pGia, pObj, i )
458 pObj->Value = Gia_ObjFanin0Copy(pObj);
459 Gia_ManForEachPo( pGia, pObj, i )
460 Gia_ManAppendCo( pFrames, pObj->Value );
461 }
462 Gia_ManHashStop( pFrames );
463 Gia_ManSetRegNum( pFrames, 0 );
464 pFrames = Gia_ManCleanup( pGia = pFrames );
465 Gia_ManStop( pGia );
466 return pFrames;
467}
#define Gia_ManForEachAnd(p, pObj, i)
Definition gia.h:1214
void Gia_ManSetRegNum(Gia_Man_t *p, int nRegs)
Definition giaMan.c:764
void Gia_ManHashAlloc(Gia_Man_t *p)
Definition giaHash.c:105
#define Gia_ManForEachPi(p, pObj, i)
Definition gia.h:1248
#define Gia_ManForEachRiRo(p, pObjRi, pObjRo, i)
Definition gia.h:1256
void Gia_ManHashStop(Gia_Man_t *p)
Definition giaHash.c:149
#define Gia_ManForEachRi(p, pObj, i)
Definition gia.h:1254
unsigned Value
Definition gia.h:89
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Unr_ManUnrollStart()

Unr_Man_t * Unr_ManUnrollStart ( Gia_Man_t * pGia,
int fVerbose )

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

Synopsis [Perform smart unrolling.]

Description []

SideEffects []

SeeAlso []

Definition at line 368 of file bmcUnroll.c.

369{
370 int i, iHandle;
371 Unr_Man_t * p;
372 p = Unr_ManAlloc( pGia );
373 Unr_ManSetup( p, fVerbose );
374 for ( i = 0; i < Gia_ManRegNum(p->pGia); i++ )
375 if ( (iHandle = Vec_IntEntry(p->vCoMap, Gia_ManPoNum(p->pGia) + i)) != -1 )
376 Unr_ManObjSetValue( Unr_ManObj(p, iHandle), 0 );
377 return p;
378}
Unr_Man_t * Unr_ManAlloc(Gia_Man_t *pGia)
Definition bmcUnroll.c:321
void Unr_ManSetup(Unr_Man_t *p, int fVerbose)
Definition bmcUnroll.c:186
Here is the call graph for this function:
Here is the caller graph for this function: