ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
giaDup.c
Go to the documentation of this file.
1
20
21#include "gia.h"
22#include "misc/tim/tim.h"
23#include "misc/vec/vecWec.h"
24#include "proof/cec/cec.h"
25#include "misc/util/utilTruth.h"
26
28
29
33
34
35extern Bnd_Man_t* pBnd;
36
40
55{
56 Gia_Obj_t * pObj;
57 int i, iLit, iLitNew;
58 Vec_IntForEachEntry( vLits, iLit, i )
59 {
60 if ( iLit < 0 )
61 continue;
62 pObj = Gia_ManObj( p, Abc_Lit2Var(iLit) );
63 if ( ~pObj->Value == 0 )
64 iLitNew = -1;
65 else
66 iLitNew = Abc_LitNotCond( pObj->Value, Abc_LitIsCompl(iLit) );
67 Vec_IntWriteEntry( vLits, i, iLitNew );
68 }
69}
70
83{
84 Vec_Int_t * vClass;
85 int i, k, iNode, iRepr, iPrev;
86 if ( p->pReprs == NULL )
87 return;
88 assert( pNew->pReprs == NULL && pNew->pNexts == NULL );
89 // start representatives
90 pNew->pReprs = ABC_CALLOC( Gia_Rpr_t, Gia_ManObjNum(pNew) );
91 for ( i = 0; i < Gia_ManObjNum(pNew); i++ )
92 Gia_ObjSetRepr( pNew, i, GIA_VOID );
93 // iterate over constant candidates
95 Gia_ObjSetRepr( pNew, Abc_Lit2Var(Gia_ManObj(p, i)->Value), 0 );
96 // iterate over class candidates
97 vClass = Vec_IntAlloc( 100 );
99 {
100 Vec_IntClear( vClass );
101 Gia_ClassForEachObj( p, i, k )
102 Vec_IntPushUnique( vClass, Abc_Lit2Var(Gia_ManObj(p, k)->Value) );
103 assert( Vec_IntSize( vClass ) > 1 );
104 Vec_IntSort( vClass, 0 );
105 iRepr = iPrev = Vec_IntEntry( vClass, 0 );
106 Vec_IntForEachEntryStart( vClass, iNode, k, 1 )
107 {
108 Gia_ObjSetRepr( pNew, iNode, iRepr );
109 assert( iPrev < iNode );
110 iPrev = iNode;
111 }
112 }
113 Vec_IntFree( vClass );
114 pNew->pNexts = Gia_ManDeriveNexts( pNew );
115}
116
129{
130 Gia_Obj_t * pObj, * pObjNew;
131 int i;
132 assert( Vec_IntSize(p->vCis) == Vec_IntSize(pNew->vCis) );
133 Gia_ManForEachCi( p, pObj, i )
134 {
135 assert( Gia_ObjCioId(pObj) == i );
136 pObjNew = Gia_ObjFromLit( pNew, pObj->Value );
137 assert( !Gia_IsComplement(pObjNew) );
138 Vec_IntWriteEntry( pNew->vCis, i, Gia_ObjId(pNew, pObjNew) );
139 Gia_ObjSetCioId( pObjNew, i );
140 }
141}
142
155{
156 Gia_Obj_t * pObj, * pObjNew;
157 int i;
158 assert( Vec_IntSize(p->vCos) == Vec_IntSize(pNew->vCos) );
159 Gia_ManForEachCo( p, pObj, i )
160 {
161 assert( Gia_ObjCioId(pObj) == i );
162 pObjNew = Gia_ObjFromLit( pNew, pObj->Value );
163 assert( !Gia_IsComplement(pObjNew) );
164 Vec_IntWriteEntry( pNew->vCos, i, Gia_ObjId(pNew, pObjNew) );
165 Gia_ObjSetCioId( pObjNew, i );
166 }
167}
168
181{
182 if ( ~pObj->Value )
183 return pObj->Value;
184 if ( Gia_ObjIsCi(pObj) )
185 return pObj->Value = Gia_ManAppendCi(pNew);
186// if ( p->pNexts && Gia_ObjNext(p, Gia_ObjId(p, pObj)) )
187// Gia_ManDupOrderDfs_rec( pNew, p, Gia_ObjNextObj(p, Gia_ObjId(p, pObj)) );
188 Gia_ManDupOrderDfs_rec( pNew, p, Gia_ObjFanin0(pObj) );
189 if ( Gia_ObjIsCo(pObj) )
190 return pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
191 Gia_ManDupOrderDfs_rec( pNew, p, Gia_ObjFanin1(pObj) );
192 return pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
193}
194
207{
208 Gia_Man_t * pNew;
209 Gia_Obj_t * pObj;
210 int i;
212 pNew = Gia_ManStart( Gia_ManObjNum(p) );
213 pNew->pName = Abc_UtilStrsav( p->pName );
214 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
215 Gia_ManConst0(p)->Value = 0;
216 Gia_ManForEachCo( p, pObj, i )
217 Gia_ManDupOrderDfs_rec( pNew, p, pObj );
218 Gia_ManForEachCi( p, pObj, i )
219 if ( !~pObj->Value )
220 pObj->Value = Gia_ManAppendCi(pNew);
221 assert( Gia_ManCiNum(pNew) == Gia_ManCiNum(p) );
222 Gia_ManDupRemapCis( pNew, p );
223 Gia_ManDupRemapEquiv( pNew, p );
224 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
225 return pNew;
226}
227
239Gia_Man_t * Gia_ManDupAbs( Gia_Man_t * p, Vec_Int_t * vMapPpi2Ff, Vec_Int_t * vMapFf2Ppi )
240{
241 Gia_Man_t * pNew;
242 Gia_Obj_t * pObj;
243 int k, Flop, Used;
244 assert( Vec_IntSize(vMapFf2Ppi) == Vec_IntSize(vMapPpi2Ff) + Vec_IntCountEntry(vMapFf2Ppi, -1) );
246 pNew = Gia_ManStart( Gia_ManObjNum(p) );
247 pNew->pName = Abc_UtilStrsav( p->pName );
248 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
249 Gia_ManConst0(p)->Value = 0;
250 // create inputs
251 Gia_ManForEachPi( p, pObj, k )
252 pObj->Value = Gia_ManAppendCi(pNew);
253 Vec_IntForEachEntry( vMapPpi2Ff, Flop, k )
254 {
255 pObj = Gia_ManCi( p, Gia_ManPiNum(p) + Flop );
256 pObj->Value = Gia_ManAppendCi(pNew);
257 }
258 Vec_IntForEachEntry( vMapFf2Ppi, Used, Flop )
259 {
260 pObj = Gia_ManCi( p, Gia_ManPiNum(p) + Flop );
261 if ( Used >= 0 )
262 {
263 assert( pObj->Value != ~0 );
264 continue;
265 }
266 assert( pObj->Value == ~0 );
267 pObj->Value = Gia_ManAppendCi(pNew);
268 }
269 Gia_ManForEachCi( p, pObj, k )
270 assert( pObj->Value != ~0 );
271 // create nodes
272 Gia_ManForEachPo( p, pObj, k )
273 Gia_ManDupOrderDfs_rec( pNew, p, Gia_ObjFanin0(pObj) );
274 Vec_IntForEachEntry( vMapFf2Ppi, Used, Flop )
275 {
276 if ( Used >= 0 )
277 continue;
278 pObj = Gia_ManCi( p, Gia_ManPiNum(p) + Flop );
279 pObj = Gia_ObjRoToRi( p, pObj );
280 Gia_ManDupOrderDfs_rec( pNew, p, Gia_ObjFanin0(pObj) );
281 }
282 // create outputs
283 Gia_ManForEachPo( p, pObj, k )
284 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
285 Vec_IntForEachEntry( vMapFf2Ppi, Used, Flop )
286 {
287 if ( Used >= 0 )
288 continue;
289 pObj = Gia_ManCi( p, Gia_ManPiNum(p) + Flop );
290 pObj = Gia_ObjRoToRi( p, pObj );
291 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
292 }
293 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) - Vec_IntSize(vMapPpi2Ff) );
294 assert( Gia_ManPiNum(pNew) == Gia_ManPiNum(p) + Vec_IntSize(vMapPpi2Ff) );
295 assert( Gia_ManCiNum(pNew) == Gia_ManCiNum(p) );
296 assert( Gia_ManPoNum(pNew) == Gia_ManPoNum(p) );
297 assert( Gia_ManCoNum(pNew) == Gia_ManCoNum(p) - Vec_IntSize(vMapPpi2Ff) );
298 return pNew;
299}
300
301
313Gia_Man_t * Gia_ManDupOutputGroup( Gia_Man_t * p, int iOutStart, int iOutStop )
314{
315 Gia_Man_t * pNew;
316 Gia_Obj_t * pObj;
317 int i;
319 pNew = Gia_ManStart( Gia_ManObjNum(p) );
320 pNew->pName = Abc_UtilStrsav( p->pName );
321 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
322 Gia_ManConst0(p)->Value = 0;
323 for ( i = iOutStart; i < iOutStop; i++ )
324 {
325 pObj = Gia_ManCo( p, i );
326 Gia_ManDupOrderDfs_rec( pNew, p, pObj );
327 }
328 return pNew;
329}
330
343{
344 Gia_Man_t * pNew;
345 Gia_Obj_t * pObj;
346 int i;
347 assert( Gia_ManRegNum(p) == 0 );
348 assert( Gia_ManPoNum(p) == Vec_IntSize(vOutPres) );
350 pNew = Gia_ManStart( Gia_ManObjNum(p) );
351 pNew->pName = Abc_UtilStrsav( p->pName );
352 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
353 Gia_ManConst0(p)->Value = 0;
354 Gia_ManForEachPi( p, pObj, i )
355 pObj->Value = Gia_ManAppendCi(pNew);
356 Gia_ManForEachPo( p, pObj, i )
357 if ( Vec_IntEntry(vOutPres, i) )
358 Gia_ManDupOrderDfs_rec( pNew, p, Gia_ObjFanin0(pObj) );
359 Gia_ManForEachPo( p, pObj, i )
360 if ( Vec_IntEntry(vOutPres, i) )
361 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
362 return pNew;
363}
364
377{
378 Gia_Man_t * pNew;
379 Gia_Obj_t * pObj;
380 int i, iOut;
381 assert( Gia_ManRegNum(p) == 0 );
382 assert( Gia_ManPoNum(p) >= Vec_IntSize(vOutsLeft) );
384 pNew = Gia_ManStart( Gia_ManObjNum(p) );
385 pNew->pName = Abc_UtilStrsav( p->pName );
386 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
387 Gia_ManConst0(p)->Value = 0;
388 Gia_ManForEachPi( p, pObj, i )
389 pObj->Value = Gia_ManAppendCi(pNew);
390 Vec_IntForEachEntry( vOutsLeft, iOut, i )
391 Gia_ManDupOrderDfs_rec( pNew, p, Gia_ObjFanin0(Gia_ManPo(p, iOut)) );
392 Vec_IntForEachEntry( vOutsLeft, iOut, i )
393 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(Gia_ManPo(p, iOut)) );
394 return pNew;
395}
396
409{
410 Gia_Obj_t * pNext;
411 if ( ~pObj->Value )
412 return;
413 assert( Gia_ObjIsAnd(pObj) );
414 pNext = Gia_ObjNextObj( p, Gia_ObjId(p, pObj) );
415 if ( pNext )
416 Gia_ManDupOrderDfsChoices_rec( pNew, p, pNext );
417 Gia_ManDupOrderDfsChoices_rec( pNew, p, Gia_ObjFanin0(pObj) );
418 Gia_ManDupOrderDfsChoices_rec( pNew, p, Gia_ObjFanin1(pObj) );
419 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
420 if ( pNext )
421 {
422 pNew->pNexts[Abc_Lit2Var(pObj->Value)] = Abc_Lit2Var( Abc_Lit2Var(pNext->Value) );
423 assert( Abc_Lit2Var(pObj->Value) > Abc_Lit2Var(pNext->Value) );
424 }
425}
426
439{
440 Gia_Man_t * pNew;
441 Gia_Obj_t * pObj;
442 int i;
443 assert( p->pReprs && p->pNexts );
445 pNew = Gia_ManStart( Gia_ManObjNum(p) );
446 pNew->pName = Abc_UtilStrsav( p->pName );
447 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
448 pNew->pNexts = ABC_CALLOC( int, Gia_ManObjNum(p) );
449 Gia_ManConst0(p)->Value = 0;
450 Gia_ManForEachCi( p, pObj, i )
451 pObj->Value = Gia_ManAppendCi(pNew);
452 Gia_ManForEachCo( p, pObj, i )
453 {
454 Gia_ManDupOrderDfsChoices_rec( pNew, p, Gia_ObjFanin0(pObj) );
455 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
456 }
457 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
458// Gia_ManDeriveReprs( pNew );
459 return pNew;
460}
461
474{
475 if ( ~pObj->Value )
476 return pObj->Value;
477 assert( Gia_ObjIsAnd(pObj) );
478 Gia_ManDupOrderDfs2_rec( pNew, p, Gia_ObjFanin1(pObj) );
479 Gia_ManDupOrderDfs2_rec( pNew, p, Gia_ObjFanin0(pObj) );
480 return pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
481}
482Gia_Man_t * Gia_ManDupOrderDfsReverse( Gia_Man_t * p, int fRevFans, int fRevOuts )
483{
484 Gia_Man_t * pNew;
485 Gia_Obj_t * pObj;
486 int i;
488 pNew = Gia_ManStart( Gia_ManObjNum(p) );
489 pNew->pName = Abc_UtilStrsav( p->pName );
490 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
491 Gia_ManConst0(p)->Value = 0;
492 Gia_ManForEachCi( p, pObj, i )
493 pObj->Value = Gia_ManAppendCi(pNew);
494 if ( fRevOuts )
495 {
496 if ( fRevFans )
497 Gia_ManForEachCoReverse( p, pObj, i )
498 Gia_ManDupOrderDfs2_rec( pNew, p, Gia_ObjFanin0(pObj) );
499 else
500 Gia_ManForEachCoReverse( p, pObj, i )
501 Gia_ManDupOrderDfs_rec( pNew, p, Gia_ObjFanin0(pObj) );
502 }
503 else
504 {
505 if ( fRevFans )
506 Gia_ManForEachCo( p, pObj, i )
507 Gia_ManDupOrderDfs2_rec( pNew, p, Gia_ObjFanin0(pObj) );
508 else
509 Gia_ManForEachCo( p, pObj, i )
510 Gia_ManDupOrderDfs_rec( pNew, p, Gia_ObjFanin0(pObj) );
511 }
512 Gia_ManForEachCo( p, pObj, i )
513 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
514 Gia_ManDupRemapCis( pNew, p );
515 Gia_ManDupRemapCos( pNew, p );
516 Gia_ManDupRemapEquiv( pNew, p );
517 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
518 return pNew;
519}
520
533{
534 Gia_Man_t * pNew;
535 Gia_Obj_t * pObj;
536 int i;
537 pNew = Gia_ManStart( Gia_ManObjNum(p) );
538 pNew->pName = Abc_UtilStrsav( p->pName );
539 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
540 Gia_ManConst0(p)->Value = 0;
541 Gia_ManForEachCi( p, pObj, i )
542 pObj->Value = Gia_ManAppendCi(pNew);
543 Gia_ManForEachAnd( p, pObj, i )
544 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
545 Gia_ManForEachCo( p, pObj, i )
546 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
547 Gia_ManDupRemapEquiv( pNew, p );
548 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
550 return pNew;
551}
552
565{
566 Gia_Man_t * pNew;
567 Gia_Obj_t * pObj;
568 int i;
569 pNew = Gia_ManStart( Gia_ManObjNum(p) );
570 pNew->pName = Abc_UtilStrsav( p->pName );
571 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
572 Gia_ManConst0(p)->Value = 0;
573 Gia_ManForEachCi( p, pObj, i )
574 pObj->Value = Gia_ManAppendCi(pNew);
575 Gia_ManForEachAnd( p, pObj, i )
576 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
577 Gia_ManForEachCo( p, pObj, i )
578 {
579 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
580 pObj->Value = Gia_ManAppendCo( pNew, Abc_LitNot(Gia_ObjFanin0Copy(pObj)) );
581 }
582 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
583 return pNew;
584}
585
598{
599 Gia_Man_t * pNew;
600 Gia_Obj_t * pObj;
601 int i;
602 assert( Gia_ManRegNum(p) == 0 );
603 pNew = Gia_ManStart( Gia_ManObjNum(p) );
604 pNew->pName = Abc_UtilStrsav( p->pName );
605 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
606 Gia_ManConst0(p)->Value = 0;
607 Gia_ManForEachCi( p, pObj, i )
608 pObj->Value = (i < Gia_ManCiNum(p) - nLastPis) ? ~0 : Gia_ManAppendCi(pNew);
609 Gia_ManForEachAnd( p, pObj, i )
610 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
611 Gia_ManForEachCo( p, pObj, i )
612 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
613 return pNew;
614}
615
628Gia_Man_t * Gia_ManDupFlip( Gia_Man_t * p, int * pInitState )
629{
630 Gia_Man_t * pNew;
631 Gia_Obj_t * pObj;
632 int i;
633 pNew = Gia_ManStart( Gia_ManObjNum(p) );
634 pNew->pName = Abc_UtilStrsav( p->pName );
635 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
636 Gia_ManConst0(p)->Value = 0;
637 Gia_ManForEachObj1( p, pObj, i )
638 {
639 if ( Gia_ObjIsAnd(pObj) )
640 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
641 else if ( Gia_ObjIsCi(pObj) )
642 {
643 pObj->Value = Gia_ManAppendCi( pNew );
644 if ( Gia_ObjCioId(pObj) >= Gia_ManPiNum(p) )
645 pObj->Value = Abc_LitNotCond( pObj->Value, Abc_InfoHasBit((unsigned *)pInitState, Gia_ObjCioId(pObj) - Gia_ManPiNum(p)) );
646 }
647 else if ( Gia_ObjIsCo(pObj) )
648 {
649 pObj->Value = Gia_ObjFanin0Copy(pObj);
650 if ( Gia_ObjCioId(pObj) >= Gia_ManPoNum(p) )
651 pObj->Value = Abc_LitNotCond( pObj->Value, Abc_InfoHasBit((unsigned *)pInitState, Gia_ObjCioId(pObj) - Gia_ManPoNum(p)) );
652 pObj->Value = Gia_ManAppendCo( pNew, pObj->Value );
653 }
654 }
655 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
656 return pNew;
657}
658
659
671void Gia_ManCycle( Gia_Man_t * p, Abc_Cex_t * pCex, int nFrames )
672{
673 Gia_Obj_t * pObj, * pObjRi, * pObjRo;
674 int i, k;
675 Gia_ManRandom( 1 );
676 assert( pCex == NULL || nFrames <= pCex->iFrame );
677 // iterate for the given number of frames
678 for ( i = 0; i < nFrames; i++ )
679 {
680 Gia_ManForEachPi( p, pObj, k )
681 pObj->fMark0 = pCex ? Abc_InfoHasBit(pCex->pData, pCex->nRegs+i*pCex->nPis+k) : (1 & Gia_ManRandom(0));
682 Gia_ManForEachAnd( p, pObj, k )
683 pObj->fMark0 = (Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj)) &
684 (Gia_ObjFanin1(pObj)->fMark0 ^ Gia_ObjFaninC1(pObj));
685 Gia_ManForEachCo( p, pObj, k )
686 pObj->fMark0 = Gia_ObjFanin0(pObj)->fMark0 ^ Gia_ObjFaninC0(pObj);
687 Gia_ManForEachRiRo( p, pObjRi, pObjRo, k )
688 pObjRo->fMark0 = pObjRi->fMark0;
689 }
690}
691Gia_Man_t * Gia_ManDupCycled( Gia_Man_t * p, Abc_Cex_t * pCex, int nFrames )
692{
693 Gia_Man_t * pNew;
694 Vec_Bit_t * vInits;
695 Gia_Obj_t * pObj;
696 int i;
698 Gia_ManCycle( p, pCex, nFrames );
699 vInits = Vec_BitAlloc( Gia_ManRegNum(p) );
700 Gia_ManForEachRo( p, pObj, i )
701 Vec_BitPush( vInits, pObj->fMark0 );
702 pNew = Gia_ManDupFlip( p, Vec_BitArray(vInits) );
703 Vec_BitFree( vInits );
705 return pNew;
706}
707
708
721{
722 Gia_Man_t * pNew;
723 Gia_Obj_t * pObj;
724 int i;
725 pNew = Gia_ManStart( Gia_ManObjNum(p) );
726 pNew->pName = Abc_UtilStrsav( p->pName );
727 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
728 if ( Gia_ManHasChoices(p) )
729 pNew->pSibls = ABC_CALLOC( int, Gia_ManObjNum(p) );
730 Gia_ManConst0(p)->Value = 0;
731 Gia_ManForEachObj1( p, pObj, i )
732 {
733 if ( Gia_ObjIsBuf(pObj) )
734 pObj->Value = Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(pObj) );
735 else if ( Gia_ObjIsAnd(pObj) )
736 {
737 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
738 if ( Gia_ObjSibl(p, Gia_ObjId(p, pObj)) )
739 pNew->pSibls[Abc_Lit2Var(pObj->Value)] = Abc_Lit2Var(Gia_ObjSiblObj(p, Gia_ObjId(p, pObj))->Value);
740 }
741 else if ( Gia_ObjIsCi(pObj) )
742 pObj->Value = Gia_ManAppendCi( pNew );
743 else if ( Gia_ObjIsCo(pObj) )
744 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
745 }
746 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
747 if ( p->pCexSeq )
748 pNew->pCexSeq = Abc_CexDup( p->pCexSeq, Gia_ManRegNum(p) );
749 return pNew;
750}
752{
753 Gia_Man_t * pNew;
754 Gia_Obj_t * pObj;
755 int i;
756 assert( Gia_ManCiNum(p1) == Gia_ManCiNum(p2) );
757 assert( Gia_ManCoNum(p1) == Gia_ManCoNum(p2) );
758 pNew = Gia_ManStart( Gia_ManObjNum(p1) + Gia_ManObjNum(p2) );
759 Gia_ManHashStart( pNew );
760 Gia_ManConst0(p1)->Value = 0;
761 Gia_ManConst0(p2)->Value = 0;
762 Gia_ManForEachCi( p1, pObj, i )
763 pObj->Value = Gia_ManCi(p2, i)->Value = Gia_ManAppendCi( pNew );
764 Gia_ManForEachAnd( p1, pObj, i )
765 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
766 Gia_ManForEachAnd( p2, pObj, i )
767 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
768 Gia_ManForEachCo( p1, pObj, i )
769 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
770 Gia_ManForEachCo( p2, pObj, i )
771 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
772 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p1) );
773 Gia_ManHashStop( pNew );
774 return pNew;
775}
777{
778 Gia_Man_t * pNew = Gia_ManDup(p);
779 Gia_ManTransferMapping( pNew, p );
780 Gia_ManTransferPacking( pNew, p );
781 if ( p->pManTime )
782 pNew->pManTime = Tim_ManDup( (Tim_Man_t *)p->pManTime, 0 );
783 if ( p->pAigExtra )
784 pNew->pAigExtra = Gia_ManDup( p->pAigExtra );
785 if ( p->nAnd2Delay )
786 pNew->nAnd2Delay = p->nAnd2Delay;
787 if ( p->vRegClasses )
788 pNew->vRegClasses = Vec_IntDup( p->vRegClasses );
789 if ( p->vRegInits )
790 pNew->vRegInits = Vec_IntDup( p->vRegInits );
791 if ( p->vConfigs )
792 pNew->vConfigs = Vec_IntDup( p->vConfigs );
793 if ( p->pCellStr )
794 pNew->pCellStr = Abc_UtilStrsav( p->pCellStr );
795 // copy names if present
796 if ( p->vNamesIn )
797 pNew->vNamesIn = Vec_PtrDupStr( p->vNamesIn );
798 if ( p->vNamesOut )
799 pNew->vNamesOut = Vec_PtrDupStr( p->vNamesOut );
800 return pNew;
801}
803{
804 Gia_Man_t * pNew;
805 Gia_Obj_t * pObj;
806 int i;
807 pNew = Gia_ManStart( Gia_ManObjNum(p) );
808 pNew->pName = Abc_UtilStrsav( p->pName );
809 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
810 Gia_ManConst0(p)->Value = 0;
811 Gia_ManForEachObj1( p, pObj, i )
812 {
813 if ( Gia_ObjIsAnd(pObj) )
814 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
815 else if ( Gia_ObjIsCi(pObj) && Gia_ObjCioId(pObj) < Gia_ManCiNum(p)-nRemPis )
816 pObj->Value = Gia_ManAppendCi( pNew );
817 else if ( Gia_ObjIsCo(pObj) )
818 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
819 }
820 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
821 return pNew;
822}
824{
825 Gia_Man_t * pNew;
826 Gia_Obj_t * pObj;
827 int i;
828 pNew = Gia_ManStart( Gia_ManObjNum(p) );
829 pNew->pName = Abc_UtilStrsav( p->pName );
830 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
831 Gia_ManConst0(p)->Value = 0;
832 Gia_ManForEachObj1( p, pObj, i )
833 {
834 if ( Gia_ObjIsBuf(pObj) )
835 pObj->Value = Gia_ObjFanin0Copy(pObj);
836 else if ( Gia_ObjIsAnd(pObj) )
837 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
838 else if ( Gia_ObjIsCi(pObj) )
839 pObj->Value = Gia_ManAppendCi( pNew );
840 else if ( Gia_ObjIsCo(pObj) )
841 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
842 }
843 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
844 return pNew;
845}
847{
848 Gia_Man_t * pNew, * pTemp;
849 Gia_Obj_t * pObj;
850 int i;
851 pNew = Gia_ManStart( Gia_ManObjNum(p) );
852 pNew->pName = Abc_UtilStrsav( p->pName );
853 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
854 Gia_ManConst0(p)->Value = 0;
855 Gia_ManHashAlloc( pNew );
856 Gia_ManForEachObj1( p, pObj, i )
857 {
858 if ( Vec_IntEntry(vMap, i) >= 0 )
859 pObj->Value = Gia_ManObj( p, Vec_IntEntry(vMap, i) )->Value;
860 else if ( Gia_ObjIsAnd(pObj) )
861 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
862 else if ( Gia_ObjIsCi(pObj) )
863 pObj->Value = Gia_ManAppendCi( pNew );
864 else if ( Gia_ObjIsCo(pObj) )
865 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
866 }
867 pNew = Gia_ManCleanup( pTemp = pNew );
868 Gia_ManStop( pTemp );
869 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
870 return pNew;
871}
873{
874 Gia_Man_t * pNew;
875 Gia_Obj_t * pObj;
876 int i;
877 pNew = Gia_ManStart( Gia_ManObjNum(p) + Gia_ManCiNum(p) + Gia_ManCoNum(p) );
878 Gia_ManHashStart( pNew );
879 Gia_ManConst0(p)->Value = 0;
880 Gia_ManForEachCi( p, pObj, i )
881 pObj->Value = Gia_ManAppendCi( pNew );
882 Gia_ManForEachCi( p, pObj, i )
883 pObj->Value = Gia_ManAppendBuf( pNew, pObj->Value );
884 Gia_ManForEachAnd( p, pObj, i )
885 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
886 Gia_ManForEachCo( p, pObj, i )
887 pObj->Value = Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(pObj) );
888 Gia_ManForEachCo( p, pObj, i )
889 pObj->Value = Gia_ManAppendCo( pNew, pObj->Value );
890 Gia_ManHashStop( pNew );
891 return pNew;
892}
893
906{
907 Gia_Man_t * pNew; int i;
908 pNew = Gia_ManStart( 1 + Gia_ManCiNum(p) + Gia_ManCoNum(p) );
909 pNew->pName = Abc_UtilStrsav( p->pName );
910 for ( i = 0; i < Gia_ManCiNum(p); i++ )
911 Gia_ManAppendCi( pNew );
912 for ( i = 0; i < Gia_ManCoNum(p); i++ )
913 Gia_ManAppendCo( pNew, 0 );
914 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
915 return pNew;
916}
917
930{
931// Vec_Int_t * vPiPermInv;
932 Gia_Man_t * pNew;
933 Gia_Obj_t * pObj;
934 int i;
935 assert( Vec_IntSize(vPiPerm) == Gia_ManPiNum(p) );
936 pNew = Gia_ManStart( Gia_ManObjNum(p) );
937 pNew->pName = Abc_UtilStrsav( p->pName );
938 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
939 Gia_ManConst0(p)->Value = 0;
940// vPiPermInv = Vec_IntInvert( vPiPerm, -1 );
941 Gia_ManForEachPi( p, pObj, i )
942// Gia_ManPi(p, Vec_IntEntry(vPiPermInv,i))->Value = Gia_ManAppendCi( pNew );
943 Gia_ManPi(p, Vec_IntEntry(vPiPerm,i))->Value = Gia_ManAppendCi( pNew );
944// Vec_IntFree( vPiPermInv );
945 Gia_ManForEachObj1( p, pObj, i )
946 {
947 if ( Gia_ObjIsBuf(pObj) )
948 pObj->Value = Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(pObj) );
949 else if ( Gia_ObjIsAnd(pObj) )
950 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
951 else if ( Gia_ObjIsCi(pObj) )
952 {
953 if ( Gia_ObjIsRo(p, pObj) )
954 pObj->Value = Gia_ManAppendCi( pNew );
955 }
956 else if ( Gia_ObjIsCo(pObj) )
957 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
958 }
959 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
960 return pNew;
961}
963{
964 //Vec_Int_t * vPermInv;
965 Gia_Man_t * pNew;
966 Gia_Obj_t * pObj;
967 int i;
968 assert( Vec_IntSize(vFfPerm) == Gia_ManRegNum(p) );
969 //vPermInv = Vec_IntInvert( vFfPerm, -1 );
970 pNew = Gia_ManStart( Gia_ManObjNum(p) );
971 pNew->pName = Abc_UtilStrsav( p->pName );
972 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
973 Gia_ManConst0(p)->Value = 0;
974 Gia_ManForEachPi( p, pObj, i )
975 pObj->Value = Gia_ManAppendCi(pNew);
976 Gia_ManForEachRo( p, pObj, i )
977 //Gia_ManRo(p, Vec_IntEntry(vPermInv, i))->Value = Gia_ManAppendCi(pNew);
978 Gia_ManRo(p, Vec_IntEntry(vFfPerm, i))->Value = Gia_ManAppendCi( pNew );
979 Gia_ManForEachAnd( p, pObj, i )
980 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
981 Gia_ManForEachPo( p, pObj, i )
982 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
983 Gia_ManForEachRi( p, pObj, i )
984 //pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy( Gia_ManRi(p, Vec_IntEntry(vPermInv, i)) ) );
985 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy( Gia_ManRi(p, Vec_IntEntry(vFfPerm, i)) ) );
986 //Vec_IntFree( vPermInv );
987 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
988 return pNew;
989}
991{
992 Gia_Man_t * pNew;
993 Gia_Obj_t * pObj;
994 int i, k, Entry;
995 assert( Vec_IntSize(vFfMask) >= Gia_ManRegNum(p) );
996 pNew = Gia_ManStart( Gia_ManObjNum(p) );
997 pNew->pName = Abc_UtilStrsav( p->pName );
998 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
999 Gia_ManConst0(p)->Value = 0;
1000 Gia_ManForEachPi( p, pObj, i )
1001 pObj->Value = Gia_ManAppendCi(pNew);
1002 k = 0;
1003 Vec_IntForEachEntry( vFfMask, Entry, i )
1004 if ( Entry == -1 )
1005 Gia_ManAppendCi(pNew);
1006 else
1007 Gia_ManRo(p, k++)->Value = Gia_ManAppendCi(pNew);
1008 assert( k == Gia_ManRegNum(p) );
1009 Gia_ManForEachAnd( p, pObj, i )
1010 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1011 Gia_ManForEachPo( p, pObj, i )
1012 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1013 k = 0;
1014 Vec_IntForEachEntry( vFfMask, Entry, i )
1015 if ( Entry == -1 )
1016 Gia_ManAppendCo( pNew, 0 );
1017 else
1018 {
1019 pObj = Gia_ManRi( p, k++ );
1020 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1021 }
1022 assert( k == Gia_ManRegNum(p) );
1023 Gia_ManSetRegNum( pNew, Vec_IntSize(vFfMask) );
1024 return pNew;
1025}
1027{
1028 Vec_Int_t * vPerm = Vec_IntCondense( vFfMask, -1 );
1029 Gia_Man_t * pPerm = Gia_ManDupPermFlop( p, vPerm );
1030 Gia_Man_t * pSpread = Gia_ManDupSpreadFlop( pPerm, vFfMask );
1031 Vec_IntFree( vPerm );
1032 Gia_ManStop( pPerm );
1033 return pSpread;
1034}
1035
1048{
1049 Gia_Man_t * pNew, * pOne;
1050 Gia_Obj_t * pObj;
1051 int i;
1052 Gia_ManRandom(1);
1053 pNew = Gia_ManStart( Gia_ManObjNum(p) );
1054 pNew->pName = Abc_UtilStrsav( p->pName );
1055 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
1056 Gia_ManHashAlloc( pNew );
1057 Gia_ManConst0(p)->Value = 0;
1058 Gia_ManForEachCi( p, pObj, i )
1059 pObj->Value = Gia_ManAppendCi( pNew );
1060 Gia_ManForEachAnd( p, pObj, i )
1061 {
1062 int iLit0 = Gia_ObjFanin0Copy(pObj);
1063 int iLit1 = Gia_ObjFanin1Copy(pObj);
1064 int iPlace0 = Gia_ManRandom(0) % Gia_ManCiNum(p);
1065 int iPlace1 = Gia_ManRandom(0) % Gia_ManCiNum(p);
1066 if ( Abc_Lit2Var(iLit0) <= Gia_ManCiNum(p) )
1067 iLit0 = Abc_Var2Lit( iPlace0+1, Abc_LitIsCompl(iLit0) );
1068 if ( Abc_Lit2Var(iLit1) <= Gia_ManCiNum(p) )
1069 iLit1 = Abc_Var2Lit( iPlace1+1, Abc_LitIsCompl(iLit1) );
1070 pObj->Value = Gia_ManHashAnd( pNew, iLit0, iLit1 );
1071 }
1072 Gia_ManForEachCo( p, pObj, i )
1073 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1074 Gia_ManHashStop( pNew );
1075 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
1076 pNew = Gia_ManCleanup( pOne = pNew );
1077 Gia_ManStop( pOne );
1078 return pNew;
1079}
1080
1093{
1094 Vec_Int_t * vPerm = Vec_IntStartNatural( n );
1095 int i, * pPerm = Vec_IntArray( vPerm );
1096 for ( i = 0; i < n; i++ )
1097 {
1098 int j = Abc_Random(0) % n;
1099 ABC_SWAP( int, pPerm[i], pPerm[j] );
1100
1101 }
1102 return vPerm;
1103}
1105{
1106 Vec_Int_t * vPiPerm = Gia_ManCreatePerm( Gia_ManCiNum(p) );
1107 Vec_Int_t * vPoPerm = Gia_ManCreatePerm( Gia_ManCoNum(p) );
1108 Gia_Man_t * pNew;
1109 Gia_Obj_t * pObj;
1110 int i;
1111 pNew = Gia_ManStart( Gia_ManObjNum(p) );
1112 pNew->pName = Abc_UtilStrsav( p->pName );
1113 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
1114 Gia_ManConst0(p)->Value = 0;
1115 Gia_ManForEachPi( p, pObj, i )
1116 Gia_ManPi(p, Vec_IntEntry(vPiPerm,i))->Value = Gia_ManAppendCi(pNew) ^ (Abc_Random(0) & 1);
1117 Gia_ManForEachAnd( p, pObj, i )
1118 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1119 Gia_ManForEachPo( p, pObj, i )
1120 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(Gia_ManPo(p, Vec_IntEntry(vPoPerm,i))) ^ (Abc_Random(0) & 1) );
1121 Vec_IntFree( vPiPerm );
1122 Vec_IntFree( vPoPerm );
1123 return pNew;
1124}
1125
1138{
1139 Gia_Obj_t * pObj;
1140 int i;
1141 if ( pNew->nRegs > 0 )
1142 pNew->nRegs = 0;
1143 if ( Vec_IntSize(&pNew->vHTable) == 0 )
1144 Gia_ManHashStart( pNew );
1145 Gia_ManConst0(pTwo)->Value = 0;
1146 Gia_ManForEachObj1( pTwo, pObj, i )
1147 {
1148 if ( Gia_ObjIsAnd(pObj) )
1149 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1150 else if ( Gia_ObjIsCi(pObj) )
1151 pObj->Value = Gia_ManAppendCi( pNew );
1152 else if ( Gia_ObjIsCo(pObj) )
1153 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1154 }
1155}
1157{
1158 Gia_Obj_t * pObj;
1159 int i;
1160 assert( Gia_ManCiNum(pNew) == Gia_ManCiNum(pTwo) );
1161 if ( Vec_IntSize(&pNew->vHTable) == 0 )
1162 Gia_ManHashStart( pNew );
1163 Gia_ManConst0(pTwo)->Value = 0;
1164 Gia_ManForEachObj1( pTwo, pObj, i )
1165 {
1166 if ( Gia_ObjIsAnd(pObj) )
1167 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1168 else if ( Gia_ObjIsCi(pObj) )
1169 pObj->Value = Gia_Obj2Lit( pNew, Gia_ManCi( pNew, Gia_ObjCioId(pObj) ) );
1170 else if ( Gia_ObjIsCo(pObj) )
1171 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1172 }
1173}
1175{
1176 Gia_Man_t * pNew;
1177 Gia_Obj_t * pObj;
1178 int i;
1179 pNew = Gia_ManStart( Gia_ManObjNum(pOne) + Gia_ManObjNum(pTwo) );
1180 pNew->pName = Abc_UtilStrsav( pOne->pName );
1181 pNew->pSpec = Abc_UtilStrsav( pOne->pSpec );
1182 Gia_ManHashAlloc( pNew );
1183 Gia_ManConst0(pOne)->Value = 0;
1184 Gia_ManForEachObj1( pOne, pObj, i )
1185 {
1186 if ( Gia_ObjIsAnd(pObj) )
1187 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1188 else if ( Gia_ObjIsCi(pObj) )
1189 pObj->Value = Gia_ManAppendCi( pNew );
1190 }
1191 Gia_ManConst0(pTwo)->Value = 0;
1192 Gia_ManForEachObj1( pTwo, pObj, i )
1193 {
1194 if ( Gia_ObjIsAnd(pObj) )
1195 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1196 else if ( Gia_ObjIsPi(pTwo, pObj) )
1197 pObj->Value = Gia_ManPi(pOne, Gia_ObjCioId(pObj))->Value;
1198 else if ( Gia_ObjIsCi(pObj) )
1199 pObj->Value = Gia_ManAppendCi( pNew );
1200 }
1201 Gia_ManHashStop( pNew );
1202 // primary outputs
1203 Gia_ManForEachPo( pOne, pObj, i )
1204 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1205 Gia_ManForEachPo( pTwo, pObj, i )
1206 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1207 // flop inputs
1208 Gia_ManForEachRi( pOne, pObj, i )
1209 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1210 Gia_ManForEachRi( pTwo, pObj, i )
1211 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1212 Gia_ManSetRegNum( pNew, Gia_ManRegNum(pOne) + Gia_ManRegNum(pTwo) );
1213 return pNew;
1214}
1215void Gia_ManDupRebuild( Gia_Man_t * pNew, Gia_Man_t * p, Vec_Int_t * vLits, int fBufs )
1216{
1217 Gia_Obj_t * pObj; int i;
1218 assert( Vec_IntSize(vLits) == Gia_ManCiNum(p) );
1219 Gia_ManConst0(p)->Value = 0;
1220 Gia_ManForEachCi( p, pObj, i )
1221 pObj->Value = Vec_IntEntry(vLits, i);
1222 Gia_ManForEachAnd( p, pObj, i )
1223 if ( fBufs && Gia_ObjIsBuf(pObj) )
1224 pObj->Value = Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(pObj) );
1225 else
1226 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1227 Vec_IntClear( vLits );
1228 Gia_ManForEachCo( p, pObj, i )
1229 Vec_IntPush( vLits, Gia_ObjFanin0Copy(pObj) );
1230 assert( Vec_IntSize(vLits) == Gia_ManCoNum(p) );
1231}
1232
1248{
1249 Gia_Man_t * pNew, * pTemp;
1250 Gia_Obj_t * pObj;
1251 int i, Node1, Node2, Node;
1252 assert( Gia_ManRegNum(p) > 0 );
1253 assert( Gia_ManRegNum(pInv) == 0 );
1254 assert( Gia_ManCoNum(pInv) == 1 );
1255 assert( Gia_ManRegNum(p) == Gia_ManCiNum(pInv) );
1257 pNew = Gia_ManStart( Gia_ManObjNum(p) + 2*Gia_ManObjNum(pInv) );
1258 pNew->pName = Abc_UtilStrsav( p->pName );
1259 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
1260 Gia_ManHashAlloc( pNew );
1261 Gia_ManConst0(p)->Value = 0;
1262 Gia_ManForEachObj1( p, pObj, i )
1263 {
1264 if ( Gia_ObjIsAnd(pObj) )
1265 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1266 else if ( Gia_ObjIsCi(pObj) )
1267 pObj->Value = Gia_ManAppendCi( pNew );
1268 else if ( Gia_ObjIsCo(pObj) )
1269 pObj->Value = Gia_ObjFanin0Copy(pObj);
1270 }
1271 // build invariant on top of register outputs in the first frame
1272 Gia_ManForEachRo( p, pObj, i )
1273 Gia_ManCi(pInv, i)->Value = pObj->Value;
1274 Gia_ManForEachAnd( pInv, pObj, i )
1275 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1276 pObj = Gia_ManCo( pInv, 0 );
1277 Node1 = Gia_ObjFanin0Copy(pObj);
1278 // build invariant on top of register outputs in the second frame
1279 Gia_ManForEachRi( p, pObj, i )
1280 Gia_ManCi(pInv, i)->Value = pObj->Value;
1281 Gia_ManForEachAnd( pInv, pObj, i )
1282 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1283 pObj = Gia_ManCo( pInv, 0 );
1284 Node2 = Gia_ObjFanin0Copy(pObj);
1285 // create miter output
1286 Node = Gia_ManHashAnd( pNew, Node1, Abc_LitNot(Node2) );
1287 Gia_ManAppendCo( pNew, Node );
1288 // cleanup
1289 pNew = Gia_ManCleanup( pTemp = pNew );
1290 Gia_ManStop( pTemp );
1291 return pNew;
1292}
1293
1305Gia_Man_t * Gia_ManDupAppendCones( Gia_Man_t * p, Gia_Man_t ** ppCones, int nCones, int fOnlyRegs )
1306{
1307 Gia_Man_t * pNew, * pOne;
1308 Gia_Obj_t * pObj;
1309 int i, k;
1310 pNew = Gia_ManStart( Gia_ManObjNum(p) );
1311 pNew->pName = Abc_UtilStrsav( p->pName );
1312 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
1313 Gia_ManHashAlloc( pNew );
1314 Gia_ManConst0(p)->Value = 0;
1315 Gia_ManForEachCi( p, pObj, i )
1316 pObj->Value = Gia_ManAppendCi( pNew );
1317 Gia_ManForEachAnd( p, pObj, i )
1318 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1319 Gia_ManForEachPo( p, pObj, i )
1320 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1321 for ( k = 0; k < nCones; k++ )
1322 {
1323 pOne = ppCones[k];
1324 assert( Gia_ManPoNum(pOne) == 1 );
1325 assert( Gia_ManRegNum(pOne) == 0 );
1326 if ( fOnlyRegs )
1327 assert( Gia_ManPiNum(pOne) == Gia_ManRegNum(p) );
1328 else
1329 assert( Gia_ManPiNum(pOne) == Gia_ManCiNum(p) );
1330 Gia_ManConst0(pOne)->Value = 0;
1331 Gia_ManForEachPi( pOne, pObj, i )
1332 pObj->Value = Gia_ManCiLit( pNew, fOnlyRegs ? Gia_ManPiNum(p) + i : i );
1333 Gia_ManForEachAnd( pOne, pObj, i )
1334 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1335 Gia_ManForEachPo( pOne, pObj, i )
1336 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1337 }
1338 Gia_ManForEachRi( p, pObj, i )
1339 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1340 Gia_ManHashStop( pNew );
1341 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
1342 pNew = Gia_ManCleanup( pOne = pNew );
1343 Gia_ManStop( pOne );
1344 return pNew;
1345}
1346
1347
1360{
1361 Gia_Man_t * pNew, * pTemp;
1362 Gia_Obj_t * pObj;
1363 int i, iCtrl;
1364 pNew = Gia_ManStart( Gia_ManObjNum(p) );
1365 pNew->pName = Abc_UtilStrsav( p->pName );
1366 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
1367 Gia_ManHashAlloc( pNew );
1369 Gia_ManConst0(p)->Value = 0;
1370 iCtrl = Gia_ManAppendCi( pNew );
1371 Gia_ManForEachCi( p, pObj, i )
1372 pObj->Value = Gia_ManAppendCi( pNew );
1373 Gia_ManForEachAnd( p, pObj, i )
1374 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1375 Gia_ManForEachPo( p, pObj, i )
1376 pObj->Value = Gia_ObjFanin0Copy(pObj);
1377 Gia_ManForEachRi( p, pObj, i )
1378 pObj->Value = Gia_ManHashMux( pNew, iCtrl, Gia_ObjFanin0Copy(pObj), Gia_ObjRiToRo(p, pObj)->Value );
1379 Gia_ManForEachCo( p, pObj, i )
1380 Gia_ManAppendCo( pNew, pObj->Value );
1381 Gia_ManHashStop( pNew );
1382 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
1383 pNew = Gia_ManCleanup( pTemp = pNew );
1384 Gia_ManStop( pTemp );
1385 return pNew;
1386}
1387
1400{
1401 Gia_Man_t * pNew;
1402 Gia_Obj_t * pObj;
1403 int i, Counter1 = 0, Counter2 = 0;
1404 assert( p->vFlopClasses != NULL );
1405 pNew = Gia_ManStart( Gia_ManObjNum(p) );
1406 pNew->pName = Abc_UtilStrsav( p->pName );
1407 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
1409 Gia_ManConst0(p)->Value = 0;
1410 Gia_ManForEachPi( p, pObj, i )
1411 pObj->Value = Gia_ManAppendCi( pNew );
1412 Gia_ManForEachRo( p, pObj, i )
1413 if ( Vec_IntEntry(p->vFlopClasses, i) != iClass )
1414 pObj->Value = Gia_ManAppendCi( pNew );
1415 Gia_ManForEachRo( p, pObj, i )
1416 if ( Vec_IntEntry(p->vFlopClasses, i) == iClass )
1417 pObj->Value = Gia_ManAppendCi( pNew ), Counter1++;
1418 Gia_ManForEachAnd( p, pObj, i )
1419 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1420 Gia_ManForEachPo( p, pObj, i )
1421 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1422 Gia_ManForEachRi( p, pObj, i )
1423 if ( Vec_IntEntry(p->vFlopClasses, i) != iClass )
1424 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1425 Gia_ManForEachRi( p, pObj, i )
1426 if ( Vec_IntEntry(p->vFlopClasses, i) == iClass )
1427 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) ), Counter2++;
1428 assert( Counter1 == Counter2 );
1429 Gia_ManSetRegNum( pNew, Counter1 );
1430 return pNew;
1431}
1432
1445{
1446 Gia_Man_t * pNew;
1447 Gia_Obj_t * pObj;
1448 int i, nRos = 0, nRis = 0;
1449 int CountMarked = 0;
1450 Gia_ManForEachObj( p, pObj, i )
1451 CountMarked += pObj->fMark0;
1453 pNew = Gia_ManStart( Gia_ManObjNum(p) - CountMarked );
1454 if ( p->pMuxes )
1455 pNew->pMuxes = ABC_CALLOC( unsigned, pNew->nObjsAlloc );
1456 pNew->nConstrs = p->nConstrs;
1457 pNew->pName = Abc_UtilStrsav( p->pName );
1458 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
1459 Gia_ManConst0(p)->Value = 0;
1460 Gia_ManForEachObj1( p, pObj, i )
1461 {
1462 if ( pObj->fMark0 )
1463 {
1464 assert( !Gia_ObjIsBuf(pObj) );
1465 pObj->fMark0 = 0;
1466 continue;
1467 }
1468 if ( Gia_ObjIsBuf(pObj) )
1469 pObj->Value = Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(pObj) );
1470 else if ( Gia_ObjIsAnd(pObj) )
1471 {
1472 if ( Gia_ObjIsXor(pObj) )
1473 pObj->Value = Gia_ManAppendXorReal( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1474 else if ( Gia_ObjIsMux(p, pObj) )
1475 pObj->Value = Gia_ManAppendMuxReal( pNew, Gia_ObjFanin2Copy(p, pObj), Gia_ObjFanin1Copy(pObj), Gia_ObjFanin0Copy(pObj) );
1476 else
1477 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1478 }
1479 else if ( Gia_ObjIsCi(pObj) )
1480 {
1481 pObj->Value = Gia_ManAppendCi( pNew );
1482 nRos += Gia_ObjIsRo(p, pObj);
1483 }
1484 else if ( Gia_ObjIsCo(pObj) )
1485 {
1486// Gia_Obj_t * pFanin = Gia_ObjFanin0(pObj);
1487 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1488 nRis += Gia_ObjIsRi(p, pObj);
1489 }
1490 }
1491 assert( pNew->nObjsAlloc == pNew->nObjs );
1492 assert( nRos == nRis );
1493 Gia_ManSetRegNum( pNew, nRos );
1494 if ( p->pReprs && p->pNexts )
1495 {
1496 Gia_Obj_t * pRepr;
1497 pNew->pReprs = ABC_CALLOC( Gia_Rpr_t, Gia_ManObjNum(pNew) );
1498 for ( i = 0; i < Gia_ManObjNum(pNew); i++ )
1499 Gia_ObjSetRepr( pNew, i, GIA_VOID );
1500 Gia_ManForEachObj1( p, pObj, i )
1501 {
1502 if ( !~pObj->Value )
1503 continue;
1504 pRepr = Gia_ObjReprObj( p, i );
1505 if ( pRepr == NULL )
1506 continue;
1507 if ( !~pRepr->Value )
1508 continue;
1509 assert( !Gia_ObjIsBuf(pObj) );
1510 if ( Abc_Lit2Var(pObj->Value) != Abc_Lit2Var(pRepr->Value) )
1511 Gia_ObjSetRepr( pNew, Abc_Lit2Var(pObj->Value), Abc_Lit2Var(pRepr->Value) );
1512 }
1513 pNew->pNexts = Gia_ManDeriveNexts( pNew );
1514 }
1515 if ( Gia_ManHasChoices(p) )
1516 {
1517 Gia_Obj_t * pSibl;
1518 pNew->pSibls = ABC_CALLOC( int, Gia_ManObjNum(pNew) );
1519 Gia_ManForEachObj1( p, pObj, i )
1520 {
1521 if ( !~pObj->Value )
1522 continue;
1523 pSibl = Gia_ObjSiblObj( p, i );
1524 if ( pSibl == NULL )
1525 continue;
1526 if ( !~pSibl->Value )
1527 continue;
1528 assert( !Gia_ObjIsBuf(pObj) );
1529 assert( Abc_Lit2Var(pObj->Value) > Abc_Lit2Var(pSibl->Value) );
1530 pNew->pSibls[Abc_Lit2Var(pObj->Value)] = Abc_Lit2Var(pSibl->Value);
1531 }
1532 }
1533 return pNew;
1534}
1535
1548{
1549 Gia_Man_t * pNew;
1550 Gia_Obj_t * pObj;
1551 Vec_Int_t * vPis, * vPos, * vRis, * vRos;
1552 int i, t, Entry;
1553 assert( nTimes > 0 );
1554 pNew = Gia_ManStart( Gia_ManObjNum(p) );
1555 pNew->pName = Abc_UtilStrsav( p->pName );
1556 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
1557 Gia_ManConst0(p)->Value = 0;
1558 vPis = Vec_IntAlloc( Gia_ManPiNum(p) * nTimes );
1559 vPos = Vec_IntAlloc( Gia_ManPoNum(p) * nTimes );
1560 vRis = Vec_IntAlloc( Gia_ManRegNum(p) * nTimes );
1561 vRos = Vec_IntAlloc( Gia_ManRegNum(p) * nTimes );
1562 for ( t = 0; t < nTimes; t++ )
1563 {
1564 Gia_ManForEachObj1( p, pObj, i )
1565 {
1566 if ( Gia_ObjIsAnd(pObj) )
1567 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1568 else if ( Gia_ObjIsCi(pObj) )
1569 {
1570 pObj->Value = Gia_ManAppendCi( pNew );
1571 if ( Gia_ObjIsPi(p, pObj) )
1572 Vec_IntPush( vPis, Abc_Lit2Var(pObj->Value) );
1573 else
1574 Vec_IntPush( vRos, Abc_Lit2Var(pObj->Value) );
1575 }
1576 else if ( Gia_ObjIsCo(pObj) )
1577 {
1578 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1579 if ( Gia_ObjIsPo(p, pObj) )
1580 Vec_IntPush( vPos, Abc_Lit2Var(pObj->Value) );
1581 else
1582 Vec_IntPush( vRis, Abc_Lit2Var(pObj->Value) );
1583 }
1584 }
1585 }
1586 Vec_IntClear( pNew->vCis );
1587 Vec_IntForEachEntry( vPis, Entry, i )
1588 {
1589 Gia_ObjSetCioId( Gia_ManObj(pNew, Entry), Vec_IntSize(pNew->vCis) );
1590 Vec_IntPush( pNew->vCis, Entry );
1591 }
1592 Vec_IntForEachEntry( vRos, Entry, i )
1593 {
1594 Gia_ObjSetCioId( Gia_ManObj(pNew, Entry), Vec_IntSize(pNew->vCis) );
1595 Vec_IntPush( pNew->vCis, Entry );
1596 }
1597 Vec_IntClear( pNew->vCos );
1598 Vec_IntForEachEntry( vPos, Entry, i )
1599 {
1600 Gia_ObjSetCioId( Gia_ManObj(pNew, Entry), Vec_IntSize(pNew->vCos) );
1601 Vec_IntPush( pNew->vCos, Entry );
1602 }
1603 Vec_IntForEachEntry( vRis, Entry, i )
1604 {
1605 Gia_ObjSetCioId( Gia_ManObj(pNew, Entry), Vec_IntSize(pNew->vCos) );
1606 Vec_IntPush( pNew->vCos, Entry );
1607 }
1608 Vec_IntFree( vPis );
1609 Vec_IntFree( vPos );
1610 Vec_IntFree( vRis );
1611 Vec_IntFree( vRos );
1612 Gia_ManSetRegNum( pNew, nTimes * Gia_ManRegNum(p) );
1613 return pNew;
1614}
1615
1628{
1629 Vec_Int_t * vTemp = Vec_IntAlloc( 100 );
1630 Gia_Man_t * pNew, * pTemp;
1631 Gia_Obj_t * pObj;
1632 int i, iLit0, iLit1;
1633 pNew = Gia_ManStart( Gia_ManObjNum(p) + 3 * Vec_IntSize(vPairs) );
1634 pNew->pName = Abc_UtilStrsav( "miter" );
1635 Gia_ManHashAlloc( pNew );
1637 Gia_ManConst0(p)->Value = 0;
1638 Gia_ManForEachCi( p, pObj, i )
1639 pObj->Value = Gia_ManAppendCi( pNew );
1640 Gia_ManForEachAnd( p, pObj, i )
1641 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1642 Vec_IntForEachEntryDouble( vPairs, iLit0, iLit1, i )
1643 {
1644 int Lit0 = Abc_LitNotCond( Gia_ManObj(p, Abc_Lit2Var(iLit0))->Value, Abc_LitIsCompl(iLit0) );
1645 int Lit1 = Abc_LitNotCond( Gia_ManObj(p, Abc_Lit2Var(iLit1))->Value, Abc_LitIsCompl(iLit1) );
1646 Vec_IntPush( vTemp, Gia_ManHashXor(pNew, Lit0, Lit1) );
1647 }
1648 Vec_IntForEachEntry( vTemp, iLit0, i )
1649 Gia_ManAppendCo( pNew, iLit0 );
1650 Vec_IntFree( vTemp );
1651 Gia_ManHashStop( pNew );
1652 pNew = Gia_ManCleanup( pTemp = pNew );
1653 Gia_ManStop( pTemp );
1654 return pNew;
1655}
1656
1669{
1670 if ( ~pObj->Value )
1671 return pObj->Value;
1672 if ( p->pReprsOld && ~p->pReprsOld[Gia_ObjId(p, pObj)] )
1673 {
1674 Gia_Obj_t * pRepr = Gia_ManObj( p, p->pReprsOld[Gia_ObjId(p, pObj)] );
1675 pRepr->Value = Gia_ManDupDfs2_rec( pNew, p, pRepr );
1676 return pObj->Value = Abc_LitNotCond( pRepr->Value, Gia_ObjPhaseReal(pRepr) ^ Gia_ObjPhaseReal(pObj) );
1677 }
1678 if ( Gia_ObjIsCi(pObj) )
1679 return pObj->Value = Gia_ManAppendCi(pNew);
1680 Gia_ManDupDfs2_rec( pNew, p, Gia_ObjFanin0(pObj) );
1681 if ( Gia_ObjIsCo(pObj) )
1682 return pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1683 Gia_ManDupDfs2_rec( pNew, p, Gia_ObjFanin1(pObj) );
1684 if ( Vec_IntSize(&pNew->vHTable) )
1685 return pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1686 return pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1687}
1688
1701{
1702 Gia_Man_t * pNew;
1703 Gia_Obj_t * pObj, * pObjNew;
1704 int i;
1706 pNew = Gia_ManStart( Gia_ManObjNum(p) );
1707 pNew->pName = Abc_UtilStrsav( p->pName );
1708 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
1709 Gia_ManConst0(p)->Value = 0;
1710 Gia_ManForEachCo( p, pObj, i )
1711 Gia_ManDupDfs2_rec( pNew, p, pObj );
1712 Gia_ManForEachCi( p, pObj, i )
1713 if ( ~pObj->Value == 0 )
1714 pObj->Value = Gia_ManAppendCi(pNew);
1715 assert( Gia_ManCiNum(pNew) == Gia_ManCiNum(p) );
1716 // remap combinational inputs
1717 Gia_ManForEachCi( p, pObj, i )
1718 {
1719 pObjNew = Gia_ObjFromLit( pNew, pObj->Value );
1720 assert( !Gia_IsComplement(pObjNew) );
1721 Vec_IntWriteEntry( pNew->vCis, Gia_ObjCioId(pObj), Gia_ObjId(pNew, pObjNew) );
1722 Gia_ObjSetCioId( pObjNew, Gia_ObjCioId(pObj) );
1723 }
1724 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
1725 return pNew;
1726}
1727
1740{
1741 if ( ~pObj->Value )
1742 return;
1743 assert( Gia_ObjIsAnd(pObj) );
1744 Gia_ManDupDfs_rec( pNew, p, Gia_ObjFanin0(pObj) );
1745 Gia_ManDupDfs_rec( pNew, p, Gia_ObjFanin1(pObj) );
1746 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1747}
1749{
1750 Gia_Man_t * pNew;
1751 Gia_Obj_t * pObj;
1752 int i;
1753 pNew = Gia_ManStart( Gia_ManObjNum(p) );
1754 pNew->pName = Abc_UtilStrsav( p->pName );
1755 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
1757 Gia_ManConst0(p)->Value = 0;
1758 Gia_ManForEachCi( p, pObj, i )
1759 pObj->Value = Gia_ManAppendCi(pNew);
1760 Gia_ManForEachCo( p, pObj, i )
1761 Gia_ManDupDfs_rec( pNew, p, Gia_ObjFanin0(pObj) );
1762 Gia_ManForEachCo( p, pObj, i )
1763 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1764 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
1765 pNew->nConstrs = p->nConstrs;
1766 if ( p->pCexSeq )
1767 pNew->pCexSeq = Abc_CexDup( p->pCexSeq, Gia_ManRegNum(p) );
1768 return pNew;
1769}
1771{
1772 Gia_Man_t * pNew, * pTemp;
1773 Gia_Obj_t * pObj;
1774 int i;
1775 assert( iPo >= 0 && iPo < Gia_ManPoNum(p) );
1776 pNew = Gia_ManStart( Gia_ManObjNum(p) );
1777 pNew->pName = Abc_UtilStrsav( p->pName );
1778 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
1780 Gia_ManConst0(p)->Value = 0;
1781 Gia_ManForEachCi( p, pObj, i )
1782 pObj->Value = Gia_ManAppendCi(pNew);
1783 Gia_ManForEachCo( p, pObj, i )
1784 if ( !Gia_ObjIsPo(p, pObj) || i == iPo )
1785 Gia_ManDupDfs_rec( pNew, p, Gia_ObjFanin0(pObj) );
1786 Gia_ManForEachCo( p, pObj, i )
1787 if ( !Gia_ObjIsPo(p, pObj) || i == iPo )
1788 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1789 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
1790 pNew = Gia_ManCleanup( pTemp = pNew );
1791 Gia_ManStop( pTemp );
1792 return pNew;
1793}
1794
1807{
1808 if ( ~pObj->Value )
1809 return;
1810 assert( Gia_ObjIsAnd(pObj) );
1811 Gia_ManDupDfsRehash_rec( pNew, p, Gia_ObjFanin0(pObj) );
1812 Gia_ManDupDfsRehash_rec( pNew, p, Gia_ObjFanin1(pObj) );
1813 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1814}
1816{
1817 Gia_Man_t * pNew, * pTemp;
1818 Gia_Obj_t * pObj;
1819 int i;
1820 pNew = Gia_ManStart( Gia_ManObjNum(p) );
1821 pNew->pName = Abc_UtilStrsav( p->pName );
1822 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
1824 Gia_ManConst0(p)->Value = 0;
1825 Gia_ManForEachCi( p, pObj, i )
1826 pObj->Value = Gia_ManAppendCi(pNew);
1827 Gia_ManHashAlloc( pNew );
1828 Gia_ManForEachCo( p, pObj, i )
1829 Gia_ManDupDfsRehash_rec( pNew, p, Gia_ObjFanin0(pObj) );
1830 Gia_ManForEachCo( p, pObj, i )
1831 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1832 pNew = Gia_ManCleanup( pTemp = pNew );
1833 Gia_ManStop( pTemp );
1834 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
1835 pNew->nConstrs = p->nConstrs;
1836 if ( p->pCexSeq )
1837 pNew->pCexSeq = Abc_CexDup( p->pCexSeq, Gia_ManRegNum(p) );
1838 return pNew;
1839}
1840
1853{
1854 if ( ~pObj->Value )
1855 return;
1856 assert( Gia_ObjIsAnd(pObj) );
1857 Gia_ManDupCofactorVar_rec( pNew, p, Gia_ObjFanin0(pObj) );
1858 Gia_ManDupCofactorVar_rec( pNew, p, Gia_ObjFanin1(pObj) );
1859 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1860}
1861Gia_Man_t * Gia_ManDupCofactorVar( Gia_Man_t * p, int iVar, int Value )
1862{
1863 Gia_Man_t * pNew, * pTemp;
1864 Gia_Obj_t * pObj;
1865 int i;
1866 assert( iVar >= 0 && iVar < Gia_ManPiNum(p) );
1867 assert( Value == 0 || Value == 1 );
1868 pNew = Gia_ManStart( Gia_ManObjNum(p) );
1869 pNew->pName = Abc_UtilStrsav( p->pName );
1870 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
1872 Gia_ManConst0(p)->Value = 0;
1873 Gia_ManForEachCi( p, pObj, i )
1874 pObj->Value = Gia_ManAppendCi(pNew);
1875 Gia_ManPi( p, iVar )->Value = Value; // modification!
1876 Gia_ManHashAlloc( pNew );
1877 Gia_ManForEachCo( p, pObj, i )
1878 Gia_ManDupCofactorVar_rec( pNew, p, Gia_ObjFanin0(pObj) );
1879 Gia_ManForEachCo( p, pObj, i )
1880 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1881 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
1882 pNew->nConstrs = p->nConstrs;
1883 pNew = Gia_ManCleanup( pTemp = pNew );
1884 Gia_ManStop( pTemp );
1885 return pNew;
1886}
1887Gia_Man_t * Gia_ManDupMux( int iVar, Gia_Man_t * pCof1, Gia_Man_t * pCof0 )
1888{
1889 Gia_Man_t * pGia[2] = {pCof0, pCof1};
1890 Gia_Man_t * pNew, * pTemp;
1891 Gia_Obj_t * pObj;
1892 int i, n;
1893 assert( Gia_ManRegNum(pCof0) == 0 );
1894 assert( Gia_ManRegNum(pCof1) == 0 );
1895 assert( Gia_ManCoNum(pCof0) == 1 );
1896 assert( Gia_ManCoNum(pCof1) == 1 );
1897 assert( Gia_ManCiNum(pCof1) == Gia_ManCiNum(pCof0) );
1898 assert( iVar >= 0 && iVar < Gia_ManCiNum(pCof1) );
1899 pNew = Gia_ManStart( Gia_ManObjNum(pCof1) + Gia_ManObjNum(pCof0) );
1900 pNew->pName = Abc_UtilStrsav( pCof1->pName );
1901 pNew->pSpec = Abc_UtilStrsav( pCof1->pSpec );
1902 Gia_ManHashAlloc( pNew );
1903 for ( n = 0; n < 2; n++ )
1904 {
1905 Gia_ManFillValue( pGia[n] );
1906 Gia_ManConst0(pGia[n])->Value = 0;
1907 Gia_ManForEachCi( pGia[n], pObj, i )
1908 pObj->Value = n ? Gia_ManCi(pGia[0], i)->Value : Gia_ManAppendCi(pNew);
1909 Gia_ManForEachCo( pGia[n], pObj, i )
1910 Gia_ManDupCofactorVar_rec( pNew, pGia[n], Gia_ObjFanin0(pObj) );
1911 }
1912 Gia_ManForEachCo( pGia[0], pObj, i )
1913 {
1914 int Ctrl = Gia_ManCi(pGia[0], iVar)->Value;
1915 int Lit1 = Gia_ObjFanin0Copy(Gia_ManCo(pGia[1], i));
1916 int Lit0 = Gia_ObjFanin0Copy(pObj);
1917 Gia_ManAppendCo( pNew, Gia_ManHashMux( pNew, Ctrl, Lit1, Lit0 ) );
1918 }
1919 pNew = Gia_ManCleanup( pTemp = pNew );
1920 Gia_ManStop( pTemp );
1921 return pNew;
1922}
1923
1935Gia_Man_t * Gia_ManDupCofactorObj( Gia_Man_t * p, int iObj, int Value )
1936{
1937 Gia_Man_t * pNew, * pTemp;
1938 Gia_Obj_t * pObj;
1939 int i, iObjValue = -1;
1940 assert( Gia_ManRegNum(p) == 0 );
1941 assert( iObj > 0 && iObj < Gia_ManObjNum(p) );
1942 assert( Gia_ObjIsCand(Gia_ManObj(p, iObj)) );
1943 assert( Value == 0 || Value == 1 );
1944 pNew = Gia_ManStart( Gia_ManObjNum(p) );
1945 pNew->pName = Abc_UtilStrsav( p->pName );
1946 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
1947 Gia_ManConst0(p)->Value = 0;
1948 Gia_ManHashAlloc( pNew );
1949 Gia_ManForEachObj1( p, pObj, i )
1950 {
1951 if ( Gia_ObjIsCi(pObj) )
1952 pObj->Value = Gia_ManAppendCi( pNew );
1953 else if ( Gia_ObjIsAnd(pObj) )
1954 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1955 else if ( Gia_ObjIsCo(pObj) )
1956 pObj->Value = Gia_ManAppendCo( pNew, Gia_ManHashAnd(pNew, Gia_ObjFanin0Copy(pObj), iObjValue) );
1957 if ( i == iObj )
1958 iObjValue = Abc_LitNotCond(pObj->Value, !Value), pObj->Value = Value;
1959 }
1960 pNew = Gia_ManCleanup( pTemp = pNew );
1961 Gia_ManStop( pTemp );
1962 return pNew;
1963}
1964
1977{
1978 Gia_Man_t * pNew, * pTemp;
1979 Gia_Obj_t * pObj; int i;
1980 assert( Gia_ManCiNum(p) % nBlock == 0 );
1981 assert( Gia_ManCoNum(p) % nBlock == 0 );
1982 pNew = Gia_ManStart( Gia_ManObjNum(p) );
1983 pNew->pName = Abc_UtilStrsav( p->pName );
1984 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
1986 Gia_ManConst0(p)->Value = 0;
1987 Gia_ManForEachCi( p, pObj, i )
1988 pObj->Value = (i % nBlock == 0) ? Gia_ManAppendCi(pNew) : 0;
1989 Gia_ManHashAlloc( pNew );
1990 Gia_ManForEachAnd( p, pObj, i )
1991 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
1992 Gia_ManForEachCo( p, pObj, i )
1993 if ( i % nBlock == 0 )
1994 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
1995 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p)/nBlock );
1996 pNew = Gia_ManCleanup( pTemp = pNew );
1997 Gia_ManStop( pTemp );
1998 return pNew;
1999}
2000
2013{
2014 Gia_Man_t * pNew, * pTemp;
2015 Gia_Obj_t * pObj;
2016 int i;
2017 assert( iVar >= 0 && iVar < Gia_ManPiNum(p) );
2018 assert( Gia_ManPoNum(p) == 1 );
2019 assert( Gia_ManRegNum(p) == 0 );
2021 // find the cofactoring variable
2022 pNew = Gia_ManStart( Gia_ManObjNum(p) );
2023 pNew->pName = Abc_UtilStrsav( p->pName );
2024 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
2025 Gia_ManHashAlloc( pNew );
2026 // compute negative cofactor
2027 Gia_ManConst0(p)->Value = 0;
2028 Gia_ManForEachCi( p, pObj, i )
2029 pObj->Value = Gia_ManAppendCi(pNew);
2030 Gia_ManPi( p, iVar )->Value = Abc_Var2Lit( 0, 0 );
2031 Gia_ManForEachAnd( p, pObj, i )
2032 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
2033 Gia_ManForEachPo( p, pObj, i )
2034 pObj->Value = Gia_ObjFanin0Copy(pObj);
2035 // compute the positive cofactor
2036 Gia_ManPi( p, iVar )->Value = Abc_Var2Lit( 0, 1 );
2037 Gia_ManForEachAnd( p, pObj, i )
2038 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
2039 // create OR gate
2040 Gia_ManForEachPo( p, pObj, i )
2041 pObj->Value = Gia_ManAppendCo( pNew, Gia_ManHashOr(pNew, Gia_ObjFanin0Copy(pObj), pObj->Value) );
2042 Gia_ManHashStop( pNew );
2043 pNew = Gia_ManCleanup( pTemp = pNew );
2044 Gia_ManStop( pTemp );
2045 return pNew;
2046}
2047
2060{
2061 Gia_Man_t * pNew, * pTemp;
2062 Gia_Obj_t * pObj;
2063 int i;
2064 assert( iVar >= 0 && iVar < Gia_ManPiNum(p) );
2065 assert( Gia_ManRegNum(p) == 0 );
2067 // find the cofactoring variable
2068 pNew = Gia_ManStart( Gia_ManObjNum(p) );
2069 pNew->pName = Abc_UtilStrsav( p->pName );
2070 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
2071 Gia_ManHashAlloc( pNew );
2072 // compute negative cofactor
2073 Gia_ManConst0(p)->Value = 0;
2074 Gia_ManForEachCi( p, pObj, i )
2075 pObj->Value = Gia_ManAppendCi(pNew);
2076 Gia_ManPi( p, iVar )->Value = Abc_Var2Lit( 0, 0 );
2077 Gia_ManForEachAnd( p, pObj, i )
2078 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
2079 Gia_ManForEachPo( p, pObj, i )
2080 pObj->Value = Gia_ObjFanin0Copy(pObj);
2081 // compute the positive cofactor
2082 Gia_ManPi( p, iVar )->Value = Abc_Var2Lit( 0, 1 );
2083 Gia_ManForEachAnd( p, pObj, i )
2084 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
2085 // create OR gate
2086 Gia_ManForEachPo( p, pObj, i )
2087 {
2088 if ( i == 0 )
2089 pObj->Value = Gia_ManAppendCo( pNew, Gia_ManHashAnd(pNew, Gia_ObjFanin0Copy(pObj), pObj->Value) );
2090 else
2091 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
2092 }
2093 Gia_ManHashStop( pNew );
2094 pNew = Gia_ManCleanup( pTemp = pNew );
2095 Gia_ManStop( pTemp );
2096 return pNew;
2097}
2098
2111{
2112 Gia_Man_t * pNew, * pTemp;
2113 Gia_Obj_t * pObj;
2114 int i;
2115 assert( iVar >= 0 && iVar < Gia_ManPiNum(p) );
2116 pNew = Gia_ManStart( Gia_ManObjNum(p) );
2117 pNew->pName = Abc_UtilStrsav( p->pName );
2118 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
2120 Gia_ManHashAlloc( pNew );
2121 Gia_ManConst0(p)->Value = 0;
2122 Gia_ManForEachCi( p, pObj, i )
2123 pObj->Value = Gia_ManAppendCi(pNew);
2124 // first part
2125 Gia_ManPi( p, iVar )->Value = 0; // modification!
2126 Gia_ManForEachCo( p, pObj, i )
2127 Gia_ManDupCofactorVar_rec( pNew, p, Gia_ObjFanin0(pObj) );
2128 Gia_ManForEachCo( p, pObj, i )
2129 pObj->Value = Gia_ObjFanin0Copy(pObj);
2130 // second part
2131 Gia_ManPi( p, iVar )->Value = 1; // modification!
2132 Gia_ManForEachAnd( p, pObj, i )
2133 pObj->Value = ~0;
2134 Gia_ManForEachCo( p, pObj, i )
2135 Gia_ManDupCofactorVar_rec( pNew, p, Gia_ObjFanin0(pObj) );
2136 // combination
2137 Gia_ManForEachCo( p, pObj, i )
2138 Gia_ManAppendCo( pNew, Gia_ManHashOr(pNew, Gia_ObjFanin0Copy(pObj), pObj->Value) );
2139 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
2140 pNew->nConstrs = p->nConstrs;
2141 pNew = Gia_ManCleanup( pTemp = pNew );
2142 Gia_ManStop( pTemp );
2143 return pNew;
2144}
2145
2146
2159{
2160 Gia_Man_t * pNew;
2161 Gia_Obj_t * pObj;
2162 int i;
2164 pNew = Gia_ManStart( Gia_ManObjNum(p) );
2165 pNew->pName = Abc_UtilStrsav( p->pName );
2166 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
2167 Gia_ManConst0(p)->Value = 0;
2168 Gia_ManForEachCi( p, pObj, i )
2169 pObj->Value = Gia_ManAppendCi(pNew);
2170 Gia_ManForEachCo( p, pObj, i )
2171 if ( pObj->fMark1 == 0 )
2172 Gia_ManDupDfs_rec( pNew, p, pObj );
2173 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
2174 return pNew;
2175}
2176
2189{
2190 Gia_Man_t * pNew;
2191 Gia_Obj_t * pObj;
2192 int i;
2193 assert( Gia_ObjIsCo(pRoot) );
2195 pNew = Gia_ManStart( Gia_ManObjNum(p) );
2196 pNew->pName = Abc_UtilStrsav( p->pName );
2197 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
2198 Gia_ManConst0(p)->Value = 0;
2199 Gia_ManForEachCi( p, pObj, i )
2200 pObj->Value = Gia_ManAppendCi(pNew);
2201 Gia_ManDupDfs_rec( pNew, p, Gia_ObjFanin0(pRoot) );
2202 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pRoot) );
2203 Gia_ManSetRegNum( pNew, 0 );
2204 return pNew;
2205}
2206
2219{
2220 int iLit0, iLit1, iObj = Gia_ObjId( p, pObj );
2221 int iLit = Gia_ObjCopyArray( p, iObj );
2222 if ( iLit >= 0 )
2223 return;
2224 assert( Gia_ObjIsAnd(pObj) );
2225 Gia_ManDupConeSupp_rec( pNew, p, Gia_ObjFanin0(pObj), vObjs );
2226 Gia_ManDupConeSupp_rec( pNew, p, Gia_ObjFanin1(pObj), vObjs );
2227 iLit0 = Gia_ObjCopyArray( p, Gia_ObjFaninId0(pObj, iObj) );
2228 iLit1 = Gia_ObjCopyArray( p, Gia_ObjFaninId1(pObj, iObj) );
2229 iLit0 = Abc_LitNotCond( iLit0, Gia_ObjFaninC0(pObj) );
2230 iLit1 = Abc_LitNotCond( iLit1, Gia_ObjFaninC1(pObj) );
2231 iLit = Gia_ManAppendAnd( pNew, iLit0, iLit1 );
2232 Gia_ObjSetCopyArray( p, iObj, iLit );
2233 Vec_IntPush( vObjs, iObj );
2234}
2236{
2237 Gia_Man_t * pNew; int i, iLit0;
2238 Gia_Obj_t * pObj, * pRoot = Gia_ManObj( p, Abc_Lit2Var(iLit) );
2239 Vec_Int_t * vObjs = Vec_IntAlloc( 1000 );
2240 //assert( Gia_ObjIsAnd(pRoot) );
2241 if ( Vec_IntSize(&p->vCopies) < Gia_ManObjNum(p) )
2242 Vec_IntFillExtra( &p->vCopies, Gia_ManObjNum(p), -1 );
2243 pNew = Gia_ManStart( Gia_ManObjNum(p) );
2244 pNew->pName = Abc_UtilStrsav( p->pName );
2245 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
2246 Gia_ManForEachCiVec( vCiIds, p, pObj, i )
2247 Gia_ObjSetCopyArray( p, Gia_ObjId(p, pObj), Gia_ManAppendCi(pNew) );
2248 Gia_ManDupConeSupp_rec( pNew, p, pRoot, vObjs );
2249 iLit0 = Gia_ObjCopyArray( p, Abc_Lit2Var(iLit) );
2250 iLit0 = Abc_LitNotCond( iLit0, Abc_LitIsCompl(iLit) );
2251 Gia_ManAppendCo( pNew, iLit0 );
2252 Gia_ManForEachCiVec( vCiIds, p, pObj, i )
2253 Gia_ObjSetCopyArray( p, Gia_ObjId(p, pObj), -1 );
2254 Gia_ManForEachObjVec( vObjs, p, pObj, i )
2255 Gia_ObjSetCopyArray( p, Gia_ObjId(p, pObj), -1 );
2256 Vec_IntFree( vObjs );
2257 //assert( Vec_IntCountLarger(&p->vCopies, -1) == 0 );
2258 return pNew;
2259}
2261{
2262 if ( ~pObj->Value )
2263 return;
2264 assert( Gia_ObjIsAnd(pObj) );
2265 Gia_ManDupConeBack_rec( pNew, p, Gia_ObjFanin0(pObj) );
2266 Gia_ManDupConeBack_rec( pNew, p, Gia_ObjFanin1(pObj) );
2267 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
2268// pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
2269}
2271{
2272 Gia_Obj_t * pObj, * pRoot; int i;
2273 assert( Gia_ManCiNum(pNew) == Vec_IntSize(vCiIds) );
2274 Gia_ManFillValue(pNew);
2275 Gia_ManConst0(pNew)->Value = 0;
2276 Gia_ManForEachCi( pNew, pObj, i )
2277 pObj->Value = Gia_Obj2Lit( p, Gia_ManCi(p, Vec_IntEntry(vCiIds, i)) );
2278 pRoot = Gia_ManCo(pNew, 0);
2279 Gia_ManDupConeBack_rec( p, pNew, Gia_ObjFanin0(pRoot) );
2280 return Gia_ObjFanin0Copy(pRoot);
2281}
2283{
2284 Gia_Obj_t * pObj, * pRoot; int i;
2285 assert( Gia_ManCiNum(pNew) == Vec_IntSize(vObjs) );
2286 Gia_ManFillValue(pNew);
2287 Gia_ManConst0(pNew)->Value = 0;
2288 Gia_ManForEachCi( pNew, pObj, i )
2289 pObj->Value = Abc_Var2Lit( Vec_IntEntry(vObjs, i), 0 );
2290 pRoot = Gia_ManCo(pNew, 0);
2291 Gia_ManDupConeBack_rec( p, pNew, Gia_ObjFanin0(pRoot) );
2292 return Gia_ObjFanin0Copy(pRoot);
2293}
2294
2295
2308{
2309 if ( ~pObj->Value )
2310 return;
2311 if ( Gia_ObjIsCi(pObj) )
2312 {
2313 pObj->Value = Gia_ManAppendCi(pNew);
2314 return;
2315 }
2316 assert( Gia_ObjIsAnd(pObj) );
2317 Gia_ManDupDfs3_rec( pNew, p, Gia_ObjFanin0(pObj) );
2318 Gia_ManDupDfs3_rec( pNew, p, Gia_ObjFanin1(pObj) );
2319 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
2320}
2322{
2323 Gia_Man_t * pNew;
2324 assert( Gia_ObjIsAnd(pRoot) );
2326 pNew = Gia_ManStart( Gia_ManObjNum(p) );
2327 pNew->pName = Abc_UtilStrsav( p->pName );
2328 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
2329 Gia_ManConst0(p)->Value = 0;
2330 Gia_ManDupDfs3_rec( pNew, p, pRoot );
2331 Gia_ManAppendCo( pNew, pRoot->Value );
2332 return pNew;
2333}
2334
2347{
2348 Gia_Man_t * pNew;
2349 Gia_Obj_t * pObj;
2350 int i, iLit, iLitRes;
2352 pNew = Gia_ManStart( Gia_ManObjNum(p) );
2353 pNew->pName = Abc_UtilStrsav( p->pName );
2354 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
2355 Gia_ManConst0(p)->Value = 0;
2356 Gia_ManForEachCi( p, pObj, i )
2357 pObj->Value = Gia_ManAppendCi(pNew);
2358 Vec_IntForEachEntry( vLits, iLit, i )
2359 {
2360 iLitRes = Gia_ManDupDfs2_rec( pNew, p, Gia_ManObj(p, Abc_Lit2Var(iLit)) );
2361 Gia_ManAppendCo( pNew, Abc_LitNotCond( iLitRes, Abc_LitIsCompl(iLit)) );
2362 }
2363 Gia_ManSetRegNum( pNew, 0 );
2364 return pNew;
2365}
2366
2379{
2380 Vec_Int_t * vNonZero;
2381 Gia_Man_t * pTemp, * pNonDual;
2382 Gia_Obj_t * pObj;
2383 int i;
2384 assert( (Gia_ManPoNum(p) & 1) == 0 );
2385 pNonDual = Gia_ManTransformMiter( p );
2386 pNonDual = Gia_ManSeqStructSweep( pTemp = pNonDual, 1, 1, 0 );
2387 Gia_ManStop( pTemp );
2388 assert( Gia_ManPiNum(pNonDual) > 0 );
2389 assert( 2 * Gia_ManPoNum(pNonDual) == Gia_ManPoNum(p) );
2390 // skip PO pairs corresponding to const0 POs of the non-dual miter
2391 vNonZero = Vec_IntAlloc( 100 );
2392 Gia_ManForEachPo( pNonDual, pObj, i )
2393 if ( !Gia_ObjIsConst0(Gia_ObjFanin0(pObj)) )
2394 Vec_IntPush( vNonZero, i );
2395 Gia_ManStop( pNonDual );
2396 return vNonZero;
2397}
2398
2399
2411int Gia_ManPoIsToRemove( Gia_Man_t * p, Gia_Obj_t * pObj, int Value )
2412{
2413 assert( Gia_ObjIsCo(pObj) );
2414 if ( Value == -1 )
2415 return Gia_ObjIsConst0(Gia_ObjFanin0(pObj));
2416 assert( Value == 0 || Value == 1 );
2417 return Gia_ObjIsConst0(Gia_ObjFanin0(pObj)) && Value == Gia_ObjFaninC0(pObj);
2418}
2419
2431Gia_Man_t * Gia_ManDupTrimmed( Gia_Man_t * p, int fTrimCis, int fTrimCos, int fDualOut, int OutValue )
2432{
2433 Vec_Int_t * vNonZero = NULL;
2434 Gia_Man_t * pNew, * pTemp;
2435 Gia_Obj_t * pObj;
2436 int i, Entry;
2437 // collect non-zero
2438 if ( fDualOut && fTrimCos )
2439 vNonZero = Gia_ManDupTrimmedNonZero( p );
2440 // start new manager
2441 pNew = Gia_ManStart( Gia_ManObjNum(p) );
2442 pNew->pName = Abc_UtilStrsav( p->pName );
2443 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
2444 // check if there are PIs to be added
2446 Gia_ManForEachPi( p, pObj, i )
2447 if ( !fTrimCis || Gia_ObjRefNum(p, pObj) )
2448 break;
2449 if ( i == Gia_ManPiNum(p) ) // there is no PIs - add dummy PI
2450 Gia_ManAppendCi(pNew);
2451 // add the ROs
2453 Gia_ManConst0(p)->Value = 0;
2454 Gia_ManForEachCi( p, pObj, i )
2455 if ( !fTrimCis || Gia_ObjRefNum(p, pObj) || Gia_ObjIsRo(p, pObj) )
2456 pObj->Value = Gia_ManAppendCi(pNew);
2457 Gia_ManForEachAnd( p, pObj, i )
2458 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
2459 if ( fDualOut && fTrimCos )
2460 {
2461 Vec_IntForEachEntry( vNonZero, Entry, i )
2462 {
2463 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(Gia_ManPo(p, 2*Entry+0)) );
2464 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(Gia_ManPo(p, 2*Entry+1)) );
2465 }
2466 if ( Gia_ManPoNum(pNew) == 0 ) // nothing - add dummy PO
2467 {
2468// Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(Gia_ManPo(p, 0)) );
2469// Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(Gia_ManPo(p, 1)) );
2470 Gia_ManAppendCo( pNew, 0 );
2471 Gia_ManAppendCo( pNew, 0 );
2472 }
2473 Gia_ManForEachRi( p, pObj, i )
2474 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
2475 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
2476 // cleanup
2477 pNew = Gia_ManSeqStructSweep( pTemp = pNew, 1, 1, 0 );
2478 Gia_ManStop( pTemp );
2479 // trim the PIs
2480// pNew = Gia_ManDupTrimmed( pTemp = pNew, 1, 0, 0 );
2481// Gia_ManStop( pTemp );
2482 }
2483 else
2484 {
2485 // check if there are POs to be added
2486 Gia_ManForEachPo( p, pObj, i )
2487 if ( !fTrimCos || !Gia_ManPoIsToRemove(p, pObj, OutValue) )
2488 break;
2489 if ( i == Gia_ManPoNum(p) ) // there is no POs - add dummy PO
2490 Gia_ManAppendCo( pNew, 0 );
2491 Gia_ManForEachCo( p, pObj, i )
2492 if ( !fTrimCos || !Gia_ManPoIsToRemove(p, pObj, OutValue) || Gia_ObjIsRi(p, pObj) )
2493 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
2494 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
2495 }
2496 Vec_IntFreeP( &vNonZero );
2497 assert( !Gia_ManHasDangling( pNew ) );
2498 return pNew;
2499}
2500
2513{
2514 Gia_Man_t * pNew;
2515 Gia_Obj_t * pObj;
2516 int i;
2517 // start new manager
2518 pNew = Gia_ManStart( Gia_ManObjNum(p) );
2519 pNew->pName = Abc_UtilStrsav( p->pName );
2520 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
2521 // check if there are PIs to be added
2523 // discount references of POs
2524 Gia_ManForEachPo( p, pObj, i )
2525 Gia_ObjRefFanin0Dec( p, pObj );
2526 // check if PIs are left
2527 Gia_ManForEachPi( p, pObj, i )
2528 if ( Gia_ObjRefNum(p, pObj) )
2529 break;
2530 if ( i == Gia_ManPiNum(p) ) // there is no PIs - add dummy PI
2531 Gia_ManAppendCi(pNew);
2532 // add the ROs
2534 Gia_ManConst0(p)->Value = 0;
2535 Gia_ManForEachCi( p, pObj, i )
2536 if ( Gia_ObjRefNum(p, pObj) || Gia_ObjIsRo(p, pObj) )
2537 pObj->Value = Gia_ManAppendCi(pNew);
2538 Gia_ManForEachAnd( p, pObj, i )
2539 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
2540 // check if there are POs to be added
2541 Gia_ManForEachPo( p, pObj, i )
2542 if ( !Gia_ObjIsConst0(Gia_ObjFanin0(pObj)) && !Gia_ObjIsPi(p, Gia_ObjFanin0(pObj)) )
2543 break;
2544 if ( i == Gia_ManPoNum(p) ) // there is no POs - add dummy PO
2545 Gia_ManAppendCo( pNew, 0 );
2546 Gia_ManForEachCo( p, pObj, i )
2547 if ( (!Gia_ObjIsConst0(Gia_ObjFanin0(pObj)) && !Gia_ObjIsPi(p, Gia_ObjFanin0(pObj))) || Gia_ObjIsRi(p, pObj) )
2548 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
2549 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
2550 assert( !Gia_ManHasDangling( pNew ) );
2551 return pNew;
2552}
2554{
2555 Vec_Int_t * vMap = Vec_IntStartFull( Gia_ManObjNum(p) );
2556 Gia_Man_t * pNew;
2557 Gia_Obj_t * pObj;
2558 int i;
2559 pNew = Gia_ManStart( Gia_ManObjNum(p) );
2560 pNew->pName = Abc_UtilStrsav( p->pName );
2561 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
2563 Gia_ManConst0(p)->Value = 0;
2564 Gia_ManForEachCi( p, pObj, i )
2565 pObj->Value = Gia_ManAppendCi(pNew);
2566 Gia_ManForEachAnd( p, pObj, i )
2567 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
2568 // mark duplicated POs
2569 Gia_ManForEachPo( p, pObj, i )
2570 Vec_IntWriteEntry( vMap, Gia_ObjFaninId0p(p, pObj), i );
2571 Gia_ManForEachPo( p, pObj, i )
2572 if ( Vec_IntEntry(vMap, Gia_ObjFaninId0p(p, pObj)) == i )
2573 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
2574 Vec_IntFree( vMap );
2575 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
2576 return pNew;
2577}
2578
2591{
2592 Gia_Man_t * pTemp, * pNew;
2593 Gia_Obj_t * pObj;
2594 int i;
2595 assert( Gia_ManPoNum(p) == Gia_ManPiNum(p2) );
2596 assert( Gia_ManRegNum(p) == 0 );
2597 assert( Gia_ManRegNum(p2) == 0 );
2598 pNew = Gia_ManStart( Gia_ManObjNum(p)+Gia_ManObjNum(p2) );
2599 pNew->pName = Abc_UtilStrsav( p->pName );
2600 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
2601 Gia_ManHashAlloc( pNew );
2602 // dup first AIG
2603 Gia_ManConst0(p)->Value = 0;
2604 Gia_ManForEachCi( p, pObj, i )
2605 pObj->Value = Gia_ManAppendCi(pNew);
2606 Gia_ManForEachAnd( p, pObj, i )
2607 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
2608 // dup second AIG
2609 Gia_ManConst0(p2)->Value = 0;
2610 Gia_ManForEachCo( p, pObj, i )
2611 Gia_ManPi(p2, i)->Value = Gia_ObjFanin0Copy(pObj);
2612 Gia_ManForEachAnd( p2, pObj, i )
2613 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
2614 Gia_ManForEachCo( p2, pObj, i )
2615 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
2616 Gia_ManHashStop( pNew );
2617// Gia_ManPrintStats( pGiaNew, 0 );
2618 pNew = Gia_ManCleanup( pTemp = pNew );
2619 Gia_ManStop( pTemp );
2620 return pNew;
2621}
2622
2635{
2636 Gia_Man_t * pTemp, * pNew;
2637 Gia_Obj_t * pObj;
2638 int i;
2639 // there is no flops in p2
2640 assert( Gia_ManRegNum(p2) == 0 );
2641 // there is only one PO in p2
2642// assert( Gia_ManPoNum(p2) == 1 );
2643 // input count of p2 is equal to flop count of p1
2644 assert( Gia_ManPiNum(p2) == Gia_ManRegNum(p1) );
2645
2646 // start new AIG
2647 pNew = Gia_ManStart( Gia_ManObjNum(p1)+Gia_ManObjNum(p2) );
2648 pNew->pName = Abc_UtilStrsav( p1->pName );
2649 pNew->pSpec = Abc_UtilStrsav( p1->pSpec );
2650 Gia_ManHashAlloc( pNew );
2651 // dup first AIG
2652 Gia_ManConst0(p1)->Value = 0;
2653 Gia_ManForEachCi( p1, pObj, i )
2654 pObj->Value = Gia_ManAppendCi(pNew);
2655 Gia_ManForEachAnd( p1, pObj, i )
2656 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
2657 // dup second AIG
2658 Gia_ManConst0(p2)->Value = 0;
2659 Gia_ManForEachPi( p2, pObj, i )
2660 pObj->Value = Gia_ManRo(p1, i)->Value;
2661 Gia_ManForEachAnd( p2, pObj, i )
2662 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
2663 // add property output
2664 Gia_ManForEachPo( p2, pObj, i )
2665 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
2666 // add flop inputs
2667 Gia_ManForEachRi( p1, pObj, i )
2668 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
2669 Gia_ManHashStop( pNew );
2670 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p1) );
2671 pNew = Gia_ManCleanup( pTemp = pNew );
2672 Gia_ManStop( pTemp );
2673 return pNew;
2674}
2675
2688{
2689 Gia_Obj_t * pObj;
2690 int i;
2691 Gia_ManForEachObj( p, pObj, i )
2692 if ( ~p->pReprsOld[i] )
2693 printf( "%d->%d ", i, p->pReprs[i].iRepr );
2694 printf( "\n" );
2695}
2696
2708Gia_Man_t * Gia_ManDupDfsCiMap( Gia_Man_t * p, int * pCi2Lit, Vec_Int_t * vLits )
2709{
2710 Gia_Man_t * pNew;
2711 Gia_Obj_t * pObj;
2712 int i;
2714 pNew = Gia_ManStart( Gia_ManObjNum(p) );
2715 pNew->pName = Abc_UtilStrsav( p->pName );
2716 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
2717 Gia_ManConst0(p)->Value = 0;
2718 Gia_ManForEachCi( p, pObj, i )
2719 {
2720 pObj->Value = Gia_ManAppendCi(pNew);
2721 if ( ~pCi2Lit[i] )
2722 pObj->Value = Abc_LitNotCond( Gia_ManObj(p, Abc_Lit2Var(pCi2Lit[i]))->Value, Abc_LitIsCompl(pCi2Lit[i]) );
2723 }
2724 Gia_ManHashAlloc( pNew );
2725 if ( vLits )
2726 {
2727 int iLit, iLitRes;
2728 Vec_IntForEachEntry( vLits, iLit, i )
2729 {
2730 iLitRes = Gia_ManDupDfs2_rec( pNew, p, Gia_ManObj(p, Abc_Lit2Var(iLit)) );
2731 Gia_ManAppendCo( pNew, Abc_LitNotCond( iLitRes, Abc_LitIsCompl(iLit)) );
2732 }
2733 }
2734 else
2735 {
2736 Gia_ManForEachCo( p, pObj, i )
2737 {
2738 Gia_ManDupDfs2_rec( pNew, p, Gia_ObjFanin0(pObj) );
2739 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
2740 }
2741 }
2742 Gia_ManHashStop( pNew );
2743 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
2744 return pNew;
2745}
2746
2758Gia_Man_t * Gia_ManPermuteInputs( Gia_Man_t * p, int nPpis, int nExtra )
2759{
2760 Gia_Man_t * pNew;
2761 Gia_Obj_t * pObj;
2762 int i;
2763 pNew = Gia_ManStart( Gia_ManObjNum(p) );
2764 pNew->pName = Abc_UtilStrsav( p->pName );
2765 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
2766 Gia_ManConst0(p)->Value = 0;
2767 for ( i = 0; i < Gia_ManPiNum(p) - nPpis - nExtra; i++ ) // regular PIs
2768 Gia_ManCi(p, i)->Value = Gia_ManAppendCi( pNew );
2769 for ( i = Gia_ManPiNum(p) - nExtra; i < Gia_ManPiNum(p); i++ ) // extra PIs due to DC values
2770 Gia_ManCi(p, i)->Value = Gia_ManAppendCi( pNew );
2771 for ( i = Gia_ManPiNum(p) - nPpis - nExtra; i < Gia_ManPiNum(p) - nExtra; i++ ) // pseudo-PIs
2772 Gia_ManCi(p, i)->Value = Gia_ManAppendCi( pNew );
2773 for ( i = Gia_ManPiNum(p); i < Gia_ManCiNum(p); i++ ) // flop outputs
2774 Gia_ManCi(p, i)->Value = Gia_ManAppendCi( pNew );
2775 assert( Gia_ManCiNum(pNew) == Gia_ManCiNum(p) );
2776 Gia_ManForEachAnd( p, pObj, i )
2777 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
2778 Gia_ManForEachCo( p, pObj, i )
2779 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
2780 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
2781 return pNew;
2782}
2783
2796{
2797 Gia_Man_t * pNew, * pTemp;
2798 Gia_Obj_t * pObj;
2799 int i;
2800 assert( p->pReprsOld != NULL );
2802 pNew = Gia_ManStart( Gia_ManObjNum(p) );
2803 pNew->pName = Abc_UtilStrsav( p->pName );
2804 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
2805 Gia_ManConst0(p)->Value = 0;
2806 Gia_ManForEachCi( p, pObj, i )
2807 pObj->Value = Gia_ManAppendCi(pNew);
2808 Gia_ManHashAlloc( pNew );
2809 Gia_ManForEachCo( p, pObj, i )
2810 Gia_ManDupDfs_rec( pNew, p, pObj );
2811 Gia_ManHashStop( pNew );
2812 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
2813 pNew = Gia_ManCleanup( pTemp = pNew );
2814 Gia_ManStop( pTemp );
2815 return pNew;
2816}
2817
2830{
2831 Gia_Man_t * pNew;
2832 Gia_Obj_t * pObj;
2833 Vec_Int_t * vFront, * vLeaves;
2834 int i, iLit, iObjId, nCiLits, * pCi2Lit;
2835 char * pVar2Val;
2836 // collect the frontier
2837 vFront = Vec_IntAlloc( 1000 );
2838 vLeaves = Vec_IntAlloc( 1000 );
2839 Gia_ManForEachCo( p, pObj, i )
2840 {
2841 if ( Gia_ObjIsConst0( Gia_ObjFanin0(pObj) ) )
2842 continue;
2843 if ( Gia_ObjFaninC0(pObj) )
2844 Vec_IntPush( vLeaves, Gia_ObjFaninLit0p(p, pObj) );
2845 else
2846 Vec_IntPush( vFront, Gia_ObjFaninId0p(p, pObj) );
2847 }
2848 if ( Vec_IntSize(vFront) == 0 )
2849 {
2850 if ( fVerbose )
2851 printf( "The AIG cannot be decomposed using AND-decomposition.\n" );
2852 Vec_IntFree( vFront );
2853 Vec_IntFree( vLeaves );
2854 return Gia_ManDupNormalize( p, 0 );
2855 }
2856 // expand the frontier
2857 Gia_ManForEachObjVec( vFront, p, pObj, i )
2858 {
2859 if ( Gia_ObjIsCi(pObj) )
2860 {
2861 Vec_IntPush( vLeaves, Abc_Var2Lit( Gia_ObjId(p, pObj), 0 ) );
2862 continue;
2863 }
2864 assert( Gia_ObjIsAnd(pObj) );
2865 if ( Gia_ObjFaninC0(pObj) )
2866 Vec_IntPush( vLeaves, Gia_ObjFaninLit0p(p, pObj) );
2867 else
2868 Vec_IntPush( vFront, Gia_ObjFaninId0p(p, pObj) );
2869 if ( Gia_ObjFaninC1(pObj) )
2870 Vec_IntPush( vLeaves, Gia_ObjFaninLit1p(p, pObj) );
2871 else
2872 Vec_IntPush( vFront, Gia_ObjFaninId1p(p, pObj) );
2873 }
2874 Vec_IntFree( vFront );
2875 // sort the literals
2876 nCiLits = 0;
2877 pCi2Lit = ABC_FALLOC( int, Gia_ManObjNum(p) );
2878 pVar2Val = ABC_FALLOC( char, Gia_ManObjNum(p) );
2879 Vec_IntForEachEntry( vLeaves, iLit, i )
2880 {
2881 iObjId = Abc_Lit2Var(iLit);
2882 pObj = Gia_ManObj(p, iObjId);
2883 if ( Gia_ObjIsCi(pObj) )
2884 {
2885 pCi2Lit[Gia_ObjCioId(pObj)] = !Abc_LitIsCompl(iLit);
2886 nCiLits++;
2887 }
2888 if ( pVar2Val[iObjId] != 0 && pVar2Val[iObjId] != 1 )
2889 pVar2Val[iObjId] = Abc_LitIsCompl(iLit);
2890 else if ( pVar2Val[iObjId] != Abc_LitIsCompl(iLit) )
2891 break;
2892 }
2893 if ( i < Vec_IntSize(vLeaves) )
2894 {
2895 printf( "Problem is trivially UNSAT.\n" );
2896 ABC_FREE( pCi2Lit );
2897 ABC_FREE( pVar2Val );
2898 Vec_IntFree( vLeaves );
2899 return Gia_ManDupNormalize( p, 0 );
2900 }
2901 // create array of input literals
2902 Vec_IntClear( vLeaves );
2903 Gia_ManForEachObj( p, pObj, i )
2904 if ( !Gia_ObjIsCi(pObj) && (pVar2Val[i] == 0 || pVar2Val[i] == 1) )
2905 Vec_IntPush( vLeaves, Abc_Var2Lit(i, pVar2Val[i]) );
2906 if ( fVerbose )
2907 printf( "Detected %6d AND leaves and %6d CI leaves.\n", Vec_IntSize(vLeaves), nCiLits );
2908 // create the input map
2909 if ( nCiLits == 0 )
2910 pNew = Gia_ManDupDfsLitArray( p, vLeaves );
2911 else
2912 pNew = Gia_ManDupDfsCiMap( p, pCi2Lit, vLeaves );
2913 ABC_FREE( pCi2Lit );
2914 ABC_FREE( pVar2Val );
2915 Vec_IntFree( vLeaves );
2916 return pNew;
2917}
2918
2931{
2932 Gia_Man_t * pNew, * pTemp;
2933 int fContinue, iIter = 0;
2934 pNew = Gia_ManDupNormalize( p, 0 );
2935 for ( fContinue = 1; fContinue; )
2936 {
2937 pNew = Gia_ManDupTopAnd_iter( pTemp = pNew, fVerbose );
2938 if ( Gia_ManCoNum(pNew) == Gia_ManCoNum(pTemp) && Gia_ManAndNum(pNew) == Gia_ManAndNum(pTemp) )
2939 fContinue = 0;
2940 Gia_ManStop( pTemp );
2941 if ( fVerbose )
2942 {
2943 printf( "Iter %2d : ", ++iIter );
2944 Gia_ManPrintStatsShort( pNew );
2945 }
2946 }
2947 return pNew;
2948}
2949
2950
2963{
2964 if ( ~pObj->Value )
2965 return pObj->Value;
2966 assert( Gia_ObjIsAnd(pObj) );
2967 Gia_ManMiter_rec( pNew, p, Gia_ObjFanin0(pObj) );
2968 Gia_ManMiter_rec( pNew, p, Gia_ObjFanin1(pObj) );
2969 return pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
2970}
2971
2983Gia_Man_t * Gia_ManMiter( Gia_Man_t * p0, Gia_Man_t * p1, int nInsDup, int fDualOut, int fSeq, int fImplic, int fVerbose )
2984{
2985 Gia_Man_t * pNew, * pTemp;
2986 Gia_Obj_t * pObj;
2987 int i, iLit;
2988 if ( fSeq )
2989 {
2990 if ( Gia_ManPiNum(p0) != Gia_ManPiNum(p1) )
2991 {
2992 printf( "Gia_ManMiter(): Designs have different number of PIs.\n" );
2993 return NULL;
2994 }
2995 if ( Gia_ManPoNum(p0) != Gia_ManPoNum(p1) )
2996 {
2997 printf( "Gia_ManMiter(): Designs have different number of POs.\n" );
2998 return NULL;
2999 }
3000 if ( Gia_ManRegNum(p0) == 0 || Gia_ManRegNum(p1) == 0 )
3001 {
3002 printf( "Gia_ManMiter(): At least one of the designs has no registers.\n" );
3003 return NULL;
3004 }
3005 }
3006 else
3007 {
3008 if ( Gia_ManCiNum(p0) != Gia_ManCiNum(p1) )
3009 {
3010 printf( "Gia_ManMiter(): Designs have different number of CIs.\n" );
3011 return NULL;
3012 }
3013 if ( Gia_ManCoNum(p0) != Gia_ManCoNum(p1) )
3014 {
3015 printf( "Gia_ManMiter(): Designs have different number of COs.\n" );
3016 return NULL;
3017 }
3018 }
3019 // start the manager
3020 pNew = Gia_ManStart( Gia_ManObjNum(p0) + Gia_ManObjNum(p1) );
3021 pNew->pName = Abc_UtilStrsav( "miter" );
3022 // map combinational inputs
3023 Gia_ManFillValue( p0 );
3024 Gia_ManFillValue( p1 );
3025 Gia_ManConst0(p0)->Value = 0;
3026 Gia_ManConst0(p1)->Value = 0;
3027 // map internal nodes and outputs
3028 Gia_ManHashAlloc( pNew );
3029 if ( fSeq )
3030 {
3031 // create primary inputs
3032 Gia_ManForEachPi( p0, pObj, i )
3033 pObj->Value = Gia_ManAppendCi( pNew );
3034 Gia_ManForEachPi( p1, pObj, i )
3035 if ( i < Gia_ManPiNum(p1) - nInsDup )
3036 pObj->Value = Gia_ObjToLit( pNew, Gia_ManPi(pNew, i) );
3037 else
3038 pObj->Value = Gia_ManAppendCi( pNew );
3039 // create latch outputs
3040 Gia_ManForEachRo( p0, pObj, i )
3041 pObj->Value = Gia_ManAppendCi( pNew );
3042 Gia_ManForEachRo( p1, pObj, i )
3043 pObj->Value = Gia_ManAppendCi( pNew );
3044 // create primary outputs
3045 Gia_ManForEachPo( p0, pObj, i )
3046 {
3047 Gia_ManMiter_rec( pNew, p0, Gia_ObjFanin0(pObj) );
3048 Gia_ManMiter_rec( pNew, p1, Gia_ObjFanin0(Gia_ManPo(p1,i)) );
3049 if ( fDualOut )
3050 {
3051 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3052 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(Gia_ManPo(p1,i)) );
3053 }
3054 else if ( fImplic )
3055 {
3056 iLit = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Abc_LitNot(Gia_ObjFanin0Copy(Gia_ManPo(p1,i))) );
3057 Gia_ManAppendCo( pNew, iLit );
3058 }
3059 else
3060 {
3061 iLit = Gia_ManHashXor( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin0Copy(Gia_ManPo(p1,i)) );
3062 Gia_ManAppendCo( pNew, iLit );
3063 }
3064 }
3065 // create register inputs
3066 Gia_ManForEachRi( p0, pObj, i )
3067 {
3068 Gia_ManMiter_rec( pNew, p0, Gia_ObjFanin0(pObj) );
3069 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3070 }
3071 Gia_ManForEachRi( p1, pObj, i )
3072 {
3073 Gia_ManMiter_rec( pNew, p1, Gia_ObjFanin0(pObj) );
3074 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3075 }
3076 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p0) + Gia_ManRegNum(p1) );
3077 }
3078 else
3079 {
3080 // create combinational inputs
3081 Gia_ManForEachCi( p0, pObj, i )
3082 pObj->Value = Gia_ManAppendCi( pNew );
3083 Gia_ManForEachCi( p1, pObj, i )
3084 if ( i < Gia_ManCiNum(p1) - nInsDup )
3085 pObj->Value = Gia_ObjToLit( pNew, Gia_ManCi(pNew, i) );
3086 else
3087 pObj->Value = Gia_ManAppendCi( pNew );
3088 // create combinational outputs
3089 Gia_ManForEachCo( p0, pObj, i )
3090 {
3091 Gia_ManMiter_rec( pNew, p0, Gia_ObjFanin0(pObj) );
3092 Gia_ManMiter_rec( pNew, p1, Gia_ObjFanin0(Gia_ManCo(p1,i)) );
3093 if ( fDualOut )
3094 {
3095 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3096 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(Gia_ManCo(p1,i)) );
3097 }
3098 else if ( fImplic )
3099 {
3100 iLit = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Abc_LitNot(Gia_ObjFanin0Copy(Gia_ManPo(p1,i))) );
3101 Gia_ManAppendCo( pNew, iLit );
3102 }
3103 else
3104 {
3105 iLit = Gia_ManHashXor( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin0Copy(Gia_ManCo(p1,i)) );
3106 Gia_ManAppendCo( pNew, iLit );
3107 }
3108 }
3109 }
3110 Gia_ManHashStop( pNew );
3111 pNew = Gia_ManCleanup( pTemp = pNew );
3112 Gia_ManStop( pTemp );
3113
3114 pNew = Gia_ManDupNormalize( pTemp = pNew, 0 );
3115 Gia_ManStop( pTemp );
3116 return pNew;
3117}
3118
3130Gia_Man_t * Gia_ManMiterInverse( Gia_Man_t * pBot, Gia_Man_t * pTop, int fDualOut, int fVerbose )
3131{
3132 Gia_Man_t * pNew, * pTemp;
3133 Gia_Obj_t * pObj;
3134 int i, iLit;
3135 int nInputs1 = Gia_ManCiNum(pTop) - Gia_ManCoNum(pBot);
3136 int nInputs2 = Gia_ManCiNum(pBot) - Gia_ManCoNum(pTop);
3137 if ( nInputs1 == nInputs2 )
3138 printf( "Assuming that the circuits have %d shared inputs, ordered first.\n", nInputs1 );
3139 else
3140 {
3141 printf( "The number of inputs and outputs does not match.\n" );
3142 return NULL;
3143 }
3144 pNew = Gia_ManStart( Gia_ManObjNum(pBot) + Gia_ManObjNum(pTop) );
3145 pNew->pName = Abc_UtilStrsav( "miter" );
3146 Gia_ManFillValue( pBot );
3147 Gia_ManFillValue( pTop );
3148 Gia_ManConst0(pBot)->Value = 0;
3149 Gia_ManConst0(pTop)->Value = 0;
3150 Gia_ManHashAlloc( pNew );
3151 Gia_ManForEachCi( pBot, pObj, i )
3152 pObj->Value = Gia_ManAppendCi( pNew );
3153// Gia_ManForEachCo( pBot, pObj, i )
3154// Gia_ManMiter_rec( pNew, pBot, Gia_ObjFanin0(pObj) );
3155 Gia_ManForEachAnd( pBot, pObj, i )
3156 {
3157 if ( Gia_ObjIsBuf(pObj) )
3158 pObj->Value = Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(pObj) );
3159 else if ( Gia_ObjIsAnd(pObj) )
3160 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3161 }
3162 Gia_ManForEachCo( pBot, pObj, i )
3163 pObj->Value = Gia_ObjFanin0Copy(pObj);
3164 Gia_ManForEachCi( pTop, pObj, i )
3165 if ( i < nInputs1 )
3166 pObj->Value = Gia_ManCi(pBot, i)->Value;
3167 else
3168 pObj->Value = Gia_ManCo(pBot, i-nInputs1)->Value;
3169// Gia_ManForEachCo( pTop, pObj, i )
3170// Gia_ManMiter_rec( pNew, pTop, Gia_ObjFanin0(pObj) );
3171 Gia_ManForEachAnd( pTop, pObj, i )
3172 {
3173 if ( Gia_ObjIsBuf(pObj) )
3174 pObj->Value = Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(pObj) );
3175 else if ( Gia_ObjIsAnd(pObj) )
3176 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3177 }
3178 Gia_ManForEachCo( pTop, pObj, i )
3179 {
3180 if ( fDualOut )
3181 {
3182 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3183 Gia_ManAppendCo( pNew, Gia_ManCi(pBot, i+nInputs1)->Value );
3184 }
3185 else
3186 {
3187 iLit = Gia_ManHashXor( pNew, Gia_ObjFanin0Copy(pObj), Gia_ManCi(pBot, i+nInputs1)->Value );
3188 Gia_ManAppendCo( pNew, iLit );
3189 }
3190 }
3191 Gia_ManHashStop( pNew );
3192 pNew = Gia_ManCleanup( pTemp = pNew );
3193 Gia_ManStop( pTemp );
3194 assert( (pBot->vBarBufs == NULL) == (pTop->vBarBufs == NULL) );
3195 if ( pBot->vBarBufs )
3196 {
3197 pNew->vBarBufs = Vec_IntAlloc( 1000 );
3198 Vec_IntAppend( pNew->vBarBufs, pBot->vBarBufs );
3199 Vec_IntAppend( pNew->vBarBufs, pTop->vBarBufs );
3200 //printf( "Miter has %d buffers (%d groups).\n", pNew->nBufs, Vec_IntSize(pNew->vBarBufs) );
3201 }
3202 return pNew;
3203}
3204
3216Gia_Man_t * Gia_ManDupAndOr( Gia_Man_t * p, int nOuts, int fUseOr, int fCompl )
3217{
3218 Gia_Man_t * pNew, * pTemp;
3219 Gia_Obj_t * pObj;
3220 int i, iResult;
3221 assert( Gia_ManRegNum(p) == 0 );
3222 pNew = Gia_ManStart( Gia_ManObjNum(p) );
3223 pNew->pName = Abc_UtilStrsav( p->pName );
3224 Gia_ManConst0(p)->Value = 0;
3225 Gia_ManHashAlloc( pNew );
3226 Gia_ManForEachPi( p, pObj, i )
3227 pObj->Value = Gia_ManAppendCi( pNew );
3228 Gia_ManForEachAnd( p, pObj, i )
3229 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3230 if ( fUseOr ) // construct OR of all POs
3231 {
3232 iResult = 0;
3233 Gia_ManForEachPo( p, pObj, i )
3234 iResult = Gia_ManHashOr( pNew, iResult, Gia_ObjFanin0Copy(pObj) );
3235 }
3236 else // construct AND of all POs
3237 {
3238 iResult = 1;
3239 Gia_ManForEachPo( p, pObj, i )
3240 iResult = Gia_ManHashAnd( pNew, iResult, Gia_ObjFanin0Copy(pObj) );
3241 }
3242 iResult = Abc_LitNotCond( iResult, (int)(fCompl > 0) );
3243// Gia_ManForEachPo( p, pObj, i )
3244// pObj->Value = Gia_ManAppendCo( pNew, iResult );
3245 for ( i = 0; i < nOuts; i++ )
3246 Gia_ManAppendCo( pNew, iResult );
3247 Gia_ManHashStop( pNew );
3248 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
3249 pNew = Gia_ManCleanup( pTemp = pNew );
3250 Gia_ManStop( pTemp );
3251 return pNew;
3252}
3253
3266{
3267 Gia_Man_t * pNew, * pTemp;
3268 Gia_Obj_t * pObj; int i;
3269 assert( Gia_ManRegNum(p) == 0 );
3270 assert( Gia_ManRegNum(pCare) == 0 );
3271 assert( Gia_ManPiNum(p) == Gia_ManPiNum(pCare) );
3272 pNew = Gia_ManStart( Gia_ManObjNum(p) );
3273 pNew->pName = Abc_UtilStrsav( p->pName );
3274 Gia_ManConst0(p)->Value = 0;
3275 Gia_ManConst0(pCare)->Value = 0;
3276 Gia_ManHashAlloc( pNew );
3277 Gia_ManForEachPi( p, pObj, i )
3278 pObj->Value = Gia_ManPi(pCare, i)->Value = Gia_ManAppendCi( pNew );
3279 Gia_ManForEachAnd( p, pObj, i )
3280 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3281 Gia_ManForEachAnd( pCare, pObj, i )
3282 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3283 if ( Gia_ManPoNum(pCare) == 1 ) {
3284 Gia_ManForEachPo( p, pObj, i )
3285 Gia_ManAppendCo( pNew, Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(Gia_ManPo(pCare, 0)) ) );
3286 }
3287 else if ( Gia_ManPoNum(p) == Gia_ManPoNum(pCare) ) {
3288 Gia_ManForEachPo( p, pObj, i )
3289 Gia_ManAppendCo( pNew, Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(Gia_ManPo(pCare, i)) ) );
3290 }
3291 else assert( 0 );
3292 Gia_ManHashStop( pNew );
3293 pNew = Gia_ManCleanup( pTemp = pNew );
3294 Gia_ManStop( pTemp );
3295 return pNew;
3296}
3297
3310{
3311 char * pName1, * pName2, pBuffer[1000]; int i;
3312 Vec_Ptr_t * pNew = Vec_PtrAlloc( Vec_PtrSize(p) - nOuts/2 );
3313 assert( nOuts % 2 == 0 );
3314 assert( nOuts <= Vec_PtrSize(p) );
3315 Vec_PtrForEachEntryDouble( char *, char *, p, pName1, pName2, i )
3316 {
3317 if ( i == nOuts )
3318 break;
3319 sprintf( pBuffer, "%s_xor_%s", pName1, pName2 );
3320 Vec_PtrPush( pNew, Abc_UtilStrsav(pBuffer) );
3321 }
3322 Vec_PtrForEachEntryStart( char *, p, pName1, i, i )
3323 Vec_PtrPush( pNew, Abc_UtilStrsav(pName1) );
3324 return pNew;
3325}
3326
3339{
3340 Gia_Man_t * pNew, * pTemp;
3341 Gia_Obj_t * pObj, * pObj2;
3342 int i, k, iLit;
3343 pNew = Gia_ManStart( Gia_ManObjNum(p) );
3344 pNew->pName = Abc_UtilStrsav( p->pName );
3345 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
3346 Gia_ManConst0(p)->Value = 0;
3347 Gia_ManHashAlloc( pNew );
3348 Gia_ManForEachCi( p, pObj, i )
3349 pObj->Value = Gia_ManAppendCi( pNew );
3350 Gia_ManForEachAnd( p, pObj, i )
3351 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3352 Gia_ManForEachPo( p, pObj, i )
3353 Gia_ManForEachPo( p, pObj2, k )
3354 {
3355 if ( i >= k )
3356 continue;
3357 iLit = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin0Copy(pObj2) );
3358 Gia_ManAppendCo( pNew, iLit );
3359 }
3360 pNew = Gia_ManCleanup( pTemp = pNew );
3361 Gia_ManStop( pTemp );
3362 return pNew;
3363}
3364
3377{
3378 Gia_Man_t * pNew, * pTemp;
3379 Gia_Obj_t * pObj, * pObj2;
3380 int i, iLit;
3381 assert( (Gia_ManPoNum(p) & 1) == 0 );
3382 pNew = Gia_ManStart( Gia_ManObjNum(p) );
3383 pNew->pName = Abc_UtilStrsav( p->pName );
3384 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
3385 Gia_ManConst0(p)->Value = 0;
3386 Gia_ManHashAlloc( pNew );
3387 Gia_ManForEachCi( p, pObj, i )
3388 pObj->Value = Gia_ManAppendCi( pNew );
3389 Gia_ManForEachAnd( p, pObj, i )
3390 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3391 Gia_ManForEachPo( p, pObj, i )
3392 {
3393 pObj2 = Gia_ManPo( p, ++i );
3394 iLit = Gia_ManHashXor( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin0Copy(pObj2) );
3395 Gia_ManAppendCo( pNew, iLit );
3396 }
3397 Gia_ManForEachRi( p, pObj, i )
3398 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3399 Gia_ManHashStop( pNew );
3400 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
3401 pNew = Gia_ManCleanup( pTemp = pNew );
3402 Gia_ManStop( pTemp );
3403 if ( p->vNamesIn )
3404 pNew->vNamesIn = Vec_PtrDupStr(p->vNamesIn);
3405 if ( p->vNamesOut )
3406 pNew->vNamesOut = Gia_ManMiterNames(p->vNamesOut, Gia_ManPoNum(p));
3407 return pNew;
3408}
3410{
3411 Gia_Man_t * pNew, * pTemp;
3412 Gia_Obj_t * pObj, * pObj2;
3413 int i, iLit, nPart = Gia_ManPoNum(p)/2;
3414 assert( (Gia_ManPoNum(p) & 1) == 0 );
3415 pNew = Gia_ManStart( Gia_ManObjNum(p) );
3416 pNew->pName = Abc_UtilStrsav( p->pName );
3417 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
3418 Gia_ManConst0(p)->Value = 0;
3419 Gia_ManHashAlloc( pNew );
3420 Gia_ManForEachCi( p, pObj, i )
3421 pObj->Value = Gia_ManAppendCi( pNew );
3422 Gia_ManForEachAnd( p, pObj, i )
3423 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3424 Gia_ManForEachPo( p, pObj, i )
3425 {
3426 if ( i == nPart )
3427 break;
3428 pObj2 = Gia_ManPo( p, nPart + i );
3429 iLit = Gia_ManHashXor( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin0Copy(pObj2) );
3430 Gia_ManAppendCo( pNew, iLit );
3431 }
3432 Gia_ManForEachRi( p, pObj, i )
3433 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3434 Gia_ManHashStop( pNew );
3435 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
3436 pNew = Gia_ManCleanup( pTemp = pNew );
3437 Gia_ManStop( pTemp );
3438 return pNew;
3439}
3441{
3442 Gia_Man_t * pNew;
3443 Gia_Obj_t * pObj;
3444 int i;
3445 pNew = Gia_ManStart( Gia_ManObjNum(p) );
3446 pNew->pName = Abc_UtilStrsav( p->pName );
3447 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
3448 Gia_ManConst0(p)->Value = 0;
3449 Gia_ManHashAlloc( pNew );
3450 Gia_ManForEachCi( p, pObj, i )
3451 pObj->Value = Gia_ManAppendCi( pNew );
3452 Gia_ManForEachAnd( p, pObj, i )
3453 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3454 Gia_ManForEachPo( p, pObj, i )
3455 {
3456 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3457 Gia_ManAppendCo( pNew, 0 );
3458 }
3459 Gia_ManForEachRi( p, pObj, i )
3460 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3461 Gia_ManHashStop( pNew );
3462 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
3463 return pNew;
3464}
3466{
3467 Gia_Man_t * pNew, * pTemp;
3468 Gia_Obj_t * pObj, * pObj2;
3469 int i, nPart = Gia_ManPoNum(p)/2;
3470 assert( (Gia_ManPoNum(p) & 1) == 0 );
3471 pNew = Gia_ManStart( Gia_ManObjNum(p) );
3472 pNew->pName = Abc_UtilStrsav( p->pName );
3473 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
3474 Gia_ManConst0(p)->Value = 0;
3475 Gia_ManHashAlloc( pNew );
3476 Gia_ManForEachCi( p, pObj, i )
3477 pObj->Value = Gia_ManAppendCi( pNew );
3478 Gia_ManForEachAnd( p, pObj, i )
3479 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3480 Gia_ManForEachPo( p, pObj, i )
3481 {
3482 if ( i == nPart )
3483 break;
3484 pObj2 = Gia_ManPo( p, nPart + i );
3485 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3486 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj2) );
3487 }
3488 Gia_ManForEachRi( p, pObj, i )
3489 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3490 Gia_ManHashStop( pNew );
3491 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
3492 pNew = Gia_ManCleanup( pTemp = pNew );
3493 Gia_ManStop( pTemp );
3494 return pNew;
3495}
3496
3498{
3499 if ( Gia_ObjIsTravIdCurrent(p, pObj) )
3500 return;
3501 Gia_ObjSetTravIdCurrent(p, pObj);
3502 if ( !Gia_ObjIsAnd(pObj) )
3503 return;
3504 Gia_ManCollectOneSide_rec( p, Gia_ObjFanin0(pObj), vNodes );
3505 Gia_ManCollectOneSide_rec( p, Gia_ObjFanin1(pObj), vNodes );
3506 Vec_IntPush( vNodes, Gia_ObjId(p, pObj) );
3507}
3509{
3510 Gia_Obj_t * pObj; int i;
3511 Vec_Int_t * vNodes = Vec_IntAlloc( Gia_ManAndNum(p) );
3513 Gia_ManForEachPo( p, pObj, i )
3514 if ( (i & 1) == iSide )
3515 Gia_ManCollectOneSide_rec( p, Gia_ObjFanin0(pObj), vNodes );
3516 return vNodes;
3517}
3519{
3520 Vec_Int_t * vNodes0 = Gia_ManCollectOneSide( p, 0 );
3521 Vec_Int_t * vNodes1 = Gia_ManCollectOneSide( p, 1 );
3522 Gia_Man_t * pNew, * pTemp;
3523 Gia_Obj_t * pObj, * pObj2;
3524 int i, fSwap = 0;
3525 assert( Gia_ManRegNum(p) == 0 );
3526 assert( (Gia_ManPoNum(p) & 1) == 0 );
3527 if ( Vec_IntSize(vNodes0) > Vec_IntSize(vNodes1) )
3528 {
3529 ABC_SWAP( Vec_Int_t *, vNodes0, vNodes1 );
3530 fSwap = 1;
3531 }
3532 assert( Vec_IntSize(vNodes0) <= Vec_IntSize(vNodes1) );
3533 pNew = Gia_ManStart( Gia_ManObjNum(p) );
3534 pNew->pName = Abc_UtilStrsav( p->pName );
3535 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
3536 Gia_ManConst0(p)->Value = 0;
3537 Gia_ManHashAlloc( pNew );
3538 Gia_ManForEachCi( p, pObj, i )
3539 pObj->Value = Gia_ManAppendCi( pNew );
3540 Gia_ManForEachObjVec( vNodes0, p, pObj, i )
3541 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3542 Gia_ManForEachObjVec( vNodes1, p, pObj, i )
3543 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3544 Vec_IntFree( vNodes0 );
3545 Vec_IntFree( vNodes1 );
3546 Gia_ManForEachPo( p, pObj, i )
3547 {
3548 pObj2 = Gia_ManPo( p, i^fSwap );
3549 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj2) );
3550 }
3551 Gia_ManHashStop( pNew );
3552 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
3553 pNew = Gia_ManCleanup( pTemp = pNew );
3554 Gia_ManStop( pTemp );
3555 return pNew;
3556}
3557
3569Gia_Man_t * Gia_ManDupZeroUndc( Gia_Man_t * p, char * pInit, int nNewPis, int fGiaSimple, int fVerbose )
3570{
3571 Gia_Man_t * pNew;
3572 Gia_Obj_t * pObj;
3573 int CountPis = Gia_ManPiNum(p), * pPiLits;
3574 int i, iResetFlop = -1, Count1 = 0;
3575 //printf( "Using %s\n", pInit );
3576 // map X-valued flops into new PIs
3577 assert( (int)strlen(pInit) == Gia_ManRegNum(p) );
3578 pPiLits = ABC_FALLOC( int, Gia_ManRegNum(p) );
3579 for ( i = 0; i < Gia_ManRegNum(p); i++ )
3580 if ( pInit[i] == 'x' || pInit[i] == 'X' )
3581 pPiLits[i] = CountPis++;
3582 // create new manager
3583 pNew = Gia_ManStart( Gia_ManObjNum(p) );
3584 pNew->pName = Abc_UtilStrsav( p->pName );
3585 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
3586 pNew->fGiaSimple = fGiaSimple;
3587 Gia_ManConst0(p)->Value = 0;
3588 // create primary inputs
3589 Gia_ManForEachPi( p, pObj, i )
3590 pObj->Value = Gia_ManAppendCi( pNew );
3591 // create additional primary inputs
3592 for ( i = Gia_ManPiNum(p); i < CountPis; i++ )
3593 Gia_ManAppendCi( pNew );
3594 // create additional primary inputs
3595 for ( i = 0; i < nNewPis; i++ )
3596 Gia_ManAppendCi( pNew );
3597 // create flop outputs
3598 Gia_ManForEachRo( p, pObj, i )
3599 pObj->Value = Gia_ManAppendCi( pNew );
3600 // create reset flop output
3601 if ( CountPis > Gia_ManPiNum(p) )
3602 iResetFlop = Gia_ManAppendCi( pNew );
3603 // update flop outputs
3605 Gia_ManForEachRo( p, pObj, i )
3606 {
3607 if ( pInit[i] == '1' )
3608 pObj->Value = Abc_LitNot(pObj->Value), Count1++;
3609 else if ( pInit[i] == 'x' || pInit[i] == 'X' )
3610 {
3611 if ( pObj->fMark0 ) // only add MUX if the flop has fanout
3612 pObj->Value = Gia_ManAppendMux( pNew, iResetFlop, pObj->Value, Gia_Obj2Lit(pNew, Gia_ManPi(pNew, pPiLits[i])) );
3613 }
3614 else if ( pInit[i] != '0' )
3615 assert( 0 );
3616 }
3618 ABC_FREE( pPiLits );
3619 // build internal nodes
3620 Gia_ManForEachAnd( p, pObj, i )
3621 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3622 // create POs
3623 Gia_ManForEachPo( p, pObj, i )
3624 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3625 // create flop inputs
3626 Gia_ManForEachRi( p, pObj, i )
3627 if ( pInit[i] == '1' )
3628 pObj->Value = Gia_ManAppendCo( pNew, Abc_LitNot(Gia_ObjFanin0Copy(pObj)) );
3629 else
3630 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3631 // create reset flop input
3632 if ( CountPis > Gia_ManPiNum(p) )
3633 Gia_ManAppendCo( pNew, 1 );
3634 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) + (int)(CountPis > Gia_ManPiNum(p)) );
3635 if ( fVerbose )
3636 printf( "Converted %d 1-valued FFs and %d DC-valued FFs.\n", Count1, CountPis-Gia_ManPiNum(p) );
3637 return pNew;
3638}
3639
3651Gia_Man_t * Gia_ManMiter2( Gia_Man_t * pStart, char * pInit, int fVerbose )
3652{
3653 Vec_Int_t * vCiValues, * vCoValues0, * vCoValues1;
3654 Gia_Man_t * pNew, * pUndc, * pTemp;
3655 Gia_Obj_t * pObj;
3656 char * pInitNew;
3657 int i, k;
3658 // check PI values
3659 for ( i = 0; i < Gia_ManPiNum(pStart); i++ )
3660 assert( pInit[i] == 'x' || pInit[i] == 'X' );
3661 // normalize the manager
3662 pUndc = Gia_ManDupZeroUndc( pStart, pInit + Gia_ManPiNum(pStart), 0, 0, fVerbose );
3663 // create new init string
3664 pInitNew = ABC_ALLOC( char, Gia_ManPiNum(pUndc)+1 );
3665 for ( i = 0; i < Gia_ManPiNum(pStart); i++ )
3666 pInitNew[i] = pInit[i];
3667 for ( i = k = Gia_ManPiNum(pStart); i < Gia_ManCiNum(pStart); i++ )
3668 if ( pInit[i] == 'x' || pInit[i] == 'X' )
3669 pInitNew[k++] = pInit[i];
3670 pInitNew[k] = 0;
3671 assert( k == Gia_ManPiNum(pUndc) );
3672 // derive miter
3673 pNew = Gia_ManStart( Gia_ManObjNum(pUndc) );
3674 pNew->pName = Abc_UtilStrsav( pUndc->pName );
3675 pNew->pSpec = Abc_UtilStrsav( pUndc->pSpec );
3676 Gia_ManConst0(pUndc)->Value = 0;
3677 Gia_ManHashAlloc( pNew );
3678 // add PIs of the first side
3679 Gia_ManForEachPi( pUndc, pObj, i )
3680 pObj->Value = Gia_ManAppendCi( pNew );
3681 // add PIs of the second side
3682 vCiValues = Vec_IntAlloc( Gia_ManPiNum(pUndc) );
3683 Gia_ManForEachPi( pUndc, pObj, i )
3684 if ( pInitNew[i] == 'x' )
3685 Vec_IntPush( vCiValues, Gia_Obj2Lit( pNew, Gia_ManPi(pNew, i) ) );
3686 else if ( pInitNew[i] == 'X' )
3687 Vec_IntPush( vCiValues, Gia_ManAppendCi( pNew ) );
3688 else assert( 0 );
3689 // build flops and internal nodes
3690 Gia_ManForEachRo( pUndc, pObj, i )
3691 pObj->Value = Gia_ManAppendCi( pNew );
3692 Gia_ManForEachAnd( pUndc, pObj, i )
3693 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3694 // collect CO values
3695 vCoValues0 = Vec_IntAlloc( Gia_ManPoNum(pUndc) );
3696 Gia_ManForEachCo( pUndc, pObj, i )
3697 Vec_IntPush( vCoValues0, Gia_ObjFanin0Copy(pObj) );
3698 // build the other side
3699 Gia_ManForEachPi( pUndc, pObj, i )
3700 pObj->Value = Vec_IntEntry( vCiValues, i );
3701 Gia_ManForEachRo( pUndc, pObj, i )
3702 pObj->Value = Gia_ManAppendCi( pNew );
3703 Gia_ManForEachAnd( pUndc, pObj, i )
3704 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3705 // collect CO values
3706 vCoValues1 = Vec_IntAlloc( Gia_ManPoNum(pUndc) );
3707 Gia_ManForEachCo( pUndc, pObj, i )
3708 Vec_IntPush( vCoValues1, Gia_ObjFanin0Copy(pObj) );
3709 // create POs
3710 Gia_ManForEachPo( pUndc, pObj, i )
3711 pObj->Value = Gia_ManAppendCo( pNew, Gia_ManHashXor( pNew, Vec_IntEntry(vCoValues0, i), Vec_IntEntry(vCoValues1, i) ) );
3712 // create flop inputs
3713 Gia_ManForEachRi( pUndc, pObj, i )
3714 pObj->Value = Gia_ManAppendCo( pNew, Vec_IntEntry(vCoValues0, Gia_ManPoNum(pUndc)+i) );
3715 Gia_ManForEachRi( pUndc, pObj, i )
3716 pObj->Value = Gia_ManAppendCo( pNew, Vec_IntEntry(vCoValues1, Gia_ManPoNum(pUndc)+i) );
3717 Vec_IntFree( vCoValues0 );
3718 Vec_IntFree( vCoValues1 );
3719 Vec_IntFree( vCiValues );
3720 ABC_FREE( pInitNew );
3721 // cleanup
3722 Gia_ManHashStop( pNew );
3723 Gia_ManSetRegNum( pNew, 2*Gia_ManRegNum(pUndc) );
3724 Gia_ManStop( pUndc );
3725 pNew = Gia_ManCleanup( pTemp = pNew );
3726 Gia_ManStop( pTemp );
3727 return pNew;
3728}
3729
3742{
3743 if ( ~pObj->Value )
3744 return pObj->Value;
3745 Gia_ManChoiceMiter_rec( pNew, p, Gia_ObjFanin0(pObj) );
3746 if ( Gia_ObjIsCo(pObj) )
3747 return pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3748 Gia_ManChoiceMiter_rec( pNew, p, Gia_ObjFanin1(pObj) );
3749 return pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3750}
3751
3764{
3765 Gia_Man_t * pNew, * pGia, * pGia0;
3766 int i, k, iNode, nNodes;
3767 // make sure they have equal parameters
3768 assert( Vec_PtrSize(vGias) > 0 );
3769 pGia0 = (Gia_Man_t *)Vec_PtrEntry( vGias, 0 );
3770 Vec_PtrForEachEntry( Gia_Man_t *, vGias, pGia, i )
3771 {
3772 assert( Gia_ManCiNum(pGia) == Gia_ManCiNum(pGia0) );
3773 assert( Gia_ManCoNum(pGia) == Gia_ManCoNum(pGia0) );
3774 assert( Gia_ManRegNum(pGia) == Gia_ManRegNum(pGia0) );
3775 Gia_ManFillValue( pGia );
3776 Gia_ManConst0(pGia)->Value = 0;
3777 }
3778 // start the new manager
3779 pNew = Gia_ManStart( Vec_PtrSize(vGias) * Gia_ManObjNum(pGia0) );
3780 pNew->pName = Abc_UtilStrsav( pGia0->pName );
3781 pNew->pSpec = Abc_UtilStrsav( pGia0->pSpec );
3782 // create new CIs and assign them to the old manager CIs
3783 for ( k = 0; k < Gia_ManCiNum(pGia0); k++ )
3784 {
3785 iNode = Gia_ManAppendCi(pNew);
3786 Vec_PtrForEachEntry( Gia_Man_t *, vGias, pGia, i )
3787 Gia_ManCi( pGia, k )->Value = iNode;
3788 }
3789 // create internal nodes
3790 Gia_ManHashAlloc( pNew );
3791 for ( k = 0; k < Gia_ManCoNum(pGia0); k++ )
3792 {
3793 Vec_PtrForEachEntry( Gia_Man_t *, vGias, pGia, i )
3794 Gia_ManChoiceMiter_rec( pNew, pGia, Gia_ManCo( pGia, k ) );
3795 }
3796 Gia_ManHashStop( pNew );
3797 // check the presence of dangling nodes
3798 nNodes = Gia_ManHasDangling( pNew );
3799 //assert( nNodes == 0 );
3800 // finalize
3801 Gia_ManSetRegNum( pNew, Gia_ManRegNum(pGia0) );
3802 return pNew;
3803}
3804
3817{
3818 Gia_Man_t * pNew;
3819 Gia_Obj_t * pObj;
3820 int i, nConstr = 0;
3821 pNew = Gia_ManStart( Gia_ManObjNum(p) );
3822 pNew->pName = Abc_UtilStrsav( p->pName );
3823 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
3824 Gia_ManConst0(p)->Value = 0;
3825 Gia_ManForEachCi( p, pObj, i )
3826 pObj->Value = Gia_ManAppendCi(pNew);
3827 Gia_ManForEachAnd( p, pObj, i )
3828 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3829 Gia_ManForEachPo( p, pObj, i )
3830 if ( Vec_IntEntry(vPoTypes, i) == 0 ) // regular PO
3831 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3832 Gia_ManForEachPo( p, pObj, i )
3833 if ( Vec_IntEntry(vPoTypes, i) == 1 ) // constraint (should be complemented!)
3834 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) ^ 1 ), nConstr++;
3835 Gia_ManForEachRi( p, pObj, i )
3836 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3837// Gia_ManDupRemapEquiv( pNew, p );
3838 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
3839 pNew->nConstrs = nConstr;
3840 assert( Gia_ManIsNormalized(pNew) );
3841 return pNew;
3842}
3843
3856{
3857 Gia_Obj_t * pObj1 = *pp1;
3858 Gia_Obj_t * pObj2 = *pp2;
3859 return Gia_ObjCioId(pObj1) - Gia_ObjCioId(pObj2);
3860}
3861void Gia_ManDupCones_rec( Gia_Man_t * p, Gia_Obj_t * pObj, Vec_Ptr_t * vLeaves, Vec_Ptr_t * vNodes, Vec_Ptr_t * vRoots )
3862{
3863 if ( Gia_ObjIsTravIdCurrent(p, pObj) )
3864 return;
3865 Gia_ObjSetTravIdCurrent(p, pObj);
3866 if ( Gia_ObjIsAnd(pObj) )
3867 {
3868 Gia_ManDupCones_rec( p, Gia_ObjFanin0(pObj), vLeaves, vNodes, vRoots );
3869 Gia_ManDupCones_rec( p, Gia_ObjFanin1(pObj), vLeaves, vNodes, vRoots );
3870 Vec_PtrPush( vNodes, pObj );
3871 }
3872 else if ( Gia_ObjIsCo(pObj) )
3873 Gia_ManDupCones_rec( p, Gia_ObjFanin0(pObj), vLeaves, vNodes, vRoots );
3874 else if ( Gia_ObjIsRo(p, pObj) )
3875 Vec_PtrPush( vRoots, Gia_ObjRoToRi(p, pObj) );
3876 else if ( Gia_ObjIsPi(p, pObj) )
3877 Vec_PtrPush( vLeaves, pObj );
3878 else assert( 0 );
3879}
3880Gia_Man_t * Gia_ManDupCones( Gia_Man_t * p, int * pPos, int nPos, int fTrimPis )
3881{
3882 Gia_Man_t * pNew;
3883 Vec_Ptr_t * vLeaves, * vNodes, * vRoots;
3884 Gia_Obj_t * pObj;
3885 int i;
3886
3887 // collect initial POs
3888 vLeaves = Vec_PtrAlloc( 100 );
3889 vNodes = Vec_PtrAlloc( 100 );
3890 vRoots = Vec_PtrAlloc( 100 );
3891 for ( i = 0; i < nPos; i++ )
3892 Vec_PtrPush( vRoots, Gia_ManPo(p, pPos[i]) );
3893
3894 // mark internal nodes
3896 Gia_ObjSetTravIdCurrent( p, Gia_ManConst0(p) );
3897 Vec_PtrForEachEntry( Gia_Obj_t *, vRoots, pObj, i )
3898 Gia_ManDupCones_rec( p, pObj, vLeaves, vNodes, vRoots );
3899 Vec_PtrSort( vLeaves, (int (*)(const void *, const void *))Gia_ObjCompareByCioId );
3900
3901 // start the new manager
3902// Gia_ManFillValue( p );
3903 pNew = Gia_ManStart( (fTrimPis ? Vec_PtrSize(vLeaves) : Gia_ManCiNum(p)) + Vec_PtrSize(vNodes) + Vec_PtrSize(vRoots) + 1 );
3904 pNew->pName = Abc_UtilStrsav( p->pName );
3905 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
3906 // map the constant node
3907 Gia_ManConst0(p)->Value = 0;
3908 // create PIs
3909 if ( fTrimPis )
3910 {
3911 Gia_ManForEachPi( p, pObj, i )
3912 pObj->Value = ~0;
3913 Vec_PtrForEachEntry( Gia_Obj_t *, vLeaves, pObj, i )
3914 pObj->Value = Gia_ManAppendCi( pNew );
3915 }
3916 else
3917 {
3918 Gia_ManForEachPi( p, pObj, i )
3919 pObj->Value = Gia_ManAppendCi( pNew );
3920 }
3921 // create LOs
3922 Vec_PtrForEachEntryStart( Gia_Obj_t *, vRoots, pObj, i, nPos )
3923 Gia_ObjRiToRo(p, pObj)->Value = Gia_ManAppendCi( pNew );
3924 // create internal nodes
3925 Vec_PtrForEachEntry( Gia_Obj_t *, vNodes, pObj, i )
3926 if ( Gia_ObjIsXor(pObj) )
3927 pObj->Value = Gia_ManAppendXor( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3928 else
3929 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3930 // create COs
3931 Vec_PtrForEachEntry( Gia_Obj_t *, vRoots, pObj, i )
3932 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3933 // finalize
3934 Gia_ManSetRegNum( pNew, Vec_PtrSize(vRoots)-nPos );
3935 Vec_PtrFree( vLeaves );
3936 Vec_PtrFree( vNodes );
3937 Vec_PtrFree( vRoots );
3938 return pNew;
3939
3940}
3941Gia_Man_t * Gia_ManDupAndCones( Gia_Man_t * p, int * pAnds, int nAnds, int fTrimPis )
3942{
3943 Gia_Man_t * pNew;
3944 Vec_Ptr_t * vLeaves, * vNodes, * vRoots;
3945 Gia_Obj_t * pObj;
3946 int i;
3947
3948 // collect initial POs
3949 vLeaves = Vec_PtrAlloc( 100 );
3950 vNodes = Vec_PtrAlloc( 100 );
3951 vRoots = Vec_PtrAlloc( 100 );
3952 for ( i = 0; i < nAnds; i++ )
3953// Vec_PtrPush( vRoots, Gia_ManPo(p, pPos[i]) );
3954 Vec_PtrPush( vRoots, Gia_ManObj(p, pAnds[i]) );
3955
3956 // mark internal nodes
3958 Gia_ObjSetTravIdCurrent( p, Gia_ManConst0(p) );
3959 Vec_PtrForEachEntry( Gia_Obj_t *, vRoots, pObj, i )
3960 Gia_ManDupCones_rec( p, pObj, vLeaves, vNodes, vRoots );
3961 Vec_PtrSort( vLeaves, (int (*)(const void *, const void *))Gia_ObjCompareByCioId );
3962
3963 // start the new manager
3964// Gia_ManFillValue( p );
3965 pNew = Gia_ManStart( Vec_PtrSize(vLeaves) + Vec_PtrSize(vNodes) + Vec_PtrSize(vRoots) + 1);
3966 pNew->pName = Abc_UtilStrsav( p->pName );
3967 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
3968 // map the constant node
3969 Gia_ManConst0(p)->Value = 0;
3970 // create PIs
3971 if ( fTrimPis )
3972 {
3973 Vec_PtrForEachEntry( Gia_Obj_t *, vLeaves, pObj, i )
3974 pObj->Value = Gia_ManAppendCi( pNew );
3975 }
3976 else
3977 {
3978 Gia_ManForEachPi( p, pObj, i )
3979 pObj->Value = Gia_ManAppendCi( pNew );
3980 }
3981 // create LOs
3982// Vec_PtrForEachEntryStart( Gia_Obj_t *, vRoots, pObj, i, nPos )
3983// Gia_ObjRiToRo(p, pObj)->Value = Gia_ManAppendCi( pNew );
3984 // create internal nodes
3985 Vec_PtrForEachEntry( Gia_Obj_t *, vNodes, pObj, i )
3986 if ( Gia_ObjIsMux(p, pObj) )
3987 pObj->Value = Gia_ManAppendMux( pNew, Gia_ObjFanin2Copy(p, pObj), Gia_ObjFanin1Copy(pObj), Gia_ObjFanin0Copy(pObj) );
3988 else if ( Gia_ObjIsXor(pObj) )
3989 pObj->Value = Gia_ManAppendXor( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3990 else
3991 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
3992 // create COs
3993 Vec_PtrForEachEntry( Gia_Obj_t *, vRoots, pObj, i )
3994// Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
3995 Gia_ManAppendCo( pNew, pObj->Value );
3996 // finalize
3997// Gia_ManSetRegNum( pNew, Vec_PtrSize(vRoots)-nPos );
3998 Gia_ManSetRegNum( pNew, 0 );
3999 Vec_PtrFree( vLeaves );
4000 Vec_PtrFree( vNodes );
4001 Vec_PtrFree( vRoots );
4002 return pNew;
4003
4004}
4005void Gia_ManDupAndConesLimit_rec( Gia_Man_t * pNew, Gia_Man_t * p, int iObj, int Level )
4006{
4007 Gia_Obj_t * pObj = Gia_ManObj(p, iObj);
4008 if ( ~pObj->Value )
4009 return;
4010 if ( !Gia_ObjIsAnd(pObj) || Gia_ObjLevel(p, pObj) < Level )
4011 {
4012 pObj->Value = Gia_ManAppendCi( pNew );
4013 //printf( "PI %d for %d.\n", Abc_Lit2Var(pObj->Value), iObj );
4014 return;
4015 }
4016 Gia_ManDupAndConesLimit_rec( pNew, p, Gia_ObjFaninId0(pObj, iObj), Level );
4017 Gia_ManDupAndConesLimit_rec( pNew, p, Gia_ObjFaninId1(pObj, iObj), Level );
4018 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
4019 //printf( "Obj %d for %d.\n", Abc_Lit2Var(pObj->Value), iObj );
4020}
4021Gia_Man_t * Gia_ManDupAndConesLimit( Gia_Man_t * p, int * pAnds, int nAnds, int Level )
4022{
4023 Gia_Man_t * pNew;
4024 int i;
4025 pNew = Gia_ManStart( 1000 );
4026 pNew->pName = Abc_UtilStrsav( p->pName );
4027 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
4028 Gia_ManLevelNum( p );
4030 Gia_ManConst0(p)->Value = 0;
4031 for ( i = 0; i < nAnds; i++ )
4032 Gia_ManDupAndConesLimit_rec( pNew, p, pAnds[i], Level );
4033 for ( i = 0; i < nAnds; i++ )
4034 Gia_ManAppendCo( pNew, Gia_ManObj(p, pAnds[i])->Value );
4035 return pNew;
4036}
4037
4038void Gia_ManDupAndConesLimit2_rec( Gia_Man_t * pNew, Gia_Man_t * p, int iObj, int Level )
4039{
4040 Gia_Obj_t * pObj = Gia_ManObj(p, iObj);
4041 if ( ~pObj->Value )
4042 return;
4043 if ( !Gia_ObjIsAnd(pObj) || Level <= 0 )
4044 {
4045 pObj->Value = Gia_ManAppendCi( pNew );
4046 //printf( "PI %d for %d.\n", Abc_Lit2Var(pObj->Value), iObj );
4047 return;
4048 }
4049 Gia_ManDupAndConesLimit2_rec( pNew, p, Gia_ObjFaninId0(pObj, iObj), Level-1 );
4050 Gia_ManDupAndConesLimit2_rec( pNew, p, Gia_ObjFaninId1(pObj, iObj), Level-1 );
4051 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
4052 //printf( "Obj %d for %d.\n", Abc_Lit2Var(pObj->Value), iObj );
4053}
4054Gia_Man_t * Gia_ManDupAndConesLimit2( Gia_Man_t * p, int * pAnds, int nAnds, int Level )
4055{
4056 Gia_Man_t * pNew;
4057 int i;
4058 pNew = Gia_ManStart( 1000 );
4059 pNew->pName = Abc_UtilStrsav( p->pName );
4060 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
4062 Gia_ManConst0(p)->Value = 0;
4063 for ( i = 0; i < nAnds; i++ )
4064 Gia_ManDupAndConesLimit2_rec( pNew, p, pAnds[i], Level );
4065 for ( i = 0; i < nAnds; i++ )
4066 Gia_ManAppendCo( pNew, Gia_ManObj(p, pAnds[i])->Value );
4067 return pNew;
4068
4069}
4070
4082Gia_Man_t * Gia_ManOneHot( int nSkips, int nVars )
4083{
4084 Gia_Man_t * p;
4085 int i, b, Shift, iGiaLit, nLogVars = Abc_Base2Log( nVars );
4086 int * pTemp = ABC_CALLOC( int, (1 << nLogVars) );
4087 p = Gia_ManStart( nSkips + 4 * nVars + 1 );
4088 p->pName = Abc_UtilStrsav( "onehot" );
4089 for ( i = 0; i < nSkips; i++ )
4090 Gia_ManAppendCi( p );
4091 for ( i = 0; i < nVars; i++ )
4092 pTemp[i] = Gia_ManAppendCi( p );
4094 for ( b = 0; b < nLogVars; b++ )
4095 for ( i = 0, Shift = (1<<b); i < (1 << nLogVars); i += 2*Shift )
4096 {
4097 iGiaLit = Gia_ManHashAnd( p, pTemp[i], pTemp[i + Shift] );
4098 if ( iGiaLit )
4099 Gia_ManAppendCo( p, iGiaLit );
4100 pTemp[i] = Gia_ManHashOr( p, pTemp[i], pTemp[i + Shift] );
4101 }
4102 Gia_ManHashStop( p );
4103 Gia_ManAppendCo( p, Abc_LitNot(pTemp[0]) );
4104 ABC_FREE( pTemp );
4105 assert( Gia_ManObjNum(p) <= nSkips + 4 * nVars + 1 );
4106 return p;
4107}
4109{
4110 Gia_Man_t * pOneHot, * pNew = Gia_ManDup( p );
4111 if ( Gia_ManRegNum(pNew) == 0 )
4112 {
4113 Abc_Print( 0, "Appending 1-hotness constraints to the PIs.\n" );
4114 pOneHot = Gia_ManOneHot( 0, Gia_ManCiNum(pNew) );
4115 }
4116 else
4117 pOneHot = Gia_ManOneHot( Gia_ManPiNum(pNew), Gia_ManRegNum(pNew) );
4118 Gia_ManDupAppendShare( pNew, pOneHot );
4119 pNew->nConstrs += Gia_ManPoNum(pOneHot);
4120 Gia_ManStop( pOneHot );
4121 return pNew;
4122}
4123
4136{
4137 Gia_Man_t * pNew;
4138 Gia_Obj_t * pObj;
4139 int i, nLevels = Gia_ManLevelNum( p );
4140 int * pCounts = ABC_CALLOC( int, nLevels + 1 );
4141 int * pNodes = ABC_ALLOC( int, Gia_ManAndNum(p) );
4142 Gia_ManForEachAnd( p, pObj, i )
4143 pCounts[Gia_ObjLevel(p, pObj)]++;
4144 for ( i = 1; i <= nLevels; i++ )
4145 pCounts[i] += pCounts[i-1];
4146 Gia_ManForEachAnd( p, pObj, i )
4147 pNodes[pCounts[Gia_ObjLevel(p, pObj)-1]++] = i;
4148 // duplicate
4149 pNew = Gia_ManStart( Gia_ManObjNum(p) );
4150 pNew->pName = Abc_UtilStrsav( p->pName );
4151 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
4152 Gia_ManConst0(p)->Value = 0;
4153 Gia_ManForEachCi( p, pObj, i )
4154 pObj->Value = Gia_ManAppendCi( pNew );
4155 for ( i = 0; i < Gia_ManAndNum(p) && (pObj = Gia_ManObj(p, pNodes[i])); i++ )
4156 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
4157 Gia_ManForEachCo( p, pObj, i )
4158 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
4159 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
4160 ABC_FREE( pCounts );
4161 ABC_FREE( pNodes );
4162 return pNew;
4163}
4164
4176Gia_Man_t * Gia_ManDupFromVecs( Gia_Man_t * p, Vec_Int_t * vCis, Vec_Int_t * vAnds, Vec_Int_t * vCos, int nRegs )
4177{
4178 Gia_Man_t * pNew;
4179 Gia_Obj_t * pObj;
4180 int i;
4181 // start the new manager
4182 pNew = Gia_ManStart( 5000 );
4183 pNew->pName = Abc_UtilStrsav( p->pName );
4184 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
4185 // create constant
4186 Gia_ManConst0(p)->Value = 0;
4187 // create PIs
4188 Gia_ManForEachObjVec( vCis, p, pObj, i )
4189 pObj->Value = Gia_ManAppendCi( pNew );
4190 // create internal nodes
4191 Gia_ManForEachObjVec( vAnds, p, pObj, i )
4192 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
4193 // create ROs
4194 Gia_ManForEachObjVec( vCos, p, pObj, i )
4195 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
4196 Gia_ManSetRegNum( pNew, nRegs );
4197 return pNew;
4198}
4199
4212{
4213 Gia_Man_t * pNew;
4214 Gia_Obj_t * pObj;
4215 int i;
4216 // start the new manager
4217 pNew = Gia_ManStart( 5000 );
4218 pNew->pName = Abc_UtilStrsav( p->pName );
4219 // create constant and PIs
4220 Gia_ManConst0(p)->Value = 0;
4221 Gia_ManForEachCi( p, pObj, i )
4222 pObj->Value = Gia_ManAppendCi( pNew );
4223 // create internal nodes
4225 Gia_ManForEachAnd( p, pObj, i )
4226 if ( Gia_ManSuppSize(p, &i, 1) <= nSuppMax )
4227 {
4228 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
4229 pObj->fMark0 = 1;
4230 }
4231 else
4232 {
4233 Gia_ObjFanin0(pObj)->fMark1 = 1;
4234 Gia_ObjFanin1(pObj)->fMark1 = 1;
4235 }
4236 Gia_ManForEachCo( p, pObj, i )
4237 Gia_ObjFanin0(pObj)->fMark1 = 1;
4238 // add POs for the nodes pointed to
4239 Gia_ManForEachAnd( p, pObj, i )
4240 if ( pObj->fMark0 && pObj->fMark1 )
4241 Gia_ManAppendCo( pNew, pObj->Value );
4242 // cleanup and leave
4244 return pNew;
4245}
4246
4247
4260{
4261 if ( (Gia_IsComplement(pObj) || !Gia_ObjIsAnd(pObj)) && !fFirst )
4262 {
4263 Vec_IntPushUnique( vSuper, Gia_ObjToLit(p, pObj) );
4264 return;
4265 }
4266 Gia_ManDupWithConstrCollectAnd_rec( p, Gia_ObjChild0(pObj), vSuper, 0 );
4267 Gia_ManDupWithConstrCollectAnd_rec( p, Gia_ObjChild1(pObj), vSuper, 0 );
4268}
4270{
4271 Vec_Int_t * vSuper;
4272 Gia_Man_t * pNew, * pTemp;
4273 Gia_Obj_t * pObj;
4274 int i, iDriver, iLit, iLitBest = -1, LevelBest = -1;
4275 assert( Gia_ManPoNum(p) == 1 );
4276 assert( Gia_ManRegNum(p) == 0 );
4277 pObj = Gia_ManPo( p, 0 );
4278 if ( Gia_ObjFaninC0(pObj) )
4279 {
4280 printf( "The miter's output is not AND-decomposable.\n" );
4281 return NULL;
4282 }
4283 if ( Gia_ObjFaninId0p(p, pObj) == 0 )
4284 {
4285 printf( "The miter's output is a constant.\n" );
4286 return NULL;
4287 }
4288 vSuper = Vec_IntAlloc( 100 );
4289 Gia_ManDupWithConstrCollectAnd_rec( p, Gia_ObjChild0(pObj), vSuper, 1 );
4290 assert( Vec_IntSize(vSuper) > 1 );
4291 // find the highest level
4292 Gia_ManLevelNum( p );
4293 Vec_IntForEachEntry( vSuper, iLit, i )
4294 if ( LevelBest < Gia_ObjLevelId(p, Abc_Lit2Var(iLit)) )
4295 LevelBest = Gia_ObjLevelId(p, Abc_Lit2Var(iLit)), iLitBest = iLit;
4296 assert( iLitBest != -1 );
4297 // create new manager
4298 pNew = Gia_ManStart( Gia_ManObjNum(p) );
4299 pNew->pName = Abc_UtilStrsav( p->pName );
4300 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
4301 Gia_ManConst0(p)->Value = 0;
4302 Gia_ManHashAlloc( pNew );
4303 Gia_ManForEachObj1( p, pObj, i )
4304 {
4305 if ( Gia_ObjIsAnd(pObj) )
4306 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
4307 else if ( Gia_ObjIsCi(pObj) )
4308 pObj->Value = Gia_ManAppendCi( pNew );
4309 }
4310 // create AND of nodes
4311 iDriver = -1;
4312 Vec_IntForEachEntry( vSuper, iLit, i )
4313 {
4314 if ( iLit == iLitBest )
4315 continue;
4316 if ( iDriver == -1 )
4317 iDriver = Gia_ObjLitCopy(p, iLit);
4318 else
4319 iDriver = Gia_ManHashAnd( pNew, iDriver, Gia_ObjLitCopy(p, iLit) );
4320 }
4321 // create the main PO
4322 Gia_ManAppendCo( pNew, Gia_ObjLitCopy(p, iLitBest) );
4323 // create the constraint PO
4324 Gia_ManAppendCo( pNew, Abc_LitNot(iDriver) );
4325 pNew->nConstrs = 1;
4326 // rehash
4327 pNew = Gia_ManCleanup( pTemp = pNew );
4328 Gia_ManStop( pTemp );
4329 Vec_IntFree( vSuper );
4330 return pNew;
4331
4332}
4333
4346{
4347 int Diff = Gia_Regular(*pp1)->Value - Gia_Regular(*pp2)->Value;
4348 if ( Diff < 0 )
4349 return -1;
4350 if ( Diff > 0 )
4351 return 1;
4352 return 0;
4353}
4354
4367{
4368 Gia_Man_t * pNew;
4369 Gia_Obj_t * pObj;
4370 int i;
4371 pNew = Gia_ManStart( Gia_ManObjNum(p) );
4372 pNew->pName = Abc_UtilStrsav( p->pName );
4373 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
4374 Gia_ManConst0(p)->Value = 0;
4375 Gia_ManForEachCi( p, pObj, i )
4376 pObj->Value = Gia_ManAppendCi(pNew);
4377 Gia_ManForEachAnd( p, pObj, i )
4378 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
4379 Gia_ManForEachPo( p, pObj, i )
4380 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
4381 Gia_ManForEachAnd( p, pObj, i )
4382 Gia_ManAppendCo( pNew, pObj->Value );
4383 Gia_ManForEachRi( p, pObj, i )
4384 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
4385 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
4386 assert( Gia_ManIsNormalized(pNew) );
4387 return pNew;
4388}
4389
4402{
4403 abctime clk = Abc_Clock();
4404 Gia_Obj_t * pObj; int i, Id;
4405 Vec_Wec_t * vSuppsNo = Vec_WecStart( Vec_IntSize(vNodes) );
4406 Vec_Wec_t * vSupps = Vec_WecStart( Gia_ManObjNum(p) );
4407 Gia_ManForEachCiId( p, Id, i )
4408 Vec_IntPush( Vec_WecEntry(vSupps, Id), i );
4409 Gia_ManForEachAnd( p, pObj, Id )
4410 Vec_IntTwoMerge2( Vec_WecEntry(vSupps, Gia_ObjFaninId0(pObj, Id)),
4411 Vec_WecEntry(vSupps, Gia_ObjFaninId1(pObj, Id)),
4412 Vec_WecEntry(vSupps, Id) );
4413 Gia_ManForEachObjVec( vNodes, p, pObj, i )
4414 Vec_IntAppend( Vec_WecEntry(vSuppsNo, i), Vec_WecEntry(vSupps, Gia_ObjId(p, pObj)) );
4415 Vec_WecFree( vSupps );
4416 if ( fVerbose )
4417 Abc_PrintTime( 1, "Support computation", Abc_Clock() - clk );
4418 return vSuppsNo;
4419}
4420
4422{
4423 abctime clk = Abc_Clock();
4424 Gia_Obj_t * pObj; int i, Id;
4425 Vec_Wec_t * vSuppsCo = Vec_WecStart( Gia_ManCoNum(p) );
4426 Vec_Wec_t * vSupps = Vec_WecStart( Gia_ManObjNum(p) );
4427 Gia_ManForEachCiId( p, Id, i )
4428 Vec_IntPush( Vec_WecEntry(vSupps, Id), i );
4429 Gia_ManForEachAnd( p, pObj, Id )
4430 Vec_IntTwoMerge2( Vec_WecEntry(vSupps, Gia_ObjFaninId0(pObj, Id)),
4431 Vec_WecEntry(vSupps, Gia_ObjFaninId1(pObj, Id)),
4432 Vec_WecEntry(vSupps, Id) );
4433 Gia_ManForEachCo( p, pObj, i )
4434 Vec_IntAppend( Vec_WecEntry(vSuppsCo, i), Vec_WecEntry(vSupps, Gia_ObjFaninId0p(p, pObj)) );
4435 Vec_WecFree( vSupps );
4436 if ( fVerbose )
4437 Abc_PrintTime( 1, "Support computation", Abc_Clock() - clk );
4438 return vSuppsCo;
4439}
4441{
4442 Gia_Obj_t * pObj;
4443 Vec_Int_t * vSuppOne;
4444 int i, nSuppMax = 1;
4445 Gia_ManForEachCo( p, pObj, i )
4446 {
4447 vSuppOne = Vec_WecEntry( vSupps, i );
4448 nSuppMax = Abc_MaxInt( nSuppMax, Vec_IntSize(vSuppOne) );
4449 }
4450 return nSuppMax;
4451}
4453{
4454 Gia_Obj_t * pObj;
4455 Vec_Int_t * vSuppOne;
4456 int i, iCoMax = -1, nSuppMax = -1;
4457 Gia_ManForEachCo( p, pObj, i )
4458 {
4459 vSuppOne = Vec_WecEntry( vSupps, i );
4460 if ( nSuppMax < Vec_IntSize(vSuppOne) )
4461 {
4462 nSuppMax = Vec_IntSize(vSuppOne);
4463 iCoMax = i;
4464 }
4465 }
4466 return iCoMax;
4467}
4469{
4470 Vec_Int_t * vOrder = Vec_IntAlloc( Gia_ManCoNum(p) );
4471 Vec_Wrd_t * vSortData = Vec_WrdAlloc( Gia_ManCoNum(p) );
4472 Vec_Int_t * vSuppOne; word Entry; int i;
4473 Vec_WecForEachLevel( vSupps, vSuppOne, i )
4474 Vec_WrdPush( vSortData, ((word)i << 32) | Vec_IntSize(vSuppOne) );
4475 Abc_QuickSort3( Vec_WrdArray(vSortData), Vec_WrdSize(vSortData), 1 );
4476 Vec_WrdForEachEntry( vSortData, Entry, i )
4477 Vec_IntPush( vOrder, (int)(Entry >> 32) );
4478 Vec_WrdFree( vSortData );
4479 return vOrder;
4480}
4481
4494{
4495 if ( ~pObj->Value )
4496 return pObj->Value;
4497 assert( Gia_ObjIsAnd(pObj) );
4498 Gia_ManDupHashDfs_rec( pNew, p, Gia_ObjFanin0(pObj) );
4499 Gia_ManDupHashDfs_rec( pNew, p, Gia_ObjFanin1(pObj) );
4500 return pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
4501}
4503{
4504 if ( !~pObj->Value )
4505 return;
4506 pObj->Value = ~0;
4507 if ( Gia_ObjIsCi(pObj) )
4508 return;
4509 assert( Gia_ObjIsAnd(pObj) );
4510 Gia_ManDupCleanDfs_rec( Gia_ObjFanin0(pObj) );
4511 Gia_ManDupCleanDfs_rec( Gia_ObjFanin1(pObj) );
4512}
4514{
4515 Gia_Obj_t * pObj;
4516 Gia_Man_t * pNew, * pTemp;
4517 Vec_Int_t * vSuppOne, * vCoMapLit;
4518 int i, k, iCi, iLit, nSuppMax;
4519 assert( Gia_ManRegNum(p) == 0 );
4521 vCoMapLit = Vec_IntAlloc( Gia_ManCoNum(p) );
4522 pNew = Gia_ManStart( Gia_ManObjNum(p) );
4523 pNew->pName = Abc_UtilStrsav( p->pName );
4524 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
4525 Gia_ManConst0(p)->Value = 0;
4526 nSuppMax = Gia_ManCoSuppSizeMax( p, vSupps );
4527 for ( i = 0; i < nSuppMax; i++ )
4528 Gia_ManAppendCi(pNew);
4529 Gia_ManHashAlloc( pNew );
4530 Gia_ManForEachCo( p, pObj, i )
4531 {
4532 vSuppOne = Vec_WecEntry( vSupps, i );
4533 if ( Vec_IntSize(vSuppOne) == 0 )
4534 Vec_IntPush( vCoMapLit, Abc_Var2Lit(0, Gia_ObjFaninC0(pObj)) );
4535 else if ( Vec_IntSize(vSuppOne) == 1 )
4536 Vec_IntPush( vCoMapLit, Abc_Var2Lit(1, Gia_ObjFaninC0(pObj)) );
4537 else
4538 {
4539 Vec_IntForEachEntry( vSuppOne, iCi, k )
4540 Gia_ManCi(p, iCi)->Value = Gia_Obj2Lit(pNew, Gia_ManCi(pNew, k) );
4541 Gia_ManDupHashDfs_rec( pNew, p, Gia_ObjFanin0(pObj) );
4542 assert( Gia_ObjFanin0Copy(pObj) < 2 * Gia_ManObjNum(pNew) );
4543 Vec_IntPush( vCoMapLit, Gia_ObjFanin0Copy(pObj) );
4544 Gia_ManDupCleanDfs_rec( Gia_ObjFanin0(pObj) );
4545 }
4546 }
4547 Gia_ManHashStop( pNew );
4548 assert( Vec_IntSize(vCoMapLit) == Gia_ManCoNum(p) );
4549 if ( pvCoMap == NULL ) // do not remap
4550 {
4551 Vec_IntForEachEntry( vCoMapLit, iLit, i )
4552 Gia_ManAppendCo( pNew, iLit );
4553 }
4554 else // remap
4555 {
4556 Vec_Int_t * vCoMapRes = Vec_IntAlloc( Gia_ManCoNum(p) ); // map old CO into new CO
4557 Vec_Int_t * vMap = Vec_IntStartFull( 2*Gia_ManObjNum(pNew) ); // map new lit into new CO
4558 Vec_IntForEachEntry( vCoMapLit, iLit, i )
4559 {
4560 if ( Vec_IntEntry(vMap, iLit) == -1 )
4561 {
4562 Vec_IntWriteEntry( vMap, iLit, Gia_ManCoNum(pNew) );
4563 Gia_ManAppendCo( pNew, iLit );
4564 }
4565 Vec_IntPush( vCoMapRes, Vec_IntEntry(vMap, iLit) );
4566 }
4567 Vec_IntFree( vMap );
4568 *pvCoMap = vCoMapRes;
4569 }
4570 Vec_IntFree( vCoMapLit );
4571 pNew = Gia_ManCleanup( pTemp = pNew );
4572 Gia_ManStop( pTemp );
4573 return pNew;
4574}
4575Gia_Man_t * Gia_ManIsoStrashReduce2( Gia_Man_t * p, Vec_Ptr_t ** pvPosEquivs, int fVerbose )
4576{
4577 Vec_Int_t * vCoMap;
4578 Vec_Wec_t * vSupps = Gia_ManCreateCoSupps( p, fVerbose );
4579 Gia_Man_t * pNew = Gia_ManDupStrashReduce( p, vSupps, &vCoMap );
4580 Vec_IntFree( vCoMap );
4581 Vec_WecFree( vSupps );
4582 *pvPosEquivs = NULL;
4583 return pNew;
4584}
4585
4587{
4588 int k, iCi, iLit;
4589 assert( Gia_ObjIsCo(pObj) );
4590 if ( Vec_IntSize(vSupp) == 0 )
4591 return Abc_Var2Lit(0, Gia_ObjFaninC0(pObj));
4592 if ( Vec_IntSize(vSupp) == 1 )
4593 return Abc_Var2Lit(1, Gia_ObjFaninC0(pObj));
4594 Vec_IntForEachEntry( vSupp, iCi, k )
4595 Gia_ManCi(p, iCi)->Value = Gia_Obj2Lit(pNew, Gia_ManCi(pNew, k) );
4596 Gia_ManDupHashDfs_rec( pNew, p, Gia_ObjFanin0(pObj) );
4597 iLit = Gia_ObjFanin0Copy(pObj);
4598 Gia_ManDupCleanDfs_rec( Gia_ObjFanin0(pObj) );
4599 return iLit;
4600}
4602{
4603 Gia_Man_t * pNew;
4604 Gia_Obj_t * pObj;
4605 Vec_Wec_t * vPosEquivs = Vec_WecAlloc( 100 );
4606 Vec_Int_t * vSuppOne, * vMap = Vec_IntAlloc( 10000 );
4607 int i, iLit, nSuppMax = Gia_ManCoSuppSizeMax( p, vSupps );
4608 // count how many times each support size appears
4609 Vec_Int_t * vSizeCount = Vec_IntStart( nSuppMax + 1 );
4610 Vec_WecForEachLevel( vSupps, vSuppOne, i )
4611 Vec_IntAddToEntry( vSizeCount, Vec_IntSize(vSuppOne), 1 );
4612 // create array of unique outputs
4614 pNew = Gia_ManStart( Gia_ManObjNum(p) );
4615 Gia_ManConst0(p)->Value = 0;
4616 for ( i = 0; i < nSuppMax; i++ )
4617 Gia_ManAppendCi(pNew);
4618 Gia_ManHashAlloc( pNew );
4619 Gia_ManForEachCo( p, pObj, i )
4620 {
4621 vSuppOne = Vec_WecEntry( vSupps, i );
4622 if ( Vec_IntEntry(vSizeCount, Vec_IntSize(vSuppOne)) == 1 )
4623 {
4624 Vec_IntPush( Vec_WecPushLevel(vPosEquivs), i );
4625 continue;
4626 }
4627 iLit = Gia_ManIsoStrashReduceOne( pNew, p, pObj, vSuppOne );
4628 Vec_IntFillExtra( vMap, iLit + 1, -1 );
4629 if ( Vec_IntEntry(vMap, iLit) == -1 )
4630 {
4631 Vec_IntWriteEntry( vMap, iLit, Vec_WecSize(vPosEquivs) );
4632 Vec_IntPush( Vec_WecPushLevel(vPosEquivs), i );
4633 continue;
4634 }
4635 Vec_IntPush( Vec_WecEntry(vPosEquivs, Vec_IntEntry(vMap, iLit)), i );
4636 }
4637 Gia_ManHashStop( pNew );
4638 Gia_ManStop( pNew );
4639 Vec_IntFree( vSizeCount );
4640 Vec_IntFree( vMap );
4641 return vPosEquivs;
4642}
4643Gia_Man_t * Gia_ManIsoStrashReduce( Gia_Man_t * p, Vec_Ptr_t ** pvPosEquivs, int fVerbose )
4644{
4645 Vec_Wec_t * vSupps = Gia_ManCreateCoSupps( p, fVerbose );
4646 Vec_Wec_t * vPosEquivs = Gia_ManIsoStrashReduceInt( p, vSupps, fVerbose );
4647 // find the first outputs and derive GIA
4648 Vec_Int_t * vFirsts = Vec_WecCollectFirsts( vPosEquivs );
4649 Gia_Man_t * pNew = Gia_ManDupCones( p, Vec_IntArray(vFirsts), Vec_IntSize(vFirsts), 0 );
4650 Vec_IntFree( vFirsts );
4651 Vec_WecFree( vSupps );
4652 // report and return
4653 if ( fVerbose )
4654 {
4655 printf( "Nontrivial classes:\n" );
4656 Vec_WecPrint( vPosEquivs, 1 );
4657 }
4658 if ( pvPosEquivs )
4659 *pvPosEquivs = Vec_WecConvertToVecPtr( vPosEquivs );
4660 Vec_WecFree( vPosEquivs );
4661 return pNew;
4662}
4663
4676{
4677 Vec_Int_t * vSuper;
4678 Vec_Ptr_t * vSuperPtr;
4679 Gia_Man_t * pNew, * pTemp;
4680 Gia_Obj_t * pObj, * pObjPo;
4681 int i, iLit;
4682 assert( Gia_ManPoNum(p) == 1 );
4683 // decompose
4684 pObjPo = Gia_ManPo( p, 0 );
4685 vSuper = Vec_IntAlloc( 100 );
4686 Gia_ManDupWithConstrCollectAnd_rec( p, Gia_ObjFanin0(pObjPo), vSuper, 1 );
4687 assert( Vec_IntSize(vSuper) > 1 );
4688 // report the result
4689 printf( "The miter is %s-decomposable into %d parts.\n", Gia_ObjFaninC0(pObjPo) ? "OR":"AND", Vec_IntSize(vSuper) );
4690 // create levels
4691 Gia_ManLevelNum( p );
4692 Vec_IntForEachEntry( vSuper, iLit, i )
4693 Gia_ManObj(p, Abc_Lit2Var(iLit))->Value = Gia_ObjLevelId(p, Abc_Lit2Var(iLit));
4694 // create pointer array
4695 vSuperPtr = Vec_PtrAlloc( Vec_IntSize(vSuper) );
4696 Vec_IntForEachEntry( vSuper, iLit, i )
4697 Vec_PtrPush( vSuperPtr, Gia_Lit2Obj(p, iLit) );
4698 Vec_PtrSort( vSuperPtr, (int (*)(const void *, const void *))Gia_ManSortByValue );
4699 // create new manager
4700 pNew = Gia_ManStart( Gia_ManObjNum(p) );
4701 pNew->pName = Abc_UtilStrsav( p->pName );
4702 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
4703 Gia_ManConst0(p)->Value = 0;
4704 Gia_ManHashAlloc( pNew );
4705 Gia_ManForEachCi( p, pObj, i )
4706 pObj->Value = Gia_ManAppendCi( pNew );
4707 Gia_ManForEachAnd( p, pObj, i )
4708 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
4709 // create the outputs
4710 Vec_PtrForEachEntry( Gia_Obj_t *, vSuperPtr, pObj, i )
4711 Gia_ManAppendCo( pNew, Gia_ObjLitCopy(p, Gia_Obj2Lit(p, pObj)) ^ Gia_ObjFaninC0(pObjPo) );
4712 Gia_ManForEachRi( p, pObj, i )
4713 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
4714 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
4715 // rehash
4716 pNew = Gia_ManCleanup( pTemp = pNew );
4717 Gia_ManStop( pTemp );
4718 Vec_IntFree( vSuper );
4719 Vec_PtrFree( vSuperPtr );
4720 return pNew;
4721}
4722
4735{
4736 int i, iObj, * pPerm;
4737 Vec_Int_t * vSizes = Vec_IntAlloc( 100 );
4738 Vec_IntForEachEntry( vXors, iObj, i )
4739 Vec_IntPush( vSizes, Gia_ManSuppSize(p, &iObj, 1) );
4740 pPerm = Abc_MergeSortCost( Vec_IntArray(vSizes), Vec_IntSize(vSizes) );
4741 Vec_IntClear( vSizes );
4742 for ( i = 0; i < Vec_IntSize(vXors); i++ )
4743 Vec_IntPush( vSizes, Vec_IntEntry(vXors, pPerm[i]) );
4744 ABC_FREE( pPerm );
4745 Vec_IntClear( vXors );
4746 Vec_IntAppend( vXors, vSizes );
4747 Vec_IntFree( vSizes );
4748}
4749int Gia_ManDupDemiterFindMin( Vec_Wec_t * vSupps, Vec_Int_t * vTakenIns, Vec_Int_t * vTakenOuts )
4750{
4751 Vec_Int_t * vLevel;
4752 int i, k, iObj, iObjBest = -1;
4753 int Count, CountBest = ABC_INFINITY;
4754 Vec_WecForEachLevel( vSupps, vLevel, i )
4755 {
4756 if ( Vec_IntEntry(vTakenOuts, i) )
4757 continue;
4758 Count = 0;
4759 Vec_IntForEachEntry( vLevel, iObj, k )
4760 Count += !Vec_IntEntry(vTakenIns, iObj);
4761 if ( CountBest > Count )
4762 {
4763 CountBest = Count;
4764 iObjBest = i;
4765 }
4766 }
4767 return iObjBest;
4768}
4770{
4771 extern Vec_Wec_t * Gia_ManCreateNodeSupps( Gia_Man_t * p, Vec_Int_t * vNodes, int fVerbose );
4772 Vec_Wec_t * vSupps = Gia_ManCreateNodeSupps( p, vXors, 0 );
4773 Vec_Int_t * vTakenIns = Vec_IntStart( Gia_ManCiNum(p) );
4774 Vec_Int_t * vTakenOuts = Vec_IntStart( Vec_IntSize(vXors) );
4775 Vec_Int_t * vOrder = Vec_IntAlloc( Vec_IntSize(vXors) );
4776 int i, k, iObj;
4777 // add outputs in the order of increasing supports
4778 for ( i = 0; i < Vec_IntSize(vXors); i++ )
4779 {
4780 int Index = Gia_ManDupDemiterFindMin( vSupps, vTakenIns, vTakenOuts );
4781 assert( Index >= 0 && Index < Vec_IntSize(vXors) );
4782 Vec_IntPush( vOrder, Vec_IntEntry(vXors, Index) );
4783 assert( !Vec_IntEntry( vTakenOuts, Index ) );
4784 Vec_IntWriteEntry( vTakenOuts, Index, 1 );
4785 Vec_IntForEachEntry( Vec_WecEntry(vSupps, Index), iObj, k )
4786 Vec_IntWriteEntry( vTakenIns, iObj, 1 );
4787 }
4788 Vec_WecFree( vSupps );
4789 Vec_IntFree( vTakenIns );
4790 Vec_IntFree( vTakenOuts );
4791 // reload
4792 Vec_IntClear( vXors );
4793 Vec_IntAppend( vXors, vOrder );
4794 Vec_IntFree( vOrder );
4795}
4796
4797
4810{
4811 Gia_Obj_t * pObj;
4812 pObj = Gia_ManObj( p, iObj );
4813 if ( pObj->fMark0 )
4814 return;
4815 pObj->fMark0 = 1;
4816 if ( !Gia_ObjIsAnd(pObj) )
4817 return;
4818 Gia_ManSetMark0Dfs_rec( p, Gia_ObjFaninId0(pObj, iObj) );
4819 Gia_ManSetMark0Dfs_rec( p, Gia_ObjFaninId1(pObj, iObj) );
4820}
4822{
4823 Gia_Obj_t * pObj;
4824 pObj = Gia_ManObj( p, iObj );
4825 if ( pObj->fMark1 )
4826 return;
4827 pObj->fMark1 = 1;
4828 if ( !Gia_ObjIsAnd(pObj) )
4829 return;
4830 Gia_ManSetMark1Dfs_rec( p, Gia_ObjFaninId0(pObj, iObj) );
4831 Gia_ManSetMark1Dfs_rec( p, Gia_ObjFaninId1(pObj, iObj) );
4832}
4833
4835{
4836 Gia_Obj_t * pObj;
4837 if ( Gia_ObjIsTravIdCurrentId(p, iObj) )
4838 return 0;
4839 Gia_ObjSetTravIdCurrentId(p, iObj);
4840 pObj = Gia_ManObj( p, iObj );
4841 if ( !Gia_ObjIsAnd(pObj) )
4842 return pObj->fMark0;
4843 return Gia_ManCountMark0Dfs_rec( p, Gia_ObjFaninId0(pObj, iObj) ) +
4844 Gia_ManCountMark0Dfs_rec( p, Gia_ObjFaninId1(pObj, iObj) ) + pObj->fMark0;
4845}
4847{
4849 return Gia_ManCountMark0Dfs_rec( p, iObj );
4850}
4852{
4853 Gia_Obj_t * pObj;
4854 if ( Gia_ObjIsTravIdCurrentId(p, iObj) )
4855 return 0;
4856 Gia_ObjSetTravIdCurrentId(p, iObj);
4857 pObj = Gia_ManObj( p, iObj );
4858 if ( !Gia_ObjIsAnd(pObj) )
4859 return pObj->fMark1;
4860 return Gia_ManCountMark1Dfs_rec( p, Gia_ObjFaninId0(pObj, iObj) ) +
4861 Gia_ManCountMark1Dfs_rec( p, Gia_ObjFaninId1(pObj, iObj) ) + pObj->fMark1;
4862}
4864{
4866 return Gia_ManCountMark1Dfs_rec( p, iObj );
4867}
4868
4870{
4871 int Count0 = 1, Count1 = 0;
4872 assert( Vec_IntSize(vPart[0]) == Vec_IntSize(vPart[1]) );
4873 if ( Vec_IntSize(vPart[0]) > 0 )
4874 {
4875 Count0 = Gia_ManCountMark0Dfs(p, Gia_ObjId(p, pFan[0])) + Gia_ManCountMark1Dfs(p, Gia_ObjId(p, pFan[1]));
4876 Count1 = Gia_ManCountMark0Dfs(p, Gia_ObjId(p, pFan[1])) + Gia_ManCountMark1Dfs(p, Gia_ObjId(p, pFan[0]));
4877 }
4878 return Count0 < Count1;
4879}
4881{
4882 Gia_Obj_t * pFan0, * pFan1;
4883 int iObj = Gia_ObjId( p, pObj );
4884 if ( Gia_ObjRecognizeExor(pObj, &pFan0, &pFan1) || !Gia_ObjIsAnd(pObj) )
4885 {
4886 Vec_IntPushUnique( vXors, Gia_ObjId(p, pObj) );
4887 return;
4888 }
4889 if ( Gia_ObjFaninC0(pObj) )
4890 Vec_IntPushUnique( vXors, Gia_ObjFaninId0(pObj, iObj) );
4891 else
4892 Gia_ManCollectTopXors_rec( p, Gia_ObjFanin0(pObj), vXors );
4893 if ( Gia_ObjFaninC1(pObj) )
4894 Vec_IntPushUnique( vXors, Gia_ObjFaninId1(pObj, iObj) );
4895 else
4896 Gia_ManCollectTopXors_rec( p, Gia_ObjFanin1(pObj), vXors );
4897}
4899{
4900 int i, iObj, iObj2, fFlip, Count1 = 0;
4901 Vec_Int_t * vXors, * vPart[2], * vOrder;
4902 Gia_Obj_t * pFan[2], * pObj = Gia_ManCo(p, 0);
4903 vXors = Vec_IntAlloc( 100 );
4904 if ( Gia_ManCoNum(p) == 1 )
4905 {
4906 if ( Gia_ObjFaninC0(pObj) )
4907 Gia_ManCollectTopXors_rec( p, Gia_ObjFanin0(pObj), vXors );
4908 else
4909 Vec_IntPush( vXors, Gia_ObjId(p, Gia_ObjFanin0(pObj)) );
4910 }
4911 else
4912 {
4913 Gia_ManForEachCo( p, pObj, i )
4914 if ( Gia_ObjFaninId0p(p, pObj) > 0 )
4915 Vec_IntPush( vXors, Gia_ObjFaninId0p(p, pObj) );
4916 }
4917 // order by support size
4918 Gia_ManDupDemiterOrderXors( p, vXors );
4919 //Vec_IntPrint( vXors );
4920 Vec_IntReverseOrder( vXors ); // from MSB to LSB
4921 // divide into groups
4923 vPart[0] = Vec_IntAlloc( 100 );
4924 vPart[1] = Vec_IntAlloc( 100 );
4925 Gia_ManForEachObjVec( vXors, p, pObj, i )
4926 {
4927 int fCompl = 0;
4928 if ( !Gia_ObjRecognizeExor(pObj, &pFan[0], &pFan[1]) )
4929 pFan[0] = pObj, pFan[1] = Gia_ManConst0(p), Count1++;
4930 else
4931 {
4932 fCompl ^= Gia_IsComplement(pFan[0]);
4933 fCompl ^= Gia_IsComplement(pFan[1]);
4934 pFan[0] = Gia_Regular(pFan[0]);
4935 pFan[1] = Gia_Regular(pFan[1]);
4936 }
4937 fFlip = Gia_ManDecideWhereToAdd( p, vPart, pFan );
4938 Vec_IntPush( vPart[0], Gia_ObjId(p, pFan[fFlip]) );
4939 Vec_IntPush( vPart[1], Gia_ObjId(p, pFan[!fFlip]) );
4940 Gia_ManSetMark0Dfs_rec( p, Gia_ObjId(p, pFan[fFlip]) );
4941 Gia_ManSetMark1Dfs_rec( p, Gia_ObjId(p, pFan[!fFlip]) );
4942 }
4943 //printf( "Detected %d single-output XOR miters and %d other miters.\n", Vec_IntSize(vXors) - Count1, Count1 );
4944 Vec_IntFree( vXors );
4946 // create new order
4947 vOrder = Vec_IntAlloc( 100 );
4948 Vec_IntForEachEntryTwo( vPart[0], vPart[1], iObj, iObj2, i )
4949 Vec_IntPushTwo( vOrder, iObj, iObj2 );
4950 Vec_IntFree( vPart[0] );
4951 Vec_IntFree( vPart[1] );
4952 Vec_IntReverseOrder( vOrder ); // from LSB to MSB
4953 //Vec_IntPrint( vOrder );
4954 return vOrder;
4955}
4957{
4958 Gia_Man_t * pNew; Gia_Obj_t * pObj; int i;
4959 Vec_Int_t * vNodes;
4960 Vec_Int_t * vOrder = Gia_ManCollectTopXors( p );
4961 if ( vOrder == NULL )
4962 {
4963 printf( "Cannot demiter because the top-most gate is an AND-gate.\n" );
4964 return NULL;
4965 }
4966 assert( Vec_IntSize(vOrder) % 2 == 0 );
4967 vNodes = Vec_IntAlloc( Gia_ManObjNum(p) );
4969 Gia_ManCollectAnds( p, Vec_IntArray(vOrder), Vec_IntSize(vOrder), vNodes, NULL );
4970 pNew = Gia_ManStart( 1 + Gia_ManCiNum(p) + Vec_IntSize(vNodes) + Vec_IntSize(vOrder) );
4971 pNew->pName = Abc_UtilStrsav( p->pName );
4972 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
4973 Gia_ManConst0(p)->Value = 0;
4974 Gia_ManForEachCi( p, pObj, i )
4975 pObj->Value = Gia_ManAppendCi( pNew );
4976 Gia_ManForEachObjVec( vNodes, p, pObj, i )
4977 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
4978 pObj = Gia_ManCo(p, 0);
4979 if ( Gia_ObjFanin0(pObj) == Gia_ManConst0(p) )
4980 {
4981 Gia_ManAppendCo( pNew, 0 );
4982 Gia_ManAppendCo( pNew, Gia_ObjFaninC0(pObj) );
4983 }
4984 else
4985 {
4986 Gia_ManSetPhase( p );
4987 Gia_ManForEachObjVec( vOrder, p, pObj, i )
4988 Gia_ManAppendCo( pNew, Abc_LitNotCond(pObj->Value, pObj->fPhase) );
4989 }
4990 Vec_IntFree( vNodes );
4991 Vec_IntFree( vOrder );
4992 return pNew;
4993}
4994
5006void Gia_ManCollectDfs_rec( Gia_Man_t * p, int iObj, Vec_Int_t * vNodes )
5007{
5008 Gia_Obj_t * pObj;
5009 if ( Gia_ObjIsTravIdCurrentId(p, iObj) )
5010 return;
5011 Gia_ObjSetTravIdCurrentId(p, iObj);
5012 pObj = Gia_ManObj( p, iObj );
5013 if ( !Gia_ObjIsAnd(pObj) )
5014 return;
5015 Gia_ManCollectDfs_rec( p, Gia_ObjFaninId0(pObj, iObj), vNodes );
5016 Gia_ManCollectDfs_rec( p, Gia_ObjFaninId1(pObj, iObj), vNodes );
5017 Vec_IntPush( vNodes, iObj );
5018}
5020{
5021 int i, iDriver;
5022 Vec_Int_t * vNodes = Vec_IntAlloc( Gia_ManObjNum(p) );
5024 Gia_ObjSetTravIdCurrent( p, Gia_ManConst0(p) );
5025 Gia_ManForEachCoDriverId( p, iDriver, i )
5026 if ( (i & 1) == fOdd )
5027 Gia_ManCollectDfs_rec( p, iDriver, vNodes );
5028 return vNodes;
5029}
5031{
5032 Gia_Obj_t * pObj;
5033 int i, fOdd;
5034 assert( Gia_ManRegNum(p) == 0 );
5035 assert( Gia_ManCoNum(p) % 2 == 0 );
5036 *pp0 = *pp1 = NULL;
5037 for ( fOdd = 0; fOdd < 2; fOdd++ )
5038 {
5039 Vec_Int_t * vNodes = Gia_ManCollectReach( p, fOdd );
5040 Gia_Man_t * pNew = Gia_ManStart( 1 + Gia_ManCiNum(p) + Vec_IntSize(vNodes) + Gia_ManCoNum(p)/2 );
5041 pNew->pName = Abc_UtilStrsav( p->pName );
5042 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
5043 Gia_ManConst0(p)->Value = 0;
5044 Gia_ManForEachPi( p, pObj, i )
5045 pObj->Value = Gia_ManAppendCi( pNew );
5046 Gia_ManForEachObjVec( vNodes, p, pObj, i )
5047 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
5048 Gia_ManForEachCo( p, pObj, i )
5049 if ( (i & 1) == fOdd )
5050 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
5051 Vec_IntFree( vNodes );
5052 if ( fOdd )
5053 *pp1 = pNew;
5054 else
5055 *pp0 = pNew;
5056 }
5057 return 1;
5058}
5059
5072{
5073 int i, iDriver;
5074 Vec_Int_t * vNodes = Vec_IntAlloc( Gia_ManObjNum(p) );
5076 Gia_ObjSetTravIdCurrent( p, Gia_ManConst0(p) );
5077 Gia_ManForEachCoDriverId( p, iDriver, i )
5078 if ( (i < Gia_ManCoNum(p)/2) ^ fSecond )
5079 Gia_ManCollectDfs_rec( p, iDriver, vNodes );
5080 return vNodes;
5081}
5083{
5084 Gia_Obj_t * pObj;
5085 int i, fSecond;
5086 assert( Gia_ManRegNum(p) == 0 );
5087 assert( Gia_ManCoNum(p) % 2 == 0 );
5088 *pp0 = *pp1 = NULL;
5089 for ( fSecond = 0; fSecond < 2; fSecond++ )
5090 {
5091 Vec_Int_t * vNodes = Gia_ManCollectReach2( p, fSecond );
5092 Gia_Man_t * pNew = Gia_ManStart( 1 + Gia_ManCiNum(p) + Vec_IntSize(vNodes) + Gia_ManCoNum(p)/2 );
5093 pNew->pName = Abc_UtilStrsav( p->pName );
5094 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
5095 Gia_ManConst0(p)->Value = 0;
5096 Gia_ManForEachPi( p, pObj, i )
5097 pObj->Value = Gia_ManAppendCi( pNew );
5098 Gia_ManForEachObjVec( vNodes, p, pObj, i )
5099 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
5100 Gia_ManForEachCo( p, pObj, i )
5101 if ( (i < Gia_ManCoNum(p)/2) ^ fSecond )
5102 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
5103 Vec_IntFree( vNodes );
5104 if ( fSecond )
5105 *pp1 = pNew;
5106 else
5107 *pp0 = pNew;
5108 }
5109 return 1;
5110}
5111
5112
5113
5126{
5127 int i; Gia_Obj_t * pObj;
5128 Gia_Man_t * pNew = Gia_ManStart( Gia_ManObjNum(p) );
5129 pNew->pName = Abc_UtilStrsav( p->pName );
5130 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
5132 Gia_ManConst0(p)->Value = 0;
5133 if ( fSecond )
5134 {
5135 Gia_ManForEachCi( p, pObj, i )
5136 pObj->Value = Gia_ManAppendCi( pNew );
5137 Gia_ManForEachPo( p, pObj, i )
5138 Gia_ManDupOrderDfs_rec( pNew, p, pObj );
5139 Gia_ManForEachRi( p, pObj, i )
5140 if ( i >= Gia_ManRegNum(p)/2 )
5141 Gia_ManDupOrderDfs_rec( pNew, p, pObj );
5142 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p)- Gia_ManRegNum(p)/2 );
5143 }
5144 else
5145 {
5146 Gia_ManForEachPi( p, pObj, i )
5147 pObj->Value = Gia_ManAppendCi( pNew );
5148 Gia_ManForEachRo( p, pObj, i )
5149 if ( i >= Gia_ManRegNum(p)/2 )
5150 pObj->Value = Gia_ManAppendCi( pNew );
5151 Gia_ManForEachRo( p, pObj, i )
5152 if ( i < Gia_ManRegNum(p)/2 )
5153 pObj->Value = Gia_ManAppendCi( pNew );
5154 Gia_ManForEachPo( p, pObj, i )
5155 Gia_ManDupOrderDfs_rec( pNew, p, pObj );
5156 Gia_ManForEachRi( p, pObj, i )
5157 if ( i < Gia_ManRegNum(p)/2 )
5158 Gia_ManDupOrderDfs_rec( pNew, p, pObj );
5159 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p)/2 );
5160 }
5161 return pNew;
5162}
5163
5176{
5177 int i, iObj, * pClasses = ABC_FALLOC( int, Gia_ManObjNum(p) );
5178 int n, Repr, * pClass2Repr = ABC_FALLOC( int, Gia_ManObjNum(p) );
5179 // initialize equiv class representation in the big AIG
5180 assert( p->pReprs == NULL && p->pNexts == NULL );
5181 p->pReprs = ABC_CALLOC( Gia_Rpr_t, Gia_ManObjNum(p) );
5182 for ( i = 0; i < Gia_ManObjNum(p); i++ )
5183 Gia_ObjSetRepr( p, i, GIA_VOID );
5184 // map equivalences of p into classes
5185 pClasses[0] = 0;
5186 for ( n = 0; n < 2; n++ )
5187 {
5188 assert( pPart[n]->pReprs != NULL && pPart[n]->pNexts != NULL );
5189 for ( i = 0; i < Gia_ManObjNum(pPart[n]); i++ )
5190 if ( Gia_ObjRepr(pPart[n], i) == 0 )
5191 pClasses[Gia_ManObj(pPart[n], i)->Value] = 0;
5192 Gia_ManForEachClass( pPart[n], i )
5193 {
5194 Repr = Gia_ManObj(pPart[n], i)->Value;
5195 if ( n == 1 )
5196 {
5197 Gia_ClassForEachObj( pPart[n], i, iObj )
5198 if ( pClasses[Gia_ManObj(pPart[n], iObj)->Value] != -1 )
5199 Repr = pClasses[Gia_ManObj(pPart[n], iObj)->Value];
5200 }
5201 Gia_ClassForEachObj( pPart[n], i, iObj )
5202 pClasses[Gia_ManObj(pPart[n], iObj)->Value] = Repr;
5203 }
5204 }
5205 // map representatives of each class
5206 for ( i = 0; i < Gia_ManObjNum(p); i++ )
5207 if ( pClasses[i] != -1 && pClass2Repr[pClasses[i]] == -1 )
5208 {
5209 pClass2Repr[pClasses[i]] = i;
5210 pClasses[i] = -1;
5211 }
5212 // remap the remaining classes
5213 for ( i = 0; i < Gia_ManObjNum(p); i++ )
5214 if ( pClasses[i] != -1 )
5215 p->pReprs[i].iRepr = pClass2Repr[pClasses[i]];
5216 ABC_FREE(pClasses);
5217 ABC_FREE(pClass2Repr);
5218 // create next pointers
5219 p->pNexts = Gia_ManDeriveNexts( p );
5220}
5221
5234{
5235 Gia_Obj_t * pObj; int i, iObj;
5236 printf( "Const0:" );
5237 Gia_ManForEachAnd( p, pObj, i )
5238 if ( Gia_ObjRepr(p, i) == 0 )
5239 printf( " %d", i );
5240 printf( "\n" );
5242 {
5243 printf( "%d:", i );
5244 Gia_ClassForEachObj1( p, i, iObj )
5245 printf( " %d", iObj );
5246 printf( "\n" );
5247 }
5248}
5249
5262{
5263 Gia_Man_t * pParts[2];
5264 Gia_Obj_t * pObj;
5265 int n, i;
5266 for ( n = 0; n < 2; n++ )
5267 {
5268 // derive n-th part of the AIG
5269 pParts[n] = Gia_ManDupHalfSeq( p, n );
5270 //Gia_ManPrintStats( pParts[n], NULL );
5271 // compute equivalences (recorded internally using pReprs and pNexts)
5272 Cec_ManLSCorrespondenceClasses( pParts[n], pPars );
5273 // make the nodes of the part AIG point to their prototypes in the AIG
5274 Gia_ManForEachObj( p, pObj, i )
5275 if ( ~pObj->Value )
5276 Gia_ManObj( pParts[n], Abc_Lit2Var(pObj->Value) )->Value = i;
5277 }
5278 Gia_ManSeqEquivMerge( p, pParts );
5279 Gia_ManStop( pParts[0] );
5280 Gia_ManStop( pParts[1] );
5281}
5283{
5284 extern Gia_Man_t * Gia_ManCorrReduce( Gia_Man_t * p );
5285 Gia_Man_t * pNew, * pTemp;
5286 ABC_FREE( p->pReprs ); p->pReprs = NULL;
5287 ABC_FREE( p->pNexts ); p->pNexts = NULL;
5288 Gia_ManSeqEquivDivide( p, pPars );
5289 //Gia_ManPrintEquivs( p );
5290 pNew = Gia_ManCorrReduce( p );
5291 pNew = Gia_ManSeqCleanup( pTemp = pNew );
5292 Gia_ManStop( pTemp );
5293 return pNew;
5294}
5295
5308{
5309 Gia_Obj_t * pObj; int i;
5310 Gia_ManForEachPi( p, pObj, i )
5311 pObj->fMark0 = 0;
5312 Gia_ManForEachRo( p, pObj, i )
5313 pObj->fMark0 = 1;
5314 Gia_ManForEachAnd( p, pObj, i )
5315 pObj->fMark0 = Gia_ObjFanin0(pObj)->fMark0 | Gia_ObjFanin1(pObj)->fMark0;
5316 Gia_ManForEachCo( p, pObj, i )
5317 pObj->fMark0 = Gia_ObjFanin0(pObj)->fMark0;
5318}
5320{
5321 Gia_Man_t * pNew; int i;
5322 Gia_Obj_t * pObj, * pFanin;
5324 pNew = Gia_ManStart( Gia_ManObjNum(p) );
5325 pNew->pName = Abc_UtilStrsav( p->pName );
5326 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
5327 // create PIs for nodes pointed to from above the cut
5329 Gia_ManConst0(p)->Value = 0;
5330 Gia_ManForEachAnd( p, pObj, i )
5331 {
5332 if ( !pObj->fMark0 )
5333 continue;
5334 pFanin = Gia_ObjFanin0(pObj);
5335 if ( !pFanin->fMark0 && !~pFanin->Value )
5336 pFanin->Value = Gia_ManAppendCi(pNew);
5337 pFanin = Gia_ObjFanin1(pObj);
5338 if ( !pFanin->fMark0 && !~pFanin->Value )
5339 pFanin->Value = Gia_ManAppendCi(pNew);
5340 }
5341 // create flop outputs
5342 Gia_ManForEachRo( p, pObj, i )
5343 pObj->Value = Gia_ManAppendCi(pNew);
5344 // create internal nodes
5345 Gia_ManForEachCo( p, pObj, i )
5346 Gia_ManDupOrderDfs_rec( pNew, p, pObj );
5347 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
5349 return pNew;
5350}
5351
5364{
5365 Gia_Man_t * pNew; int i, k;
5366 Gia_Obj_t * pObj;
5367 pNew = Gia_ManStart( Gia_ManObjNum(p) + Gia_ManCiNum(p) * nMulti );
5368 pNew->pName = Abc_UtilStrsav( p->pName );
5369 Gia_ManConst0(p)->Value = 0;
5370 Gia_ManForEachCi( p, pObj, i )
5371 {
5372 pObj->Value = Gia_ManAppendCi(pNew);
5373 for ( k = 1; k < nMulti; k++ )
5374 Gia_ManAppendCi(pNew);
5375 }
5376 Gia_ManForEachAnd( p, pObj, i )
5377 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
5378 Gia_ManForEachCo( p, pObj, i )
5379 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
5380 assert( Gia_ManCiNum(pNew) == nMulti * Gia_ManCiNum(p) );
5381 return pNew;
5382}
5383
5396{
5397 Vec_Int_t * vTypes = Vec_IntAlloc( 10 );
5398 int i, Entry;
5399 Vec_IntForEachEntry( vBarBufs, Entry, i )
5400 if ( Vec_IntFind(vTypes, Entry & 0xFFFE) < 0 )
5401 Vec_IntPush( vTypes, Entry & 0xFFFE );
5402 return vTypes;
5403}
5405{
5406 Vec_Int_t * vTypes = Gia_ManDupUifBoxTypes( p->vBarBufs );
5407 Vec_Wec_t ** pvMap = ABC_ALLOC( Vec_Wec_t *, 2*Vec_IntSize(vTypes) );
5408 Vec_Int_t * vBufs = Vec_IntAlloc( p->nBufs );
5409 Gia_Obj_t * pObj; int i, Item, j, k = 0;
5410 Gia_ManForEachObj1( p, pObj, i )
5411 if ( Gia_ObjIsBuf(pObj) )
5412 Vec_IntPush( vBufs, i );
5413 assert( p->nBufs == Vec_IntSize(vBufs) );
5414 for ( i = 0; i < 2*Vec_IntSize(vTypes); i++ )
5415 pvMap[i] = Vec_WecAlloc( 10 );
5416 Vec_IntForEachEntry( p->vBarBufs, Item, i )
5417 {
5418 int Type = Vec_IntFind( vTypes, Item & 0xFFFE );
5419 Vec_Int_t * vVec = Vec_WecPushLevel(pvMap[2*Type + (Item&1)]);
5420 for ( j = 0; j < (Item >> 16); j++ )
5421 Vec_IntPush( vVec, Vec_IntEntry(vBufs, k++) );
5422 }
5423 assert( p->nBufs == k );
5424 for ( i = 0; i < Vec_IntSize(vTypes); i++ )
5425 assert( Vec_WecSize(pvMap[2*i+0]) == Vec_WecSize(pvMap[2*i+1]) );
5426 Vec_IntFree( vTypes );
5427 Vec_IntFree( vBufs );
5428 return pvMap;
5429}
5431{
5432 Vec_Int_t * vTemp = Vec_IntAlloc( Vec_IntSize(vVec0) );
5433 int i, o0, o1, iRes;
5434 Vec_IntForEachEntryTwo( vVec0, vVec1, o0, o1, i )
5435 Vec_IntPush( vTemp, Gia_ManHashXor(pNew, Gia_ManObj(p, o0)->Value, Abc_LitNot(Gia_ManObj(p, o1)->Value)) );
5436 iRes = Gia_ManHashAndMulti( pNew, vTemp );
5437 Vec_IntFree( vTemp );
5438 return iRes;
5439}
5440int Gia_ManDupUifConstr( Gia_Man_t * pNew, Gia_Man_t * p, Vec_Wec_t ** pvMap, int nTypes )
5441{
5442 int t, i, k, iUif = 1;
5443 for ( t = 0; t < nTypes; t++ )
5444 {
5445 assert( Vec_WecSize(pvMap[2*t+0]) == Vec_WecSize(pvMap[2*t+1]) );
5446 for ( i = 0; i < Vec_WecSize(pvMap[2*t+0]); i++ )
5447 for ( k = i + 1; k < Vec_WecSize(pvMap[2*t+0]); k++ )
5448 {
5449 int iCond1 = Gia_ManDupUifConstrOne( pNew, p, Vec_WecEntry(pvMap[2*t+0], i), Vec_WecEntry(pvMap[2*t+0], k) );
5450 int iCond2 = Gia_ManDupUifConstrOne( pNew, p, Vec_WecEntry(pvMap[2*t+1], i), Vec_WecEntry(pvMap[2*t+1], k) );
5451 int iRes = Gia_ManHashOr( pNew, Abc_LitNot(iCond1), iCond2 );
5452 iUif = Gia_ManHashAnd( pNew, iUif, iRes );
5453 }
5454 }
5455 return iUif;
5456}
5458{
5459 Vec_Int_t * vTypes = Gia_ManDupUifBoxTypes( p->vBarBufs );
5460 Vec_Wec_t ** pvMap = Gia_ManDupUifBuildMap( p );
5461 Gia_Man_t * pNew, * pTemp; Gia_Obj_t * pObj;
5462 int i, iUif = 0;
5463 pNew = Gia_ManStart( Gia_ManObjNum(p) );
5464 pNew->pName = Abc_UtilStrsav( p->pName );
5465 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
5466 Gia_ManConst0(p)->Value = 0;
5467 Gia_ManHashAlloc( pNew );
5468 Gia_ManForEachObj1( p, pObj, i )
5469 {
5470 if ( Gia_ObjIsBuf(pObj) )
5471 pObj->Value = Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(pObj) );
5472 else if ( Gia_ObjIsAnd(pObj) )
5473 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
5474 else if ( Gia_ObjIsCi(pObj) )
5475 pObj->Value = Gia_ManAppendCi( pNew );
5476 else if ( Gia_ObjIsCo(pObj) )
5477 pObj->Value = Gia_ObjFanin0Copy(pObj);
5478 }
5479 iUif = Gia_ManDupUifConstr( pNew, p, pvMap, Vec_IntSize(vTypes) );
5480 Gia_ManForEachCo( p, pObj, i )
5481 Gia_ManAppendCo( pNew, Gia_ManHashAnd(pNew, pObj->Value, iUif) );
5482 pNew = Gia_ManCleanup( pTemp = pNew );
5483 Gia_ManStop( pTemp );
5484 for ( i = 0; i < 2*Vec_IntSize(vTypes); i++ )
5485 Vec_WecFree( pvMap[i] );
5486 ABC_FREE( pvMap );
5487 if ( p->vBarBufs )
5488 pNew->vBarBufs = Vec_IntDup( p->vBarBufs );
5489 printf( "Added UIF constraints for %d type%s of boxes.\n", Vec_IntSize(vTypes), Vec_IntSize(vTypes) > 1 ? "s" :"" );
5490 Vec_IntFree( vTypes );
5491 return pNew;
5492}
5493
5506{
5507 Vec_Int_t * vMap = Vec_IntAlloc( p->nBufs ); int i, Item;
5508 Vec_IntForEachEntry( p->vBarBufs, Item, i )
5509 Vec_IntFillExtra( vMap, Vec_IntSize(vMap) + (Item >> 16), Item & 1 );
5510 assert( p->nBufs == Vec_IntSize(vMap) );
5511 return vMap;
5512}
5514{
5516 Gia_Man_t * pNew, * pTemp;
5517 Gia_Obj_t * pObj;
5518 int i, k = 0, iCi = 0, nCis = Gia_ManCiNum(p) + Vec_IntSum(vMap);
5519 pNew = Gia_ManStart( Gia_ManObjNum(p) );
5520 pNew->pName = Abc_UtilStrsav( p->pName );
5521 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
5522 Gia_ManConst0(p)->Value = 0;
5523 for ( i = 0; i < nCis; i++ )
5524 Gia_ManAppendCi( pNew );
5525 Gia_ManHashAlloc( pNew );
5526 Gia_ManForEachObj1( p, pObj, i )
5527 {
5528 if ( Gia_ObjIsBuf(pObj) )
5529 {
5530 if ( Vec_IntEntry(vMap, k++) ) // out
5531 pObj->Value = Gia_ManCiLit(pNew, iCi++);
5532 else
5533 pObj->Value = Gia_ObjFanin0Copy(pObj);
5534 }
5535 else if ( Gia_ObjIsAnd(pObj) )
5536 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
5537 else if ( Gia_ObjIsCi(pObj) )
5538 pObj->Value = Gia_ManCiLit(pNew, iCi++);
5539 else if ( Gia_ObjIsCo(pObj) )
5540 pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
5541 }
5542 assert( k == p->nBufs && iCi == nCis );
5543 pNew = Gia_ManCleanup( pTemp = pNew );
5544 Gia_ManStop( pTemp );
5545 Vec_IntFree( vMap );
5546 return pNew;
5547}
5548
5561{
5562 Gia_Man_t * pNew, * pTemp;
5563 Gia_Obj_t * pObj;
5564 int i, iCare = -1;
5565 assert( Gia_ManCiNum(pCare) == Gia_ManCiNum(p) );
5566 assert( Gia_ManCoNum(pCare) == 1 );
5567 assert( Gia_ManRegNum(p) == 0 );
5568 assert( Gia_ManRegNum(pCare) == 0 );
5569 pNew = Gia_ManStart( 2*Gia_ManObjNum(p) + Gia_ManObjNum(pCare) );
5570 pNew->pName = Abc_UtilStrsavTwo( pNew->pName ? pNew->pName : (char *)"test", (char *)"_care" );
5571 Gia_ManHashAlloc( pNew );
5572 Gia_ManConst0(pCare)->Value = 0;
5573 Gia_ManForEachCi( pCare, pObj, i )
5574 pObj->Value = Gia_ManAppendCi( pNew );
5575 Gia_ManForEachAnd( pCare, pObj, i )
5576 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
5577 Gia_ManForEachCo( pCare, pObj, i )
5578 iCare = Gia_ObjFanin0Copy(pObj);
5579 Gia_ManConst0(p)->Value = 0;
5580 Gia_ManForEachCi( p, pObj, i )
5581 pObj->Value = Gia_ManCi(pCare, i)->Value;
5582 Gia_ManForEachAnd( p, pObj, i )
5583 {
5584 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
5585 pObj->Value = Gia_ManHashAnd( pNew, iCare, pObj->Value );
5586 }
5587 Gia_ManForEachCo( p, pObj, i )
5588 {
5589 pObj->Value = Gia_ObjFanin0Copy(pObj);
5590 pObj->Value = Gia_ManHashAnd( pNew, iCare, pObj->Value );
5591 Gia_ManAppendCo( pNew, pObj->Value );
5592 }
5593 pNew = Gia_ManCleanup( pTemp = pNew );
5594 Gia_ManStop( pTemp );
5595 return pNew;
5596}
5597
5609void Gia_ManProdAdderGen( int nArgA, int nArgB, int Seed, int fSigned, int fCla )
5610{
5611 extern void Wlc_BlastReduceMatrix( Gia_Man_t * pNew, Vec_Wec_t * vProds, Vec_Wec_t * vLevels, Vec_Int_t * vRes, int fSigned, int fCla );
5612 int i, k, x, fCompl, iLit; char pNameP[32], pNameT[32];
5613 Vec_Wec_t * vProds = Vec_WecStart( nArgA + nArgB );
5614 Vec_Wec_t * vLevels = Vec_WecStart( nArgA + nArgB );
5615 Vec_Int_t * vRes = Vec_IntAlloc( nArgA + nArgB );
5616 Vec_Int_t * vArgA = Vec_IntAlloc( nArgA );
5617 Vec_Int_t * vArgB = Vec_IntAlloc( nArgB ), * vLevel;
5618 Gia_Man_t * pProd = Gia_ManStart( 1000 );
5619 Gia_Man_t * pTree = Gia_ManStart( 1000 ), * pTemp;
5620 Gia_ManHashAlloc( pTree );
5621 pProd->pName = Abc_UtilStrsav( "prod" );
5622 pTree->pName = Abc_UtilStrsav( "tree" );
5623 for ( x = 0; x < nArgA; x++ )
5624 Vec_IntPush( vArgA, Gia_ManAppendCi(pProd) );
5625 for ( x = 0; x < nArgB; x++ )
5626 Vec_IntPush( vArgB, Gia_ManAppendCi(pProd) );
5627 for ( x = 0; x < nArgA + nArgB; x++ )
5628 {
5629 for ( i = 0; i < nArgA; i++ )
5630 for ( k = 0; k < nArgB; k++ )
5631 {
5632 if ( i + k != x )
5633 continue;
5634 fCompl = fSigned && ((i == nArgA-1) ^ (k == nArgB-1));
5635 iLit = Abc_LitNotCond(Gia_ManAppendAnd(pProd, Vec_IntEntry(vArgA, i), Vec_IntEntry(vArgB, k)), fCompl);
5636 Gia_ManAppendCo( pProd, iLit );
5637 Vec_WecPush( vProds, i+k, Gia_ManAppendCi(pTree) );
5638 Vec_WecPush( vLevels, i+k, 0 );
5639 }
5640 }
5641 if ( fSigned )
5642 {
5643 Vec_WecPush( vProds, nArgA, 1 );
5644 Vec_WecPush( vLevels, nArgA, 0 );
5645
5646 Vec_WecPush( vProds, nArgA+nArgB-1, 1 );
5647 Vec_WecPush( vLevels, nArgA+nArgB-1, 0 );
5648 }
5649 if ( Seed )
5650 {
5651 Abc_Random( 1 );
5652 for ( x = 0; x < Seed; x++ )
5653 Abc_Random( 0 );
5654 Vec_WecForEachLevel( vProds, vLevel, x )
5655 if ( Vec_IntSize(vLevel) > 1 )
5656 Vec_IntRandomizeOrder( vLevel );
5657 }
5658 Wlc_BlastReduceMatrix( pTree, vProds, vLevels, vRes, fSigned, fCla );
5659 Vec_IntShrink( vRes, nArgA + nArgB );
5660 assert( Vec_IntSize(vRes) == nArgA + nArgB );
5661 Vec_IntForEachEntry( vRes, iLit, x )
5662 Gia_ManAppendCo( pTree, iLit );
5663 pTree = Gia_ManCleanup( pTemp = pTree );
5664 Gia_ManStop( pTemp );
5665
5666 sprintf( pNameP, "prod%d%d.aig", nArgA, nArgB );
5667 sprintf( pNameT, "tree%d%d.aig", nArgA, nArgB );
5668 Gia_AigerWrite( pProd, pNameP, 0, 0, 0 );
5669 Gia_AigerWrite( pTree, pNameT, 0, 0, 0 );
5670 Gia_ManStop( pProd );
5671 Gia_ManStop( pTree );
5672 printf( "Dumped files \"%s\" and \"%s\".\n", pNameP, pNameT );
5673
5674 Vec_WecFree( vProds );
5675 Vec_WecFree( vLevels );
5676 Vec_IntFree( vArgA );
5677 Vec_IntFree( vArgB );
5678 Vec_IntFree( vRes );
5679}
5680
5693{
5694 Gia_Man_t * pNew;
5695 Gia_Obj_t * pObj;
5696 int i;
5697 pNew = Gia_ManStart( Gia_ManObjNum(p) + 2 );
5698 pNew->pName = Abc_UtilStrsav(p->pName);
5699 Gia_ManConst0(p)->Value = 0;
5700 Gia_ManForEachCi( p, pObj, i )
5701 pObj->Value = Gia_ManAppendCi( pNew );
5702 Gia_ManAppendCi( pNew );
5703 Gia_ManForEachAnd( p, pObj, i )
5704 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
5705 Gia_ManForEachCo( p, pObj, i )
5706 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
5707 Gia_ManAppendCo( pNew, 0 );
5708 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p)+1 );
5709 return pNew;
5710}
5711
5724{
5725 // Vec_Int_t * vLits;
5726 Gia_Man_t * pNew, * pTemp;
5727 Gia_Obj_t * pObj;
5728 int i, iLit;
5729 if ( Gia_ManBufNum(p1) == 0 ) {
5730 printf( "The first AIG should have a boundary.\n" );
5731 return NULL;
5732 }
5733 if ( Gia_ManBufNum(p2) != 0 ) {
5734 printf( "The second AIG should have no boundary.\n" );
5735 return NULL;
5736 }
5737 assert( Gia_ManBufNum(p1) > 0 );
5738 assert( Gia_ManBufNum(p2) == 0 );
5739 assert( Gia_ManRegNum(p1) == 0 );
5740 assert( Gia_ManRegNum(p2) == 0 );
5741 assert( Gia_ManCiNum(p1) == Gia_ManCiNum(p2) );
5742 assert( Gia_ManCoNum(p1) == Gia_ManCoNum(p2) );
5743 // vLits = Vec_IntAlloc( Gia_ManBufNum(p1) );
5744 if ( fVerbose )
5745 printf( "Creating a boundary miter with %d inputs, %d outputs, and %d buffers.\n",
5746 Gia_ManCiNum(p1), Gia_ManCoNum(p1), Gia_ManBufNum(p1) );
5747 pNew = Gia_ManStart( Gia_ManObjNum(p1) + Gia_ManObjNum(p2) );
5748 pNew->pName = ABC_ALLOC( char, strlen(p1->pName) + 10 );
5749 sprintf( pNew->pName, "%s_bmiter", p1->pName );
5750 Gia_ManHashStart( pNew );
5751 Gia_ManConst0(p1)->Value = 0;
5752 Gia_ManConst0(p2)->Value = 0;
5753
5754
5755 for( int i = 0; i < Gia_ManCiNum(p1); i++ )
5756 {
5757 int iLit = Gia_ManCi(p1, i)->Value = Gia_ManCi(p2, i) -> Value = Gia_ManAppendCi(pNew);
5758
5759 pObj = Gia_ManCi(p1, i);
5760 if ( pBnd ) Bnd_ManMap( iLit, Gia_ObjId( p1, pObj ), 1 );
5761
5762 pObj = Gia_ManCi(p2, i);
5763 if ( pBnd ) Bnd_ManMap( iLit, Gia_ObjId( p2, pObj) , 0 );
5764
5765 }
5766
5767 // record the corresponding impl node of each lit
5768 Gia_ManForEachAnd( p2, pObj, i )
5769 {
5770 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
5771 if ( pBnd ) Bnd_ManMap( pObj -> Value, Gia_ObjId(p2, pObj), 0 );
5772 }
5773
5774 // record hashed equivalent nodes
5775 Gia_ManForEachAnd( p1, pObj, i )
5776 {
5777 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
5778 if ( pBnd ) Bnd_ManMap( pObj -> Value, Gia_ObjId(p1, pObj), 1 );
5779 }
5780
5781 Gia_ManForEachCo( p2, pObj, i )
5782 {
5783 iLit = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
5784 }
5785 Gia_ManForEachCo( p1, pObj, i )
5786 {
5787 iLit = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
5788 }
5789
5790 // Vec_IntForEachEntry( vLits, iLit, i )
5791 // Gia_ManAppendCo( pNew, iLit );
5792 // Vec_IntFree( vLits );
5793 Gia_ManHashStop( pNew );
5794 pNew = Gia_ManCleanup( pTemp = pNew );
5795 Gia_ManStop( pTemp );
5796 return pNew;
5797}
5798
5809Gia_Man_t * Gia_ManImplFromBMiter( Gia_Man_t * p, int nPo, int nBInput )
5810{
5811 Gia_Man_t * pNew, *pTemp;
5812 Gia_Obj_t * pObj, *pObj2;
5813 int i;
5814 int nBoundI = 0, nBoundO = 0;
5815 int nExtra;
5817 pNew = Gia_ManStart( Gia_ManObjNum(p) );
5818 // pNew->pName = Abc_UtilStrsav( p->pName );
5819 // pNew->pSpec = Abc_UtilStrsav( p->pSpec );
5820 Gia_ManConst0(p)->Value = 0;
5821
5822 // add po of impl
5823 Gia_ManForEachCo( p, pObj, i )
5824 {
5825 if ( i < nPo )
5826 {
5827 Gia_ManDupOrderDfs_rec( pNew, p, pObj );
5828 }
5829 }
5830 nExtra = Gia_ManAndNum( pNew );
5831
5832 // add boundary as buf
5833 Gia_ManForEachCo( p, pObj, i )
5834 {
5835 if ( i >= 2 * nPo )
5836 {
5837 pObj2 = Gia_ObjFanin0(pObj);
5838 if (~pObj2->Value) // visited boundary
5839 {
5840 if ( i >= 2 * nPo + nBInput )
5841 {
5842 nBoundO ++;
5843 }
5844 else nBoundI ++;
5845 }
5846
5847 Gia_ManDupOrderDfs_rec( pNew, p, pObj2 );
5848 Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(pObj) );
5849 }
5850 }
5851 nExtra = Gia_ManAndNum( pNew ) - nExtra - Gia_ManBufNum( pNew );
5852
5853 Gia_ManForEachCi( p, pObj, i )
5854 if ( !~pObj->Value )
5855 pObj->Value = Gia_ManAppendCi(pNew);
5856 assert( Gia_ManCiNum(pNew) == Gia_ManCiNum(p) );
5857
5858 Gia_ManDupRemapCis( pNew, p );
5859 pNew = Gia_ManCleanup( pTemp = pNew );
5860 Gia_ManStop( pTemp );
5861
5862
5863 printf( "synthesized implementation:\n" );
5864 printf( "\t%d / %d input boundary recovered.\n", nBoundI, nBInput );
5865 printf( "\t%d / %d output boundary recovered.\n", nBoundO, Gia_ManCoNum(p)-2*nPo-nBInput );
5866 printf( "\t%d / %d unused nodes in the box.\n", nExtra, Gia_ManAndNum(pNew) - Gia_ManBufNum( pNew ) );
5867
5868 return pNew;
5869}
5870
5882Gia_Man_t * Gia_ManDupOdc( Gia_Man_t * p, int iObj, int fVerbose )
5883{
5884 Vec_Int_t * vRoots = Vec_IntAlloc( 1 );
5885 Vec_Int_t * vNodes = Vec_IntAlloc( 100 );
5886 Vec_Int_t * vSupp = Vec_IntAlloc( 100 );
5887 Gia_Obj_t * pObj; int i, iRes = 0;
5888 Vec_IntPush( vRoots, iObj );
5890 Gia_ManCollectTfo( p, vRoots, vNodes );
5892 Vec_IntSort(vNodes, 0);
5893 Gia_ManForEachObjVecStart( vNodes, p, pObj, i, 1 ) {
5894 if ( !Gia_ObjIsTravIdCurrent(p, Gia_ObjFanin0(pObj)) )
5895 Vec_IntPushUnique( vSupp, Gia_ObjFaninId0p(p, pObj) );
5896 if ( !Gia_ObjIsTravIdCurrent(p, Gia_ObjFanin1(pObj)) )
5897 Vec_IntPushUnique( vSupp, Gia_ObjFaninId1p(p, pObj) );
5898 }
5899 Vec_IntSort(vSupp, 0);
5900 if ( fVerbose ) Vec_IntPrint( vSupp );
5901 if ( fVerbose ) Vec_IntPrint( vNodes );
5902 Gia_Man_t * pTemp, * pNew = Gia_ManStart( 100 );
5903 pNew->pName = Abc_UtilStrsav( "care" );
5905 Gia_ManConst0(p)->Value = 0;
5906 Gia_ManForEachObjVec( vSupp, p, pObj, i )
5907 pObj->Value = Gia_ManAppendCi(pNew);
5908 Gia_ManHashStart(pNew);
5909 Gia_ManObj(p, iObj)->Value = 0;
5910 Gia_ManForEachObjVecStart( vNodes, p, pObj, i, 1 )
5911 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
5912 Gia_ManForEachCo( p, pObj, i )
5913 if ( Gia_ObjIsTravIdCurrent(p, pObj) )
5914 pObj->Value = Gia_ObjFanin0Copy(pObj);
5915 Gia_ManObj(p, iObj)->Value = 1;
5916 Gia_ManForEachObjVecStart( vNodes, p, pObj, i, 1 )
5917 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
5918 Gia_ManForEachCo( p, pObj, i )
5919 if ( Gia_ObjIsTravIdCurrent(p, pObj) )
5920 iRes = Gia_ManHashOr( pNew, iRes, Gia_ManHashXor(pNew, pObj->Value, Gia_ObjFanin0Copy(pObj)) );
5921 Gia_ManAppendCo( pNew, Abc_LitNot(iRes) );
5922 Vec_IntFree( vRoots );
5923 Vec_IntFree( vNodes );
5924 Vec_IntFree( vSupp );
5925 pNew = Gia_ManCleanup( pTemp = pNew );
5926 Gia_ManStop( pTemp );
5927 return pNew;
5928}
5929
5942{
5943 Gia_Obj_t * pObj; int i;
5944 Vec_Int_t * vInner = Vec_IntAlloc( 100 );
5946 Gia_ManForEachObjVec( vObjs, p, pObj, i )
5947 Gia_ObjSetTravIdCurrent(p, pObj);
5948 Vec_IntAppend( vInner, vObjs );
5949 Gia_ManForEachAnd( p, pObj, i ) {
5950 if ( Gia_ObjIsTravIdCurrent(p, pObj) )
5951 continue;
5952 if ( !Gia_ObjIsTravIdCurrent(p, Gia_ObjFanin0(pObj)) || !Gia_ObjIsTravIdCurrent(p, Gia_ObjFanin1(pObj)) )
5953 continue;
5954 Gia_ObjSetTravIdCurrent(p, pObj);
5955 Vec_IntPush( vInner, Gia_ObjId(p, pObj) );
5956 }
5957 return vInner;
5958}
5960{
5961 Gia_Obj_t * pObj; int i;
5962 Vec_Int_t * vOuts = Vec_IntAlloc( 100 );
5963 Gia_ManForEachObjVec( vCut, p, pObj, i )
5964 Gia_ObjSetTravIdPrevious(p, pObj);
5965 Gia_ManForEachAnd( p, pObj, i ) {
5966 if ( Gia_ObjIsTravIdCurrent(p, pObj) )
5967 continue;
5968 if ( Gia_ObjIsTravIdCurrent(p, Gia_ObjFanin0(pObj)) ) {
5969 Gia_ObjSetTravIdPrevious(p, Gia_ObjFanin0(pObj));
5970 Vec_IntPush( vOuts, Gia_ObjFaninId0p(p, pObj) );
5971 }
5972 if ( Gia_ObjIsTravIdCurrent(p, Gia_ObjFanin1(pObj)) ) {
5973 Gia_ObjSetTravIdPrevious(p, Gia_ObjFanin1(pObj));
5974 Vec_IntPush( vOuts, Gia_ObjFaninId1p(p, pObj) );
5975 }
5976 }
5977 Gia_ManForEachCo( p, pObj, i ) {
5978 if ( Gia_ObjIsTravIdCurrent(p, Gia_ObjFanin0(pObj)) ) {
5979 Gia_ObjSetTravIdPrevious(p, Gia_ObjFanin0(pObj));
5980 Vec_IntPush( vOuts, Gia_ObjFaninId0p(p, pObj) );
5981 }
5982 }
5983 Vec_IntSort( vOuts, 0 );
5984 return vOuts;
5985}
5987{
5988 Gia_Obj_t * pObj; int i;
5989 Vec_Int_t * vInner = Gia_ManMarkSupported( p, vCut );
5990 Vec_Int_t * vOuts = Gia_ManMarkPointed( p, vCut, vInner );
5991 Gia_Man_t * pNew = Gia_ManStart( 100 );
5992 pNew->pName = Abc_UtilStrsav( "win" );
5993 Gia_ManConst0(p)->Value = 0;
5994 Gia_ManForEachObjVec( vCut, p, pObj, i )
5995 pObj->Value = Gia_ManAppendCi( pNew );
5996 Gia_ManForEachObjVecStart( vInner, p, pObj, i, Vec_IntSize(vCut) )
5997 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
5998 Gia_ManForEachObjVec( vOuts, p, pObj, i )
5999 pObj->Value = Gia_ManAppendCo( pNew, pObj->Value );
6000 printf( "Derived window with %d inputs, %d internal nodes, and %d outputs.\n", Vec_IntSize(vCut), Vec_IntSize(vInner), Vec_IntSize(vOuts) );
6001 printf( "Outputs: " );
6002 Vec_IntPrint( vOuts );
6003 Vec_IntFree( vInner );
6004 Vec_IntFree( vOuts );
6005 return pNew;
6006}
6007
6020{
6021 Vec_Wec_t * vTfos = Vec_WecStart( Vec_IntSize(vVarNums) );
6022 Vec_Int_t * vNodes = Vec_IntAlloc( 100 );
6023 Gia_Obj_t * pObj; int i, k, Input, iNode;
6025 Vec_IntForEachEntry( vVarNums, Input, i )
6026 Gia_ObjSetTravIdCurrentId( p, Gia_ManCiIdToId(p, Input) );
6027 Gia_ManForEachAnd( p, pObj, i )
6028 if ( Gia_ObjIsTravIdCurrentId(p, Gia_ObjFaninId0(pObj, i)) || Gia_ObjIsTravIdCurrentId(p, Gia_ObjFaninId1(pObj, i)) )
6029 Gia_ObjSetTravIdCurrentId( p, i ), Vec_IntPush( vNodes, i );
6030 Vec_IntForEachEntry( vVarNums, Input, i )
6031 {
6033 Gia_ObjSetTravIdCurrentId( p, Gia_ManCiIdToId(p, Input) );
6034 Vec_IntForEachEntry( vNodes, iNode, k )
6035 if ( Gia_ObjIsTravIdCurrentId(p, Gia_ObjFaninId0(Gia_ManObj(p, iNode), iNode)) || Gia_ObjIsTravIdCurrentId(p, Gia_ObjFaninId1(Gia_ManObj(p, iNode), iNode)) )
6036 Gia_ObjSetTravIdCurrentId( p, iNode ), Vec_WecPush( vTfos, i, iNode );
6037 }
6038 Vec_IntFree( vNodes );
6039 return vTfos;
6040}
6042{
6043 int i, iLit, nMints = 1 << Vec_IntSize(vVarNums);
6044 Vec_Int_t * vOutLits = Vec_IntAlloc( nMints * Gia_ManCoNum(p) );
6045 Vec_Wec_t * vTfos = Gia_ManCollectIntTfos( p, vVarNums );
6046 Gia_Man_t * pNew, * pTemp; Gia_Obj_t * pObj;
6047 assert( Gia_ManRegNum(p) == 0 );
6048 pNew = Gia_ManStart( Gia_ManObjNum(p) );
6049 pNew->pName = Abc_UtilStrsav( p->pName );
6051 Gia_ManConst0(p)->Value = 0;
6052 Gia_ManForEachCi( p, pObj, i )
6053 pObj->Value = Gia_ManAppendCi(pNew);
6054 Gia_ManForEachCiVec( vVarNums, p, pObj, i )
6055 pObj->Value = 0;
6056 Gia_ManHashAlloc( pNew );
6057 Gia_ManForEachAnd( p, pObj, i )
6058 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
6059 Gia_ManForEachCo( p, pObj, i )
6060 Vec_IntPush( vOutLits, Gia_ObjFanin0Copy(pObj) );
6061 int m, g, x, b = 0;
6062 for ( m = 1; m < nMints; m++ )
6063 {
6064 g = m ^ (m >> 1); x = (b ^ g) == 1 ? 0 : Abc_Base2Log(b ^ g); b = g;
6065 Vec_Int_t * vNode = Vec_WecEntry( vTfos, x );
6066 Gia_ManPi(p, Vec_IntEntry(vVarNums, x))->Value ^= 1;
6067 Gia_ManForEachObjVec( vNode, p, pObj, i )
6068 pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
6069 Gia_ManForEachCo( p, pObj, i )
6070 Vec_IntPush( vOutLits, Gia_ObjFanin0Copy(pObj) );
6071 }
6072 assert( Vec_IntFindMin(vOutLits) >= 0 );
6073 Vec_IntForEachEntry( vOutLits, iLit, i )
6074 Gia_ManAppendCo( pNew, iLit );
6075 Vec_IntFree( vOutLits );
6076 Vec_WecFree( vTfos );
6077 pNew = Gia_ManCleanup( pTemp = pNew );
6078 Gia_ManStop( pTemp );
6079 return pNew;
6080}
6081
6094{
6095 Vec_Int_t * vRes = Vec_IntAlloc( Gia_ManCoNum(p) );
6096 Vec_Int_t * vMap = Vec_IntStartFull( 2*Gia_ManObjNum(p) );
6097 Gia_Obj_t * pObj; int i, iLit, iClass = 0;
6098 assert( Gia_ManCoNum(p) == 1 << Abc_Base2Log(Gia_ManCoNum(p)) );
6099 Gia_ManForEachPo( p, pObj, i )
6100 {
6101 iLit = Gia_ObjFaninLit0p(p, pObj);
6102 if ( Vec_IntEntry(vMap, iLit) == -1 )
6103 Vec_IntWriteEntry( vMap, iLit, iClass++ );
6104 Vec_IntPush( vRes, Vec_IntEntry(vMap, iLit) );
6105 }
6106 Vec_IntFree( vMap );
6107 return vRes;
6108}
6109Vec_Int_t * Gia_ManCofClassPattern( Gia_Man_t * p, Vec_Int_t * vVarNums, int fVerbose )
6110{
6111 extern Gia_Man_t * Cec4_ManSimulateTest3( Gia_Man_t * p, int nBTLimit, int fVerbose );
6112 Gia_Man_t * pCofs = Gia_ManDupCofs( p, vVarNums );
6113 Gia_Man_t * pSweep = Cec4_ManSimulateTest3( pCofs, 0, 0 );
6114 Vec_Int_t * vRes = Gia_ManCofPattern( pSweep );
6115 assert( Vec_IntSize(vRes) == 1 << Vec_IntSize(vVarNums) );
6116 Gia_ManStop( pSweep );
6117 Gia_ManStop( pCofs );
6118 if ( fVerbose )
6119 {
6120 int i, Class, nClasses = Vec_IntFindMax(vRes)+1;
6121 printf( "%d -> %d: ", Vec_IntSize(vVarNums), nClasses );
6122 if ( nClasses <= 36 )
6123 Vec_IntForEachEntry( vRes, Class, i )
6124 printf( "%c", (Class < 10 ? (int)'0' : (int)'A'-10) + Class );
6125 printf( "\n" );
6126 }
6127 return vRes;
6128}
6129Gia_Man_t * Gia_ManDupEncode( Gia_Man_t * p, Vec_Int_t * vVarNums, int fVerbose )
6130{
6131 extern Vec_Int_t * Gia_GenDecoder( Gia_Man_t * p, int * pLits, int nLits );
6132 Gia_Man_t * pNew, * pTemp;
6133 Vec_Int_t * vCols = Gia_ManCofClassPattern( p, vVarNums, fVerbose );
6134 Vec_Int_t * vVars = Vec_IntAlloc( 100 ), * vDec;
6135 int i, k, Limit = Vec_IntSize(vCols), Entry;
6136 int nClasses = Vec_IntFindMax(vCols)+1;
6137 int nExtras = Abc_Base2Log(nClasses);
6138 pNew = Gia_ManStart( 1000 );
6139 pNew->pName = Abc_UtilStrsav( p->pName );
6140 for ( i = 0; i < Vec_IntSize(vVarNums) + nExtras; i++ )
6141 Vec_IntPush( vVars, Gia_ManAppendCi(pNew) );
6142 Gia_ManHashAlloc( pNew );
6143 vDec = Gia_GenDecoder( pNew, Vec_IntEntryP(vVars, Vec_IntSize(vVarNums)), nExtras );
6144 Vec_IntForEachEntry( vCols, Entry, i )
6145 Vec_IntWriteEntry( vCols, i, Vec_IntEntry(vDec, Entry) );
6146 Vec_IntFree( vDec );
6147 for ( i = Vec_IntSize(vVarNums) - 1; i >= 0; i--, Limit /= 2 )
6148 for ( k = 0; k < Limit; k += 2 )
6149 Vec_IntWriteEntry( vCols, k/2, Gia_ManHashMux(pNew, Vec_IntEntry(vVars, i), Vec_IntEntry(vCols, k+1), Vec_IntEntry(vCols, k)) );
6150 Gia_ManAppendCo( pNew, Vec_IntEntry(vCols, 0) );
6151 Vec_IntFree( vCols );
6152 Vec_IntFree( vVars );
6153 pNew = Gia_ManCleanup( pTemp = pNew );
6154 Gia_ManStop( pTemp );
6155 if ( fVerbose )
6156 printf( "Generated AIG with %d inputs and %d nodes representing %d PIs with %d columns.\n",
6157 Gia_ManPiNum(pNew), Gia_ManAndNum(pNew), Vec_IntSize(vVarNums), nClasses );
6158 return pNew;
6159}
6160
6172void Gia_ManCofClassRand( Gia_Man_t * p, int nVars, int nRands )
6173{
6174 for ( int n = 0; n < nRands; n++ )
6175 {
6176 Abc_Random(1);
6177 for ( int i = 0; i < n; i++ )
6178 Abc_Random(0);
6179 Vec_Int_t * vIns = Vec_IntStartNatural( Gia_ManPiNum(p) );
6180 Vec_IntRandomizeOrder( vIns );
6181 Vec_IntShrink( vIns, nVars );
6182 int k, Entry;
6183 printf( "Vars: " );
6184 Vec_IntForEachEntry( vIns, Entry, k )
6185 printf( "%d ", Entry );
6186 printf( " " );
6187 Vec_Int_t * vTemp = Gia_ManCofClassPattern( p, vIns, 1 );
6188 Vec_IntFree( vTemp );
6189 Vec_IntFree( vIns );
6190 }
6191}
6192void Gia_ManCofClassEnum( Gia_Man_t * p, int nVars )
6193{
6194 Vec_Int_t * vIns = Vec_IntAlloc( nVars );
6195 int m, k, Entry, Count, nMints = 1 << Gia_ManPiNum(p);
6196 for ( m = 0; m < nMints; m++ ) {
6197 for ( Count = k = 0; k < Gia_ManPiNum(p); k++ )
6198 Count += (m >> k) & 1;
6199 if ( Count != nVars )
6200 continue;
6201 Vec_IntClear( vIns );
6202 for ( k = 0; k < Gia_ManPiNum(p); k++ )
6203 if ( (m >> k) & 1 )
6204 Vec_IntPush( vIns, k );
6205 assert( Vec_IntSize(vIns) == Count );
6206 printf( "Vars: " );
6207 Vec_IntForEachEntry( vIns, Entry, k )
6208 printf( "%d ", Entry );
6209 printf( " " );
6210 Vec_Int_t * vTemp = Gia_ManCofClassPattern( p, vIns, 1 );
6211 Vec_IntFree( vTemp );
6212 }
6213 Vec_IntFree( vIns );
6214}
6215
6227int Gia_ObjWhichFanout( Gia_Man_t * p, int iFanin, int iFanout )
6228{
6229 int i, FanId;
6230 Gia_ObjForEachFanoutStaticId( p, iFanin, FanId, i )
6231 if ( FanId == iFanout )
6232 return i;
6233 assert( 0 );
6234 return -1;
6235}
6237{
6238 assert( Gia_ManRegNum(p) == 0 );
6239 Gia_Man_t * pNew; Gia_Obj_t * pObj; int i, f, iLit[2];
6240 pNew = Gia_ManStart( Gia_ManObjNum(p)+100 );
6241 pNew->pName = Abc_UtilStrsav( p->pName );
6243 Gia_ManConst0(p)->Value = 0;
6245 pNew->vNamesIn = Vec_PtrAlloc( 100 );
6246 pNew->vNamesOut = Vec_PtrAlloc( 100 );
6247 Gia_ManForEachPi( p, pObj, i ) {
6248 pObj->Value = Gia_ManAppendCi(pNew);
6249 Vec_PtrPush( pNew->vNamesIn, Gia_ObjCiName(p, i) );
6250 for ( f = 1; f < Gia_ObjFanoutNum(p, pObj); f++ ) {
6251 Gia_ManAppendCi(pNew);
6252 Vec_PtrPush( pNew->vNamesIn, Abc_UtilStrsavNum(Gia_ObjCiName(p, i), f) );
6253 }
6254 }
6255 Gia_ManForEachAnd( p, pObj, i ) {
6256 iLit[0] = Gia_ObjFanin0Copy(pObj);
6257 if ( Gia_ObjIsPi(p, Gia_ObjFanin0(pObj)) )
6258 iLit[0] += 2 * Gia_ObjWhichFanout(p, Gia_ObjFaninId0(pObj, i), i);
6259 iLit[1] = Gia_ObjFanin1Copy(pObj);
6260 if ( Gia_ObjIsPi(p, Gia_ObjFanin1(pObj)) )
6261 iLit[1] += 2 * Gia_ObjWhichFanout(p, Gia_ObjFaninId1(pObj, i), i);
6262 pObj->Value = Gia_ManAppendAnd( pNew, iLit[0], iLit[1] );
6263 }
6264 Gia_ManForEachPo( p, pObj, i ) {
6265 iLit[0] = Gia_ObjFanin0Copy(pObj);
6266 if ( Gia_ObjIsPi(p, Gia_ObjFanin0(pObj)) )
6267 iLit[0] += 2 * Gia_ObjWhichFanout(p, Gia_ObjFaninId0p(p, pObj), Gia_ObjId(p, pObj));
6268 Gia_ManAppendCo( pNew, iLit[0] );
6269 Vec_PtrPush( pNew->vNamesOut, Gia_ObjCoName(p, i) );
6270 }
6272 return pNew;
6273}
6274
6287{
6288 Gia_Obj_t * pObj; int i;
6289 Gia_ManForEachAnd( p, pObj, i )
6290 if ( p->pSibls[i] )
6291 printf( "%d -> %d\n", i, p->pSibls[i] );
6292}
6294{
6295 if ( ~pObj->Value )
6296 return;
6297 assert( Gia_ObjIsAnd(pObj) );
6298 Gia_Obj_t * pSibl = Gia_ObjSiblObj(p, Gia_ObjId(p, pObj));
6299 Gia_ManReorderChoices_rec( pNew, p, Gia_ObjFanin0(pObj) );
6300 Gia_ManReorderChoices_rec( pNew, p, Gia_ObjFanin1(pObj) );
6301 if ( pSibl ) Gia_ManReorderChoices_rec( pNew, p, pSibl );
6302 pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
6303 if ( pSibl ) {
6304 int iObjNew = Abc_Lit2Var(pObj->Value);
6305 int iNextNew = Abc_Lit2Var(pSibl->Value);
6306 assert( iObjNew > iNextNew );
6307 assert( Gia_ObjIsAnd(Gia_ManObj(pNew, iNextNew)) );
6308 pNew->pSibls[iObjNew] = iNextNew;
6309 }
6310}
6312{
6313 assert( p->pSibls );
6314 Gia_Obj_t * pObj; int i;
6315 Gia_Man_t * pNew = Gia_ManStart( Gia_ManObjNum(p) );
6316 pNew->pName = Abc_UtilStrsav( p->pName );
6317 pNew->pSpec = Abc_UtilStrsav( p->pSpec );
6318 pNew->pSibls = ABC_CALLOC( int, Gia_ManObjNum(p) );
6320 Gia_ManForEachCi( p, pObj, i )
6321 pObj->Value = Gia_ManAppendCi(pNew);
6322 Gia_ManForEachCo( p, pObj, i )
6323 Gia_ManReorderChoices_rec( pNew, p, Gia_ObjFanin0(pObj) );
6324 Gia_ManForEachCo( p, pObj, i )
6325 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
6326 Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
6327 extern int Gia_ManTestChoices( Gia_Man_t * p );
6328 Gia_ManTestChoices( pNew );
6329 //Gia_ManPrintChoices( pNew );
6330 return pNew;
6331}
6332
6333
6345
6357
6358int Gia_ManDupChoicesMark_rec( Gia_Man_t * pGia, int iObj, Vec_Int_t * vObj2Tt, int iFunc )
6359{
6360 if ( Abc_Lit2Var(Vec_IntEntry(vObj2Tt, iObj)) == iFunc )
6361 return 1;
6362 if ( Gia_ObjIsTravIdCurrentId(pGia, iObj) )
6363 return 0;
6364 Gia_ObjSetTravIdCurrentId(pGia, iObj);
6365 Gia_Obj_t * pObj = Gia_ManObj(pGia, iObj);
6366 if ( !Gia_ObjIsAnd(pObj) )
6367 return 0;
6368 if ( Gia_ManDupChoicesMark_rec( pGia, Gia_ObjFaninId0(pObj, iObj), vObj2Tt, iFunc ) )
6369 return 1;
6370 if ( Gia_ManDupChoicesMark_rec( pGia, Gia_ObjFaninId1(pObj, iObj), vObj2Tt, iFunc ) )
6371 return 1;
6372 return 0;
6373}
6374int Gia_ManDupChoicesMark( Gia_Man_t * pGia, int iLit0, int iLit1, Vec_Int_t * vObj2Tt, int iFunc )
6375{
6376 Gia_ManIncrementTravId( pGia );
6377 if ( Gia_ManDupChoicesMark_rec( pGia, Abc_Lit2Var(iLit0), vObj2Tt, iFunc ) )
6378 return 1;
6379 if ( Gia_ManDupChoicesMark_rec( pGia, Abc_Lit2Var(iLit1), vObj2Tt, iFunc ) )
6380 return 1;
6381 return 0;
6382}
6384{
6385 Gia_Obj_t * pObj = Gia_ManObj( pGia, iObj );
6386 assert( ~Gia_ObjFanin0(pObj)->Value && ~Gia_ObjFanin1(pObj)->Value );
6387 int obLits[2] = { Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) };
6388 int ttLits[2] = { Vec_IntEntry(p->vObj2Tt, Abc_Lit2Var(obLits[0])), Vec_IntEntry(p->vObj2Tt, Abc_Lit2Var(obLits[1])) };
6389 int fCompl[2] = { Abc_LitIsCompl(ttLits[0]) ^ Abc_LitIsCompl(obLits[0]), Abc_LitIsCompl(ttLits[1]) ^ Abc_LitIsCompl(obLits[1]) };
6390 word * pTruth[2] = { Vec_MemReadEntry(p->vTtMem, Abc_Lit2Var(ttLits[0])), Vec_MemReadEntry(p->vTtMem, Abc_Lit2Var(ttLits[1])) };
6391 Abc_TtAndCompl( p->pTruth, pTruth[0], fCompl[0], pTruth[1], fCompl[1], p->nWords );
6392 int fComp = (int)p->pTruth[0] & 1; if ( fComp ) Abc_TtNot( p->pTruth, p->nWords );
6393 int nFuncs = Vec_MemEntryNum( p->vTtMem );
6394 int iFunc = Vec_MemHashInsert( p->vTtMem, p->pTruth );
6395 assert( iFunc <= nFuncs );
6396 if ( iFunc == nFuncs ) { // new function
6397 pObj->Value = Gia_ManHashAnd( p->pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
6398 Vec_IntPush( p->vObj2Tt, Abc_Var2Lit(iFunc, fComp ^ Abc_LitIsCompl(pObj->Value)) );
6399 Vec_IntPush( p->vTt2Obj, Abc_Lit2Var(pObj->Value) );
6400 return;
6401 }
6402 int iRepr = Vec_IntEntry( p->vTt2Obj, iFunc );
6403 pObj->Value = Abc_Var2Lit( iRepr, fComp ^ Abc_LitIsCompl(Vec_IntEntry(p->vObj2Tt, iRepr)) );
6404 if ( iRepr <= Gia_ManCiNum(pGia) || Gia_ManDupChoicesMark(p->pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj), p->vObj2Tt, iFunc) )
6405 return;
6406 int nObjNew = Gia_ManObjNum(p->pNew);
6407 int iLitNew = Gia_ManHashAnd( p->pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
6408 if ( Abc_Lit2Var(iLitNew) == nObjNew )
6409 Vec_IntPush( p->vObj2Tt, Abc_Var2Lit(iFunc, fComp ^ Abc_LitIsCompl(iLitNew)) );
6410}
6412{
6413 Gia_Obj_t * pObj; int i;
6414 assert( Gia_ManCiNum(p->pNew) == Gia_ManCiNum(pGia) );
6415 assert( !p->vCoLits || Vec_IntSize(p->vCoLits) == Gia_ManCoNum(pGia) );
6416 assert( Gia_ManRegNum(p->pNew) == Gia_ManRegNum(pGia) );
6417 Gia_ManFillValue( pGia );
6418 Gia_ManForEachCi( pGia, pObj, i )
6419 pObj->Value = Gia_ManCiLit( p->pNew, i );
6420 Gia_ManForEachAnd( pGia, pObj, i )
6421 Gia_ManDupChoicesNode( p, pGia, i );
6422 assert( Vec_IntSize(p->vObj2Tt) == Gia_ManObjNum(p->pNew) );
6423 assert( Vec_IntSize(p->vTt2Obj) == Vec_MemEntryNum(p->vTtMem) );
6424}
6426{
6428 p->pNew = Gia_ManStart( 10*Gia_ManObjNum(pGia) );
6429 p->pNew->pName = Abc_UtilStrsav( pGia->pName );
6430 p->pNew->pSpec = Abc_UtilStrsav( pGia->pSpec );
6431 p->vTtMem = Vec_MemAllocWithTTs( Gia_ManCiNum(pGia) );
6432 p->vTt2Obj = Vec_IntStartNatural( 1 + Gia_ManCiNum(pGia) );
6433 p->vObj2Tt = Vec_IntAlloc( 10*Gia_ManObjNum(pGia) );
6434 p->nWords = Abc_TtWordNum( Gia_ManCiNum(pGia) );
6435 p->pTruth = ABC_CALLOC( word, p->nWords );
6436 Gia_Obj_t * pObj; int i;
6437 for ( i = 0; i <= Gia_ManCiNum(pGia); i++ )
6438 Vec_IntPush( p->vObj2Tt, Abc_Var2Lit(i, 0) );
6439 Gia_ManForEachCi( pGia, pObj, i )
6440 Gia_ManAppendCi(p->pNew);
6441 Gia_ManSetRegNum( p->pNew, Gia_ManRegNum(pGia) );
6442 Gia_ManHashStart( p->pNew );
6443 Gia_ManDupChoicesAdd( p, pGia );
6444 p->vCoLits = Vec_IntAlloc( Gia_ManCoNum(pGia) );
6445 Gia_ManForEachCo( pGia, pObj, i )
6446 Vec_IntPush( p->vCoLits, Gia_ObjFanin0Copy(pObj) );
6447 return p;
6448}
6450{
6451 int iObj, ttLit;
6452 Vec_Int_t * vSibls = Vec_IntStart( Gia_ManObjNum(p->pNew) );
6453 assert( Vec_IntSize(p->vTt2Obj) == Vec_MemEntryNum(p->vTtMem) );
6454 Vec_IntForEachEntry( p->vObj2Tt, ttLit, iObj ) {
6455 int iPrev = Vec_IntEntry(p->vTt2Obj, Abc_Lit2Var(ttLit));
6456 assert( iPrev <= iObj );
6457 if ( iPrev == iObj )
6458 continue;
6459 Vec_IntWriteEntry( vSibls, iPrev, iObj );
6460 Vec_IntWriteEntry( p->vTt2Obj, Abc_Lit2Var(ttLit), iObj );
6461 }
6462 return vSibls;
6463}
6465{
6466 Gia_Man_t * pTemp, * pNew = p->pNew; int i, iLit;
6467 p->vSibls = Gia_ManDupChoicesCreateSibls( p );
6468 p->pNew->pSibls = Vec_IntReleaseArray( p->vSibls );
6469 Vec_IntForEachEntry( p->vCoLits, iLit, i )
6470 Gia_ManAppendCo( p->pNew, iLit );
6471 Vec_MemFree( p->vTtMem );
6472 Vec_IntFree( p->vSibls );
6473 Vec_IntFree( p->vTt2Obj );
6474 Vec_IntFree( p->vObj2Tt );
6475 Vec_IntFree( p->vCoLits );
6476 ABC_FREE( p->pTruth );
6477 ABC_FREE( p );
6478 pTemp = Gia_ManReorderChoices( pNew );
6479 Gia_ManStop( pNew );
6480 return pTemp;
6481}
6482
6486
6487
6489
#define ABC_SWAP(Type, a, b)
Definition abc_global.h:253
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_FALLOC(type, num)
Definition abc_global.h:266
int * Abc_MergeSortCost(int *pCosts, int nSize)
Definition utilSort.c:442
#define ABC_ALLOC(type, num)
Definition abc_global.h:264
#define ABC_INFINITY
MACRO DEFINITIONS ///.
Definition abc_global.h:250
unsigned Abc_Random(int fReset)
Definition utilSort.c:1004
void Abc_QuickSort3(word *pData, int nSize, int fDecrease)
Definition utilSort.c:884
#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
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
Gia_Man_t * Gia_ManCorrReduce(Gia_Man_t *p)
Definition cecCorr.c:690
int Cec_ManLSCorrespondenceClasses(Gia_Man_t *pAig, Cec_ParCor_t *pPars)
Definition cecCorr.c:924
struct Cec_ParCor_t_ Cec_ParCor_t
Definition cec.h:145
Cube * p
Definition exorList.c:222
int Gia_ManTestChoices(Gia_Man_t *p)
Definition giaAig.c:618
Bnd_Man_t * pBnd
DECLARATIONS ///.
Definition giaBound.c:61
Gia_Man_t * Gia_ManDup(Gia_Man_t *p)
Definition giaDup.c:720
int Gia_ManCountMark1Dfs(Gia_Man_t *p, int iObj)
Definition giaDup.c:4863
Gia_Man_t * Gia_ManDupAppendCones(Gia_Man_t *p, Gia_Man_t **ppCones, int nCones, int fOnlyRegs)
Definition giaDup.c:1305
int Gia_ManCountMark0Dfs_rec(Gia_Man_t *p, int iObj)
Definition giaDup.c:4834
Gia_Man_t * Gia_ManDupUif(Gia_Man_t *p)
Definition giaDup.c:5457
Gia_Man_t * Gia_ManPermuteInputs(Gia_Man_t *p, int nPpis, int nExtra)
Definition giaDup.c:2758
void Gia_ManDupRebuild(Gia_Man_t *pNew, Gia_Man_t *p, Vec_Int_t *vLits, int fBufs)
Definition giaDup.c:1215
void Gia_ManDupAppendShare(Gia_Man_t *pNew, Gia_Man_t *pTwo)
Definition giaDup.c:1156
void Gia_ManCofClassEnum(Gia_Man_t *p, int nVars)
Definition giaDup.c:6192
Gia_Man_t * Gia_ManDupFlopClass(Gia_Man_t *p, int iClass)
Definition giaDup.c:1399
Gia_Man_t * Gia_ManDupDfsCiMap(Gia_Man_t *p, int *pCi2Lit, Vec_Int_t *vLits)
Definition giaDup.c:2708
void Gia_ManDupChoicesAdd(Gia_ChMan_t *p, Gia_Man_t *pGia)
Definition giaDup.c:6411
void Gia_ManSetMark0Dfs_rec(Gia_Man_t *p, int iObj)
Definition giaDup.c:4809
int Gia_ManDupUifConstr(Gia_Man_t *pNew, Gia_Man_t *p, Vec_Wec_t **pvMap, int nTypes)
Definition giaDup.c:5440
int Gia_ManPoIsToRemove(Gia_Man_t *p, Gia_Obj_t *pObj, int Value)
Definition giaDup.c:2411
void Gia_ManDupDfs_rec(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pObj)
Definition giaDup.c:1739
Gia_Man_t * Gia_ManDupPiPerm(Gia_Man_t *p)
Definition giaDup.c:1047
Gia_Man_t * Gia_ManDupFlip(Gia_Man_t *p, int *pInitState)
Definition giaDup.c:628
int Gia_ManDupOrderDfs_rec(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pObj)
Definition giaDup.c:180
Gia_Man_t * Gia_ManDupWithAttributes(Gia_Man_t *p)
Definition giaDup.c:776
Vec_Int_t * Gia_ManMarkPointed(Gia_Man_t *p, Vec_Int_t *vCut, Vec_Int_t *vInner)
Definition giaDup.c:5959
Gia_Man_t * Gia_ManIsoStrashReduce2(Gia_Man_t *p, Vec_Ptr_t **pvPosEquivs, int fVerbose)
Definition giaDup.c:4575
Gia_Man_t * Gia_ManDupCofs(Gia_Man_t *p, Vec_Int_t *vVarNums)
Definition giaDup.c:6041
Gia_Man_t * Gia_ManDupWindow(Gia_Man_t *p, Vec_Int_t *vCut)
Definition giaDup.c:5986
int Gia_ManDupConeBackObjs(Gia_Man_t *p, Gia_Man_t *pNew, Vec_Int_t *vObjs)
Definition giaDup.c:2282
Gia_Man_t * Gia_ManDupTrimmed(Gia_Man_t *p, int fTrimCis, int fTrimCos, int fDualOut, int OutValue)
Definition giaDup.c:2431
Gia_Man_t * Gia_ManDupDfsCone(Gia_Man_t *p, Gia_Obj_t *pRoot)
Definition giaDup.c:2188
Gia_Man_t * Gia_ManDupDfsClasses(Gia_Man_t *p)
Definition giaDup.c:2795
Gia_Man_t * Gia_ManDupOuts(Gia_Man_t *p)
Definition giaDup.c:4366
Gia_Man_t * Gia_ManDupAndConesLimit2(Gia_Man_t *p, int *pAnds, int nAnds, int Level)
Definition giaDup.c:4054
Gia_Man_t * Gia_ManDupWithNewPo(Gia_Man_t *p1, Gia_Man_t *p2)
Definition giaDup.c:2634
int Gia_ManDemiterTwoWords(Gia_Man_t *p, Gia_Man_t **pp0, Gia_Man_t **pp1)
Definition giaDup.c:5082
void Gia_ManSeqEquivDivide(Gia_Man_t *p, Cec_ParCor_t *pPars)
Definition giaDup.c:5261
Gia_Man_t * Gia_ManDupLastPis(Gia_Man_t *p, int nLastPis)
Definition giaDup.c:597
int Gia_ManDemiterDual(Gia_Man_t *p, Gia_Man_t **pp0, Gia_Man_t **pp1)
Definition giaDup.c:5030
Gia_Man_t * Gia_ManDupMiterCones(Gia_Man_t *p, Vec_Int_t *vPairs)
Definition giaDup.c:1627
Gia_Man_t * Gia_ManDupRemovePis(Gia_Man_t *p, int nRemPis)
Definition giaDup.c:802
Gia_Man_t * Gia_ManDupOutputGroup(Gia_Man_t *p, int iOutStart, int iOutStop)
Definition giaDup.c:313
Gia_Man_t * Gia_ManDupTimes(Gia_Man_t *p, int nTimes)
Definition giaDup.c:1547
Gia_Man_t * Gia_ManDupZero(Gia_Man_t *p)
Definition giaDup.c:905
Gia_Man_t * Gia_ManTransformMiter(Gia_Man_t *p)
Definition giaDup.c:3376
Gia_Man_t * Gia_ManDupUniv(Gia_Man_t *p, int iVar)
Definition giaDup.c:2059
void Gia_ManReorderChoices_rec(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pObj)
Definition giaDup.c:6293
int Gia_ManCoLargestSupp(Gia_Man_t *p, Vec_Wec_t *vSupps)
Definition giaDup.c:4452
Vec_Ptr_t * Gia_ManMiterNames(Vec_Ptr_t *p, int nOuts)
Definition giaDup.c:3309
Gia_Man_t * Gia_ManDupPermFlopGap(Gia_Man_t *p, Vec_Int_t *vFfMask)
Definition giaDup.c:1026
Vec_Int_t * Gia_ManCofPattern(Gia_Man_t *p)
Definition giaDup.c:6093
Gia_Man_t * Gia_ManDupOneHot(Gia_Man_t *p)
Definition giaDup.c:4108
int Gia_ManIsoStrashReduceOne(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vSupp)
Definition giaDup.c:4586
Gia_Man_t * Gia_ManDupStrashReduce(Gia_Man_t *p, Vec_Wec_t *vSupps, Vec_Int_t **pvCoMap)
Definition giaDup.c:4513
Vec_Int_t * Gia_ManDupBlackBoxBuildMap(Gia_Man_t *p)
Definition giaDup.c:5505
Gia_Man_t * Gia_ManDup2(Gia_Man_t *p1, Gia_Man_t *p2)
Definition giaDup.c:751
Gia_Man_t * Gia_ManDupAndCare(Gia_Man_t *p, Gia_Man_t *pCare)
Definition giaDup.c:3265
void Gia_ManCofClassRand(Gia_Man_t *p, int nVars, int nRands)
Definition giaDup.c:6172
Gia_Man_t * Gia_ManDupInvMiter(Gia_Man_t *p, Gia_Man_t *pInv)
Definition giaDup.c:1247
void Gia_ManPrintChoices(Gia_Man_t *p)
Definition giaDup.c:6286
void Gia_ManCollectDfs_rec(Gia_Man_t *p, int iObj, Vec_Int_t *vNodes)
Definition giaDup.c:5006
Gia_Man_t * Gia_ManDupCofactorVar(Gia_Man_t *p, int iVar, int Value)
Definition giaDup.c:1861
void Gia_ManDupRemapEquiv(Gia_Man_t *pNew, Gia_Man_t *p)
Definition giaDup.c:82
Vec_Int_t * Gia_ManDupUifBoxTypes(Vec_Int_t *vBarBufs)
Definition giaDup.c:5395
Gia_Man_t * Gia_ManDupChoicesFinish(Gia_ChMan_t *p)
Definition giaDup.c:6464
Gia_Man_t * Gia_ManDupMux(int iVar, Gia_Man_t *pCof1, Gia_Man_t *pCof0)
Definition giaDup.c:1887
void Gia_ManDupCones_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Ptr_t *vLeaves, Vec_Ptr_t *vNodes, Vec_Ptr_t *vRoots)
Definition giaDup.c:3861
Gia_Man_t * Gia_ManBoundaryMiter(Gia_Man_t *p1, Gia_Man_t *p2, int fVerbose)
Definition giaDup.c:5723
int Gia_ManDupDemiterFindMin(Vec_Wec_t *vSupps, Vec_Int_t *vTakenIns, Vec_Int_t *vTakenOuts)
Definition giaDup.c:4749
Gia_Man_t * Gia_ManDupPermFlop(Gia_Man_t *p, Vec_Int_t *vFfPerm)
Definition giaDup.c:962
Gia_Man_t * Gia_ManDupTrimmed3(Gia_Man_t *p)
Definition giaDup.c:2553
int Gia_ObjWhichFanout(Gia_Man_t *p, int iFanin, int iFanout)
Definition giaDup.c:6227
Gia_Man_t * Gia_ManPairWiseMiter(Gia_Man_t *p)
Definition giaDup.c:3338
Vec_Int_t * Gia_ManCollectReach(Gia_Man_t *p, int fOdd)
Definition giaDup.c:5019
Vec_Int_t * Gia_ManCollectTopXors(Gia_Man_t *p)
Definition giaDup.c:4898
Gia_Man_t * Gia_ManChoiceMiter(Vec_Ptr_t *vGias)
Definition giaDup.c:3763
Gia_Man_t * Gia_ManDupBlock(Gia_Man_t *p, int nBlock)
Definition giaDup.c:1976
int Gia_ManDupUifConstrOne(Gia_Man_t *pNew, Gia_Man_t *p, Vec_Int_t *vVec0, Vec_Int_t *vVec1)
Definition giaDup.c:5430
Gia_Man_t * Gia_ManIsoStrashReduce(Gia_Man_t *p, Vec_Ptr_t **pvPosEquivs, int fVerbose)
Definition giaDup.c:4643
Vec_Int_t * Gia_ManCreatePerm(int n)
Definition giaDup.c:1092
Gia_Man_t * Gia_ManDupWithConstr(Gia_Man_t *p)
Definition giaDup.c:4269
int Gia_ManSortByValue(Gia_Obj_t **pp1, Gia_Obj_t **pp2)
Definition giaDup.c:4345
int Gia_ManDupChoicesMark_rec(Gia_Man_t *pGia, int iObj, Vec_Int_t *vObj2Tt, int iFunc)
Definition giaDup.c:6358
Gia_Man_t * Gia_ManDupPerm(Gia_Man_t *p, Vec_Int_t *vPiPerm)
Definition giaDup.c:929
void Gia_ManDupChoicesNode(Gia_ChMan_t *p, Gia_Man_t *pGia, int iObj)
Definition giaDup.c:6383
void Gia_ManSetMark1Dfs_rec(Gia_Man_t *p, int iObj)
Definition giaDup.c:4821
Vec_Wec_t * Gia_ManCreateCoSupps(Gia_Man_t *p, int fVerbose)
Definition giaDup.c:4421
Gia_Man_t * Gia_ManDupExist(Gia_Man_t *p, int iVar)
Definition giaDup.c:2012
int Gia_ManDupHashDfs_rec(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pObj)
Definition giaDup.c:4493
Gia_Man_t * Gia_ManDupMarked(Gia_Man_t *p)
Definition giaDup.c:1444
void Gia_ManDupOrderDfsChoices_rec(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pObj)
Definition giaDup.c:408
Gia_Man_t * Gia_ManDupHalfSeq(Gia_Man_t *p, int fSecond)
Definition giaDup.c:5125
Gia_Man_t * Gia_ManScorrDivideTest(Gia_Man_t *p, Cec_ParCor_t *pPars)
Definition giaDup.c:5282
Gia_Man_t * Gia_ManDupDfsSkip(Gia_Man_t *p)
Definition giaDup.c:2158
Gia_Man_t * Gia_ManDupCofactorObj(Gia_Man_t *p, int iObj, int Value)
Definition giaDup.c:1935
Gia_Man_t * Gia_ManDupAndConesLimit(Gia_Man_t *p, int *pAnds, int nAnds, int Level)
Definition giaDup.c:4021
int Gia_ManDecideWhereToAdd(Gia_Man_t *p, Vec_Int_t *vPart[2], Gia_Obj_t *pFan[2])
Definition giaDup.c:4869
void Gia_ManDupRemapLiterals(Vec_Int_t *vLits, Gia_Man_t *p)
FUNCTION DEFINITIONS ///.
Definition giaDup.c:54
Vec_Wec_t * Gia_ManCreateNodeSupps(Gia_Man_t *p, Vec_Int_t *vNodes, int fVerbose)
Definition giaDup.c:4401
void Gia_ManSeqEquivMerge(Gia_Man_t *p, Gia_Man_t *pPart[2])
Definition giaDup.c:5175
int Gia_ManMiter_rec(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pObj)
Definition giaDup.c:2962
Gia_Man_t * Gia_ManDupOnsetOffset(Gia_Man_t *p)
Definition giaDup.c:564
int Gia_ManDupChoicesMark(Gia_Man_t *pGia, int iLit0, int iLit1, Vec_Int_t *vObj2Tt, int iFunc)
Definition giaDup.c:6374
Gia_Man_t * Gia_ManDupOdc(Gia_Man_t *p, int iObj, int fVerbose)
Definition giaDup.c:5882
Gia_Man_t * Gia_ManDupMap(Gia_Man_t *p, Vec_Int_t *vMap)
Definition giaDup.c:846
Gia_Man_t * Gia_ManDupFromVecs(Gia_Man_t *p, Vec_Int_t *vCis, Vec_Int_t *vAnds, Vec_Int_t *vCos, int nRegs)
Definition giaDup.c:4176
void Gia_ManPrintRepr(Gia_Man_t *p)
Definition giaDup.c:2687
Gia_Man_t * Gia_ManTransformTwoWord2DualOutput(Gia_Man_t *p)
Definition giaDup.c:3465
Gia_Man_t * Gia_ManMiter2(Gia_Man_t *pStart, char *pInit, int fVerbose)
Definition giaDup.c:3651
void Gia_ManDupRemapCos(Gia_Man_t *pNew, Gia_Man_t *p)
Definition giaDup.c:154
void Gia_ManDupCofactorVar_rec(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pObj)
Definition giaDup.c:1852
Gia_Man_t * Gia_ManDupEncode(Gia_Man_t *p, Vec_Int_t *vVarNums, int fVerbose)
Definition giaDup.c:6129
Gia_Man_t * Gia_ManDupCones(Gia_Man_t *p, int *pPos, int nPos, int fTrimPis)
Definition giaDup.c:3880
Gia_Man_t * Gia_ManDupAddFlop(Gia_Man_t *p)
Definition giaDup.c:5692
Gia_Man_t * Gia_ManDupDfsNode(Gia_Man_t *p, Gia_Obj_t *pRoot)
Definition giaDup.c:2321
void Gia_ManDupDfsRehash_rec(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pObj)
Definition giaDup.c:1806
Vec_Wec_t * Gia_ManIsoStrashReduceInt(Gia_Man_t *p, Vec_Wec_t *vSupps, int fVerbose)
Definition giaDup.c:4601
Gia_Man_t * Gia_ManTransformDualOutput(Gia_Man_t *p)
Definition giaDup.c:3518
Vec_Int_t * Gia_ManDupChoicesCreateSibls(Gia_ChMan_t *p)
Definition giaDup.c:6449
Gia_Man_t * Gia_ManDupNoBuf(Gia_Man_t *p)
Definition giaDup.c:823
Gia_Man_t * Gia_ManTransformMiter2(Gia_Man_t *p)
Definition giaDup.c:3409
Gia_Man_t * Gia_ManDupAddPis(Gia_Man_t *p, int nMulti)
Definition giaDup.c:5363
void Gia_ManDupWithConstrCollectAnd_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vSuper, int fFirst)
Definition giaDup.c:4259
int Gia_ManDupDfs2_rec(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pObj)
Definition giaDup.c:1668
Gia_Man_t * Gia_ManDupDfs(Gia_Man_t *p)
Definition giaDup.c:1748
void Gia_ManDupRemapCis(Gia_Man_t *pNew, Gia_Man_t *p)
Definition giaDup.c:128
void Gia_ManDupDfs3_rec(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pObj)
Definition giaDup.c:2307
Vec_Int_t * Gia_ManSortCoBySuppSize(Gia_Man_t *p, Vec_Wec_t *vSupps)
Definition giaDup.c:4468
Gia_Man_t * Gia_ManDupAbs(Gia_Man_t *p, Vec_Int_t *vMapPpi2Ff, Vec_Int_t *vMapFf2Ppi)
Definition giaDup.c:239
Gia_Man_t * Gia_ManDupAndOr(Gia_Man_t *p, int nOuts, int fUseOr, int fCompl)
Definition giaDup.c:3216
int Gia_ManDupOrderDfs2_rec(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pObj)
Definition giaDup.c:473
void Gia_ManDupDemiterOrderXors(Gia_Man_t *p, Vec_Int_t *vXors)
Definition giaDup.c:4769
void Gia_ManDupCleanDfs_rec(Gia_Obj_t *pObj)
Definition giaDup.c:4502
void Gia_ManCycle(Gia_Man_t *p, Abc_Cex_t *pCex, int nFrames)
Definition giaDup.c:671
Gia_Man_t * Gia_ManDupOntop(Gia_Man_t *p, Gia_Man_t *p2)
Definition giaDup.c:2590
Gia_Man_t * Gia_ManDupTopAnd(Gia_Man_t *p, int fVerbose)
Definition giaDup.c:2930
Vec_Int_t * Gia_ManCollectOneSide(Gia_Man_t *p, int iSide)
Definition giaDup.c:3508
Vec_Int_t * Gia_ManDupTrimmedNonZero(Gia_Man_t *p)
Definition giaDup.c:2378
Gia_Man_t * Gia_ManDupSelf(Gia_Man_t *p)
Definition giaDup.c:1359
Gia_Man_t * Gia_ManDupDemiter(Gia_Man_t *p, int fVerbose)
Definition giaDup.c:4675
void Gia_ManDupConeBack_rec(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pObj)
Definition giaDup.c:2260
Gia_Man_t * Gia_ManDupWithConstraints(Gia_Man_t *p, Vec_Int_t *vPoTypes)
Definition giaDup.c:3816
Gia_Man_t * Gia_ManDupSelectedOutputs(Gia_Man_t *p, Vec_Int_t *vOutsLeft)
Definition giaDup.c:376
Gia_Man_t * Gia_ManDupOrderDfsChoices(Gia_Man_t *p)
Definition giaDup.c:438
Gia_Man_t * Gia_ManDupLevelized(Gia_Man_t *p)
Definition giaDup.c:4135
void Gia_ManCollectTopXors_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vXors)
Definition giaDup.c:4880
void Gia_ManProdAdderGen(int nArgA, int nArgB, int Seed, int fSigned, int fCla)
Definition giaDup.c:5609
void Gia_ManCollectOneSide_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vNodes)
Definition giaDup.c:3497
Gia_Man_t * Gia_ManDupAddBufs(Gia_Man_t *p)
Definition giaDup.c:872
Gia_Man_t * Gia_ManMiterInverse(Gia_Man_t *pBot, Gia_Man_t *pTop, int fDualOut, int fVerbose)
Definition giaDup.c:3130
Gia_Man_t * Gia_ManTransformToDual(Gia_Man_t *p)
Definition giaDup.c:3440
Gia_Man_t * Gia_ManDupTrimmed2(Gia_Man_t *p)
Definition giaDup.c:2512
Gia_Man_t * Gia_ManDupConeSupp(Gia_Man_t *p, int iLit, Vec_Int_t *vCiIds)
Definition giaDup.c:2235
int Gia_ManCountMark0Dfs(Gia_Man_t *p, int iObj)
Definition giaDup.c:4846
Vec_Wec_t ** Gia_ManDupUifBuildMap(Gia_Man_t *p)
Definition giaDup.c:5404
Gia_Man_t * Gia_ManDupOutputVec(Gia_Man_t *p, Vec_Int_t *vOutPres)
Definition giaDup.c:342
Gia_Man_t * Gia_ManDupSpreadFlop(Gia_Man_t *p, Vec_Int_t *vFfMask)
Definition giaDup.c:990
Gia_Man_t * Gia_ManDupDfs2(Gia_Man_t *p)
Definition giaDup.c:1700
Vec_Int_t * Gia_ManCollectReach2(Gia_Man_t *p, int fSecond)
Definition giaDup.c:5071
void Gia_ManDupAppend(Gia_Man_t *pNew, Gia_Man_t *pTwo)
Definition giaDup.c:1137
void Gia_ManDupAndConesLimit2_rec(Gia_Man_t *pNew, Gia_Man_t *p, int iObj, int Level)
Definition giaDup.c:4038
int Gia_ManCountMark1Dfs_rec(Gia_Man_t *p, int iObj)
Definition giaDup.c:4851
Gia_Man_t * Gia_ManDupZeroUndc(Gia_Man_t *p, char *pInit, int nNewPis, int fGiaSimple, int fVerbose)
Definition giaDup.c:3569
Gia_Man_t * Gia_ManDupBlackBox(Gia_Man_t *p)
Definition giaDup.c:5513
void Gia_ManHighLightFlopLogic(Gia_Man_t *p)
Definition giaDup.c:5307
Gia_Man_t * Gia_ManDupOrderAiger(Gia_Man_t *p)
Definition giaDup.c:532
void Gia_ManDupDemiterOrderXors2(Gia_Man_t *p, Vec_Int_t *vXors)
Definition giaDup.c:4734
void Gia_ManDupAndConesLimit_rec(Gia_Man_t *pNew, Gia_Man_t *p, int iObj, int Level)
Definition giaDup.c:4005
Gia_Man_t * Gia_ManDemiterToDual(Gia_Man_t *p)
Definition giaDup.c:4956
Gia_Man_t * Gia_ManDupReplaceCut(Gia_Man_t *p)
Definition giaDup.c:5319
Gia_Man_t * Gia_ManDupAppendNew(Gia_Man_t *pOne, Gia_Man_t *pTwo)
Definition giaDup.c:1174
Vec_Int_t * Gia_ManCofClassPattern(Gia_Man_t *p, Vec_Int_t *vVarNums, int fVerbose)
Definition giaDup.c:6109
Gia_Man_t * Gia_ManDupDfsOnePo(Gia_Man_t *p, int iPo)
Definition giaDup.c:1770
Gia_Man_t * Gia_ManDupFanouts(Gia_Man_t *p)
Definition giaDup.c:6236
void Gia_ManDupConeSupp_rec(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vObjs)
Definition giaDup.c:2218
int Gia_ManCoSuppSizeMax(Gia_Man_t *p, Vec_Wec_t *vSupps)
Definition giaDup.c:4440
Gia_Man_t * Gia_ManReorderChoices(Gia_Man_t *p)
Definition giaDup.c:6311
int Gia_ManDupConeBack(Gia_Man_t *p, Gia_Man_t *pNew, Vec_Int_t *vCiIds)
Definition giaDup.c:2270
int Gia_ManChoiceMiter_rec(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pObj)
Definition giaDup.c:3741
Gia_Man_t * Gia_ManDupTopAnd_iter(Gia_Man_t *p, int fVerbose)
Definition giaDup.c:2829
Gia_Man_t * Gia_ManDupOrderDfsReverse(Gia_Man_t *p, int fRevFans, int fRevOuts)
Definition giaDup.c:482
Gia_Man_t * Gia_ManDupDfsLitArray(Gia_Man_t *p, Vec_Int_t *vLits)
Definition giaDup.c:2346
Vec_Int_t * Gia_ManMarkSupported(Gia_Man_t *p, Vec_Int_t *vObjs)
Definition giaDup.c:5941
Gia_Man_t * Gia_ManOneHot(int nSkips, int nVars)
Definition giaDup.c:4082
int Gia_ObjCompareByCioId(Gia_Obj_t **pp1, Gia_Obj_t **pp2)
Definition giaDup.c:3855
Gia_Man_t * Gia_ManDupOrderDfs(Gia_Man_t *p)
Definition giaDup.c:206
Vec_Wec_t * Gia_ManCollectIntTfos(Gia_Man_t *p, Vec_Int_t *vVarNums)
Definition giaDup.c:6019
Gia_Man_t * Gia_ManMiter(Gia_Man_t *p0, Gia_Man_t *p1, int nInsDup, int fDualOut, int fSeq, int fImplic, int fVerbose)
Definition giaDup.c:2983
void Gia_ManPrintEquivs(Gia_Man_t *p)
Definition giaDup.c:5233
Gia_Man_t * Gia_ManDupAndCones(Gia_Man_t *p, int *pAnds, int nAnds, int fTrimPis)
Definition giaDup.c:3941
Gia_Man_t * Gia_ManDupSliced(Gia_Man_t *p, int nSuppMax)
Definition giaDup.c:4211
Gia_Man_t * Gia_ManDupCycled(Gia_Man_t *p, Abc_Cex_t *pCex, int nFrames)
Definition giaDup.c:691
Gia_Man_t * Gia_ManDupRandPerm(Gia_Man_t *p)
Definition giaDup.c:1104
Gia_Man_t * Gia_ManDupWithCare(Gia_Man_t *p, Gia_Man_t *pCare)
Definition giaDup.c:5560
Gia_ChMan_t * Gia_ManDupChoicesStart(Gia_Man_t *pGia)
Definition giaDup.c:6425
Gia_Man_t * Gia_ManDupExist2(Gia_Man_t *p, int iVar)
Definition giaDup.c:2110
Gia_Man_t * Gia_ManImplFromBMiter(Gia_Man_t *p, int nPo, int nBInput)
Definition giaDup.c:5809
Gia_Man_t * Gia_ManDupDfsRehash(Gia_Man_t *p)
Definition giaDup.c:1815
Vec_Int_t * Gia_GenDecoder(Gia_Man_t *p, int *pLits, int nLits)
Definition giaGen.c:1249
struct Gia_Rpr_t_ Gia_Rpr_t
Definition gia.h:57
void Gia_ManStop(Gia_Man_t *p)
Definition giaMan.c:82
#define Gia_ManForEachRo(p, pObj, i)
Definition gia.h:1252
void Gia_ManStaticFanoutStart(Gia_Man_t *p)
Definition giaFanout.c:238
void Gia_ManHashStart(Gia_Man_t *p)
Definition giaHash.c:125
int Gia_ManSuppSize(Gia_Man_t *p, int *pNodes, int nNodes)
Definition giaDfs.c:324
void Gia_ManStaticFanoutStop(Gia_Man_t *p)
Definition giaFanout.c:393
int Gia_ManHasDangling(Gia_Man_t *p)
Definition giaUtil.c:1353
#define Gia_ManForEachPo(p, pObj, i)
Definition gia.h:1250
int Gia_ManIsNormalized(Gia_Man_t *p)
Definition giaTim.c:114
#define Gia_ManForEachAnd(p, pObj, i)
Definition gia.h:1214
#define Gia_ManForEachConst(p, i)
Definition gia.h:1099
#define Gia_ManForEachCoReverse(p, pObj, i)
Definition gia.h:1242
void Gia_ManSetRegNum(Gia_Man_t *p, int nRegs)
Definition giaMan.c:764
#define Gia_ManForEachCoDriverId(p, DriverId, i)
Definition gia.h:1246
int Gia_ManHashAndMulti(Gia_Man_t *p, Vec_Int_t *vLits)
Definition giaHash.c:783
int * Gia_ManDeriveNexts(Gia_Man_t *p)
Definition giaEquiv.c:260
void Gia_ManCollectTfo(Gia_Man_t *p, Vec_Int_t *vRoots, Vec_Int_t *vNodes)
Definition giaDfs.c:615
void Bnd_ManMap(int iLit, int id, int spec)
Definition giaBound.c:178
void Gia_ManHashAlloc(Gia_Man_t *p)
Definition giaHash.c:105
void Gia_ManPrintStatsShort(Gia_Man_t *p)
Definition giaMan.c:658
#define Gia_ClassForEachObj1(p, i, iObj)
Definition gia.h:1109
#define Gia_ManForEachPi(p, pObj, i)
Definition gia.h:1248
#define Gia_ManForEachCiVec(vVec, p, pObj, i)
Definition gia.h:1232
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
Definition giaMan.c:57
#define Gia_ManForEachObjVecStart(vVec, p, pObj, i, Start)
Definition gia.h:1196
int Gia_ManHashOr(Gia_Man_t *p, int iLit0, int iLit1)
Definition giaHash.c:621
struct Gia_Obj_t_ Gia_Obj_t
Definition gia.h:76
int Gia_ManHashXor(Gia_Man_t *p, int iLit0, int iLit1)
Definition giaHash.c:668
#define Gia_ClassForEachObj(p, i, iObj)
Definition gia.h:1107
void Gia_ManFillValue(Gia_Man_t *p)
Definition giaUtil.c:369
struct Gia_Man_t_ Gia_Man_t
Definition gia.h:96
#define Gia_ManForEachObj1(p, pObj, i)
Definition gia.h:1192
#define Gia_ManForEachObjVec(vVec, p, pObj, i)
Definition gia.h:1194
int Gia_ManHashMux(Gia_Man_t *p, int iCtrl, int iData1, int iData0)
Definition giaHash.c:692
#define Gia_ManForEachClass(p, i)
Definition gia.h:1101
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
Definition giaScl.c:84
void Gia_ManCleanMark0(Gia_Man_t *p)
Definition giaUtil.c:256
Gia_Man_t * Gia_ManSeqStructSweep(Gia_Man_t *p, int fConst, int fEquiv, int fVerbose)
Definition giaScl.c:258
struct Bnd_Man_t_ Bnd_Man_t
Definition gia.h:1830
int Gia_ObjRecognizeExor(Gia_Obj_t *pObj, Gia_Obj_t **ppFan0, Gia_Obj_t **ppFan1)
Definition giaUtil.c:1018
void Gia_ManCreateRefs(Gia_Man_t *p)
Definition giaUtil.c:779
struct Gia_ChMan_t_ Gia_ChMan_t
Definition gia.h:1416
Gia_Man_t * Gia_ManDupNormalize(Gia_Man_t *p, int fHashMapping)
Definition giaTim.c:139
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_ObjForEachFanoutStaticId(p, Id, FanId, i)
Definition gia.h:1127
#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
#define Gia_ManForEachRiRo(p, pObjRi, pObjRo, i)
Definition gia.h:1256
void Gia_ManSetPhase(Gia_Man_t *p)
Definition giaUtil.c:420
#define GIA_VOID
Definition gia.h:46
void Gia_ManHashStop(Gia_Man_t *p)
Definition giaHash.c:149
void Gia_ManCleanMark01(Gia_Man_t *p)
Definition giaUtil.c:218
int Gia_ManLevelNum(Gia_Man_t *p)
Definition giaUtil.c:546
void Gia_ManTransferMapping(Gia_Man_t *p, Gia_Man_t *pGia)
Definition giaIf.c:2305
unsigned Gia_ManRandom(int fReset)
FUNCTION DEFINITIONS ///.
Definition giaUtil.c:49
void Gia_ManMarkFanoutDrivers(Gia_Man_t *p)
Definition giaUtil.c:1779
void Gia_ManTransferPacking(Gia_Man_t *p, Gia_Man_t *pGia)
Definition giaIf.c:2336
#define Gia_ManForEachRi(p, pObj, i)
Definition gia.h:1254
Gia_Man_t * Gia_ManSeqCleanup(Gia_Man_t *p)
Definition giaScl.c:183
#define Gia_ManForEachCiId(p, Id, i)
Definition gia.h:1230
void Gia_AigerWrite(Gia_Man_t *p, char *pFileName, int fWriteSymbols, int fCompact, int fWriteNewLine)
Definition giaAiger.c:1595
void Gia_ManCollectAnds(Gia_Man_t *p, int *pNodes, int nNodes, Vec_Int_t *vNodes, Vec_Int_t *vLeaves)
Definition giaDfs.c:125
unsigned __int64 word
DECLARATIONS ///.
Definition kitPerm.c:36
int nSuppMax
Definition llb3Image.c:83
Vec_Int_t * vSibls
Definition giaDup.c:6350
Vec_Mem_t * vTtMem
Definition giaDup.c:6349
Gia_Man_t * pNew
Definition giaDup.c:6348
Vec_Int_t * vTt2Obj
Definition giaDup.c:6352
word * pTruth
Definition giaDup.c:6354
Vec_Int_t * vCoLits
Definition giaDup.c:6353
Vec_Int_t * vObj2Tt
Definition giaDup.c:6351
Gia_Man_t * pAigExtra
Definition gia.h:167
Vec_Ptr_t * vNamesIn
Definition gia.h:181
int * pSibls
Definition gia.h:128
int nAnd2Delay
Definition gia.h:202
unsigned * pMuxes
Definition gia.h:106
Vec_Int_t * vCos
Definition gia.h:111
char * pSpec
Definition gia.h:100
Gia_Rpr_t * pReprs
Definition gia.h:126
Vec_Int_t * vRegInits
Definition gia.h:161
int * pNexts
Definition gia.h:127
Vec_Int_t vHTable
Definition gia.h:113
Vec_Ptr_t * vNamesOut
Definition gia.h:182
int fGiaSimple
Definition gia.h:116
int nObjsAlloc
Definition gia.h:104
Vec_Int_t * vRegClasses
Definition gia.h:160
void * pManTime
Definition gia.h:194
int nRegs
Definition gia.h:101
Abc_Cex_t * pCexSeq
Definition gia.h:150
Vec_Int_t * vCis
Definition gia.h:110
Vec_Int_t * vBarBufs
Definition gia.h:163
char * pName
Definition gia.h:99
char * pCellStr
Definition gia.h:143
int nObjs
Definition gia.h:103
int nConstrs
Definition gia.h:122
Vec_Int_t * vConfigs
Definition gia.h:142
unsigned fMark1
Definition gia.h:86
unsigned Value
Definition gia.h:89
unsigned fPhase
Definition gia.h:87
unsigned fMark0
Definition gia.h:81
typedefABC_NAMESPACE_HEADER_START struct Tim_Man_t_ Tim_Man_t
INCLUDES ///.
Definition tim.h:92
Tim_Man_t * Tim_ManDup(Tim_Man_t *p, int fUnitDelay)
Definition timMan.c:86
Abc_Cex_t * Abc_CexDup(Abc_Cex_t *p, int nRegsNew)
Definition utilCex.c:145
typedefABC_NAMESPACE_HEADER_START struct Abc_Cex_t_ Abc_Cex_t
INCLUDES ///.
Definition utilCex.h:39
typedefABC_NAMESPACE_IMPL_START struct Vec_Mem_t_ Vec_Mem_t
DECLARATIONS ///.
Definition utilMem.c:35
#define assert(ex)
Definition util_old.h:213
int strlen()
char * sprintf()
typedefABC_NAMESPACE_HEADER_START struct Vec_Bit_t_ Vec_Bit_t
INCLUDES ///.
Definition vecBit.h:42
#define Vec_IntForEachEntryDouble(vVec, Entry1, Entry2, i)
Definition vecInt.h:72
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
#define Vec_IntForEachEntryTwo(vVec1, vVec2, Entry1, Entry2, i)
Definition vecInt.h:66
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
Definition vecInt.h:56
#define Vec_PtrForEachEntryStart(Type, vVec, pEntry, i, Start)
Definition vecPtr.h:57
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
Definition vecPtr.h:42
#define Vec_PtrForEachEntryDouble(Type1, Type2, vVec, Entry1, Entry2, i)
Definition vecPtr.h:67
#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
#define Vec_WrdForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecWrd.h:54
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.
Definition vecWrd.h:42
void Wlc_BlastReduceMatrix(Gia_Man_t *pNew, Vec_Wec_t *vProds, Vec_Wec_t *vLevels, Vec_Int_t *vRes, int fSigned, int fCla)
Definition wlcBlast.c:971
Gia_Man_t * Cec4_ManSimulateTest3(Gia_Man_t *p, int nBTLimit, int fVerbose)
Definition cecSatG2.c:2077