int nCount1, nCount2; assert( Abc_NtkIsNetlist(pNtk) ); assert( Abc_NtkHasBlifMv(pNtk) ); assert( Abc_NtkWhiteboxNum(pNtk) == 0 ); assert( Abc_NtkBlackboxNum(pNtk) == 0 ); // get the largest number of values nValuesMax = 2; Abc_NtkForEachNet( pNtk, pObj, i ) { nValues = Abc_ObjMvVarNum(pObj); if ( nValuesMax < nValues ) nValuesMax = nValues; } nBits = Extra_Base2Log( nValuesMax ); pBits = ABC_ALLOC( Abc_Obj_t *, nBits ); // clean the node copy fields Abc_NtkCleanCopy( pNtk ); // collect the nodes vNodes = Abc_NtkDfs( pNtk, 0 ); // start the network pNtkNew = Abc_NtkAlloc( ABC_NTK_STRASH, ABC_FUNC_AIG, 1 ); // duplicate the name and the spec pNtkNew->pName = Extra_UtilStrsav( pNtk->pName ); // pNtkNew->pSpec = Extra_UtilStrsav( pNtk->pName ); nCount1 = nCount2 = 0; // encode the CI nets
/**Function************************************************************* Synopsis [Generates structure of L K-LUTs implementing an N-var function.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Abc_GenFpga( char * pFileName, int nLutSize, int nLuts, int nVars ) { FILE * pFile; int nVarsLut = (1 << nLutSize); // the number of LUT variables int nVarsLog = Extra_Base2Log( nVars + nLuts - 1 ); // the number of encoding vars int nVarsDeg = (1 << nVarsLog); // the number of LUT variables (total) int nParsLut = nLuts * (1 << nLutSize); // the number of LUT params int nParsVar = nLuts * nLutSize * nVarsLog; // the number of var params int i, j, k; assert( nVars > 0 ); pFile = fopen( pFileName, "w" ); fprintf( pFile, "# Structure with %d %d-LUTs for %d-var function generated by ABC on %s\n", nLuts, nLutSize, nVars, Extra_TimeStamp() ); fprintf( pFile, ".model struct%dx%d_%d\n", nLuts, nLutSize, nVars ); fprintf( pFile, ".inputs" ); for ( i = 0; i < nParsLut; i++ ) fprintf( pFile, " pl%02d", i ); fprintf( pFile, "\n" ); fprintf( pFile, ".inputs" ); for ( i = 0; i < nParsVar; i++ ) fprintf( pFile, " pv%02d", i ); fprintf( pFile, "\n" ); fprintf( pFile, ".inputs" ); for ( i = 0; i < nVars; i++ ) fprintf( pFile, " v%02d", i ); fprintf( pFile, "\n" ); fprintf( pFile, ".outputs" ); fprintf( pFile, " v%02d", nVars + nLuts - 1 ); fprintf( pFile, "\n" ); fprintf( pFile, ".names Gnd\n" ); fprintf( pFile, " 0\n" ); // generate LUTs for ( i = 0; i < nLuts; i++ ) { fprintf( pFile, ".subckt lut%d", nLutSize ); // generate config parameters for ( k = 0; k < nVarsLut; k++ ) fprintf( pFile, " p%02d=pl%02d", k, i * nVarsLut + k ); // generate the inputs for ( k = 0; k < nLutSize; k++ ) fprintf( pFile, " i%d=s%02d", k, i * nLutSize + k ); // generate the output fprintf( pFile, " o=v%02d", nVars + i ); fprintf( pFile, "\n" ); } // generate LUT inputs for ( i = 0; i < nLuts; i++ ) { for ( j = 0; j < nLutSize; j++ ) { fprintf( pFile, ".subckt lut%d", nVarsLog ); // generate config parameters for ( k = 0; k < nVarsDeg; k++ ) { if ( k < nVars + nLuts - 1 && k < nVars + i ) fprintf( pFile, " p%02d=v%02d", k, k ); else fprintf( pFile, " p%02d=Gnd", k ); } // generate the inputs for ( k = 0; k < nVarsLog; k++ ) fprintf( pFile, " i%d=pv%02d", k, (i * nLutSize + j) * nVarsLog + k ); // generate the output fprintf( pFile, " o=s%02d", i * nLutSize + j ); fprintf( pFile, "\n" ); } } fprintf( pFile, ".end\n" ); fprintf( pFile, "\n" ); // generate LUTs Abc_WriteKLut( pFile, nLutSize ); if ( nVarsLog != nLutSize ) Abc_WriteKLut( pFile, nVarsLog ); fclose( pFile ); }