50#define PARSE_SYM_OPEN '('
51#define PARSE_SYM_CLOSE ')'
52#define PARSE_SYM_LOWER '['
53#define PARSE_SYM_RAISE ']'
54#define PARSE_SYM_CONST0 '0'
55#define PARSE_SYM_CONST1 '1'
56#define PARSE_SYM_NEGBEF1 '!'
57#define PARSE_SYM_NEGBEF2 '~'
58#define PARSE_SYM_NEGAFT '\''
59#define PARSE_SYM_AND1 '&'
60#define PARSE_SYM_AND2 '*'
61#define PARSE_SYM_XOR1 '<'
62#define PARSE_SYM_XOR2 '+'
63#define PARSE_SYM_XOR3 '>'
64#define PARSE_SYM_XOR '^'
65#define PARSE_SYM_OR1 '+'
66#define PARSE_SYM_OR2 '|'
67#define PARSE_SYM_EQU1 '<'
68#define PARSE_SYM_EQU2 '='
69#define PARSE_SYM_EQU3 '>'
70#define PARSE_SYM_FLR1 '='
71#define PARSE_SYM_FLR2 '>'
72#define PARSE_SYM_FLL1 '<'
73#define PARSE_SYM_FLL2 '='
77#define PARSE_OPER_NEG 10
78#define PARSE_OPER_AND 9
79#define PARSE_OPER_XOR 8
80#define PARSE_OPER_OR 7
81#define PARSE_OPER_EQU 6
82#define PARSE_OPER_FLR 5
83#define PARSE_OPER_FLL 4
84#define PARSE_OPER_MARK 1
87#define PARSE_FLAG_START 1
88#define PARSE_FLAG_VAR 2
89#define PARSE_FLAG_OPER 3
90#define PARSE_FLAG_ERROR 4
94static DdNode * Parse_ParserPerformTopOp( DdManager * dd,
Parse_StackFn_t * pStackFn,
int Oper );
117 char * ppVarNames[], DdManager * dd, DdNode * pbVars[] )
122 DdNode * bFunc, * bTemp;
124 int nParans, fFound, Flag;
125 int Oper, Oper1, Oper2;
130 if ( nVars * (nRanks + 1) > dd->size )
132 printf(
"Parse_FormulaParser(): The BDD manager does not have enough variables.\n" );
138 for ( pTemp = pFormulaInit; *pTemp; pTemp++ )
141 else if ( *pTemp ==
')' )
145 fprintf( pOutput,
"Parse_FormulaParser(): Different number of opening and closing parentheses ().\n" );
150 for ( pTemp = pFormulaInit; *pTemp; pTemp++ )
153 else if ( *pTemp ==
']' )
157 fprintf( pOutput,
"Parse_FormulaParser(): Different number of opening and closing brackets [].\n" );
163 sprintf( pFormula,
"(%s)", pFormulaInit );
171 for ( pTemp = pFormula; *pTemp; pTemp++ )
187 fprintf( pOutput,
"Parse_FormulaParser(): No operation symbol before constant 0.\n" );
199 fprintf( pOutput,
"Parse_FormulaParser(): No operation symbol before constant 1.\n" );
219 fprintf( pOutput,
"Parse_FormulaParser(): No variable is specified before the negation suffix.\n" );
234 fprintf( pOutput,
"Parse_FormulaParser(): There is no variable before AND, EXOR, or OR.\n" );
250 fprintf( pOutput,
"Parse_FormulaParser(): There is no variable before Equivalence or Implication\n" );
283 fprintf( pOutput,
"Parse_FormulaParser(): Wrong symbol after \"%c\"\n",
PARSE_SYM_EQU1 );
293 fprintf( pOutput,
"Parse_FormulaParser(): There is no variable before Reverse Implication\n" );
304 fprintf( pOutput,
"Parse_FormulaParser(): Wrong symbol after \"%c\"\n",
PARSE_SYM_EQU2 );
329 fprintf( pOutput,
"Parse_FormulaParser(): There is no opening parenthesis\n" );
338 if ( Parse_ParserPerformTopOp( dd, pStackFn, Oper ) == NULL )
340 fprintf( pOutput,
"Parse_FormulaParser(): Unknown operation\n" );
349 bFunc =
Extra_bddMove( dd, bTemp = bFunc, -nVars ); Cudd_Ref( bFunc );
350 Cudd_RecursiveDeref( dd, bTemp );
356 fprintf( pOutput,
"Parse_FormulaParser(): There is no opening parenthesis\n" );
385 for ( i = 0; pTemp[i] && pTemp[i] !=
' ' && pTemp[i] !=
'\t' && pTemp[i] !=
'\r' && pTemp[i] !=
'\n' &&
392 for ( v = 0; v < nVars; v++ )
394 if (
strncmp( pTemp, ppVarNames[v], i ) == 0 &&
strlen(ppVarNames[v]) == (
unsigned)(i) )
404 fprintf( pOutput,
"Parse_FormulaParser(): The parser cannot find var \"%s\" in the input var list.\n", pTemp );
447 if ( Oper2 >= Oper1 )
450 if ( Parse_ParserPerformTopOp( dd, pStackFn, Oper2 ) == NULL )
452 fprintf( pOutput,
"Parse_FormulaParser(): Unknown operation\n" );
482 fprintf( pOutput,
"Parse_FormulaParser(): Something is left in the operation stack\n" );
484 fprintf( pOutput,
"Parse_FormulaParser(): Something is left in the function stack\n" );
487 fprintf( pOutput,
"Parse_FormulaParser(): The input string is empty\n" );
504DdNode * Parse_ParserPerformTopOp( DdManager * dd,
Parse_StackFn_t * pStackFn,
int Oper )
506 DdNode * bArg1, * bArg2, * bFunc;
511 bFunc = Cudd_bddAnd( dd, bArg1, bArg2 );
513 bFunc = Cudd_bddXor( dd, bArg1, bArg2 );
515 bFunc = Cudd_bddOr( dd, bArg1, bArg2 );
517 bFunc = Cudd_bddXnor( dd, bArg1, bArg2 );
519 bFunc = Cudd_bddOr( dd, Cudd_Not(bArg1), bArg2 );
521 bFunc = Cudd_bddOr( dd, Cudd_Not(bArg2), bArg1 );
525 Cudd_RecursiveDeref( dd, bArg1 );
526 Cudd_RecursiveDeref( dd, bArg2 );
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define PARSE_SYM_NEGBEF2
#define PARSE_SYM_OPEN
DECLARATIONS ///.
#define PARSE_SYM_NEGBEF1
DdNode * Parse_FormulaParser(FILE *pOutput, char *pFormulaInit, int nVars, int nRanks, char *ppVarNames[], DdManager *dd, DdNode *pbVars[])
FUNCTION DEFINITIONS ///.
struct ParseStackOpStruct Parse_StackOp_t
Parse_StackFn_t * Parse_StackFnStart(int nDepth)
GLOBAL VARIABLES ///.
void * Parse_StackFnPop(Parse_StackFn_t *p)
void Parse_StackFnFree(Parse_StackFn_t *p)
void Parse_StackFnPush(Parse_StackFn_t *p, void *bFunc)
Parse_StackOp_t * Parse_StackOpStart(int nDepth)
int Parse_StackOpIsEmpty(Parse_StackOp_t *p)
typedefABC_NAMESPACE_HEADER_START struct ParseStackFnStruct Parse_StackFn_t
INCLUDES ///.
void Parse_StackOpPush(Parse_StackOp_t *p, int Oper)
int Parse_StackFnIsEmpty(Parse_StackFn_t *p)
int Parse_StackOpPop(Parse_StackOp_t *p)
void Parse_StackOpFree(Parse_StackOp_t *p)