mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-31 03:32:28 +00:00 
			
		
		
		
	smul no overflow
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
		
							parent
							
								
									89d6f1c191
								
							
						
					
					
						commit
						8c9835bca6
					
				
					 24 changed files with 376 additions and 63 deletions
				
			
		|  | @ -57,6 +57,8 @@ namespace bv { | |||
|         case OP_SGT:              polysat_le<true,  false, true>(a); break; | ||||
| 
 | ||||
|         case OP_BUMUL_NO_OVFL:    polysat_umul_noovfl(a); break; | ||||
|         case OP_BSMUL_NO_OVFL:    polysat_smul_noovfl(a); break; | ||||
|                          | ||||
|         case OP_BUDIV_I:          polysat_div_rem_i(a, true); break;        | ||||
|         case OP_BUREM_I:          polysat_div_rem_i(a, false); break; | ||||
| 
 | ||||
|  | @ -74,7 +76,6 @@ namespace bv { | |||
|         case OP_BSDIV:             | ||||
|         case OP_BSREM:             | ||||
|         case OP_BSMOD:                         | ||||
|         case OP_BSMUL_NO_OVFL:     | ||||
|         case OP_BSMUL_NO_UDFL:     | ||||
|         case OP_BSDIV_I:             | ||||
|         case OP_BSREM_I:                         | ||||
|  | @ -110,6 +111,15 @@ namespace bv { | |||
|         a->m_sc = sc; | ||||
|     } | ||||
| 
 | ||||
|     void solver::polysat_smul_noovfl(app* e) { | ||||
|         auto p = expr2pdd(e->get_arg(0)); | ||||
|         auto q = expr2pdd(e->get_arg(1)); | ||||
|         auto sc = ~m_polysat.smul_ovfl(p, q); | ||||
|         sat::literal lit = expr2literal(e); | ||||
|         atom* a = mk_atom(lit.var()); | ||||
|         a->m_sc = sc; | ||||
|     } | ||||
| 
 | ||||
|     void solver::polysat_div_rem_i(app* e, bool is_div) { | ||||
|         auto p = expr2pdd(e->get_arg(0)); | ||||
|         auto q = expr2pdd(e->get_arg(1)); | ||||
|  |  | |||
|  | @ -281,6 +281,7 @@ namespace bv { | |||
|         void polysat_num(app* a); | ||||
|         void polysat_mkbv(app* a); | ||||
|         void polysat_umul_noovfl(app* e); | ||||
|         void polysat_smul_noovfl(app* e); | ||||
|         void polysat_div_rem_i(app* e, bool is_div); | ||||
|         void polysat_div_rem(app* e, bool is_div); | ||||
|         void polysat_bit2bool(atom* a, expr* e, unsigned idx); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue