47 word c0, uTruthObjNew = 0, uTruthObj = Acb_ObjTruth(
p, iObj ), Gate;
48 word c1, uTruthFanNew = 0, uTruthFan = Acb_ObjTruth(
p, iFanout );
49 int DecType = Abc_Tt6CheckOutDec( uTruthObj, iFaninIndex, &uTruthObjNew );
50 int iFanin = Acb_ObjFanin(
p, iObj, iFaninIndex );
51 int iFanoutObjIndex = Acb_ObjWhatFanin(
p, iFanout, iObj );
52 int iFanoutFaninIndex = Acb_ObjWhatFanin(
p, iFanout, iFanin );
53 if ( iFanoutFaninIndex == -1 )
54 iFanoutFaninIndex = Acb_ObjFaninNum(
p, iFanout);
55 assert( !Acb_ObjIsCio(
p, iObj) );
56 assert( !Acb_ObjIsCio(
p, iFanout) );
57 assert( iFanoutFaninIndex >= 0 );
58 assert( iFaninIndex < Acb_ObjFaninNum(
p, iObj) );
59 assert( Acb_ObjFanoutNum(
p, iObj) == 1 );
61 c0 = Abc_Tt6Cofactor0( uTruthFan, iFanoutObjIndex );
62 c1 = Abc_Tt6Cofactor1( uTruthFan, iFanoutObjIndex );
64 Gate = s_Truths6[iFanoutFaninIndex] & s_Truths6[iFanoutObjIndex];
65 else if ( DecType == 1 )
66 Gate = ~s_Truths6[iFanoutFaninIndex] & s_Truths6[iFanoutObjIndex];
67 else if ( DecType == 2 )
68 Gate = ~s_Truths6[iFanoutFaninIndex] | s_Truths6[iFanoutObjIndex];
69 else if ( DecType == 3 )
70 Gate = s_Truths6[iFanoutFaninIndex] | s_Truths6[iFanoutObjIndex];
71 else if ( DecType == 4 )
72 Gate = s_Truths6[iFanoutFaninIndex] ^ s_Truths6[iFanoutObjIndex];
74 uTruthFanNew = (~Gate & c0) | (Gate & c1);
76 Vec_WrdWriteEntry( &
p->vObjTruth, iObj, Abc_Tt6RemoveVar(uTruthObjNew, iFaninIndex) );
77 Vec_WrdWriteEntry( &
p->vObjTruth, iFanout, uTruthFanNew );
79 Acb_ObjRemoveFaninFanoutOne(
p, iObj, iFanin );
80 if ( iFanoutFaninIndex == Acb_ObjFaninNum(
p, iFanout) )
81 Acb_ObjAddFaninFanoutOne(
p, iFanout, iFanin );
97 word uTruthObjNew = 0, uTruthObj = Acb_ObjTruth(
p, iObj );
98 word uTruthFanNew = 0, uTruthFan = Acb_ObjTruth(
p, iFanin );
99 int iFaninIndex = Acb_ObjWhatFanin(
p, iObj, iFanin );
100 int DecType = Abc_TtCheckDsdAnd( uTruthObj, iFaninIndex, iFaninIndex2, &uTruthObjNew );
101 int iFanin2 = Acb_ObjFanin(
p, iObj, iFaninIndex2 );
102 int iFaninFaninIndex = Acb_ObjWhatFanin(
p, iFanin, iFanin2 );
103 if ( iFaninFaninIndex == -1 )
104 iFaninFaninIndex = Acb_ObjFaninNum(
p, iFanin);
105 assert( !Acb_ObjIsCio(
p, iObj) );
106 assert( !Acb_ObjIsCio(
p, iFanin) );
107 assert( iFaninIndex < Acb_ObjFaninNum(
p, iObj) );
108 assert( iFaninIndex2 < Acb_ObjFaninNum(
p, iObj) );
109 assert( iFaninIndex != iFaninIndex2 );
110 assert( Acb_ObjFanoutNum(
p, iFanin) == 1 );
113 uTruthFanNew = uTruthFan & s_Truths6[iFaninFaninIndex];
114 else if ( DecType == 1 )
115 uTruthFanNew = ~uTruthFan & s_Truths6[iFaninFaninIndex];
116 else if ( DecType == 2 )
117 uTruthFanNew = uTruthFan & ~s_Truths6[iFaninFaninIndex];
118 else if ( DecType == 3 )
119 uTruthFanNew = ~uTruthFan & ~s_Truths6[iFaninFaninIndex];
120 else if ( DecType == 4 )
121 uTruthFanNew = uTruthFan ^ s_Truths6[iFaninFaninIndex];
124 Vec_WrdWriteEntry( &
p->vObjTruth, iObj, Abc_Tt6RemoveVar(uTruthObjNew, iFaninIndex2) );
125 Vec_WrdWriteEntry( &
p->vObjTruth, iFanin, uTruthFanNew );
127 Acb_ObjRemoveFaninFanoutOne(
p, iObj, iFanin2 );
128 if ( iFaninFaninIndex == Acb_ObjFaninNum(
p, iFanin) )
129 Acb_ObjAddFaninFanoutOne(
p, iFanin, iFanin2 );
143static inline int Acb_ObjFindNodeFanout(
Acb_Ntk_t *
p,
int iObj )
147 if ( !Acb_ObjIsCio(
p, iFanout) )
153 int k, iFanin, * pFanins;
154 word uTruth = Acb_ObjTruth(
p, iObj );
157 if ( Abc_Tt6HasVar(uTruth, k) )
159 Acb_ObjDeleteFaninIndex(
p, iObj, k );
160 Vec_IntRemove( Vec_WecEntry(&
p->vFanouts, iFanin), iObj );
161 Vec_WrdWriteEntry( &
p->vObjTruth, iObj, Abc_Tt6RemoveVar(uTruth, k) );
172 word c00, c11, uTruthNew, uTruth = Acb_ObjTruth(
p, iObj );
173 assert( !Acb_ObjIsCio(
p, iObj) );
174 assert( Acb_ObjFanin(
p, iObj, i) == Acb_ObjFanin(
p, iObj, j) );
175 c00 = Abc_Tt6Cofactor0( Abc_Tt6Cofactor0(uTruth, i), j );
176 c11 = Abc_Tt6Cofactor1( Abc_Tt6Cofactor1(uTruth, i), j );
177 uTruthNew = (~s_Truths6[i] & c00) | (s_Truths6[i] & c11);
178 Vec_WrdWriteEntry( &
p->vObjTruth, iObj, Abc_Tt6RemoveVar(uTruthNew, j) );
179 Acb_ObjDeleteFaninIndex(
p, iObj, j );
180 Vec_IntRemove( Vec_WecEntry(&
p->vFanouts, iObj), Acb_ObjFanin(
p, iObj, j) );
185 int i, k, * pFanins = Acb_ObjFanins(
p, iObj );
186 for ( i = 0; i < pFanins[0]; i++ )
187 for ( k = i+1; k < pFanins[0]; k++ )
189 if ( pFanins[1+i] != pFanins[1+k] )
198 assert( !Acb_ObjIsCio(
p, iObj) );
204 word uTruth = Acb_ObjTruth(
p, iObj );
205 assert( !Acb_ObjIsCio(
p, iObj) );
206 assert( Acb_ObjFaninNum(
p, iObj) == 0 );
207 assert( uTruth == 0 || ~uTruth == 0 );
208 while ( (iFanout = Acb_ObjFindNodeFanout(
p, iObj)) >= 0 )
210 int iObjIndex = Acb_ObjWhatFanin(
p, iFanout, iObj );
211 word uTruthF = Acb_ObjTruth(
p, iFanout );
212 Acb_ObjRemoveFaninFanoutOne(
p, iFanout, iObj );
213 uTruthF = (uTruth & 1) ? Abc_Tt6Cofactor1(uTruthF, iObjIndex) : Abc_Tt6Cofactor0(uTruthF, iObjIndex);
214 Vec_WrdWriteEntry( &
p->vObjTruth, iFanout, Abc_Tt6RemoveVar(uTruthF, iObjIndex) );
217 if ( Acb_ObjFanoutNum(
p, iObj) == 0 )
218 Acb_ObjCleanType(
p, iObj );
223 word uTruth = Acb_ObjTruth(
p, iObj );
224 assert( !Acb_ObjIsCio(
p, iObj) );
225 assert( Acb_ObjFaninNum(
p, iObj) == 1 );
226 assert( uTruth == s_Truths6[0] || ~uTruth == s_Truths6[0] );
227 while ( (iFanout = Acb_ObjFindNodeFanout(
p, iObj)) >= 0 )
229 int iFanin = Acb_ObjFanin(
p, iObj, 0 );
230 int iObjIndex = Acb_ObjWhatFanin(
p, iFanout, iObj );
231 Acb_ObjPatchFanin(
p, iFanout, iObj, iFanin );
234 word uTruthF = Acb_ObjTruth(
p, iFanout );
235 Vec_WrdWriteEntry( &
p->vObjTruth, iFanout, Abc_Tt6Flip(uTruthF, iObjIndex) );
239 while ( (uTruth & 1) == 0 && Acb_ObjFanoutNum(
p, iObj) > 0 )
241 int iFanin = Acb_ObjFanin(
p, iObj, 0 );
242 int iFanout = Acb_ObjFanout(
p, iObj, 0 );
243 assert( Acb_ObjIsCo(
p, iFanout) );
244 Acb_ObjPatchFanin(
p, iFanout, iObj, iFanin );
246 if ( Acb_ObjFanoutNum(
p, iObj) == 0 )
248 Acb_ObjRemoveFaninFanout(
p, iObj );
249 Acb_ObjRemoveFanins(
p, iObj );
250 Acb_ObjCleanType(
p, iObj );
265static inline int Acb_ObjFindFaninPushableIndex(
Acb_Ntk_t *
p,
int iObj,
int iFanIndex )
267 int k, iFanin, * pFanins;
269 if ( k != iFanIndex && Abc_TtCheckDsdAnd(Acb_ObjTruth(
p, iObj), k, iFanIndex, NULL) >= 0 )
273static inline int Acb_ObjFindFanoutPushableIndex(
Acb_Ntk_t *
p,
int iObj )
275 int k, iFanin, * pFanins;
277 if ( Abc_Tt6CheckOutDec(Acb_ObjTruth(
p, iObj), k, NULL) >= 0 )
283 int k, k2, iFanin, * pFanins;
284 if ( Acb_ObjFaninNum(
p, iObj) < 2 )
288 if ( Acb_ObjIsCi(
p, iFanin) )
290 if ( Acb_ObjFanoutNum(
p, iFanin) > 1 )
292 if ( Acb_ObjFaninNum(
p, iFanin) == nLutSize )
294 if ( (k2 = Acb_ObjFindFaninPushableIndex(
p, iObj, k)) == -1 )
300 if ( Acb_ObjFaninNum(
p, iObj) == 2 && Acb_ObjFanoutNum(
p, iObj) == 1 )
302 int iFanout = Acb_ObjFanout(
p, iObj, 0 );
303 if ( !Acb_ObjIsCo(
p, iFanout) && Acb_ObjFaninNum(
p, iFanout) < nLutSize )
305 k2 = Acb_ObjFindFanoutPushableIndex(
p, iObj );
327 int n = 0, iObj, nNodes = Acb_NtkNodeNum(
p), nPushes = 0;
328 Acb_NtkCreateFanout(
p );
333 for ( n = 2; n <= nLutSize; n++ )
338 if ( Acb_ObjFaninNum(
p, iObj) == 1 )
341 printf(
"Saved %d nodes after %d pushes.\n", nNodes - Acb_NtkNodeNum(
p), nPushes );
358 Acb_NtkCreateFanout(
p );
360 if ( !Acb_ObjIsCio(
p, iObj) )
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Acb_ObjRemoveDup(Acb_Ntk_t *p, int iObj, int i, int j)
void Acb_NtkPushLogic2(Acb_Ntk_t *p, int nLutSize, int fVerbose)
ABC_NAMESPACE_IMPL_START void Acb_ObjPushToFanout(Acb_Ntk_t *p, int iObj, int iFaninIndex, int iFanout)
DECLARATIONS ///.
void Acb_ObjRemoveDupFanins(Acb_Ntk_t *p, int iObj)
int Acb_ObjRemoveDupFanins_int(Acb_Ntk_t *p, int iObj)
int Acb_ObjPushToFanins(Acb_Ntk_t *p, int iObj, int nLutSize)
void Acb_ObjRemoveConst(Acb_Ntk_t *p, int iObj)
void Acb_ObjPushToFanin(Acb_Ntk_t *p, int iObj, int iFaninIndex2, int iFanin)
void Acb_ObjRemoveBufInv(Acb_Ntk_t *p, int iObj)
int Acb_ObjSuppMin_int(Acb_Ntk_t *p, int iObj)
void Acb_ObjSuppMin(Acb_Ntk_t *p, int iObj)
void Acb_NtkPushLogic(Acb_Ntk_t *p, int nLutSize, int fVerbose)
struct Acb_Ntk_t_ Acb_Ntk_t
#define Acb_ObjForEachFanout(p, iObj, iFanout, k)
#define Acb_NtkForEachNodeSupp(p, i, nSuppSize)
#define Acb_NtkForEachObj(p, i)
#define Acb_ObjForEachFaninFast(p, iObj, pFanins, iFanin, k)
unsigned __int64 word
DECLARATIONS ///.