47 int nFileSize, RetValue;
48 FILE * pFile = fopen( pFileName,
"rb" );
51 printf(
"Cannot open input file.\n" );
56 nFileSize = ftell( pFile );
60 pBuffer =
ABC_ALLOC(
char, nFileSize + 16 );
62 RetValue = fread( pBuffer+1, nFileSize, 1, pFile );
65 pBuffer[nFileSize + 1] =
'\n';
66 pBuffer[nFileSize + 2] =
'\0';
67 *ppLimit = pBuffer + nFileSize + 3;
85 for ( pTemp = pBuffer; pTemp < pLimit; pTemp++ )
87 while ( *pTemp && *pTemp !=
'\n' )
90int Pla_ReadPlaHeader(
char * pBuffer,
char * pLimit,
int * pnIns,
int * pnOuts,
int * pnCubes,
int * pType )
94 *pnIns = *pnOuts = *pnCubes = -1;
95 for ( pTemp = pBuffer; pTemp < pLimit; pTemp++ )
99 if ( !
strncmp(pTemp,
".i ", 3) )
100 *pnIns = atoi( pTemp + 3 );
101 else if ( !
strncmp(pTemp,
".o ", 3) )
102 *pnOuts = atoi( pTemp + 3 );
103 else if ( !
strncmp(pTemp,
".p ", 3) )
104 *pnCubes = atoi( pTemp + 3 );
105 else if ( !
strncmp(pTemp,
".e ", 3) )
107 else if ( !
strncmp(pTemp,
".type ", 6) )
111 sscanf( pTemp+6,
"%s", Buffer );
112 if ( !
strcmp(Buffer,
"f") )
114 else if ( !
strcmp(Buffer,
"fr") )
116 else if ( !
strcmp(Buffer,
"fd") )
118 else if ( !
strcmp(Buffer,
"fdr") )
123 printf(
"The number of inputs (.i) should be positive.\n" );
125 printf(
"The number of outputs (.o) should be positive.\n" );
126 return *pnIns > 0 && *pnOuts > 0;
132 vLits = Vec_StrAlloc( 10000 );
133 for ( pTemp = pBuffer; pTemp < pLimit; pTemp++ )
136 while ( *pTemp && *pTemp !=
'\n' )
140 else if ( *pTemp ==
'1' )
142 else if ( *pTemp ==
'-' || *pTemp ==
'2' )
144 else if ( *pTemp ==
'~' )
159 word * pCubeIn, * pCubeOut;
160 int i, k, Lit, Count = 0;
161 int nCubesReal = Vec_StrSize(vLits) / (
p->nIns +
p->nOuts);
162 assert( Vec_StrSize(vLits) % (
p->nIns +
p->nOuts) == 0 );
163 if ( nCubesReal != Pla_ManCubeNum(
p) )
165 printf(
"Warning: Declared number of cubes (%d) differs from the actual (%d).\n",
166 Pla_ManCubeNum(
p), nCubesReal );
167 if ( nCubesReal < Pla_ManCubeNum(
p) )
168 Vec_IntShrink( &
p->vCubes, nCubesReal );
171 assert( nCubesReal > Pla_ManCubeNum(
p) );
172 Vec_IntFillNatural( &
p->vCubes, nCubesReal );
173 Vec_WrdFillExtra( &
p->vInBits, nCubesReal *
p->nInWords, 0 );
174 Vec_WrdFillExtra( &
p->vOutBits, nCubesReal *
p->nOutWords, 0 );
180 Pla_CubeSetLit( pCubeIn, k, (
Pla_Lit_t)Vec_StrEntry(vLits, Count++) );
182 Pla_CubeSetLit( pCubeOut, k, (
Pla_Lit_t)Vec_StrEntry(vLits, Count++) );
184 assert( Count == Vec_StrSize(vLits) );
190 int nIns, nOuts, nCubes, Type;
191 char * pBuffer, * pLimit;
193 if ( pBuffer == NULL )
199 if ( Vec_StrSize(vLits) % (nIns + nOuts) == 0 )
202 nCubes = Vec_StrSize(vLits) / (nIns + nOuts);
203 p = Pla_ManAlloc( pFileName, nIns, nOuts, nCubes );
206 Vec_StrFree( vLits );
210 printf(
"Literal count is incorrect (in = %d; out = %d; lit = %d).\n", nIns, nOuts, Vec_StrSize(vLits) );
211 Vec_StrFree( vLits );
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
struct Vec_Str_t_ Vec_Str_t
unsigned __int64 word
DECLARATIONS ///.
void Pla_ReadPlaRemoveComments(char *pBuffer, char *pLimit)
ABC_NAMESPACE_IMPL_START char * Pla_ReadFile(char *pFileName, char **ppLimit)
DECLARATIONS ///.
Pla_Man_t * Pla_ReadPla(char *pFileName)
Vec_Str_t * Pla_ReadPlaBody(char *pBuffer, char *pLimit, Pla_File_t Type)
void Pla_ReadAddBody(Pla_Man_t *p, Vec_Str_t *vLits)
int Pla_ReadPlaHeader(char *pBuffer, char *pLimit, int *pnIns, int *pnOuts, int *pnCubes, int *pType)
#define Pla_CubeForEachLit(nVars, pCube, Lit, i)
Pla_File_t
BASIC TYPES ///.
struct Pla_Man_t_ Pla_Man_t
#define Pla_ForEachCubeInOut(p, pCubeIn, pCubeOut, i)