#ifndef _UHDM_AST_SHARED_H_
#define _UHDM_AST_SHARED_H_ 1

#include "frontends/ast/ast.h"

#include "uhdmastreport.h"
#include <string>
#include <unordered_map>

namespace systemverilog_plugin
{

class UhdmAstShared
{
  private:
    // Used for generating enum names
    unsigned enum_count = 0;

    // Used for generating port IDS
    unsigned port_count = 0;

    // Used for generating loop names
    unsigned loop_count = 0;

    // Used for generating unique names for anonymous types used as parameters.
    unsigned anonymous_type_count = 0;

  public:
    ~UhdmAstShared()
    {
        for (const auto &param : param_types)
            delete param.second;
        param_types.clear();
    }

    // Generate the next enum ID (starting with 0)
    unsigned next_enum_id() { return enum_count++; }

    // Generate the next port ID (starting with 1)
    unsigned next_port_id() { return ++port_count; }

    // Generate the next loop ID (starting with 0)
    unsigned next_loop_id() { return loop_count++; }

    // Generate the next anonymous type ID (starting with 0).
    unsigned next_anonymous_type_id() { return anonymous_type_count++; }

    // Flag that determines whether debug info should be printed
    bool debug_flag = false;

    // Flag that determines whether we should ignore assert() statements
    bool no_assert = false;

    // Flag that determines whether errors should be fatal
    bool stop_on_error = true;

    // Flag that determines whether we should only parse the design
    // applies only to read_systemverilog command
    bool parse_only = false;

    // Flag that determines whether we should defer the elaboration
    // applies only to read_systemverilog command
    bool defer = false;

    // Flag that determines whether we should perform the elaboration now
    // applies only to read_systemverilog command
    bool link = false;

    // Flag equivalent to read_verilog -formal
    // Defines FORMAL, undefines SYNTHESIS
    // Allows verification constructs in Surelog
    bool formal = false;

    // Top nodes of the design (modules, interfaces)
    std::unordered_map<std::string, ::Yosys::AST::AstNode *> top_nodes;

    // UHDM node coverage report
    UhdmAstReport report;

    // Map from AST param nodes to their types (used for params with struct types)
    std::unordered_map<std::string, ::Yosys::AST::AstNode *> param_types;

    ::Yosys::AST::AstNode *current_top_node = nullptr;
    // Set of non-synthesizable objects to skip in current design;
    std::set<const UHDM::BaseClass *> nonSynthesizableObjects;
};

} // namespace systemverilog_plugin

#endif
