191 int g, v, Value, BestPlace = nGroups ? pLast[nGroups - 1] : -1;
193 Abc_TtCopy( pBest, pTruth,
nWords, 0 );
194 for ( g = nGroups - 1; g >= 0; g-- )
196 int Limit = g ? pLast[g-1] : -1;
197 for ( v = pLast[g]; v > Limit; v-- )
199 Abc_TtSwapAdjacent( pTruth,
nWords, v+0 );
202 Abc_TtSwapAdjacent( pTruth,
nWords, v+1 );
203 Abc_TtSwapAdjacent( pTruth,
nWords, v+2 );
208 Abc_TtCopy( pBest, pTruth,
nWords, 0 );
216 Gem_Obj_t * pNew =
p->pObjs +
p->nObjs, * pObj =
p->pObjs + f;
217 word * pTruth = Vec_MemReadEntry(
p->vTtMem, f );
218 word * pResult =
p->pTtElems[
p->nVars];
219 word * pCofs[2] = {
p->pTtElems[
p->nVars+2],
p->pTtElems[
p->nVars+3] };
221 char pCanonPermC[16];
222 assert( i < (
int)pObj->nVars );
223 assert( (
int)pObj->nVars + 2 <=
p->nVars );
224 Abc_TtCopy( pResult, pTruth,
p->nWords, 0 );
226 for ( v = i; v < (int)pObj->nVars-1; v++ )
227 Abc_TtSwapAdjacent( pResult,
p->nWords, v );
229 assert( v == (
int)pObj->nVars-1 );
230 Abc_TtCofactor0p( pCofs[0], pResult,
p->nWords, v );
231 Abc_TtCofactor1p( pCofs[1], pResult,
p->nWords, v );
232 Abc_TtMaj( pResult,
p->pTtElems[v],
p->pTtElems[v+1],
p->pTtElems[v+2],
p->nWords );
233 Abc_TtMux( pResult, pResult, pCofs[1], pCofs[0],
p->nWords );
237 Abc_TtStretch6( pResult, Abc_MaxInt(6, pObj->nVars+2),
p->nVars );
239 iFunc = Vec_MemHashInsert(
p->vTtMem, pResult );
240 if ( iFunc < p->nObjs )
243 pNew->
nVars = pObj->nVars + 2;
244 pNew->
nNodes = pObj->nNodes + 1;
251 if ( ++
p->nObjs ==
p->nObjsAlloc )
289 Gem_Obj_t * pNew =
p->pObjs +
p->nObjs, * pObj =
p->pObjs + f;
290 word * pTruth = Vec_MemReadEntry(
p->vTtMem, f );
291 word * pResult =
p->pTtElems[
p->nVars];
292 word * pCofs[2] = {
p->pTtElems[
p->nVars+2],
p->pTtElems[
p->nVars+3] };
294 char pCanonPermC[16];
295 assert( i < j && j < 16 );
296 Abc_TtCopy( pResult, pTruth,
p->nWords, 0 );
298 for ( v = j; v < (int)pObj->nVars-1; v++ )
299 Abc_TtSwapAdjacent( pResult,
p->nWords, v );
300 assert( v == (
int)pObj->nVars-1 );
302 for ( v = i; v < (int)pObj->nVars-2; v++ )
303 Abc_TtSwapAdjacent( pResult,
p->nWords, v );
304 assert( v == (
int)pObj->nVars-2 );
306 Abc_TtCofactor0p( pCofs[0], pResult,
p->nWords, v+1 );
307 Abc_TtCofactor1p( pCofs[1], pResult,
p->nWords, v+1 );
308 Abc_TtCofactor0( pCofs[0],
p->nWords, v );
309 Abc_TtCofactor1( pCofs[1],
p->nWords, v );
310 Abc_TtMux( pResult,
p->pTtElems[v], pCofs[1], pCofs[0],
p->nWords );
314 Abc_TtStretch6( pResult, Abc_MaxInt(6, pObj->nVars-1),
p->nVars );
316 iFunc = Vec_MemHashInsert(
p->vTtMem, pResult );
317 if ( iFunc < p->nObjs )
320 pNew->
nVars = pObj->nVars - 1;
321 pNew->
nNodes = pObj->nNodes;
329 if ( ++
p->nObjs ==
p->nObjsAlloc )
349 int v, f, i, j, nObjsStop = 1;
350 for ( v = 1; v <= nVars-2; v++ )
353 int nObjsStopPrev = nObjsStop;
354 nObjsStop =
p->nObjs;
355 printf(
"Expanding var %2d (functions = %10d) ", v,
p->nObjs );
356 Abc_PrintTime( 0,
"Time", Abc_Clock() - clk );
357 for ( f = 0; f < nObjsStop; f++ )
358 if ( v == (
int)
p->pObjs[f].nVars || (v > (
int)
p->pObjs[f].nVars && f >= nObjsStopPrev) )
359 for ( i = 0; i < v; i++ )
360 if ( (
int)
p->pObjs[f].Groups & (1 << i) )
363 printf(
"Connecting var %2d (functions = %10d) ", v,
p->nObjs );
364 Abc_PrintTime( 0,
"Time", Abc_Clock() - clk );
365 for ( f = nObjsStop; f <
p->nObjs; f++ )
366 for ( i = 0; i < (int)
p->pObjs[f].nVars; i++ )
367 if ( (
int)
p->pObjs[f].Groups & (1 << i) )
368 for ( j = i+1; j < (int)
p->pObjs[f].nVars; j++ )
369 if ( (
int)
p->pObjs[f].Groups & (1 << j) )
373 printf(
"Finished (functions = %10d) ",
p->nObjs );
374 Abc_PrintTime( 0,
"Time", Abc_Clock() - clk );
375 if ( fDump ) Vec_MemDumpTruthTables(
p->vTtMem,
"enum", nVars );