aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib/SMT
diff options
context:
space:
mode:
authorCristian Cadar <cristic@cs.stanford.edu>2009-06-16 02:27:48 +0000
committerCristian Cadar <cristic@cs.stanford.edu>2009-06-16 02:27:48 +0000
commit4fa1271fb51c2e5e889e2dc918c40f46886b9b71 (patch)
tree0e419925fe76c880cb7e1f4d8f02c98346c059ac /lib/SMT
parent03eca4ba3255665bd4b2e246b92f63cc2b06a1bf (diff)
downloadklee-4fa1271fb51c2e5e889e2dc918c40f46886b9b71.tar.gz
Added support for comparison and arithmetic expressions.
We need to add support for smod to Kleaver. git-svn-id: https://llvm.org/svn/llvm-project/klee/trunk@73459 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/SMT')
-rw-r--r--lib/SMT/smtlib.lex5
-rw-r--r--lib/SMT/smtlib.y310
2 files changed, 178 insertions, 137 deletions
diff --git a/lib/SMT/smtlib.lex b/lib/SMT/smtlib.lex
index da61a8f5..0d955bf8 100644
--- a/lib/SMT/smtlib.lex
+++ b/lib/SMT/smtlib.lex
@@ -203,8 +203,8 @@ IDCHAR ({LETTER}|{DIGIT}|{OPCHAR})
"?" { return QUESTION_TOK; }
-"bit0" { return FALSE_TOK; }
-"bit1" { return TRUE_TOK; }
+"bit0" { return BIT0_TOK; }
+"bit1" { return BIT1_TOK; }
"concat" { return BVCONCAT_TOK; }
"extract" { return BVEXTRACT_TOK; }
@@ -236,6 +236,7 @@ IDCHAR ({LETTER}|{DIGIT}|{OPCHAR})
"bvsdiv" { return BVSDIV_TOK; }
"bvsrem" { return BVSREM_TOK; }
"bvsmod" { return BVSMOD_TOK; }
+
"bvshl" { return BVSHL_TOK; }
"bvlshr" { return BVLSHR_TOK; }
"bvashr" { return BVASHR_TOK; }
diff --git a/lib/SMT/smtlib.y b/lib/SMT/smtlib.y
index 6b7a1978..12284d89 100644
--- a/lib/SMT/smtlib.y
+++ b/lib/SMT/smtlib.y
@@ -97,7 +97,7 @@ int smtliberror(const char *s)
*/
%type <node> an_formula an_logical_formula an_atom prop_atom
-%type <node> an_term basic_term an_fun
+%type <node> an_term basic_term an_fun an_arithmetic_fun an_pred
%type <str> logic_name status attribute user_value annotation annotations
@@ -154,8 +154,9 @@ int smtliberror(const char *s)
%token EOF_TOK
%token PAT_TOK
-%token FALSE_TOK
-%token TRUE_TOK
+
+%token BIT0_TOK
+%token BIT1_TOK
%token BVCONCAT_TOK
%token BVEXTRACT_TOK
@@ -485,68 +486,6 @@ an_logical_formula:
{
$$ = EqExpr::create($3, $4);
}
- | LPAREN_TOK NOT_TOK an_formula RPAREN_TOK
- {
- $$ = Expr::createNot($3);
- }
- | LPAREN_TOK NOT_TOK an_formula annotations RPAREN_TOK
- {
- $$ = Expr::createNot($3);
- }
-
- | LPAREN_TOK IMPLIES_TOK an_formula an_formula RPAREN_TOK
- {
- $$ = Expr::createImplies($3, $4);
- }
- | LPAREN_TOK IMPLIES_TOK an_formula an_formula annotations RPAREN_TOK
- {
- $$ = Expr::createImplies($3, $4);
- }
-
- | LPAREN_TOK IF_THEN_ELSE_TOK an_formula an_formula an_formula RPAREN_TOK
- {
- $$ = SelectExpr::create($3, $4, $5);
- }
- | LPAREN_TOK IF_THEN_ELSE_TOK an_formula an_formula an_formula annotations RPAREN_TOK
- {
- $$ = SelectExpr::create($3, $4, $5);
- }
-
- | LPAREN_TOK AND_TOK an_formula an_formula RPAREN_TOK
- {
- $$ = AndExpr::create($3, $4);
- }
- | LPAREN_TOK AND_TOK an_formula an_formula annotations RPAREN_TOK
- {
- $$ = AndExpr::create($3, $4);
- }
-
- | LPAREN_TOK OR_TOK an_formula an_formula RPAREN_TOK
- {
- $$ = OrExpr::create($3, $4);
- }
- | LPAREN_TOK OR_TOK an_formula an_formula annotations RPAREN_TOK
- {
- $$ = OrExpr::create($3, $4);
- }
-
- | LPAREN_TOK XOR_TOK an_formula an_formula RPAREN_TOK
- {
- $$ = XorExpr::create($3, $4);
- }
- | LPAREN_TOK XOR_TOK an_formula an_formula annotations RPAREN_TOK
- {
- $$ = XorExpr::create($3, $4);
- }
-
- | LPAREN_TOK IFF_TOK an_formula an_formula RPAREN_TOK
- {
- $$ = EqExpr::create($3, $4);
- }
- | LPAREN_TOK IFF_TOK an_formula an_formula annotations RPAREN_TOK
- {
- $$ = EqExpr::create($3, $4);
- }
;
@@ -604,38 +543,17 @@ an_atom:
{
$$ = $1;
}
-/*
| LPAREN_TOK prop_atom annotations RPAREN_TOK
{
$$ = $2;
- delete $3;
- }
- | LPAREN_TOK pred_symb an_terms annotations RPAREN_TOK
- {
- if ($4->size() == 1 && (*$4)[0] == "transclose" &&
- $3->size() == 2) {
- $$ = new CVC3::Expr(VC->listExpr("_TRANS_CLOSURE",
- *$2, (*$3)[0], (*$3)[1]));
- }
- else {
- std::vector<CVC3::Expr> tmp;
- tmp.push_back(*$2);
- tmp.insert(tmp.end(), $3->begin(), $3->end());
- $$ = new CVC3::Expr(VC->listExpr(tmp));
- }
- delete $2;
- delete $3;
- delete $4;
}
- | LPAREN_TOK pred_symb an_terms RPAREN_TOK
+
+ | an_pred
{
- std::vector<CVC3::Expr> tmp;
- tmp.push_back(*$2);
- tmp.insert(tmp.end(), $3->begin(), $3->end());
- $$ = new CVC3::Expr(VC->listExpr(tmp));
- delete $2;
- delete $3;
+ $$ = $1;
}
+
+/*
| LPAREN_TOK DISTINCT_TOK an_terms annotations RPAREN_TOK
{
$$ = new CVC3::Expr(VC->listExpr("_DISTINCT", *$3));
@@ -690,19 +608,156 @@ prop_atom:
*/
;
-/*
-an_comparison_fun:
- LPAREN_TOK IMPLIES_TOK an_term an_term RPAREN_TOK
+an_pred:
+ LPAREN_TOK BVULT_TOK an_term an_term RPAREN_TOK
{
- $$ = UltExpr::createImplies($3, $4);
+ $$ = UltExpr::create($3, $4);
}
- | LPAREN_TOK IMPLIES_TOK an_term an_term annotations RPAREN_TOK
+ | LPAREN_TOK BVULT_TOK an_term an_term annotations RPAREN_TOK
{
- $$ = Expr::createImplies($3, $4);
+ $$ = UltExpr::create($3, $4);
+ }
+
+ | LPAREN_TOK BVULE_TOK an_term an_term RPAREN_TOK
+ {
+ $$ = UleExpr::create($3, $4);
+ }
+ | LPAREN_TOK BVULE_TOK an_term an_term annotations RPAREN_TOK
+ {
+ $$ = UleExpr::create($3, $4);
+ }
+
+ | LPAREN_TOK BVUGT_TOK an_term an_term RPAREN_TOK
+ {
+ $$ = UgtExpr::create($3, $4);
+ }
+ | LPAREN_TOK BVUGT_TOK an_term an_term annotations RPAREN_TOK
+ {
+ $$ = UgtExpr::create($3, $4);
+ }
+
+ | LPAREN_TOK BVUGE_TOK an_term an_term RPAREN_TOK
+ {
+ $$ = UgeExpr::create($3, $4);
+ }
+ | LPAREN_TOK BVUGE_TOK an_term an_term annotations RPAREN_TOK
+ {
+ $$ = UgeExpr::create($3, $4);
+ }
+
+ | LPAREN_TOK BVSLT_TOK an_term an_term RPAREN_TOK
+ {
+ $$ = SltExpr::create($3, $4);
+ }
+ | LPAREN_TOK BVSLT_TOK an_term an_term annotations RPAREN_TOK
+ {
+ $$ = SltExpr::create($3, $4);
+ }
+
+ | LPAREN_TOK BVSLE_TOK an_term an_term RPAREN_TOK
+ {
+ $$ = SleExpr::create($3, $4);
+ }
+ | LPAREN_TOK BVSLE_TOK an_term an_term annotations RPAREN_TOK
+ {
+ $$ = SleExpr::create($3, $4);
+ }
+
+ | LPAREN_TOK BVSGT_TOK an_term an_term RPAREN_TOK
+ {
+ $$ = SgtExpr::create($3, $4);
+ }
+ | LPAREN_TOK BVSGT_TOK an_term an_term annotations RPAREN_TOK
+ {
+ $$ = SgtExpr::create($3, $4);
+ }
+
+ | LPAREN_TOK BVSGE_TOK an_term an_term RPAREN_TOK
+ {
+ $$ = SgeExpr::create($3, $4);
+ }
+ | LPAREN_TOK BVSGE_TOK an_term an_term annotations RPAREN_TOK
+ {
+ $$ = SgeExpr::create($3, $4);
}
;
-*/
+
+
+an_arithmetic_fun:
+ LPAREN_TOK BVADD_TOK an_term an_term RPAREN_TOK
+ {
+ $$ = AddExpr::create($3, $4);
+ }
+ | LPAREN_TOK BVADD_TOK an_term an_term annotations RPAREN_TOK
+ {
+ $$ = AddExpr::create($3, $4);
+ }
+
+ | LPAREN_TOK BVSUB_TOK an_term an_term RPAREN_TOK
+ {
+ $$ = SubExpr::create($3, $4);
+ }
+ | LPAREN_TOK BVSUB_TOK an_term an_term annotations RPAREN_TOK
+ {
+ $$ = SubExpr::create($3, $4);
+ }
+
+ | LPAREN_TOK BVMUL_TOK an_term an_term RPAREN_TOK
+ {
+ $$ = MulExpr::create($3, $4);
+ }
+ | LPAREN_TOK BVMUL_TOK an_term an_term annotations RPAREN_TOK
+ {
+ $$ = MulExpr::create($3, $4);
+ }
+
+ | LPAREN_TOK BVUDIV_TOK an_term an_term RPAREN_TOK
+ {
+ $$ = UDivExpr::create($3, $4);
+ }
+ | LPAREN_TOK BVUDIV_TOK an_term an_term annotations RPAREN_TOK
+ {
+ $$ = UDivExpr::create($3, $4);
+ }
+
+ | LPAREN_TOK BVUREM_TOK an_term an_term RPAREN_TOK
+ {
+ $$ = URemExpr::create($3, $4);
+ }
+ | LPAREN_TOK BVUREM_TOK an_term an_term annotations RPAREN_TOK
+ {
+ $$ = URemExpr::create($3, $4);
+ }
+
+ | LPAREN_TOK BVSDIV_TOK an_term an_term RPAREN_TOK
+ {
+ $$ = SDivExpr::create($3, $4);
+ }
+ | LPAREN_TOK BVSDIV_TOK an_term an_term annotations RPAREN_TOK
+ {
+ $$ = SDivExpr::create($3, $4);
+ }
+
+ | LPAREN_TOK BVSREM_TOK an_term an_term RPAREN_TOK
+ {
+ $$ = SRemExpr::create($3, $4);
+ }
+ | LPAREN_TOK BVSREM_TOK an_term an_term annotations RPAREN_TOK
+ {
+ $$ = SRemExpr::create($3, $4);
+ }
+
+ | LPAREN_TOK BVSMOD_TOK an_term an_term RPAREN_TOK
+ {
+ $$ = NULL; // XXX: unsupported
+ }
+ | LPAREN_TOK BVSREM_TOK an_term an_term annotations RPAREN_TOK
+ {
+ $$ = NULL; // XXX: unsupported
+ }
+;
+
an_fun:
@@ -711,48 +766,33 @@ an_fun:
$$ = $1;
}
+ | an_pred
+ {
+ $$ = $1;
+ }
+
+ | LPAREN_TOK BVCOMP_TOK an_term an_term RPAREN_TOK
+ {
+ $$ = EqExpr::create($3, $4);
+ }
+ | LPAREN_TOK BVCOMP_TOK an_term an_term annotations RPAREN_TOK
+ {
+ $$ = EqExpr::create($3, $4);
+ }
+
+ | an_arithmetic_fun
+ {
+ $$ = $1;
+ }
+
/*
- $$ = new std::vector<CVC3::Expr>;
- if (BVENABLED && (*$1 == "bvlt" || *$1 == "bvult")) {
- $$->push_back(VC->idExpr("_BVLT"));
- }
- else if (BVENABLED && (*$1 == "bvleq" || *$1 == "bvule")) {
- $$->push_back(VC->idExpr("_BVLE"));
- }
- else if (BVENABLED && (*$1 == "bvgeq" || *$1 == "bvuge")) {
- $$->push_back(VC->idExpr("_BVGE"));
- }
- else if (BVENABLED && (*$1 == "bvgt" || *$1 == "bvugt")) {
- $$->push_back(VC->idExpr("_BVGT"));
- }
- else if (BVENABLED && *$1 == "bvslt") {
- $$->push_back(VC->idExpr("_BVSLT"));
- }
- else if (BVENABLED && (*$1 == "bvsleq" || *$1 == "bvsle")) {
- $$->push_back(VC->idExpr("_BVSLE"));
- }
- else if (BVENABLED && (*$1 == "bvsgeq" || *$1 == "bvsge")) {
- $$->push_back(VC->idExpr("_BVSGE"));
- }
- else if (BVENABLED && *$1 == "bvsgt") {
- $$->push_back(VC->idExpr("_BVSGT"));
- }
+
else if (ARRAYSENABLED && *$1 == "select") {
$$->push_back(VC->idExpr("_READ"));
}
else if (ARRAYSENABLED && *$1 == "store") {
$$->push_back(VC->idExpr("_WRITE"));
}
- else if (BVENABLED && *$1 == "bit0") {
- $$->push_back(VC->idExpr("_BVCONST"));
- $$->push_back(VC->ratExpr(0));
- $$->push_back(VC->ratExpr(1));
- }
- else if (BVENABLED && *$1 == "bit1") {
- $$->push_back(VC->idExpr("_BVCONST"));
- $$->push_back(VC->ratExpr(1));
- $$->push_back(VC->ratExpr(1));
- }
else if (BVENABLED && *$1 == "concat") {
$$->push_back(VC->idExpr("_CONCAT"));
}
@@ -911,11 +951,11 @@ an_term:
basic_term:
- TRUE_TOK
+ BIT1_TOK
{
$$ = ConstantExpr::create(1, 1);
}
- | FALSE_TOK
+ | BIT0_TOK
{
$$ = ConstantExpr::create(0, 1);;
}