58 unsigned i, iLitFanin, uSupport, uSuppCur;
61 pObj = Kit_DsdNtkObj(
p, Abc_Lit2Var(iLit) );
63 return (1 << Abc_Lit2Var(iLit));
66 unsigned uSupps[16], Limit, s;
71 uSupport |= uSupps[i];
74 Limit = (1 << pObj->
nFans) - 1;
75 for ( s = 1; s < Limit; s++ )
78 for ( i = 0; i < pObj->
nFans; i++ )
80 uSuppCur |= uSupps[i];
81 Vec_IntPush( vSets, uSuppCur );
92 Vec_IntPush( vSets, uSuppCur );
110 unsigned uSupport, Entry;
113 Vec_IntClear( vSets );
114 Vec_IntPush( vSets, 0 );
119 uSupport = ( 1 << Abc_Lit2Var(Kit_DsdNtkRoot(
p)->pFans[0]) );
120 Vec_IntPush( vSets, uSupport );
124 assert( (uSupport & 0xFFFF0000) == 0 );
125 Vec_IntPush( vSets, uSupport );
130 Vec_IntWriteEntry( vSets, i, Entry | ((uSupport & ~Entry) << 16) );
190 Lpk_Set_t * pStore,
int * pSize,
int nSizeLimit )
192 static int nTravId = 0;
193 static int TravId[1<<16] = {0};
194 static char SRed[1<<16];
195 static char Over[1<<16];
196 static unsigned Parents[1<<16];
197 static unsigned short Used[1<<16];
198 int nSuppSize, nSuppOver, nSuppRed, nUsed, nMinOver, i, k, s;
199 unsigned Entry, Entry0, Entry1;
200 unsigned uSupp, uSupp0, uSupp1, uSuppTotal;
203 if ( nTravId == (1 << 30) )
204 memset( TravId, 0,
sizeof(
int) * (1 << 16) );
209 uSuppTotal = Kit_BitMask(nVars) & ~(1<<iCofVar);
213 uSupp0 = (Entry0 & 0xFFFF);
214 uSupp1 = (Entry1 & 0xFFFF);
216 if ( uSupp0 == 0 || uSupp1 == 0 || (uSupp0 | uSupp1) == uSuppTotal )
218 if ( Kit_WordHasOneBit(uSupp0) && Kit_WordHasOneBit(uSupp1) )
221 Entry = Entry0 | Entry1;
222 uSupp = Entry & 0xFFFF;
224 nSuppSize = Kit_WordCountOnes( uSupp );
226 nSuppOver = Kit_WordCountOnes( Entry & (Entry >> 16) );
228 nSuppRed = nSuppSize - 1 - nSuppOver;
233 if ( TravId[uSupp] < nTravId )
235 Used[nUsed++] = uSupp;
237 TravId[uSupp] = nTravId;
238 SRed[uSupp] = nSuppRed;
239 Over[uSupp] = nSuppOver;
240 Parents[uSupp] = (k << 16) | i;
242 else if ( TravId[uSupp] == nTravId && SRed[uSupp] < nSuppRed )
244 TravId[uSupp] = nTravId;
245 SRed[uSupp] = nSuppRed;
246 Over[uSupp] = nSuppOver;
247 Parents[uSupp] = (k << 16) | i;
253 for ( s = 0; s < nUsed; s++ )
254 if ( nMinOver > Over[Used[s]] )
255 nMinOver = Over[Used[s]];
259 for ( s = 0; s < nUsed; s++ )
260 if ( Over[Used[s]] == nMinOver )
263 if ( *pSize == nSizeLimit )
265 pEntry = pStore + (*pSize)++;
267 i = Parents[Used[s]] & 0xFFFF;
268 k = Parents[Used[s]] >> 16;
270 pEntry->uSubset0 = Vec_IntEntry(vSets0, i);
271 pEntry->uSubset1 = Vec_IntEntry(vSets1, k);
272 Entry = pEntry->uSubset0 | pEntry->uSubset1;
275 pEntry->iVar = iCofVar;
277 pEntry->Size = Kit_WordCountOnes( Entry & 0xFFFF );
279 pEntry->Over = Kit_WordCountOnes( Entry & (Entry >> 16) );
281 pEntry->SRed = pEntry->Size - 1 - pEntry->Over;
282 assert( pEntry->SRed > 0 );
325 static int nStoreSize = 256;
326 static Lpk_Set_t pStore[256], * pSet, * pSetBest;
330 unsigned * pCof0 = (
unsigned *)Vec_PtrEntry(
p->vTtNodes, 0 );
331 unsigned * pCof1 = (
unsigned *)Vec_PtrEntry(
p->vTtNodes, 1 );
332 int nSets, i, SizeMax;
334 int fVerbose =
p->pPars->fVeryVerbose;
340 printf(
"\nExploring support-reducing bound-sets of function:\n" );
344 for ( i = 0; i < nVars; i++ )
347 printf(
"Evaluating variable %c:\n",
'a'+i );
365 Lpk_PrintSets( vSets0 );
367 Lpk_PrintSets( vSets1 );
372 Lpk_ComposeSets( vSets0, vSets1, nVars, i, pStore, &nSets, nStoreSize );
379 for ( i = 0; i < nSets; i++ )
385 for ( i = 0; i < nSets; i++ )
388 if ( pSet->Size >
p->pPars->nLutSize - 1 )
390 if ( SizeMax < pSet->Size )
393 SizeMax = pSet->Size;
412 if ( pSetBest == NULL )
415 printf(
"Could not select a subset.\n" );
421 printf(
"Selected the following subset:\n" );
428 Entry = ((pSetBest->uSubset0 >> 16) | (pSetBest->uSubset1 >> 16));
430 Entry = Kit_BitMask(nVars) & ~(1<<pSetBest->iVar) & ~Entry;
434 *piVarReused = Kit_WordFindFirstBit( Entry );
435 *piVar = pSetBest->iVar;
436 return (pSetBest->uSubset1 << 16) | (pSetBest->uSubset0 & 0xFFFF);
void Lpk_ComposeSets(Vec_Int_t *vSets0, Vec_Int_t *vSets1, int nVars, int iCofVar, Lpk_Set_t *pStore, int *pSize, int nSizeLimit)