79 Vec_Int_t * vOrder = Vec_IntAlloc( Vec_IntSize(vXorRoots) );
80 Vec_Int_t * vMove = Vec_IntStartFull( Vec_IntSize(vXorRoots) );
81 int i, k, Entry, This;
83 for ( i = 0; 6*i < Vec_IntSize(vAdds); i++ )
85 int Node = Vec_IntEntry(vAdds, 6*i+4);
86 if ( Vec_IntEntry(vRanks, Node) == -1 )
88 for ( k = 0; k < 3; k++ )
90 int Fanin = Vec_IntEntry(vAdds, 6*i+k);
91 if ( Vec_IntEntry(vRanks, Fanin) == -1 )
94 Vec_IntWriteEntry( vMove, Vec_IntEntry(vRanks, Node), Vec_IntEntry(vRanks, Fanin) );
100 if ( Entry == -1 && Vec_IntFind(vMove, i) >= 0 )
102 assert( i < Vec_IntSize(vMove) );
105 Vec_IntPush( vOrder, Vec_IntEntry(vXorRoots, i) );
110 if ( i == Vec_IntSize(vMove) )
113 Vec_IntFree( vMove );
189 Vec_Int_t * vDoubles = Vec_IntAlloc( 100 );
192 Vec_Int_t * vRanks = Vec_IntStartFull( Gia_ManObjNum(
p) );
194 Vec_IntWriteEntry( vRanks, Entry, i );
196 for ( i = Vec_IntSize(vXors)/4 - 1; i >= 0; i-- )
198 int Root = Vec_IntEntry( vXors, 4*i );
199 int Rank = Vec_IntEntry( vRanks, Root );
204 for ( k = 1; k < 4; k++ )
206 int Node = Vec_IntEntry( vXors, 4*i+k );
209 Entry = Vec_IntEntry( vRanks, Node );
213 Vec_IntWriteEntry( vRanks, Node, Rank );
215 Vec_IntPush( vDoubles, Node );
217 if ( Entry != -1 && Gia_ObjIsAnd(Gia_ManObj(
p, Node)))
218 printf(
"Xor node %d belongs to Tree %d and Tree %d.\n", Node, Entry, Rank );
223 Vec_IntWriteEntry( vRanks, Entry, -1 );
224 Vec_IntFree( vDoubles );
232 Vec_Wec_t * vXorLeaves = Vec_WecStart( Vec_IntSize(vXorRoots) );
233 Vec_Wec_t * vAddBoxes = Vec_WecStart( Vec_IntSize(vXorRoots) );
235 for ( i = 0; 4*i < Vec_IntSize(vXors); i++ )
237 int Xor = Vec_IntEntry(vXors, 4*i);
238 int Rank = Vec_IntEntry(vRanks, Xor);
241 for ( k = 1; k < 4; k++ )
243 int Fanin = Vec_IntEntry(vXors, 4*i+k);
247 if ( Vec_BitEntry(vMapXors, Fanin) )
249 assert( Rank == Vec_IntEntry(vRanks, Fanin) );
254 if ( Vec_IntEntry(vMapMajs, Fanin) == -1 )
255 Vec_WecPush( vXorLeaves, Rank, Fanin );
256 else if ( Vec_IntEntry(vRanks, Xor) > 0 )
257 Vec_WecPush( vAddBoxes, Rank-1, Vec_IntEntry(vMapMajs, Fanin) );
260 Vec_BitFree( vMapXors );
261 Vec_IntFree( vMapMajs );
263 *pvAddBoxes = vAddBoxes;
293 int MaxRank = Vec_WecSize( vAddBoxes );
294 Vec_Bit_t * vVisit = Vec_BitStart( Vec_IntSize(vAdds)/6 );
295 Vec_Bit_t * vIsLeaf = Vec_BitStart( Gia_ManObjNum(
p) );
296 Vec_Bit_t * vIsRoot = Vec_BitStart( Gia_ManObjNum(
p) );
298 int i, j, k, Box, Node;
302 pBox->vAdds = vAddBoxes;
303 pBox->vLeafLits = Vec_WecStart( MaxRank + 0 );
304 pBox->vRootLits = Vec_WecStart( MaxRank + 0 );
306 assert( Vec_WecSize(vAddBoxes) == Vec_WecSize(vXorLeaves) );
307 assert( Vec_WecSize(vAddBoxes) == Vec_IntSize(vXorRoots) );
313 Vec_BitWriteEntry( vIsLeaf, Vec_IntEntry(vAdds, 6*Box+0), 1 );
314 Vec_BitWriteEntry( vIsLeaf, Vec_IntEntry(vAdds, 6*Box+1), 1 );
315 Vec_BitWriteEntry( vIsLeaf, Vec_IntEntry(vAdds, 6*Box+2), 1 );
316 Vec_BitWriteEntry( vIsRoot, Vec_IntEntry(vAdds, 6*Box+3), 1 );
317 Vec_BitWriteEntry( vIsRoot, Vec_IntEntry(vAdds, 6*Box+4), 1 );
321 Vec_IntSort( vLevel, 0 );
327 if ( !Vec_BitEntry( vIsLeaf, Vec_IntEntry(vAdds, 6*Box+4) ) )
330 Acec_TreePhases_rec(
p, vAdds, vMap, Vec_IntEntry(vAdds, 6*Box+4), Vec_IntEntry(vAdds, 6*Box+2) != 0, vVisit );
334 Vec_BitFree( vVisit );
338 Vec_BitWriteEntry( vIsRoot, 0, 1 );
342 for ( k = 0; k < 3; k++ )
343 if ( !Vec_BitEntry( vIsRoot, Vec_IntEntry(vAdds, 6*Box+k) ) )
344 Vec_WecPush( pBox->vLeafLits, i, Abc_Var2Lit(Vec_IntEntry(vAdds, 6*Box+k), Acec_SignBit2(vAdds, Box, k)) );
345 for ( k = 3; k < 5; k++ )
346 if ( !Vec_BitEntry( vIsLeaf, Vec_IntEntry(vAdds, 6*Box+k) ) )
347 Vec_WecPush( pBox->vRootLits, k == 4 ? i + 1 : i, Abc_Var2Lit(Vec_IntEntry(vAdds, 6*Box+k), Acec_SignBit2(vAdds, Box, k)) );
348 if ( Vec_IntEntry(vAdds, 6*Box+2) == 0 && Acec_SignBit2(vAdds, Box, 2) )
349 Vec_WecPush( pBox->vLeafLits, i, 1 );
351 Vec_BitFree( vIsLeaf );
352 Vec_BitFree( vIsRoot );
355 vLevel = Vec_WecEntry( pBox->vLeafLits, Vec_WecSize(pBox->vLeafLits)-1 );
356 vLevel2 = Vec_WecEntry( vXorLeaves, Vec_WecSize(vXorLeaves)-1 );
357 if ( Vec_IntSize(vLevel) == 0 && Vec_IntSize(vLevel2) > 0 )
360 Vec_IntPush( vLevel, Abc_Var2Lit(Node, 0) );
362 vLevel = Vec_WecEntry( pBox->vRootLits, Vec_WecSize(pBox->vRootLits)-1 );
363 Vec_IntFill( vLevel, 1, Abc_Var2Lit(Vec_IntEntryLast(vXorRoots), 0) );
367 Vec_IntSort( vLevel, 0 );
369 Vec_IntSort( vLevel, 1 );
384 Vec_Wec_t * vXorLeaves, * vAddBoxes = NULL;
392 printf(
"Detected %d full-adders and %d half-adders. Found %d XOR-cuts. ",
Ree_ManCountFadds(vAdds), Vec_IntSize(vAdds)/6-
Ree_ManCountFadds(vAdds), Vec_IntSize(vXors)/4 );
394 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
397 Vec_IntFree( vTemp );
398 Vec_IntFree( vRanks );
402 Vec_IntFree( vRanks );
413 pBox =
Acec_FindBox(
p, vAdds, vAddBoxes, vXorLeaves, vXorRoots );
419 Vec_IntFree( vXorRoots );
420 Vec_WecFree( vXorLeaves );
422 Vec_IntFree( vXors );
423 Vec_IntFree( vAdds );