mirror of
				https://github.com/Z3Prover/z3
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	fix undo record for lblset
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
		
							parent
							
								
									a8ccbd7103
								
							
						
					
					
						commit
						decbf4be11
					
				
					 3 changed files with 14 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -302,7 +302,7 @@ namespace euf {
 | 
			
		|||
        enode* r = n->get_root();
 | 
			
		||||
        approx_set & r_lbls = r->m_lbls;
 | 
			
		||||
        if (!r_lbls.may_contain(n->m_lbl_hash)) {
 | 
			
		||||
            m_updates.push_back(update_record(r, update_record::lbl_hash()));
 | 
			
		||||
            m_updates.push_back(update_record(r, update_record::lbl_set()));
 | 
			
		||||
            r_lbls.insert(n->m_lbl_hash);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -373,6 +373,9 @@ namespace euf {
 | 
			
		|||
            case update_record::tag_t::is_lbl_hash:
 | 
			
		||||
                p.r1->m_lbl_hash = p.m_lbl_hash;
 | 
			
		||||
                break;
 | 
			
		||||
            case update_record::tag_t::is_lbl_set:
 | 
			
		||||
                p.r1->m_lbls.set(p.m_lbls);
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                UNREACHABLE();
 | 
			
		||||
                break;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -103,10 +103,11 @@ namespace euf {
 | 
			
		|||
            struct inconsistent {};
 | 
			
		||||
            struct value_assignment {};
 | 
			
		||||
            struct lbl_hash {};
 | 
			
		||||
            struct lbl_set {};
 | 
			
		||||
            enum class tag_t { is_set_parent, is_add_node, is_toggle_merge, 
 | 
			
		||||
                    is_add_th_var, is_replace_th_var, is_new_lit, is_new_th_eq,
 | 
			
		||||
                    is_lbl_hash, is_new_th_eq_qhead, is_new_lits_qhead, 
 | 
			
		||||
                    is_inconsistent, is_value_assignment };
 | 
			
		||||
                    is_inconsistent, is_value_assignment, is_lbl_set };
 | 
			
		||||
            tag_t  tag;
 | 
			
		||||
            enode* r1;
 | 
			
		||||
            enode* n1;
 | 
			
		||||
| 
						 | 
				
			
			@ -119,6 +120,7 @@ namespace euf {
 | 
			
		|||
                unsigned qhead;
 | 
			
		||||
                bool     m_inconsistent;
 | 
			
		||||
                signed char m_lbl_hash;
 | 
			
		||||
                unsigned long long m_lbls;
 | 
			
		||||
            };
 | 
			
		||||
            update_record(enode* r1, enode* n1, unsigned r2_num_parents) :
 | 
			
		||||
                tag(tag_t::is_set_parent), r1(r1), n1(n1), r2_num_parents(r2_num_parents) {}
 | 
			
		||||
| 
						 | 
				
			
			@ -144,6 +146,8 @@ namespace euf {
 | 
			
		|||
                tag(tag_t::is_value_assignment), r1(n), n1(nullptr), qhead(0) {}
 | 
			
		||||
            update_record(enode* n, lbl_hash):
 | 
			
		||||
                tag(tag_t::is_lbl_hash), r1(n), n1(nullptr), m_lbl_hash(n->m_lbl_hash) {}
 | 
			
		||||
            update_record(enode* n, lbl_set):
 | 
			
		||||
                tag(tag_t::is_lbl_set), r1(n), n1(nullptr), m_lbls(n->m_lbls.get()) {}    
 | 
			
		||||
        };
 | 
			
		||||
        ast_manager&           m;
 | 
			
		||||
        svector<to_merge>      m_to_merge;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -70,6 +70,10 @@ public:
 | 
			
		|||
        m_set(s.m_set) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void set(R s) { m_set = s; }
 | 
			
		||||
 | 
			
		||||
    R get() const { return m_set; }
 | 
			
		||||
 | 
			
		||||
    void insert(T const & e) {
 | 
			
		||||
        m_set |= e2s(e);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -162,7 +166,7 @@ class approx_set : public u_approx_set {
 | 
			
		|||
public:
 | 
			
		||||
    approx_set():u_approx_set() {}
 | 
			
		||||
    approx_set(unsigned e):u_approx_set(e) {}
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    class iterator {
 | 
			
		||||
        unsigned long long m_set;
 | 
			
		||||
        unsigned           m_val;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue