// 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 LMPACT_SIM_DECODER_BUNDLE_H_
#define LMPACT_SIM_DECODER_BUNDLE_H_

#include <iostream>
#include <string>
#include <utility>
#include <vector>

#include "absl/container/flat_hash_map.h"
#include "absl/strings/string_view.h"
#include "mpact/sim/decoder/opcode.h"
#include "mpact/sim/decoder/slot.h"

namespace mpact {
namespace sim {
namespace machine_description {
namespace instruction_set {

class InstructionSet;

// A bundle refers to the instruction set grouping of one or more instructions
// or sub-bundles that are to be issued together. Bundle refers to type and
// layout of the grouping, not any particular instance thereof. A bundle
// consists of one or more (sub) bundles and/or slots. A slot corresponds to a
// single instruction issue slot.
class Bundle {
 public:
  // Constructor and destructor.
  Bundle(absl::string_view name, InstructionSet *instruction_set);
  virtual ~Bundle() = default;

  // Append a slot to the bundle. In case the slot has multiple instances,
  // a non-empty vector of instance numbers specify which slot instances are
  // part of this bundle.
  void AppendSlot(absl::string_view slot_name,
                  const std::vector<int> &instance_vec);
  // Append a sub bundle to this bundle.
  void AppendBundleName(absl::string_view bundle_name);
  // Return string for  bundle class declaration.
  std::string GenerateClassDeclaration(absl::string_view encoding_type) const;
  // Return string for bundle class definition.
  std::string GenerateClassDefinition(absl::string_view encoding_type) const;

  // Getters and setters.
  const std::string &name() const { return name_; }
  const std::string &pascal_name() const { return pascal_name_; }
  const std::vector<std::pair<std::string, const std::vector<int>>> &slot_uses()
      const {
    return slot_uses_;
  }
  const std::vector<std::string> &bundle_names() const { return bundle_names_; }
  InstructionSet *instruction_set() const { return instruction_set_; }
  bool is_marked() const { return is_marked_; }
  void set_is_marked(bool value) { is_marked_ = value; }

 private:
  // The is_marked flag is used to ensure bundle classes are only added once.
  bool is_marked_ = false;
  // Parent instruction set.
  InstructionSet *instruction_set_;
  std::string name_;
  // Name in PascalCase.
  std::string pascal_name_;
  // The slots contained within this bundle, including instance indices.
  std::vector<std::pair<std::string, const std::vector<int>>> slot_uses_;
  // The bundles contained within this bundle.
  std::vector<std::string> bundle_names_;
  // The PascalCase names of the bundles contained within this bundle.
  std::vector<std::string> bundle_pascal_names_;
};

}  // namespace instruction_set
}  // namespace machine_description
}  // namespace sim
}  // namespace mpact

#endif  // LMPACT_SIM_DECODER_BUNDLE_H_
