/** Emit type name for term. */ std::string YicesSolver::get_typename(const SymbolicExpr::Ptr &expr) { ASSERT_not_null(expr); if (expr->isScalar()) return "(bitvector " + StringUtility::numberToString(expr->nBits()) + ")"; return ("(-> (bitvector " + StringUtility::numberToString(expr->domainWidth()) + ")" " (bitvector " + StringUtility::numberToString(expr->nBits()) + "))"); }
/** Generate a Yices "assert" statement for an expression. */ void YicesSolver::out_assert(std::ostream &o, const SymbolicExpr::Ptr &tn) { o <<"(assert "; if (tn->isNumber() && 1==tn->nBits()) { if (tn->toInt()) { o <<"true"; } else { o <<"false"; } } else { out_expr(o, tn); } o <<")\n"; }
/** Output for arithmetic right shift. Yices doesn't have a sign-extending right shift, therefore we implement it in terms of * other operations. (OP_ASR ShiftAmount Vector) becomes * * (ite (= (mk-bv 1 1) (bv-extract [VectorSize-1] [VectorSize-1] Vector)) ;; vector's sign bit * (bv-shift-right1 Vector [ShiftAmount]) * (bv-shift-right0 Vector [ShiftAmount])) * * where [VectorSize], [VectorSize-1], and [ShiftAmount] are numeric constants. */ void YicesSolver::out_asr(std::ostream &o, const SymbolicExpr::InteriorPtr &in) { ASSERT_require(in && 2==in->nChildren()); SymbolicExpr::Ptr vector = in->child(1); uint64_t vector_size = vector->nBits(); ASSERT_require(in->child(0)->isNumber()); uint64_t shift_amount = in->child(0)->toInt(); o <<"(ite (= (mk-bv 1 1) (bv-extract " <<(vector_size-1) <<" " <<(vector_size-1) <<" "; out_expr(o, vector); o <<")) (bv-shift-right1 "; out_expr(o, vector); o <<" " <<shift_amount <<") (bv-shift-right0 "; out_expr(o, vector); o <<" " <<shift_amount <<"))"; }