167 static int s_FPrimes[128] = {
168 1009, 1049, 1093, 1151, 1201, 1249, 1297, 1361, 1427, 1459,
169 1499, 1559, 1607, 1657, 1709, 1759, 1823, 1877, 1933, 1997,
170 2039, 2089, 2141, 2213, 2269, 2311, 2371, 2411, 2467, 2543,
171 2609, 2663, 2699, 2741, 2797, 2851, 2909, 2969, 3037, 3089,
172 3169, 3221, 3299, 3331, 3389, 3461, 3517, 3557, 3613, 3671,
173 3719, 3779, 3847, 3907, 3943, 4013, 4073, 4129, 4201, 4243,
174 4289, 4363, 4441, 4493, 4549, 4621, 4663, 4729, 4793, 4871,
175 4933, 4973, 5021, 5087, 5153, 5227, 5281, 5351, 5417, 5471,
176 5519, 5573, 5651, 5693, 5749, 5821, 5861, 5923, 6011, 6073,
177 6131, 6199, 6257, 6301, 6353, 6397, 6481, 6563, 6619, 6689,
178 6737, 6803, 6863, 6917, 6977, 7027, 7109, 7187, 7237, 7309,
179 7393, 7477, 7523, 7561, 7607, 7681, 7727, 7817, 7877, 7933,
180 8011, 8039, 8059, 8081, 8093, 8111, 8123, 8147
185 for ( i = 0; i < nWordsSim; i++ )
186 uHash ^= pState[i] * s_FPrimes[i & 0x7F];
187 return uHash % nTableSize;
452 unsigned * pSimInfo, * piPlace, uOutput = 0;
453 int i, k, iCond, nMints, iNextState;
459 iCond = Gia_ManOutputAsserted(
p, pObj );
468 nMints = (1 << Gia_ManPiNum(
p->pAig));
469 for ( k = 0; k < nMints; k++ )
471 if (
p->pStateNew == NULL )
473 p->pStateNew->pData[
p->nWordsDat-1] = 0;
476 pSimInfo = Gia_ManEraData(
p, Gia_ObjId(
p->pAig, pObj) );
477 if ( Abc_InfoHasBit(
p->pStateNew->pData, i) != Abc_InfoHasBit(pSimInfo, k) )
478 Abc_InfoXorBit(
p->pStateNew->pData, i );
485 pSimInfo = Gia_ManEraData(
p, Gia_ObjId(
p->pAig, pObj) );
486 if ( Abc_InfoHasBit(pSimInfo, k) && i < 32 )
487 Abc_InfoXorBit( &uOutput, i );
490 piPlace = Gia_ManEraHashFind(
p,
p->pStateNew, &iNextState );
491 if ( fStgDump ) Vec_IntPush(
p->vStgDump, k );
492 if ( fStgDump ) Vec_IntPush(
p->vStgDump, pState->Num );
493 if ( piPlace == NULL )
495 if ( fStgDump ) Vec_IntPush(
p->vStgDump, iNextState );
496 if ( fStgDump ) Vec_IntPush(
p->vStgDump, uOutput );
499 if ( fStgDump ) Vec_IntPush(
p->vStgDump,
p->pStateNew->Num );
500 if ( fStgDump ) Vec_IntPush(
p->vStgDump, uOutput );
504 *piPlace =
p->pStateNew->Num;
505 p->pStateNew->Cond = k;
506 p->pStateNew->iPrev = pState->Num;
507 p->pStateNew->iNext = 0;
510 if ( Vec_PtrSize(
p->vStates) > 2 *
p->nBins )
534 assert( Gia_ManPiNum(pAig) <= 12 );
535 assert( Gia_ManRegNum(pAig) > 0 );
542 memset( pState->pData, 0,
sizeof(
unsigned) *
p->nWordsDat );
544 p->pBins[ Hash ] = pState->Num;
546 while (
p->iCurState < Vec_PtrSize(
p->vStates ) - 1 )
548 if ( Vec_PtrSize(
p->vStates) >= nStatesMax )
550 printf(
"Reached the limit on states traversed (%d). ", nStatesMax );
554 pState = Gia_ManEraState(
p, ++
p->iCurState );
555 if (
p->iCurState > 1 && pState->iPrev == 0 )
564 printf(
"Miter failed in state %d after %d transitions. ",
565 p->iCurState, Vec_IntSize(
p->vBugTrace)-1 );
568 if ( fVerbose &&
p->iCurState % 5000 == 0 )
570 printf(
"States =%10d. Reached =%10d. R = %5.3f. Depth =%6d. Mem =%9.2f MB. ",
572 (1.0/(1<<20))*(1.0*Vec_PtrSize(
p->vStates)*(
sizeof(
Gia_ObjEra_t) +
sizeof(
unsigned) *
p->nWordsDat) +
573 1.0*
p->nBins*
sizeof(
unsigned) + 1.0*
p->vStates->nCap *
sizeof(
void*)) );
574 ABC_PRT(
"Time", Abc_Clock() - clk );
577 printf(
"Reachability analysis traversed %d states with depth %d. ",
p->iCurState-1,
Gia_ManCountDepth(
p) );
578 ABC_PRT(
"Time", Abc_Clock() - clk );
581 char * pFileName =
"test.stg";
582 FILE * pFile = fopen( pFileName,
"wb" );
584 printf(
"Cannot open file \"%s\" for writing.\n", pFileName );
587 Gia_ManStgPrint( pFile,
p->vStgDump, Gia_ManPiNum(pAig), Gia_ManPoNum(pAig),
p->iCurState-1 );
589 printf(
"Extracted STG was written into file \"%s\".\n", pFileName );