/**Function************************************************************* Synopsis [Reads the library file.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Map_LibraryReadFile( Map_SuperLib_t * pLib, FILE * pFile ) { ProgressBar * pProgress; char pBuffer[5000]; FILE * pFileGen; Map_Super_t * pGate; char * pTemp = NULL; // Suppress "might be used uninitialized" char * pLibName; int nCounter, nGatesTotal; unsigned uCanon[2]; int RetValue; // skip empty and comment lines while ( fgets( pBuffer, 2000, pFile ) != NULL ) { // skip leading spaces for ( pTemp = pBuffer; *pTemp == ' ' || *pTemp == '\r' || *pTemp == '\n'; pTemp++ ); // skip comment lines and empty lines if ( *pTemp != 0 && *pTemp != '#' ) break; } // get the genlib file name pLibName = strtok( pTemp, " \t\r\n" ); if ( strcmp( pLibName, "GATE" ) == 0 ) { printf( "The input file \"%s\" looks like a genlib file and not a supergate library file.\n", pLib->pName ); return 0; } pFileGen = fopen( pLibName, "r" ); if ( pFileGen == NULL ) { printf( "Cannot open the genlib file \"%s\".\n", pLibName ); return 0; } fclose( pFileGen ); // read the genlib library pLib->pGenlib = Mio_LibraryRead( pLibName, NULL, 0, 0 ); if ( pLib->pGenlib == NULL ) { printf( "Cannot read genlib file \"%s\".\n", pLibName ); return 0; } // read the number of variables RetValue = fscanf( pFile, "%d\n", &pLib->nVarsMax ); if ( pLib->nVarsMax < 2 || pLib->nVarsMax > 10 ) { printf( "Suspicious number of variables (%d).\n", pLib->nVarsMax ); return 0; } // read the number of gates RetValue = fscanf( pFile, "%d\n", &nGatesTotal ); if ( nGatesTotal < 1 || nGatesTotal > 10000000 ) { printf( "Suspicious number of gates (%d).\n", nGatesTotal ); return 0; } // read the lines nCounter = 0; pProgress = Extra_ProgressBarStart( stdout, nGatesTotal ); while ( fgets( pBuffer, 5000, pFile ) != NULL ) { for ( pTemp = pBuffer; *pTemp == ' ' || *pTemp == '\r' || *pTemp == '\n'; pTemp++ ); if ( pTemp[0] == '\0' ) continue; // get the gate pGate = Map_LibraryReadGate( pLib, pTemp, pLib->nVarsMax ); assert( pGate->Num == nCounter + 1 ); // count the number of parentheses in the formula - this is the number of gates for ( pTemp = pGate->pFormula; *pTemp; pTemp++ ) pGate->nGates += (*pTemp == '('); // verify the truth table assert( Map_LibraryTruthVerify(pLib, pGate) ); // find the N-canonical form of this supergate pGate->nPhases = Map_CanonComputeSlow( pLib->uTruths, pLib->nVarsMax, pLib->nVarsMax, pGate->uTruth, pGate->uPhases, uCanon ); // add the supergate into the table by its N-canonical table Map_SuperTableInsertC( pLib->tTableC, uCanon, pGate ); // update the progress bar Extra_ProgressBarUpdate( pProgress, ++nCounter, NULL ); } Extra_ProgressBarStop( pProgress ); pLib->nSupersAll = nCounter; if ( nCounter != nGatesTotal ) printf( "The number of gates read (%d) is different what the file says (%d).\n", nGatesTotal, nCounter ); return 1; }
/**Function************************************************************* Synopsis [Derives the truth table for one cut.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Map_TruthsCut( Map_Man_t * p, Map_Cut_t * pCut ) { // unsigned uCanon1, uCanon2; unsigned uTruth[2], uCanon[2]; unsigned char uPhases[16]; unsigned * uCanon2; char * pPhases2; int fUseFast = 1; int fUseSlow = 0; int fUseRec = 0; // this does not work for Solaris extern int Map_CanonCompute( int nVarsMax, int nVarsReal, unsigned * pt, unsigned ** pptRes, char ** ppfRes ); // generally speaking, 1-input cut can be matched into a wire! if ( pCut->nLeaves == 1 ) return; /* if ( p->nVarsMax == 5 ) { uTruth[0] = pCut->uTruth; uTruth[1] = pCut->uTruth; } else */ Map_TruthsCutOne( p, pCut, uTruth ); // compute the canonical form for the positive phase if ( fUseFast ) Map_CanonComputeFast( p, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); else if ( fUseSlow ) Map_CanonComputeSlow( p->uTruths, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); else if ( fUseRec ) { // Map_CanonComputeSlow( p->uTruths, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); Extra_TruthCanonFastN( p->nVarsMax, pCut->nLeaves, uTruth, &uCanon2, &pPhases2 ); /* if ( uCanon[0] != uCanon2[0] || uPhases[0] != pPhases2[0] ) { int k = 0; Map_CanonCompute( p->nVarsMax, pCut->nLeaves, uTruth, &uCanon2, &pPhases2 ); } */ uCanon[0] = uCanon2[0]; uCanon[1] = (p->nVarsMax == 6)? uCanon2[1] : uCanon2[0]; uPhases[0] = pPhases2[0]; } else Map_CanonComputeSlow( p->uTruths, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); pCut->M[1].pSupers = Map_SuperTableLookupC( p->pSuperLib, uCanon ); pCut->M[1].uPhase = uPhases[0]; p->nCanons++; //uCanon1 = uCanon[0] & 0xFFFF; // compute the canonical form for the negative phase uTruth[0] = ~uTruth[0]; uTruth[1] = ~uTruth[1]; if ( fUseFast ) Map_CanonComputeFast( p, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); else if ( fUseSlow ) Map_CanonComputeSlow( p->uTruths, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); else if ( fUseRec ) { // Map_CanonComputeSlow( p->uTruths, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); Extra_TruthCanonFastN( p->nVarsMax, pCut->nLeaves, uTruth, &uCanon2, &pPhases2 ); /* if ( uCanon[0] != uCanon2[0] || uPhases[0] != pPhases2[0] ) { int k = 0; Map_CanonCompute( p->nVarsMax, pCut->nLeaves, uTruth, &uCanon2, &pPhases2 ); } */ uCanon[0] = uCanon2[0]; uCanon[1] = (p->nVarsMax == 6)? uCanon2[1] : uCanon2[0]; uPhases[0] = pPhases2[0]; } else Map_CanonComputeSlow( p->uTruths, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); pCut->M[0].pSupers = Map_SuperTableLookupC( p->pSuperLib, uCanon ); pCut->M[0].uPhase = uPhases[0]; p->nCanons++; //uCanon2 = uCanon[0] & 0xFFFF; //assert( p->nVarsMax == 4 ); //Rwt_Man4ExploreCount( uCanon1 < uCanon2 ? uCanon1 : uCanon2 ); // restore the truth table uTruth[0] = ~uTruth[0]; uTruth[1] = ~uTruth[1]; }