mirror of https://github.com/YosysHQ/abc.git
275 lines
7.0 KiB
C
275 lines
7.0 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [msatRead.c]
|
|
|
|
PackageName [A C version of SAT solver MINISAT, originally developed
|
|
in C++ by Niklas Een and Niklas Sorensson, Chalmers University of
|
|
Technology, Sweden: http://www.cs.chalmers.se/~een/Satzoo.]
|
|
|
|
Synopsis [The reader of the CNF formula in DIMACS format.]
|
|
|
|
Author [Alan Mishchenko <alanmi@eecs.berkeley.edu>]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - January 1, 2004.]
|
|
|
|
Revision [$Id: msatRead.c,v 1.0 2004/01/01 1:00:00 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#include "msatInt.h"
|
|
|
|
ABC_NAMESPACE_IMPL_START
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
static char * Msat_FileRead( FILE * pFile );
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DEFINITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Read the file into the internal buffer.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
char * Msat_FileRead( FILE * pFile )
|
|
{
|
|
int nFileSize;
|
|
char * pBuffer;
|
|
int RetValue;
|
|
// 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 + 3 );
|
|
RetValue = fread( pBuffer, nFileSize, 1, pFile );
|
|
// terminate the string with '\0'
|
|
pBuffer[ nFileSize + 0] = '\n';
|
|
pBuffer[ nFileSize + 1] = '\0';
|
|
return pBuffer;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
static void Msat_ReadWhitespace( char ** pIn )
|
|
{
|
|
while ((**pIn >= 9 && **pIn <= 13) || **pIn == 32)
|
|
(*pIn)++;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
static void Msat_ReadNotWhitespace( char ** pIn )
|
|
{
|
|
while ( !((**pIn >= 9 && **pIn <= 13) || **pIn == 32) )
|
|
(*pIn)++;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
static void skipLine( char ** pIn )
|
|
{
|
|
while ( 1 )
|
|
{
|
|
if (**pIn == 0)
|
|
return;
|
|
if (**pIn == '\n')
|
|
{
|
|
(*pIn)++;
|
|
return;
|
|
}
|
|
(*pIn)++;
|
|
}
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
static int Msat_ReadInt( char ** pIn )
|
|
{
|
|
int val = 0;
|
|
int neg = 0;
|
|
|
|
Msat_ReadWhitespace( pIn );
|
|
if ( **pIn == '-' )
|
|
neg = 1,
|
|
(*pIn)++;
|
|
else if ( **pIn == '+' )
|
|
(*pIn)++;
|
|
if ( **pIn < '0' || **pIn > '9' )
|
|
fprintf(stderr, "PARSE ERROR! Unexpected char: %c\n", **pIn),
|
|
exit(1);
|
|
while ( **pIn >= '0' && **pIn <= '9' )
|
|
val = val*10 + (**pIn - '0'),
|
|
(*pIn)++;
|
|
return neg ? -val : val;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
static void Msat_ReadClause( char ** pIn, Msat_Solver_t * p, Msat_IntVec_t * pLits )
|
|
{
|
|
int nVars = Msat_SolverReadVarNum( p );
|
|
int parsed_lit, var, sign;
|
|
|
|
Msat_IntVecClear( pLits );
|
|
while ( 1 )
|
|
{
|
|
parsed_lit = Msat_ReadInt(pIn);
|
|
if ( parsed_lit == 0 )
|
|
break;
|
|
var = abs(parsed_lit) - 1;
|
|
sign = (parsed_lit > 0);
|
|
if ( var >= nVars )
|
|
{
|
|
printf( "Variable %d is larger than the number of allocated variables (%d).\n", var+1, nVars );
|
|
exit(1);
|
|
}
|
|
Msat_IntVecPush( pLits, MSAT_VAR2LIT(var, !sign) );
|
|
}
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
static int Msat_ReadDimacs( char * pText, Msat_Solver_t ** pS, int fVerbose )
|
|
{
|
|
Msat_Solver_t * p = NULL; // Suppress "might be used uninitialized"
|
|
Msat_IntVec_t * pLits = NULL; // Suppress "might be used uninitialized"
|
|
char * pIn = pText;
|
|
int nVars, nClas;
|
|
while ( 1 )
|
|
{
|
|
Msat_ReadWhitespace( &pIn );
|
|
if ( *pIn == 0 )
|
|
break;
|
|
else if ( *pIn == 'c' )
|
|
skipLine( &pIn );
|
|
else if ( *pIn == 'p' )
|
|
{
|
|
pIn++;
|
|
Msat_ReadWhitespace( &pIn );
|
|
Msat_ReadNotWhitespace( &pIn );
|
|
|
|
nVars = Msat_ReadInt( &pIn );
|
|
nClas = Msat_ReadInt( &pIn );
|
|
skipLine( &pIn );
|
|
// start the solver
|
|
p = Msat_SolverAlloc( nVars, 1, 1, 1, 1, 0 );
|
|
Msat_SolverClean( p, nVars );
|
|
Msat_SolverSetVerbosity( p, fVerbose );
|
|
// allocate the vector
|
|
pLits = Msat_IntVecAlloc( nVars );
|
|
}
|
|
else
|
|
{
|
|
if ( p == NULL )
|
|
{
|
|
printf( "There is no parameter line.\n" );
|
|
exit(1);
|
|
}
|
|
Msat_ReadClause( &pIn, p, pLits );
|
|
if ( !Msat_SolverAddClause( p, pLits ) )
|
|
return 0;
|
|
}
|
|
}
|
|
Msat_IntVecFree( pLits );
|
|
*pS = p;
|
|
return Msat_SolverSimplifyDB( p );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Starts the solver and reads the DIMAC file.]
|
|
|
|
Description [Returns FALSE upon immediate conflict.]
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
int Msat_SolverParseDimacs( FILE * pFile, Msat_Solver_t ** p, int fVerbose )
|
|
{
|
|
char * pText;
|
|
int Value;
|
|
pText = Msat_FileRead( pFile );
|
|
Value = Msat_ReadDimacs( pText, p, fVerbose );
|
|
ABC_FREE( pText );
|
|
return Value;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
ABC_NAMESPACE_IMPL_END
|
|
|