/*
 * Copyright 2020-2022 F4PGA Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 */

#include "UhdmAst.h"
#include "frontends/ast/ast.h"
#include "kernel/yosys.h"
#include "uhdm/SynthSubset.h"
#include "uhdm/VpiListener.h"
#include <string>
#include <type_traits>
#include <vector>

YOSYS_NAMESPACE_BEGIN

// FIXME (mglb): temporary fix to support UHDM both before and after the following change:
// https://github.com/chipsalliance/UHDM/commit/d78d094448bd94926644e48adea4df293b82f101
// The commit introducing this code should to be reverted after Surelog is bumped to recent versions in all our repositories.
template <typename ObjT, typename... ArgN, std::enable_if_t<std::is_constructible_v<ObjT, ArgN...>, bool> = true>
static inline ObjT *make_new_object_with_optional_extra_true_arg(ArgN &&... arg_n)
{
    // Older UHDM version
    return new ObjT(std::forward<ArgN>(arg_n)...);
}

template <typename ObjT, typename... ArgN, std::enable_if_t<!std::is_constructible_v<ObjT, ArgN...>, bool> = true>
static inline ObjT *make_new_object_with_optional_extra_true_arg(ArgN &&... arg_n)
{
    // Newer UHDM version
    return new ObjT(std::forward<ArgN>(arg_n)..., true);
}

struct UhdmCommonFrontend : public Frontend {
    UhdmAstShared shared;
    std::string report_directory;
    std::vector<std::string> args;
    UhdmCommonFrontend(std::string name, std::string short_help) : Frontend(name, short_help) {}
    virtual void print_read_options();
    virtual void help() = 0;
    virtual AST::AstNode *parse(std::string filename) = 0;
    virtual void call_log_header(RTLIL::Design *design) = 0;
    void execute(std::istream *&f, std::string filename, std::vector<std::string> args, RTLIL::Design *design);
};

YOSYS_NAMESPACE_END
