mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-31 03:32:28 +00:00 
			
		
		
		
	Removed (some) dead parameters. Added doxygen documentation for the whole code base.
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
		
							parent
							
								
									66b02eb88d
								
							
						
					
					
						commit
						5e7436cb50
					
				
					 19 changed files with 1105 additions and 845 deletions
				
			
		
							
								
								
									
										15
									
								
								doc/README
									
										
									
									
									
								
							
							
						
						
									
										15
									
								
								doc/README
									
										
									
									
									
								
							|  | @ -7,5 +7,16 @@ To generate the API documentation for the C, .NET and Python APIs, we must execu | |||
| 
 | ||||
| We must have doxygen installed in our system. | ||||
| 
 | ||||
| The documentation will be stored in the subdirectory './html'. | ||||
| The main file is './html/index.html' | ||||
| The documentation will be stored in the subdirectory './api/html'. | ||||
| The main file is './api/html/index.html' | ||||
| 
 | ||||
| Code documentation | ||||
| ------------------ | ||||
| 
 | ||||
| To generate documentation for the Z3 code, we must execute | ||||
| 
 | ||||
|    doxygen z3code.dox | ||||
| 
 | ||||
| The documentation will be store in the subdirectory './code/html'. | ||||
| The main file is './code/html/index.html' | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| REM Script for updating the website containing the Z3 API documentation. | ||||
| REM You must be inside the Microsoft network to execute this script, and  | ||||
| REM robocopy must be in your PATH. | ||||
| robocopy /S html \\research\root\web\external\en-us\UM\redmond\projects\z3 | ||||
| robocopy /S api\html \\research\root\web\external\en-us\UM\redmond\projects\z3 | ||||
|  | @ -38,7 +38,7 @@ PROJECT_NUMBER         = | |||
| # If a relative path is entered, it will be relative to the location | ||||
| # where doxygen was started. If left blank the current directory will be used. | ||||
| 
 | ||||
| OUTPUT_DIRECTORY       = . | ||||
| OUTPUT_DIRECTORY       = api | ||||
| 
 | ||||
| # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create | ||||
| # 4096 sub-directories (in 2 levels) under the output directory of each output | ||||
|  |  | |||
							
								
								
									
										1081
									
								
								doc/z3code.dox
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1081
									
								
								doc/z3code.dox
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -101,18 +101,6 @@ extern "C" { | |||
|             SET_ERROR_CODE(Z3_INVALID_ARG); | ||||
|             RETURN_Z3(0); | ||||
|         } | ||||
|         if (mk_c(c)->fparams().m_pre_simplify_expr) { | ||||
|             // Do not use logging here... the function is implemented using API primitives
 | ||||
|             Z3_ast m1 = Z3_mk_int(c, -1, Z3_get_sort(c, args[0])); | ||||
|             Z3_ast args1[2] = { args[0], 0 }; | ||||
|             for (unsigned i = 1; i < num_args; ++i) { | ||||
|                 Z3_ast args2[3] = { m1, args[i] }; | ||||
|                 args1[1] = Z3_mk_mul(c, 2, args2); | ||||
|                 args1[0] = Z3_mk_add(c, 2, args1); | ||||
|             } | ||||
|             RETURN_Z3(args1[0]); | ||||
|         } | ||||
|         else { | ||||
|         expr* r = to_expr(args[0]); | ||||
|         for (unsigned i = 1; i < num_args; ++i) { | ||||
|             expr* args1[2] = { r, to_expr(args[i]) }; | ||||
|  | @ -121,7 +109,6 @@ extern "C" { | |||
|         } | ||||
|         mk_c(c)->save_ast_trail(r); | ||||
|         RETURN_Z3(of_expr(r)); | ||||
|         } | ||||
|         Z3_CATCH_RETURN(0); | ||||
|     } | ||||
| 
 | ||||
|  | @ -129,12 +116,6 @@ extern "C" { | |||
|         Z3_TRY; | ||||
|         LOG_Z3_mk_unary_minus(c, n); | ||||
|         RESET_ERROR_CODE(); | ||||
|         if (mk_c(c)->fparams().m_pre_simplify_expr) { | ||||
|             Z3_ast m1 = Z3_mk_int(c, -1, Z3_get_sort(c, n)); | ||||
|             Z3_ast args[2] = { m1, n }; | ||||
|             Z3_ast r = Z3_mk_mul(c, 2, args); | ||||
|             RETURN_Z3(r); | ||||
|         } | ||||
|         MK_UNARY_BODY(Z3_mk_unary_minus, mk_c(c)->get_arith_fid(), OP_UMINUS, SKIP); | ||||
|         Z3_CATCH_RETURN(0); | ||||
|     } | ||||
|  |  | |||
|  | @ -280,12 +280,6 @@ Z3_ast Z3_API NAME(Z3_context c, unsigned i, Z3_ast n) {                \ | |||
|         Z3_TRY; | ||||
|         LOG_Z3_mk_bvsub(c, n1, n2); | ||||
|         RESET_ERROR_CODE(); | ||||
|         // TODO: Do we really need this pre_simplifier hack?
 | ||||
|         if (mk_c(c)->fparams().m_pre_simplify_expr) { | ||||
|             Z3_ast m1 = Z3_mk_int(c, -1, Z3_get_sort(c, n2)); | ||||
|             Z3_ast r = Z3_mk_bvadd(c, n1, Z3_mk_bvmul(c, m1, n2)); | ||||
|             RETURN_Z3(r); | ||||
|         } | ||||
|         MK_BINARY_BODY(Z3_mk_bvsub, mk_c(c)->get_bv_fid(), OP_BSUB, SKIP); | ||||
|         Z3_CATCH_RETURN(0); | ||||
|     } | ||||
|  | @ -294,12 +288,6 @@ Z3_ast Z3_API NAME(Z3_context c, unsigned i, Z3_ast n) {                \ | |||
|         Z3_TRY; | ||||
|         LOG_Z3_mk_bvneg(c, n); | ||||
|         RESET_ERROR_CODE(); | ||||
|         // TODO: Do we really need this pre_simplifier hack? 
 | ||||
|         if (mk_c(c)->fparams().m_pre_simplify_expr) { | ||||
|             Z3_ast m1 = Z3_mk_int(c, -1, Z3_get_sort(c, n)); | ||||
|             Z3_ast r  = Z3_mk_bvmul(c, m1, n); | ||||
|             RETURN_Z3(r); | ||||
|         } | ||||
|         MK_UNARY_BODY(Z3_mk_bvneg, mk_c(c)->get_bv_fid(), OP_BNEG, SKIP); | ||||
|         Z3_CATCH_RETURN(0); | ||||
|     } | ||||
|  |  | |||
|  | @ -1,436 +0,0 @@ | |||
| /*++
 | ||||
| Copyright (c) 2006 Microsoft Corporation | ||||
| 
 | ||||
| Module Name: | ||||
| 
 | ||||
|     eager_bit_blaster.cpp | ||||
| 
 | ||||
| Abstract: | ||||
| 
 | ||||
|     <abstract> | ||||
| 
 | ||||
| Author: | ||||
| 
 | ||||
|     Leonardo de Moura (leonardo) 2008-10-02. | ||||
| 
 | ||||
| Revision History: | ||||
| 
 | ||||
| --*/ | ||||
| 
 | ||||
