// Copyright 2023 Google LLC
//
// 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
//
//     https://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.

#ifndef MPACT_SIM_DECODER_ENCODING_GROUP_H_
#define MPACT_SIM_DECODER_ENCODING_GROUP_H_

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

#include "absl/container/flat_hash_set.h"
#include "absl/strings/string_view.h"
#include "mpact/sim/decoder/extract.h"
#include "mpact/sim/decoder/format.h"

namespace mpact {
namespace sim {
namespace decoder {
namespace bin_format {

class InstructionGroup;
class InstructionEncoding;
struct Constraint;
struct Field;
class Overlay;

// The encoding group is a class that allows instruction encodings to be grouped
// together to facilitate breaking the instruction encodings into a tree like
// hierarchy of instructions that have overlapping bits in the encoding that
// can be used to differentiate the encodings.
class EncodingGroup {
 public:
  EncodingGroup(InstructionGroup *inst_group, uint64_t ignore);
  EncodingGroup(EncodingGroup *parent, InstructionGroup *inst_group,
                uint64_t ignore);
  ~EncodingGroup();
  // Remove bits from a mask that are already handled by parent encoding group.
  void AdjustMask();

  void AddEncoding(InstructionEncoding *enc);
  // True if the encoding can be added to the group (i.e., there are
  // sufficiently many "overlapping" bits.
  bool CanAddEncoding(InstructionEncoding *enc);
  // True if the encodings can be decoded using a simple lookup table without
  // any further comparisons.
  bool IsSimpleDecode();
  // Break the current group into subgroups recursively.
  void AddSubGroups();
  // Verify that there are no collisions of opcodes in the simple decoders.
  void CheckEncodings() const;
  // Emit code for the initializers (decode tables) and the decoder functions.
  void EmitInitializers(absl::string_view name, std::string *initializers_ptr,
                        const std::string &opcode_enum) const;
  void EmitDecoders(absl::string_view name, std::string *declarations_ptr,
                    std::string *definitions_ptr,
                    const std::string &opcode_enum) const;
  // Return a string containing information about the current group. This will
  // be removed at a later stage.
  // TODO(torerik): remove when no longer needed.
  std::string DumpGroup(std::string prefix, std::string indent);

  // Accessors.
  // Return the parent encoding group if it exists.
  EncodingGroup *parent() const { return parent_; }
  // The mask is the intersection of the bits that are significant to the
  // instruction encodings in this group. The bits that are used to select this
  // group from the parent are removed from the mask.
  uint64_t mask() const { return mask_; }
  // The value of the group is the value of the bits in the instruction
  // encodings that are the same across the encodings in the group.
  uint64_t value() const { return value_; }
  // The varying bits is the subset of the bits in the mask that varies in value
  // across the encodings in this group.
  uint64_t varying() const { return varying_; }
  // The constant bits is the subset of the bits in the mask that are constant
  // across the encodings in this group.
  uint64_t constant() const { return constant_; }
  // The discriminator is non-zero if this encoding group has subgroups. The
  // discriminator is the set of bits used to compute the value from the
  // instruction encoding to determine which sub-group a particular instruction
  // encoding in this group belongs to,
  uint64_t discriminator() const { return discriminator_; }
  // Simple decoding is true if an opcode can be determined solely based on the
  // discriminator, and no further constraints exist (such as a field having to
  // be non-zero).
  bool simple_decoding() const { return simple_decoding_; }
  // The vector of encodings in this group.
  const std::vector<InstructionEncoding *> &encoding_vec() const {
    return encoding_vec_;
  }
  // The vector of subgroups in this group.
  std::vector<EncodingGroup *> &encoding_group_vec() {
    return encoding_group_vec_;
  }

 private:
  // Methods that factors out some of the complexities of the public code
  // emitting methods.
  void EmitComplexDecoderBody(std::string *definitions_ptr,
                              absl::string_view index_extraction,
                              absl::string_view opcode_enum) const;
  void EmitComplexDecoderBodyIfSequence(std::string *definitions_ptr,
                                        absl::string_view opcode_enum) const;
  int EmitEncodingIfStatement(int indent, const InstructionEncoding *encoding,
                              absl::string_view opcode_enum,
                              absl::flat_hash_set<std::string> &extracted,
                              std::string *definitions_ptr) const;
  void ProcessConstraint(const absl::flat_hash_set<std::string> &extracted,
                         Constraint *constraint,
                         std::string *definitions_ptr) const;
  void EmitFieldExtraction(const Field *field, const std::string &indent_str,
                           absl::flat_hash_set<std::string> &extracted,
                           std::string *definitions_ptr) const;
  void EmitOverlayExtraction(const Overlay *overlay,
                             const std::string &indent_str,
                             absl::flat_hash_set<std::string> &extracted,
                             std::string *definitions_ptr) const;
  void EmitExtractions(int indent, const std::vector<Constraint *> &constraints,
                       absl::flat_hash_set<std::string> &extracted,
                       std::string *definitions_ptr) const;
  int EmitConstraintConditions(const std::vector<Constraint *> &constraints,
                               absl::string_view comparison,
                               std::string &connector,
                               std::string *condition) const;
  int EmitOtherConstraintConditions(
      const std::vector<Constraint *> &constraints, std::string &connector,
      std::string *condition) const;

  InstructionGroup *inst_group_ = nullptr;
  EncodingGroup *parent_ = nullptr;
  uint64_t varying_ = 0;
  uint64_t discriminator_ = 0;
  size_t discriminator_size_ = 0;
  ExtractionRecipe discriminator_recipe_;
  uint64_t constant_;
  uint64_t mask_ = 0;
  uint64_t value_ = 0;
  uint64_t last_value_ = 0;
  uint64_t ignore_ = 0;
  bool simple_decoding_ = false;
  std::string inst_word_type_;
  std::vector<InstructionEncoding *> encoding_vec_;
  std::vector<EncodingGroup *> encoding_group_vec_;
};

}  // namespace bin_format
}  // namespace decoder
}  // namespace sim
}  // namespace mpact

#endif  // MPACT_SIM_DECODER_ENCODING_GROUP_H_
