/*++
Copyright (c) 2023 Microsoft Corporation

Module Name:

    euf_plugin.cpp

Abstract:

    plugin structure for euf

    Plugins allow adding equality saturation for theories.

Author:

    Nikolaj Bjorner (nbjorner) 2023-11-08

--*/

#include "ast/euf/euf_egraph.h"

namespace euf {
    
    void plugin::push_plugin_undo(unsigned th_id) {
        g.push_plugin_undo(th_id);
    }

    void plugin::push_merge(enode* a, enode* b, justification j) {
        if (a->get_root() == b->get_root())
            return; // already merged
        TRACE(euf, tout << "push-merge " << g.bpp(a) << " == " << g.bpp(b) << " " << j << "\n");
        g.push_merge(a, b, j);
    }

    void plugin::push_merge(enode* a, enode* b) {
        if (a->get_root() == b->get_root())
            return; // already merged
        TRACE(plugin, tout << "push-merge " << g.bpp(a) << " == " << g.bpp(b) << "\n");
        g.push_merge(a, b, justification::axiom(get_id()));
    }

    enode* plugin::mk(expr* e, unsigned n, enode* const* args) {
        enode* r = g.find(e);
        if (!r)
            r = g.mk(e, 0, n, args);
        return r;
    }

    region& plugin::get_region() {
        return g.m_region;
    }
}
