/*++
Copyright (c) 2012 Microsoft Corporation

Module Name:

    fpa2bv_model_converter.h

Abstract:

    Model conversion for fpa2bv_converter

Author:

    Christoph (cwinter) 2012-02-09

Notes:

--*/
#pragma once

#include "ast/fpa/fpa2bv_converter.h"
#include "ast/converters/model_converter.h"
#include "ast/fpa/bv2fpa_converter.h"

class fpa2bv_model_converter : public model_converter {
    ast_manager & m;
    bv2fpa_converter * m_bv2fp;

public:
    fpa2bv_model_converter(ast_manager & m, fpa2bv_converter & conv):
        m(m),
        m_bv2fp(alloc(bv2fpa_converter, m, conv)) {
    }

    ~fpa2bv_model_converter() override {
        dealloc(m_bv2fp);
    }

    void operator()(model_ref & md) override {
        model_ref new_model = alloc(model, m);
        convert(md.get(), new_model.get());
        md = new_model;
    }

    void display(std::ostream & out) override;

    model_converter * translate(ast_translation & translator) override;

protected:
    fpa2bv_model_converter(ast_manager & m) :
        m(m),
        m_bv2fp(nullptr) {}

    void convert(model_core * mc, model * float_mdl);
};


model_converter * mk_fpa2bv_model_converter(ast_manager & m, fpa2bv_converter & conv);

