49 int fCollected, iFanout = -1, i;
52 if ( pDists[pObj->
Id] >= nDist )
54 pDists[pObj->
Id] = nDist;
55 fCollected = Aig_ObjIsTravIdCurrent(
p, pObj );
56 Aig_ObjSetTravIdCurrent(
p, pObj );
57 if ( Aig_ObjIsConst1(pObj) )
59 if ( Saig_ObjIsPo(
p, pObj) )
61 if ( Saig_ObjIsLi(
p, pObj) )
63 pMatch = Saig_ObjLiToLo(
p, pObj );
64 if ( !Aig_ObjIsTravIdCurrent(
p, pMatch ) )
70 Vec_PtrPush( vNodes, pObj );
71 if ( Saig_ObjIsPi(
p, pObj) )
73 if ( Saig_ObjIsLo(
p, pObj) )
75 pMatch = Saig_ObjLoToLi(
p, pObj );
76 if ( !Aig_ObjIsTravIdCurrent(
p, pMatch ) )
82 assert( Aig_ObjIsNode(pObj) );
106 vNodes = Vec_PtrAlloc( 1000 );
112 assert( Aig_ObjIsTravIdCurrent(
p, pObjLi) ==
113 Aig_ObjIsTravIdCurrent(
p, pObjLo) );
134 if ( Saig_ObjIsPo(
p, pFanout) || !Aig_ObjIsTravIdCurrent(
p, pFanout) )
155 vNodesPi = Vec_PtrAlloc( 1000 );
158 if ( Saig_ObjIsPi(
p, pObj) )
161 Vec_PtrPush( vNodesPi, pObj );
163 else if ( Saig_ObjIsLo(
p, pObj) )
165 pMatch = Saig_ObjLoToLi(
p, pObj );
166 pFanin = Aig_ObjFanin0(pMatch);
167 if ( !Aig_ObjIsTravIdCurrent(
p, pFanin) && pFanin->
pData == NULL )
168 Vec_PtrPush( vNodesPi, pFanin );
172 assert( Aig_ObjIsNode(pObj) );
173 pFanin = Aig_ObjFanin0(pObj);
174 if ( !Aig_ObjIsTravIdCurrent(
p, pFanin) && pFanin->
pData == NULL )
175 Vec_PtrPush( vNodesPi, pFanin );
176 pFanin = Aig_ObjFanin1(pObj);
177 if ( !Aig_ObjIsTravIdCurrent(
p, pFanin) && pFanin->
pData == NULL )
178 Vec_PtrPush( vNodesPi, pFanin );
200 vNodesPo = Vec_PtrAlloc( 1000 );
202 *pvPointers = Vec_PtrAlloc( 1000 );
207 Vec_PtrPush( vNodesPo, pObj );
209 Vec_PtrPush( *pvPointers, pPointer );
235 pNew->pName = Abc_UtilStrsav(
"wnd" );
238 pObj = Aig_ManConst1(
p );
239 pObj->
pData = Aig_ManConst1( pNew );
244 Vec_PtrFree( vNodesPi );
248 if ( Saig_ObjIsLo(
p, pObj) )
254 if ( Aig_ObjIsNode(pObj) )
255 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
261 Vec_PtrFree( vNodesPo );
266 if ( Saig_ObjIsLo(
p, pObj) )
268 pMatch = Saig_ObjLoToLi(
p, pObj );
296 if ( pObjBig->
pData )
298 if ( (pMatch = (
Aig_Obj_t *)Vec_PtrEntry( vBigNode2SmallPo, pObjBig->
Id )) )
300 Saig_ManWindowInsertSmall_rec( pNew, Aig_ObjFanin0(pMatch), vBigNode2SmallPo, vSmallPi2BigNode );
301 pObjBig->
pData = Aig_ObjChild0Copy(pMatch);
304 assert( Aig_ObjIsNode(pObjBig) );
307 pObjBig->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObjBig), Aig_ObjChild1Copy(pObjBig) );
325 if ( pObjSmall->
pData )
327 if ( (pMatch = (
Aig_Obj_t *)Vec_PtrEntry( vSmallPi2BigNode, pObjSmall->
Id )) )
333 assert( Aig_ObjIsNode(pObjSmall) );
334 Saig_ManWindowInsertSmall_rec( pNew, Aig_ObjFanin0(pObjSmall), vBigNode2SmallPo, vSmallPi2BigNode );
335 Saig_ManWindowInsertSmall_rec( pNew, Aig_ObjFanin1(pObjSmall), vBigNode2SmallPo, vSmallPi2BigNode );
336 pObjSmall->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObjSmall), Aig_ObjChild1Copy(pObjSmall) );
353 Vec_Ptr_t * vBigNode2SmallPo, * vSmallPi2BigNode;
359 vSmallPi2BigNode = Vec_PtrStart( Aig_ManObjNumMax(pWnd) );
362 Vec_PtrWriteEntry( vSmallPi2BigNode, Aig_ManCi(pWnd, i)->Id, pObj );
363 assert( i == Saig_ManPiNum(pWnd) );
364 Vec_PtrFree( vNodesPi );
367 vBigNode2SmallPo = Vec_PtrStart( Aig_ManObjNumMax(
p) );
370 Vec_PtrWriteEntry( vBigNode2SmallPo, pObj->
Id, Aig_ManCo(pWnd, i) );
371 assert( i == Saig_ManPoNum(pWnd) );
372 Vec_PtrFree( vNodesPo );
378 pNew->pName = Abc_UtilStrsav(
p->pName );
379 pNew->pSpec = Abc_UtilStrsav(
p->pSpec );
381 pObj = Aig_ManConst1(
p );
382 pObj->
pData = Aig_ManConst1( pNew );
383 pObj = Aig_ManConst1( pWnd );
384 pObj->
pData = Aig_ManConst1( pNew );
388 if ( Saig_ObjIsPi(
p, pObj) || !Aig_ObjIsTravIdCurrent(
p, pObj) )
396 if ( Saig_ObjIsPo(
p, pObj) || !Aig_ObjIsTravIdCurrent(
p, pObj) )
404 Saig_ManWindowInsertSmall_rec( pNew, Aig_ObjFanin0(pObj), vBigNode2SmallPo, vSmallPi2BigNode );
407 Vec_PtrFree( vBigNode2SmallPo );
408 Vec_PtrFree( vSmallPi2BigNode );
410 assert( Aig_ManCiNum(pNew) - Aig_ManCiNum(
p) == Aig_ManCoNum(pNew) - Aig_ManCoNum(
p) );
431 if ( Aig_ManRegNum(
p) > 0 )
433 if ( Aig_ManRegNum(
p) == 1 )
434 return Saig_ManLo(
p, 0 );
437 if ( i == Aig_ManRegNum(
p)/2 )
444 assert( Aig_ManNodeNum(
p) > 1 );
447 if ( Counter++ == Aig_ManNodeNum(
p)/2 )
472 Vec_PtrFree( vNodes );
496 if ( Saig_ManPiNum(pWndTest) != Saig_ManPiNum(pWnd) ||
497 Saig_ManPoNum(pWndTest) != Saig_ManPoNum(pWnd) )
499 printf(
"The window cannot be reinserted because PI/PO counts do not match.\n" );
501 Vec_PtrFree( vNodes );
506 Vec_PtrFree( vNodes );
512 Vec_PtrFree( vNodes );
559 vNodes = Vec_PtrAlloc( 1000 );
562 pObj1 = Aig_ObjRepr( p0, pObj0 );
565 assert( pObj0 == Aig_ObjRepr( p1, pObj1 ) );
569 Aig_ObjSetTravIdCurrent( p0, pObj0 );
570 if ( Aig_ObjIsNode(pObj0) || Aig_ObjIsCi(pObj0) )
571 Vec_PtrPush( vNodes, pObj0 );
575 assert( Aig_ObjIsTravIdCurrent(p0, pObj0) ==
576 Aig_ObjIsTravIdCurrent(p0, pObj1) );
597 if ( Saig_ObjIsLo(p0, pObj) )
599 pMatch = Saig_ObjLoToLi( p0, pObj );
600 pFanin = Aig_ObjFanin0(pMatch);
601 if ( !Aig_ObjIsTravIdCurrent(p0, pFanin) && pFanin->
pData == NULL )
604 pMatch = Aig_ObjRepr( p0, pFanin );
605 assert( pFanin == Aig_ObjRepr( p1, pMatch ) );
613 assert( Aig_ObjIsNode(pObj) );
614 pFanin = Aig_ObjFanin0(pObj);
615 if ( !Aig_ObjIsTravIdCurrent(p0, pFanin) && pFanin->
pData == NULL )
618 pMatch = Aig_ObjRepr( p0, pFanin );
619 assert( pFanin == Aig_ObjRepr( p1, pMatch ) );
624 pFanin = Aig_ObjFanin1(pObj);
625 if ( !Aig_ObjIsTravIdCurrent(p0, pFanin) && pFanin->
pData == NULL )
628 pMatch = Aig_ObjRepr( p0, pFanin );
629 assert( pFanin == Aig_ObjRepr( p1, pMatch ) );
657 if ( Aig_ObjIsTravIdCurrent(p0, pObj0) )
659 if ( Aig_ObjIsConst1(pObj0) )
661 if ( Aig_ObjIsCi(pObj0) )
663 pObj1 = Aig_ObjRepr( p0, pObj0 );
664 assert( pObj0 == Aig_ObjRepr( p1, pObj1 ) );
665 if ( Aig_ObjIsCo(pObj0) )
667 pFanin0 = Aig_ObjFanin0(pObj0);
668 pFanin1 = Aig_ObjFanin0(pObj1);
669 assert( Aig_ObjIsTravIdCurrent(p0, pFanin0) ==
670 Aig_ObjIsTravIdCurrent(p1, pFanin1) );
671 if ( Aig_ObjIsTravIdCurrent(p0, pFanin0) )
679 assert( Aig_ObjIsNode(pObj0) );
681 pFanin0 = Aig_ObjFanin0(pObj0);
682 pFanin1 = Aig_ObjFanin0(pObj1);
683 assert( Aig_ObjIsTravIdCurrent(p0, pFanin0) ==
684 Aig_ObjIsTravIdCurrent(p1, pFanin1) );
685 if ( Aig_ObjIsTravIdCurrent(p0, pFanin0) )
691 pFanin0 = Aig_ObjFanin1(pObj0);
692 pFanin1 = Aig_ObjFanin1(pObj1);
693 assert( Aig_ObjIsTravIdCurrent(p0, pFanin0) ==
694 Aig_ObjIsTravIdCurrent(p1, pFanin1) );
695 if ( Aig_ObjIsTravIdCurrent(p0, pFanin0) )
719 Aig_Obj_t * pObj0, * pObj1, * pMatch0, * pMatch1;
725 pObj1 = Aig_ManCo( p1, i );
726 Aig_ObjSetRepr( p0, pObj0, pObj1 );
727 Aig_ObjSetRepr( p1, pObj1, pObj0 );
731 pMatch0 = Saig_ObjLiToLo( p0, pObj0 );
732 pMatch1 = Aig_ObjRepr( p0, pMatch0 );
733 if ( pMatch1 == NULL )
735 assert( pMatch0 == Aig_ObjRepr( p1, pMatch1 ) );
736 pObj1 = Saig_ObjLoToLi( p1, pMatch1 );
737 Aig_ObjSetRepr( p0, pObj0, pObj1 );
738 Aig_ObjSetRepr( p1, pObj1, pObj0 );
747 pNew =
Aig_ManStart( Vec_PtrSize(vNodes0) + Vec_PtrSize(vNodes1) );
748 pNew->pName = Abc_UtilStrsav(
"wnd" );
751 pObj0 = Aig_ManConst1( p0 );
752 pObj0->
pData = Aig_ManConst1( pNew );
753 pObj1 = Aig_ManConst1( p1 );
754 pObj1->
pData = Aig_ManConst1( pNew );
761 if ( Saig_ObjIsLo(p0, pObj0) )
766 if ( Saig_ObjIsLo(p1, pObj1) )
772 if ( Aig_ObjIsNode(pObj0) )
773 pObj0->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj0), Aig_ObjChild1Copy(pObj0) );
777 if ( Aig_ObjIsNode(pObj1) )
778 pObj1->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj1), Aig_ObjChild1Copy(pObj1) );
787 if ( Saig_ObjIsLo(p0, pObj0) )
789 pMatch0 = Saig_ObjLoToLi( p0, pObj0 );
796 if ( Saig_ObjIsLo(p1, pObj1) )
798 pMatch1 = Saig_ObjLoToLi( p1, pObj1 );
805 Vec_PtrFree( vNodes0 );
806 Vec_PtrFree( vNodes1 );
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManFanoutStart(Aig_Man_t *p)
FUNCTION DEFINITIONS ///.
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
void Aig_ManFanoutStop(Aig_Man_t *p)
#define Aig_ManForEachObj(p, pObj, i)
void Aig_ManStop(Aig_Man_t *p)
#define Aig_ObjForEachFanout(p, pObj, pFanout, iFan, i)
void Aig_ManIncrementTravId(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
struct Aig_Obj_t_ Aig_Obj_t
Aig_Obj_t * Aig_Exor(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
int Aig_ObjCompareIdIncrease(Aig_Obj_t **pp1, Aig_Obj_t **pp2)
#define Aig_ManForEachNode(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int Aig_ManCleanup(Aig_Man_t *p)
#define Aig_ManForEachCo(p, pObj, i)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
void Aig_ManCleanData(Aig_Man_t *p)
Aig_Obj_t * Saig_ManFindPivot(Aig_Man_t *p)
void Saig_ManWindowInsertBig_rec(Aig_Man_t *pNew, Aig_Obj_t *pObjBig, Vec_Ptr_t *vBigNode2SmallPo, Vec_Ptr_t *vSmallPi2BigNode)
Vec_Ptr_t * Saig_ManWindowCollectPis(Aig_Man_t *p, Vec_Ptr_t *vNodes)
Aig_Man_t * Saig_ManWindowExtract(Aig_Man_t *p, Aig_Obj_t *pObj, int nDist)
Aig_Man_t * Saig_ManWindowExtractNodes(Aig_Man_t *p, Vec_Ptr_t *vNodes)
Aig_Obj_t * Saig_ObjHasUnlabeledFanout(Aig_Man_t *p, Aig_Obj_t *pObj)
Vec_Ptr_t * Saig_ManWindowOutline(Aig_Man_t *p, Aig_Obj_t *pObj, int nDist)
void Saig_ManWindowCreatePos(Aig_Man_t *pNew, Aig_Man_t *p0, Aig_Man_t *p1)
Aig_Man_t * Saig_ManWindowInsertNodes(Aig_Man_t *p, Vec_Ptr_t *vNodes, Aig_Man_t *pWnd)
Aig_Man_t * Saig_ManWindowExtractMiter(Aig_Man_t *p0, Aig_Man_t *p1)
Aig_Man_t * Saig_ManWindowInsert(Aig_Man_t *p, Aig_Obj_t *pObj, int nDist, Aig_Man_t *pWnd)
Vec_Ptr_t * Saig_ManCollectedDiffNodes(Aig_Man_t *p0, Aig_Man_t *p1)
Aig_Man_t * Saig_ManWindowTest(Aig_Man_t *p)
void Saig_ManWindowCreatePis(Aig_Man_t *pNew, Aig_Man_t *p0, Aig_Man_t *p1, Vec_Ptr_t *vNodes0)
ABC_NAMESPACE_IMPL_START void Saig_ManWindowOutline_rec(Aig_Man_t *p, Aig_Obj_t *pObj, int nDist, Vec_Ptr_t *vNodes, int *pDists)
DECLARATIONS ///.
Vec_Ptr_t * Saig_ManWindowCollectPos(Aig_Man_t *p, Vec_Ptr_t *vNodes, Vec_Ptr_t **pvPointers)
#define Saig_ManForEachLiLo(p, pObjLi, pObjLo, i)
#define Saig_ManForEachLi(p, pObj, i)
#define Saig_ManForEachPo(p, pObj, i)
#define Saig_ManForEachLo(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.