aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2010-04-05 04:02:16 +0000
committerDaniel Dunbar <daniel@zuster.org>2010-04-05 04:02:16 +0000
commit268b8ff282c2c17535432a1b341a0b9f52c8ae69 (patch)
tree4a77dbb7e9f511f3527ab3e001ea93e1eec3354f
parent9f9e0114420caabb353f39e20e7d98887eca26f1 (diff)
downloadklee-268b8ff282c2c17535432a1b341a0b9f52c8ae69.tar.gz
STP: Remove unused files.
git-svn-id: https://llvm.org/svn/llvm-project/klee/trunk@100394 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--stp/AST/asttest.cpp29
-rw-r--r--stp/AST/bbtest.cpp96
-rw-r--r--stp/AST/cnftest.cpp47
-rw-r--r--stp/parser/Makefile27
-rw-r--r--stp/parser/PL.lex128
-rw-r--r--stp/parser/PL.y1006
-rw-r--r--stp/parser/let-funcs.cpp85
-rw-r--r--stp/parser/main.cpp181
-rw-r--r--stp/parser/smtlib.lex232
-rw-r--r--stp/parser/smtlib.y1036
10 files changed, 0 insertions, 2867 deletions
diff --git a/stp/AST/asttest.cpp b/stp/AST/asttest.cpp
deleted file mode 100644
index 57f3d20c..00000000
--- a/stp/AST/asttest.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-#include "AST.h"
-
-using namespace BEEV;
-
-int main()
-{
-
- BeevMgr * bm = new BeevMgr();
- ASTNode s1 = bm->CreateSymbol("foo");
- s1 = bm->CreateSymbol("foo1");
- s1 = bm->CreateSymbol("foo2");
- ASTNode s2 = bm->CreateSymbol("bar");
- cout << "s1" << s1 << endl;
- cout << "s2" << s2 << endl;
-
- ASTNode b1 = bm->CreateBVConst(5,12);
- ASTNode b2 = bm->CreateBVConst(6,36);
- cout << "b1: " << b1 << endl;
- cout << "b2: " << b2 << endl;
-
- ASTNode a1 = bm->CreateNode(EQ, s1, s2);
- ASTNode a2 = bm->CreateNode(AND, s1, s2);
- a1 = bm->CreateNode(OR, s1, s2);
- ASTNode a3 = bm->CreateNode(IMPLIES, a1, a2);
- ASTNode a4 = bm->CreateNode(IMPLIES, s1, a2);
- cout << "a3" << a3 << endl;
- cout << "a4" << a4 << endl;
- return 0;
-}
diff --git a/stp/AST/bbtest.cpp b/stp/AST/bbtest.cpp
deleted file mode 100644
index 83aa6a4e..00000000
--- a/stp/AST/bbtest.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-#include "AST.h"
-
-using namespace BEEV;
-
-int main()
-{
- const int size = 32;
-
- BeevMgr *bm = new BeevMgr();
- ASTNode s1 = bm->CreateSymbol("x");
- s1.SetValueWidth(size);
- cout << "s1" << s1 << endl;
- ASTNode s2 = bm->CreateSymbol("y");
- s2.SetValueWidth(size);
- cout << "s2" << s2 << endl;
- ASTNode s3 = bm->CreateSymbol("z");
- s3.SetValueWidth(size);
- cout << "s3" << s3 << endl;
-
- ASTNode c1 = bm->CreateBVConst(size,0);
- cout << "c1" << c1 << endl;
- ASTVec bbc1 = bm->BBTerm(c1);
- cout << "bitblasted c1 " << endl;
- LispPrintVec(cout, bbc1, 0);
- cout << endl;
- bm->AlreadyPrintedSet.clear();
-
- ASTNode c2 = bm->CreateBVConst(size,1);
- c2.SetValueWidth(size);
- cout << "c2" << c2 << endl;
- ASTVec bbc2 = bm->BBTerm(c2);
- cout << "bitblasted c2 " << endl;
- LispPrintVec(cout, bbc2, 0);
- cout << endl;
- bm->AlreadyPrintedSet.clear();
-
- ASTNode c3 = bm->CreateBVConst(size, 0xFFFFFFFF);
- c3.SetValueWidth(size);
- cout << "c3" << c3 << endl;
- ASTVec bbc3 = bm->BBTerm(c3);
- cout << "bitblasted c3 " << endl;
- LispPrintVec(cout, bbc3, 0);
- cout << endl;
- bm->AlreadyPrintedSet.clear();
-
- ASTNode c4 = bm->CreateBVConst(size, 0xAAAAAAAA);
- c4.SetValueWidth(size);
- cout << "c4" << c4 << endl;
- ASTVec bbc4 = bm->BBTerm(c4);
- cout << "bitblasted c4 " << endl;
- LispPrintVec(cout, bbc4, 0);
- cout << endl;
- bm->AlreadyPrintedSet.clear();
-
-// ASTNode b1 = bm->CreateBVConst(12);
-// ASTNode b2 = bm->CreateBVConst(36);
-// cout << "b1: " << b1 << endl;
-// cout << "b2: " << b2 << endl;
-
- ASTNode a1 = bm->CreateNode(BVPLUS, s1, s2);
- a1.SetValueWidth(size);
-
- ASTVec& bba1 = bm->BBTerm(a1);
- cout << "bitblasted a1 " << endl;
- LispPrintVec(cout, bba1, 0);
- cout << endl;
- bm->AlreadyPrintedSet.clear();
-
- ASTNode a2 = bm->CreateNode(BVPLUS, s1, s2, s3);
- a1.SetValueWidth(2);
-
- ASTVec& bba2 = bm->BBTerm(a2);
- cout << "bitblasted a2 " << endl;
- LispPrintVec(cout, bba2, 0);
- cout << endl;
- bm->AlreadyPrintedSet.clear();
-
- ASTNode a3 = bm->CreateNode(BVXOR, s1, s2);
- a3.SetValueWidth(2);
-
- ASTVec& bba3 = bm->BBTerm(a3);
- cout << "bitblasted a3 " << endl;
- LispPrintVec(cout, bba3, 0);
- cout << endl;
- bm->AlreadyPrintedSet.clear();
-
- ASTNode a4 = bm->CreateNode(EQ, s1, s2);
- ASTNode bba4 = bm->BBForm(a4);
- cout << "bitblasted a4 " << endl << bba4 << endl;
-
- ASTNode a5 = bm->CreateNode(BVLE, s1, s2);
- ASTNode bba5 = bm->BBForm(a5);
- cout << "bitblasted a5 " << endl << bba5 << endl;
-
- return 0;
-}
diff --git a/stp/AST/cnftest.cpp b/stp/AST/cnftest.cpp
deleted file mode 100644
index 7ce270c8..00000000
--- a/stp/AST/cnftest.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-// -*- c++ -*-
-
-// Test program for CNF conversion.
-
-#include "AST.h"
-
-using namespace BEEV;
-
-int main()
-{
- const int size = 1;
-
- BeevMgr *bm = new BeevMgr();
- ASTNode s1 = bm->CreateSymbol("x");
- s1.SetValueWidth(size);
-
- cout << "s1" << s1 << endl;
- ASTNode s2 = bm->CreateSymbol("y");
- s2.SetValueWidth(size);
-
- cout << "s2" << s2 << endl;
- ASTNode s3 = bm->CreateSymbol("z");
- s3.SetValueWidth(size);
-
- cout << "s3" << s3 << endl;
-
- ASTNode bbs1 = bm->BBForm(s1);
- cout << "bitblasted s1" << endl << bbs1 << endl;
- bm->PrintClauseList(cout, bm->ToCNF(bbs1));
-
- ASTNode a2 = bm->CreateNode(AND, s1, s2);
- ASTNode bba2 = bm->BBForm(a2);
- cout << "bitblasted a2" << endl << bba2 << endl;
- bm->PrintClauseList(cout, bm->ToCNF(bba2));
-
- ASTNode a3 = bm->CreateNode(OR, s1, s2);
- ASTNode bba3 = bm->BBForm(a3);
- cout << "bitblasted a3" << endl << bba3 << endl;
- bm->PrintClauseList(cout, bm->ToCNF(bba3));
-
- ASTNode a4 = bm->CreateNode(EQ, s1, s2);
- ASTNode bba4 = bm->BBForm(a4);
- cout << "bitblasted a4 " << endl << bba4 << endl;
-
- bm->PrintClauseList(cout, bm->ToCNF(bba4));
-
-}
diff --git a/stp/parser/Makefile b/stp/parser/Makefile
deleted file mode 100644
index 12483a26..00000000
--- a/stp/parser/Makefile
+++ /dev/null
@@ -1,27 +0,0 @@
-include ../Makefile.common
-
-SRCS = lexPL.cpp parsePL.cpp let-funcs.cpp main.cpp
-OBJS = $(SRCS:.cpp=.o)
-LIBS = -L../AST -last -L../sat -lsatsolver -L../simplifier -lsimplifier -L../bitvec -lconsteval -L../constantbv -lconstantbv
-
-all: parser
-
-parser: lexPL.o parsePL.o let-funcs.o main.o
- $(CXX) $(CFLAGS) $(LDFLAGS) lexPL.o parsePL.o main.o let-funcs.o $(LIBS) -o parser
-
-main.o: parsePL_defs.h
-
-lexPL.cpp: PL.lex parsePL_defs.h ../AST/AST.h
- $(LEX) -olexPL.cpp PL.lex
-
-parsePL_defs.h: y.tab.h
- @cp y.tab.h parsePL_defs.h
-parsePL.cpp: y.tab.c
- @cp y.tab.c parsePL.cpp
-
-y.tab.c y.tab.h: PL.y
- $(YACC) PL.y
-
-
-clean:
- rm -rf *.o parsePL_defs.h *~ lexPL.cpp parsePL.cpp *.output parser y.tab.* lex.yy.c .#*
diff --git a/stp/parser/PL.lex b/stp/parser/PL.lex
deleted file mode 100644
index e9358a0e..00000000
--- a/stp/parser/PL.lex
+++ /dev/null
@@ -1,128 +0,0 @@
-%{
-/********************************************************************
- * AUTHORS: Vijay Ganesh, David L. Dill
- *
- * BEGIN DATE: November, 2005
- *
- * LICENSE: Please view LICENSE file in the home dir of this Program
- ********************************************************************/
-#include <iostream>
-#include "../AST/AST.h"
-#include "parsePL_defs.h"
-
-extern char *yytext;
-extern int yyerror (const char *msg);
-%}
-
-%option noyywrap
-%option nounput
-%option noreject
-%option noyymore
-%option yylineno
-%x COMMENT
-%x STRING_LITERAL
-LETTER ([a-zA-Z])
-HEX ([0-9a-fA-F])
-BITS ([0-1])
-DIGIT ([0-9])
-OPCHAR (['?\_$])
-ANYTHING ({LETTER}|{DIGIT}|{OPCHAR})
-%%
-
-[()[\]{},.;:'!#?_=] { return yytext[0];}
-
-[\n] { /*Skip new line */ }
-[ \t\r\f] { /* skip whitespace */ }
-0b{BITS}+ { yylval.node = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateBVConst(yytext+2, 2)); return BVCONST_TOK;}
-0bin{BITS}+ { yylval.node = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateBVConst(yytext+4, 2)); return BVCONST_TOK;}
-0h{HEX}+ { yylval.node = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateBVConst(yytext+2, 16)); return BVCONST_TOK;}
-0hex{HEX}+ { yylval.node = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateBVConst(yytext+4, 16)); return BVCONST_TOK;}
-{DIGIT}+ { yylval.uintval = strtoul(yytext, NULL, 10); return NUMERAL_TOK;}
-
-"%" { BEGIN COMMENT;}
-<COMMENT>"\n" { BEGIN INITIAL; /* return to normal mode */}
-<COMMENT>. { /* stay in comment mode */}
-
-"ARRAY" { return ARRAY_TOK; }
-"OF" { return OF_TOK; }
-"WITH" { return WITH_TOK; }
-"AND" { return AND_TOK;}
-"NAND" { return NAND_TOK;}
-"NOR" { return NOR_TOK;}
-"NOT" { return NOT_TOK; }
-"OR" { return OR_TOK; }
-"/=" { return NEQ_TOK; }
- ":=" { return ASSIGN_TOK;}
-"=>" { return IMPLIES_TOK; }
-"<=>" { return IFF_TOK; }
-"XOR" { return XOR_TOK; }
-"IF" { return IF_TOK; }
-"THEN" { return THEN_TOK; }
-"ELSE" { return ELSE_TOK; }
-"ELSIF" { return ELSIF_TOK; }
-"END" { return END_TOK; }
-"ENDIF" { return ENDIF_TOK; }
-"BV" { return BV_TOK;}
-"BITVECTOR" { return BV_TOK;}
-"BOOLEAN" { return BOOLEAN_TOK;}
-"<<" { return BVLEFTSHIFT_TOK;}
-">>" { return BVRIGHTSHIFT_TOK;}
-"BVPLUS" { return BVPLUS_TOK;}
-"BVSUB" { return BVSUB_TOK;}
-"BVUMINUS" { return BVUMINUS_TOK;}
-"BVMULT" { return BVMULT_TOK;}
-"BVDIV" { return BVDIV_TOK;}
-"BVMOD" { return BVMOD_TOK;}
-"SBVDIV" { return SBVDIV_TOK;}
-"SBVMOD" { return SBVMOD_TOK;}
-"~" { return BVNEG_TOK;}
-"&" { return BVAND_TOK;}
-"|" { return BVOR_TOK;}
-"BVXOR" { return BVXOR_TOK;}
-"BVNAND" { return BVNAND_TOK;}
-"BVNOR" { return BVNOR_TOK;}
-"BVXNOR" { return BVXNOR_TOK;}
-"@" { return BVCONCAT_TOK;}
-"BVLT" { return BVLT_TOK;}
-"BVGT" { return BVGT_TOK;}
-"BVLE" { return BVLE_TOK;}
-"BVGE" { return BVGE_TOK;}
-"BVSLT" { return BVSLT_TOK;}
-"BVSGT" { return BVSGT_TOK;}
-"BVSLE" { return BVSLE_TOK;}
-"BVSGE" { return BVSGE_TOK;}
-"BVSX" { return BVSX_TOK;}
-"SBVLT" { return BVSLT_TOK;}
-"SBVGT" { return BVSGT_TOK;}
-"SBVLE" { return BVSLE_TOK;}
-"SBVGE" { return BVSGE_TOK;}
-"SX" { return BVSX_TOK;}
-"BOOLEXTRACT" { return BOOLEXTRACT_TOK;}
-"BOOLBV" { return BOOL_TO_BV_TOK;}
-"ASSERT" { return ASSERT_TOK; }
-"QUERY" { return QUERY_TOK; }
-"FALSE" { return FALSELIT_TOK;}
-"TRUE" { return TRUELIT_TOK;}
-"IN" { return IN_TOK;}
-"LET" { return LET_TOK;}
-"COUNTEREXAMPLE" { return COUNTEREXAMPLE_TOK;}
-"COUNTERMODEL" { return COUNTEREXAMPLE_TOK;}
- "PUSH" { return PUSH_TOK;}
- "POP" { return POP_TOK;}
-
-(({LETTER})|(_)({ANYTHING}))({ANYTHING})* {
- BEEV::ASTNode nptr = BEEV::globalBeevMgr_for_parser->CreateSymbol(yytext);
-
- // Check valuesize to see if it's a prop var. I don't like doing
- // type determination in the lexer, but it's easier than rewriting
- // the whole grammar to eliminate the term/formula distinction.
- yylval.node = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->ResolveID(nptr));
- //yylval.node = new BEEV::ASTNode(nptr);
- if ((yylval.node)->GetType() == BEEV::BOOLEAN_TYPE)
- return FORMID_TOK;
- else
- return TERMID_TOK;
-}
-
-. { yyerror("Illegal input character."); }
-%%
diff --git a/stp/parser/PL.y b/stp/parser/PL.y
deleted file mode 100644
index aa58aa4c..00000000
--- a/stp/parser/PL.y
+++ /dev/null
@@ -1,1006 +0,0 @@
-%{
-/********************************************************************
- * AUTHORS: Vijay Ganesh, David L. Dill
- *
- * BEGIN DATE: November, 2005
- *
- * LICENSE: Please view LICENSE file in the home dir of this Program
- ********************************************************************/
-// -*- c++ -*-
-
-#include "../AST/AST.h"
-using namespace std;
-
- // Suppress the bogus warning suppression in bison (it generates
- // compile error)
-#undef __GNUC_MINOR__
-
- extern int yylex(void);
- extern char* yytext;
- extern int yylineno;
- int yyerror(const char *s) {
- cout << "syntax error: line " << yylineno << "\n" << s << endl;
- BEEV::FatalError("");
- return 1; /* Dill: don't know what it should return */
- };
-
-#define YYLTYPE_IS_TRIVIAL 1
-#define YYMAXDEPTH 10485760
-#define YYERROR_VERBOSE 1
-#define YY_EXIT_FAILURE -1
-%}
-
-%union {
-
- unsigned int uintval; /* for numerals in types. */
- struct {
- //stores the indexwidth and valuewidth
- //indexwidth is 0 iff type is bitvector. positive iff type is
- //array, and stores the width of the indexing bitvector
- unsigned int indexwidth;
- //width of the bitvector type
- unsigned int valuewidth;
- } indexvaluewidth;
-
- //ASTNode,ASTVec
- BEEV::ASTNode *node;
- BEEV::ASTVec *vec;
-
- //Hash_Map to hold Array Updates during parse A map from array index
- //to array values. To support the WITH construct
- BEEV::ASTNodeMap * Index_To_UpdateValue;
-};
-
-%start cmd
-
-%token AND_TOK "AND"
-%token OR_TOK "OR"
-%token NOT_TOK "NOT"
-%token XOR_TOK "XOR"
-%token NAND_TOK "NAND"
-%token NOR_TOK "NOR"
-%token IMPLIES_TOK "=>"
-%token IFF_TOK "<=>"
-
-%token IF_TOK "IF"
-%token THEN_TOK "THEN"
-%token ELSE_TOK "ELSE"
-%token ELSIF_TOK "ELSIF"
-%token END_TOK "END"
-%token ENDIF_TOK "ENDIF"
-%token NEQ_TOK "/="
-%token ASSIGN_TOK ":="
-
-%token BV_TOK "BV"
-%token BVLEFTSHIFT_TOK "<<"
-%token BVRIGHTSHIFT_TOK ">>"
-%token BVPLUS_TOK "BVPLUS"
-%token BVSUB_TOK "BVSUB"
-%token BVUMINUS_TOK "BVUMINUS"
-%token BVMULT_TOK "BVMULT"
-
-%token BVDIV_TOK "BVDIV"
-%token BVMOD_TOK "BVMOD"
-%token SBVDIV_TOK "SBVDIV"
-%token SBVMOD_TOK "SBVMOD"
-
-
-%token BVNEG_TOK "~"
-%token BVAND_TOK "&"
-%token BVOR_TOK "|"
-%token BVXOR_TOK "BVXOR"
-%token BVNAND_TOK "BVNAND"
-%token BVNOR_TOK "BVNOR"
-%token BVXNOR_TOK "BVXNOR"
-%token BVCONCAT_TOK "@"
-
-%token BVLT_TOK "BVLT"
-%token BVGT_TOK "BVGT"
-%token BVLE_TOK "BVLE"
-%token BVGE_TOK "BVGE"
-
-%token BVSLT_TOK "BVSLT"
-%token BVSGT_TOK "BVSGT"
-%token BVSLE_TOK "BVSLE"
-%token BVSGE_TOK "BVSGE"
-%token BOOL_TO_BV_TOK "BOOLBV"
-%token BVSX_TOK "BVSX"
-%token BOOLEXTRACT_TOK "BOOLEXTRACT"
-%token ASSERT_TOK "ASSERT"
-%token QUERY_TOK "QUERY"
-
-%token BOOLEAN_TOK "BOOLEAN"
-%token ARRAY_TOK "ARRAY"
-%token OF_TOK "OF"
-%token WITH_TOK "WITH"
-
-%token TRUELIT_TOK "TRUE"
-%token FALSELIT_TOK "FALSE"
-
-%token IN_TOK "IN"
-%token LET_TOK "LET"
-//%token COUNTEREXAMPLE_TOK "COUNTEREXAMPLE"
-%token PUSH_TOK "PUSH"
-%token POP_TOK "POP"
-
-%left IN_TOK
-%left XOR_TOK
-%left IFF_TOK
-%right IMPLIES_TOK
-%left OR_TOK
-%left AND_TOK
-%left NAND_TOK
-%left NOR_TOK
-%left NOT_TOK
-%left BVCONCAT_TOK
-%left BVOR_TOK
-%left BVAND_TOK
-%left BVXOR_TOK
-%left BVNAND_TOK
-%left BVNOR_TOK
-%left BVXNOR_TOK
-%left BVNEG_TOK
-%left BVLEFTSHIFT_TOK BVRIGHTSHIFT_TOK
-%left WITH_TOK
-
-%nonassoc '=' NEQ_TOK ASSIGN_TOK
-%nonassoc BVLT_TOK BVLE_TOK BVGT_TOK BVGE_TOK
-%nonassoc BVUMINUS_TOK BVPLUS_TOK BVSUB_TOK BVSX_TOK
-%nonassoc '['
-%nonassoc '{' '.' '('
-%nonassoc BV_TOK
-
-%type <vec> Exprs FORM_IDs reverseFORM_IDs
-%type <vec> Asserts
-%type <node> Expr Formula IfExpr ElseRestExpr IfForm ElseRestForm Assert Query ArrayUpdateExpr
-%type <Index_To_UpdateValue> Updates
-
-%type <indexvaluewidth> BvType BoolType ArrayType Type
-
-%token <node> BVCONST_TOK
-%token <node> TERMID_TOK FORMID_TOK COUNTEREXAMPLE_TOK
-%token <uintval> NUMERAL_TOK
-
-%%
-
-cmd : other_cmd
- | other_cmd counterexample
- ;
-
-counterexample : COUNTEREXAMPLE_TOK ';'
- {
- BEEV::print_counterexample = true;
- BEEV::globalBeevMgr_for_parser->PrintCounterExample(true);
- }
- ;
-
-other_cmd : other_cmd1
- | Query
- {
- BEEV::globalBeevMgr_for_parser->TopLevelSAT(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::TRUE),*$1);
- delete $1;
- }
- | VarDecls Query
- {
- BEEV::globalBeevMgr_for_parser->TopLevelSAT(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::TRUE),*$2);
- delete $2;
- }
- | other_cmd1 Query
- {
- BEEV::ASTVec aaa = BEEV::globalBeevMgr_for_parser->GetAsserts();
- if(aaa.size() == 0)
- yyerror("Fatal Error: parsing: GetAsserts() call: no assertions: ");
- if(aaa.size() == 1)
- BEEV::globalBeevMgr_for_parser->TopLevelSAT(aaa[0],*$2);
- else
- BEEV::globalBeevMgr_for_parser->TopLevelSAT(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::AND,aaa),*$2);
- delete $2;
- }
- ;
-
-other_cmd1 : VarDecls Asserts
- {
- delete $2;
- }
- | Asserts
- {
- delete $1;
- }
- | other_cmd1 VarDecls Asserts
- {
- delete $3;
- }
- ;
-
-/* push : PUSH_TOK */
-/* { */
-/* BEEV::globalBeevMgr_for_parser->Push(); */
-/* } */
-/* | */
-/* ; */
-
-/* pop : POP_TOK */
-/* { */
-/* BEEV::globalBeevMgr_for_parser->Pop(); */
-/* } */
-/* | */
-/* ; */
-
-Asserts : Assert
- {
- $$ = new BEEV::ASTVec;
- $$->push_back(*$1);
- BEEV::globalBeevMgr_for_parser->AddAssert(*$1);
- delete $1;
- }
- | Asserts Assert
- {
- $1->push_back(*$2);
- BEEV::globalBeevMgr_for_parser->AddAssert(*$2);
- $$ = $1;
- delete $2;
- }
- ;
-
-Assert : ASSERT_TOK Formula ';' { $$ = $2; }
- ;
-
-Query : QUERY_TOK Formula ';' { BEEV::globalBeevMgr_for_parser->AddQuery(*$2); $$ = $2;}
- ;
-
-
-/* Grammar for Variable Declaration */
-VarDecls : VarDecl ';'
- {
- }
- | VarDecls VarDecl ';'
- {
- }
- ;
-
-VarDecl : FORM_IDs ':' Type
- {
- for(BEEV::ASTVec::iterator i=$1->begin(),iend=$1->end();i!=iend;i++) {
- BEEV::_parser_symbol_table.insert(*i);
- i->SetIndexWidth($3.indexwidth);
- i->SetValueWidth($3.valuewidth);
-
- //FIXME: HACK_ATTACK. this vector was hacked into the code to
- //support a special request by Dawson' group. They want the
- //counterexample to be printed in the order of variables declared.
- BEEV::globalBeevMgr_for_parser->_special_print_set.push_back(*i);
- }
- delete $1;
- }
- | FORM_IDs ':' Type '=' Expr
- {
- //do type checking. if doesn't pass then abort
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$5);
- if($3.indexwidth != $5->GetIndexWidth())
- yyerror("Fatal Error: parsing: LET Expr: Type check fail: ");
- if($3.valuewidth != $5->GetValueWidth())
- yyerror("Fatal Error: parsing: LET Expr: Type check fail: ");
-
- for(BEEV::ASTVec::iterator i=$1->begin(),iend=$1->end();i!=iend;i++) {
- //set the valuewidth of the identifier
- i->SetValueWidth($5->GetValueWidth());
- i->SetIndexWidth($5->GetIndexWidth());
-
- BEEV::globalBeevMgr_for_parser->LetExprMgr(*i,*$5);
- delete $5;
- }
- }
- | FORM_IDs ':' Type '=' Formula
- {
- //do type checking. if doesn't pass then abort
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$5);
- if($3.indexwidth != $5->GetIndexWidth())
- yyerror("Fatal Error: parsing: LET Expr: Type check fail: ");
- if($3.valuewidth != $5->GetValueWidth())
- yyerror("Fatal Error: parsing: LET Expr: Type check fail: ");
-
- for(BEEV::ASTVec::iterator i=$1->begin(),iend=$1->end();i!=iend;i++) {
- //set the valuewidth of the identifier
- i->SetValueWidth($5->GetValueWidth());
- i->SetIndexWidth($5->GetIndexWidth());
-
- BEEV::globalBeevMgr_for_parser->LetExprMgr(*i,*$5);
- delete $5;
- }
- }
- ;
-
-reverseFORM_IDs : FORMID_TOK
- {
- $$ = new BEEV::ASTVec;
- $$->push_back(*$1);
- delete $1;
- }
- | FORMID_TOK ',' reverseFORM_IDs
- {
- $3->push_back(*$1);
- $$ = $3;
- delete $1;
- }
- ;
-
-FORM_IDs : reverseFORM_IDs
- {
- $$ = new BEEV::ASTVec($1->rbegin(),$1->rend());
- delete $1;
- }
- ;
-
-/* Grammar for Types */
-Type : BvType { $$ = $1; }
- | BoolType { $$ = $1; }
- | ArrayType { $$ = $1; }
- ;
-
-BvType : BV_TOK '(' NUMERAL_TOK ')'
- {
- /*((indexwidth is 0) && (valuewidth>0)) iff type is BV*/
- $$.indexwidth = 0;
- unsigned int length = $3;
- if(length > 0) {
- $$.valuewidth = length;
- }
- else
- BEEV::FatalError("Fatal Error: parsing: BITVECTORS must be of positive length: \n");
- }
- ;
-BoolType : BOOLEAN_TOK
- {
- $$.indexwidth = 0;
- $$.valuewidth = 0;
- }
- ;
-ArrayType : ARRAY_TOK BvType OF_TOK BvType
- {
- $$.indexwidth = $2.valuewidth;
- $$.valuewidth = $4.valuewidth;
- }
- ;
-
-/*Grammar for ITEs which are a type of Term*/
-IfExpr : IF_TOK Formula THEN_TOK Expr ElseRestExpr
- {
- unsigned int width = $4->GetValueWidth();
- if (width != $5->GetValueWidth())
- yyerror("Width mismatch in IF-THEN-ELSE");
- if($4->GetIndexWidth() != $5->GetIndexWidth())
- yyerror("Width mismatch in IF-THEN-ELSE");
-
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$2);
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$4);
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$5);
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::ITE, width, *$2, *$4, *$5));
- $$->SetIndexWidth($5->GetIndexWidth());
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$$);
- delete $2;
- delete $4;
- delete $5;
- }
- ;
-
-ElseRestExpr : ELSE_TOK Expr ENDIF_TOK { $$ = $2; }
- | ELSIF_TOK Expr THEN_TOK Expr ElseRestExpr
- {
- unsigned int width = $2->GetValueWidth();
- if (width != $4->GetValueWidth() || width != $5->GetValueWidth())
- yyerror("Width mismatch in IF-THEN-ELSE");
- if ($2->GetIndexWidth() != $4->GetValueWidth() || $2->GetIndexWidth() != $5->GetValueWidth())
- yyerror("Width mismatch in IF-THEN-ELSE");
-
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$2);
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$4);
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$5);
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::ITE, width, *$2, *$4, *$5));
- $$->SetIndexWidth($5->GetIndexWidth());
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$$);
- delete $2;
- delete $4;
- delete $5;
- }
- ;
-
-/* Grammar for formulas */
-Formula : '(' Formula ')' { $$ = $2; }
- | FORMID_TOK { $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->ResolveID(*$1)); delete $1;}
- | BOOLEXTRACT_TOK '(' Expr ',' NUMERAL_TOK ')'
- {
- unsigned int width = $3->GetValueWidth();
- if(0 > (unsigned)$5 || width <= (unsigned)$5)
- yyerror("Fatal Error: BOOLEXTRACT: trying to boolextract a bit which beyond range");
-
- BEEV::ASTNode hi = BEEV::globalBeevMgr_for_parser->CreateBVConst(32, $5);
- BEEV::ASTNode low = BEEV::globalBeevMgr_for_parser->CreateBVConst(32, $5);
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVEXTRACT,1,*$3,hi,low));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- BEEV::ASTNode zero = BEEV::globalBeevMgr_for_parser->CreateBVConst(1,0);
- BEEV::ASTNode * out = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::EQ,*n,zero));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*out);
-
- $$ = out;
- delete $3;
- }
- | Expr '=' Expr
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::EQ, *$1, *$3));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $1;
- delete $3;
- }
- | Expr NEQ_TOK Expr
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::NEQ, *$1, *$3));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $1;
- delete $3;
- }
- | NOT_TOK Formula
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::NOT, *$2));
- delete $2;
- }
- | Formula OR_TOK Formula %prec OR_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::OR, *$1, *$3));
- delete $1;
- delete $3;
- }
- | Formula NOR_TOK Formula
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::NOR, *$1, *$3));
- delete $1;
- delete $3;
- }
- | Formula AND_TOK Formula %prec AND_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::AND, *$1, *$3));
- delete $1;
- delete $3;
- }
- | Formula NAND_TOK Formula
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::NAND, *$1, *$3));
- delete $1;
- delete $3;
- }
- | Formula IMPLIES_TOK Formula
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::IMPLIES, *$1, *$3));
- delete $1;
- delete $3;
- }
- | Formula IFF_TOK Formula
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::IFF, *$1, *$3));
- delete $1;
- delete $3;
- }
- | Formula XOR_TOK Formula
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::XOR, *$1, *$3));
- delete $1;
- delete $3;
- }
- | BVLT_TOK '(' Expr ',' Expr ')'
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::BVLT, *$3, *$5));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $5;
- }
- | BVGT_TOK '(' Expr ',' Expr ')'
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::BVGT, *$3, *$5));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $5;
- }
- | BVLE_TOK '(' Expr ',' Expr ')'
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::BVLE, *$3, *$5));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $5;
- }
- | BVGE_TOK '(' Expr ',' Expr ')'
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::BVGE, *$3, *$5));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $5;
- }
- | BVSLT_TOK '(' Expr ',' Expr ')'
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::BVSLT, *$3, *$5));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $5;
- }
- | BVSGT_TOK '(' Expr ',' Expr ')'
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::BVSGT, *$3, *$5));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $5;
- }
- | BVSLE_TOK '(' Expr ',' Expr ')'
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::BVSLE, *$3, *$5));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $5;
- }
- | BVSGE_TOK '(' Expr ',' Expr ')'
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::BVSGE, *$3, *$5));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $5;
- }
- | IfForm
- | TRUELIT_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::TRUE));
- $$->SetIndexWidth(0);
- $$->SetValueWidth(0);
- }
- | FALSELIT_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::FALSE));
- $$->SetIndexWidth(0);
- $$->SetValueWidth(0);
- }
-
- | LET_TOK LetDecls IN_TOK Formula
- {
- $$ = $4;
- //Cleanup the LetIDToExprMap
- BEEV::globalBeevMgr_for_parser->CleanupLetIDMap();
- }
- ;
-
-/*Grammar for ITEs which are Formulas */
-IfForm : IF_TOK Formula THEN_TOK Formula ElseRestForm
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::ITE, *$2, *$4, *$5));
- delete $2;
- delete $4;
- delete $5;
- }
- ;
-
-ElseRestForm : ELSE_TOK Formula ENDIF_TOK { $$ = $2; }
- | ELSIF_TOK Formula THEN_TOK Formula ElseRestForm
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::ITE, *$2, *$4, *$5));
- delete $2;
- delete $4;
- delete $5;
- }
- ;
-
-/*Grammar for a list of expressions*/
-Exprs : Expr
- {
- $$ = new BEEV::ASTVec;
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$1);
- $$->push_back(*$1);
- delete $1;
- }
- | Exprs ',' Expr
- {
- $1->push_back(*$3);
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$3);
- $$ = $1;
- delete $3;
- }
- ;
-
-/* Grammar for Expr */
-Expr : TERMID_TOK { $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->ResolveID(*$1)); delete $1;}
- | '(' Expr ')' { $$ = $2; }
- | BVCONST_TOK { $$ = $1; }
- | BOOL_TO_BV_TOK '(' Formula ')'
- {
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$3);
- BEEV::ASTNode one = BEEV::globalBeevMgr_for_parser->CreateBVConst(1,1);
- BEEV::ASTNode zero = BEEV::globalBeevMgr_for_parser->CreateBVConst(1,0);
-
- //return ITE(*$3, length(1), 0bin1, 0bin0)
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::ITE,1,*$3,one,zero));
- delete $3;
- }
- | Expr '[' Expr ']'
- {
- // valuewidth is same as array, indexwidth is 0.
- unsigned int width = $1->GetValueWidth();
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::READ, width, *$1, *$3));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
-
- delete $1;
- delete $3;
- }
- | Expr '(' Expr ')' //array read but in the form of a uninterpreted function application
- {
- // valuewidth is same as array, indexwidth is 0.
- unsigned int width = $1->GetValueWidth();
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::READ, width, *$1, *$3));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
-
- delete $1;
- delete $3;
- }
- | Expr '[' NUMERAL_TOK ':' NUMERAL_TOK ']'
- {
- int width = $3 - $5 + 1;
- if (width < 0)
- yyerror("Negative width in extract");
-
- if((unsigned)$3 >= $1->GetValueWidth() || (unsigned)$5 < 0)
- yyerror("Parsing: Wrong width in BVEXTRACT\n");
-
- BEEV::ASTNode hi = BEEV::globalBeevMgr_for_parser->CreateBVConst(32, $3);
- BEEV::ASTNode low = BEEV::globalBeevMgr_for_parser->CreateBVConst(32, $5);
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVEXTRACT, width, *$1,hi,low));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $1;
- }
- | BVNEG_TOK Expr
- {
- unsigned int width = $2->GetValueWidth();
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVNEG, width, *$2));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $2;
- }
- | Expr BVAND_TOK Expr
- {
- unsigned int width = $1->GetValueWidth();
- if (width != $3->GetValueWidth()) {
- yyerror("Width mismatch in AND");
- }
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVAND, width, *$1, *$3));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $1;
- delete $3;
- }
- | Expr BVOR_TOK Expr
- {
- unsigned int width = $1->GetValueWidth();
- if (width != $3->GetValueWidth()) {
- yyerror("Width mismatch in OR");
- }
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVOR, width, *$1, *$3));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $1;
- delete $3;
- }
- | BVXOR_TOK '(' Expr ',' Expr ')'
- {
- unsigned int width = $3->GetValueWidth();
- if (width != $5->GetValueWidth()) {
- yyerror("Width mismatch in XOR");
- }
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVXOR, width, *$3, *$5));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $5;
- }
- | BVNAND_TOK '(' Expr ',' Expr ')'
- {
- unsigned int width = $3->GetValueWidth();
- if (width != $5->GetValueWidth()) {
- yyerror("Width mismatch in NAND");
- }
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVNAND, width, *$3, *$5));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
-
- delete $3;
- delete $5;
- }
- | BVNOR_TOK '(' Expr ',' Expr ')'
- {
- unsigned int width = $3->GetValueWidth();
- if (width != $5->GetValueWidth()) {
- yyerror("Width mismatch in NOR");
- }
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVNOR, width, *$3, *$5));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
-
- delete $3;
- delete $5;
- }
- | BVXNOR_TOK '(' Expr ',' Expr ')'
- {
- unsigned int width = $3->GetValueWidth();
- if (width != $5->GetValueWidth()) {
- yyerror("Width mismatch in NOR");
- }
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVXNOR, width, *$3, *$5));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
-
- delete $3;
- delete $5;
- }
- | BVSX_TOK '(' Expr ',' NUMERAL_TOK ')'
- {
- //width of the expr which is being sign
- //extended. $5 is the resulting length of the
- //signextended expr
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$3);
- if($3->GetValueWidth() == $5) {
- $$ = $3;
- }
- else {
- BEEV::ASTNode width = BEEV::globalBeevMgr_for_parser->CreateBVConst(32,$5);
- BEEV::ASTNode *n =
- new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVSX, $5,*$3,width));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- }
- }
- | Expr BVCONCAT_TOK Expr
- {
- unsigned int width = $1->GetValueWidth() + $3->GetValueWidth();
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVCONCAT, width, *$1, *$3));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
-
- delete $1;
- delete $3;
- }
- | Expr BVLEFTSHIFT_TOK NUMERAL_TOK
- {
- BEEV::ASTNode zero_bits = BEEV::globalBeevMgr_for_parser->CreateZeroConst($3);
- BEEV::ASTNode * n =
- new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVCONCAT,
- $1->GetValueWidth() + $3, *$1, zero_bits));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $1;
- }
- | Expr BVRIGHTSHIFT_TOK NUMERAL_TOK
- {
- BEEV::ASTNode len = BEEV::globalBeevMgr_for_parser->CreateZeroConst($3);
- unsigned int w = $1->GetValueWidth();
-
- //the amount by which you are rightshifting
- //is less-than/equal-to the length of input
- //bitvector
- if((unsigned)$3 < w) {
- BEEV::ASTNode hi = BEEV::globalBeevMgr_for_parser->CreateBVConst(32,w-1);
- BEEV::ASTNode low = BEEV::globalBeevMgr_for_parser->CreateBVConst(32,$3);
- BEEV::ASTNode extract = BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVEXTRACT,w-$3,*$1,hi,low);
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVCONCAT, w,len, extract));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- }
- else
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateZeroConst(w));
-
- delete $1;
- }
- | BVPLUS_TOK '(' NUMERAL_TOK ',' Exprs ')'
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVPLUS, $3, *$5));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
-
- delete $5;
- }
- | BVSUB_TOK '(' NUMERAL_TOK ',' Expr ',' Expr ')'
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVSUB, $3, *$5, *$7));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
-
- delete $5;
- delete $7;
- }
- | BVUMINUS_TOK '(' Expr ')'
- {
- unsigned width = $3->GetValueWidth();
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVUMINUS,width,*$3));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- }
- | BVMULT_TOK '(' NUMERAL_TOK ',' Expr ',' Expr ')'
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVMULT, $3, *$5, *$7));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
-
- delete $5;
- delete $7;
- }
- | BVDIV_TOK '(' NUMERAL_TOK ',' Expr ',' Expr ')'
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVDIV, $3, *$5, *$7));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
-
- delete $5;
- delete $7;
- }
- | BVMOD_TOK '(' NUMERAL_TOK ',' Expr ',' Expr ')'
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVMOD, $3, *$5, *$7));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
-
- delete $5;
- delete $7;
- }
- | SBVDIV_TOK '(' NUMERAL_TOK ',' Expr ',' Expr ')'
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::SBVDIV, $3, *$5, *$7));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
-
- delete $5;
- delete $7;
- }
- | SBVMOD_TOK '(' NUMERAL_TOK ',' Expr ',' Expr ')'
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::SBVMOD, $3, *$5, *$7));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $5;
- delete $7;
- }
- | IfExpr { $$ = $1; }
- | ArrayUpdateExpr
- | LET_TOK LetDecls IN_TOK Expr
- {
- $$ = $4;
- //Cleanup the LetIDToExprMap
- //BEEV::globalBeevMgr_for_parser->CleanupLetIDMap();
- }
- ;
-
-/*Grammar for Array Update Expr*/
-ArrayUpdateExpr : Expr WITH_TOK Updates
- {
- BEEV::ASTNode * result;
- unsigned int width = $1->GetValueWidth();
-
- BEEV::ASTNodeMap::iterator it = $3->begin();
- BEEV::ASTNodeMap::iterator itend = $3->end();
- result = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::WRITE,
- width,
- *$1,
- (*it).first,
- (*it).second));
- result->SetIndexWidth($1->GetIndexWidth());
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*result);
- for(it++;it!=itend;it++) {
- result = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::WRITE,
- width,
- *result,
- (*it).first,
- (*it).second));
- result->SetIndexWidth($1->GetIndexWidth());
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*result);
- }
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*result);
- $$ = result;
- delete $3;
- }
- ;
-
-Updates : '[' Expr ']' ASSIGN_TOK Expr
- {
- $$ = new BEEV::ASTNodeMap();
- (*$$)[*$2] = *$5;
- }
- | Updates WITH_TOK '[' Expr ']' ASSIGN_TOK Expr
- {
- (*$1)[*$4] = *$7;
- }
- ;
-
-/*Grammar for LET Expr*/
-LetDecls : LetDecl
- | LetDecls ',' LetDecl
- ;
-
-LetDecl : FORMID_TOK '=' Expr
- {
- //Expr must typecheck
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$3);
-
- //set the valuewidth of the identifier
- $1->SetValueWidth($3->GetValueWidth());
- $1->SetIndexWidth($3->GetIndexWidth());
-
- //populate the hashtable from LET-var -->
- //LET-exprs and then process them:
- //
- //1. ensure that LET variables do not clash
- //1. with declared variables.
- //
- //2. Ensure that LET variables are not
- //2. defined more than once
- BEEV::globalBeevMgr_for_parser->LetExprMgr(*$1,*$3);
- delete $1;
- delete $3;
- }
- | FORMID_TOK ':' Type '=' Expr
- {
- //do type checking. if doesn't pass then abort
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$5);
-
- if($3.indexwidth != $5->GetIndexWidth())
- yyerror("Fatal Error: parsing: LET Expr: Type check fail: ");
- if($3.valuewidth != $5->GetValueWidth())
- yyerror("Fatal Error: parsing: LET Expr: Type check fail: ");
-
- //set the valuewidth of the identifier
- $1->SetValueWidth($5->GetValueWidth());
- $1->SetIndexWidth($5->GetIndexWidth());
-
- BEEV::globalBeevMgr_for_parser->LetExprMgr(*$1,*$5);
- delete $1;
- delete $5;
- }
- | FORMID_TOK '=' Formula
- {
- //Expr must typecheck
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$3);
-
- //set the valuewidth of the identifier
- $1->SetValueWidth($3->GetValueWidth());
- $1->SetIndexWidth($3->GetIndexWidth());
-
- //Do LET-expr management
- BEEV::globalBeevMgr_for_parser->LetExprMgr(*$1,*$3);
- delete $1;
- delete $3;
- }
- | FORMID_TOK ':' Type '=' Formula
- {
- //do type checking. if doesn't pass then abort
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$5);
-
- if($3.indexwidth != $5->GetIndexWidth())
- yyerror("Fatal Error: parsing: LET Expr: Type check fail: ");
- if($3.valuewidth != $5->GetValueWidth())
- yyerror("Fatal Error: parsing: LET Expr: Type check fail: ");
-
- //set the valuewidth of the identifier
- $1->SetValueWidth($5->GetValueWidth());
- $1->SetIndexWidth($5->GetIndexWidth());
-
- //Do LET-expr management
- BEEV::globalBeevMgr_for_parser->LetExprMgr(*$1,*$5);
- delete $1;
- delete $5;
- }
- ;
-
-%%
diff --git a/stp/parser/let-funcs.cpp b/stp/parser/let-funcs.cpp
deleted file mode 100644
index 1de10492..00000000
--- a/stp/parser/let-funcs.cpp
+++ /dev/null
@@ -1,85 +0,0 @@
-/********************************************************************
- * AUTHORS: Vijay Ganesh, David L. Dill
- *
- * BEGIN DATE: November, 2005
- *
- * LICENSE: Please view LICENSE file in the home dir of this Program
- ********************************************************************/
-// -*- c++ -*-
-
-#include "../AST/AST.h"
-#include <stdlib.h>
-
-namespace BEEV {
- //external parser table for declared symbols. Only symbols which are
- //declared are stored here.
- ASTNodeSet _parser_symbol_table;
-
- // FUNC: This function maintains a map between LET-var names and
- // LET-expressions
- //
- //1. if the Let-var is already defined in the LET scope, then the
- //1. function returns an error.
- //
- //2. if the Let-var is already declared variable in the input, then
- //2. the function returns an error
- //
- //3. otherwise add the <var,letExpr> pair to the _letid_expr table.
- void BeevMgr::LetExprMgr(const ASTNode& var, const ASTNode& letExpr) {
- ASTNodeMap::iterator it;
- if(((it = _letid_expr_map.find(var)) != _letid_expr_map.end()) &&
- it->second != ASTUndefined) {
- FatalError("LetExprMgr:The LET-var v has already been defined in this LET scope: v =", var);
- }
-
- if(_parser_symbol_table.find(var) != _parser_symbol_table.end()) {
- FatalError("LetExprMgr:This var is already declared. cannot redeclare as a letvar: v =", var);
- }
-
- _letid_expr_map[var] = letExpr;
- }
-
- //this function looksup the "var to letexpr map" and returns the
- //corresponding letexpr. if there is no letexpr, then it simply
- //returns the var.
- ASTNode BeevMgr::ResolveID(const ASTNode& v) {
- if(v.GetKind() != SYMBOL) {
- return v;
- }
-
- if(_parser_symbol_table.find(v) != _parser_symbol_table.end()) {
- return v;
- }
-
- ASTNodeMap::iterator it;
- if((it =_letid_expr_map.find(v)) != _letid_expr_map.end()) {
- if(it->second == ASTUndefined)
- FatalError("Unresolved Identifier: ",v);
- else
- return it->second;
- }
-
- //this is to mark the let-var as undefined. the let var is defined
- //only after the LetExprMgr has completed its work, and until then
- //'v' is undefined.
- //
- //declared variables also get stored in this map, but there value
- //is ASTUndefined. This is really a hack. I don't know how to get
- //rid of this hack.
- _letid_expr_map[v] = ASTUndefined;
- return v;
- }
-
- // This function simply cleans up the LetID -> LetExpr Map.
- void BeevMgr::CleanupLetIDMap(void) {
- ASTNodeMap::iterator it = _letid_expr_map.begin();
- ASTNodeMap::iterator itend = _letid_expr_map.end();
- for(;it!=itend;it++) {
- if(it->second != ASTUndefined) {
- it->first.SetValueWidth(0);
- it->first.SetIndexWidth(0);
- }
- }
- _letid_expr_map.clear();
- }
-};
diff --git a/stp/parser/main.cpp b/stp/parser/main.cpp
deleted file mode 100644
index ed251ed3..00000000
--- a/stp/parser/main.cpp
+++ /dev/null
@@ -1,181 +0,0 @@
-/********************************************************************
- * AUTHORS: Vijay Ganesh, David L. Dill
- *
- * BEGIN DATE: November, 2005
- *
- * LICENSE: Please view LICENSE file in the home dir of this Program
- ********************************************************************/
-// -*- c++ -*-
-
-#include <iostream>
-#include <sstream>
-#include <string>
-#include <algorithm>
-#include <ctime>
-#include <unistd.h>
-#include <signal.h>
-//#include <zlib.h>
-#include <stdio.h>
-#include "../AST/AST.h"
-#include "parsePL_defs.h"
-#include "../sat/Solver.h"
-#include "../sat/SolverTypes.h"
-#include "../sat/VarOrder.h"
-
-#include <unistd.h>
-
-#ifdef EXT_HASH_MAP
- using namespace __gnu_cxx;
-#endif
-
-/* GLOBAL FUNCTION: parser
- */
-extern int yyparse();
-//extern int smtlibparse();
-
-/* GLOBAL VARS: Some global vars for the Main function.
- *
- */
-const char * prog = "stp";
-int linenum = 1;
-const char * usage = "Usage: %s [-option] [infile]\n";
-std::string helpstring = "\n\n";
-
-// Amount of memory to ask for at beginning of main.
-static const intptr_t INITIAL_MEMORY_PREALLOCATION_SIZE = 4000000;
-
-// Used only in smtlib lexer/parser
-BEEV::ASTNode SingleBitOne;
-BEEV::ASTNode SingleBitZero;
-
-/******************************************************************************
- * MAIN FUNCTION:
- *
- * step 0. Parse the input into an ASTVec.
- * step 1. Do BV Rewrites
- * step 2. Bitblasts the ASTNode.
- * step 3. Convert to CNF
- * step 4. Convert to SAT
- * step 5. Call SAT to determine if input is SAT or UNSAT
- ******************************************************************************/
-int main(int argc, char ** argv) {
- char * infile;
- extern FILE *yyin;
-
- // Grab some memory from the OS upfront to reduce system time when individual
- // hash tables are being allocated
-
- if (sbrk(INITIAL_MEMORY_PREALLOCATION_SIZE) == ((void *) -1)) {
- // FIXME: figure out how to get and print the real error message.
- BEEV::FatalError("Initial allocation of memory failed.");
- }
-
- //populate the help string
- helpstring += "-r : switch refinement off (optimizations are ON by default)\n";
- helpstring += "-w : switch wordlevel solver off (optimizations are ON by default)\n";
- helpstring += "-a : switch optimizations off (optimizations are ON by default)\n";
- helpstring += "-s : print function statistics\n";
- helpstring += "-v : print nodes \n";
- helpstring += "-c : construct counterexample\n";
- helpstring += "-d : check counterexample\n";
- helpstring += "-p : print counterexample\n";
- helpstring += "-x : flatten nested XORs\n";
- helpstring += "-h : help\n";
-
- for(int i=1; i < argc;i++) {
- if(argv[i][0] == '-')
- switch(argv[i][1]) {
- case 'a' :
- BEEV::optimize = false;
- BEEV::wordlevel_solve = false;
- break;
- case 'b':
- BEEV::print_STPinput_back = true;
- break;
- case 'c':
- BEEV::construct_counterexample = true;
- break;
- case 'd':
- BEEV::construct_counterexample = true;
- BEEV::check_counterexample = true;
- break;
- case 'e':
- BEEV::variable_activity_optimize = true;
- break;
- case 'f':
- BEEV::smtlib_parser_enable = true;
- break;
- case 'h':
- fprintf(stderr,usage,prog);
- cout << helpstring;
- //BEEV::FatalError("");
- return -1;
- break;
- case 'l' :
- BEEV::linear_search = true;
- break;
- case 'n':
- BEEV::print_output = true;
- break;
- case 'p':
- BEEV::print_counterexample = true;
- break;
- case 'q':
- BEEV::print_arrayval_declaredorder = true;
- break;
- case 'r':
- BEEV::arrayread_refinement = false;
- break;
- case 's' :
- BEEV::stats = true;
- break;
- case 'u':
- BEEV::arraywrite_refinement = false;
- break;
- case 'v' :
- BEEV::print_nodes = true;
- break;
- case 'w':
- BEEV::wordlevel_solve = false;
- break;
- case 'x':
- BEEV::xor_flatten = true;
- break;
- case 'z':
- BEEV::print_sat_varorder = true;
- break;
- default:
- fprintf(stderr,usage,prog);
- cout << helpstring;
- //BEEV::FatalError("");
- return -1;
- break;
- }
- else {
- infile = argv[i];
- yyin = fopen(infile,"r");
- if(yyin == NULL) {
- fprintf(stderr,"%s: Error: cannot open %s\n",prog,infile);
- BEEV::FatalError("");
- }
- }
- }
-
-#ifdef NATIVE_C_ARITH
-#else
- CONSTANTBV::ErrCode c = CONSTANTBV::BitVector_Boot();
- if(0 != c) {
- cout << CONSTANTBV::BitVector_Error(c) << endl;
- return 0;
- }
-#endif
-
- //want to print the output always from the commandline.
- BEEV::print_output = true;
- BEEV::globalBeevMgr_for_parser = new BEEV::BeevMgr();
-
- SingleBitOne = BEEV::globalBeevMgr_for_parser->CreateOneConst(1);
- SingleBitZero = BEEV::globalBeevMgr_for_parser->CreateZeroConst(1);
- //BEEV::smtlib_parser_enable = true;
- yyparse();
-}//end of Main
diff --git a/stp/parser/smtlib.lex b/stp/parser/smtlib.lex
deleted file mode 100644
index a03ae94e..00000000
--- a/stp/parser/smtlib.lex
+++ /dev/null
@@ -1,232 +0,0 @@
-%{
- /********************************************************************
- * AUTHORS: Vijay Ganesh, David L. Dill
- *
- * BEGIN DATE: July, 2006
- *
- * This file is modified version of the CVCL's smtlib.lex file. Please
- * see CVCL license below
- ********************************************************************/
-
- /********************************************************************
- * \file smtlib.lex
- *
- * Author: Sergey Berezin, Clark Barrett
- *
- * Created: Apr 30 2005
- *
- * <hr>
- * Copyright (C) 2004 by the Board of Trustees of Leland Stanford
- * Junior University and by New York University.
- *
- * License to use, copy, modify, sell and/or distribute this software
- * and its documentation for any purpose is hereby granted without
- * royalty, subject to the terms and conditions defined in the \ref
- * LICENSE file provided with this distribution. In particular:
- *
- * - The above copyright notice and this permission notice must appear
- * in all copies of the software and related documentation.
- *
- * - THE SOFTWARE IS PROVIDED "AS-IS", WITHOUT ANY WARRANTIES,
- * EXPRESSED OR IMPLIED. USE IT AT YOUR OWN RISK.
- *
- * <hr>
- ********************************************************************/
- // -*- c++ -*-
-#include <iostream>
-#include "../AST/AST.h"
-#include "parsePL_defs.h"
-
- extern char *yytext;
- extern int yyerror (char *msg);
-
- // File-static (local to this file) variables and functions
- static std::string _string_lit;
-
- static char escapeChar(char c) {
- switch(c) {
- case 'n': return '\n';
- case 't': return '\t';
- default: return c;
- }
- }
-
- extern BEEV::ASTNode SingleBitOne;
- extern BEEV::ASTNode SingleBitZero;
-
-/* Changed for smtlib speedup */
-/* bv{DIGIT}+ { yylval.node = new BEEV::ASTNode(BEEV::_bm->CreateBVConst(yytext+2, 10)); return BVCONST_TOK;} */
-
-%}
-
-%option noyywrap
-%option nounput
-%option noreject
-%option noyymore
-%option yylineno
-
-%x COMMENT
-%x STRING_LITERAL
-%x USER_VALUE
-
-LETTER ([a-zA-Z])
-DIGIT ([0-9])
-OPCHAR (['\.\_])
-ANYTHING ({LETTER}|{DIGIT}|{OPCHAR})
-
-%%
-[ \n\t\r\f] { /* sk'ip whitespace */ }
-{DIGIT}+ { yylval.uintval = strtoul(yytext, NULL, 10); return NUMERAL_TOK; }
-
-
-bv{DIGIT}+ { yylval.ullval = strtoull(yytext+2, NULL, 10); return BVCONST_TOK; }
-
-bit{DIGIT}+ {
- char c = yytext[3];
- if (c == '1') {
- yylval.node = new BEEV::ASTNode(SingleBitOne);
- }
- else {
- yylval.node = new BEEV::ASTNode(SingleBitZero);
- }
- return BITCONST_TOK;
- };
-
-
-";" { BEGIN COMMENT; }
-<COMMENT>"\n" { BEGIN INITIAL; /* return to normal mode */}
-<COMMENT>. { /* stay in comment mode */ }
-
-<INITIAL>"\"" { BEGIN STRING_LITERAL;
- _string_lit.erase(_string_lit.begin(),
- _string_lit.end()); }
-<STRING_LITERAL>"\\". { /* escape characters (like \n or \") */
- _string_lit.insert(_string_lit.end(),
- escapeChar(yytext[1])); }
-<STRING_LITERAL>"\"" { BEGIN INITIAL; /* return to normal mode */
- yylval.str = new std::string(_string_lit);
- return STRING_TOK; }
-<STRING_LITERAL>. { _string_lit.insert(_string_lit.end(),*yytext); }
-
-
-<INITIAL>"{" { BEGIN USER_VALUE;
- _string_lit.erase(_string_lit.begin(),
- _string_lit.end()); }
-<USER_VALUE>"\\"[{}] { /* escape characters */
- _string_lit.insert(_string_lit.end(),yytext[1]); }
-
-<USER_VALUE>"}" { BEGIN INITIAL; /* return to normal mode */
- yylval.str = new std::string(_string_lit);
- return USER_VAL_TOK; }
-<USER_VALUE>"\n" { _string_lit.insert(_string_lit.end(),'\n');}
-<USER_VALUE>. { _string_lit.insert(_string_lit.end(),*yytext); }
-
-"BitVec" { return BITVEC_TOK;}
-"Array" { return ARRAY_TOK;}
-"true" { return TRUE_TOK; }
-"false" { return FALSE_TOK; }
-"not" { return NOT_TOK; }
-"implies" { return IMPLIES_TOK; }
-"ite" { return ITE_TOK;}
-"if_then_else" { return IF_THEN_ELSE_TOK; }
-"and" { return AND_TOK; }
-"or" { return OR_TOK; }
-"xor" { return XOR_TOK; }
-"iff" { return IFF_TOK; }
-"let" { return LET_TOK; }
-"flet" { return FLET_TOK; }
-"notes" { return NOTES_TOK; }
-"cvc_command" { return CVC_COMMAND_TOK; }
-"sorts" { return SORTS_TOK; }
-"funs" { return FUNS_TOK; }
-"preds" { return PREDS_TOK; }
-"extensions" { return EXTENSIONS_TOK; }
-"definition" { return DEFINITION_TOK; }
-"axioms" { return AXIOMS_TOK; }
-"logic" { return LOGIC_TOK; }
-"sat" { return SAT_TOK; }
-"unsat" { return UNSAT_TOK; }
-"unknown" { return UNKNOWN_TOK; }
-"assumption" { return ASSUMPTION_TOK; }
-"formula" { return FORMULA_TOK; }
-"status" { return STATUS_TOK; }
-"difficulty" { return DIFFICULTY_TOK; }
-"benchmark" { return BENCHMARK_TOK; }
-"source" { return SOURCE_TOK;}
-"category" { return CATEGORY_TOK;}
-"extrasorts" { return EXTRASORTS_TOK; }
-"extrafuns" { return EXTRAFUNS_TOK; }
-"extrapreds" { return EXTRAPREDS_TOK; }
-"language" { return LANGUAGE_TOK; }
-"distinct" { return DISTINCT_TOK; }
-"select" { return SELECT_TOK; }
-"store" { return STORE_TOK; }
-":" { return COLON_TOK; }
-"\[" { return LBRACKET_TOK; }
-"\]" { return RBRACKET_TOK; }
-"(" { return LPAREN_TOK; }
-")" { return RPAREN_TOK; }
-"$" { return DOLLAR_TOK; }
-"?" { return QUESTION_TOK; }
-"=" {return EQ_TOK;}
-
-"nand" { return NAND_TOK;}
-"nor" { return NOR_TOK;}
-"/=" { return NEQ_TOK; }
- ":=" { return ASSIGN_TOK;}
-"shift_left0" { return BVLEFTSHIFT_TOK;}
-"bvshl" { return BVLEFTSHIFT_1_TOK;}
-"shift_right0" { return BVRIGHTSHIFT_TOK;}
-"bvlshr" { return BVRIGHTSHIFT_1_TOK;}
-"bvadd" { return BVPLUS_TOK;}
-"bvsub" { return BVSUB_TOK;}
-"bvnot" { return BVNOT_TOK;}
-"bvmul" { return BVMULT_TOK;}
-"bvdiv" { return BVDIV_TOK;}
-"bvmod" { return BVMOD_TOK;}
-"bvneg" { return BVNEG_TOK;}
-"bvand" { return BVAND_TOK;}
-"bvor" { return BVOR_TOK;}
-"bvxor" { return BVXOR_TOK;}
-"bvnand" { return BVNAND_TOK;}
-"bvnor" { return BVNOR_TOK;}
-"bvxnor" { return BVXNOR_TOK;}
-"concat" { return BVCONCAT_TOK;}
-"extract" { return BVEXTRACT_TOK;}
-"bvlt" { return BVLT_TOK;}
-"bvgt" { return BVGT_TOK;}
-"bvleq" { return BVLE_TOK;}
-"bvgeq" { return BVGE_TOK;}
-"bvult" { return BVLT_TOK;}
-"bvugt" { return BVGT_TOK;}
-"bvuleq" { return BVLE_TOK;}
-"bvugeq" { return BVGE_TOK;}
-"bvule" { return BVLE_TOK;}
-"bvuge" { return BVGE_TOK;}
-
-"bvslt" { return BVSLT_TOK;}
-"bvsgt" { return BVSGT_TOK;}
-"bvsleq" { return BVSLE_TOK;}
-"bvsgeq" { return BVSGE_TOK;}
-"bvsle" { return BVSLE_TOK;}
-"bvsge" { return BVSGE_TOK;}
-
-"sign_extend" { return BVSX_TOK;}
-"boolextract" { return BOOLEXTRACT_TOK;}
-"boolbv" { return BOOL_TO_BV_TOK;}
-
-(({LETTER})|(_)({ANYTHING}))({ANYTHING})* {
- BEEV::ASTNode nptr = BEEV::globalBeevMgr_for_parser->CreateSymbol(yytext);
-
- // Check valuesize to see if it's a prop var. I don't like doing
- // type determination in the lexer, but it's easier than rewriting
- // the whole grammar to eliminate the term/formula distinction.
- yylval.node = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->ResolveID(nptr));
- //yylval.node = new BEEV::ASTNode(nptr);
- if ((yylval.node)->GetType() == BEEV::BOOLEAN_TYPE)
- return FORMID_TOK;
- else
- return TERMID_TOK;
-}
-. { yyerror("Illegal input character."); }
-%%
diff --git a/stp/parser/smtlib.y b/stp/parser/smtlib.y
deleted file mode 100644
index 0aa22dee..00000000
--- a/stp/parser/smtlib.y
+++ /dev/null
@@ -1,1036 +0,0 @@
-%{
- /********************************************************************
- * AUTHORS: Vijay Ganesh, David L. Dill
- *
- * BEGIN DATE: July, 2006
- *
- * This file is modified version of the CVCL's smtlib.y file. Please
- * see CVCL license below
- ********************************************************************/
-
- /********************************************************************
- *
- * \file smtlib.y
- *
- * Author: Sergey Berezin, Clark Barrett
- *
- * Created: Apr 30 2005
- *
- * <hr>
- * Copyright (C) 2004 by the Board of Trustees of Leland Stanford
- * Junior University and by New York University.
- *
- * License to use, copy, modify, sell and/or distribute this software
- * and its documentation for any purpose is hereby granted without
- * royalty, subject to the terms and conditions defined in the \ref
- * LICENSE file provided with this distribution. In particular:
- *
- * - The above copyright notice and this permission notice must appear
- * in all copies of the software and related documentation.
- *
- * - THE SOFTWARE IS PROVIDED "AS-IS", WITHOUT ANY WARRANTIES,
- * EXPRESSED OR IMPLIED. USE IT AT YOUR OWN RISK.
- *
- * <hr>
- ********************************************************************/
- // -*- c++ -*-
-
-#include "../AST/AST.h"
- using namespace std;
-
- // Suppress the bogus warning suppression in bison (it generates
- // compile error)
-#undef __GNUC_MINOR__
-
- extern char* yytext;
- extern int yylineno;
-
- //int yylineno;
-
- extern int yylex(void);
-
- int yyerror(char *s) {
- //yylineno = 0;
- cout << "syntax error: line " << yylineno << "\n" << s << endl;
- cout << " token: " << yytext << endl;
- BEEV::FatalError("");
- return 1;
- }
-
- BEEV::ASTNode query;
-#define YYLTYPE_IS_TRIVIAL 1
-#define YYMAXDEPTH 104857600
-#define YYERROR_VERBOSE 1
-#define YY_EXIT_FAILURE -1
-%}
-
-%union {
- // FIXME: Why is this not an UNSIGNED int?
- int uintval; /* for numerals in types. */
-
- // for BV32 BVCONST
- unsigned long long ullval;
-
- struct {
- //stores the indexwidth and valuewidth
- //indexwidth is 0 iff type is bitvector. positive iff type is
- //array, and stores the width of the indexing bitvector
- unsigned int indexwidth;
- //width of the bitvector type
- unsigned int valuewidth;
- } indexvaluewidth;
-
- //ASTNode,ASTVec
- BEEV::ASTNode *node;
- BEEV::ASTVec *vec;
- std::string *str;
-};
-
-%start cmd
-
-%type <indexvaluewidth> sort_symb sort_symbs
-%type <node> status
-%type <vec> bench_attributes an_formulas
-
-%type <node> benchmark bench_name bench_attribute
-%type <node> an_term an_nonbvconst_term an_formula
-
-%type <node> var fvar logic_name
-%type <str> user_value
-
-%token <uintval> NUMERAL_TOK
-%token <ullval> BVCONST_TOK
-%token <node> BITCONST_TOK
-%token <node> FORMID_TOK TERMID_TOK
-%token <str> STRING_TOK
-%token <str> USER_VAL_TOK
-%token SOURCE_TOK
-%token CATEGORY_TOK
-%token DIFFICULTY_TOK
-%token BITVEC_TOK
-%token ARRAY_TOK
-%token SELECT_TOK
-%token STORE_TOK
-%token TRUE_TOK
-%token FALSE_TOK
-%token NOT_TOK
-%token IMPLIES_TOK
-%token ITE_TOK
-%token IF_THEN_ELSE_TOK
-%token AND_TOK
-%token OR_TOK
-%token XOR_TOK
-%token IFF_TOK
-%token EXISTS_TOK
-%token FORALL_TOK
-%token LET_TOK
-%token FLET_TOK
-%token NOTES_TOK
-%token CVC_COMMAND_TOK
-%token SORTS_TOK
-%token FUNS_TOK
-%token PREDS_TOK
-%token EXTENSIONS_TOK
-%token DEFINITION_TOK
-%token AXIOMS_TOK
-%token LOGIC_TOK
-%token COLON_TOK
-%token LBRACKET_TOK
-%token RBRACKET_TOK
-%token LPAREN_TOK
-%token RPAREN_TOK
-%token SAT_TOK
-%token UNSAT_TOK
-%token UNKNOWN_TOK
-%token ASSUMPTION_TOK
-%token FORMULA_TOK
-%token STATUS_TOK
-%token BENCHMARK_TOK
-%token EXTRASORTS_TOK
-%token EXTRAFUNS_TOK
-%token EXTRAPREDS_TOK
-%token LANGUAGE_TOK
-%token DOLLAR_TOK
-%token QUESTION_TOK
-%token DISTINCT_TOK
-%token SEMICOLON_TOK
-%token EOF_TOK
-%token EQ_TOK
-/*BV SPECIFIC TOKENS*/
-%token NAND_TOK
-%token NOR_TOK
-%token NEQ_TOK
-%token ASSIGN_TOK
-%token BV_TOK
-%token BOOLEAN_TOK
-%token BVLEFTSHIFT_TOK
-%token BVLEFTSHIFT_1_TOK
-%token BVRIGHTSHIFT_TOK
-%token BVRIGHTSHIFT_1_TOK
-%token BVPLUS_TOK
-%token BVSUB_TOK
-%token BVNOT_TOK //bvneg in CVCL
-%token BVMULT_TOK
-%token BVDIV_TOK
-%token BVMOD_TOK
-%token BVNEG_TOK //bvuminus in CVCL
-%token BVAND_TOK
-%token BVOR_TOK
-%token BVXOR_TOK
-%token BVNAND_TOK
-%token BVNOR_TOK
-%token BVXNOR_TOK
-%token BVCONCAT_TOK
-%token BVLT_TOK
-%token BVGT_TOK
-%token BVLE_TOK
-%token BVGE_TOK
-%token BVSLT_TOK
-%token BVSGT_TOK
-%token BVSLE_TOK
-%token BVSGE_TOK
-%token BVSX_TOK
-%token BOOLEXTRACT_TOK
-%token BOOL_TO_BV_TOK
-%token BVEXTRACT_TOK
-
-%left LBRACKET_TOK RBRACKET_TOK
-
-%%
-
-cmd:
- benchmark
- {
- if($1 != NULL) {
- BEEV::globalBeevMgr_for_parser->TopLevelSAT(*$1,query);
- delete $1;
- }
- YYACCEPT;
- }
-;
-
-benchmark:
- LPAREN_TOK BENCHMARK_TOK bench_name bench_attributes RPAREN_TOK
- {
- if($4 != NULL){
- if($4->size() > 1)
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::AND,*$4));
- else
- $$ = new BEEV::ASTNode((*$4)[0]);
- delete $4;
- }
- else {
- $$ = NULL;
- }
- }
-/* | EOF_TOK */
-/* { */
-/* } */
-;
-
-bench_name:
- FORMID_TOK
- {
- }
-;
-
-bench_attributes:
- bench_attribute
- {
- $$ = new BEEV::ASTVec;
- if ($1 != NULL) {
- $$->push_back(*$1);
- BEEV::globalBeevMgr_for_parser->AddAssert(*$1);
- delete $1;
- }
- }
- | bench_attributes bench_attribute
- {
- if ($1 != NULL && $2 != NULL) {
- $1->push_back(*$2);
- BEEV::globalBeevMgr_for_parser->AddAssert(*$2);
- $$ = $1;
- delete $2;
- }
- }
-;
-
-bench_attribute:
- COLON_TOK ASSUMPTION_TOK an_formula
- {
- //assumptions are like asserts
- $$ = $3;
- }
- | COLON_TOK FORMULA_TOK an_formula
- {
- //the query
- query = BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::NOT,*$3);
- BEEV::globalBeevMgr_for_parser->AddQuery(query);
- //dummy true
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::TRUE));
-
-
- }
- | COLON_TOK STATUS_TOK status
- {
- $$ = NULL;
- }
- | COLON_TOK LOGIC_TOK logic_name
- {
- if (!(0 == strcmp($3->GetName(),"QF_UFBV") ||
- 0 == strcmp($3->GetName(),"QF_AUFBV"))) {
- yyerror("Wrong input logic:");
- }
- $$ = NULL;
- }
- | COLON_TOK EXTRAFUNS_TOK LPAREN_TOK var_decls RPAREN_TOK
- {
- $$ = NULL;
- }
- | COLON_TOK EXTRAPREDS_TOK LPAREN_TOK var_decls RPAREN_TOK
- {
- $$ = NULL;
- }
- | annotation
- {
- $$ = NULL;
- }
-;
-
-logic_name:
- FORMID_TOK LBRACKET_TOK NUMERAL_TOK RBRACKET_TOK
- {
- $$ = $1;
- }
- | FORMID_TOK
- {
- $$ = $1;
- }
-;
-
-status:
- SAT_TOK { $$ = NULL; }
- | UNSAT_TOK { $$ = NULL; }
- | UNKNOWN_TOK { $$ = NULL; }
-;
-
-
-/* annotations: */
-/* annotation */
-/* { */
-/* } */
-/* | annotations annotation */
-/* { */
-/* } */
-/* ; */
-
-annotation:
- attribute
- {
- }
- | attribute user_value
- {
- }
-;
-
-user_value:
- USER_VAL_TOK
- {
- //cerr << "Printing user_value: " << *$1 << endl;
- }
-;
-
-attribute:
- COLON_TOK SOURCE_TOK
- {
- }
- | COLON_TOK CATEGORY_TOK
- {
- }
- | COLON_TOK DIFFICULTY_TOK
-;
-
-sort_symbs:
- sort_symb
- {
- //a single sort symbol here means either a BitVec or a Boolean
- $$.indexwidth = $1.indexwidth;
- $$.valuewidth = $1.valuewidth;
- }
- | sort_symb sort_symb
- {
- //two sort symbols mean f: type --> type
- $$.indexwidth = $1.valuewidth;
- $$.valuewidth = $2.valuewidth;
- }
-;
-
-var_decls:
- var_decl
- {
- }
-// | LPAREN_TOK var_decl RPAREN_TOK
- |
- var_decls var_decl
- {
- }
-;
-
-var_decl:
- LPAREN_TOK FORMID_TOK sort_symbs RPAREN_TOK
- {
- BEEV::_parser_symbol_table.insert(*$2);
- //Sort_symbs has the indexwidth/valuewidth. Set those fields in
- //var
- $2->SetIndexWidth($3.indexwidth);
- $2->SetValueWidth($3.valuewidth);
- }
- | LPAREN_TOK FORMID_TOK RPAREN_TOK
- {
- BEEV::_parser_symbol_table.insert(*$2);
- //Sort_symbs has the indexwidth/valuewidth. Set those fields in
- //var
- $2->SetIndexWidth(0);
- $2->SetValueWidth(0);
- }
-;
-
-an_formulas:
- an_formula
- {
- $$ = new BEEV::ASTVec;
- if ($1 != NULL) {
- $$->push_back(*$1);
- delete $1;
- }
- }
- |
- an_formulas an_formula
- {
- if ($1 != NULL && $2 != NULL) {
- $1->push_back(*$2);
- $$ = $1;
- delete $2;
- }
- }
-;
-
-an_formula:
- TRUE_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::TRUE));
- $$->SetIndexWidth(0);
- $$->SetValueWidth(0);
- }
- | FALSE_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::FALSE));
- $$->SetIndexWidth(0);
- $$->SetValueWidth(0);
- }
- | fvar
- {
- $$ = $1;
- }
- | LPAREN_TOK EQ_TOK an_term an_term RPAREN_TOK
- //| LPAREN_TOK EQ_TOK an_term an_term annotations RPAREN_TOK
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateSimplifiedEQ(*$3, *$4));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $4;
- }
- | LPAREN_TOK BVSLT_TOK an_term an_term RPAREN_TOK
- //| LPAREN_TOK BVSLT_TOK an_term an_term annotations RPAREN_TOK
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::BVSLT, *$3, *$4));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $4;
- }
- | LPAREN_TOK BVSLE_TOK an_term an_term RPAREN_TOK
- //| LPAREN_TOK BVSLE_TOK an_term an_term annotations RPAREN_TOK
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::BVSLE, *$3, *$4));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $4;
- }
- | LPAREN_TOK BVSGT_TOK an_term an_term RPAREN_TOK
- //| LPAREN_TOK BVSGT_TOK an_term an_term annotations RPAREN_TOK
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::BVSGT, *$3, *$4));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $4;
- }
- | LPAREN_TOK BVSGE_TOK an_term an_term RPAREN_TOK
- //| LPAREN_TOK BVSGE_TOK an_term an_term annotations RPAREN_TOK
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::BVSGE, *$3, *$4));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $4;
- }
- | LPAREN_TOK BVLT_TOK an_term an_term RPAREN_TOK
- //| LPAREN_TOK BVLT_TOK an_term an_term annotations RPAREN_TOK
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::BVLT, *$3, *$4));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $4;
- }
- | LPAREN_TOK BVLE_TOK an_term an_term RPAREN_TOK
- //| LPAREN_TOK BVLE_TOK an_term an_term annotations RPAREN_TOK
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::BVLE, *$3, *$4));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $4;
- }
- | LPAREN_TOK BVGT_TOK an_term an_term RPAREN_TOK
- //| LPAREN_TOK BVGT_TOK an_term an_term annotations RPAREN_TOK
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::BVGT, *$3, *$4));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $4;
- }
- | LPAREN_TOK BVGE_TOK an_term an_term RPAREN_TOK
- //| LPAREN_TOK BVGE_TOK an_term an_term annotations RPAREN_TOK
- {
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::BVGE, *$3, *$4));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $3;
- delete $4;
- }
- | LPAREN_TOK an_formula RPAREN_TOK
- {
- $$ = $2;
- }
- | LPAREN_TOK NOT_TOK an_formula RPAREN_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::NOT, *$3));
- delete $3;
- }
- | LPAREN_TOK IMPLIES_TOK an_formula an_formula RPAREN_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::IMPLIES, *$3, *$4));
- delete $3;
- delete $4;
- }
- | LPAREN_TOK IF_THEN_ELSE_TOK an_formula an_formula an_formula RPAREN_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::ITE, *$3, *$4, *$5));
- delete $3;
- delete $4;
- delete $5;
- }
- | LPAREN_TOK AND_TOK an_formulas RPAREN_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::AND, *$3));
- delete $3;
- }
- | LPAREN_TOK OR_TOK an_formulas RPAREN_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::OR, *$3));
- delete $3;
- }
- | LPAREN_TOK XOR_TOK an_formula an_formula RPAREN_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::XOR, *$3, *$4));
- delete $3;
- delete $4;
- }
- | LPAREN_TOK IFF_TOK an_formula an_formula RPAREN_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateNode(BEEV::IFF, *$3, *$4));
- delete $3;
- delete $4;
- }
- | letexpr_mgmt an_formula RPAREN_TOK
- //| letexpr_mgmt an_formula annotations RPAREN_TOK
- {
- $$ = $2;
- //Cleanup the LetIDToExprMap
- BEEV::globalBeevMgr_for_parser->CleanupLetIDMap();
- }
-;
-
-letexpr_mgmt:
- LPAREN_TOK LET_TOK LPAREN_TOK QUESTION_TOK FORMID_TOK an_term RPAREN_TOK
- {
- //Expr must typecheck
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$6);
-
- //set the valuewidth of the identifier
- $5->SetValueWidth($6->GetValueWidth());
- $5->SetIndexWidth($6->GetIndexWidth());
-
- //populate the hashtable from LET-var -->
- //LET-exprs and then process them:
- //
- //1. ensure that LET variables do not clash
- //1. with declared variables.
- //
- //2. Ensure that LET variables are not
- //2. defined more than once
- BEEV::globalBeevMgr_for_parser->LetExprMgr(*$5,*$6);
- delete $5;
- delete $6;
- }
- | LPAREN_TOK FLET_TOK LPAREN_TOK DOLLAR_TOK FORMID_TOK an_formula RPAREN_TOK
- {
- //Expr must typecheck
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$6);
-
- //set the valuewidth of the identifier
- $5->SetValueWidth($6->GetValueWidth());
- $5->SetIndexWidth($6->GetIndexWidth());
-
- //Do LET-expr management
- BEEV::globalBeevMgr_for_parser->LetExprMgr(*$5,*$6);
- delete $5;
- delete $6;
- }
-
-/* an_terms: */
-/* an_term */
-/* { */
-/* } */
-/* | an_terms an_term */
-/* { */
-/* } */
-/* ; */
-
-an_term:
- BVCONST_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateBVConst(64, $1));
- }
- | BVCONST_TOK LBRACKET_TOK NUMERAL_TOK RBRACKET_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateBVConst($3, $1));
- }
- | an_nonbvconst_term
- ;
-
-an_nonbvconst_term:
- BITCONST_TOK { $$ = $1; }
- | var
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->ResolveID(*$1));
- delete $1;
- }
- | LPAREN_TOK an_term RPAREN_TOK
- //| LPAREN_TOK an_term annotations RPAREN_TOK
- {
- $$ = $2;
- //$$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->SimplifyTerm(*$2));
- //delete $2;
- }
- | LPAREN_TOK TERMID_TOK an_term RPAREN_TOK
- {
- //ARRAY READ
- // valuewidth is same as array, indexwidth is 0.
- BEEV::ASTNode in = *$2;
- BEEV::ASTNode m = *$3;
- unsigned int width = in.GetValueWidth();
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::READ, width, in, m));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $2;
- delete $3;
- }
- | SELECT_TOK an_term an_term
- {
- //ARRAY READ
- // valuewidth is same as array, indexwidth is 0.
- BEEV::ASTNode array = *$2;
- BEEV::ASTNode index = *$3;
- unsigned int width = array.GetValueWidth();
- BEEV::ASTNode * n =
- new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::READ, width, array, index));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $2;
- delete $3;
- }
- | STORE_TOK an_term an_term an_term
- {
- //ARRAY WRITE
- unsigned int width = $4->GetValueWidth();
- BEEV::ASTNode array = *$2;
- BEEV::ASTNode index = *$3;
- BEEV::ASTNode writeval = *$4;
- BEEV::ASTNode write_term = BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::WRITE,width,array,index,writeval);
- write_term.SetIndexWidth($2->GetIndexWidth());
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(write_term);
- BEEV::ASTNode * n = new BEEV::ASTNode(write_term);
- $$ = n;
- delete $2;
- delete $3;
- delete $4;
- }
-/* | BVEXTRACT_TOK LBRACKET_TOK NUMERAL_TOK COLON_TOK NUMERAL_TOK RBRACKET_TOK BVCONST_TOK */
-/* { */
-/* // This special case is when we have an extract on top of a constant bv, which happens */
-/* // almost all the time in the smt syntax. */
-
-/* // $3 is high, $5 is low. They are ints (why not unsigned? See uintval) */
-/* int hi = $3; */
-/* int low = $5; */
-/* int width = hi - low + 1; */
-
-/* if (width < 0) */
-/* yyerror("Negative width in extract"); */
-
-/* unsigned long long int val = $7; */
-
-/* // cut and past from BV32 const evaluator */
-
-/* unsigned long long int mask1 = 0xffffffffffffffffLL; */
-
-/* mask1 >>= 64-(hi+1); */
-
-/* //extract val[hi:0] */
-/* val &= mask1; */
-/* //extract val[hi:low] */
-/* val >>= low; */
-
-/* // val is the desired BV32. */
-/* BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateBVConst(width, val)); */
-/* $$ = n; */
-/* } */
- | BVEXTRACT_TOK LBRACKET_TOK NUMERAL_TOK COLON_TOK NUMERAL_TOK RBRACKET_TOK an_term
- {
- int width = $3 - $5 + 1;
- if (width < 0)
- yyerror("Negative width in extract");
-
- if((unsigned)$3 >= $7->GetValueWidth() || (unsigned)$5 < 0)
- yyerror("Parsing: Wrong width in BVEXTRACT\n");
-
- BEEV::ASTNode hi = BEEV::globalBeevMgr_for_parser->CreateBVConst(32, $3);
- BEEV::ASTNode low = BEEV::globalBeevMgr_for_parser->CreateBVConst(32, $5);
- BEEV::ASTNode output = BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVEXTRACT, width, *$7,hi,low);
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->SimplifyTerm(output));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $7;
- }
- | ITE_TOK an_formula an_term an_term
- {
- unsigned int width = $3->GetValueWidth();
- if (width != $4->GetValueWidth()) {
- cerr << *$3;
- cerr << *$4;
- yyerror("Width mismatch in IF-THEN-ELSE");
- }
- if($3->GetIndexWidth() != $4->GetIndexWidth())
- yyerror("Width mismatch in IF-THEN-ELSE");
-
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$2);
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$3);
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$4);
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateSimplifiedTermITE(*$2, *$3, *$4));
- //$$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::ITE,width,*$2, *$3, *$4));
- $$->SetIndexWidth($4->GetIndexWidth());
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$$);
- delete $2;
- delete $3;
- delete $4;
- }
- | BVCONCAT_TOK an_term an_term
- {
- unsigned int width = $2->GetValueWidth() + $3->GetValueWidth();
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVCONCAT, width, *$2, *$3));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
-
- delete $2;
- delete $3;
- }
- | BVNOT_TOK an_term
- {
- //this is the BVNEG (term) in the CVCL language
- unsigned int width = $2->GetValueWidth();
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVNEG, width, *$2));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $2;
- }
- | BVNEG_TOK an_term
- {
- //this is the BVUMINUS term in CVCL langauge
- unsigned width = $2->GetValueWidth();
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVUMINUS,width,*$2));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $2;
- }
- | BVAND_TOK an_term an_term
- {
- unsigned int width = $2->GetValueWidth();
- if (width != $3->GetValueWidth()) {
- yyerror("Width mismatch in AND");
- }
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVAND, width, *$2, *$3));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $2;
- delete $3;
- }
- | BVOR_TOK an_term an_term
- {
- unsigned int width = $2->GetValueWidth();
- if (width != $3->GetValueWidth()) {
- yyerror("Width mismatch in OR");
- }
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVOR, width, *$2, *$3));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $2;
- delete $3;
- }
- | BVXOR_TOK an_term an_term
- {
- unsigned int width = $2->GetValueWidth();
- if (width != $3->GetValueWidth()) {
- yyerror("Width mismatch in XOR");
- }
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVXOR, width, *$2, *$3));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $2;
- delete $3;
- }
- | BVSUB_TOK an_term an_term
- {
- unsigned int width = $2->GetValueWidth();
- if (width != $3->GetValueWidth()) {
- yyerror("Width mismatch in BVSUB");
- }
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVSUB, width, *$2, *$3));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $2;
- delete $3;
- }
- | BVPLUS_TOK an_term an_term
- {
- unsigned int width = $2->GetValueWidth();
- if (width != $3->GetValueWidth()) {
- yyerror("Width mismatch in BVPLUS");
- }
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVPLUS, width, *$2, *$3));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $2;
- delete $3;
-
- }
- | BVMULT_TOK an_term an_term
- {
- unsigned int width = $2->GetValueWidth();
- if (width != $3->GetValueWidth()) {
- yyerror("Width mismatch in BVMULT");
- }
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVMULT, width, *$2, *$3));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $2;
- delete $3;
- }
- | BVNAND_TOK an_term an_term
- {
- unsigned int width = $2->GetValueWidth();
- if (width != $3->GetValueWidth()) {
- yyerror("Width mismatch in BVNAND");
- }
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVNAND, width, *$2, *$3));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $2;
- delete $3;
- }
- | BVNOR_TOK an_term an_term
- {
- unsigned int width = $2->GetValueWidth();
- if (width != $3->GetValueWidth()) {
- yyerror("Width mismatch in BVNOR");
- }
- BEEV::ASTNode * n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVNOR, width, *$2, *$3));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $2;
- delete $3;
- }
- | BVLEFTSHIFT_TOK an_term NUMERAL_TOK
- {
- unsigned int w = $2->GetValueWidth();
- if((unsigned)$3 < w) {
- BEEV::ASTNode trailing_zeros = BEEV::globalBeevMgr_for_parser->CreateBVConst($3, 0);
- BEEV::ASTNode hi = BEEV::globalBeevMgr_for_parser->CreateBVConst(32, w-$3-1);
- BEEV::ASTNode low = BEEV::globalBeevMgr_for_parser->CreateBVConst(32,0);
- BEEV::ASTNode m = BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVEXTRACT,w-$3,*$2,hi,low);
- BEEV::ASTNode * n =
- new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVCONCAT,w,m,trailing_zeros));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- }
- else
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateBVConst(w,0));
- delete $2;
- }
- | BVLEFTSHIFT_1_TOK an_term an_term
- {
- unsigned int w = $2->GetValueWidth();
- unsigned int shift_amt = GetUnsignedConst(*$3);
- if((unsigned)shift_amt < w) {
- BEEV::ASTNode trailing_zeros = BEEV::globalBeevMgr_for_parser->CreateBVConst(shift_amt, 0);
- BEEV::ASTNode hi = BEEV::globalBeevMgr_for_parser->CreateBVConst(32, w-shift_amt-1);
- BEEV::ASTNode low = BEEV::globalBeevMgr_for_parser->CreateBVConst(32,0);
- BEEV::ASTNode m = BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVEXTRACT,w-shift_amt,*$2,hi,low);
- BEEV::ASTNode * n =
- new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVCONCAT,w,m,trailing_zeros));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- }
- else {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateBVConst(w,0));
- }
- delete $2;
- //delete $3;
- }
- | BVRIGHTSHIFT_TOK an_term NUMERAL_TOK
- {
- BEEV::ASTNode leading_zeros = BEEV::globalBeevMgr_for_parser->CreateBVConst($3, 0);
- unsigned int w = $2->GetValueWidth();
-
- //the amount by which you are rightshifting
- //is less-than/equal-to the length of input
- //bitvector
- if((unsigned)$3 < w) {
- BEEV::ASTNode hi = BEEV::globalBeevMgr_for_parser->CreateBVConst(32,w-1);
- BEEV::ASTNode low = BEEV::globalBeevMgr_for_parser->CreateBVConst(32,$3);
- BEEV::ASTNode extract = BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVEXTRACT,w-$3,*$2,hi,low);
- BEEV::ASTNode * n =
- new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVCONCAT, w,leading_zeros, extract));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- }
- else {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateBVConst(w,0));
- }
- delete $2;
- }
- | BVRIGHTSHIFT_1_TOK an_term an_term
- {
- unsigned int shift_amt = GetUnsignedConst(*$3);
- BEEV::ASTNode leading_zeros = BEEV::globalBeevMgr_for_parser->CreateBVConst(shift_amt, 0);
- unsigned int w = $2->GetValueWidth();
-
- //the amount by which you are rightshifting
- //is less-than/equal-to the length of input
- //bitvector
- if((unsigned)shift_amt < w) {
- BEEV::ASTNode hi = BEEV::globalBeevMgr_for_parser->CreateBVConst(32,w-1);
- BEEV::ASTNode low = BEEV::globalBeevMgr_for_parser->CreateBVConst(32,shift_amt);
- BEEV::ASTNode extract = BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVEXTRACT,w-shift_amt,*$2,hi,low);
- BEEV::ASTNode * n =
- new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVCONCAT, w,leading_zeros, extract));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- }
- else {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateBVConst(w,0));
- }
- delete $2;
- }
- | BVSX_TOK LBRACKET_TOK NUMERAL_TOK RBRACKET_TOK an_term
- {
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*$5);
- unsigned w = $5->GetValueWidth() + $3;
- BEEV::ASTNode width = BEEV::globalBeevMgr_for_parser->CreateBVConst(32,w);
- BEEV::ASTNode *n = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->CreateTerm(BEEV::BVSX,w,*$5,width));
- BEEV::globalBeevMgr_for_parser->BVTypeCheck(*n);
- $$ = n;
- delete $5;
- }
-;
-
-sort_symb:
- BITVEC_TOK LBRACKET_TOK NUMERAL_TOK RBRACKET_TOK
- {
- // Just return BV width. If sort is BOOL, width is 0.
- // Otherwise, BITVEC[w] returns w.
- //
- //((indexwidth is 0) && (valuewidth>0)) iff type is BV
- $$.indexwidth = 0;
- unsigned int length = $3;
- if(length > 0) {
- $$.valuewidth = length;
- }
- else {
- BEEV::FatalError("Fatal Error: parsing: BITVECTORS must be of positive length: \n");
- }
- }
- | ARRAY_TOK LBRACKET_TOK NUMERAL_TOK COLON_TOK NUMERAL_TOK RBRACKET_TOK
- {
- unsigned int index_len = $3;
- unsigned int value_len = $5;
- if(index_len > 0) {
- $$.indexwidth = $3;
- }
- else {
- BEEV::FatalError("Fatal Error: parsing: BITVECTORS must be of positive length: \n");
- }
-
- if(value_len > 0) {
- $$.valuewidth = $5;
- }
- else {
- BEEV::FatalError("Fatal Error: parsing: BITVECTORS must be of positive length: \n");
- }
- }
-;
-
-var:
- FORMID_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->ResolveID(*$1));
- delete $1;
- }
- | TERMID_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->ResolveID(*$1));
- delete $1;
- }
- | QUESTION_TOK TERMID_TOK
- {
- $$ = $2;
- }
-;
-
-fvar:
- DOLLAR_TOK FORMID_TOK
- {
- $$ = $2;
- }
- | FORMID_TOK
- {
- $$ = new BEEV::ASTNode(BEEV::globalBeevMgr_for_parser->ResolveID(*$1));
- delete $1;
- }
-;
-%%