31#define VER_PARSE_SYM_OPEN '('
32#define VER_PARSE_SYM_CLOSE ')'
33#define VER_PARSE_SYM_CONST0 '0'
34#define VER_PARSE_SYM_CONST1 '1'
35#define VER_PARSE_SYM_NEGBEF1 '!'
36#define VER_PARSE_SYM_NEGBEF2 '~'
37#define VER_PARSE_SYM_AND '&'
38#define VER_PARSE_SYM_OR '|'
39#define VER_PARSE_SYM_XOR '^'
40#define VER_PARSE_SYM_MUX1 '?'
41#define VER_PARSE_SYM_MUX2 ':'
44#define VER_PARSE_OPER_NEG 7
45#define VER_PARSE_OPER_AND 6
46#define VER_PARSE_OPER_XOR 5
47#define VER_PARSE_OPER_OR 4
48#define VER_PARSE_OPER_EQU 3
49#define VER_PARSE_OPER_MUX 2
50#define VER_PARSE_OPER_MARK 1
53#define VER_PARSE_FLAG_START 1
54#define VER_PARSE_FLAG_VAR 2
55#define VER_PARSE_FLAG_OPER 3
56#define VER_PARSE_FLAG_ERROR 4
59static int Ver_FormulaParserFindVar(
char * pString,
Vec_Ptr_t * vNames );
81 int Oper, Oper1, Oper2;
85 Vec_PtrClear( vNames );
86 Vec_PtrClear( vStackFn );
87 Vec_IntClear( vStackOp );
89 if ( !
strcmp(pFormula,
"0") || !
strcmp(pFormula,
"1\'b0") )
91 if ( !
strcmp(pFormula,
"1") || !
strcmp(pFormula,
"1\'b1") )
96 for ( pTemp = pFormula; *pTemp; pTemp++ )
99 else if ( *pTemp ==
')' )
103 sprintf( pErrorMessage,
"Parse_FormulaParser(): Different number of opening and closing parentheses ()." );
108 pTemp = pFormula +
strlen(pFormula) + 2;
109 *pTemp-- = 0; *pTemp =
')';
110 while ( --pTemp != pFormula )
111 *pTemp = *(pTemp - 1);
116 for ( pTemp = pFormula; *pTemp; pTemp++ )
155 sprintf( pErrorMessage,
"Parse_FormulaParser(): Variable before negation." );
169 sprintf( pErrorMessage,
"Parse_FormulaParser(): There is no variable before AND, EXOR, or OR." );
189 sprintf( pErrorMessage,
"Parse_FormulaParser(): Variable before a parenthesis." );
199 if ( Vec_IntSize( vStackOp ) )
203 if ( !Vec_IntSize( vStackOp ) )
205 sprintf( pErrorMessage,
"Parse_FormulaParser(): There is no opening parenthesis\n" );
209 Oper = Vec_IntPop( vStackOp );
220 if ( Ver_FormulaParserTopOper( (
Hop_Man_t *)pMan, vStackFn, Oper ) == NULL )
222 sprintf( pErrorMessage,
"Parse_FormulaParser(): Unknown operation\n" );
229 sprintf( pErrorMessage,
"Parse_FormulaParser(): There is no opening parenthesis\n" );
240 v = Ver_FormulaParserFindVar( pTemp, vNames );
241 if ( *pTemp ==
'\\' )
243 pTemp += (int)(ABC_PTRUINT_T)Vec_PtrEntry( vNames, 2*v ) - 1;
248 sprintf( pErrorMessage,
"Parse_FormulaParser(): Incorrect state." );
252 Vec_PtrPush( vStackFn, bTemp );
264 if ( !Vec_IntSize(vStackOp) )
266 Oper = Vec_IntPop( vStackOp );
269 Vec_IntPush( vStackOp, Oper );
275 Vec_PtrPush( vStackFn, Hop_Not((
Hop_Obj_t *)Vec_PtrPop(vStackFn)) );
282 Oper1 = Vec_IntPop( vStackOp );
283 if ( !Vec_IntSize(vStackOp) )
285 Vec_IntPush( vStackOp, Oper1 );
288 Oper2 = Vec_IntPop( vStackOp );
291 if ( Ver_FormulaParserTopOper( (
Hop_Man_t *)pMan, vStackFn, Oper2 ) == NULL )
293 sprintf( pErrorMessage,
"Parse_FormulaParser(): Unknown operation\n" );
296 Vec_IntPush( vStackOp, Oper1 );
300 Vec_IntPush( vStackOp, Oper2 );
301 Vec_IntPush( vStackOp, Oper1 );
309 if ( Vec_PtrSize(vStackFn) )
311 bFunc = (
Hop_Obj_t *)Vec_PtrPop(vStackFn);
312 if ( !Vec_PtrSize(vStackFn) )
313 if ( !Vec_IntSize(vStackOp) )
319 sprintf( pErrorMessage,
"Parse_FormulaParser(): Something is left in the operation stack\n" );
321 sprintf( pErrorMessage,
"Parse_FormulaParser(): Something is left in the function stack\n" );
324 sprintf( pErrorMessage,
"Parse_FormulaParser(): The input string is empty\n" );
344 Hop_Obj_t * bArg0, * bArg1, * bArg2, * bFunc;
346 bArg2 = (
Hop_Obj_t *)Vec_PtrPop( vStackFn );
347 bArg1 = (
Hop_Obj_t *)Vec_PtrPop( vStackFn );
349 bFunc =
Hop_And( pMan, bArg1, bArg2 );
351 bFunc =
Hop_Exor( pMan, bArg1, bArg2 );
353 bFunc =
Hop_Or( pMan, bArg1, bArg2 );
355 bFunc = Hop_Not(
Hop_Exor( pMan, bArg1, bArg2 ) );
358 bArg0 = (
Hop_Obj_t *)Vec_PtrPop( vStackFn );
360 bFunc =
Hop_Mux( pMan, bArg0, bArg1, bArg2 );
369 Vec_PtrPush( vStackFn, bFunc );
384int Ver_FormulaParserFindVar(
char * pString,
Vec_Ptr_t * vNames )
386 char * pTemp, * pTemp2;
387 int nLength, nLength2, i;
391 if ( *pTemp ==
'\\' )
394 while ( *pTemp && *pTemp !=
' ' )
399 while ( *pTemp && *pTemp !=
' ' && *pTemp !=
'\t' && *pTemp !=
'\r' && *pTemp !=
'\n' && *pTemp !=
',' && *pTemp !=
'}' &&
407 nLength = pTemp - pString;
408 for ( i = 0; i < Vec_PtrSize(vNames)/2; i++ )
410 nLength2 = (int)(ABC_PTRUINT_T)Vec_PtrEntry( vNames, 2*i + 0 );
411 if ( nLength2 != nLength )
413 pTemp2 = (
char *)Vec_PtrEntry( vNames, 2*i + 1 );
414 if (
strncmp( pString, pTemp2, nLength ) )
419 Vec_PtrPush( vNames, (
void *)(ABC_PTRUINT_T)nLength );
420 Vec_PtrPush( vNames, pString );
442 Symbol = *pFormula++;
443 fCompl = ( Symbol ==
'~' );
445 Symbol = *pFormula++;
447 if ( Symbol !=
'&' && Symbol !=
'|' && Symbol !=
'^' )
449 sprintf( pErrorMessage,
"Ver_FormulaReduction(): Unknown operation (%c)\n", Symbol );
453 while ( *pFormula++ !=
'{' );
455 Vec_PtrClear( vNames );
456 while ( *pFormula !=
'}' )
458 v = Ver_FormulaParserFindVar( pFormula, vNames );
459 pFormula += (int)(ABC_PTRUINT_T)Vec_PtrEntry( vNames, 2*v );
460 while ( *pFormula ==
' ' || *pFormula ==
',' )
466 else if ( Symbol ==
'|' )
468 else if ( Symbol ==
'^' )
470 return Hop_NotCond( pRes, fCompl );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Hop_Obj_t * Hop_CreateOr(Hop_Man_t *p, int nVars)
typedefABC_NAMESPACE_HEADER_START struct Hop_Man_t_ Hop_Man_t
INCLUDES ///.
Hop_Obj_t * Hop_CreateAnd(Hop_Man_t *p, int nVars)
Hop_Obj_t * Hop_IthVar(Hop_Man_t *p, int i)
FUNCTION DEFINITIONS ///.
Hop_Obj_t * Hop_Exor(Hop_Man_t *p, Hop_Obj_t *p0, Hop_Obj_t *p1)
Hop_Obj_t * Hop_CreateExor(Hop_Man_t *p, int nVars)
Hop_Obj_t * Hop_And(Hop_Man_t *p, Hop_Obj_t *p0, Hop_Obj_t *p1)
Hop_Obj_t * Hop_Or(Hop_Man_t *p, Hop_Obj_t *p0, Hop_Obj_t *p1)
Hop_Obj_t * Hop_Mux(Hop_Man_t *p, Hop_Obj_t *pC, Hop_Obj_t *p1, Hop_Obj_t *p0)
struct Hop_Obj_t_ Hop_Obj_t
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.