summaryrefslogtreecommitdiffstats
path: root/src/misc/parse
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2017-11-03 19:05:40 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2017-11-03 19:05:40 -0700
commitf61b5d8c12bbda77df597fb13f8115ab2b271d13 (patch)
tree15f6c920fc2a118c81cca19050c5e782ce3d8a7b /src/misc/parse
parente21052dfdd1656ca6fee96a4470d1e062a1c8d78 (diff)
downloadabc-f61b5d8c12bbda77df597fb13f8115ab2b271d13.tar.gz
abc-f61b5d8c12bbda77df597fb13f8115ab2b271d13.tar.bz2
abc-f61b5d8c12bbda77df597fb13f8115ab2b271d13.zip
Supporting XOR in EQN parser.
Diffstat (limited to 'src/misc/parse')
-rw-r--r--src/misc/parse/parseEqn.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/misc/parse/parseEqn.c b/src/misc/parse/parseEqn.c
index eef95dc2..0cdd7c88 100644
--- a/src/misc/parse/parseEqn.c
+++ b/src/misc/parse/parseEqn.c
@@ -32,11 +32,13 @@ ABC_NAMESPACE_IMPL_START
#define PARSE_EQN_SYM_CONST1 '1' // constant 1
#define PARSE_EQN_SYM_NEG '!' // negation before the variable
#define PARSE_EQN_SYM_AND '*' // logic AND
+#define PARSE_EQN_SYM_XOR '^' // logic XOR
#define PARSE_EQN_SYM_OR '+' // logic OR
// the list of opcodes (also specifying operation precedence)
#define PARSE_EQN_OPER_NEG 10 // negation
#define PARSE_EQN_OPER_AND 9 // logic AND
+#define PARSE_EQN_OPER_XOR 8 // logic XOR
#define PARSE_EQN_OPER_OR 7 // logic OR
#define PARSE_EQN_OPER_MARK 1 // OpStack token standing for an opening parenthesis
@@ -138,6 +140,7 @@ Hop_Obj_t * Parse_FormulaParserEqn( FILE * pOutput, char * pFormInit, Vec_Ptr_t
Parse_StackOpPush( pStackOp, PARSE_EQN_OPER_NEG );
break;
case PARSE_EQN_SYM_AND:
+ case PARSE_EQN_SYM_XOR:
case PARSE_EQN_SYM_OR:
if ( Flag != PARSE_EQN_FLAG_VAR )
{
@@ -147,8 +150,10 @@ Hop_Obj_t * Parse_FormulaParserEqn( FILE * pOutput, char * pFormInit, Vec_Ptr_t
}
if ( *pTemp == PARSE_EQN_SYM_AND )
Parse_StackOpPush( pStackOp, PARSE_EQN_OPER_AND );
- else //if ( *pTemp == PARSE_EQN_SYM_OR )
+ else if ( *pTemp == PARSE_EQN_SYM_OR )
Parse_StackOpPush( pStackOp, PARSE_EQN_OPER_OR );
+ else //if ( *pTemp == PARSE_EQN_SYM_XOR )
+ Parse_StackOpPush( pStackOp, PARSE_EQN_OPER_XOR );
Flag = PARSE_EQN_FLAG_OPER;
break;
case PARSE_EQN_SYM_OPEN:
@@ -204,7 +209,7 @@ Hop_Obj_t * Parse_FormulaParserEqn( FILE * pOutput, char * pFormInit, Vec_Ptr_t
// scan the next name
for ( i = 0; pTemp[i] &&
pTemp[i] != ' ' && pTemp[i] != '\t' && pTemp[i] != '\r' && pTemp[i] != '\n' &&
- pTemp[i] != PARSE_EQN_SYM_AND && pTemp[i] != PARSE_EQN_SYM_OR && pTemp[i] != PARSE_EQN_SYM_CLOSE; i++ )
+ pTemp[i] != PARSE_EQN_SYM_AND && pTemp[i] != PARSE_EQN_SYM_OR && pTemp[i] != PARSE_EQN_SYM_XOR && pTemp[i] != PARSE_EQN_SYM_CLOSE; i++ )
{
if ( pTemp[i] == PARSE_EQN_SYM_NEG || pTemp[i] == PARSE_EQN_SYM_OPEN )
{
@@ -338,6 +343,8 @@ Hop_Obj_t * Parse_ParserPerformTopOp( Hop_Man_t * pMan, Parse_StackFn_t * pStack
gFunc = Hop_And( pMan, gArg1, gArg2 );
else if ( Oper == PARSE_EQN_OPER_OR )
gFunc = Hop_Or( pMan, gArg1, gArg2 );
+ else if ( Oper == PARSE_EQN_OPER_XOR )
+ gFunc = Hop_Exor( pMan, gArg1, gArg2 );
else
return NULL;
// Cudd_Ref( gFunc );