49 word uTruth, * pTruth, uTruths6[6] = {
68 int nRealPis = nBoxes ?
Tim_ManPiNum(pManTime) : Gia_ManPiNum(
p);
69 int nRealPos = nBoxes ?
Tim_ManPoNum(pManTime) : Gia_ManPoNum(
p);
70 int i, j, k, curCi, curCo, nBoxIns, nBoxOuts, w,
nWords;
71 int Id, iFan, nMfsVars, nBbIns = 0, nBbOuts = 0, Counter = 0;
73 nLutSizeMax = Abc_MaxInt( nLutSizeMax, 6 );
74 assert( nLutSizeMax < 16 );
80 nMfsVars = Gia_ManCiNum(
p) + 1 +
Gia_ManLutNum(
p) + Gia_ManCoNum(
p) + nBbIns + nBbOuts;
81 vFanins = Vec_WecStart( nMfsVars );
82 vFixed = Vec_StrStart( nMfsVars );
83 vEmpty = Vec_StrStart( nMfsVars );
84 vTruths = Vec_WrdStart( nMfsVars );
85 vStarts = Vec_IntStart( nMfsVars );
86 vTruths2 = Vec_WrdAlloc( 10000 );
88 Gia_ManCleanCopyArray(
p );
90 Gia_ObjSetCopyArray(
p, Id, Counter++ );
92 Vec_StrWriteEntry( vFixed, Counter, (
char)1 );
93 Vec_WrdWriteEntry( vTruths, Counter, (
word)0 );
94 Gia_ObjSetCopyArray(
p, 0, Counter++ );
96 vLeaves = Vec_IntAlloc( nLutSizeMax );
100 Vec_IntClear( vLeaves );
101 vArray = Vec_WecEntry( vFanins, Counter );
102 Vec_IntGrow( vArray, Gia_ObjLutSize(
p, Id) );
105 assert( Gia_ObjCopyArray(
p, iFan) >= 0 );
106 Vec_IntPush( vArray, Gia_ObjCopyArray(
p, iFan) );
107 Vec_IntPush( vLeaves, iFan );
109 assert( Vec_IntSize(vLeaves) < 16 );
110 assert( Vec_IntSize(vLeaves) == Gia_ObjLutSize(
p, Id) );
114 nVars = Abc_TtMinBase( pTruth, Vec_IntArray(vArray), Vec_IntSize(vArray), Vec_IntSize(vLeaves) );
115 Vec_IntShrink( vArray, nVars );
116 Vec_WrdWriteEntry( vTruths, Counter, pTruth[0] );
117 nWords = Abc_Truth6WordNum( nVars );
118 Vec_IntWriteEntry( vStarts, Counter, Vec_WrdSize(vTruths2) );
119 for ( w = 0; w <
nWords; w++ )
120 Vec_WrdPush( vTruths2, pTruth[w] );
121 if ( Gia_ObjLutIsMux(
p, Id) )
123 Vec_StrWriteEntry( vFixed, Counter, (
char)1 );
124 Vec_StrWriteEntry( vEmpty, Counter, (
char)1 );
126 Gia_ObjSetCopyArray(
p, Id, Counter++ );
132 iFan = Gia_ObjFaninId0p(
p, pObj );
133 assert( Gia_ObjCopyArray(
p, iFan) >= 0 );
134 vArray = Vec_WecEntry( vFanins, Counter );
135 Vec_IntFill( vArray, 1, Gia_ObjCopyArray(
p, iFan) );
136 if ( i < Gia_ManCoNum(
p) - nRealPos )
138 Vec_StrWriteEntry( vFixed, Counter, (
char)1 );
139 Vec_StrWriteEntry( vEmpty, Counter, (
char)1 );
140 uTruth = Gia_ObjFaninC0(pObj) ? ~uTruths6[0]: uTruths6[0];
141 Vec_WrdWriteEntry( vTruths, Counter, uTruth );
142 Vec_IntWriteEntry( vStarts, Counter, Vec_WrdSize(vTruths2) );
143 Vec_WrdPush( vTruths2, uTruth );
145 Gia_ObjSetCopyArray(
p, Gia_ObjId(
p, pObj), Counter++ );
149 assert( Counter == nMfsVars );
153 int iBbIn = 0, iBbOut = 0;
154 assert( Gia_ManCiNum(
p->pAigExtra) < 16 );
158 for ( k = 0; k < nBoxes; k++ )
166 Vec_IntClear( vLeaves );
167 for ( i = 0; i < nBoxIns; i++ )
168 Vec_IntPush( vLeaves, Gia_ObjId(
p->pAigExtra, Gia_ManCi(
p->pAigExtra, i)) );
169 for ( j = 0; j < nBoxOuts; j++ )
172 pObj = Gia_ManCi(
p, curCi + j );
173 Counter = Gia_ObjCopyArray(
p, Gia_ObjId(
p, pObj) );
175 vArray = Vec_WecEntry( vFanins, Counter );
176 Vec_IntGrow( vArray, nBoxIns );
177 for ( i = 0; i < nBoxIns; i++ )
179 iFan = Gia_ObjId(
p, Gia_ManCo(
p, curCo + i) );
180 assert( Gia_ObjCopyArray(
p, iFan) >= 0 );
181 Vec_IntPush( vArray, Gia_ObjCopyArray(
p, iFan) );
183 Vec_StrWriteEntry( vFixed, Counter, (
char)1 );
185 pObjExtra = Gia_ManCo(
p->pAigExtra, curCi - nRealPis + j );
188 if ( Gia_ObjFaninId0p(
p->pAigExtra, pObjExtra) == 0 )
191 uTruth = Gia_ObjFaninC0(pObjExtra) ? ~uTruth : uTruth;
194 else if ( Gia_ObjIsCi(Gia_ObjFanin0(pObjExtra)) )
196 uTruth = uTruths6[Gia_ObjCioId(Gia_ObjFanin0(pObjExtra))];
197 uTruth = Gia_ObjFaninC0(pObjExtra) ? ~uTruth : uTruth;
203 if ( Gia_ObjFaninC0(pObjExtra) )
204 Abc_TtNot( pTruth, Abc_Truth6WordNum(Vec_IntSize(vLeaves)) );
209 nVars = Abc_TtMinBase( pTruth, Vec_IntArray(vArray), Vec_IntSize(vArray), Vec_IntSize(vLeaves) );
210 Vec_IntShrink( vArray, nVars );
212 Vec_WrdWriteEntry( vTruths, Counter, pTruth[0] );
215 int w,
nWords = Abc_Truth6WordNum( nVars );
216 Vec_IntWriteEntry( vStarts, Counter, Vec_WrdSize(vTruths2) );
217 for ( w = 0; w <
nWords; w++ )
218 Vec_WrdPush( vTruths2, pTruth[w] );
224 for ( j = 0; j < nBoxOuts; j++ )
227 pObj = Gia_ManCi(
p, curCi + j );
228 Counter = Gia_ObjCopyArray(
p, Gia_ObjId(
p, pObj) );
230 vArray = Vec_WecEntry( vFanins, Counter );
231 assert( Vec_IntSize(vArray) == 0 );
232 Vec_IntFill( vArray, 1, iBbOut++ );
233 Vec_StrWriteEntry( vFixed, Counter, (
char)1 );
234 Vec_StrWriteEntry( vEmpty, Counter, (
char)1 );
235 Vec_WrdWriteEntry( vTruths, Counter, uTruths6[0] );
237 for ( i = 0; i < nBoxIns; i++ )
240 pObj = Gia_ManCo(
p, curCo + i );
241 Counter = Gia_ObjCopyArray(
p, Gia_ObjId(
p, pObj) );
243 vArray = Vec_WecEntry( vFanins, nMfsVars - nBbIns + iBbIn++ );
244 assert( Vec_IntSize(vArray) == 0 );
245 Vec_IntFill( vArray, 1, Counter );
249 for ( i = 0; i < nBoxIns; i++ )
251 pObj = Gia_ManCo(
p, curCo + i );
252 if ( !Gia_ObjIsCi( Gia_ObjFanin0(pObj) ) )
254 Counter = Gia_ObjCopyArray(
p, Gia_ObjFaninId0p(
p, pObj) );
255 Vec_StrWriteEntry( vEmpty, Counter, (
char)1 );
263 assert( curCi == Gia_ManCiNum(
p) );
264 assert( curCo == Gia_ManCoNum(
p) );
265 assert( curCi - nRealPis == Gia_ManCoNum(
p->pAigExtra) );
266 assert( iBbIn == nBbIns );
267 assert( iBbOut == nBbOuts );
270 Vec_IntFree( vLeaves );
271 return Sfm_NtkConstruct( vFanins, nBbOuts + nRealPis, nRealPos + nBbIns, vFixed, vEmpty, vTruths, vStarts, vTruths2 );
291 int nRealPis = nBoxes ?
Tim_ManPiNum(pManTime) : Gia_ManPiNum(
p);
292 int nRealPos = nBoxes ?
Tim_ManPoNum(pManTime) : Gia_ManPoNum(
p);
293 int i, k, Id, curCi, curCo, nBoxIns, nBoxOuts, iLitNew, iMfsId, iGroup, Fanin;
296 Vec_Wec_t * vGroups = Vec_WecStart( nBoxes );
299 Vec_Int_t * vMfsTopo, * vCover, * vBoxesLeft;
302 int nBbIns = 0, nBbOuts = 0;
304 nMfsNodes = 1 + Gia_ManCiNum(
p) +
Gia_ManLutNum(
p) + Gia_ManCoNum(
p) + nBbIns + nBbOuts;
305 vMfs2Gia = Vec_IntStartFull( nMfsNodes );
306 vMfs2Old = Vec_IntStartFull( nMfsNodes );
307 vGroupMap = Vec_IntStartFull( nMfsNodes );
309 if ( Gia_ObjCopyArray(
p, i) > 0 )
310 Vec_IntWriteEntry( vMfs2Old, Gia_ObjCopyArray(
p, i), i );
314 for ( i = 0; i < nBoxes; i++ )
318 vArray = Vec_WecEntry( vGroups, i );
319 for ( k = 0; k < nBoxIns; k++ )
321 pObj = Gia_ManCo(
p, curCo + k );
322 iMfsId = Gia_ObjCopyArray(
p, Gia_ObjId(
p, pObj) );
324 Vec_IntPush( vArray, iMfsId );
325 Vec_IntWriteEntry( vGroupMap, iMfsId, Abc_Var2Lit(i,0) );
327 for ( k = 0; k < nBoxOuts; k++ )
329 pObj = Gia_ManCi(
p, curCi + k );
330 iMfsId = Gia_ObjCopyArray(
p, Gia_ObjId(
p, pObj) );
332 Vec_IntPush( vArray, iMfsId );
333 Vec_IntWriteEntry( vGroupMap, iMfsId, Abc_Var2Lit(i,1) );
339 assert( curCi == Gia_ManCiNum(
p) );
340 assert( curCo == Gia_ManCoNum(
p) );
343 vBoxesLeft = Vec_IntAlloc( nBoxes );
344 vMfsTopo =
Sfm_NtkDfs( pNtk, vGroups, vGroupMap, vBoxesLeft, fAllBoxes );
345 assert( Vec_IntSize(vBoxesLeft) <= nBoxes );
346 assert( Vec_IntSize(vMfsTopo) > 0 );
350 pNew->
pName = Abc_UtilStrsav(
p->pName );
351 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
354 vMapping = Vec_IntStart( Gia_ManObjNum(
p) );
355 vMapping2 = Vec_IntStart( 1 );
357 Vec_IntWriteEntry( vMapping, 0, Vec_IntSize(vMapping2) );
358 Vec_IntPush( vMapping2, 0 );
359 Vec_IntPush( vMapping2, 0 );
362 Vec_IntWriteEntry( vMfs2Gia, Gia_ObjCopyArray(
p, 0), 0 );
366 Vec_IntWriteEntry( vMfs2Gia, Gia_ObjCopyArray(
p, Id), Gia_ManAppendCi(pNew) );
368 vLeaves = Vec_IntAlloc( 6 );
369 vCover = Vec_IntAlloc( 1 << 16 );
373 iGroup = Vec_IntEntry( vGroupMap, iMfsId );
375 if ( Vec_IntSize(vArray) == 1 && Vec_IntEntry(vArray,0) < nBbOuts )
378 assert( Abc_LitIsCompl(iGroup) );
379 iLitNew = Gia_ManAppendCi( pNew );
380 Vec_IntWriteEntry( vMfs2Gia, iMfsId, iLitNew );
383 Vec_IntClear( vLeaves );
386 iLitNew = Vec_IntEntry( vMfs2Gia, Fanin );
assert( iLitNew >= 0 );
387 Vec_IntPush( vLeaves, iLitNew );
392 if ( Gia_ObjLutIsMux(
p, Vec_IntEntry(vMfs2Old, iMfsId)) )
394 int MapSize = Vec_IntSize(vMapping2);
396 Abc_TtSimplify( pTruth, Vec_IntArray(vLeaves), Vec_IntSize(vLeaves), &nVarsNew );
397 Vec_IntShrink( vLeaves, nVarsNew );
398 Abc_TtFlipVar5( pTruth, Vec_IntSize(vLeaves) );
400 Abc_TtFlipVar5( pTruth, Vec_IntSize(vLeaves) );
401 if ( MapSize < Vec_IntSize(vMapping2) )
403 assert( Vec_IntEntryLast(vMapping2) == Abc_Lit2Var(iLitNew) );
404 Vec_IntWriteEntry(vMapping2, Vec_IntSize(vMapping2)-1, -Abc_Lit2Var(iLitNew) );
409 Abc_TtFlipVar5( pTruth, Vec_IntSize(vLeaves) );
411 Abc_TtFlipVar5( pTruth, Vec_IntSize(vLeaves) );
414 else if ( Abc_LitIsCompl(iGroup) )
417 iLitNew = Gia_ManAppendCi( pNew );
421 assert( pTruth[0] == uTruthVar || pTruth[0] == ~uTruthVar );
422 iLitNew = Gia_ManAppendCo( pNew, Abc_LitNotCond(Vec_IntEntry(vLeaves, 0), pTruth[0] == ~uTruthVar) );
425 Vec_IntWriteEntry( vMfs2Gia, iMfsId, iLitNew );
427 Vec_IntFree( vCover );
428 Vec_IntFree( vLeaves );
433 if ( i < Gia_ManCoNum(
p) - nRealPos )
435 iMfsId = Gia_ObjCopyArray(
p, Gia_ObjId(
p, pObj) );
436 iGroup = Vec_IntEntry( vGroupMap, iMfsId );
437 if ( Vec_IntFind(vMfsTopo, iGroup) >= 0 )
439 iLitNew = Vec_IntEntry( vMfs2Gia, iMfsId );
446 iLitNew = Vec_IntEntry( vMfs2Gia, Gia_ObjCopyArray(
p, Gia_ObjFaninId0p(
p, pObj)) );
448 Gia_ManAppendCo( pNew, Abc_LitNotCond(iLitNew, Gia_ObjFaninC0(pObj)) );
452 if ( Vec_IntSize(vMapping) > Gia_ManObjNum(pNew) )
453 Vec_IntShrink( vMapping, Gia_ManObjNum(pNew) );
455 Vec_IntFillExtra( vMapping, Gia_ManObjNum(pNew), 0 );
456 assert( Vec_IntSize(vMapping) == Gia_ManObjNum(pNew) );
459 Vec_IntAddToEntry( vMapping, i, Gia_ManObjNum(pNew) );
460 Vec_IntAppend( vMapping, vMapping2 );
461 Vec_IntFree( vMapping2 );
472 if (
p->vRegClasses )
480 Vec_WecFree( vGroups );
481 Vec_IntFree( vMfsTopo );
482 Vec_IntFree( vGroupMap );
483 Vec_IntFree( vMfs2Gia );
484 Vec_IntFree( vMfs2Old );
485 Vec_IntFree( vBoxesLeft );