mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-30 11:12:28 +00:00 
			
		
		
		
	fix bv type error in projection check
This commit is contained in:
		
							parent
							
								
									d335b6b035
								
							
						
					
					
						commit
						c3ffbf05db
					
				
					 2 changed files with 13 additions and 5 deletions
				
			
		|  | @ -170,14 +170,14 @@ namespace polysat { | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     lbool project_interval::try_project(pvar const w, unsigned const w_off, unsigned const w_sz, rational const& value, unsigned const max_level) { |     lbool project_interval::try_project(pvar const w, unsigned const w_off, unsigned const w_sz, rational const& w_value, unsigned const max_level) { | ||||||
|         SASSERT(w != null_var); |         SASSERT(w != null_var); | ||||||
|         SASSERT_EQ(c.size(w), w_sz); |         SASSERT_EQ(c.size(w), w_sz); | ||||||
|         SASSERT(w != m_var); |         SASSERT(w != m_var); | ||||||
|         if (w == m_var) |         if (w == m_var) | ||||||
|             return l_undef; |             return l_undef; | ||||||
| 
 | 
 | ||||||
|         // verbose_stream() << "v" << m_var << " size " << c.size(m_var) << " -> v" << w << " size " << w_sz << " offset " << w_off << " level " << w_level << "\n";
 |         // verbose_stream() << "v" << m_var << " size " << c.size(m_var) << " -> v" << w << " size " << w_sz << " offset " << w_off << " max_level " << max_level << "\n";
 | ||||||
| 
 | 
 | ||||||
|         // Let:
 |         // Let:
 | ||||||
|         // v = m_var[m_width-1:0]
 |         // v = m_var[m_width-1:0]
 | ||||||
|  | @ -244,15 +244,23 @@ namespace polysat { | ||||||
|         SASSERT(ivl.is_proper() && !ivl.is_empty()); |         SASSERT(ivl.is_proper() && !ivl.is_empty()); | ||||||
| 
 | 
 | ||||||
|         // interval propagation worked but it doesn't conflict the currently assigned value
 |         // interval propagation worked but it doesn't conflict the currently assigned value
 | ||||||
|         if (!ivl.contains(value)) |         rational const& y_value = mod2k(w_value, y_sz); | ||||||
|  |         // verbose_stream() << "interval: " << ivl << "\n";
 | ||||||
|  |         // verbose_stream() << "w_value: " << w_value << "  contained: " << ivl.contains(w_value) << "\n";
 | ||||||
|  |         // verbose_stream() << "y_value: " << y_value << "  contained: " << ivl.contains(y_value) << "\n";
 | ||||||
|  |         if (!ivl.contains(y_value)) | ||||||
|             return l_undef; |             return l_undef; | ||||||
| 
 | 
 | ||||||
|         // now: m_deps implies 2^w_shift * w is not in ivl
 |         // now: m_deps implies 2^w_shift * w is not in ivl
 | ||||||
|         signed_constraint sc = ~cs().ult(w_shift * (c.var(w) - ivl.lo()), w_shift * (ivl.hi() - ivl.lo())); |         signed_constraint sc = ~cs().ult(w_shift * (c.var(w) - ivl.lo()), w_shift * (ivl.hi() - ivl.lo())); | ||||||
|  |         // verbose_stream() << "propagate sc: " << sc << "    weak-eval: " << c.weak_eval(sc) << "\n";
 | ||||||
|  |         VERIFY(c.weak_eval(sc) != l_true); | ||||||
|         dependency d = c.propagate(sc, m_deps, "propagate from containing slice"); |         dependency d = c.propagate(sc, m_deps, "propagate from containing slice"); | ||||||
|  |         // verbose_stream() << "     sc is dep " << d << "\n";
 | ||||||
|  |         // TODO: add as axiom instead???
 | ||||||
| 
 | 
 | ||||||
|         m_explain.push_back(d); |         m_explain.push_back(d); | ||||||
|         m_explain.push_back(dep_target_fixed(w, value));  // w ~ value
 |         m_explain.push_back(dep_target_fixed(w, w_value));  // w ~ w_value
 | ||||||
| 
 | 
 | ||||||
|         IF_VERBOSE(3, { |         IF_VERBOSE(3, { | ||||||
|             verbose_stream() << "=>  v" << w << "[" << y_sz << "] not in " << ivl << "\n"; |             verbose_stream() << "=>  v" << w << "[" << y_sz << "] not in " << ivl << "\n"; | ||||||
|  |  | ||||||
|  | @ -83,7 +83,7 @@ namespace polysat { | ||||||
|          */ |          */ | ||||||
|         static r_interval chop_off_lower(r_interval const& i, unsigned Ny, unsigned Nz, rational const* z_fixed_value = nullptr); |         static r_interval chop_off_lower(r_interval const& i, unsigned Ny, unsigned Nz, rational const* z_fixed_value = nullptr); | ||||||
| 
 | 
 | ||||||
|         lbool try_project(pvar const w, unsigned const w_off, unsigned const w_sz, rational const& value, unsigned const max_level); |         lbool try_project(pvar const w, unsigned const w_off, unsigned const w_sz, rational const& w_value, unsigned const max_level); | ||||||
|         r_interval chop_off_upper(r_interval ivl, unsigned max_level, unsigned x_sz, unsigned y_sz, unsigned z_sz); |         r_interval chop_off_upper(r_interval ivl, unsigned max_level, unsigned x_sz, unsigned y_sz, unsigned z_sz); | ||||||
|         r_interval chop_off_lower(r_interval ivl, unsigned max_level, unsigned y_sz, unsigned z_sz); |         r_interval chop_off_lower(r_interval ivl, unsigned max_level, unsigned y_sz, unsigned z_sz); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue