ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
giaCut.c
Go to the documentation of this file.
1
20
21#include "gia.h"
22#include "misc/util/utilTruth.h"
23#include "misc/vec/vecHsh.h"
24
26
27
31
32#define GIA_MAX_CUTSIZE 8
33#define GIA_MAX_CUTNUM 257
34#define GIA_MAX_TT_WORDS ((GIA_MAX_CUTSIZE > 6) ? 1 << (GIA_MAX_CUTSIZE-6) : 1)
35
36#define GIA_CUT_NO_LEAF 0xF
37
38typedef struct Gia_Cut_t_ Gia_Cut_t;
40{
41 word Sign; // signature
42 int iFunc; // functionality
43 int Cost; // cut cost
44 int CostLev; // cut cost
45 unsigned nTreeLeaves : 28; // tree leaves
46 unsigned nLeaves : 4; // leaf count
47 int pLeaves[GIA_MAX_CUTSIZE]; // leaves
48 float CostF;
49};
50
51typedef struct Gia_Sto_t_ Gia_Sto_t;
53{
59 Gia_Man_t * pGia; // user's AIG manager (will be modified by adding nodes)
60 Vec_Int_t * vRefs; // refs for each node
61 Vec_Wec_t * vCuts; // cuts for each node
62 Vec_Mem_t * vTtMem; // truth tables
63 Gia_Cut_t pCuts[3][GIA_MAX_CUTNUM]; // temporary cuts
64 Gia_Cut_t * ppCuts[GIA_MAX_CUTNUM]; // temporary cut pointers
65 int nCutsR; // the number of cuts
66 int Pivot; // current object
67 int iCutBest; // best-delay cut
68 int nCutsOver; // overflow cuts
69 double CutCount[4]; // cut counters
70 abctime clkStart; // starting time
71};
72
73static inline word * Gia_CutTruth( Gia_Sto_t * p, Gia_Cut_t * pCut ) { return Vec_MemReadEntry(p->vTtMem, Abc_Lit2Var(pCut->iFunc)); }
74
75#define Sdb_ForEachCut( pList, pCut, i ) for ( i = 0, pCut = pList + 1; i < pList[0]; i++, pCut += pCut[0] + 2 )
76
80
92static inline word Gia_CutGetSign( Gia_Cut_t * pCut )
93{
94 word Sign = 0; int i;
95 for ( i = 0; i < (int)pCut->nLeaves; i++ )
96 Sign |= ((word)1) << (pCut->pLeaves[i] & 0x3F);
97 return Sign;
98}
99static inline int Gia_CutCheck( Gia_Cut_t * pBase, Gia_Cut_t * pCut ) // check if pCut is contained in pBase
100{
101 int nSizeB = pBase->nLeaves;
102 int nSizeC = pCut->nLeaves;
103 int i, * pB = pBase->pLeaves;
104 int k, * pC = pCut->pLeaves;
105 for ( i = 0; i < nSizeC; i++ )
106 {
107 for ( k = 0; k < nSizeB; k++ )
108 if ( pC[i] == pB[k] )
109 break;
110 if ( k == nSizeB )
111 return 0;
112 }
113 return 1;
114}
115static inline int Gia_CutSetCheckArray( Gia_Cut_t ** ppCuts, int nCuts )
116{
117 Gia_Cut_t * pCut0, * pCut1;
118 int i, k, m, n, Value;
119 assert( nCuts > 0 );
120 for ( i = 0; i < nCuts; i++ )
121 {
122 pCut0 = ppCuts[i];
123 assert( pCut0->nLeaves <= GIA_MAX_CUTSIZE );
124 assert( pCut0->Sign == Gia_CutGetSign(pCut0) );
125 // check duplicates
126 for ( m = 0; m < (int)pCut0->nLeaves; m++ )
127 for ( n = m + 1; n < (int)pCut0->nLeaves; n++ )
128 assert( pCut0->pLeaves[m] < pCut0->pLeaves[n] );
129 // check pairs
130 for ( k = 0; k < nCuts; k++ )
131 {
132 pCut1 = ppCuts[k];
133 if ( pCut0 == pCut1 )
134 continue;
135 // check containments
136 Value = Gia_CutCheck( pCut0, pCut1 );
137 assert( Value == 0 );
138 }
139 }
140 return 1;
141}
142
143
155static inline int Gia_CutMergeOrder( Gia_Cut_t * pCut0, Gia_Cut_t * pCut1, Gia_Cut_t * pCut, int nCutSize )
156{
157 int nSize0 = pCut0->nLeaves;
158 int nSize1 = pCut1->nLeaves;
159 int i, * pC0 = pCut0->pLeaves;
160 int k, * pC1 = pCut1->pLeaves;
161 int c, * pC = pCut->pLeaves;
162 // the case of the largest cut sizes
163 if ( nSize0 == nCutSize && nSize1 == nCutSize )
164 {
165 for ( i = 0; i < nSize0; i++ )
166 {
167 if ( pC0[i] != pC1[i] ) return 0;
168 pC[i] = pC0[i];
169 }
170 pCut->nLeaves = nCutSize;
171 pCut->iFunc = -1;
172 pCut->Sign = pCut0->Sign | pCut1->Sign;
173 return 1;
174 }
175 // compare two cuts with different numbers
176 i = k = c = 0;
177 if ( nSize0 == 0 ) goto FlushCut1;
178 if ( nSize1 == 0 ) goto FlushCut0;
179 while ( 1 )
180 {
181 if ( c == nCutSize ) return 0;
182 if ( pC0[i] < pC1[k] )
183 {
184 pC[c++] = pC0[i++];
185 if ( i >= nSize0 ) goto FlushCut1;
186 }
187 else if ( pC0[i] > pC1[k] )
188 {
189 pC[c++] = pC1[k++];
190 if ( k >= nSize1 ) goto FlushCut0;
191 }
192 else
193 {
194 pC[c++] = pC0[i++]; k++;
195 if ( i >= nSize0 ) goto FlushCut1;
196 if ( k >= nSize1 ) goto FlushCut0;
197 }
198 }
199
200FlushCut0:
201 if ( c + nSize0 > nCutSize + i ) return 0;
202 while ( i < nSize0 )
203 pC[c++] = pC0[i++];
204 pCut->nLeaves = c;
205 pCut->iFunc = -1;
206 pCut->Sign = pCut0->Sign | pCut1->Sign;
207 return 1;
208
209FlushCut1:
210 if ( c + nSize1 > nCutSize + k ) return 0;
211 while ( k < nSize1 )
212 pC[c++] = pC1[k++];
213 pCut->nLeaves = c;
214 pCut->iFunc = -1;
215 pCut->Sign = pCut0->Sign | pCut1->Sign;
216 return 1;
217}
218static inline int Gia_CutMergeOrder2( Gia_Cut_t * pCut0, Gia_Cut_t * pCut1, Gia_Cut_t * pCut, int nCutSize )
219{
220 int x0, i0 = 0, nSize0 = pCut0->nLeaves, * pC0 = pCut0->pLeaves;
221 int x1, i1 = 0, nSize1 = pCut1->nLeaves, * pC1 = pCut1->pLeaves;
222 int xMin, c = 0, * pC = pCut->pLeaves;
223 while ( 1 )
224 {
225 x0 = (i0 == nSize0) ? ABC_INFINITY : pC0[i0];
226 x1 = (i1 == nSize1) ? ABC_INFINITY : pC1[i1];
227 xMin = Abc_MinInt(x0, x1);
228 if ( xMin == ABC_INFINITY ) break;
229 if ( c == nCutSize ) return 0;
230 pC[c++] = xMin;
231 if (x0 == xMin) i0++;
232 if (x1 == xMin) i1++;
233 }
234 pCut->nLeaves = c;
235 pCut->iFunc = -1;
236 pCut->Sign = pCut0->Sign | pCut1->Sign;
237 return 1;
238}
239static inline int Gia_CutSetCutIsContainedOrder( Gia_Cut_t * pBase, Gia_Cut_t * pCut ) // check if pCut is contained in pBase
240{
241 int i, nSizeB = pBase->nLeaves;
242 int k, nSizeC = pCut->nLeaves;
243 if ( nSizeB == nSizeC )
244 {
245 for ( i = 0; i < nSizeB; i++ )
246 if ( pBase->pLeaves[i] != pCut->pLeaves[i] )
247 return 0;
248 return 1;
249 }
250 assert( nSizeB > nSizeC );
251 if ( nSizeC == 0 )
252 return 1;
253 for ( i = k = 0; i < nSizeB; i++ )
254 {
255 if ( pBase->pLeaves[i] > pCut->pLeaves[k] )
256 return 0;
257 if ( pBase->pLeaves[i] == pCut->pLeaves[k] )
258 {
259 if ( ++k == nSizeC )
260 return 1;
261 }
262 }
263 return 0;
264}
265static inline int Gia_CutSetLastCutIsContained( Gia_Cut_t ** pCuts, int nCuts )
266{
267 int i;
268 for ( i = 0; i < nCuts; i++ )
269 if ( pCuts[i]->nLeaves <= pCuts[nCuts]->nLeaves && (pCuts[i]->Sign & pCuts[nCuts]->Sign) == pCuts[i]->Sign && Gia_CutSetCutIsContainedOrder(pCuts[nCuts], pCuts[i]) )
270 return 1;
271 return 0;
272}
273
285static inline int Gia_CutCompare2( Gia_Cut_t * pCut0, Gia_Cut_t * pCut1 )
286{
287 if ( pCut0->nTreeLeaves < pCut1->nTreeLeaves ) return -1;
288 if ( pCut0->nTreeLeaves > pCut1->nTreeLeaves ) return 1;
289 if ( pCut0->nLeaves < pCut1->nLeaves ) return -1;
290 if ( pCut0->nLeaves > pCut1->nLeaves ) return 1;
291 return 0;
292}
293static inline int Gia_CutCompare( Gia_Cut_t * pCut0, Gia_Cut_t * pCut1 )
294{
295 if ( pCut0->CostF > pCut1->CostF ) return -1;
296 if ( pCut0->CostF < pCut1->CostF ) return 1;
297 if ( pCut0->nLeaves < pCut1->nLeaves ) return -1;
298 if ( pCut0->nLeaves > pCut1->nLeaves ) return 1;
299 return 0;
300}
301static inline int Gia_CutSetLastCutContains( Gia_Cut_t ** pCuts, int nCuts )
302{
303 int i, k, fChanges = 0;
304 for ( i = 0; i < nCuts; i++ )
305 if ( pCuts[nCuts]->nLeaves < pCuts[i]->nLeaves && (pCuts[nCuts]->Sign & pCuts[i]->Sign) == pCuts[nCuts]->Sign && Gia_CutSetCutIsContainedOrder(pCuts[i], pCuts[nCuts]) )
306 pCuts[i]->nLeaves = GIA_CUT_NO_LEAF, fChanges = 1;
307 if ( !fChanges )
308 return nCuts;
309 for ( i = k = 0; i <= nCuts; i++ )
310 {
311 if ( pCuts[i]->nLeaves == GIA_CUT_NO_LEAF )
312 continue;
313 if ( k < i )
314 ABC_SWAP( Gia_Cut_t *, pCuts[k], pCuts[i] );
315 k++;
316 }
317 return k - 1;
318}
319static inline void Gia_CutSetSortByCost( Gia_Cut_t ** pCuts, int nCuts )
320{
321 int i;
322 for ( i = nCuts; i > 0; i-- )
323 {
324 if ( Gia_CutCompare(pCuts[i - 1], pCuts[i]) < 0 )
325 return;
326 ABC_SWAP( Gia_Cut_t *, pCuts[i - 1], pCuts[i] );
327 }
328}
329static inline int Gia_CutSetAddCut( Gia_Cut_t ** pCuts, int nCuts, int nCutNum )
330{
331 if ( nCuts == 0 )
332 return 1;
333 nCuts = Gia_CutSetLastCutContains(pCuts, nCuts);
334 assert( nCuts >= 0 );
335 Gia_CutSetSortByCost( pCuts, nCuts );
336 // add new cut if there is room
337 return Abc_MinInt( nCuts + 1, nCutNum - 1 );
338}
339
351static inline int Gia_CutComputeTruth6( Gia_Sto_t * p, Gia_Cut_t * pCut0, Gia_Cut_t * pCut1, int fCompl0, int fCompl1, Gia_Cut_t * pCutR, int fIsXor )
352{
353 int nOldSupp = pCutR->nLeaves, truthId, fCompl; word t;
354 word t0 = *Gia_CutTruth(p, pCut0);
355 word t1 = *Gia_CutTruth(p, pCut1);
356 if ( Abc_LitIsCompl(pCut0->iFunc) ^ fCompl0 ) t0 = ~t0;
357 if ( Abc_LitIsCompl(pCut1->iFunc) ^ fCompl1 ) t1 = ~t1;
358 t0 = Abc_Tt6Expand( t0, pCut0->pLeaves, pCut0->nLeaves, pCutR->pLeaves, pCutR->nLeaves );
359 t1 = Abc_Tt6Expand( t1, pCut1->pLeaves, pCut1->nLeaves, pCutR->pLeaves, pCutR->nLeaves );
360 t = fIsXor ? t0 ^ t1 : t0 & t1;
361 if ( (fCompl = (int)(t & 1)) ) t = ~t;
362 if ( p->fTruthMin )
363 pCutR->nLeaves = Abc_Tt6MinBase( &t, pCutR->pLeaves, pCutR->nLeaves );
364 assert( (int)(t & 1) == 0 );
365 truthId = Vec_MemHashInsert(p->vTtMem, &t);
366 pCutR->iFunc = Abc_Var2Lit( truthId, fCompl );
367 assert( (int)pCutR->nLeaves <= nOldSupp );
368 return (int)pCutR->nLeaves < nOldSupp;
369}
370static inline int Gia_CutComputeTruth( Gia_Sto_t * p, Gia_Cut_t * pCut0, Gia_Cut_t * pCut1, int fCompl0, int fCompl1, Gia_Cut_t * pCutR, int fIsXor )
371{
372 if ( p->nCutSize <= 6 )
373 return Gia_CutComputeTruth6( p, pCut0, pCut1, fCompl0, fCompl1, pCutR, fIsXor );
374 {
375 word uTruth[GIA_MAX_TT_WORDS], uTruth0[GIA_MAX_TT_WORDS], uTruth1[GIA_MAX_TT_WORDS];
376 int nOldSupp = pCutR->nLeaves, truthId;
377 int nCutSize = p->nCutSize, fCompl;
378 int nWords = Abc_Truth6WordNum(nCutSize);
379 word * pTruth0 = Gia_CutTruth(p, pCut0);
380 word * pTruth1 = Gia_CutTruth(p, pCut1);
381 Abc_TtCopy( uTruth0, pTruth0, nWords, Abc_LitIsCompl(pCut0->iFunc) ^ fCompl0 );
382 Abc_TtCopy( uTruth1, pTruth1, nWords, Abc_LitIsCompl(pCut1->iFunc) ^ fCompl1 );
383 Abc_TtExpand( uTruth0, nCutSize, pCut0->pLeaves, pCut0->nLeaves, pCutR->pLeaves, pCutR->nLeaves );
384 Abc_TtExpand( uTruth1, nCutSize, pCut1->pLeaves, pCut1->nLeaves, pCutR->pLeaves, pCutR->nLeaves );
385 if ( fIsXor )
386 Abc_TtXor( uTruth, uTruth0, uTruth1, nWords, (fCompl = (int)((uTruth0[0] ^ uTruth1[0]) & 1)) );
387 else
388 Abc_TtAnd( uTruth, uTruth0, uTruth1, nWords, (fCompl = (int)((uTruth0[0] & uTruth1[0]) & 1)) );
389 if ( p->fTruthMin )
390 pCutR->nLeaves = Abc_TtMinBase( uTruth, pCutR->pLeaves, pCutR->nLeaves, nCutSize );
391 assert( (uTruth[0] & 1) == 0 );
392//Kit_DsdPrintFromTruth( uTruth, pCutR->nLeaves ), printf("\n" ), printf("\n" );
393 truthId = Vec_MemHashInsert(p->vTtMem, uTruth);
394 pCutR->iFunc = Abc_Var2Lit( truthId, fCompl );
395 assert( (int)pCutR->nLeaves <= nOldSupp );
396 return (int)pCutR->nLeaves < nOldSupp;
397 }
398}
399
411static inline int Gia_CutCountBits( word i )
412{
413 i = i - ((i >> 1) & 0x5555555555555555);
414 i = (i & 0x3333333333333333) + ((i >> 2) & 0x3333333333333333);
415 i = ((i + (i >> 4)) & 0x0F0F0F0F0F0F0F0F);
416 return (i*(0x0101010101010101))>>56;
417}
418static inline void Gia_CutAddUnit( Gia_Sto_t * p, int iObj )
419{
420 Vec_Int_t * vThis = Vec_WecEntry( p->vCuts, iObj );
421 if ( Vec_IntSize(vThis) == 0 )
422 Vec_IntPush( vThis, 1 );
423 else
424 Vec_IntAddToEntry( vThis, 0, 1 );
425 Vec_IntPush( vThis, 1 );
426 Vec_IntPush( vThis, iObj );
427 Vec_IntPush( vThis, 2 );
428}
429static inline void Gia_CutAddZero( Gia_Sto_t * p, int iObj )
430{
431 Vec_Int_t * vThis = Vec_WecEntry( p->vCuts, iObj );
432 assert( Vec_IntSize(vThis) == 0 );
433 Vec_IntPush( vThis, 1 );
434 Vec_IntPush( vThis, 0 );
435 Vec_IntPush( vThis, 0 );
436}
437static inline int Gia_CutTreeLeaves( Gia_Sto_t * p, Gia_Cut_t * pCut )
438{
439 int i, Cost = 0;
440 for ( i = 0; i < (int)pCut->nLeaves; i++ )
441 Cost += Vec_IntEntry( p->vRefs, pCut->pLeaves[i] ) == 1;
442 return Cost;
443}
444static inline float Gia_CutGetCost( Gia_Sto_t * p, Gia_Cut_t * pCut )
445{
446 int i, Cost = 0;
447 for ( i = 0; i < (int)pCut->nLeaves; i++ )
448 Cost += Vec_IntEntry( p->vRefs, pCut->pLeaves[i] );
449 return (float)Cost / Abc_MaxInt(1, pCut->nLeaves);
450}
451static inline int Gia_StoPrepareSet( Gia_Sto_t * p, int iObj, int Index )
452{
453 Vec_Int_t * vThis = Vec_WecEntry( p->vCuts, iObj );
454 int i, v, * pCut, * pList = Vec_IntArray( vThis );
455 Sdb_ForEachCut( pList, pCut, i )
456 {
457 Gia_Cut_t * pCutTemp = &p->pCuts[Index][i];
458 pCutTemp->nLeaves = pCut[0];
459 for ( v = 1; v <= pCut[0]; v++ )
460 pCutTemp->pLeaves[v-1] = pCut[v];
461 pCutTemp->iFunc = pCut[pCut[0]+1];
462 pCutTemp->Sign = Gia_CutGetSign( pCutTemp );
463 pCutTemp->nTreeLeaves = Gia_CutTreeLeaves( p, pCutTemp );
464 pCutTemp->CostF = Gia_CutGetCost( p, pCutTemp );
465 }
466 return pList[0];
467}
468static inline void Gia_StoInitResult( Gia_Sto_t * p )
469{
470 int i;
471 for ( i = 0; i < GIA_MAX_CUTNUM; i++ )
472 p->ppCuts[i] = &p->pCuts[2][i];
473}
474static inline void Gia_StoStoreResult( Gia_Sto_t * p, int iObj, Gia_Cut_t ** pCuts, int nCuts )
475{
476 int i, v;
477 Vec_Int_t * vList = Vec_WecEntry( p->vCuts, iObj );
478 Vec_IntPush( vList, nCuts );
479 for ( i = 0; i < nCuts; i++ )
480 {
481 Vec_IntPush( vList, pCuts[i]->nLeaves );
482 for ( v = 0; v < (int)pCuts[i]->nLeaves; v++ )
483 Vec_IntPush( vList, pCuts[i]->pLeaves[v] );
484 Vec_IntPush( vList, pCuts[i]->iFunc );
485 }
486}
487static inline void Gia_CutPrint( Gia_Sto_t * p, int iObj, Gia_Cut_t * pCut )
488{
489 int i, nDigits = Abc_Base10Log(Gia_ManObjNum(p->pGia));
490 if ( pCut == NULL ) { printf( "No cut.\n" ); return; }
491 printf( "%d {", pCut->nLeaves );
492 for ( i = 0; i < (int)pCut->nLeaves; i++ )
493 printf( " %*d", nDigits, pCut->pLeaves[i] );
494 for ( ; i < (int)p->nCutSize; i++ )
495 printf( " %*s", nDigits, " " );
496 printf( " } Cost = %3d CostL = %3d Tree = %d ",
497 pCut->Cost, pCut->CostLev, pCut->nTreeLeaves );
498 printf( "\n" );
499}
500void Gia_StoMergeCuts( Gia_Sto_t * p, int iObj )
501{
502 Gia_Obj_t * pObj = Gia_ManObj(p->pGia, iObj);
503 int fIsXor = Gia_ObjIsXor(pObj);
504 int nCutSize = p->nCutSize;
505 int nCutNum = p->nCutNum;
506 int fComp0 = Gia_ObjFaninC0(pObj);
507 int fComp1 = Gia_ObjFaninC1(pObj);
508 int Fan0 = Gia_ObjFaninId0(pObj, iObj);
509 int Fan1 = Gia_ObjFaninId1(pObj, iObj);
510 int nCuts0 = Gia_StoPrepareSet( p, Fan0, 0 );
511 int nCuts1 = Gia_StoPrepareSet( p, Fan1, 1 );
512 int i, k, nCutsR = 0;
513 Gia_Cut_t * pCut0, * pCut1, ** pCutsR = p->ppCuts;
514 assert( !Gia_ObjIsBuf(pObj) );
515 assert( !Gia_ObjIsMux(p->pGia, pObj) );
516 Gia_StoInitResult( p );
517 p->CutCount[0] += nCuts0 * nCuts1;
518 for ( i = 0, pCut0 = p->pCuts[0]; i < nCuts0; i++, pCut0++ )
519 for ( k = 0, pCut1 = p->pCuts[1]; k < nCuts1; k++, pCut1++ )
520 {
521 if ( (int)(pCut0->nLeaves + pCut1->nLeaves) > nCutSize && Gia_CutCountBits(pCut0->Sign | pCut1->Sign) > nCutSize )
522 continue;
523 p->CutCount[1]++;
524 if ( !Gia_CutMergeOrder(pCut0, pCut1, pCutsR[nCutsR], nCutSize) )
525 continue;
526 if ( Gia_CutSetLastCutIsContained(pCutsR, nCutsR) )
527 continue;
528 p->CutCount[2]++;
529 if ( p->fCutMin && Gia_CutComputeTruth(p, pCut0, pCut1, fComp0, fComp1, pCutsR[nCutsR], fIsXor) )
530 pCutsR[nCutsR]->Sign = Gia_CutGetSign(pCutsR[nCutsR]);
531 pCutsR[nCutsR]->nTreeLeaves = Gia_CutTreeLeaves( p, pCutsR[nCutsR] );
532 pCutsR[nCutsR]->CostF = Gia_CutGetCost( p, pCutsR[nCutsR] );
533 nCutsR = Gia_CutSetAddCut( pCutsR, nCutsR, nCutNum );
534 }
535 p->CutCount[3] += nCutsR;
536 p->nCutsOver += nCutsR == nCutNum-1;
537 p->nCutsR = nCutsR;
538 p->Pivot = iObj;
539 // debug printout
540 if ( 0 )
541 {
542 printf( "*** Obj = %4d NumCuts = %4d\n", iObj, nCutsR );
543 for ( i = 0; i < nCutsR; i++ )
544 Gia_CutPrint( p, iObj, pCutsR[i] );
545 printf( "\n" );
546 }
547 // verify
548 assert( nCutsR > 0 && nCutsR < nCutNum );
549 assert( Gia_CutSetCheckArray(pCutsR, nCutsR) );
550 // store the cutset
551 Gia_StoStoreResult( p, iObj, pCutsR, nCutsR );
552 if ( nCutsR > 1 || pCutsR[0]->nLeaves > 1 )
553 Gia_CutAddUnit( p, iObj );
554}
555
556
568Gia_Sto_t * Gia_StoAlloc( Gia_Man_t * pGia, int nCutSize, int nCutNum, int fCutMin, int fTruthMin, int fVerbose )
569{
570 Gia_Sto_t * p;
571 assert( nCutSize < GIA_CUT_NO_LEAF );
572 assert( nCutSize > 1 && nCutSize <= GIA_MAX_CUTSIZE );
573 assert( nCutNum > 1 && nCutNum < GIA_MAX_CUTNUM );
574 p = ABC_CALLOC( Gia_Sto_t, 1 );
575 p->clkStart = Abc_Clock();
576 p->nCutSize = nCutSize;
577 p->nCutNum = nCutNum;
578 p->fCutMin = fCutMin;
579 p->fTruthMin = fTruthMin;
580 p->fVerbose = fVerbose;
581 p->pGia = pGia;
582 p->vRefs = Vec_IntAlloc( Gia_ManObjNum(pGia) );
583 p->vCuts = Vec_WecStart( Gia_ManObjNum(pGia) );
584 p->vTtMem = fCutMin ? Vec_MemAllocForTT( nCutSize, 0 ) : NULL;
585 return p;
586}
588{
589 Vec_IntFree( p->vRefs );
590 Vec_WecFree( p->vCuts );
591 if ( p->fCutMin )
592 Vec_MemHashFree( p->vTtMem );
593 if ( p->fCutMin )
594 Vec_MemFree( p->vTtMem );
595 ABC_FREE( p );
596}
598{
599 Gia_CutAddZero( p, iObj );
600}
602{
603 Gia_CutAddUnit( p, iObj );
604}
606{
607 Gia_StoMergeCuts( p, iObj );
608}
609void Gia_StoRefObj( Gia_Sto_t * p, int iObj )
610{
611 Gia_Obj_t * pObj = Gia_ManObj(p->pGia, iObj);
612 assert( iObj == Vec_IntSize(p->vRefs) );
613 Vec_IntPush( p->vRefs, 0 );
614 if ( Gia_ObjIsAnd(pObj) )
615 {
616 Vec_IntAddToEntry( p->vRefs, Gia_ObjFaninId0(pObj, iObj), 1 );
617 Vec_IntAddToEntry( p->vRefs, Gia_ObjFaninId1(pObj, iObj), 1 );
618 }
619 else if ( Gia_ObjIsCo(pObj) )
620 Vec_IntAddToEntry( p->vRefs, Gia_ObjFaninId0(pObj, iObj), 1 );
621}
623{
624 int nCutSize = 8;
625 int nCutNum = 6;
626 int fCutMin = 0;
627 int fTruthMin = 0;
628 int fVerbose = 1;
629 Gia_Sto_t * p = Gia_StoAlloc( pGia, nCutSize, nCutNum, fCutMin, fTruthMin, fVerbose );
630 Gia_Obj_t * pObj; int i, iObj;
631 assert( nCutSize <= GIA_MAX_CUTSIZE );
632 assert( nCutNum < GIA_MAX_CUTNUM );
633 // prepare references
634 Gia_ManForEachObj( p->pGia, pObj, iObj )
635 Gia_StoRefObj( p, iObj );
636 // compute cuts
638 Gia_ManForEachCiId( p->pGia, iObj, i )
639 Gia_StoComputeCutsCi( p, iObj );
640 Gia_ManForEachAnd( p->pGia, pObj, iObj )
641 Gia_StoComputeCutsNode( p, iObj );
642 if ( p->fVerbose )
643 {
644 printf( "Running cut computation with CutSize = %d CutNum = %d CutMin = %s TruthMin = %s\n",
645 p->nCutSize, p->nCutNum, p->fCutMin ? "yes":"no", p->fTruthMin ? "yes":"no" );
646 printf( "CutPair = %.0f ", p->CutCount[0] );
647 printf( "Merge = %.0f (%.2f %%) ", p->CutCount[1], 100.0*p->CutCount[1]/p->CutCount[0] );
648 printf( "Eval = %.0f (%.2f %%) ", p->CutCount[2], 100.0*p->CutCount[2]/p->CutCount[0] );
649 printf( "Cut = %.0f (%.2f %%) ", p->CutCount[3], 100.0*p->CutCount[3]/p->CutCount[0] );
650 printf( "Cut/Node = %.2f ", p->CutCount[3] / Gia_ManAndNum(p->pGia) );
651 printf( "\n" );
652 printf( "The number of nodes with cut count over the limit (%d cuts) = %d nodes (out of %d). ",
653 p->nCutNum, p->nCutsOver, Gia_ManAndNum(pGia) );
654 Abc_PrintTime( 0, "Time", Abc_Clock() - p->clkStart );
655 }
656 Gia_StoFree( p );
657}
658
659
671int Gia_StoSelectOneCut( Vec_Wec_t * vCuts, int iObj, Vec_Int_t * vCut, int nCutSizeMin )
672{
673 Vec_Int_t * vThis = Vec_WecEntry( vCuts, iObj );
674 int i, v, * pCut, * pList = Vec_IntArray( vThis );
675 if ( pList == NULL )
676 return 0;
677 Vec_IntClear( vCut );
678 Sdb_ForEachCut( pList, pCut, i )
679 {
680 if ( pCut[0] < nCutSizeMin )
681 continue;
682 for ( v = 0; v <= pCut[0]; v++ )
683 Vec_IntPush( vCut, pCut[v] );
684 return 1;
685 }
686 return 0;
687}
688Vec_Wec_t * Gia_ManSelectCuts( Vec_Wec_t * vCuts, int nCuts, int nCutSizeMin )
689{
690 Vec_Wec_t * vCutsSel = Vec_WecStart( nCuts );
691 int i; srand( time(NULL) );
692 for ( i = 0; i < nCuts; i++ )
693 while ( !Gia_StoSelectOneCut(vCuts, (rand() | (rand() << 15)) % Vec_WecSize(vCuts), Vec_WecEntry(vCutsSel, i), nCutSizeMin) );
694 return vCutsSel;
695}
696Vec_Wec_t * Gia_ManExtractCuts( Gia_Man_t * pGia, int nCutSize0, int nCuts0, int fVerbose0 )
697{
698 int nCutSize = nCutSize0;
699 int nCutNum = 6;
700 int fCutMin = 0;
701 int fTruthMin = 0;
702 int fVerbose = fVerbose0;
703 Vec_Wec_t * vCutsSel;
704 Gia_Sto_t * p = Gia_StoAlloc( pGia, nCutSize, nCutNum, fCutMin, fTruthMin, fVerbose );
705 Gia_Obj_t * pObj; int i, iObj;
706 assert( nCutSize <= GIA_MAX_CUTSIZE );
707 assert( nCutNum < GIA_MAX_CUTNUM );
708 // prepare references
709 Gia_ManForEachObj( p->pGia, pObj, iObj )
710 Gia_StoRefObj( p, iObj );
711 // compute cuts
713 Gia_ManForEachCiId( p->pGia, iObj, i )
714 Gia_StoComputeCutsCi( p, iObj );
715 Gia_ManForEachAnd( p->pGia, pObj, iObj )
716 Gia_StoComputeCutsNode( p, iObj );
717 if ( p->fVerbose )
718 {
719 printf( "Running cut computation with CutSize = %d CutNum = %d CutMin = %s TruthMin = %s\n",
720 p->nCutSize, p->nCutNum, p->fCutMin ? "yes":"no", p->fTruthMin ? "yes":"no" );
721 printf( "CutPair = %.0f ", p->CutCount[0] );
722 printf( "Merge = %.0f (%.2f %%) ", p->CutCount[1], 100.0*p->CutCount[1]/p->CutCount[0] );
723 printf( "Eval = %.0f (%.2f %%) ", p->CutCount[2], 100.0*p->CutCount[2]/p->CutCount[0] );
724 printf( "Cut = %.0f (%.2f %%) ", p->CutCount[3], 100.0*p->CutCount[3]/p->CutCount[0] );
725 printf( "Cut/Node = %.2f ", p->CutCount[3] / Gia_ManAndNum(p->pGia) );
726 printf( "\n" );
727 printf( "The number of nodes with cut count over the limit (%d cuts) = %d nodes (out of %d). ",
728 p->nCutNum, p->nCutsOver, Gia_ManAndNum(pGia) );
729 Abc_PrintTime( 0, "Time", Abc_Clock() - p->clkStart );
730 }
731 vCutsSel = Gia_ManSelectCuts( p->vCuts, nCuts0, nCutSize0-1 );
732 Gia_StoFree( p );
733 return vCutsSel;
734}
735void Gia_ManCreateWins( Gia_Man_t * pGia, Vec_Wec_t * vCuts )
736{
737 Gia_Obj_t * pObj;
738 Vec_Wec_t * vWins = Vec_WecStart( Gia_ManObjNum(pGia) );
739 Vec_Int_t * vTemp = Vec_IntAlloc( 100 );
740 Vec_Int_t * vCut; int i, k, Obj, Cut;
741 Vec_WecForEachLevel( vCuts, vCut, i )
742 Vec_IntForEachEntryStart( vCut, Obj, k, 1 )
743 Vec_IntPush( Vec_WecEntry(vWins, Obj), i );
744 Gia_ManForEachAnd( pGia, pObj, Obj )
745 {
746 Vec_Int_t * vWin = Vec_WecEntry(vWins, Obj);
747 Vec_Int_t * vWin0 = Vec_WecEntry(vWins, Gia_ObjFaninId0(pObj, Obj));
748 Vec_Int_t * vWin1 = Vec_WecEntry(vWins, Gia_ObjFaninId1(pObj, Obj));
749 Vec_IntTwoFindCommon( vWin0, vWin1, vTemp );
750 Vec_IntForEachEntry( vTemp, Cut, k )
751 {
752 Vec_IntPushUniqueOrder( vWin, Cut );
753 Vec_IntPush( Vec_WecEntry(vCuts, Cut), Obj );
754 }
755 }
756 Vec_WecFree( vWins );
757 Vec_IntFree( vTemp );
758}
760{
761 Vec_Int_t * vCut; int i, k, Obj;
762 Vec_WecForEachLevel( vCuts, vCut, i )
763 {
764 int nInputs = Vec_IntEntry(vCut, 0);
765 printf( "Cut %5d : ", i );
766 printf( "Supp = %d ", nInputs );
767 printf( "Nodes = %d ", Vec_IntSize(vCut) - 1 - nInputs );
768 Vec_IntForEachEntryStartStop( vCut, Obj, k, 1, nInputs+1 )
769 printf( "%d ", Obj );
770 printf( " " );
771 Vec_IntForEachEntryStart( vCut, Obj, k, nInputs+1 )
772 printf( "%d ", Obj );
773 printf( "\n" );
774 }
775}
777{
778 Vec_Int_t * vCut; int i, nInputs = 0, nNodes = 0;
779 Vec_WecForEachLevel( vCuts, vCut, i )
780 {
781 nInputs += Vec_IntEntry(vCut, 0);
782 nNodes += Vec_IntSize(vCut) - 1 - Vec_IntEntry(vCut, 0);
783 }
784 printf( "Computed %d windows with average support %.3f and average volume %.3f.\n",
785 Vec_WecSize(vCuts), 1.0*nInputs/Vec_WecSize(vCuts), 1.0*nNodes/Vec_WecSize(vCuts) );
786}
788{
789 extern Vec_Wec_t * Gia_ManExtractCuts2( Gia_Man_t * p, int nCutSize, int nCuts, int fVerbose );
790 Vec_Wec_t * vCutsSel = Gia_ManExtractCuts2( pGia, 8, 10000, 1 );
791 //Vec_Wec_t * vCutsSel = Gia_ManExtractCuts( pGia, 8, 10000, 1 );
792 abctime clk = Abc_Clock();
793 Gia_ManCreateWins( pGia, vCutsSel );
794 //Gia_ManPrintWins( vCutsSel );
795 Gia_ManPrintWinStats( vCutsSel );
796 Vec_WecFree( vCutsSel );
797 Abc_PrintTime( 0, "Creating windows", Abc_Clock() - clk );
798}
799
811void Gia_StoCutPrint( int * pCut )
812{
813 int v;
814 printf( "{" );
815 for ( v = 1; v <= pCut[0]; v++ )
816 printf( " %d", pCut[v] );
817 printf( " }\n" );
818}
819void Gia_StoPrintCuts( Vec_Int_t * vThis, int iObj, int nCutSize )
820{
821 int i, * pCut;
822 printf( "Cuts of node %d (size = %d):\n", iObj, nCutSize );
823 Sdb_ForEachCut( Vec_IntArray(vThis), pCut, i )
824 if ( !nCutSize || pCut[0] == nCutSize )
825 Gia_StoCutPrint( pCut );
826}
827Vec_Wec_t * Gia_ManFilterCuts( Gia_Man_t * pGia, Vec_Wec_t * vStore, int nCutSize, int nCuts )
828{
829 abctime clkStart = Abc_Clock();
830 Vec_Wec_t * vCutsSel = Vec_WecAlloc( nCuts );
831 Vec_Int_t * vLevel, * vCut = Vec_IntAlloc( 10 );
832 Vec_Wec_t * vCuts = Vec_WecAlloc( 1000 );
833 Hsh_VecMan_t * p = Hsh_VecManStart( 1000 ); int i, s;
834 Vec_WecForEachLevel( vStore, vLevel, i ) if ( Vec_IntSize(vLevel) )
835 {
836 int v, k, * pCut, Value;
837 Sdb_ForEachCut( Vec_IntArray(vLevel), pCut, k )
838 {
839 if ( pCut[0] < 2 )
840 continue;
841
842 for ( v = 1; v <= pCut[0]; v++ )
843 if ( pCut[v] < 9 )
844 break;
845 if ( v <= pCut[0] )
846 continue;
847
848 Vec_IntClear( vCut );
849 Vec_IntPushArray( vCut, pCut+1, pCut[0] );
850 Value = Hsh_VecManAdd( p, vCut );
851 if ( Value == Vec_WecSize(vCuts) )
852 {
853 Vec_Int_t * vTemp = Vec_WecPushLevel(vCuts);
854 Vec_IntPush( vTemp, 0 );
855 Vec_IntAppend( vTemp, vCut );
856 }
857 Vec_IntAddToEntry( Vec_WecEntry(vCuts, Value), 0, 1 );
858 }
859 }
860 printf( "Collected cuts = %d.\n", Vec_WecSize(vCuts) );
861 for ( s = 3; s <= nCutSize; s++ )
862 Vec_WecForEachLevel( vCuts, vLevel, i )
863 if ( Vec_IntSize(vLevel) - 1 == s )
864 {
865 int * pCut = Vec_IntEntryP(vLevel, 1);
866 int u, v, Value;
867 for ( u = 0; u < s; u++ )
868 {
869 Vec_IntClear( vCut );
870 for ( v = 0; v < s; v++ ) if ( v != u )
871 Vec_IntPush( vCut, pCut[v] );
872 assert( Vec_IntSize(vCut) == s-1 );
873 Value = Hsh_VecManAdd( p, vCut );
874 if ( Value < Vec_WecSize(vCuts) )
875 Vec_IntAddToEntry( vLevel, 0, Vec_IntEntry(Vec_WecEntry(vCuts, Value), 0) );
876 }
877 }
878 Hsh_VecManStop( p );
879 Vec_IntFree( vCut );
880 // collect
881 Vec_WecSortByFirstInt( vCuts, 1 );
882 Vec_WecForEachLevelStop( vCuts, vLevel, i, Abc_MinInt(Vec_WecSize(vCuts), nCuts) )
883 Vec_IntAppend( Vec_WecPushLevel(vCutsSel), vLevel );
884 Abc_PrintTime( 0, "Cut filtering time", Abc_Clock() - clkStart );
885 return vCutsSel;
886}
887int Gia_ManCountRefs( Gia_Man_t * pGia, Vec_Int_t * vLevel )
888{
889 int i, iObj, nRefs = 0;
890 Vec_IntForEachEntry( vLevel, iObj, i )
891 nRefs += Gia_ObjRefNumId(pGia, iObj);
892 return nRefs;
893}
895{
896 Vec_Wrd_t * vSims;
897 Vec_WrdFreeP( &pGia->vSimsPi );
898 pGia->vSimsPi = Vec_WrdStartTruthTables( Gia_ManCiNum(pGia) );
899 vSims = Gia_ManSimPatSim( pGia );
900 return vSims;
901}
902int Gia_ManFindSatDcs( Gia_Man_t * pGia, Vec_Wrd_t * vSims, Vec_Int_t * vLevel )
903{
904 int nWords = Vec_WrdSize(pGia->vSimsPi) / Gia_ManCiNum(pGia);
905 int i, w, iObj, Res = 0, Pres[256] = {0}, nMints = 1 << Vec_IntSize(vLevel);
906 for ( w = 0; w < 64*nWords; w++ )
907 {
908 int iInMint = 0;
909 Vec_IntForEachEntry( vLevel, iObj, i )
910 if ( Abc_TtGetBit( Vec_WrdEntryP(vSims, iObj*nWords), w ) )
911 iInMint |= 1 << i;
912 Pres[iInMint]++;
913 }
914 for ( i = 0; i < nMints; i++ )
915 Res += Pres[i] == 0;
916 return Res;
917}
918
919
921{
922 Gia_Obj_t * pObj; int i, Res = 0;
923 Vec_Int_t * vRes = Vec_IntAlloc( 100 );
924 Vec_IntSort( vIns, 0 );
925
926 Vec_IntPush( vRes, 0 );
927 Vec_IntAppend( vRes, vIns );
928
931 Gia_ManForEachObjVec( vIns, p, pObj, i )
932 Gia_ObjSetTravIdCurrent( p, pObj );
933
934 Gia_ManForEachAnd( p, pObj, i )
935 if ( Gia_ObjIsTravIdCurrent(p, pObj) )
936 continue;
937 else if ( Gia_ObjIsTravIdCurrent(p, Gia_ObjFanin0(pObj)) && Gia_ObjIsTravIdCurrent(p, Gia_ObjFanin1(pObj)) )
938 {
939 if ( !Gia_ObjIsTravIdPrevious(p, pObj) )
940 Vec_IntPush( vRes, i );
941 Gia_ObjSetTravIdCurrent( p, pObj );
942 }
943// printf( "Divisors: " );
944// Vec_IntPrint( vRes );
945 Res = Vec_IntSize(vRes);
946 Vec_IntFree( vRes );
947 return Res;
948}
949
951{
952 Vec_Wrd_t * vSims = Gia_ManGenSims( pGia );
953 Vec_Int_t * vLevel; int i;
954 Gia_ManCreateRefs( pGia );
955 Vec_WecForEachLevel( vCuts, vLevel, i )
956 {
957 printf( "Cut %3d ", i );
958 printf( "Ref = %3d : ", Vec_IntEntry(vLevel, 0) );
959
960 Vec_IntShift( vLevel, 1 );
961 printf( "Ref = %3d : ", Gia_ManCountRefs(pGia, vLevel) );
962 printf( "SDC = %3d : ", Gia_ManFindSatDcs(pGia, vSims, vLevel) );
963 printf( "Div = %3d : ", Gia_ManCollectCutDivs(pGia, vLevel) );
964 Vec_IntPrint( vLevel );
965 Vec_IntShift( vLevel, -1 );
966 }
967 Vec_WrdFree( vSims );
968}
969
970
971Vec_Wec_t * Gia_ManExploreCuts( Gia_Man_t * pGia, int nCutSize0, int nCuts0, int fVerbose0 )
972{
973 int nCutSize = nCutSize0;
974 int nCutNum = 64;
975 int fCutMin = 0;
976 int fTruthMin = 0;
977 int fVerbose = fVerbose0;
978 Vec_Wec_t * vCutsSel;
979 Gia_Sto_t * p = Gia_StoAlloc( pGia, nCutSize, nCutNum, fCutMin, fTruthMin, fVerbose );
980 Gia_Obj_t * pObj; int i, iObj;
981 assert( nCutSize <= GIA_MAX_CUTSIZE );
982 assert( nCutNum < GIA_MAX_CUTNUM );
983 // prepare references
984 Gia_ManForEachObj( p->pGia, pObj, iObj )
985 Gia_StoRefObj( p, iObj );
986 // compute cuts
988 Gia_ManForEachCiId( p->pGia, iObj, i )
989 Gia_StoComputeCutsCi( p, iObj );
990 Gia_ManForEachAnd( p->pGia, pObj, iObj )
991 Gia_StoComputeCutsNode( p, iObj );
992 if ( p->fVerbose )
993 {
994 printf( "Running cut computation with CutSize = %d CutNum = %d CutMin = %s TruthMin = %s\n",
995 p->nCutSize, p->nCutNum, p->fCutMin ? "yes":"no", p->fTruthMin ? "yes":"no" );
996 printf( "CutPair = %.0f ", p->CutCount[0] );
997 printf( "Merge = %.0f (%.2f %%) ", p->CutCount[1], 100.0*p->CutCount[1]/p->CutCount[0] );
998 printf( "Eval = %.0f (%.2f %%) ", p->CutCount[2], 100.0*p->CutCount[2]/p->CutCount[0] );
999 printf( "Cut = %.0f (%.2f %%) ", p->CutCount[3], 100.0*p->CutCount[3]/p->CutCount[0] );
1000 printf( "Cut/Node = %.2f ", p->CutCount[3] / Gia_ManAndNum(p->pGia) );
1001 printf( "\n" );
1002 printf( "The number of nodes with cut count over the limit (%d cuts) = %d nodes (out of %d). ",
1003 p->nCutNum, p->nCutsOver, Gia_ManAndNum(pGia) );
1004 Abc_PrintTime( 0, "Time", Abc_Clock() - p->clkStart );
1005 }
1006 vCutsSel = Gia_ManFilterCuts( pGia, p->vCuts, nCutSize0, nCuts0 );
1007 //Gia_ManConsiderCuts( pGia, vCutsSel );
1008 Gia_StoFree( p );
1009 return vCutsSel;
1010}
1011void Gia_ManExploreCutsTest( Gia_Man_t * pGia, int nCutSize0, int nCuts0, int fVerbose0 )
1012{
1013 Vec_Wec_t * vCutSel = Gia_ManExploreCuts( pGia, nCutSize0, nCuts0, fVerbose0 );
1014 Vec_WecPrint( vCutSel, 0 );
1015 Vec_WecFree( vCutSel );
1016}
1017
1018
1030Gia_Sto_t * Gia_ManMatchCutsInt( Gia_Man_t * pGia, int nCutSize0, int nCutNum0, int fVerbose0 )
1031{
1032 int nCutSize = nCutSize0;
1033 int nCutNum = nCutNum0;
1034 int fCutMin = 1;
1035 int fTruthMin = 1;
1036 int fVerbose = fVerbose0;
1037 Gia_Sto_t * p = Gia_StoAlloc( pGia, nCutSize, nCutNum, fCutMin, fTruthMin, fVerbose );
1038 Gia_Obj_t * pObj; int i, iObj;
1039 assert( nCutSize <= GIA_MAX_CUTSIZE );
1040 assert( nCutNum < GIA_MAX_CUTNUM );
1041 // prepare references
1042 Gia_ManForEachObj( p->pGia, pObj, iObj )
1043 Gia_StoRefObj( p, iObj );
1044 // compute cuts
1046 Gia_ManForEachCiId( p->pGia, iObj, i )
1047 Gia_StoComputeCutsCi( p, iObj );
1048 Gia_ManForEachAnd( p->pGia, pObj, iObj )
1049 Gia_StoComputeCutsNode( p, iObj );
1050 if ( p->fVerbose )
1051 {
1052 printf( "Running cut computation with CutSize = %d CutNum = %d CutMin = %s TruthMin = %s\n",
1053 p->nCutSize, p->nCutNum, p->fCutMin ? "yes":"no", p->fTruthMin ? "yes":"no" );
1054 printf( "CutPair = %.0f ", p->CutCount[0] );
1055 printf( "Merge = %.0f (%.2f %%) ", p->CutCount[1], 100.0*p->CutCount[1]/p->CutCount[0] );
1056 printf( "Eval = %.0f (%.2f %%) ", p->CutCount[2], 100.0*p->CutCount[2]/p->CutCount[0] );
1057 printf( "Cut = %.0f (%.2f %%) ", p->CutCount[3], 100.0*p->CutCount[3]/p->CutCount[0] );
1058 printf( "Cut/Node = %.2f ", p->CutCount[3] / Gia_ManAndNum(p->pGia) );
1059 printf( "\n" );
1060 printf( "The number of nodes with cut count over the limit (%d cuts) = %d nodes (out of %d). ",
1061 p->nCutNum, p->nCutsOver, Gia_ManAndNum(pGia) );
1062 Abc_PrintTime( 0, "Time", Abc_Clock() - p->clkStart );
1063 }
1064 return p;
1065}
1066void Gia_ManMatchCuts( Vec_Mem_t * vTtMem, Gia_Man_t * pGia, int nCutSize, int nCutNum, int fVerbose )
1067{
1068 Gia_Sto_t * p = Gia_ManMatchCutsInt( pGia, nCutSize, nCutNum, fVerbose );
1069 Vec_Int_t * vLevel; int i, j, k, * pCut;
1070 Vec_Int_t * vNodes = Vec_IntAlloc( 100 );
1071 Vec_Wec_t * vCuts = Vec_WecAlloc( 100 );
1072 abctime clkStart = Abc_Clock();
1073 assert( Abc_Truth6WordNum(nCutSize) == Vec_MemEntrySize(vTtMem) );
1074 Vec_WecForEachLevel( p->vCuts, vLevel, i ) if ( Vec_IntSize(vLevel) )
1075 {
1076 Sdb_ForEachCut( Vec_IntArray(vLevel), pCut, k ) if ( pCut[0] > 1 )
1077 {
1078 word * pTruth = Vec_MemReadEntry( p->vTtMem, Abc_Lit2Var(pCut[pCut[0]+1]) );
1079 int * pSpot = Vec_MemHashLookup( vTtMem, pTruth );
1080 if ( *pSpot == -1 )
1081 continue;
1082 Vec_IntPush( vNodes, i );
1083 vLevel = Vec_WecPushLevel( vCuts );
1084 Vec_IntPush( vLevel, i );
1085 for ( j = 1; j <= pCut[0]; j++ )
1086 Vec_IntPush( vLevel, pCut[j] );
1087 break;
1088 }
1089 }
1090 printf( "Nodes with matching cuts: " );
1091 Vec_IntPrint( vNodes );
1092 if ( Vec_WecSize(vCuts) > 32 )
1093 Vec_WecShrink(vCuts, 32);
1094 Vec_WecPrint( vCuts, 0 );
1095 Vec_WecFree( vCuts );
1096 Vec_IntFree( vNodes );
1097 Gia_StoFree( p );
1098 if ( fVerbose )
1099 Abc_PrintTime( 1, "Cut matching time", Abc_Clock() - clkStart );
1100}
1101Vec_Ptr_t * Gia_ManMatchCutsArray( Vec_Ptr_t * vTtMems, Gia_Man_t * pGia, int nCutSize, int nCutNum, int fVerbose )
1102{
1103 Vec_Ptr_t * vRes = Vec_PtrAlloc( Vec_PtrSize(vTtMems) );
1104 Gia_Sto_t * p = Gia_ManMatchCutsInt( pGia, nCutSize, nCutNum, fVerbose );
1105 Vec_Int_t * vLevel, * vTemp; int i, k, c, * pCut;
1106 abctime clkStart = Abc_Clock();
1107 for ( i = 0; i < Vec_PtrSize(vTtMems); i++ )
1108 Vec_PtrPush( vRes, Vec_WecAlloc(100) );
1109 Vec_WecForEachLevel( p->vCuts, vLevel, i ) if ( Vec_IntSize(vLevel) )
1110 {
1111 Sdb_ForEachCut( Vec_IntArray(vLevel), pCut, k ) if ( pCut[0] > 1 )
1112 {
1113 Vec_Mem_t * vTtMem; int m;
1114 Vec_PtrForEachEntry( Vec_Mem_t *, vTtMems, vTtMem, m )
1115 {
1116 word * pTruth = Vec_MemReadEntry( p->vTtMem, Abc_Lit2Var(pCut[pCut[0]+1]) );
1117 int * pSpot = Vec_MemHashLookup( vTtMem, pTruth );
1118 if ( *pSpot == -1 )
1119 continue;
1120 vTemp = Vec_WecPushLevel( (Vec_Wec_t *)Vec_PtrEntry(vRes, m) );
1121 Vec_IntPush( vTemp, i );
1122 for ( c = 1; c <= pCut[0]; c++ )
1123 Vec_IntPush( vTemp, pCut[c] );
1124 }
1125 }
1126 }
1127 Gia_StoFree( p );
1128 if ( fVerbose ) {
1129 Vec_Wec_t * vCuts;
1130 printf( "Detected nodes by type: " );
1131 Vec_PtrForEachEntry( Vec_Wec_t *, vRes, vCuts, i )
1132 printf( "Type%d = %d ", i, Vec_WecSize(vCuts) );
1133 Abc_PrintTime( 1, "Cut matching time", Abc_Clock() - clkStart );
1134 }
1135 return vRes;
1136}
1137Vec_Ptr_t * Gia_ManMatchCutsMany( Vec_Mem_t * vTtMem, Vec_Int_t * vMap, int nFuncs, Gia_Man_t * pGia, int nCutSize, int nCutNum, int fVerbose )
1138{
1139 Gia_Sto_t * p = Gia_ManMatchCutsInt( pGia, nCutSize, nCutNum, fVerbose );
1140 Vec_Int_t * vLevel; int i, j, k, * pCut;
1141 abctime clkStart = Abc_Clock();
1142 assert( Abc_Truth6WordNum(nCutSize) == Vec_MemEntrySize(vTtMem) );
1143 Vec_Ptr_t * vRes = Vec_PtrAlloc( nFuncs );
1144 for ( i = 0; i < nFuncs; i++ )
1145 Vec_PtrPush( vRes, Vec_WecAlloc(10) );
1146 Vec_WecForEachLevel( p->vCuts, vLevel, i ) if ( Vec_IntSize(vLevel) )
1147 {
1148 Sdb_ForEachCut( Vec_IntArray(vLevel), pCut, k ) if ( pCut[0] > 1 )
1149 {
1150 word * pTruth = Vec_MemReadEntry( p->vTtMem, Abc_Lit2Var(pCut[pCut[0]+1]) );
1151 assert( (pTruth[0] & 1) == 0 );
1152 int * pSpot = Vec_MemHashLookup( vTtMem, pTruth );
1153 if ( *pSpot == -1 )
1154 continue;
1155 int iFunc = vMap ? Vec_IntEntry( vMap, *pSpot ) : 0;
1156 assert( iFunc < nFuncs );
1157 Vec_Wec_t * vCuts = (Vec_Wec_t *)Vec_PtrEntry( vRes, iFunc );
1158 vLevel = Vec_WecPushLevel( vCuts );
1159 Vec_IntPush( vLevel, i );
1160 for ( j = 1; j <= pCut[0]; j++ )
1161 Vec_IntPush( vLevel, pCut[j] );
1162 break;
1163 }
1164 }
1165 Gia_StoFree( p );
1166 if ( fVerbose )
1167 Abc_PrintTime( 1, "Cut matching time", Abc_Clock() - clkStart );
1168 return vRes;
1169}
1170
1182void Gia_ManDumpCuts( Gia_Man_t * p, int nCutSize, int nCutNum, int fVerbose )
1183{
1184 FILE * pFile = fopen( "input.txt", "wb" ); if ( !pFile ) return;
1185 Gia_Sto_t * pSto = Gia_ManMatchCutsInt( p, nCutSize, nCutNum, 0 );
1186 Vec_Int_t * vLevel; int i, k, c, * pCut, nCuts = 0, nNodes = 0;
1187 Vec_WecForEachLevel( pSto->vCuts, vLevel, i ) if ( Vec_IntSize(vLevel) ) {
1188 if ( !Gia_ObjIsAnd(Gia_ManObj(p, i)) )
1189 continue;
1190 Sdb_ForEachCut( Vec_IntArray(vLevel), pCut, k ) {
1191 if ( pCut[0] == 1 )
1192 continue;
1193 fprintf( pFile, "%d ", i );
1194 for ( c = 1; c <= pCut[0]; c++ )
1195 fprintf( pFile, "%d ", pCut[c] );
1196 fprintf( pFile, "1\n" );
1197 nCuts += pCut[0];
1198 nNodes++;
1199 }
1200 }
1201 Gia_Obj_t * pObj;
1202 Gia_ManForEachCo( p, pObj, i ) {
1203 fprintf( pFile, "%d %d 0\n", Gia_ObjId(p, pObj), Gia_ObjFaninId0p(p, pObj) );
1204 }
1205 fclose( pFile );
1206 Gia_StoFree( pSto );
1207 if ( fVerbose )
1208 printf( "Dumped %d cuts for %d nodes into file \"input.txt\".\n", nCuts, nNodes );
1209}
1210
1222Vec_Wrd_t * Gia_ManCollectCutFuncs( Gia_Man_t * p, int nCutSize, int nCutNum, int fVerbose )
1223{
1224 Gia_Sto_t * pSto = Gia_ManMatchCutsInt( p, nCutSize, nCutNum, 0 );
1225 Vec_Wrd_t * vFuncs = Vec_WrdAlloc( 1000 ); Vec_Int_t * vLevel; int i, k, * pCut;
1226 Vec_WecForEachLevel( pSto->vCuts, vLevel, i ) if ( Vec_IntSize(vLevel) )
1227 Sdb_ForEachCut( Vec_IntArray(vLevel), pCut, k ) if ( pCut[0] == nCutSize ) {
1228 word * pTruth = Vec_MemReadEntry( pSto->vTtMem, Abc_Lit2Var(pCut[pCut[0]+1]) );
1229 Vec_WrdPush( vFuncs, pTruth[0] );
1230 }
1231 Gia_StoFree( pSto );
1232 if ( fVerbose )
1233 printf( "Collected %d cut functions using the AIG with %d nodes.\n", Vec_WrdSize(vFuncs), Gia_ManAndNum(p) );
1234 return vFuncs;
1235}
1236Vec_Int_t * Gia_ManCountNpnClasses( Vec_Mem_t * vTtMem, Vec_Int_t * vMap, int nClasses, Vec_Wrd_t * vOrig )
1237{
1238 assert( Vec_MemEntryNum(vTtMem) == Vec_IntSize(vMap) );
1239 Vec_Int_t * vClassCounts = Vec_IntStart( nClasses ); int i; word Func;
1240 Vec_WrdForEachEntry( vOrig, Func, i ) {
1241 int * pSpot = Vec_MemHashLookup( vTtMem, &Func );
1242 if ( *pSpot == -1 )
1243 continue;
1244 int iClass = Vec_IntEntry( vMap, *pSpot );
1245 if ( iClass == -1 )
1246 continue;
1247 assert( iClass < Vec_IntSize(vClassCounts) );
1248 Vec_IntAddToEntry( vClassCounts, iClass, 1 );
1249 }
1250 return vClassCounts;
1251}
1252Vec_Wrd_t * Gia_ManMatchFilterClasses( Vec_Mem_t * vTtMem, Vec_Int_t * vMap, Vec_Int_t * vClassCounts, int nNumFuncs, int fVerbose )
1253{
1254 int * pPerm = Abc_MergeSortCost( Vec_IntArray(vClassCounts), Vec_IntSize(vClassCounts) );
1255 Vec_Wrd_t * vBest = Vec_WrdAlloc( nNumFuncs ); int i, k, Entry;
1256 Vec_Int_t * vMapNew = Vec_IntStartFull( Vec_IntSize(vMap) );
1257 for ( i = Vec_IntSize(vClassCounts)-1; i >= 0; i-- ) {
1258 word Best = ~(word)0;
1259 Vec_IntForEachEntry( vMap, Entry, k ) {
1260 if ( Entry != pPerm[i] )
1261 continue;
1262 if ( Best > Vec_MemReadEntry(vTtMem, k)[0] )
1263 Best = Vec_MemReadEntry(vTtMem, k)[0];
1264 Vec_IntWriteEntry( vMapNew, k, Vec_WrdSize(vBest) );
1265 }
1266 Vec_WrdPush( vBest, Best );
1267 assert( ~Best );
1268 if ( Vec_WrdSize(vBest) == nNumFuncs )
1269 break;
1270 }
1271 ABC_SWAP( Vec_Int_t, *vMap, *vMapNew );
1272 Vec_IntFree( vMapNew );
1273 ABC_FREE( pPerm );
1274 if ( fVerbose )
1275 printf( "Isolated %d (out of %d) most frequently occuring classes.\n", Vec_WrdSize(vBest), Vec_IntSize(vClassCounts) );
1276 return vBest;
1277}
1278void Gia_ManMatchProfileFunctions( Vec_Wrd_t * vBestReprs, Vec_Mem_t * vTtMem, Vec_Int_t * vMap, Vec_Wrd_t * vFuncs, int nCutSize )
1279{
1280 int BarSize = 60;
1281 extern void Dau_DsdPrintFromTruth( word * pTruth, int nVarsInit );
1282 Vec_Int_t * vCounts = Gia_ManCountNpnClasses( vTtMem, vMap, Vec_WrdSize(vBestReprs), vFuncs );
1283 word Repr; int c, i, MaxCount = Vec_IntFindMax( vCounts );
1284 Vec_WrdForEachEntry( vBestReprs, Repr, c )
1285 {
1286 int nSymb = BarSize*Vec_IntEntry(vCounts, c)/Abc_MaxInt(MaxCount, 1);
1287 printf( "Class%4d : ", c );
1288 printf( "Count =%6d ", Vec_IntEntry(vCounts, c) );
1289 for ( i = 0; i < nSymb; i++ )
1290 printf( "*" );
1291 for ( i = nSymb; i < BarSize+3; i++ )
1292 printf( " " );
1293 Dau_DsdPrintFromTruth( &Repr, nCutSize );
1294 }
1295 Vec_IntFree( vCounts );
1296}
1297void Gia_ManMatchCones( Gia_Man_t * pBig, Gia_Man_t * pSmall, int nCutSize, int nCutNum, int nNumFuncs, int nNumCones, int fVerbose )
1298{
1299 abctime clkStart = Abc_Clock();
1300 extern void Dau_CanonicizeArray( Vec_Wrd_t * vFuncs, int nVars, int fVerbose );
1301 extern Vec_Mem_t * Dau_CollectNpnFunctionsArray( Vec_Wrd_t * vFuncs, int nVars, Vec_Int_t ** pvMap, int fVerbose );
1302 Vec_Wrd_t * vFuncs = Gia_ManCollectCutFuncs( pSmall, nCutSize, nCutNum, fVerbose );
1303 Vec_Wrd_t * vOrig = Vec_WrdDup( vFuncs );
1304 Dau_CanonicizeArray( vFuncs, nCutSize, fVerbose );
1305 Vec_Int_t * vMap = NULL; int n;
1306 Vec_Mem_t * vTtMem = Dau_CollectNpnFunctionsArray( vFuncs, nCutSize, &vMap, fVerbose );
1307 Vec_WrdFree( vFuncs );
1308 Vec_Int_t * vClassCounts = Gia_ManCountNpnClasses( vTtMem, vMap, Vec_IntEntryLast(vMap)+1, vOrig );
1309 Vec_Wrd_t * vBestReprs = Gia_ManMatchFilterClasses( vTtMem, vMap, vClassCounts, nNumFuncs, fVerbose );
1310 assert( Vec_WrdSize(vBestReprs) == nNumFuncs );
1311 Vec_IntFree( vClassCounts );
1312 printf( "Frequency profile for %d most popular classes in the small AIG:\n", nNumFuncs );
1313 Gia_ManMatchProfileFunctions( vBestReprs, vTtMem, vMap, vOrig, nCutSize );
1314 Vec_WrdFree( vOrig );
1315 Abc_Random( 1 );
1316 for ( n = 0; n < nNumCones; n++ ) {
1317 int nRand = Abc_Random( 0 ) % Gia_ManCoNum(pBig);
1318 Gia_Man_t * pCone = Gia_ManDupCones( pBig, &nRand, 1, 1 );
1319 Vec_Wrd_t * vCutFuncs = Gia_ManCollectCutFuncs( pCone, nCutSize, nCutNum, 0 );
1320 printf( "ITER %d: Considering output cone %d with %d and-nodes. ", n+1, nRand, Gia_ManAndNum(pCone) );
1321 printf( "Profiling %d functions of %d-cuts:\n", Vec_WrdSize(vCutFuncs), nCutSize );
1322 Gia_ManMatchProfileFunctions( vBestReprs, vTtMem, vMap, vCutFuncs, nCutSize );
1323 Vec_WrdFree( vCutFuncs );
1324 Gia_ManStop( pCone );
1325 }
1326 Vec_WrdFree( vBestReprs );
1327 Vec_IntFree( vMap );
1328 Vec_MemHashFree( vTtMem );
1329 Vec_MemFree( vTtMem );
1330 Abc_PrintTime( 1, "Total computation time", Abc_Clock() - clkStart );
1331}
1332
1344int Gia_ManMatchConesMinimizeTts( Vec_Wrd_t * vSims, int nVarsMax )
1345{
1346 int nVars = 0;
1347 int nWordsMax = Abc_Truth6WordNum( nVarsMax ), nWords;
1348 int i, k = 0, nTruths = Vec_WrdSize(vSims) / nWordsMax;
1349 assert( nTruths * nWordsMax == Vec_WrdSize(vSims) );
1350 // support-minimize and find the largest supp size
1351 for ( i = 0; i < nTruths; i++ ) {
1352 word * pTruth = Vec_WrdEntryP( vSims, i * nWordsMax );
1353 int nVarsCur = Abc_TtMinBase( pTruth, NULL, nVarsMax, nVarsMax );
1354 nVars = Abc_MaxInt( nVars, nVarsCur );
1355 }
1356 // remap truth tables
1357 nWords = Abc_Truth6WordNum( nVars );
1358 for ( i = 0; i < nTruths; i++ ) {
1359 word * pTruth = Vec_WrdEntryP( vSims, i * nWordsMax );
1360 word * pTruth2 = Vec_WrdEntryP( vSims, k * nWords );
1361 if ( Abc_TtSupportSize(pTruth, nVars) < 3 )
1362 continue;
1363 memmove( pTruth2, pTruth, nWords * sizeof(word) );
1364 k++;
1365 if ( 0 ) {
1366 extern void Extra_PrintHexadecimal( FILE * pFile, unsigned Sign[], int nVars );
1367 printf( "Type%d : ", i );
1368 Extra_PrintHexadecimal( stdout, (unsigned *)pTruth2, nVars );
1369 printf( "\n" );
1370 }
1371 }
1372 Vec_WrdShrink ( vSims, k * nWords );
1373 return nVars;
1374}
1376{
1377 Vec_Wec_t * vCuts; int i;
1378 printf( "Nodes with matching cuts:\n" );
1379 Vec_PtrForEachEntry( Vec_Wec_t *, p, vCuts, i ) {
1380 if ( fVerbose ) {
1381 printf( "Type %d:\n", i );
1382 Vec_WecPrint( vCuts, 0 );
1383 }
1384 else
1385 printf( "Type %d present in %d cuts\n", i, Vec_WecSize(vCuts) );
1386 }
1387}
1389{
1390 Vec_Wec_t * vCuts; int i;
1391 Vec_PtrForEachEntry( Vec_Wec_t *, p, vCuts, i )
1392 Vec_WecFree( vCuts );
1393 Vec_PtrFree( p );
1394}
1395void Gia_ManMatchConesOutput( Gia_Man_t * pBig, Gia_Man_t * pSmall, int nCutNum, int fVerbose )
1396{
1397 abctime clkStart = Abc_Clock();
1398 extern Vec_Mem_t * Dau_CollectNpnFunctionsArray( Vec_Wrd_t * vFuncs, int nVars, Vec_Int_t ** pvMap, int fVerbose );
1399 Vec_Wrd_t * vSimsPi = Vec_WrdStartTruthTables( Gia_ManCiNum(pSmall) );
1400 Vec_Wrd_t * vSims = Gia_ManSimPatSimOut( pSmall, vSimsPi, 1 );
1401 int nVars = Gia_ManMatchConesMinimizeTts( vSims, Gia_ManCiNum(pSmall) );
1402 Vec_WrdFree( vSimsPi );
1403 if ( nVars > 10 ) {
1404 printf( "Some output functions have support size more than 10.\n" );
1405 Vec_WrdFree( vSims );
1406 return;
1407 }
1408 Vec_Int_t * vMap = NULL;
1409 Vec_Mem_t * vTtMem = Dau_CollectNpnFunctionsArray( vSims, nVars, &vMap, fVerbose );
1410 int nFuncs = Vec_WrdSize(vSims) / Abc_Truth6WordNum(nVars);
1411 assert( Vec_WrdSize(vSims) == nFuncs * Abc_Truth6WordNum(nVars) );
1412 Vec_WrdFree( vSims );
1413 printf( "Using %d output functions with the support size between 3 and %d.\n", nFuncs, nVars );
1414 Vec_Ptr_t * vRes = Gia_ManMatchCutsMany( vTtMem, vMap, nFuncs, pBig, nVars, nCutNum, fVerbose );
1415 Vec_MemHashFree( vTtMem );
1416 Vec_MemFree( vTtMem );
1417 Vec_IntFree( vMap );
1418 Gia_ManMatchConesOutputPrint( vRes, fVerbose );
1420 Abc_PrintTime( 1, "Total computation time", Abc_Clock() - clkStart );
1421}
1422
1426
1427
1429
int nWords
Definition abcNpn.c:127
#define ABC_SWAP(Type, a, b)
Definition abc_global.h:253
ABC_INT64_T abctime
Definition abc_global.h:332
int * Abc_MergeSortCost(int *pCosts, int nSize)
Definition utilSort.c:442
#define ABC_INFINITY
MACRO DEFINITIONS ///.
Definition abc_global.h:250
unsigned Abc_Random(int fReset)
Definition utilSort.c:1004
#define ABC_CALLOC(type, num)
Definition abc_global.h:265
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
void Dau_CanonicizeArray(Vec_Wrd_t *vFuncs, int nVars, int fVerbose)
Definition dauNpn.c:957
Vec_Mem_t * Dau_CollectNpnFunctionsArray(Vec_Wrd_t *vFuncs, int nVars, Vec_Int_t **pvMap, int fVerbose)
Definition dauNpn.c:873
void Dau_DsdPrintFromTruth(word *pTruth, int nVarsInit)
Definition dauDsd.c:1968
Cube * p
Definition exorList.c:222
void Extra_PrintHexadecimal(FILE *pFile, unsigned Sign[], int nVars)
void Gia_ManDumpCuts(Gia_Man_t *p, int nCutSize, int nCutNum, int fVerbose)
Definition giaCut.c:1182
Vec_Int_t * Gia_ManCountNpnClasses(Vec_Mem_t *vTtMem, Vec_Int_t *vMap, int nClasses, Vec_Wrd_t *vOrig)
Definition giaCut.c:1236
Vec_Wec_t * Gia_ManFilterCuts(Gia_Man_t *pGia, Vec_Wec_t *vStore, int nCutSize, int nCuts)
Definition giaCut.c:827
Vec_Ptr_t * Gia_ManMatchCutsMany(Vec_Mem_t *vTtMem, Vec_Int_t *vMap, int nFuncs, Gia_Man_t *pGia, int nCutSize, int nCutNum, int fVerbose)
Definition giaCut.c:1137
void Gia_StoComputeCutsConst0(Gia_Sto_t *p, int iObj)
Definition giaCut.c:597
void Gia_ManMatchConesOutputFree(Vec_Ptr_t *p)
Definition giaCut.c:1388
#define Sdb_ForEachCut(pList, pCut, i)
Definition giaCut.c:75
void Gia_StoCutPrint(int *pCut)
Definition giaCut.c:811
Vec_Wec_t * Gia_ManSelectCuts(Vec_Wec_t *vCuts, int nCuts, int nCutSizeMin)
Definition giaCut.c:688
Gia_Sto_t * Gia_ManMatchCutsInt(Gia_Man_t *pGia, int nCutSize0, int nCutNum0, int fVerbose0)
Definition giaCut.c:1030
#define GIA_CUT_NO_LEAF
Definition giaCut.c:36
Vec_Wrd_t * Gia_ManMatchFilterClasses(Vec_Mem_t *vTtMem, Vec_Int_t *vMap, Vec_Int_t *vClassCounts, int nNumFuncs, int fVerbose)
Definition giaCut.c:1252
void Gia_ManExtractTest(Gia_Man_t *pGia)
Definition giaCut.c:787
Vec_Wrd_t * Gia_ManCollectCutFuncs(Gia_Man_t *p, int nCutSize, int nCutNum, int fVerbose)
Definition giaCut.c:1222
void Gia_StoFree(Gia_Sto_t *p)
Definition giaCut.c:587
void Gia_ManCreateWins(Gia_Man_t *pGia, Vec_Wec_t *vCuts)
Definition giaCut.c:735
Vec_Wrd_t * Gia_ManGenSims(Gia_Man_t *pGia)
Definition giaCut.c:894
void Gia_StoPrintCuts(Vec_Int_t *vThis, int iObj, int nCutSize)
Definition giaCut.c:819
void Gia_ManExploreCutsTest(Gia_Man_t *pGia, int nCutSize0, int nCuts0, int fVerbose0)
Definition giaCut.c:1011
void Gia_ManMatchConesOutput(Gia_Man_t *pBig, Gia_Man_t *pSmall, int nCutNum, int fVerbose)
Definition giaCut.c:1395
void Gia_StoComputeCutsCi(Gia_Sto_t *p, int iObj)
Definition giaCut.c:601
struct Gia_Cut_t_ Gia_Cut_t
Definition giaCut.c:38
#define GIA_MAX_CUTNUM
Definition giaCut.c:33
void Gia_StoComputeCuts(Gia_Man_t *pGia)
Definition giaCut.c:622
void Gia_ManMatchProfileFunctions(Vec_Wrd_t *vBestReprs, Vec_Mem_t *vTtMem, Vec_Int_t *vMap, Vec_Wrd_t *vFuncs, int nCutSize)
Definition giaCut.c:1278
Vec_Ptr_t * Gia_ManMatchCutsArray(Vec_Ptr_t *vTtMems, Gia_Man_t *pGia, int nCutSize, int nCutNum, int fVerbose)
Definition giaCut.c:1101
int Gia_ManCollectCutDivs(Gia_Man_t *p, Vec_Int_t *vIns)
Definition giaCut.c:920
int Gia_ManFindSatDcs(Gia_Man_t *pGia, Vec_Wrd_t *vSims, Vec_Int_t *vLevel)
Definition giaCut.c:902
void Gia_ManMatchCuts(Vec_Mem_t *vTtMem, Gia_Man_t *pGia, int nCutSize, int nCutNum, int fVerbose)
Definition giaCut.c:1066
int Gia_StoSelectOneCut(Vec_Wec_t *vCuts, int iObj, Vec_Int_t *vCut, int nCutSizeMin)
Definition giaCut.c:671
int Gia_ManCountRefs(Gia_Man_t *pGia, Vec_Int_t *vLevel)
Definition giaCut.c:887
#define GIA_MAX_CUTSIZE
DECLARATIONS ///.
Definition giaCut.c:32
struct Gia_Sto_t_ Gia_Sto_t
Definition giaCut.c:51
#define GIA_MAX_TT_WORDS
Definition giaCut.c:34
void Gia_StoComputeCutsNode(Gia_Sto_t *p, int iObj)
Definition giaCut.c:605
Vec_Wec_t * Gia_ManExtractCuts(Gia_Man_t *pGia, int nCutSize0, int nCuts0, int fVerbose0)
Definition giaCut.c:696
Vec_Wec_t * Gia_ManExploreCuts(Gia_Man_t *pGia, int nCutSize0, int nCuts0, int fVerbose0)
Definition giaCut.c:971
void Gia_StoRefObj(Gia_Sto_t *p, int iObj)
Definition giaCut.c:609
void Gia_ManConsiderCuts(Gia_Man_t *pGia, Vec_Wec_t *vCuts)
Definition giaCut.c:950
int Gia_ManMatchConesMinimizeTts(Vec_Wrd_t *vSims, int nVarsMax)
Definition giaCut.c:1344
void Gia_ManPrintWinStats(Vec_Wec_t *vCuts)
Definition giaCut.c:776
void Gia_StoMergeCuts(Gia_Sto_t *p, int iObj)
Definition giaCut.c:500
Gia_Sto_t * Gia_StoAlloc(Gia_Man_t *pGia, int nCutSize, int nCutNum, int fCutMin, int fTruthMin, int fVerbose)
Definition giaCut.c:568
void Gia_ManMatchConesOutputPrint(Vec_Ptr_t *p, int fVerbose)
Definition giaCut.c:1375
void Gia_ManPrintWins(Vec_Wec_t *vCuts)
Definition giaCut.c:759
void Gia_ManMatchCones(Gia_Man_t *pBig, Gia_Man_t *pSmall, int nCutSize, int nCutNum, int nNumFuncs, int nNumCones, int fVerbose)
Definition giaCut.c:1297
Vec_Wec_t * Gia_ManExtractCuts2(Gia_Man_t *p, int nCutSize, int nCuts, int fVerbose)
Definition giaResub2.c:1523
void Gia_ManStop(Gia_Man_t *p)
Definition giaMan.c:82
Vec_Wrd_t * Gia_ManSimPatSimOut(Gia_Man_t *pGia, Vec_Wrd_t *vSimsPi, int fOuts)
Definition giaSimBase.c:138
#define Gia_ManForEachAnd(p, pObj, i)
Definition gia.h:1214
struct Gia_Obj_t_ Gia_Obj_t
Definition gia.h:76
struct Gia_Man_t_ Gia_Man_t
Definition gia.h:96
Vec_Wrd_t * Gia_ManSimPatSim(Gia_Man_t *p)
Definition giaSimBase.c:125
#define Gia_ManForEachObjVec(vVec, p, pObj, i)
Definition gia.h:1194
Gia_Man_t * Gia_ManDupCones(Gia_Man_t *p, int *pPos, int nPos, int fTrimPis)
Definition giaDup.c:3880
void Gia_ManCreateRefs(Gia_Man_t *p)
Definition giaUtil.c:779
void Gia_ManIncrementTravId(Gia_Man_t *p)
Definition giaUtil.c:190
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
Definition gia.h:1190
#define Gia_ManForEachCo(p, pObj, i)
Definition gia.h:1236
#define Gia_ManForEachCiId(p, Id, i)
Definition gia.h:1230
unsigned __int64 word
DECLARATIONS ///.
Definition kitPerm.c:36
unsigned nLeaves
Definition giaCut.c:46
int Cost
Definition giaCut.c:43
word Sign
Definition giaCut.c:41
int CostLev
Definition giaCut.c:44
float CostF
Definition giaCut.c:48
int iFunc
Definition giaCut.c:42
int pLeaves[GIA_MAX_CUTSIZE]
Definition giaCut.c:47
unsigned nTreeLeaves
Definition giaCut.c:45
Vec_Wrd_t * vSimsPi
Definition gia.h:215
Vec_Mem_t * vTtMem
Definition giaCut.c:62
Gia_Cut_t pCuts[3][GIA_MAX_CUTNUM]
Definition giaCut.c:63
double CutCount[4]
Definition giaCut.c:69
int fVerbose
Definition giaCut.c:58
int nCutsR
Definition giaCut.c:65
int nCutNum
Definition giaCut.c:55
int nCutsOver
Definition giaCut.c:68
Gia_Man_t * pGia
Definition giaCut.c:59
int fTruthMin
Definition giaCut.c:57
Vec_Int_t * vRefs
Definition giaCut.c:60
Vec_Wec_t * vCuts
Definition giaCut.c:61
int fCutMin
Definition giaCut.c:56
int Pivot
Definition giaCut.c:66
int nCutSize
Definition giaCut.c:54
Gia_Cut_t * ppCuts[GIA_MAX_CUTNUM]
Definition giaCut.c:64
int iCutBest
Definition giaCut.c:67
abctime clkStart
Definition giaCut.c:70
typedefABC_NAMESPACE_IMPL_START struct Vec_Mem_t_ Vec_Mem_t
DECLARATIONS ///.
Definition utilMem.c:35
#define assert(ex)
Definition util_old.h:213
char * memmove()
struct Hsh_VecMan_t_ Hsh_VecMan_t
Definition vecHsh.h:85
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
#define Vec_IntForEachEntryStartStop(vVec, Entry, i, Start, Stop)
Definition vecInt.h:60
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
Definition vecInt.h:56
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
Definition vecPtr.h:42
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
Definition vecPtr.h:55
#define Vec_WecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
Definition vecWec.h:55
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.
Definition vecWec.h:42
#define Vec_WecForEachLevelStop(vGlob, vVec, i, LevelStop)
Definition vecWec.h:61
#define Vec_WrdForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecWrd.h:54
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.
Definition vecWrd.h:42