50 Vec_Bit_t * vXorIns = Vec_BitStart( Gia_ManObjNum(
p) );
57 Vec_IntPush( vXors, i );
58 Vec_BitWriteEntry( vXorIns, Gia_ObjId(
p, Gia_Regular(pFan0)), 1 );
59 Vec_BitWriteEntry( vXorIns, Gia_ObjId(
p, Gia_Regular(pFan1)), 1 );
63 if ( !Vec_BitEntry(vXorIns, Entry) )
64 Vec_IntWriteEntry( vXors, k++, Entry );
65 Vec_IntShrink( vXors, k );
66 Vec_BitFree( vXorIns );
83 Vec_Int_t * vDoubles = Vec_IntAlloc( 100 );
85 int i, k, Fanins[2], Entry, Rank;
87 Vec_Int_t * vRanks = Vec_IntStartFull( Gia_ManObjNum(
p) );
89 Vec_IntWriteEntry( vRanks, Entry, i );
95 Rank = Vec_IntEntry( vRanks, i );
100 Fanins[0] = Gia_ObjId(
p, Gia_Regular(pFan0));
101 Fanins[1] = Gia_ObjId(
p, Gia_Regular(pFan1));
102 for ( k = 0; k < 2; k++ )
104 Entry = Vec_IntEntry( vRanks, Fanins[k] );
108 Vec_IntWriteEntry( vRanks, Fanins[k], Rank );
110 Vec_IntPush( vDoubles, Fanins[k] );
111 if ( Entry != -1 && Gia_ObjIsAnd(Gia_ManObj(
p, Fanins[k])))
112 printf(
"Xor node %d belongs to Tree %d and Tree %d.\n", Fanins[k], Entry, Rank );
117 Vec_IntWriteEntry( vRanks, Entry, -1 );
118 Vec_IntFree( vDoubles );
135 Vec_Bit_t * vMapXors = Vec_BitStart( Gia_ManObjNum(
p) );
136 Vec_Wec_t * vTreeLeaves = Vec_WecStart( Vec_IntSize(vXorRoots) );
138 int i, k, Fanins[2], Rank;
143 Vec_BitWriteEntry( vMapXors, i, 1 );
144 Rank = Vec_IntEntry( vRanks, i );
149 Fanins[0] = Gia_ObjId(
p, Gia_Regular(pFan0));
150 Fanins[1] = Gia_ObjId(
p, Gia_Regular(pFan1));
151 for ( k = 0; k < 2; k++ )
153 if ( Vec_BitEntry(vMapXors, Fanins[k]) )
155 assert( Rank == Vec_IntEntry(vRanks, Fanins[k]) );
158 Vec_WecPush( vTreeLeaves, Rank, Fanins[k] );
161 Vec_BitFree( vMapXors );
178 Vec_Int_t * vShadows = Vec_IntDup( vRanks );
181 Vec_IntWriteEntry( vShadows, Gia_ObjId(
p, pObj), -1 );
184 if ( Vec_IntEntry(vShadows, i) >= 0 )
186 Shad0 = Vec_IntEntry(vShadows, Gia_ObjFaninId0(pObj, i));
187 Shad1 = Vec_IntEntry(vShadows, Gia_ObjFaninId1(pObj, i));
188 if ( Shad0 == Shad1 && Shad0 != -1 )
189 Vec_IntWriteEntry(vShadows, i, Shad0);
209 if ( Gia_ObjIsTravIdCurrentId(
p, iNode) )
211 Gia_ObjSetTravIdCurrentId(
p, iNode);
212 pObj = Gia_ManObj(
p, iNode);
213 assert( Gia_ObjIsAnd(pObj) );
214 if ( Vec_IntEntry(vRanks, iNode) == Rank )
222 Vec_Wec_t * vNexts = Vec_WecStart( Vec_WecSize(vTreeLeaves) );
224 int i, k, Node, Fanins[2], Shad0, Shad1, Rank, nSupp;
229 if ( !Gia_ObjIsAnd(pObj) )
231 Fanins[0] = Gia_ObjFaninId0(pObj, Node);
232 Fanins[1] = Gia_ObjFaninId1(pObj, Node);
233 Shad0 = Vec_IntEntry(vShadows, Fanins[0]);
234 Shad1 = Vec_IntEntry(vShadows, Fanins[1]);
235 if ( Shad0 != Shad1 || Shad0 == -1 )
238 Rank = Vec_IntEntry( vRanks, Node );
245 Vec_IntPushUniqueOrder( Vec_WecEntry(vNexts, Shad0), Rank );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Vec_Int_t * Acec_StructAssignRanks(Gia_Man_t *p, Vec_Int_t *vXorRoots)
int Acec_CollectSupp_rec(Gia_Man_t *p, int iNode, int Rank, Vec_Int_t *vRanks)
Vec_Wec_t * Acec_FindNexts(Gia_Man_t *p, Vec_Int_t *vRanks, Vec_Int_t *vShadows, Vec_Wec_t *vTreeLeaves)
Vec_Wec_t * Acec_FindTreeLeaves(Gia_Man_t *p, Vec_Int_t *vXorRoots, Vec_Int_t *vRanks)
ABC_NAMESPACE_IMPL_START Vec_Int_t * Acec_StructDetectXorRoots(Gia_Man_t *p)
DECLARATIONS ///.
void Acec_StructTest(Gia_Man_t *p)
Vec_Int_t * Acec_FindShadows(Gia_Man_t *p, Vec_Int_t *vRanks)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define Gia_ManForEachAnd(p, pObj, i)
#define Gia_ManForEachAndReverse(p, pObj, i)
struct Gia_Obj_t_ Gia_Obj_t
struct Gia_Man_t_ Gia_Man_t
int Gia_ObjRecognizeExor(Gia_Obj_t *pObj, Gia_Obj_t **ppFan0, Gia_Obj_t **ppFan1)
void Gia_ManIncrementTravId(Gia_Man_t *p)
#define Gia_ManForEachCi(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Bit_t_ Vec_Bit_t
INCLUDES ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_WecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.