| #include"ast_ll_pp.h" | ||||
| #include"eager_bit_blaster.h" | ||||
| 
 | ||||
| eager_bit_blaster::basic_plugin::basic_plugin(ast_manager & m, eager_bit_blaster::bv_plugin & p, basic_simplifier_plugin & s): | ||||
|     simplifier_plugin(symbol("basic"), m), | ||||
|     m_main(p), | ||||
|     m_s(s) { | ||||
| } | ||||
| 
 | ||||
| eager_bit_blaster::basic_plugin::~basic_plugin() { | ||||
| } | ||||
| 
 | ||||
| bool eager_bit_blaster::basic_plugin::reduce(func_decl * f, unsigned num_args, expr * const * args, expr_ref & result) { | ||||
|     if (f->get_decl_kind() == OP_ITE) { | ||||
|         SASSERT(num_args == 3); | ||||
|         return m_main.reduce_ite(args[0], args[1], args[2], result); | ||||
|     } | ||||
|     else if (f->get_decl_kind() == OP_NOT) { | ||||
|         // the internalizer assumes there is not double negation (not (not x))
 | ||||
|         SASSERT(num_args == 1); | ||||
|         m_s.mk_not(args[0], result); | ||||
|         return true; | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| eager_bit_blaster::bv_plugin::bv_plugin(ast_manager & m, bit_blaster_params const & p): | ||||
|     simplifier_plugin(symbol("bv"), m), | ||||
|     m_util(m),  | ||||
|     m_bb(m, p), | ||||
|     m_s(m) { | ||||
| } | ||||
|      | ||||
| eager_bit_blaster::bv_plugin::~bv_plugin() { | ||||
| } | ||||
| 
 | ||||
| void eager_bit_blaster::bv_plugin::get_bits(expr * n, expr_ref_vector & out_bits) { | ||||
|     rational val; | ||||
|     unsigned bv_size; | ||||
|     if (m_util.is_numeral(n, val, bv_size)) { | ||||
|         TRACE("eager_bb_bug", tout << "bv_size: " << bv_size << "\n";); | ||||
|         m_bb.num2bits(val, bv_size, out_bits); | ||||
|         SASSERT(out_bits.size() == bv_size); | ||||
|     } | ||||
|     else if (m_util.is_mkbv(n)) { | ||||
|         out_bits.append(to_app(n)->get_num_args(), to_app(n)->get_args()); | ||||
|     } | ||||
|     else { | ||||
|         unsigned bv_size = m_util.get_bv_size(n); | ||||
|         for (unsigned i = 0; i < bv_size; i++) { | ||||
|             parameter p(i); | ||||
|             out_bits.push_back(m_manager.mk_app(get_family_id(), OP_BIT2BOOL, 1, &p, 1, &n)); | ||||
|         } | ||||
|         SASSERT(bv_size == out_bits.size()); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| inline app * eager_bit_blaster::bv_plugin::mk_mkbv(expr_ref_vector const & bits) { | ||||
| #ifdef Z3DEBUG | ||||
|     for (unsigned i = 0; i < bits.size(); i++) { | ||||
|         expr * b = bits.get(i); | ||||
|         SASSERT(!m_manager.is_not(b) || !m_manager.is_not(to_app(b)->get_arg(0))); | ||||
|     } | ||||
| #endif | ||||
|     return m_manager.mk_app(get_family_id(), OP_MKBV, bits.size(), bits.c_ptr()); | ||||
| } | ||||
| 
 | ||||
| #define MK_UNARY_REDUCE(OP, BB_OP)                                      \ | ||||
| void eager_bit_blaster::bv_plugin::OP(expr * arg, expr_ref & result) {  \ | ||||
|     expr_ref_vector bits(m_manager);                                    \ | ||||
|     get_bits(arg, bits);                                                \ | ||||
|     expr_ref_vector out_bits(m_manager);                                \ | ||||
|     m_bb.BB_OP(bits.size(), bits.c_ptr(), out_bits);                    \ | ||||
|     result = mk_mkbv(out_bits);                                         \ | ||||
| } | ||||
| 
 | ||||
| #define MK_BIN_REDUCE(OP, BB_OP)                                                        \ | ||||
| void eager_bit_blaster::bv_plugin::OP(expr * arg1, expr * arg2, expr_ref & result) {    \ | ||||
|     expr_ref_vector bits1(m_manager);                                                   \ | ||||
|     expr_ref_vector bits2(m_manager);                                                   \ | ||||
|     get_bits(arg1, bits1);                                                              \ | ||||
|     get_bits(arg2, bits2);                                                              \ | ||||
|     expr_ref_vector out_bits(m_manager);                                                \ | ||||
|     m_bb.BB_OP(bits1.size(), bits1.c_ptr(), bits2.c_ptr(), out_bits);                   \ | ||||
|     result = mk_mkbv(out_bits);                                                         \ | ||||
| } | ||||
| 
 | ||||
| #define MK_BIN_AC_FLAT_REDUCE(OP, BIN_OP, S_OP, BB_OP)                                                  \ | ||||
| MK_BIN_REDUCE(BIN_OP, BB_OP);                                                                           \ | ||||
| void eager_bit_blaster::bv_plugin::OP(unsigned num_args, expr * const * args, expr_ref & result) {      \ | ||||
|     SASSERT(num_args > 0);                                                                              \ | ||||
|     if (num_args == 2) {                                                                                \ | ||||
|         BIN_OP(args[0], args[1], result);                                                               \ | ||||
|         return;                                                                                         \ | ||||
|     }                                                                                                   \ | ||||
|                                                                                                         \ | ||||
|     ptr_buffer<expr_ref_vector> args_bits;                                                              \ | ||||
|     for (unsigned i = 0; i < num_args; i++) {                                                           \ | ||||
|         expr_ref_vector * bits = alloc(expr_ref_vector, m_manager);                                     \ | ||||
|         get_bits(args[i], *bits);                                                                       \ | ||||
|         args_bits.push_back(bits);                                                                      \ | ||||
|     }                                                                                                   \ | ||||
|                                                                                                         \ | ||||
|     unsigned bv_size = m_util.get_bv_size(args[0]);                                                     \ | ||||
|     expr_ref_vector new_bits(m_manager);                                                                \ | ||||
|     for (unsigned i = 0; i < bv_size; i++) {                                                            \ | ||||
|         expr_ref_vector arg_bits(m_manager);                                                            \ | ||||
|         for (unsigned j = 0; j < num_args; j++)                                                         \ | ||||
|             arg_bits.push_back(args_bits[j]->get(i));                                                   \ | ||||
|         expr_ref new_bit(m_manager);                                                                    \ | ||||
|         m_s.S_OP(arg_bits.size(), arg_bits.c_ptr(), new_bit);                                           \ | ||||
|         new_bits.push_back(new_bit);                                                                    \ | ||||
|     }                                                                                                   \ | ||||
|     result = mk_mkbv(new_bits);                                                                         \ | ||||
|     std::for_each(args_bits.begin(), args_bits.end(), delete_proc<expr_ref_vector>());                  \ | ||||
| } | ||||
| 
 | ||||
| #define MK_BIN_AC_REDUCE(OP, BIN_OP, BB_OP)                                                             \ | ||||
| MK_BIN_REDUCE(BIN_OP, BB_OP);                                                                           \ | ||||
| void eager_bit_blaster::bv_plugin::OP(unsigned num_args, expr * const * args, expr_ref & result) {      \ | ||||
|     SASSERT(num_args > 0);                                                                              \ | ||||
|     result = args[0];                                                                                   \ | ||||
|     for (unsigned i = 1; i < num_args; i++) {                                                           \ | ||||
|         expr_ref new_result(m_manager);                                                                 \ | ||||
|         BIN_OP(result.get(), args[i], new_result);                                                      \ | ||||
|         result = new_result;                                                                            \ | ||||
|     }                                                                                                   \ | ||||
| } | ||||
| 
 | ||||
| #define MK_BIN_PRED_REDUCE(OP, BB_OP)                                                   \ | ||||
| void eager_bit_blaster::bv_plugin::OP(expr * arg1, expr * arg2, expr_ref & result) {    \ | ||||
|     expr_ref_vector bits1(m_manager);                                                   \ | ||||
|     expr_ref_vector bits2(m_manager);                                                   \ | ||||
|     get_bits(arg1, bits1);                                                              \ | ||||
|     get_bits(arg2, bits2);                                                              \ | ||||
|     m_bb.BB_OP(bits1.size(), bits1.c_ptr(), bits2.c_ptr(), result);                     \ | ||||
| } | ||||
| 
 | ||||
| #define MK_PARAMETRIC_UNARY_REDUCE(OP, BB_OP)                                           \ | ||||
| void eager_bit_blaster::bv_plugin::OP(expr * arg, unsigned n, expr_ref & result) {      \ | ||||
|     expr_ref_vector bits(m_manager);                                                    \ | ||||
|     get_bits(arg, bits);                                                                \ | ||||
|     expr_ref_vector out_bits(m_manager);                                                \ | ||||
|     m_bb.BB_OP(bits.size(), bits.c_ptr(), n, out_bits);                                 \ | ||||
|     result = mk_mkbv(out_bits);                                                         \ | ||||
| } | ||||
| 
 | ||||
| MK_UNARY_REDUCE(reduce_not, mk_not); | ||||
| MK_BIN_AC_FLAT_REDUCE(reduce_or, reduce_bin_or, mk_or, mk_or); | ||||
| MK_BIN_AC_FLAT_REDUCE(reduce_and, reduce_bin_and, mk_and, mk_and); | ||||
| MK_BIN_AC_FLAT_REDUCE(reduce_nor, reduce_bin_nor, mk_nor, mk_nor); | ||||
| MK_BIN_AC_FLAT_REDUCE(reduce_nand, reduce_bin_nand, mk_nand, mk_nand); | ||||
| MK_BIN_REDUCE(reduce_xor,  mk_xor); | ||||
| MK_BIN_REDUCE(reduce_xnor, mk_xnor); | ||||
| MK_UNARY_REDUCE(reduce_neg, mk_neg); | ||||
| MK_BIN_AC_REDUCE(reduce_add, reduce_bin_add, mk_adder); | ||||
| MK_BIN_AC_REDUCE(reduce_mul, reduce_bin_mul, mk_multiplier); | ||||
| MK_BIN_PRED_REDUCE(reduce_sle, mk_sle); | ||||
| MK_BIN_PRED_REDUCE(reduce_ule, mk_ule); | ||||
| MK_PARAMETRIC_UNARY_REDUCE(reduce_rotate_left, mk_rotate_left); | ||||
| MK_PARAMETRIC_UNARY_REDUCE(reduce_rotate_right, mk_rotate_right); | ||||
| MK_PARAMETRIC_UNARY_REDUCE(reduce_sign_extend, mk_sign_extend); | ||||
| MK_PARAMETRIC_UNARY_REDUCE(reduce_zero_extend, mk_zero_extend); | ||||
| MK_UNARY_REDUCE(reduce_redor, mk_redor); | ||||
| MK_UNARY_REDUCE(reduce_redand, mk_redand); | ||||
| MK_BIN_REDUCE(reduce_shl, mk_shl); | ||||
| MK_BIN_REDUCE(reduce_ashr, mk_ashr); | ||||
| MK_BIN_REDUCE(reduce_lshr, mk_lshr); | ||||
| MK_BIN_REDUCE(reduce_comp, mk_comp); | ||||
| MK_BIN_REDUCE(reduce_udiv, mk_udiv); | ||||
| MK_BIN_REDUCE(reduce_urem, mk_urem); | ||||
| MK_BIN_REDUCE(reduce_sdiv, mk_sdiv); | ||||
| MK_BIN_REDUCE(reduce_srem, mk_srem); | ||||
| MK_BIN_REDUCE(reduce_smod, mk_smod); | ||||
| 
 | ||||
| void eager_bit_blaster::bv_plugin::reduce_extract(unsigned start, unsigned end, expr * arg, expr_ref & result) { | ||||
|     expr_ref_vector bits(m_manager); | ||||
|     get_bits(arg, bits); | ||||
|     expr_ref_vector out_bits(m_manager); | ||||
|     for (unsigned i = start; i <= end; ++i) | ||||
|         out_bits.push_back(bits.get(i)); | ||||
|     result = mk_mkbv(out_bits); | ||||
| } | ||||
| 
 | ||||
| void eager_bit_blaster::bv_plugin::reduce_concat(unsigned num_args, expr * const * args, expr_ref & result) { | ||||
|     expr_ref_vector out_bits(m_manager); | ||||
|     unsigned i = num_args; | ||||
|     while (i > 0) { | ||||
|         i--; | ||||
|         expr_ref_vector bits(m_manager); | ||||
|         get_bits(args[i], bits); | ||||
|         out_bits.append(bits.size(), bits.c_ptr()); | ||||
|     } | ||||
|     result = mk_mkbv(out_bits); | ||||
| } | ||||
| 
 | ||||
| bool eager_bit_blaster::bv_plugin::reduce_ite(expr * arg1, expr * arg2, expr * arg3, expr_ref & result) { | ||||
|     sort * s = m_manager.get_sort(arg2); | ||||
|     if (!m_util.is_bv_sort(s)) | ||||
|         return false; | ||||
|     expr_ref_vector bits1(m_manager); | ||||
|     expr_ref_vector bits2(m_manager); | ||||
|     get_bits(arg2, bits1); | ||||
|     get_bits(arg3, bits2); | ||||
|     SASSERT(bits1.size() == bits2.size()); | ||||
|     expr_ref_vector out_bits(m_manager); | ||||
|     unsigned bv_size = bits1.size(); | ||||
|     for (unsigned i = 0; i < bv_size; i++) { | ||||
|         expr_ref new_bit(m_manager); | ||||
|         m_s.mk_ite(arg1, bits1.get(i), bits2.get(i), new_bit); | ||||
|         out_bits.push_back(new_bit); | ||||
|     } | ||||
|     result = mk_mkbv(out_bits); | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| bool eager_bit_blaster::bv_plugin::reduce(func_decl * f, unsigned num_args, expr * const * args, expr_ref & result) { | ||||
|     bv_op_kind k = static_cast<bv_op_kind>(f->get_decl_kind()); | ||||
|     switch (k) { | ||||
|     case OP_BNOT: | ||||
|         SASSERT(num_args == 1); | ||||
|         reduce_not(args[0], result); | ||||
|         return true; | ||||
|     case OP_BOR: | ||||
|         reduce_or(num_args, args, result); | ||||
|         return true; | ||||
|     case OP_BAND: | ||||
|         reduce_and(num_args, args, result); | ||||
|         return true; | ||||
|     case OP_BNOR: | ||||
|         reduce_nor(num_args, args, result); | ||||
|         return true; | ||||
|     case OP_BNAND: | ||||
|         reduce_nand(num_args, args, result); | ||||
|         return true; | ||||
|     case OP_BXOR: | ||||
|         SASSERT(num_args == 2); | ||||
|         reduce_xor(args[0], args[1], result); | ||||
|         return true; | ||||
|     case OP_BXNOR: | ||||
|         SASSERT(num_args == 2); | ||||
|         reduce_xnor(args[0], args[1], result); | ||||
|         return true; | ||||
|     case OP_BNEG: | ||||
|         SASSERT(num_args == 1); | ||||
|         reduce_neg(args[0], result); | ||||
|         return true; | ||||
|     case OP_BADD: | ||||
|         reduce_add(num_args, args, result); | ||||
|         return true; | ||||
|     case OP_BMUL: | ||||
|         reduce_mul(num_args, args, result); | ||||
|         return true; | ||||
|     case OP_BIT1: | ||||
|     case OP_BIT0: | ||||
|     case OP_BSUB: | ||||
|         // I'm assuming the expressions were simplified before invoking this method.
 | ||||
|         UNREACHABLE(); | ||||
|         return false; | ||||
|     case OP_BSDIV: | ||||
|     case OP_BUDIV: | ||||
|     case OP_BSREM: | ||||
|     case OP_BUREM: | ||||
|     case OP_BSMOD: | ||||
|         // I'm assuming the expressions were simplified before invoking this method.
 | ||||
|         UNREACHABLE(); | ||||
|         return false; | ||||
|     case OP_BSDIV0: | ||||
|     case OP_BUDIV0: | ||||
|     case OP_BSREM0: | ||||
|     case OP_BUREM0: | ||||
|     case OP_BSMOD0: | ||||
|         // do nothing... these are uninterpreted
 | ||||
|         return true; | ||||
|     case OP_BSDIV_I: | ||||
|         SASSERT(num_args == 2); | ||||
|         reduce_sdiv(args[0], args[1], result); | ||||
|         return true; | ||||
|     case OP_BUDIV_I: | ||||
|         SASSERT(num_args == 2); | ||||
|         reduce_udiv(args[0], args[1], result); | ||||
|         return true; | ||||
|     case OP_BSREM_I: | ||||
|         SASSERT(num_args == 2); | ||||
|         reduce_srem(args[0], args[1], result); | ||||
|         return true; | ||||
|     case OP_BUREM_I: | ||||
|         SASSERT(num_args == 2); | ||||
|         reduce_urem(args[0], args[1], result); | ||||
|         return true; | ||||
|     case OP_BSMOD_I: | ||||
|         SASSERT(num_args == 2); | ||||
|         reduce_smod(args[0], args[1], result); | ||||
|         return true; | ||||
|     case OP_ULEQ: | ||||
|         SASSERT(num_args == 2); | ||||
|         reduce_ule(args[0], args[1], result); | ||||
|         return true; | ||||
|     case OP_SLEQ: | ||||
|         SASSERT(num_args == 2); | ||||
|         reduce_sle(args[0], args[1], result); | ||||
|         return true; | ||||
|     case OP_UGEQ: | ||||
|     case OP_SGEQ: | ||||
|     case OP_ULT: | ||||
|     case OP_SLT: | ||||
|     case OP_UGT: | ||||
|     case OP_SGT: | ||||
|         // I'm assuming the expressions were simplified before invoking this method.
 | ||||
|         UNREACHABLE(); | ||||
|         return false; | ||||
|     case OP_EXTRACT: | ||||
|         SASSERT(num_args == 1); | ||||
|         reduce_extract(f->get_parameter(1).get_int(), f->get_parameter(0).get_int(), args[0], result); | ||||
|         return true; | ||||
|     case OP_CONCAT: | ||||
|         reduce_concat(num_args, args, result); | ||||
|         return true; | ||||
|     case OP_SIGN_EXT: | ||||
|         SASSERT(num_args == 1); | ||||
|         reduce_sign_extend(args[0], f->get_parameter(0).get_int(), result); | ||||
|         return true; | ||||
|     case OP_ZERO_EXT: | ||||
|         SASSERT(num_args == 1); | ||||
|         reduce_zero_extend(args[0], f->get_parameter(0).get_int(), result); | ||||
|         return true; | ||||
|     case OP_REPEAT: | ||||
|         UNREACHABLE(); | ||||
|         return false; | ||||
|     case OP_BREDOR: | ||||
|         SASSERT(num_args == 1); | ||||
|         reduce_redor(args[0], result); | ||||
|         return true; | ||||
|     case OP_BREDAND: | ||||
|         SASSERT(num_args == 1); | ||||
|         reduce_redand(args[0], result); | ||||
|         return true; | ||||
|     case OP_BCOMP: | ||||
|         SASSERT(num_args == 2); | ||||
|         reduce_comp(args[0], args[1], result); | ||||
|         return true; | ||||
|     case OP_BSHL: | ||||
|         SASSERT(num_args == 2); | ||||
|         reduce_shl(args[0], args[1], result); | ||||
|         return true; | ||||
|     case OP_BLSHR: | ||||
|         SASSERT(num_args == 2); | ||||
|         reduce_lshr(args[0], args[1], result); | ||||
|         return true; | ||||
|     case OP_BASHR: | ||||
|         SASSERT(num_args == 2); | ||||
|         reduce_ashr(args[0], args[1], result); | ||||
|         return true; | ||||
|     case OP_ROTATE_LEFT: | ||||
|         SASSERT(num_args == 1); | ||||
|         reduce_rotate_left(args[0], f->get_parameter(0).get_int(), result); | ||||
|         return true; | ||||
|     case OP_ROTATE_RIGHT: | ||||
|         SASSERT(num_args == 1); | ||||
|         reduce_rotate_right(args[0], f->get_parameter(0).get_int(), result); | ||||
|         return true; | ||||
|     default: | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool eager_bit_blaster::bv_plugin::reduce_eq(expr * lhs, expr * rhs, expr_ref & result) { | ||||
|     TRACE("eager_bb_eq", tout << mk_ll_pp(lhs, m_manager) << "\n" << mk_ll_pp(rhs, m_manager) << "\n";); | ||||
|     SASSERT(m_util.get_bv_size(lhs) == m_util.get_bv_size(rhs)); | ||||
|     expr_ref_vector bits1(m_manager);                                                    | ||||
|     expr_ref_vector bits2(m_manager);                                                    | ||||
|     get_bits(lhs, bits1);                                                               | ||||
|     get_bits(rhs, bits2);  | ||||
|     SASSERT(bits1.size() == bits2.size()); | ||||
|     m_bb.mk_eq(bits1.size(), bits1.c_ptr(), bits2.c_ptr(), result); | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| bool eager_bit_blaster::bv_plugin::reduce_distinct(unsigned num_args, expr * const * args, expr_ref & result) { | ||||
|     if (num_args <= 1) { | ||||
|         result = m_manager.mk_true(); | ||||
|     } | ||||
|     if (num_args == 2) { | ||||
|         expr_ref tmp(m_manager); | ||||
|         reduce_eq(args[0], args[1], tmp); | ||||
|         m_s.mk_not(tmp, result); | ||||
|     } | ||||
|     else { | ||||
|         expr_ref_vector new_args(m_manager); | ||||
|         for (unsigned i = 0; i < num_args - 1; i++) { | ||||
|             expr * a1 = args[i]; | ||||
|             for (unsigned j = i + 1; j < num_args; j++) { | ||||
|                 expr * a2 = args[j]; | ||||
|                 expr_ref tmp1(m_manager); | ||||
|                 reduce_eq(a1, a2, tmp1); | ||||
|                 expr_ref tmp2(m_manager); | ||||
|                 m_s.mk_not(tmp1, tmp2); | ||||
|                 new_args.push_back(tmp2); | ||||
|             } | ||||
|         } | ||||
|         m_s.mk_and(new_args.size(), new_args.c_ptr(), result); | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| eager_bit_blaster::eager_bit_blaster(ast_manager & m, bit_blaster_params const & p): | ||||
|     m_simplifier(m) { | ||||
|     m_simplifier.enable_ac_support(false); | ||||
|     bv_plugin * bv_p = alloc(bv_plugin, m, p); | ||||
|     m_simplifier.register_plugin(bv_p); | ||||
|     m_simplifier.register_plugin(alloc(basic_plugin, m, *bv_p, bv_p->get_basic_simplifier())); | ||||
| } | ||||
| 
 | ||||
| void eager_bit_blaster::operator()(expr * s, expr_ref & r, proof_ref & p) { | ||||
|     m_simplifier.operator()(s, r, p); | ||||
| } | ||||
| 
 | ||||
|  | @ -1,107 +0,0 @@ | |||
| /*++
 | ||||
| Copyright (c) 2006 Microsoft Corporation | ||||
| 
 | ||||
| Module Name: | ||||
| 
 | ||||
|     eager_bit_blaster.h | ||||
| 
 | ||||
| Abstract: | ||||
| 
 | ||||
|     <abstract> | ||||
| 
 | ||||
| Author: | ||||
| 
 | ||||
|     Leonardo de Moura (leonardo) 2008-10-02. | ||||
| 
 | ||||
| Revision History: | ||||
| 
 | ||||
| --*/ | ||||
| #ifndef _EAGER_BIT_BLASTER_H_ | ||||
| #define _EAGER_BIT_BLASTER_H_ | ||||
| 
 | ||||
| #include"bv_decl_plugin.h" | ||||
| #include"bit_blaster.h" | ||||
| #include"simplifier.h" | ||||
| #include"basic_simplifier_plugin.h" | ||||
| 
 | ||||
| class eager_bit_blaster { | ||||
| 
 | ||||
|     class bv_plugin : public simplifier_plugin { | ||||
|         bv_util                 m_util; | ||||
|         bit_blaster             m_bb; | ||||
|         basic_simplifier_plugin m_s; | ||||
| 
 | ||||
|         void get_bits(expr * n, expr_ref_vector & out_bits); | ||||
|         app * mk_mkbv(expr_ref_vector const & bits); | ||||
|              | ||||
|         void reduce_not(expr * arg, expr_ref & result); | ||||
|         void reduce_bin_or(expr * arg1, expr * arg2, expr_ref & result); | ||||
|         void reduce_or(unsigned num_args, expr * const * args, expr_ref & result); | ||||
|         void reduce_bin_and(expr * arg1, expr * arg2, expr_ref & result); | ||||
|         void reduce_and(unsigned num_args, expr * const * args, expr_ref & result); | ||||
|         void reduce_bin_nor(expr * arg1, expr * arg2, expr_ref & result); | ||||
|         void reduce_nor(unsigned num_args, expr * const * args, expr_ref & result); | ||||
|         void reduce_bin_nand(expr * arg1, expr * arg2, expr_ref & result); | ||||
|         void reduce_nand(unsigned num_args, expr * const * args, expr_ref & result); | ||||
|         void reduce_xor(expr * arg1, expr * arg2, expr_ref & result); | ||||
|         void reduce_xnor(expr * arg1, expr * arg2, expr_ref & result); | ||||
| 
 | ||||
|         void reduce_neg(expr * arg, expr_ref & result); | ||||
|         void reduce_bin_add(expr * arg1, expr * arg2, expr_ref & result); | ||||
|         void reduce_add(unsigned num_args, expr * const * args, expr_ref & result); | ||||
|         void reduce_bin_mul(expr * arg1, expr * arg2, expr_ref & result); | ||||
|         void reduce_mul(unsigned num_args, expr * const * args, expr_ref & result); | ||||
|         void reduce_sdiv(expr * arg1, expr * arg2, expr_ref & result); | ||||
|         void reduce_udiv(expr * arg1, expr * arg2, expr_ref & result); | ||||
|         void reduce_srem(expr * arg1, expr * arg2, expr_ref & result); | ||||
|         void reduce_urem(expr * arg1, expr * arg2, expr_ref & result); | ||||
|         void reduce_smod(expr * arg1, expr * arg2, expr_ref & result); | ||||
|         void reduce_sle(expr * arg1, expr * arg2, expr_ref & result); | ||||
|         void reduce_ule(expr * arg1, expr * arg2, expr_ref & result); | ||||
| 
 | ||||
|         void reduce_concat(unsigned num_args, expr * const * args, expr_ref & result); | ||||
|         void reduce_extract(unsigned start, unsigned end, expr * arg, expr_ref & result); | ||||
| 
 | ||||
|         void reduce_redor(expr * arg, expr_ref & result); | ||||
|         void reduce_redand(expr * arg, expr_ref & result); | ||||
| 
 | ||||
|         void reduce_comp(expr * arg1, expr * arg2, expr_ref & result); | ||||
|         void reduce_shl(expr * arg1, expr * arg2, expr_ref & result); | ||||
|         void reduce_ashr(expr * arg1, expr * arg2, expr_ref & result); | ||||
|         void reduce_lshr(expr * arg1, expr * arg2, expr_ref & result); | ||||
| 
 | ||||
|         void reduce_rotate_left(expr * arg, unsigned n, expr_ref & result); | ||||
|         void reduce_rotate_right(expr * arg, unsigned n, expr_ref & result); | ||||
|         void reduce_sign_extend(expr * arg, unsigned n, expr_ref & result); | ||||
|         void reduce_zero_extend(expr * arg, unsigned n, expr_ref & result); | ||||
| 
 | ||||
|     public: | ||||
|         bv_plugin(ast_manager & m, bit_blaster_params const & p); | ||||
|         virtual ~bv_plugin(); | ||||
|         virtual bool reduce(func_decl * f, unsigned num_args, expr * const * args, expr_ref & result); | ||||
|         virtual bool reduce_eq(expr * lhs, expr * rhs, expr_ref & result); | ||||
|         virtual bool reduce_distinct(unsigned num_args, expr * const * args, expr_ref & result); | ||||
|         basic_simplifier_plugin & get_basic_simplifier() { return m_s; } | ||||
|         bool reduce_ite(expr * arg1, expr * arg2, expr * arg3, expr_ref & result); | ||||
|     }; | ||||
| 
 | ||||
|     /**
 | ||||
|        \brief Plugin for handling the term-ite. | ||||
|     */ | ||||
|     class basic_plugin : public simplifier_plugin { | ||||
|         bv_plugin &               m_main; | ||||
|         basic_simplifier_plugin & m_s; | ||||
|     public: | ||||
|         basic_plugin(ast_manager & m, bv_plugin & p, basic_simplifier_plugin & s); | ||||
|         virtual ~basic_plugin(); | ||||
|         virtual bool reduce(func_decl * f, unsigned num_args, expr * const * args, expr_ref & result); | ||||
|     }; | ||||
| 
 | ||||
|     simplifier  m_simplifier; | ||||
| public: | ||||
|     eager_bit_blaster(ast_manager & m, bit_blaster_params const & p); | ||||
|     void operator()(expr * s, expr_ref & r, proof_ref & p); | ||||
| }; | ||||
| 
 | ||||
| #endif /* _EAGER_BIT_BLASTER_H_ */ | ||||
| 
 | ||||
|  | @ -22,16 +22,13 @@ Revision History: | |||
| #include"ini_file.h" | ||||
| 
 | ||||
| struct bit_blaster_params { | ||||
|     bool  m_bb_eager; | ||||
|     bool  m_bb_ext_gates; | ||||
|     bool  m_bb_quantifiers; | ||||
|     bit_blaster_params(): | ||||
|         m_bb_eager(false), | ||||
|         m_bb_ext_gates(false), | ||||
|         m_bb_quantifiers(false) { | ||||
|     } | ||||
|     void register_params(ini_params & p) { | ||||
|         p.register_bool_param("BB_EAGER", m_bb_eager, "eager bit blasting"); | ||||
|         p.register_bool_param("BB_EXT_GATES", m_bb_ext_gates, "use extended gates during bit-blasting"); | ||||
|         p.register_bool_param("BB_QUANTIFIERS", m_bb_quantifiers, "convert bit-vectors to Booleans in quantifiers"); | ||||
|     } | ||||
|  |  | |||
|  | @ -21,12 +21,9 @@ Revision History: | |||
| void front_end_params::register_params(ini_params & p) { | ||||
|     p.register_param_vector(m_param_vector.get()); | ||||
|     preprocessor_params::register_params(p); | ||||
|     spc_params::register_params(p); | ||||
|     smt_params::register_params(p); | ||||
|     parser_params::register_params(p); | ||||
|     arith_simplifier_params::register_params(p); | ||||
|     p.register_int_param("ENGINE", 0, 2, reinterpret_cast<int&>(m_engine), "0: SMT solver, 1: Superposition prover, 2: EPR solver, true"); | ||||
|     z3_solver_params::register_params(p); | ||||
|     model_params::register_params(p); | ||||
|     p.register_unsigned_param("MAX_COUNTEREXAMPLES", m_max_num_cex,  | ||||
|                               "set the maximum number of counterexamples when using Simplify front end"); | ||||
|  | @ -45,7 +42,6 @@ void front_end_params::register_params(ini_params & p) { | |||
|     p.register_int_param("PROOF_MODE", 0, 2, reinterpret_cast<int&>(m_proof_mode), "select proof generation mode: 0 - disabled, 1 - coarse grain, 2 - fine grain"); | ||||
|     p.register_bool_param("TRACE", m_trace, "enable tracing for the Axiom Profiler tool"); | ||||
|     p.register_string_param("TRACE_FILE_NAME", m_trace_file_name, "tracing file name"); | ||||
|     p.register_bool_param("IGNORE_SETPARAMETER", m_ignore_setparameter, "ignore (SETPARAMETER ...) commands in Simplify format input"); | ||||
|     p.register_bool_param("ASYNC_COMMANDS", m_async_commands, "enable/disable support for asynchronous commands in the Simplify front-end."); | ||||
|     p.register_bool_param("DISPLAY_CONFIG", m_display_config, "display configuration used by Z3"); | ||||
| 
 | ||||
|  |  | |||
|  | @ -22,25 +22,16 @@ Revision History: | |||
| #include"ini_file.h" | ||||
| #include"ast.h" | ||||
| #include"preprocessor_params.h" | ||||
| #include"spc_params.h" | ||||
| #include"smt_params.h" | ||||
| #include"pp_params.h" | ||||
| #include"parser_params.h" | ||||
| #include"arith_simplifier_params.h" | ||||
| #include"z3_solver_params.h" | ||||
| #include"model_params.h" | ||||
| 
 | ||||
| enum engine { | ||||
|     ENG_SMT, | ||||
|     ENG_SPC, | ||||
|     ENG_EPR | ||||
| }; | ||||
| 
 | ||||
| struct front_end_params : public preprocessor_params, public spc_params, public smt_params, public parser_params,  | ||||
|                           public arith_simplifier_params, public z3_solver_params, public model_params | ||||
| struct front_end_params : public preprocessor_params, public smt_params, public parser_params,  | ||||
|                           public arith_simplifier_params, public model_params | ||||
|                            { | ||||
|     ref<param_vector>   m_param_vector; | ||||
|     engine              m_engine; | ||||
|     unsigned            m_max_num_cex; // maximum number of counterexamples
 | ||||
|     bool                m_at_labels_cex; // only use labels which contains the @ symbol when building multiple counterexamples.
 | ||||
|     bool                m_check_at_labels; // check that @ labels are inserted to generate unique counter-examples.
 | ||||
|  | @ -66,7 +57,6 @@ struct front_end_params : public preprocessor_params, public spc_params, public | |||
|     bool                m_trace; | ||||
|     std::string         m_trace_file_name; | ||||
|     std::fstream*       m_trace_stream; | ||||
|     bool                m_ignore_setparameter; | ||||
|     bool                m_async_commands; | ||||
|     bool                m_display_config; | ||||
|     bool                m_user_theory_preprocess_axioms; | ||||
|  | @ -75,7 +65,6 @@ struct front_end_params : public preprocessor_params, public spc_params, public | |||
| 
 | ||||
|     front_end_params(): | ||||
|         m_param_vector(alloc(param_vector, this)), | ||||
|         m_engine(ENG_SMT), | ||||
|         m_max_num_cex(1), | ||||
|         m_at_labels_cex(false), | ||||
|         m_check_at_labels(false), | ||||
|  | @ -109,7 +98,6 @@ struct front_end_params : public preprocessor_params, public spc_params, public | |||
|         m_trace(false), | ||||
|         m_trace_file_name("z3.log"), | ||||
|         m_trace_stream(NULL), | ||||
|         m_ignore_setparameter(false), | ||||
|         m_async_commands(true), | ||||
|         m_display_config(false), | ||||
|         m_user_theory_preprocess_axioms(false), | ||||
|  |  | |||
|  | @ -1,27 +0,0 @@ | |||
| /*++
 | ||||
| Copyright (c) 2006 Microsoft Corporation | ||||
| 
 | ||||
| Module Name: | ||||
| 
 | ||||
|     order_params.cpp | ||||
| 
 | ||||
| Abstract: | ||||
| 
 | ||||
|     Term ordering parameters. | ||||
| 
 | ||||
| Author: | ||||
| 
 | ||||
|     Leonardo de Moura (leonardo) 2008-01-28. | ||||
| 
 | ||||
| Revision History: | ||||
| 
 | ||||
| --*/ | ||||
| #include"order_params.h" | ||||
| 
 | ||||
| void order_params::register_params(ini_params & p) { | ||||
|     p.register_symbol_list_param("PRECEDENCE", m_order_precedence, "describe a (partial) precedence for the term ordering used in the Superposition Calculus module. The precedence is lists of function symbols. Example: PRECEDENCE=\"(f, g, h)\""); | ||||
|     p.register_symbol_list_param("PRECEDENCE_GEN", m_order_precedence_gen, "describe how a total precedence order is generated. The generator is a sequence of simple (partial) orders with an optional '-' (indicating the next (partial) order should be inverted). The available simple (partial) orders are: user (the order specified by precedence); arity; interpreted (interpreted function symbols are considered smaller); definition (defined function symbols are considered bigger); frequency; arbitrary (total arbitrary order generated by Z3). Example: PRECEDENCE_GEN=\"user interpreted - arity arbitraty\""); | ||||
|     p.register_symbol_nat_list_param("ORDER_WEIGHTS", m_order_weights, "describe a (partial) assignment of weights to function symbols for term orderings (e.g., KBO). The assigment is a list of pairs of the form f:n where f is a string and n is a natural. Example: WEIGHTS=\"(f:1, g:2, h:3)\""); | ||||
|     p.register_unsigned_param("ORDER_VAR_WEIGHT", m_order_var_weight, "weight of variables in term orderings (e.g., KBO)"); | ||||
|     p.register_int_param("ORDER", 0, 1, reinterpret_cast<int&>(m_order_kind), "Term ordering: 0 - KBO, 1 - LPO"); | ||||
| } | ||||
|  | @ -1,44 +0,0 @@ | |||
| /*++
 | ||||
| Copyright (c) 2006 Microsoft Corporation | ||||
| 
 | ||||
| Module Name: | ||||
| 
 | ||||
|     order_params.h | ||||
| 
 | ||||
| Abstract: | ||||
| 
 | ||||
|     Term ordering parameters. | ||||
| 
 | ||||
| Author: | ||||
| 
 | ||||
|     Leonardo de Moura (leonardo) 2008-01-28. | ||||
| 
 | ||||
| Revision History: | ||||
| 
 | ||||
| --*/ | ||||
| #ifndef _ORDER_PARAMS_H_ | ||||
| #define _ORDER_PARAMS_H_ | ||||
| 
 | ||||
| #include"ini_file.h" | ||||
| 
 | ||||
| enum order_kind { | ||||
|     ORD_KBO, | ||||
|     ORD_LPO | ||||
| }; | ||||
| 
 | ||||
| struct order_params { | ||||
|     svector<symbol>          m_order_precedence; | ||||
|     svector<symbol>          m_order_precedence_gen; | ||||
|     svector<symbol_nat_pair> m_order_weights; | ||||
|     unsigned                 m_order_var_weight; | ||||
|     order_kind               m_order_kind; | ||||
|      | ||||
|     order_params(): | ||||
|         m_order_var_weight(1), | ||||
|         m_order_kind(ORD_KBO) { | ||||
|     } | ||||
| 
 | ||||
|     void register_params(ini_params & p); | ||||
| }; | ||||
| 
 | ||||
| #endif /* _ORDER_PARAMS_H_ */ | ||||
|  | @ -1,37 +0,0 @@ | |||
| /*++
 | ||||
| Copyright (c) 2006 Microsoft Corporation | ||||
| 
 | ||||
| Module Name: | ||||
| 
 | ||||
|     spc_params.cpp | ||||
| 
 | ||||
| Abstract: | ||||
| 
 | ||||
|     <abstract> | ||||
| 
 | ||||
| Author: | ||||
| 
 | ||||
|     Leonardo de Moura (leonardo) 2008-02-08. | ||||
| 
 | ||||
| Revision History: | ||||
| 
 | ||||
| --*/ | ||||
| #include"spc_params.h" | ||||
| 
 | ||||
| void spc_params::register_params(ini_params & p) { | ||||
|     order_params::register_params(p); | ||||
|     p.register_unsigned_param("SPC_MIN_FUNC_FREQ_SUBSUMPTION_INDEX",m_min_func_freq_subsumption_index, | ||||
|                               "minimal number of occurrences (in clauses) for a function symbol to be considered for subsumption indexing."); | ||||
|     p.register_unsigned_param("SPC_MAX_SUBSUMPTION_INDEX_FEATURES", m_max_subsumption_index_features, | ||||
|                               "maximum number of features to be used for subsumption index."); | ||||
|     p.register_unsigned_param("SPC_INITIAL_SUBSUMPTION_INDEX_OPT", m_initial_subsumption_index_opt, | ||||
|                               "after how many processed clauses the subsumption index is optimized."); | ||||
|     p.register_double_param("SPC_FACTOR_SUBSUMPTION_INDEX_OPT", m_factor_subsumption_index_opt, | ||||
|                             "after each optimization the threshold for optimization is increased by this factor. See INITIAL_SUBSUMPTION_INDEX_OPT."); | ||||
|     p.register_bool_param("SPC_BS", m_backward_subsumption, "Enable/disable backward subsumption in the superposition engine"); | ||||
|     p.register_bool_param("SPC_ES", m_equality_subsumption, "Enable/disable equality resolution in the superposition engine"); | ||||
|     p.register_unsigned_param("SPC_NUM_ITERATIONS", m_spc_num_iterations); | ||||
|     p.register_bool_param("SPC_TRACE", m_spc_trace); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  | @ -1,49 +0,0 @@ | |||
| /*++
 | ||||
| Copyright (c) 2006 Microsoft Corporation | ||||
| 
 | ||||
| Module Name: | ||||
| 
 | ||||
|     spc_params.h | ||||
| 
 | ||||
| Abstract: | ||||
| 
 | ||||
|     Parameters for the Superposition Calculus Engine | ||||
| 
 | ||||
| Author: | ||||
| 
 | ||||
|     Leonardo de Moura (leonardo) 2008-02-08. | ||||
| 
 | ||||
| Revision History: | ||||
| 
 | ||||
| --*/ | ||||
| #ifndef _SPC_PARAMS_H_ | ||||
| #define _SPC_PARAMS_H_ | ||||
| 
 | ||||
| #include"order_params.h" | ||||
| 
 | ||||
| struct spc_params : public order_params { | ||||
|     unsigned m_min_func_freq_subsumption_index; | ||||
|     unsigned m_max_subsumption_index_features; | ||||
|     unsigned m_initial_subsumption_index_opt;  | ||||
|     double   m_factor_subsumption_index_opt; | ||||
|     bool     m_backward_subsumption; | ||||
|     bool     m_equality_subsumption; | ||||
|     unsigned m_spc_num_iterations; | ||||
|     bool     m_spc_trace; | ||||
| 
 | ||||
|     spc_params(): | ||||
|         m_min_func_freq_subsumption_index(100), | ||||
|         m_max_subsumption_index_features(32), | ||||
|         m_initial_subsumption_index_opt(1000), | ||||
|         m_factor_subsumption_index_opt(1.5), | ||||
|         m_backward_subsumption(true), | ||||
|         m_equality_subsumption(true), | ||||
|         m_spc_num_iterations(1000), | ||||
|         m_spc_trace(false) { | ||||
|     } | ||||
|      | ||||
|     void register_params(ini_params & p); | ||||
| }; | ||||
| 
 | ||||
| #endif /* _SPC_PARAMS_H_ */ | ||||
| 
 | ||||
|  | @ -1,30 +0,0 @@ | |||
| /*++
 | ||||
| Copyright (c) 2006 Microsoft Corporation | ||||
| 
 | ||||
| Module Name: | ||||
| 
 | ||||
|     z3_solver_params.cpp | ||||
| 
 | ||||
| Abstract: | ||||
| 
 | ||||
|     <abstract> | ||||
| 
 | ||||
| Author: | ||||
| 
 | ||||
|     Leonardo de Moura (leonardo) 2007-06-11. | ||||
| 
 | ||||
| Revision History: | ||||
| 
 | ||||
| --*/ | ||||
| 
 | ||||
| #include"z3_solver_params.h" | ||||
| 
 | ||||
| void z3_solver_params::register_params(ini_params & p) { | ||||
|     p.register_bool_param("Z3_SOLVER_LL_PP", m_ast_ll_pp, "pretty print asserted constraints using low-level printer (Z3 input format specific)"); | ||||
|     p.register_bool_param("Z3_SOLVER_SMT_PP", m_ast_smt_pp, "pretty print asserted constraints using SMT printer (Z3 input format specific)"); | ||||
|     p.register_bool_param("PRE_SIMPLIFY_EXPR", m_pre_simplify_expr, "pre-simplify expressions when created over the API (example: -x -> (* -1 x))"); | ||||
|     p.register_string_param("SMTLIB_TRACE_PATH", m_smtlib_trace_path, "path for converting Z3 formulas to SMTLIB benchmarks"); | ||||
|     p.register_string_param("SMTLIB_SOURCE_INFO", m_smtlib_source_info, "additional source info to add to SMTLIB benchmark"); | ||||
|     p.register_string_param("SMTLIB_CATEGORY", m_smtlib_category, "additional category info to add to SMTLIB benchmark"); | ||||
| } | ||||
| 
 | ||||
|  | @ -1,44 +0,0 @@ | |||
| /*++
 | ||||
| Copyright (c) 2006 Microsoft Corporation | ||||
| 
 | ||||
| Module Name: | ||||
| 
 | ||||
|     z3_solver_params.h | ||||
| 
 | ||||
| Abstract: | ||||
| 
 | ||||
|     <abstract> | ||||
| 
 | ||||
| Author: | ||||
| 
 | ||||
|     Leonardo de Moura (leonardo) 2007-06-11. | ||||
| 
 | ||||
| Revision History: | ||||
| 
 | ||||
| --*/ | ||||
| #ifndef _Z3_SOLVER_PARAMS_H_ | ||||
| #define _Z3_SOLVER_PARAMS_H_ | ||||
| 
 | ||||
| #include"ini_file.h" | ||||
| 
 | ||||
| struct z3_solver_params { | ||||
|     bool     m_ast_ll_pp; | ||||
|     bool     m_ast_smt_pp; | ||||
|     bool     m_pre_simplify_expr; | ||||
|     std::string m_smtlib_trace_path; | ||||
|     std::string m_smtlib_source_info; | ||||
|     std::string m_smtlib_category; | ||||
| 
 | ||||
|     z3_solver_params(): | ||||
|         m_ast_ll_pp(false), | ||||
|         m_ast_smt_pp(false), | ||||
|         m_pre_simplify_expr(false), | ||||
|         m_smtlib_trace_path(""), | ||||
|         m_smtlib_source_info(""), | ||||
|         m_smtlib_category("") | ||||
|     {} | ||||
|     void register_params(ini_params & p); | ||||
| }; | ||||
| 
 | ||||
| #endif /* _Z3_SOLVER_PARAMS_H_ */ | ||||
| 
 | ||||
|  | @ -40,7 +40,6 @@ Revision History: | |||
| #include"der.h" | ||||
| #include"elim_bounds.h" | ||||
| #include"warning.h" | ||||
| #include"eager_bit_blaster.h" | ||||
| #include"bit2int.h" | ||||
| #include"distribute_forall.h" | ||||
| #include"quasi_macros.h" | ||||
|  | @ -340,13 +339,9 @@ void asserted_formulas::reduce() { | |||
|     INVOKE(m_params.m_quasi_macros && has_quantifiers(), apply_quasi_macros());     | ||||
|     INVOKE(m_params.m_simplify_bit2int, apply_bit2int()); | ||||
|     INVOKE(m_params.m_eliminate_bounds && has_quantifiers(), cheap_quant_fourier_motzkin()); | ||||
|     INVOKE(!m_params.m_bb_eager && has_quantifiers() && m_params.m_ematching, infer_patterns()); | ||||
|     INVOKE(m_params.m_max_bv_sharing && has_bv(), max_bv_sharing()); | ||||
|     INVOKE(m_params.m_bb_quantifiers, elim_bvs_from_quantifiers()); | ||||
|     INVOKE(m_params.m_bb_eager, apply_eager_bit_blaster());                      | ||||
|     INVOKE(m_params.m_bb_eager && m_params.m_nnf_cnf, nnf_cnf());   // bit-blaster destroys CNF
 | ||||
|     INVOKE(m_params.m_bb_quantifiers && m_params.m_der && has_quantifiers(), apply_der()); // bit-vector elimination + bit-blasting creates new opportunities for der.
 | ||||
|     INVOKE(m_params.m_bb_eager && has_quantifiers() && m_params.m_ematching, infer_patterns()); | ||||
|     // temporary HACK: make sure that arith & bv are list-assoc 
 | ||||
|     // this may destroy some simplification steps such as max_bv_sharing
 | ||||
|     reduce_asserted_formulas();  | ||||
|  | @ -1434,8 +1429,6 @@ bool asserted_formulas::quant_elim() { | |||
|     return false; | ||||
| } | ||||
| 
 | ||||
| MK_SIMPLIFIER(apply_eager_bit_blaster, eager_bit_blaster functor(m_manager, m_params), "eager_bb", "eager bit blasting", false); | ||||
| 
 | ||||
| MK_SIMPLIFIER(elim_bvs_from_quantifiers, bv_elim_star functor(m_manager), "bv_elim", "eliminate bit-vectors from quantifiers", true); | ||||
| 
 | ||||
| #define LIFT_ITE(NAME, FUNCTOR, MSG)                                                                                            \ | ||||
|  |  | |||
|  | @ -94,7 +94,6 @@ class asserted_formulas { | |||
|     void apply_demodulators(); | ||||
|     void apply_quasi_macros(); | ||||
|     void nnf_cnf(); | ||||
|     bool apply_eager_bit_blaster(); | ||||
|     void infer_patterns(); | ||||
|     void eliminate_term_ite(); | ||||
|     void reduce_and_solve(); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue