ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
giaStoch.c
Go to the documentation of this file.
1
20
21#include "gia.h"
22#include "base/main/main.h"
23#include "base/cmd/cmd.h"
24
25#ifdef WIN32
26#include <process.h>
27#define unlink _unlink
28#else
29#include <unistd.h>
30#endif
31
33
37
41
53Gia_Man_t * Gia_StochProcessSingle( Gia_Man_t * p, char * pScript, int Rand, int TimeSecs )
54{
55 Gia_Man_t * pTemp, * pNew = Gia_ManDup( p );
58 {
60 {
61 Abc_Print( 1, "Something did not work out with the command \"%s\".\n", pScript );
62 return NULL;
63 }
64 }
65 else
66 {
69 {
70 Abc_Print( 1, "Something did not work out with the command \"%s\".\n", pScript );
71 return NULL;
72 }
74 }
76 if ( Gia_ManAndNum(pNew) > Gia_ManAndNum(pTemp) )
77 {
78 Gia_ManStop( pNew );
79 pNew = Gia_ManDup( pTemp );
80 }
81 return pNew;
82}
83Vec_Int_t * Gia_StochProcessArray( Vec_Ptr_t * vGias, char * pScript, int TimeSecs, int fVerbose )
84{
85 Vec_Int_t * vGains = Vec_IntStartFull( Vec_PtrSize(vGias) );
86 Gia_Man_t * pGia, * pNew; int i;
87 Vec_Int_t * vRands = Vec_IntAlloc( Vec_PtrSize(vGias) );
88 Abc_Random(1);
89 for ( i = 0; i < Vec_PtrSize(vGias); i++ )
90 Vec_IntPush( vRands, Abc_Random(0) % 0x1000000 );
91 Vec_PtrForEachEntry( Gia_Man_t *, vGias, pGia, i )
92 {
93 pNew = Gia_StochProcessSingle( pGia, pScript, Vec_IntEntry(vRands, i), TimeSecs );
94 Vec_IntWriteEntry( vGains, i, Gia_ManAndNum(pGia) - Gia_ManAndNum(pNew) );
95 Gia_ManStop( pGia );
96 Vec_PtrWriteEntry( vGias, i, pNew );
97 }
98 Vec_IntFree( vRands );
99 return vGains;
100}
101
113Gia_Man_t * Gia_StochProcessOne( Gia_Man_t * p, char * pScript, int Rand, int TimeSecs )
114{
115 Gia_Man_t * pNew;
116 char FileName[100], Command[1000];
117 sprintf( FileName, "%06x.aig", Rand );
118 Gia_AigerWrite( p, FileName, 0, 0, 0 );
119 sprintf( Command, "./abc -q \"&read %s; %s; &write %s\"", FileName, pScript, FileName );
120#if defined(__wasm)
121 if ( 1 )
122#else
123 if ( system( (char *)Command ) )
124#endif
125 {
126 fprintf( stderr, "The following command has returned non-zero exit status:\n" );
127 fprintf( stderr, "\"%s\"\n", (char *)Command );
128 fprintf( stderr, "Sorry for the inconvenience.\n" );
129 fflush( stdout );
130 unlink( FileName );
131 return Gia_ManDup(p);
132 }
133 pNew = Gia_AigerRead( FileName, 0, 0, 0 );
134 unlink( FileName );
135 if ( pNew && Gia_ManAndNum(pNew) < Gia_ManAndNum(p) )
136 return pNew;
137 Gia_ManStopP( &pNew );
138 return Gia_ManDup(p);
139}
140
152
161
162int Gia_StochProcess1( void * p )
163{
164 StochSynData_t * pData = (StochSynData_t *)p;
165 assert( pData->pIn != NULL );
166 assert( pData->pOut == NULL );
167 pData->pOut = Gia_StochProcessOne( pData->pIn, pData->pScript, pData->Rand, pData->TimeOut );
168 return 1;
169}
170
171Vec_Int_t * Gia_StochProcess( Vec_Ptr_t * vGias, char * pScript, int nProcs, int TimeSecs, int fVerbose )
172{
173 if ( nProcs <= 2 ) {
174 if ( fVerbose )
175 printf( "Running non-concurrent synthesis.\n" ), fflush(stdout);
176 return Gia_StochProcessArray( vGias, pScript, TimeSecs, fVerbose );
177 }
178 Vec_Int_t * vGains = Vec_IntStartFull( Vec_PtrSize(vGias) );
179 StochSynData_t * pData = ABC_CALLOC( StochSynData_t, Vec_PtrSize(vGias) );
180 Vec_Ptr_t * vData = Vec_PtrAlloc( Vec_PtrSize(vGias) );
181 Gia_Man_t * pGia; int i;
182 Abc_Random(1);
183 Vec_PtrForEachEntry( Gia_Man_t *, vGias, pGia, i ) {
184 pData[i].pIn = pGia;
185 pData[i].pOut = NULL;
186 pData[i].pScript = pScript;
187 pData[i].Rand = Abc_Random(0) % 0x1000000;
188 pData[i].TimeOut = TimeSecs;
189 Vec_PtrPush( vData, pData+i );
190 }
191 if ( fVerbose )
192 printf( "Running concurrent synthesis with %d processes.\n", nProcs ), fflush(stdout);
193 Util_ProcessThreads( Gia_StochProcess1, vData, nProcs, TimeSecs, fVerbose );
194 // replace old AIGs by new AIGs
195 Vec_PtrForEachEntry( Gia_Man_t *, vGias, pGia, i ) {
196 Vec_IntWriteEntry( vGains, i, Gia_ManAndNum(pGia) - Gia_ManAndNum(pData[i].pOut) );
197 Gia_ManStop( pGia );
198 Vec_PtrWriteEntry( vGias, i, pData[i].pOut );
199 }
200 Vec_PtrFree( vData );
201 ABC_FREE( pData );
202 return vGains;
203}
204
217{
218 Gia_Obj_t * pObj, * pFanin; int i, k;
219 Vec_Int_t * vMapping = p->vMapping ? Vec_IntAlloc( Vec_IntSize(p->vMapping) ) : NULL;
220 if ( p->vMapping == NULL )
221 return;
222 Vec_IntFill( vMapping, Gia_ManObjNum(p), 0 );
223 Gia_ManForEachLut( p, i )
224 {
225 pObj = Gia_ManObj( p, i );
226 Vec_IntWriteEntry( vMapping, Abc_Lit2Var(pObj->Value), Vec_IntSize(vMapping) );
227 Vec_IntPush( vMapping, Gia_ObjLutSize(p, i) );
228 Gia_LutForEachFaninObj( p, i, pFanin, k )
229 Vec_IntPush( vMapping, Abc_Lit2Var(pFanin->Value) );
230 Vec_IntPush( vMapping, Abc_Lit2Var(pObj->Value) );
231 }
232 pNew->vMapping = vMapping;
233}
235{
236 Gia_Man_t * pCopy = Gia_ManDup(pGia);
237 Gia_ManDupMapping( pCopy, pGia );
238 return pCopy;
239}
240void Gia_ManStochSynthesis( Vec_Ptr_t * vAigs, char * pScript )
241{
242 Gia_Man_t * pGia, * pNew; int i;
243 Vec_PtrForEachEntry( Gia_Man_t *, vAigs, pGia, i )
244 {
245 Gia_Man_t * pCopy = Gia_ManDupWithMapping(pGia);
247 if ( Abc_FrameIsBatchMode() )
248 {
250 {
251 Abc_Print( 1, "Something did not work out with the command \"%s\".\n", pScript );
252 return;
253 }
254 }
255 else
256 {
259 {
260 Abc_Print( 1, "Something did not work out with the command \"%s\".\n", pScript );
262 return;
263 }
265 }
267 if ( Gia_ManHasMapping(pNew) && Gia_ManHasMapping(pCopy) )
268 {
269 if ( Gia_ManLutNum(pNew) < Gia_ManLutNum(pCopy) )
270 {
271 Gia_ManStop( pCopy );
272 pCopy = Gia_ManDupWithMapping( pNew );
273 }
274 }
275 else
276 {
277 if ( Gia_ManAndNum(pNew) < Gia_ManAndNum(pCopy) )
278 {
279 Gia_ManStop( pCopy );
280 pCopy = Gia_ManDup( pNew );
281 }
282 }
283 Vec_PtrWriteEntry( vAigs, i, pCopy );
284 }
285}
286
287
299int Gia_ManFilterPartitions( Gia_Man_t * p, Vec_Ptr_t * vvIns, Vec_Ptr_t * vvNodes, Vec_Ptr_t * vvOuts, Vec_Ptr_t * vWins, Vec_Int_t * vGains )
300{
301 int RetValue = Vec_PtrSize(vvIns);
302 Vec_Ptr_t * vvInsNew = Vec_PtrAlloc( 10 );
303 Vec_Ptr_t * vvOutsNew = Vec_PtrAlloc( 10 );
304 Vec_Ptr_t * vvWinsNew = Vec_PtrAlloc( 10 );
306 while ( 1 ) {
307 int i, Gain, iEntry = Vec_IntArgMax(vGains);
308 if ( iEntry == -1 || Vec_IntEntry(vGains, iEntry) < 0 )
309 break;
310 //printf( "Selecting partition %d with gain %d.\n", iEntry, Vec_IntEntry(vGains, iEntry) );
311 Vec_IntWriteEntry( vGains, iEntry, -1 );
312 Vec_PtrPush( vvInsNew, Vec_IntDup((Vec_Int_t *)Vec_PtrEntry(vvIns, iEntry)) );
313 Vec_PtrPush( vvOutsNew, Vec_IntDup((Vec_Int_t *)Vec_PtrEntry(vvOuts, iEntry)) );
314 Vec_PtrPush( vvWinsNew, Gia_ManDupDfs((Gia_Man_t *)Vec_PtrEntry(vWins, iEntry)) );
315 extern void Gia_ManMarkTfiTfo( Vec_Int_t * vOne, Gia_Man_t * pMan );
316 Gia_ManMarkTfiTfo( (Vec_Int_t *)Vec_PtrEntryLast(vvInsNew), p );
317 Vec_IntForEachEntry( vGains, Gain, i ) {
318 if ( Gain < 0 )
319 continue;
320 Vec_Int_t * vNodes = (Vec_Int_t *)Vec_PtrEntry(vvNodes, i);
321 Gia_Obj_t * pNode; int j;
322 Gia_ManForEachObjVec( vNodes, p, pNode, j )
323 if ( Gia_ObjIsTravIdCurrent(p, pNode) )
324 break;
325 if ( j < Vec_IntSize(vNodes) )
326 Vec_IntWriteEntry( vGains, i, -1 );
327 }
328 }
329 ABC_SWAP( Vec_Ptr_t, *vvInsNew, *vvIns );
330 ABC_SWAP( Vec_Ptr_t, *vvOutsNew, *vvOuts );
331 ABC_SWAP( Vec_Ptr_t, *vvWinsNew, *vWins );
332 Vec_PtrFreeFunc( vvInsNew, (void (*)(void *)) Vec_IntFree );
333 Vec_PtrFreeFunc( vvOutsNew, (void (*)(void *)) Vec_IntFree );
334 Vec_PtrFreeFunc( vvWinsNew, (void (*)(void *)) Gia_ManStop );
335 return RetValue;
336}
337
350{
351 assert( !pObj->fMark0 );
352 if ( Gia_ObjIsTravIdCurrent( pGia, pObj ) )
353 return;
354 Gia_ObjSetTravIdCurrent( pGia, pObj );
355 if ( Gia_ObjIsCi(pObj) )
356 return;
357 assert( Gia_ObjIsAnd(pObj) );
358 Gia_ObjDfsMark_rec( pGia, Gia_ObjFanin0(pObj) );
359 Gia_ObjDfsMark_rec( pGia, Gia_ObjFanin1(pObj) );
360}
362{
363 Gia_Obj_t * pFanout; int i;
364 assert( !pObj->fMark0 );
365 if ( Gia_ObjIsTravIdCurrent( pGia, pObj ) )
366 return;
367 Gia_ObjSetTravIdCurrent( pGia, pObj );
368 Gia_ObjForEachFanoutStatic( pGia, pObj, pFanout, i )
369 Gia_ObjDfsMark2_rec( pGia, pFanout );
370}
372{
373 Vec_Int_t * vLevel, * vNodes = Vec_IntAlloc( 100 );
374 Gia_Obj_t * pObj, * pNext; int i, k, iLevel;
375 Vec_WecForEachLevel( vStore, vLevel, i )
376 Vec_IntClear( vLevel );
377 // mark the TFI cones of the inputs
379 Gia_ManForEachObjVec( vIns, pMan, pObj, i )
380 Gia_ObjDfsMark_rec( pMan, pObj );
381 // add unrelated fanouts of the inputs to storage
382 Gia_ManForEachObjVec( vIns, pMan, pObj, i )
383 Gia_ObjForEachFanoutStatic( pMan, pObj, pNext, k )
384 if ( Gia_ObjIsAnd(pNext) && !Gia_ObjIsTravIdCurrent(pMan, pNext) && !pNext->fMark0 ) {
385 pNext->fMark0 = 1;
386 Vec_WecPush( vStore, Gia_ObjLevel(pMan, pNext), Gia_ObjId(pMan, pNext) );
387 }
388 // mark the inputs
390 Gia_ManForEachObjVec( vIns, pMan, pObj, i )
391 Gia_ObjSetTravIdCurrent(pMan, pObj);
392 // collect those fanouts that are completely supported by the inputs
393 Vec_WecForEachLevel( vStore, vLevel, iLevel )
394 Gia_ManForEachObjVec( vLevel, pMan, pObj, i ) {
395 assert( !Gia_ObjIsTravIdCurrent(pMan, pObj) );
396 assert( pObj->fMark0 );
397 pObj->fMark0 = 0;
398 if ( !Gia_ObjIsTravIdCurrent(pMan, Gia_ObjFanin0(pObj)) ||
399 !Gia_ObjIsTravIdCurrent(pMan, Gia_ObjFanin1(pObj)) )
400 continue;
401 Gia_ObjSetTravIdCurrent(pMan, pObj);
402 Vec_IntPush( vNodes, Gia_ObjId(pMan, pObj) );
403 assert( Gia_ObjIsAnd(pObj) );
404 // add fanouts of this node to storage
405 Gia_ObjForEachFanoutStatic( pMan, pObj, pNext, k )
406 if ( Gia_ObjIsAnd(pNext) && !Gia_ObjIsTravIdCurrent(pMan, pNext) && !pNext->fMark0 ) {
407 pNext->fMark0 = 1;
408 assert( Gia_ObjLevel(pMan, pNext) > iLevel );
409 Vec_WecPush( vStore, Gia_ObjLevel(pMan, pNext), Gia_ObjId(pMan, pNext) );
410 }
411 }
412 Vec_IntSort( vNodes, 0 );
413 return vNodes;
414}
416{
417 Vec_Int_t * vIns; int i;
418 Vec_Ptr_t * vvNodes = Vec_PtrAlloc( Vec_PtrSize(vvIns) );
419 Vec_PtrForEachEntry( Vec_Int_t *, vvIns, vIns, i )
420 Vec_PtrPush( vvNodes, Gia_ManDeriveWinNodes(pMan, vIns, vStore) );
421 return vvNodes;
422}
424{
425 Vec_Int_t * vOuts = Vec_IntAlloc( 100 );
426 Gia_Obj_t * pObj, * pNext; int i, k;
427 // mark the nodes in the window
429 Gia_ManForEachObjVec( vNodes, pMan, pObj, i )
430 Gia_ObjSetTravIdCurrent(pMan, pObj);
431 // collect nodes that have unmarked fanouts
432 Gia_ManForEachObjVec( vNodes, pMan, pObj, i ) {
433 Gia_ObjForEachFanoutStatic( pMan, pObj, pNext, k )
434 if ( !Gia_ObjIsTravIdCurrent(pMan, pNext) )
435 break;
436 if ( k < Gia_ObjFanoutNum(pMan, pObj) )
437 Vec_IntPush( vOuts, Gia_ObjId(pMan, pObj) );
438 }
439 if ( Vec_IntSize(vOuts) == 0 )
440 printf( "Window with %d internal nodes has no outputs (are these dangling nodes?).\n", Vec_IntSize(vNodes) );
441 return vOuts;
442}
444{
445 Vec_Int_t * vNodes; int i;
446 Vec_Ptr_t * vvOuts = Vec_PtrAlloc( Vec_PtrSize(vvNodes) );
447 Vec_PtrForEachEntry( Vec_Int_t *, vvNodes, vNodes, i )
448 Vec_PtrPush( vvOuts, Gia_ManDeriveWinOuts(pMan, vNodes) );
449 return vvOuts;
450}
451void Gia_ManPermuteLevel( Gia_Man_t * pMan, int Level )
452{
453 Gia_Obj_t * pObj, * pNext; int i, k;
454 Gia_ManForEachAnd( pMan, pObj, i ) {
455 int LevelMin = Gia_ObjLevel(pMan, pObj), LevelMax = Level + 1;
456 Gia_ObjForEachFanoutStatic( pMan, pObj, pNext, k )
457 if ( Gia_ObjIsAnd(pNext) )
458 LevelMax = Abc_MinInt( LevelMax, Gia_ObjLevel(pMan, pNext) );
459 if ( LevelMin == LevelMax ) continue;
460 assert( LevelMin < LevelMax );
461 // randomly set level between LevelMin and LevelMax-1
462 Gia_ObjSetLevel( pMan, pObj, LevelMin + (Abc_Random(0) % (LevelMax - LevelMin)) );
463 assert( Gia_ObjLevel(pMan, pObj) < LevelMax );
464 }
465}
467{
468 Vec_Int_t * vRes = Vec_IntAlloc( 100 );
469 Gia_Obj_t * pObj, * pFanin; int i, n;
471 Gia_ManForEachAnd( pMan, pObj, i ) {
472 if ( Gia_ObjLevel(pMan, pObj) <= Level )
473 continue;
474 for ( n = 0; n < 2; n++ ) {
475 Gia_Obj_t * pFanin = n ? Gia_ObjFanin1(pObj) : Gia_ObjFanin0(pObj);
476 if ( Gia_ObjLevel(pMan, pFanin) <= Level && !Gia_ObjIsTravIdCurrent(pMan, pFanin) ) {
477 Gia_ObjSetTravIdCurrent(pMan, pFanin);
478 Vec_IntPush( vRes, Gia_ObjId(pMan, pFanin) );
479 }
480 }
481 }
482 Gia_ManForEachCo( pMan, pObj, i ) {
483 pFanin = Gia_ObjFanin0(pObj);
484 if ( Gia_ObjLevel(pMan, pFanin) <= Level && !Gia_ObjIsTravIdCurrent(pMan, pFanin) && Gia_ObjIsAnd(pFanin) ) {
485 Gia_ObjSetTravIdCurrent(pMan, pFanin);
486 Vec_IntPush( vRes, Gia_ObjId(pMan, pFanin) );
487 }
488 }
489 Vec_IntSort( vRes, 0 );
490 return vRes;
491}
493{
494 Vec_Wec_t * vResSupps = NULL;
495 Vec_Int_t * vBelow = Gia_ManCollectObjectsPointedTo( pMan, Level );
496 Vec_Wec_t * vSupps = Vec_WecStart( Vec_IntSize(vBelow) );
497 Vec_Int_t * vSuppIds = Vec_IntStartFull( Gia_ManObjNum(pMan) );
498 Vec_Int_t * vTemp = Vec_IntAlloc(100);
499 Gia_Obj_t * pObj; int i, Count = 0;
500 Gia_ManForEachObjVec( vBelow, pMan, pObj, i ) {
501 Vec_IntWriteEntry( vSuppIds, Gia_ObjId(pMan, pObj), i );
502 Vec_IntPush( Vec_WecEntry(vSupps, i), Gia_ObjId(pMan, pObj) );
503 }
504 Gia_ManForEachAnd( pMan, pObj, i ) {
505 if ( Gia_ObjLevel(pMan, pObj) <= Level )
506 continue;
507 int iSuppId0 = Vec_IntEntry( vSuppIds, Gia_ObjFaninId0(pObj, i) );
508 int iSuppId1 = Vec_IntEntry( vSuppIds, Gia_ObjFaninId1(pObj, i) );
509 if ( iSuppId0 == -1 || iSuppId1 == -1 ) {
510 Count++;
511 continue;
512 }
513 Vec_IntClear( vTemp );
514 Vec_IntTwoMerge2( Vec_WecEntry(vSupps, iSuppId0), Vec_WecEntry(vSupps, iSuppId1), vTemp );
515 if ( Vec_IntSize(vTemp) > nSuppMax ) {
516 Count++;
517 continue;
518 }
519 Vec_IntWriteEntry( vSuppIds, i, Vec_WecSize(vSupps) );
520 Vec_IntAppend( Vec_WecPushLevel(vSupps), vTemp );
521 }
522 // remove those supported nodes that are in the TFI cones of others
524 Gia_ManForEachAnd( pMan, pObj, i )
525 if ( Gia_ObjLevel(pMan, pObj) > Level && Vec_IntEntry(vSuppIds, i) >= 0 && !Gia_ObjIsTravIdCurrent(pMan, pObj) ) {
526 Gia_ObjDfsMark_rec(pMan, pObj);
527 Gia_ObjSetTravIdPrevious(pMan, pObj);
528 }
529 // create the result
530 vResSupps = Vec_WecAlloc( 100 );
531 Gia_ManForEachAnd( pMan, pObj, i )
532 if ( Gia_ObjLevel(pMan, pObj) > Level && Vec_IntEntry(vSuppIds, i) >= 0 && !Gia_ObjIsTravIdCurrent(pMan, pObj) ) {
533 Vec_Int_t * vSupp = Vec_WecEntry( vSupps, Vec_IntEntry(vSuppIds, i) );
534 if ( Vec_IntSize(vSupp) < 4 )
535 continue;
536 Vec_Int_t * vThis = Vec_WecPushLevel( vResSupps );
537 Vec_IntGrow( vThis, Vec_IntSize(vSupp) + 1 );
538 Vec_IntAppend( vThis, vSupp );
539 //Vec_IntPush( vThis, Gia_ObjId(pObj) );
540 }
541 //printf( "Inputs = %d. Nodes with %d-support = %d. Nodes with larger support = %d. Selected outputs = %d.\n",
542 // Vec_IntSize(vBelow), nSuppMax, Vec_WecSize(vSupps), Count, Vec_WecSize(vResSupps) );
543 Vec_WecFree( vSupps );
544 Vec_IntFree( vSuppIds );
545 Vec_IntFree( vBelow );
546 Vec_IntFree( vTemp );
547 return vResSupps;
548}
549// removes all supports that overlap with this one
551{
552 Vec_Int_t * vLevel; int i;
553 Vec_WecForEachLevel( vSupps, vLevel, i )
554 if ( Vec_IntTwoCountCommon(vLevel, vOne) > 0 )
555 Vec_IntClear( vLevel );
556 Vec_WecRemoveEmpty( vSupps );
557}
558// marks TFI/TFO of this one
560{
561 int i; Gia_Obj_t * pObj;
562 Gia_ManForEachObjVec( vOne, pMan, pObj, i ) {
563 //Gia_ObjSetTravIdPrevious(pMan, pObj);
564 //Gia_ObjDfsMark_rec( pMan, pObj );
565 Gia_ObjSetTravIdPrevious(pMan, pObj);
566 Gia_ObjDfsMark2_rec( pMan, pObj );
567 }
568}
569// removes all supports that overlap with the TFI/TFO cones of this one
570void Gia_ManSelectRemove2( Vec_Wec_t * vSupps, Vec_Int_t * vOne, Gia_Man_t * pMan )
571{
572 Vec_Int_t * vLevel; int i, k; Gia_Obj_t * pObj;
573 Gia_ManForEachObjVec( vOne, pMan, pObj, i ) {
574 Gia_ObjSetTravIdPrevious(pMan, pObj);
575 Gia_ObjDfsMark_rec( pMan, pObj );
576 Gia_ObjSetTravIdPrevious(pMan, pObj);
577 Gia_ObjDfsMark2_rec( pMan, pObj );
578 }
579 Vec_WecForEachLevel( vSupps, vLevel, i ) {
580 Gia_ManForEachObjVec( vLevel, pMan, pObj, k )
581 if ( Gia_ObjIsTravIdCurrent(pMan, pObj) )
582 break;
583 if ( k < Vec_IntSize(vLevel) )
584 Vec_IntClear( vLevel );
585 }
586 Vec_WecRemoveEmpty( vSupps );
587}
588// removes all supports that are contained in this one
590{
591 Vec_Int_t * vLevel; int i;
592 Vec_WecForEachLevel( vSupps, vLevel, i )
593 if ( Vec_IntTwoCountCommon(vLevel, vOne) == Vec_IntSize(vLevel) )
594 Vec_IntClear( vLevel );
595 Vec_WecRemoveEmpty( vSupps );
596}
597Vec_Ptr_t * Gia_ManDeriveWinInsAll( Vec_Wec_t * vSupps, int nSuppMax, Gia_Man_t * pMan, int fOverlap )
598{
599 Vec_Ptr_t * vRes = Vec_PtrAlloc( 100 );
601 while ( Vec_WecSize(vSupps) > 0 ) {
602 int i, Item, iRand = Abc_Random(0) % Vec_WecSize(vSupps);
603 Vec_Int_t * vLevel, * vLevel2 = Vec_WecEntry( vSupps, iRand );
604 Vec_Int_t * vCopy = Vec_IntDup( vLevel2 );
605 if ( Vec_IntSize(vLevel2) == nSuppMax ) {
606 Vec_PtrPush( vRes, vCopy );
607 if ( fOverlap )
608 Gia_ManSelectRemove3( vSupps, vCopy );
609 else
610 Gia_ManSelectRemove2( vSupps, vCopy, pMan );
611 continue;
612 }
613 // find another support, which maximizes the union but does not exceed nSuppMax
614 int iBest = iRand, nUnion = Vec_IntSize(vCopy);
615 Vec_WecForEachLevel( vSupps, vLevel, i ) {
616 if ( i == iRand ) continue;
617 int nCommon = Vec_IntTwoCountCommon(vLevel, vCopy);
618 int nUnionCur = Vec_IntSize(vLevel) + Vec_IntSize(vCopy) - nCommon;
619 if ( nUnionCur <= nSuppMax && nUnion < nUnionCur ) {
620 nUnion = nUnionCur;
621 iBest = i;
622 }
623 }
624 vLevel = Vec_WecEntry( vSupps, iBest );
625 Vec_IntForEachEntry( vLevel, Item, i )
626 Vec_IntPushUniqueOrder( vCopy, Item );
627 Vec_PtrPush( vRes, vCopy );
628 if ( fOverlap )
629 Gia_ManSelectRemove3( vSupps, vCopy );
630 else
631 Gia_ManSelectRemove2( vSupps, vCopy, pMan );
632 }
633 return vRes;
634}
636{
637 Gia_Man_t * pNew;
638 Gia_Obj_t * pObj;
639 int i;
640 pNew = Gia_ManStart( 5000 );
641 pNew->pName = Abc_UtilStrsav( p->pName );
642 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
643 Gia_ManConst0(p)->Value = 0;
644 Gia_ManForEachObjVec( vCis, p, pObj, i )
645 pObj->Value = Gia_ManAppendCi( pNew );
646 Gia_ManForEachObjVec( vAnds, p, pObj, i )
647 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
648 Gia_ManForEachObjVec( vCos, p, pObj, i )
649 pObj->Value = Gia_ManAppendCo( pNew, pObj->Value );
650 return pNew;
651}
652Vec_Ptr_t * Gia_ManDupWindows( Gia_Man_t * pMan, Vec_Ptr_t * vvIns, Vec_Ptr_t * vvNodes, Vec_Ptr_t * vvOuts )
653{
654 Vec_Int_t * vNodes; int i;
655 Vec_Ptr_t * vWins = Vec_PtrAlloc( Vec_PtrSize(vvIns) );
656 assert( Vec_PtrSize(vvIns) == Vec_PtrSize(vvNodes) );
657 assert( Vec_PtrSize(vvOuts) == Vec_PtrSize(vvNodes) );
658 Gia_ManFillValue( pMan );
659 Gia_ManCleanMark01( pMan );
660 Vec_PtrForEachEntry( Vec_Int_t *, vvNodes, vNodes, i ) {
661 Vec_Int_t * vIns = (Vec_Int_t *)Vec_PtrEntry(vvIns, i);
662 Vec_Int_t * vOuts = (Vec_Int_t *)Vec_PtrEntry(vvOuts, i);
663 Gia_Man_t * pNew = Gia_ManDupFromArrays( pMan, vIns, vNodes, vOuts );
664 Vec_PtrPush( vWins, pNew );
665 }
666 return vWins;
667}
669{
670 int i, LevelMax = Gia_ManLevelRNum( pMan );
671 Gia_Obj_t * pNode;
672 Gia_ManForEachObj( pMan, pNode, i )
673 Gia_ObjSetLevel( pMan, pNode, (int)(LevelMax - Gia_ObjLevel(pMan, pNode) + 1) );
674 Gia_ManForEachCi( pMan, pNode, i )
675 Gia_ObjSetLevel( pMan, pNode, 0 );
676 return LevelMax;
677}
678Vec_Ptr_t * Gia_ManExtractPartitions( Gia_Man_t * pMan, int Iter, int nSuppMax, Vec_Ptr_t ** pvIns, Vec_Ptr_t ** pvOuts, Vec_Ptr_t ** pvNodes, int fOverlap )
679{
680 // if ( Gia_ManCiNum(pMan) <= nSuppMax ) {
681 // Vec_Ptr_t * vWins = Vec_PtrAlloc( 1 );
682 // Vec_PtrPush( vWins, Gia_ManDupDfs(pMan) );
683 // *pvIns = *pvOuts = *pvNodes = NULL;
684 // return vWins;
685 // }
686 // int iUseRevL = Iter % 3 == 0 ? 0 : Abc_Random(0) & 1;
687 int iUseRevL = Abc_Random(0) & 1;
688 int LevelMax = iUseRevL ? Gia_ManLevelR(pMan) : Gia_ManLevelNum(pMan);
689 // int LevelCut = Iter % 3 == 0 ? 0 : LevelMax > 8 ? 2 + (Abc_Random(0) % (LevelMax - 4)) : 0;
690 int LevelCut = LevelMax > 8 ? (Abc_Random(0) % (LevelMax - 4)) : 0;
691 //printf( "Using %s cut level %d (out of %d)\n", iUseRevL ? "reverse": "direct", LevelCut, LevelMax );
692 // Gia_ManPermuteLevel( pMan, LevelMax );
693 Vec_Wec_t * vStore = Vec_WecStart( LevelMax+1 );
694 Vec_Wec_t * vSupps = Gia_ManCollectObjectsWithSuppLimit( pMan, LevelCut, nSuppMax );
695 Vec_Ptr_t * vIns = Gia_ManDeriveWinInsAll( vSupps, nSuppMax, pMan, fOverlap );
696 Vec_Ptr_t * vNodes = Gia_ManDeriveWinNodesAll( pMan, vIns, vStore );
697 Vec_Ptr_t * vOuts = Gia_ManDeriveWinOutsAll( pMan, vNodes );
698 Vec_Ptr_t * vWins = Gia_ManDupWindows( pMan, vIns, vNodes, vOuts );
699 Vec_WecFree( vSupps );
700 Vec_WecFree( vStore );
701 *pvIns = vIns;
702 *pvOuts = vOuts;
703 *pvNodes = vNodes;
704 return vWins;
705}
706
707
708
720void Gia_ManCollectNodes_rec( Gia_Man_t * p, int iObj, Vec_Int_t * vAnds )
721{
722 Gia_Obj_t * pObj;
723 if ( Gia_ObjUpdateTravIdCurrentId( p, iObj ) )
724 return;
725 pObj = Gia_ManObj( p, iObj );
726 if ( Gia_ObjIsCi(pObj) || iObj == 0 )
727 return;
728 assert( Gia_ObjIsAnd(pObj) );
729 Gia_ManCollectNodes_rec( p, Gia_ObjFaninId0(pObj, iObj), vAnds );
730 Gia_ManCollectNodes_rec( p, Gia_ObjFaninId1(pObj, iObj), vAnds );
731 Vec_IntPush( vAnds, iObj );
732}
733void Gia_ManCollectNodes( Gia_Man_t * p, Vec_Int_t * vCis, Vec_Int_t * vAnds, Vec_Int_t * vCos )
734{
735 int i, iObj;
736 if ( !Gia_ManHasMapping(p) )
737 return;
738 Vec_IntClear( vAnds );
740 Vec_IntForEachEntry( vCis, iObj, i )
741 Gia_ObjSetTravIdCurrentId( p, iObj );
742 Vec_IntForEachEntry( vCos, iObj, i )
743 Gia_ManCollectNodes_rec( p, iObj, vAnds );
744}
746{
747 Vec_Int_t * vMapping; int i;
748 Gia_Man_t * pNew; Gia_Obj_t * pObj;
749 pNew = Gia_ManStart( 1+Vec_IntSize(vCis)+Vec_IntSize(vAnds)+Vec_IntSize(vCos) );
750 pNew->pName = Abc_UtilStrsav( p->pName );
752 Gia_ManConst0(p)->Value = 0;
753 Gia_ManForEachObjVec( vCis, p, pObj, i )
754 pObj->Value = Gia_ManAppendCi( pNew );
755 Gia_ManForEachObjVec( vAnds, p, pObj, i )
756 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
757 Gia_ManForEachObjVec( vCos, p, pObj, i )
758 Gia_ManAppendCo( pNew, pObj->Value );
759 assert( Gia_ManCiNum(pNew) > 0 && Gia_ManCoNum(pNew) > 0 );
760 if ( !Gia_ManHasMapping(p) )
761 return pNew;
762 vMapping = Vec_IntAlloc( 4*Gia_ManObjNum(pNew) );
763 Vec_IntFill( vMapping, Gia_ManObjNum(pNew), 0 );
764 Gia_ManForEachObjVec( vAnds, p, pObj, i )
765 {
766 Gia_Obj_t * pFanin; int k;
767 int iObj = Gia_ObjId(p, pObj);
768 if ( !Gia_ObjIsLut(p, iObj) )
769 continue;
770 Vec_IntWriteEntry( vMapping, Abc_Lit2Var(pObj->Value), Vec_IntSize(vMapping) );
771 Vec_IntPush( vMapping, Gia_ObjLutSize(p, iObj) );
772 Gia_LutForEachFaninObj( p, iObj, pFanin, k )
773 Vec_IntPush( vMapping, Abc_Lit2Var(pFanin->Value) );
774 Vec_IntPush( vMapping, Abc_Lit2Var(pObj->Value) );
775 }
776 pNew->vMapping = vMapping;
777 return pNew;
778}
779Vec_Ptr_t * Gia_ManDupDivide( Gia_Man_t * p, Vec_Wec_t * vCis, Vec_Wec_t * vAnds, Vec_Wec_t * vCos, char * pScript, int nProcs, int TimeOut )
780{
781 Vec_Ptr_t * vAigs = Vec_PtrAlloc( Vec_WecSize(vCis) ); int i;
782 for ( i = 0; i < Vec_WecSize(vCis); i++ )
783 {
784 Gia_ManCollectNodes( p, Vec_WecEntry(vCis, i), Vec_WecEntry(vAnds, i), Vec_WecEntry(vCos, i) );
785 Vec_PtrPush( vAigs, Gia_ManDupDivideOne(p, Vec_WecEntry(vCis, i), Vec_WecEntry(vAnds, i), Vec_WecEntry(vCos, i)) );
786 }
787 //Gia_ManStochSynthesis( vAigs, pScript );
788 Vec_Int_t * vGains = Gia_StochProcess( vAigs, pScript, nProcs, TimeOut, 0 );
789 Vec_IntFree( vGains );
790 return vAigs;
791}
792Gia_Man_t * Gia_ManDupStitch( Gia_Man_t * p, Vec_Wec_t * vCis, Vec_Wec_t * vAnds, Vec_Wec_t * vCos, Vec_Ptr_t * vAigs, int fHash )
793{
794 Gia_Man_t * pGia, * pNew;
795 Gia_Obj_t * pObj; int i, k;
796 pNew = Gia_ManStart( Gia_ManObjNum(p) );
797 pNew->pName = Abc_UtilStrsav( p->pName );
798 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
800 Gia_ManConst0(p)->Value = 0;
801 Gia_ManForEachCi( p, pObj, i )
802 pObj->Value = Gia_ManAppendCi( pNew );
803 if ( fHash )
804 Gia_ManHashAlloc( pNew );
805 Vec_PtrForEachEntry( Gia_Man_t *, vAigs, pGia, i )
806 {
807 Vec_Int_t * vCi = Vec_WecEntry( vCis, i );
808 Vec_Int_t * vCo = Vec_WecEntry( vCos, i );
809 Gia_ManCleanValue( pGia );
810 Gia_ManConst0(pGia)->Value = 0;
811 Gia_ManForEachObjVec( vCi, p, pObj, k )
812 Gia_ManCi(pGia, k)->Value = pObj->Value;
813 if ( fHash )
814 Gia_ManForEachAnd( pGia, pObj, k )
815 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
816 else
817 Gia_ManForEachAnd( pGia, pObj, k )
818 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
819 Gia_ManForEachObjVec( vCo, p, pObj, k )
820 pObj->Value = Gia_ObjFanin0Copy(Gia_ManCo(pGia, k));
821 }
822 Gia_ManForEachCo( p, pObj, i )
823 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
824 if ( fHash )
825 {
826 pNew = Gia_ManCleanup( pGia = pNew );
827 Gia_ManStop( pGia );
828 }
829 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
830 return pNew;
831}
833{
834 Vec_Int_t * vMapping; int n;
835 Gia_Man_t * pGia, * pNew = Gia_ManDupStitch( p, vCis, vAnds, vCos, vAigs, !Gia_ManHasMapping(p) );
836 if ( !Gia_ManHasMapping(p) )
837 return pNew;
838 vMapping = Vec_IntAlloc( Vec_IntSize(p->vMapping) );
839 Vec_IntFill( vMapping, Gia_ManObjNum(pNew), 0 );
840 Vec_PtrForEachEntry( Gia_Man_t *, vAigs, pGia, n )
841 {
842 Gia_Obj_t * pFanin; int iObj, k;
843 //printf( "Gia %d has %d Luts\n", n, Gia_ManLutNum(pGia) );
844
845 Gia_ManForEachLut( pGia, iObj )
846 {
847 Gia_Obj_t * pObj = Gia_ManObj( pGia, iObj );
848 Vec_IntWriteEntry( vMapping, Abc_Lit2Var(pObj->Value), Vec_IntSize(vMapping) );
849 Vec_IntPush( vMapping, Gia_ObjLutSize(pGia, iObj) );
850 Gia_LutForEachFaninObj( pGia, iObj, pFanin, k )
851 Vec_IntPush( vMapping, Abc_Lit2Var(pFanin->Value) );
852 Vec_IntPush( vMapping, Abc_Lit2Var(pObj->Value) );
853 }
854 }
855 pNew->vMapping = vMapping;
856 return pNew;
857}
858
870Vec_Wec_t * Gia_ManStochNodes( Gia_Man_t * p, int nMaxSize, int Seed )
871{
872 Vec_Wec_t * vRes = Vec_WecAlloc( 100 );
873 Vec_Int_t * vPart = Vec_WecPushLevel( vRes );
874 int i, iStart = Seed % Gia_ManCoNum(p);
875 //Gia_ManLevelNum( p );
877 for ( i = 0; i < Gia_ManCoNum(p); i++ )
878 {
879 Gia_Obj_t * pObj = Gia_ManCo( p, (iStart+i) % Gia_ManCoNum(p) );
880 if ( Vec_IntSize(vPart) > nMaxSize )
881 vPart = Vec_WecPushLevel( vRes );
882 Gia_ManCollectNodes_rec( p, Gia_ObjFaninId0p(p, pObj), vPart );
883 }
884 if ( Vec_IntSize(vPart) == 0 )
885 Vec_WecShrink( vRes, Vec_WecSize(vRes)-1 );
886 //Vec_WecPrint( vRes, 0 );
887 return vRes;
888}
890{
891 Vec_Wec_t * vRes = Vec_WecAlloc( 100 );
892 Vec_Int_t * vLevel; Gia_Obj_t * pObj; int i, k, iObj, iFan, f;
893 Vec_WecForEachLevel( vAnds, vLevel, i )
894 {
895 Vec_Int_t * vVec = Vec_WecPushLevel( vRes );
896 assert( Vec_IntSize(vVec) == 0 );
898 Vec_IntForEachEntry( vLevel, iObj, k )
899 Gia_ObjSetTravIdCurrentId( p, iObj );
900 if ( Gia_ManHasMapping(p) )
901 {
902 Vec_IntForEachEntry( vLevel, iObj, k )
903 if ( Gia_ObjIsLut(p, iObj) )
904 Gia_LutForEachFanin( p, iObj, iFan, f )
905 if ( !Gia_ObjUpdateTravIdCurrentId(p, iFan) )
906 Vec_IntPush( vVec, iFan );
907 }
908 else
909 {
910 Gia_ManForEachObjVec( vLevel, p, pObj, k )
911 {
912 iObj = Gia_ObjFaninId0p(p, pObj);
913 if ( !Gia_ObjUpdateTravIdCurrentId(p, iObj) )
914 Vec_IntPush( vVec, iObj );
915 iObj = Gia_ObjFaninId1p(p, pObj);
916 if ( !Gia_ObjUpdateTravIdCurrentId(p, iObj) )
917 Vec_IntPush( vVec, iObj );
918 }
919 }
920 assert( Vec_IntSize(vVec) > 0 );
921 }
922 return vRes;
923}
925{
926 Vec_Wec_t * vRes = Vec_WecAlloc( 100 );
927 Vec_Int_t * vLevel; Gia_Obj_t * pObj; int i, k, iObj, iFan, f;
928 if ( Gia_ManHasMapping(p) )
929 {
931 Vec_WecForEachLevel( vAnds, vLevel, i )
932 {
933 Vec_Int_t * vVec = Vec_WecPushLevel( vRes );
934 assert( Vec_IntSize(vVec) == 0 );
935 Vec_IntForEachEntry( vLevel, iObj, k )
936 if ( Gia_ObjIsLut(p, iObj) )
937 Gia_LutForEachFanin( p, iObj, iFan, f )
938 Gia_ObjLutRefDecId( p, iFan );
939 Vec_IntForEachEntry( vLevel, iObj, k )
940 if ( Gia_ObjIsLut(p, iObj) )
941 if ( Gia_ObjLutRefNumId(p, iObj) )
942 Vec_IntPush( vVec, iObj );
943 Vec_IntForEachEntry( vLevel, iObj, k )
944 if ( Gia_ObjIsLut(p, iObj) )
945 Gia_LutForEachFanin( p, iObj, iFan, f )
946 Gia_ObjLutRefIncId( p, iFan );
947 assert( Vec_IntSize(vVec) > 0 );
948 }
949 }
950 else
951 {
953 Vec_WecForEachLevel( vAnds, vLevel, i )
954 {
955 Vec_Int_t * vVec = Vec_WecPushLevel( vRes );
956 Gia_ManForEachObjVec( vLevel, p, pObj, k )
957 {
958 Gia_ObjRefDecId( p, Gia_ObjFaninId0p(p, pObj) );
959 Gia_ObjRefDecId( p, Gia_ObjFaninId1p(p, pObj) );
960 }
961 Gia_ManForEachObjVec( vLevel, p, pObj, k )
962 if ( Gia_ObjRefNum(p, pObj) )
963 Vec_IntPush( vVec, Gia_ObjId(p, pObj) );
964 Gia_ManForEachObjVec( vLevel, p, pObj, k )
965 {
966 Gia_ObjRefIncId( p, Gia_ObjFaninId0p(p, pObj) );
967 Gia_ObjRefIncId( p, Gia_ObjFaninId1p(p, pObj) );
968 }
969 }
970 }
971 return vRes;
972}
973
985void Gia_ManStochSyn( int nSuppMax, int nMaxSize, int nIters, int TimeOut, int Seed, int fVerbose, char * pScript, int nProcs )
986{
987 abctime nTimeToStop = TimeOut ? Abc_Clock() + TimeOut * CLOCKS_PER_SEC : 0;
988 abctime clkStart = Abc_Clock();
989 int fMapped = Gia_ManHasMapping(Abc_FrameReadGia(Abc_FrameGetGlobalFrame()));
990 int nLutEnd, nLutBeg = fMapped ? Gia_ManLutNum(Abc_FrameReadGia(Abc_FrameGetGlobalFrame())) : 0;
991 int i, nEnd, nBeg = Gia_ManAndNum(Abc_FrameReadGia(Abc_FrameGetGlobalFrame()));
992 Abc_Random(1);
993 for ( i = 0; i < 10+Seed; i++ )
994 Abc_Random(0);
995 if ( fVerbose ) {
996 printf( "Running %d iterations of the script \"%s\"", nIters, pScript );
997 if ( nProcs > 2 )
998 printf( " using %d concurrent threads.\n", nProcs-1 );
999 else
1000 printf( " without concurrency.\n" );
1001 fflush(stdout);
1002 }
1003 if ( !nSuppMax ) {
1004 for ( i = 0; i < nIters; i++ )
1005 {
1006 abctime clk = Abc_Clock();
1008 Vec_Wec_t * vAnds = Gia_ManStochNodes( pGia, nMaxSize, Abc_Random(0) & 0x7FFFFFFF );
1009 Vec_Wec_t * vIns = Gia_ManStochInputs( pGia, vAnds );
1010 Vec_Wec_t * vOuts = Gia_ManStochOutputs( pGia, vAnds );
1011 Vec_Ptr_t * vAigs = Gia_ManDupDivide( pGia, vIns, vAnds, vOuts, pScript, nProcs, TimeOut );
1012 Gia_Man_t * pNew = Gia_ManDupStitchMap( pGia, vIns, vAnds, vOuts, vAigs );
1013 int fMapped = Gia_ManHasMapping(pGia) && Gia_ManHasMapping(pNew);
1015 if ( fVerbose )
1016 printf( "Iteration %3d : Using %3d partitions. Reducing %6d to %6d %s. ",
1017 i, Vec_PtrSize(vAigs), fMapped ? Gia_ManLutNum(pGia) : Gia_ManAndNum(pGia),
1018 fMapped ? Gia_ManLutNum(pNew) : Gia_ManAndNum(pNew),
1019 fMapped ? "LUTs" : "ANDs" );
1020 if ( fVerbose )
1021 Abc_PrintTime( 0, "Time", Abc_Clock() - clk );
1022 Gia_ManStop( pGia );
1023 Vec_PtrFreeFunc( vAigs, (void (*)(void *)) Gia_ManStop );
1024 Vec_WecFree( vAnds );
1025 Vec_WecFree( vIns );
1026 Vec_WecFree( vOuts );
1027 if ( nTimeToStop && Abc_Clock() > nTimeToStop )
1028 {
1029 printf( "Runtime limit (%d sec) is reached after %d iterations.\n", TimeOut, i );
1030 break;
1031 }
1032 }
1033 }
1034 else {
1035 int fOverlap = 1;
1036 Vec_Ptr_t * vIns = NULL, * vOuts = NULL, * vNodes = NULL;
1037 for ( i = 0; i < nIters; i++ )
1038 {
1039 extern Gia_Man_t * Gia_ManDupInsertWindows( Gia_Man_t * p, Vec_Ptr_t * vvIns, Vec_Ptr_t * vvOuts, Vec_Ptr_t * vAigs );
1040 abctime clk = Abc_Clock();
1042 Vec_Ptr_t * vAigs = Gia_ManExtractPartitions( pGia, i, nSuppMax, &vIns, &vOuts, &vNodes, fOverlap );
1043 Vec_Int_t * vGains = Gia_StochProcess( vAigs, pScript, nProcs, TimeOut, 0 );
1044 int nPartsInit = fOverlap ? Gia_ManFilterPartitions( pGia, vIns, vNodes, vOuts, vAigs, vGains ) : Vec_PtrSize(vIns);
1045 Gia_Man_t * pNew = Gia_ManDupInsertWindows( pGia, vIns, vOuts, vAigs ); Gia_ManStaticFanoutStop(pGia);
1047 if ( fVerbose )
1048 printf( "Iteration %3d : Using %3d -> %3d partitions. Reducing node count from %6d to %6d. ",
1049 i, nPartsInit, Vec_PtrSize(vAigs), Gia_ManAndNum(pGia), Gia_ManAndNum(pNew) );
1050 if ( fVerbose )
1051 Abc_PrintTime( 0, "Time", Abc_Clock() - clk );
1052 // cleanup
1053 Gia_ManStop( pGia );
1054 Vec_PtrFreeFunc( vAigs, (void (*)(void *)) Gia_ManStop );
1055 Vec_IntFreeP( &vGains );
1056 if ( vIns ) Vec_PtrFreeFunc( vIns, (void (*)(void *)) Vec_IntFree );
1057 if ( vOuts ) Vec_PtrFreeFunc( vOuts, (void (*)(void *)) Vec_IntFree );
1058 if ( vNodes ) Vec_PtrFreeFunc( vNodes, (void (*)(void *)) Vec_IntFree );
1059 if ( nTimeToStop && Abc_Clock() > nTimeToStop )
1060 {
1061 printf( "Runtime limit (%d sec) is reached after %d iterations.\n", TimeOut, i );
1062 break;
1063 }
1064 }
1065 }
1066 fMapped &= Gia_ManHasMapping(Abc_FrameReadGia(Abc_FrameGetGlobalFrame()));
1067 nLutEnd = fMapped ? Gia_ManLutNum(Abc_FrameReadGia(Abc_FrameGetGlobalFrame())) : 0;
1068 nEnd = Gia_ManAndNum(Abc_FrameReadGia(Abc_FrameGetGlobalFrame()));
1069 if ( fVerbose )
1070 printf( "Cumulatively reduced %d %s (%.2f %%) after %d iterations. ",
1071 fMapped ? nLutBeg - nLutEnd : nBeg - nEnd, fMapped ? "LUTs" : "nodes", 100.0*(nBeg - nEnd)/Abc_MaxInt(nBeg, 1), nIters );
1072 if ( fVerbose )
1073 Abc_PrintTime( 0, "Total time", Abc_Clock() - clkStart );
1074}
1075
1079
1080
1082
void Abc_FrameUpdateGia(Abc_Frame_t *pAbc, Gia_Man_t *pNew)
Definition abc.c:824
#define ABC_SWAP(Type, a, b)
Definition abc_global.h:253
ABC_INT64_T abctime
Definition abc_global.h:332
unsigned Abc_Random(int fReset)
Definition utilSort.c:1004
void Util_ProcessThreads(int(*pUserFunc)(void *), void *vData, int nProcs, int TimeOut, int fVerbose)
DECLARATIONS ///.
Definition utilPth.c:70
#define ABC_CALLOC(type, num)
Definition abc_global.h:265
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_DLL Abc_Frame_t * Abc_FrameGetGlobalFrame()
Definition mainFrame.c:643
ABC_DLL void Abc_FrameSetBatchMode(int Mode)
Definition mainFrame.c:111
ABC_DLL Gia_Man_t * Abc_FrameReadGia(Abc_Frame_t *p)
Definition mainFrame.c:343
ABC_DLL int Abc_FrameIsBatchMode()
Definition mainFrame.c:110
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
ABC_DLL int Cmd_CommandExecute(Abc_Frame_t *pAbc, const char *sCommand)
Definition cmdApi.c:193
Cube * p
Definition exorList.c:222
Vec_Ptr_t * Gia_ManDupWindows(Gia_Man_t *pMan, Vec_Ptr_t *vvIns, Vec_Ptr_t *vvNodes, Vec_Ptr_t *vvOuts)
Definition giaStoch.c:652
void Gia_ManSelectRemove(Vec_Wec_t *vSupps, Vec_Int_t *vOne)
Definition giaStoch.c:550
Gia_Man_t * Gia_ManDupWithMapping(Gia_Man_t *pGia)
Definition giaStoch.c:234
Vec_Ptr_t * Gia_ManDeriveWinInsAll(Vec_Wec_t *vSupps, int nSuppMax, Gia_Man_t *pMan, int fOverlap)
Definition giaStoch.c:597
void Gia_ManCollectNodes(Gia_Man_t *p, Vec_Int_t *vCis, Vec_Int_t *vAnds, Vec_Int_t *vCos)
Definition giaStoch.c:733
Vec_Int_t * Gia_ManDeriveWinOuts(Gia_Man_t *pMan, Vec_Int_t *vNodes)
Definition giaStoch.c:423
Vec_Ptr_t * Gia_ManDeriveWinOutsAll(Gia_Man_t *pMan, Vec_Ptr_t *vvNodes)
Definition giaStoch.c:443
Vec_Ptr_t * Gia_ManDeriveWinNodesAll(Gia_Man_t *pMan, Vec_Ptr_t *vvIns, Vec_Wec_t *vStore)
Definition giaStoch.c:415
Vec_Wec_t * Gia_ManCollectObjectsWithSuppLimit(Gia_Man_t *pMan, int Level, int nSuppMax)
Definition giaStoch.c:492
Vec_Int_t * Gia_StochProcessArray(Vec_Ptr_t *vGias, char *pScript, int TimeSecs, int fVerbose)
Definition giaStoch.c:83
Vec_Int_t * Gia_ManCollectObjectsPointedTo(Gia_Man_t *pMan, int Level)
Definition giaStoch.c:466
ABC_NAMESPACE_IMPL_START Gia_Man_t * Gia_StochProcessSingle(Gia_Man_t *p, char *pScript, int Rand, int TimeSecs)
DECLARATIONS ///.
Definition giaStoch.c:53
void Gia_ManPermuteLevel(Gia_Man_t *pMan, int Level)
Definition giaStoch.c:451
Vec_Int_t * Gia_StochProcess(Vec_Ptr_t *vGias, char *pScript, int nProcs, int TimeSecs, int fVerbose)
Definition giaStoch.c:171
int Gia_ManFilterPartitions(Gia_Man_t *p, Vec_Ptr_t *vvIns, Vec_Ptr_t *vvNodes, Vec_Ptr_t *vvOuts, Vec_Ptr_t *vWins, Vec_Int_t *vGains)
Definition giaStoch.c:299
int Gia_StochProcess1(void *p)
Definition giaStoch.c:162
int Gia_ManLevelR(Gia_Man_t *pMan)
Definition giaStoch.c:668
void Gia_ObjDfsMark_rec(Gia_Man_t *pGia, Gia_Obj_t *pObj)
Definition giaStoch.c:349
void Gia_ObjDfsMark2_rec(Gia_Man_t *pGia, Gia_Obj_t *pObj)
Definition giaStoch.c:361
void Gia_ManDupMapping(Gia_Man_t *pNew, Gia_Man_t *p)
Definition giaStoch.c:216
void Gia_ManSelectRemove3(Vec_Wec_t *vSupps, Vec_Int_t *vOne)
Definition giaStoch.c:589
void Gia_ManMarkTfiTfo(Vec_Int_t *vOne, Gia_Man_t *pMan)
Definition giaStoch.c:559
void Gia_ManStochSynthesis(Vec_Ptr_t *vAigs, char *pScript)
Definition giaStoch.c:240
Vec_Wec_t * Gia_ManStochInputs(Gia_Man_t *p, Vec_Wec_t *vAnds)
Definition giaStoch.c:889
Gia_Man_t * Gia_ManDupStitch(Gia_Man_t *p, Vec_Wec_t *vCis, Vec_Wec_t *vAnds, Vec_Wec_t *vCos, Vec_Ptr_t *vAigs, int fHash)
Definition giaStoch.c:792
Vec_Int_t * Gia_ManDeriveWinNodes(Gia_Man_t *pMan, Vec_Int_t *vIns, Vec_Wec_t *vStore)
Definition giaStoch.c:371
Gia_Man_t * Gia_StochProcessOne(Gia_Man_t *p, char *pScript, int Rand, int TimeSecs)
Definition giaStoch.c:113
struct StochSynData_t_ StochSynData_t
void Gia_ManCollectNodes_rec(Gia_Man_t *p, int iObj, Vec_Int_t *vAnds)
Definition giaStoch.c:720
Gia_Man_t * Gia_ManDupStitchMap(Gia_Man_t *p, Vec_Wec_t *vCis, Vec_Wec_t *vAnds, Vec_Wec_t *vCos, Vec_Ptr_t *vAigs)
Definition giaStoch.c:832
Vec_Wec_t * Gia_ManStochNodes(Gia_Man_t *p, int nMaxSize, int Seed)
Definition giaStoch.c:870
Vec_Ptr_t * Gia_ManDupDivide(Gia_Man_t *p, Vec_Wec_t *vCis, Vec_Wec_t *vAnds, Vec_Wec_t *vCos, char *pScript, int nProcs, int TimeOut)
Definition giaStoch.c:779
void Gia_ManSelectRemove2(Vec_Wec_t *vSupps, Vec_Int_t *vOne, Gia_Man_t *pMan)
Definition giaStoch.c:570
Gia_Man_t * Gia_ManDupFromArrays(Gia_Man_t *p, Vec_Int_t *vCis, Vec_Int_t *vAnds, Vec_Int_t *vCos)
Definition giaStoch.c:635
Vec_Ptr_t * Gia_ManExtractPartitions(Gia_Man_t *pMan, int Iter, int nSuppMax, Vec_Ptr_t **pvIns, Vec_Ptr_t **pvOuts, Vec_Ptr_t **pvNodes, int fOverlap)
Definition giaStoch.c:678
Vec_Wec_t * Gia_ManStochOutputs(Gia_Man_t *p, Vec_Wec_t *vAnds)
Definition giaStoch.c:924
void Gia_ManStochSyn(int nSuppMax, int nMaxSize, int nIters, int TimeOut, int Seed, int fVerbose, char *pScript, int nProcs)
Definition giaStoch.c:985
Gia_Man_t * Gia_ManDupDivideOne(Gia_Man_t *p, Vec_Int_t *vCis, Vec_Int_t *vAnds, Vec_Int_t *vCos)
Definition giaStoch.c:745
Gia_Man_t * Gia_ManDupInsertWindows(Gia_Man_t *p, Vec_Ptr_t *vvIns, Vec_Ptr_t *vvOuts, Vec_Ptr_t *vWins)
Definition giaUtil.c:3418
#define Gia_ObjForEachFanoutStatic(p, pObj, pFanout, i)
Definition gia.h:1125
void Gia_ManStop(Gia_Man_t *p)
Definition giaMan.c:82
Gia_Man_t * Gia_ManDup(Gia_Man_t *p)
Definition giaDup.c:720
void Gia_ManStaticFanoutStart(Gia_Man_t *p)
Definition giaFanout.c:238
void Gia_ManStaticFanoutStop(Gia_Man_t *p)
Definition giaFanout.c:393
#define Gia_ManForEachAnd(p, pObj, i)
Definition gia.h:1214
void Gia_ManStopP(Gia_Man_t **p)
Definition giaMan.c:224
Gia_Man_t * Gia_AigerRead(char *pFileName, int fGiaSimple, int fSkipStrash, int fCheck)
Definition giaAiger.c:1017
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_ManForEachLut(p, i)
Definition gia.h:1157
int Gia_ManLevelRNum(Gia_Man_t *p)
Definition giaUtil.c:566
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
Definition giaMan.c:57
struct Gia_Obj_t_ Gia_Obj_t
Definition gia.h:76
#define Gia_LutForEachFanin(p, i, iFan, k)
Definition gia.h:1161
void Gia_ManFillValue(Gia_Man_t *p)
Definition giaUtil.c:369
struct Gia_Man_t_ Gia_Man_t
Definition gia.h:96
#define Gia_ManForEachObjVec(vVec, p, pObj, i)
Definition gia.h:1194
void Gia_ManCleanValue(Gia_Man_t *p)
Definition giaUtil.c:351
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
Definition giaScl.c:84
Gia_Man_t * Gia_ManDupDfs(Gia_Man_t *p)
Definition giaDup.c:1748
int Gia_ManLutNum(Gia_Man_t *p)
Definition giaIf.c:146
void Gia_ManCreateRefs(Gia_Man_t *p)
Definition giaUtil.c:779
int Gia_ManHashAnd(Gia_Man_t *p, int iLit0, int iLit1)
Definition giaHash.c:576
void Gia_ManIncrementTravId(Gia_Man_t *p)
Definition giaUtil.c:190
#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
void Gia_ManSetLutRefs(Gia_Man_t *p)
Definition giaIf.c:295
void Gia_ManCleanMark01(Gia_Man_t *p)
Definition giaUtil.c:218
#define Gia_LutForEachFaninObj(p, i, pFanin, k)
Definition gia.h:1165
int Gia_ManLevelNum(Gia_Man_t *p)
Definition giaUtil.c:546
void Gia_AigerWrite(Gia_Man_t *p, char *pFileName, int fWriteSymbols, int fCompact, int fWriteNewLine)
Definition giaAiger.c:1595
int nSuppMax
Definition llb3Image.c:83
char * pSpec
Definition gia.h:100
Vec_Int_t * vMapping
Definition gia.h:136
char * pName
Definition gia.h:99
unsigned Value
Definition gia.h:89
unsigned fMark0
Definition gia.h:81
Gia_Man_t * pIn
Definition giaStoch.c:155
Gia_Man_t * pOut
Definition giaStoch.c:156
#define assert(ex)
Definition util_old.h:213
int system()
char * sprintf()
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
Definition vecPtr.h:42
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
Definition vecPtr.h:55
#define Vec_WecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
Definition vecWec.h:55
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.
Definition vecWec.h:42