// Copyright 2025 Oliver Theimer
#pragma once

#include <cstdint>
#include <string>
#include <vector>

#define SIZEOF_VOID_P 8
#define SIZEOF_INT 4
#if SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
typedef uint32_t bbdd_halfword_t;
#else
typedef uint16_t bbdd_halfword_t;
#endif

typedef uint32_t input_type_t;
typedef uint32_t node_type_t;
typedef uint32_t node_index_t;

enum bbdd_cases {
  case_0,
  case_1f,
  case_1g,
  case_2f,
  case_2g,
  case_3f,
  case_3g,
  case_4f,
  case_4g,
  case_5f,
  case_5g,
  case_not_implemented
};
typedef enum bbdd_cases bbdd_cases_t;

const std::vector<std::string> bbdd_cases_s = {"case_0",  "case_1f", "case_1g",
                              "case_2f", "case_2g", "case_3f",
                              "case_3g", "case_4f", "case_4g",
                              "case_5f", "case_5g", "case_not_implemented"};

enum bbdd_op {
  bbdd_none,
  bbdd_and,
  bbdd_or,
  bbdd_nand,
  bbdd_nor,
  bbdd_xor,
  bbdd_xnor,
  bbdd_inv,
  bbdd_notand,
  bbdd_andnot,
  bbdd_notor,
  bbdd_ornot,
  bbdd_buf,
  bbdd_one,
  bbdd_zero
};

typedef enum bbdd_op bbdd_op_t;

const std::vector<std::string> bbdd_op_s = {
    "none",    "and",     "or",     "nand",   "nor", "xor", "xnor", "inv",
    "not and", "and not", "not or", "or not", "buf", "one", "zero"};

