mirror of
				https://github.com/Z3Prover/z3
				synced 2025-11-04 13:29:11 +00:00 
			
		
		
		
	copy declarations
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
		
							parent
							
								
									19fa5f8cb3
								
							
						
					
					
						commit
						0c9711aad7
					
				
					 6 changed files with 73 additions and 16 deletions
				
			
		| 
						 | 
				
			
			@ -1529,12 +1529,15 @@ void ast_manager::raise_exception(char const * msg) {
 | 
			
		|||
    throw ast_exception(msg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#include "ast/ast_translation.h"
 | 
			
		||||
 | 
			
		||||
void ast_manager::copy_families_plugins(ast_manager const & from) {
 | 
			
		||||
    TRACE("copy_families_plugins",
 | 
			
		||||
          tout << "target:\n";
 | 
			
		||||
          for (family_id fid = 0; m_family_manager.has_family(fid); fid++) {
 | 
			
		||||
              tout << "fid: " << fid << " fidname: " << get_family_name(fid) << "\n";
 | 
			
		||||
          });
 | 
			
		||||
    ast_translation trans(const_cast<ast_manager&>(from), *this, false);
 | 
			
		||||
    for (family_id fid = 0; from.m_family_manager.has_family(fid); fid++) {
 | 
			
		||||
      SASSERT(from.is_builtin_family_id(fid) == is_builtin_family_id(fid));
 | 
			
		||||
      SASSERT(!from.is_builtin_family_id(fid) || m_family_manager.has_family(fid));
 | 
			
		||||
| 
						 | 
				
			
			@ -1555,6 +1558,9 @@ void ast_manager::copy_families_plugins(ast_manager const & from) {
 | 
			
		|||
          SASSERT(new_p->get_family_id() == fid);
 | 
			
		||||
          SASSERT(has_plugin(fid));
 | 
			
		||||
      }
 | 
			
		||||
      if (from.has_plugin(fid)) {
 | 
			
		||||
          get_plugin(fid)->inherit(from.get_plugin(fid), trans);
 | 
			
		||||
      }
 | 
			
		||||
      SASSERT(from.m_family_manager.has_family(fid) == m_family_manager.has_family(fid));
 | 
			
		||||
      SASSERT(from.get_family_id(fid_name) == get_family_id(fid_name));
 | 
			
		||||
      SASSERT(!from.has_plugin(fid) || has_plugin(fid));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -895,6 +895,8 @@ struct ast_eq_proc {
 | 
			
		|||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class ast_translation;
 | 
			
		||||
 | 
			
		||||
class ast_table : public chashtable<ast*, obj_ptr_hash<ast>, ast_eq_proc> {
 | 
			
		||||
public:
 | 
			
		||||
    void erase(ast * n);
 | 
			
		||||
| 
						 | 
				
			
			@ -930,6 +932,8 @@ protected:
 | 
			
		|||
        m_family_id = id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void inherit(decl_plugin* other_p, ast_translation& ) { }
 | 
			
		||||
 | 
			
		||||
    friend class ast_manager;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,11 +37,9 @@ void ast_translation::cleanup() {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void ast_translation::reset_cache() {
 | 
			
		||||
    obj_map<ast, ast*>::iterator it  = m_cache.begin();
 | 
			
		||||
    obj_map<ast, ast*>::iterator end = m_cache.end();
 | 
			
		||||
    for (; it != end; ++it) {
 | 
			
		||||
        m_from_manager.dec_ref(it->m_key);
 | 
			
		||||
        m_to_manager.dec_ref(it->m_value);
 | 
			
		||||
    for (auto & kv : m_cache) {
 | 
			
		||||
        m_from_manager.dec_ref(kv.m_key);
 | 
			
		||||
        m_to_manager.dec_ref(kv.m_value);
 | 
			
		||||
    }
 | 
			
		||||
    m_cache.reset();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,6 +24,7 @@ Revision History:
 | 
			
		|||
#include "ast/datatype_decl_plugin2.h"
 | 
			
		||||
#include "ast/array_decl_plugin.h"
 | 
			
		||||
#include "ast/ast_smt2_pp.h"
 | 
			
		||||
#include "ast/ast_translation.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace datatype {
 | 
			
		||||
| 
						 | 
				
			
			@ -53,6 +54,9 @@ namespace datatype {
 | 
			
		|||
 | 
			
		||||
    def const& accessor::get_def() const { return m_constructor->get_def(); }
 | 
			
		||||
    util& accessor::u() const { return m_constructor->u(); }
 | 
			
		||||
    accessor* accessor::translate(ast_translation& tr) {
 | 
			
		||||
        return alloc(accessor, tr.to(), name(), to_sort(tr(m_range.get())));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    constructor::~constructor() {
 | 
			
		||||
        for (accessor* a : m_accessors) dealloc(a);
 | 
			
		||||
| 
						 | 
				
			
			@ -76,6 +80,15 @@ namespace datatype {
 | 
			
		|||
        return instantiate(sorts);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    constructor* constructor::translate(ast_translation& tr) {
 | 
			
		||||
        constructor* result = alloc(constructor, m_name, m_recognizer);
 | 
			
		||||
        for (accessor* a : *this) {
 | 
			
		||||
            result->add(a->translate(tr));
 | 
			
		||||
        }
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    sort_ref def::instantiate(sort_ref_vector const& sorts) const {
 | 
			
		||||
        sort_ref s(m);
 | 
			
		||||
        TRACE("datatype", tout << "instantiate " << m_name << "\n";);
 | 
			
		||||
| 
						 | 
				
			
			@ -91,6 +104,19 @@ namespace datatype {
 | 
			
		|||
        return sort_ref(m.substitute(m_sort, sorts.size(), m_params.c_ptr(), sorts.c_ptr()), m);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    def* def::translate(ast_translation& tr, util& u) {
 | 
			
		||||
        sort_ref_vector ps(tr.to());
 | 
			
		||||
        for (sort* p : m_params) {
 | 
			
		||||
            ps.push_back(to_sort(tr(p)));
 | 
			
		||||
        }
 | 
			
		||||
        def* result = alloc(def, tr.to(), u, m_name, m_class_id, ps.size(), ps.c_ptr());
 | 
			
		||||
        for (constructor* c : *this) {
 | 
			
		||||
            add(c->translate(tr));
 | 
			
		||||
        }
 | 
			
		||||
        if (m_sort) result->m_sort = to_sort(tr(m_sort.get()));
 | 
			
		||||
        return result;               
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    enum status {
 | 
			
		||||
        GRAY,
 | 
			
		||||
        BLACK
 | 
			
		||||
| 
						 | 
				
			
			@ -145,6 +171,27 @@ namespace datatype {
 | 
			
		|||
            return *(m_util.get());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        static unsigned stack_depth = 0;
 | 
			
		||||
 | 
			
		||||
        void plugin::inherit(decl_plugin* other_p, ast_translation& tr) {
 | 
			
		||||
            ++stack_depth;
 | 
			
		||||
            SASSERT(stack_depth < 10);
 | 
			
		||||
            plugin* p = dynamic_cast<plugin*>(other_p);
 | 
			
		||||
            svector<symbol> names;
 | 
			
		||||
            SASSERT(p);
 | 
			
		||||
            for (auto& kv : p->m_defs) {
 | 
			
		||||
                def* d = kv.m_value;
 | 
			
		||||
                if (!m_defs.contains(kv.m_key)) {
 | 
			
		||||
                    names.push_back(kv.m_key);
 | 
			
		||||
                    m_defs.insert(kv.m_key, d->translate(tr, u()));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            m_class_id = m_defs.size();
 | 
			
		||||
            u().compute_datatype_size_functions(names);
 | 
			
		||||
            --stack_depth;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        struct invalid_datatype {};
 | 
			
		||||
 | 
			
		||||
        sort * plugin::mk_sort(decl_kind k, unsigned num_parameters, parameter const * parameters) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -75,6 +75,7 @@ namespace datatype {
 | 
			
		|||
        constructor const& get_constructor() const { return *m_constructor; }
 | 
			
		||||
        def const& get_def() const;
 | 
			
		||||
        util& u() const;
 | 
			
		||||
        accessor* translate(ast_translation& tr);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    class constructor {
 | 
			
		||||
| 
						 | 
				
			
			@ -98,6 +99,7 @@ namespace datatype {
 | 
			
		|||
        void attach(def* d) { m_def = d; }
 | 
			
		||||
        def const& get_def() const { return *m_def; }
 | 
			
		||||
        util& u() const;
 | 
			
		||||
        constructor* translate(ast_translation& tr);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    namespace param_size {
 | 
			
		||||
| 
						 | 
				
			
			@ -228,6 +230,7 @@ namespace datatype {
 | 
			
		|||
        util& u() const { return m_util; }
 | 
			
		||||
        param_size::size* sort_size() { return m_sort_size; }
 | 
			
		||||
        void set_sort_size(param_size::size* p) { m_sort_size = p; p->inc_ref(); m_sort = 0; }
 | 
			
		||||
        def* translate(ast_translation& tr, util& u);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    namespace decl {
 | 
			
		||||
| 
						 | 
				
			
			@ -238,6 +241,9 @@ namespace datatype {
 | 
			
		|||
            svector<symbol>          m_def_block;
 | 
			
		||||
            unsigned                 m_class_id;
 | 
			
		||||
            util & u() const;
 | 
			
		||||
 | 
			
		||||
            virtual void inherit(decl_plugin* other_p, ast_translation& tr);
 | 
			
		||||
 | 
			
		||||
        public:
 | 
			
		||||
            plugin(): m_class_id(0) {}
 | 
			
		||||
            virtual ~plugin();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,15 +61,14 @@ namespace smt {
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        virtual solver * translate(ast_manager & m, params_ref const & p) {
 | 
			
		||||
            ast_translation translator(get_manager(), m);
 | 
			
		||||
 | 
			
		||||
            solver * result = alloc(solver, m, p, m_logic);
 | 
			
		||||
            smt::kernel::copy(m_context, result->m_context);
 | 
			
		||||
 | 
			
		||||
            ast_translation translator(get_manager(), m);
 | 
			
		||||
            obj_map<expr, expr*>::iterator it = m_name2assertion.begin();
 | 
			
		||||
            obj_map<expr, expr*>::iterator end = m_name2assertion.end();
 | 
			
		||||
            for (; it != end; it++)
 | 
			
		||||
                result->m_name2assertion.insert(translator(it->m_key),
 | 
			
		||||
                                                translator(it->m_value));
 | 
			
		||||
            for (auto & kv : m_name2assertion) 
 | 
			
		||||
                result->m_name2assertion.insert(translator(kv.m_key),
 | 
			
		||||
                                                translator(kv.m_value));
 | 
			
		||||
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -264,7 +263,7 @@ namespace smt {
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        void compute_assrtn_fds(ptr_vector<expr> & core, vector<func_decl_set> & assrtn_fds) {
 | 
			
		||||
            assrtn_fds.resize(m_name2assertion.size());
 | 
			
		||||
            assrtn_fds.resize(m_name2assertion.size());            
 | 
			
		||||
            obj_map<expr, expr*>::iterator ait = m_name2assertion.begin();
 | 
			
		||||
            obj_map<expr, expr*>::iterator aend = m_name2assertion.end();
 | 
			
		||||
            for (unsigned i = 0; ait != aend; ait++, i++) {
 | 
			
		||||
| 
						 | 
				
			
			@ -277,10 +276,7 @@ namespace smt {
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        bool fds_intersect(func_decl_set & pattern_fds, func_decl_set & assrtn_fds) {
 | 
			
		||||
            func_decl_set::iterator it = pattern_fds.begin();
 | 
			
		||||
            func_decl_set::iterator end = pattern_fds.end();
 | 
			
		||||
            for (; it != end; it++) {
 | 
			
		||||
                func_decl * fd = *it;
 | 
			
		||||
            for (func_decl * fd : pattern_fds) {
 | 
			
		||||
                if (assrtn_fds.contains(fd))
 | 
			
		||||
                    return true;
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue