/**CFile**************************************************************** FileName [plaRead.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [SOP manager.] Synopsis [Scalable SOP transformations.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - March 18, 2015.] Revision [$Id: plaRead.c,v 1.00 2014/09/12 00:00:00 alanmi Exp $] ***********************************************************************/ #include "pla.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ char * Pla_ReadFile( char * pFileName, char ** ppLimit ) { char * pBuffer; int nFileSize, RetValue; FILE * pFile = fopen( pFileName, "rb" ); if ( pFile == NULL ) { printf( "Cannot open input file.\n" ); return NULL; } // get the file size, in bytes fseek( pFile, 0, SEEK_END ); nFileSize = ftell( pFile ); // move the file current reading position to the beginning rewind( pFile ); // load the contents of the file into memory pBuffer = ABC_ALLOC( char, nFileSize + 16 ); pBuffer[0] = '\n'; RetValue = fread( pBuffer+1, nFileSize, 1, pFile ); fclose( pFile ); // terminate the string with '\0' pBuffer[nFileSize + 1] = '\n'; pBuffer[nFileSize + 2] = '\0'; *ppLimit = pBuffer + nFileSize + 3; return pBuffer; } /**Function************************************************************* Synopsis [] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ void Pla_ReadPlaRemoveComments( char * pBuffer, char * pLimit ) { char * pTemp; for ( pTemp = pBuffer; pTemp < pLimit; pTemp++ ) if ( *pTemp == '#' ) while ( *pTemp && *pTemp != '\n' ) *pTemp++ = ' '; } int Pla_ReadPlaHeader( char * pBuffer, char * pLimit, int * pnIns, int * pnOuts, int * pnCubes, int * pType ) { char * pTemp; *pType = PLA_FILE_FD; *pnIns = *pnOuts = *pnCubes = -1; for ( pTemp = pBuffer; pTemp < pLimit; pTemp++ ) { if ( *pTemp != '.' ) continue; if ( !strncmp(pTemp, ".i ", 3) ) *pnIns = atoi( pTemp + 3 ); else if ( !strncmp(pTemp, ".o ", 3) ) *pnOuts = atoi( pTemp + 3 ); else if ( !strncmp(pTemp, ".p ", 3) ) *pnCubes = atoi( pTemp + 3 ); else if ( !strncmp(pTemp, ".e ", 3) ) break; else if ( !strncmp(pTemp, ".type ", 6) ) { char Buffer[100]; *pType = PLA_FILE_NONE; sscanf( pTemp+6, "%s", Buffer ); if ( !strcmp(Buffer, "f") ) *pType = PLA_FILE_F; else if ( !strcmp(Buffer, "fr") ) *pType = PLA_FILE_FR; else if ( !strcmp(Buffer, "fd") ) *pType = PLA_FILE_FD; else if ( !strcmp(Buffer, "fdr") ) *pType = PLA_FILE_FDR; } } if ( *pnIns <= 0 ) printf( "The number of inputs (.i) should be positive.\n" ); if ( *pnOuts <= 0 ) printf( "The number of outputs (.o) should be positive.\n" ); return *pnIns > 0 && *pnOuts > 0; } Vec_Str_t * Pla_ReadPlaBody( char * pBuffer, char * pLimit, Pla_File_t Type ) { char * pTemp; Vec_Str_t * vLits; vLits = Vec_StrAlloc( 10000 ); for ( pTemp = pBuffer; pTemp < pLimit; pTemp++ ) { if ( *pTemp == '.' ) while ( *pTemp && *pTemp != '\n' ) pTemp++; if ( *pTemp == '0' ) Vec_StrPush( vLits, (char)PLA_LIT_ZERO ); else if ( *pTemp == '1' ) Vec_StrPush( vLits, (char)PLA_LIT_ONE ); else if ( *pTemp == '-' || *pTemp == '2' ) Vec_StrPush( vLits, (char)PLA_LIT_DASH ); else if ( *pTemp == '~' ) // no meaning { if ( Type == PLA_FILE_F || Type == PLA_FILE_FD ) Vec_StrPush( vLits, (char)PLA_LIT_ZERO ); else if ( Type == PLA_FILE_FR ) Vec_StrPush( vLits, (char)PLA_LIT_DASH ); else if ( Type == PLA_FILE_FDR ) Vec_StrPush( vLits, (char)PLA_LIT_FULL ); else assert( 0 ); } } return vLits; } void Pla_ReadAddBody( Pla_Man_t * p, Vec_Str_t * vLits ) { word * pCubeIn, * pCubeOut; int i, k, Lit, Count = 0; int nCubesReal = Vec_StrSize(vLits) / (p->nIns + p->nOuts); assert( Vec_StrSize(vLits) % (p->nIns + p->nOuts) == 0 ); if ( nCubesReal != Pla_ManCubeNum(p) ) { printf( "Warning: Declared number of cubes (%d) differs from the actual (%d).\n", Pla_ManCubeNum(p), nCubesReal ); if ( nCubesReal < Pla_ManCubeNum(p) ) Vec_IntShrink( &p->vCubes, nCubesReal ); else { assert( nCubesReal > Pla_ManCubeNum(p) ); Vec_IntFillNatural( &p->vCubes, nCubesReal ); Vec_WrdFillExtra( &p->vInBits, nCubesReal * p->nInWords, 0 ); Vec_WrdFillExtra( &p->vOutBits, nCubesReal * p->nOutWords, 0 ); } } Pla_ForEachCubeInOut( p, pCubeIn, pCubeOut, i ) { Pla_CubeForEachLit( p->nIns, pCubeIn, Lit, k ) Pla_CubeSetLit( pCubeIn, k, (Pla_Lit_t)Vec_StrEntry(vLits, Count++) ); Pla_CubeForEachLit( p->nOuts, pCubeOut, Lit, k ) Pla_CubeSetLit( pCubeOut, k, (Pla_Lit_t)Vec_StrEntry(vLits, Count++) ); } assert( Count == Vec_StrSize(vLits) ); } Pla_Man_t * Pla_ReadPla( char * pFileName ) { Pla_Man_t * p; Vec_Str_t * vLits; int nIns, nOuts, nCubes, Type; char * pBuffer, * pLimit; pBuffer = Pla_ReadFile( pFileName, &pLimit ); if ( pBuffer == NULL ) return NULL; Pla_ReadPlaRemoveComments( pBuffer, pLimit ); if ( Pla_ReadPlaHeader( pBuffer, pLimit, &nIns, &nOuts, &nCubes, &Type ) ) { vLits = Pla_ReadPlaBody( pBuffer, pLimit, (Pla_File_t)Type ); if ( Vec_StrSize(vLits) % (nIns + nOuts) == 0 ) { if ( nCubes == -1 ) nCubes = Vec_StrSize(vLits) / (nIns + nOuts); p = Pla_ManAlloc( pFileName, nIns, nOuts, nCubes ); p->Type = (Pla_File_t)Type; Pla_ReadAddBody( p, vLits ); Vec_StrFree( vLits ); ABC_FREE( pBuffer ); return p; } printf( "Literal count is incorrect (in = %d; out = %d; lit = %d).\n", nIns, nOuts, Vec_StrSize(vLits) ); Vec_StrFree( vLits ); } ABC_FREE( pBuffer ); return NULL; } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END