51 Abc_Obj_t * pFanin, * pFanin2, * pFaninTemp;
52 unsigned * pInfo, * pInfoDiv, * pInfoDiv2;
53 int Counter, RetValue, i, i2, d, d2, iDiv, iDiv2, k;
56 pInfo = (
unsigned *)Vec_PtrEntry( pSim->
vOuts, 1 );
57 RetValue = Abc_InfoIsOne( pInfo, pSim->
nWordsOut );
65 pInfo = Res_FilterCollectFaninInfo( pWin, pSim, ~0 );
66 RetValue = Abc_InfoIsOne( pInfo, pSim->
nWordsOut );
76 Vec_VecClear( vResubs );
77 Vec_VecClear( vResubsW );
80 if ( fArea && Abc_ObjFanoutNum(pFanin) > 1 )
83 pInfo = Res_FilterCollectFaninInfo( pWin, pSim, ~(1 << i) );
84 RetValue = Abc_InfoIsOne( pInfo, pSim->
nWordsOut );
89 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,0) );
90 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,1) );
95 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,2+k) );
96 Vec_VecPush( vResubsW, Counter, pFaninTemp );
100 if ( Counter == Vec_VecSize(vResubs) )
108 if ( Abc_ObjFanoutNum(pFanin) > 1 )
111 pInfo = Res_FilterCollectFaninInfo( pWin, pSim, ~(1 << i) );
113 for ( d = Abc_ObjFaninNum(pWin->pNode) + 2; d < Abc_NtkPoNum(pAig); d++ )
115 pInfoDiv = (
unsigned *)Vec_PtrEntry( pSim->
vOuts, d );
116 iDiv = d - (Abc_ObjFaninNum(pWin->pNode) + 2);
117 if ( !Abc_InfoIsOrOne( pInfo, pInfoDiv, pSim->
nWordsOut ) )
120 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,0) );
121 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,1) );
127 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,2+k) );
128 Vec_VecPush( vResubsW, Counter, pFaninTemp );
132 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,d) );
133 Vec_VecPush( vResubsW, Counter, Vec_PtrEntry(pWin->vDivs, iDiv) );
135 if ( Counter == Vec_VecSize(vResubs) )
141 if ( Abc_ObjFaninNum(pWin->pNode) < nFaninsMax )
146 if ( Abc_ObjFanoutNum(pFanin) > 1 )
149 pInfo = Res_FilterCollectFaninInfo( pWin, pSim, ~(1 << i) );
151 for ( d = Abc_ObjFaninNum(pWin->pNode) + 2; d < Abc_NtkPoNum(pAig); d++ )
153 pInfoDiv = (
unsigned *)Vec_PtrEntry( pSim->
vOuts, d );
154 iDiv = d - (Abc_ObjFaninNum(pWin->pNode) + 2);
156 for ( d2 = d + 1; d2 < Abc_NtkPoNum(pAig); d2++ )
158 pInfoDiv2 = (
unsigned *)Vec_PtrEntry( pSim->
vOuts, d2 );
159 iDiv2 = d2 - (Abc_ObjFaninNum(pWin->pNode) + 2);
160 if ( !Abc_InfoIsOrOne3( pInfo, pInfoDiv, pInfoDiv2, pSim->
nWordsOut ) )
163 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,0) );
164 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,1) );
170 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,2+k) );
171 Vec_VecPush( vResubsW, Counter, pFaninTemp );
175 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,d) );
176 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,d2) );
177 Vec_VecPush( vResubsW, Counter, Vec_PtrEntry(pWin->vDivs, iDiv) );
178 Vec_VecPush( vResubsW, Counter, Vec_PtrEntry(pWin->vDivs, iDiv2) );
180 if ( Counter == Vec_VecSize(vResubs) )
192 for ( i2 = i + 1; i2 < Abc_ObjFaninNum(pWin->pNode); i2++ )
194 pFanin2 = Abc_ObjFanin(pWin->pNode, i2);
196 pInfo = Res_FilterCollectFaninInfo( pWin, pSim, (~(1 << i)) & (~(1 << i2)) );
198 for ( d = Abc_ObjFaninNum(pWin->pNode) + 2; d < Abc_NtkPoNum(pAig); d++ )
200 pInfoDiv = (
unsigned *)Vec_PtrEntry( pSim->
vOuts, d );
201 iDiv = d - (Abc_ObjFaninNum(pWin->pNode) + 2);
202 if ( !Abc_InfoIsOrOne( pInfo, pInfoDiv, pSim->
nWordsOut ) )
205 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,0) );
206 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,1) );
210 if ( k != i && k != i2 )
212 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,2+k) );
213 Vec_VecPush( vResubsW, Counter, pFaninTemp );
217 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,d) );
218 Vec_VecPush( vResubsW, Counter, Vec_PtrEntry(pWin->vDivs, iDiv) );
220 if ( Counter == Vec_VecSize(vResubs) )
244 unsigned * pInfo, * pInfoDiv, * pInfoDiv2;
245 int Counter, RetValue, d, d2, k, iDiv, iDiv2, iBest;
248 pInfo = (
unsigned *)Vec_PtrEntry( pSim->
vOuts, 1 );
249 RetValue = Abc_InfoIsOne( pInfo, pSim->
nWordsOut );
257 pInfo = Res_FilterCollectFaninInfo( pWin, pSim, ~0 );
258 RetValue = Abc_InfoIsOne( pInfo, pSim->
nWordsOut );
268 Vec_VecClear( vResubs );
269 Vec_VecClear( vResubsW );
271 iBest = Res_FilterCriticalFanin( pWin->pNode );
276 pInfo = Res_FilterCollectFaninInfo( pWin, pSim, ~(1 << iBest) );
277 RetValue = Abc_InfoIsOne( pInfo, pSim->
nWordsOut );
282 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,0) );
283 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,1) );
288 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,2+k) );
289 Vec_VecPush( vResubsW, Counter, pFanin );
298 for ( d = Abc_ObjFaninNum(pWin->pNode) + 2; d < Abc_NtkPoNum(pAig); d++ )
300 pInfoDiv = (
unsigned *)Vec_PtrEntry( pSim->
vOuts, d );
301 iDiv = d - (Abc_ObjFaninNum(pWin->pNode) + 2);
302 if ( !Abc_InfoIsOrOne( pInfo, pInfoDiv, pSim->
nWordsOut ) )
307 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,0) );
308 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,1) );
314 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,2+k) );
315 Vec_VecPush( vResubsW, Counter, pFanin );
319 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,d) );
320 Vec_VecPush( vResubsW, Counter, Vec_PtrEntry(pWin->vDivs, iDiv) );
323 if ( Counter == Vec_VecSize(vResubs) )
327 if ( Counter > 0 || Abc_ObjFaninNum(pWin->pNode) >= nFaninsMax )
331 for ( d = Abc_ObjFaninNum(pWin->pNode) + 2; d < Abc_NtkPoNum(pAig); d++ )
333 pInfoDiv = (
unsigned *)Vec_PtrEntry( pSim->
vOuts, d );
334 iDiv = d - (Abc_ObjFaninNum(pWin->pNode) + 2);
336 for ( d2 = d + 1; d2 < Abc_NtkPoNum(pAig); d2++ )
338 pInfoDiv2 = (
unsigned *)Vec_PtrEntry( pSim->
vOuts, d2 );
339 iDiv2 = d2 - (Abc_ObjFaninNum(pWin->pNode) + 2);
341 if ( !Abc_InfoIsOrOne3( pInfo, pInfoDiv, pInfoDiv2, pSim->
nWordsOut ) )
344 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,0) );
345 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,1) );
351 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,2+k) );
352 Vec_VecPush( vResubsW, Counter, pFanin );
356 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,d) );
357 Vec_VecPush( vResubs, Counter, Abc_NtkPo(pAig,d2) );
358 Vec_VecPush( vResubsW, Counter, Vec_PtrEntry(pWin->vDivs, iDiv) );
359 Vec_VecPush( vResubsW, Counter, Vec_PtrEntry(pWin->vDivs, iDiv2) );
362 if ( Counter == Vec_VecSize(vResubs) )
365 if ( Counter == Vec_VecSize(vResubs) )