// 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.

#include "mpact/sim/decoder/instruction_encoding.h"

#include <string>

#include "absl/status/status.h"
#include "googlemock/include/gmock/gmock.h"  // IWYU pragma: keep
#include "googletest/include/gtest/gtest.h"
#include "mpact/sim/decoder/bin_encoding_info.h"
#include "mpact/sim/decoder/bin_format_visitor.h"
#include "mpact/sim/decoder/decoder_error_listener.h"
#include "mpact/sim/decoder/format.h"

namespace {

// This file contains the unit tests for the InstructionEncoding class.

using ::mpact::sim::decoder::DecoderErrorListener;
using ::mpact::sim::decoder::bin_format::BinaryNum;
using ::mpact::sim::decoder::bin_format::BinEncodingInfo;
using ::mpact::sim::decoder::bin_format::ConstraintType;
using ::mpact::sim::decoder::bin_format::Format;
using ::mpact::sim::decoder::bin_format::InstructionEncoding;

constexpr char kITypeEncodingName[] = "i_test_encoding";

constexpr int kFunc3Value = 0b101;
constexpr int kFunc3Mask = 0b111'00000'000'0000;

class InstructionEncodingTest : public ::testing::Test {
 protected:
  InstructionEncodingTest() {
    error_listener_ = new DecoderErrorListener();
    encoding_info_ = new BinEncodingInfo("OpcodeEnumName", error_listener_);
    i_type_fmt_ = new Format("IType", 32, encoding_info_);
    (void)i_type_fmt_->AddField("imm12", /*is_signed*/ true, 12);
    (void)i_type_fmt_->AddField("rs1", /*is_signed*/ false, 5);
    (void)i_type_fmt_->AddField("func3", /*is_signed*/ false, 3);
    (void)i_type_fmt_->AddField("rd", /*is_signed*/ false, 5);
    (void)i_type_fmt_->AddField("opcode", /*is_signed*/ false, 7);
    (void)i_type_fmt_->AddFieldOverlay("uspecial", /*is_signed*/ false, 10);
    auto* overlay = i_type_fmt_->GetOverlay("uspecial");
    (void)overlay->AddFieldReference("rs1");
    (void)overlay->AddFieldReference("rd");
    (void)i_type_fmt_->AddFieldOverlay("sspecial", /*is_signed*/ true, 10);
    overlay = i_type_fmt_->GetOverlay("sspecial");
    (void)overlay->AddFieldReference("rs1");
    (void)overlay->AddFieldReference("rd");
    (void)i_type_fmt_->ComputeAndCheckFormatWidth();
    i_type_ = new InstructionEncoding(kITypeEncodingName, i_type_fmt_);
    (void)i_type_fmt_->AddFieldOverlay("extract", /*is_signed*/ false, 12);
    overlay = i_type_fmt_->GetOverlay("extract");
    (void)overlay->AddFieldReference("rs1");
    (void)overlay->AddBitConstant(BinaryNum{0b11, 2});
    (void)overlay->AddFieldReference("rd");
  }

  ~InstructionEncodingTest() override {
    delete error_listener_;
    delete i_type_fmt_;
    delete encoding_info_;
    delete i_type_;
  }

  DecoderErrorListener* error_listener_;
  BinEncodingInfo* encoding_info_;
  Format* i_type_fmt_;
  InstructionEncoding* i_type_;
};

TEST_F(InstructionEncodingTest, Basic) {
  EXPECT_EQ(i_type_->name(), kITypeEncodingName);
  EXPECT_EQ(i_type_->GetValue(), 0);
  EXPECT_EQ(i_type_->GetMask(), 0);
  EXPECT_EQ(i_type_->GetCombinedMask(), 0);
  EXPECT_TRUE(i_type_->equal_constraints().empty());
  EXPECT_TRUE(i_type_->equal_extracted_constraints().empty());
  EXPECT_TRUE(i_type_->other_constraints().empty());
}

TEST_F(InstructionEncodingTest, BadConstraintName) {
  // Wrong field names.
  auto status = i_type_->AddEqualConstraint("NotAName", 0);
  // Verify error message, and that nothing has changed.
  EXPECT_TRUE(absl::IsNotFound(status));
  EXPECT_EQ(i_type_->GetValue(), 0);
  EXPECT_EQ(i_type_->GetMask(), 0);
  EXPECT_EQ(i_type_->GetCombinedMask(), 0);
  EXPECT_TRUE(i_type_->equal_constraints().empty());
  EXPECT_TRUE(i_type_->equal_extracted_constraints().empty());
  EXPECT_TRUE(i_type_->other_constraints().empty());

  // Check for other constraint type.
  status = i_type_->AddOtherConstraint(ConstraintType::kNe, "NotAName", 0);
  EXPECT_TRUE(absl::IsNotFound(status));
  EXPECT_EQ(i_type_->GetValue(), 0);
  EXPECT_EQ(i_type_->GetMask(), 0);
  EXPECT_EQ(i_type_->GetCombinedMask(), 0);
  EXPECT_TRUE(i_type_->equal_constraints().empty());
  EXPECT_TRUE(i_type_->equal_extracted_constraints().empty());
  EXPECT_TRUE(i_type_->other_constraints().empty());
}

TEST_F(InstructionEncodingTest, OutOfRangeUnsignedField) {
  // Correct field name, but value out of range.
  auto status = i_type_->AddEqualConstraint("func3", 8);
  EXPECT_TRUE(absl::IsOutOfRange(status));
  status = i_type_->AddEqualConstraint("func3", -5);
  EXPECT_TRUE(absl::IsOutOfRange(status));
  status = i_type_->AddOtherConstraint(ConstraintType::kLt, "func3", 8);
  EXPECT_TRUE(absl::IsOutOfRange(status));
  status = i_type_->AddOtherConstraint(ConstraintType::kLe, "func3", -5);
  EXPECT_TRUE(absl::IsOutOfRange(status));
}

TEST_F(InstructionEncodingTest, OutOfRangeSignedField) {
  auto status = i_type_->AddEqualConstraint("imm12", 1 << 11);
  EXPECT_TRUE(absl::IsOutOfRange(status));
  status = i_type_->AddEqualConstraint("imm12", -(1 << 11) - 1);
  EXPECT_TRUE(absl::IsOutOfRange(status));
  status = i_type_->AddOtherConstraint(ConstraintType::kNe, "imm12", 1 << 11);
  EXPECT_TRUE(absl::IsOutOfRange(status));
  status =
      i_type_->AddOtherConstraint(ConstraintType::kNe, "imm12", -(1 << 11) - 1);
  EXPECT_TRUE(absl::IsOutOfRange(status));
}

TEST_F(InstructionEncodingTest, OutOfRangeUnsignedOverlay) {
  // Correct field name, but value out of range.
  auto status = i_type_->AddEqualConstraint("uspecial", 1024);
  EXPECT_TRUE(absl::IsOutOfRange(status));
  status = i_type_->AddEqualConstraint("uspecial", -5);
  EXPECT_TRUE(absl::IsOutOfRange(status));
  status = i_type_->AddOtherConstraint(ConstraintType::kNe, "uspecial", 1024);
  EXPECT_TRUE(absl::IsOutOfRange(status));
  status = i_type_->AddOtherConstraint(ConstraintType::kNe, "uspecial", -5);
  EXPECT_TRUE(absl::IsOutOfRange(status));
}

TEST_F(InstructionEncodingTest, OutOfRangeSignedOverlay) {
  auto status = i_type_->AddEqualConstraint("sspecial", 1 << 10);
  EXPECT_TRUE(absl::IsOutOfRange(status));
  status = i_type_->AddEqualConstraint("sspecial", -(1 << 10) - 1);
  EXPECT_TRUE(absl::IsOutOfRange(status));
  status =
      i_type_->AddOtherConstraint(ConstraintType::kNe, "sspecial", 1 << 10);
  EXPECT_TRUE(absl::IsOutOfRange(status));
  status = i_type_->AddOtherConstraint(ConstraintType::kNe, "sspecial",
                                       -(1 << 10) - 1);
  EXPECT_TRUE(absl::IsOutOfRange(status));
}

TEST_F(InstructionEncodingTest, IllegalSignedConstraints) {
  // Field.
  auto status = i_type_->AddOtherConstraint(ConstraintType::kLt, "imm12", 5);
  EXPECT_TRUE(absl::IsInvalidArgument(status));
  status = i_type_->AddOtherConstraint(ConstraintType::kLe, "imm12", 5);
  EXPECT_TRUE(absl::IsInvalidArgument(status));
  status = i_type_->AddOtherConstraint(ConstraintType::kGt, "imm12", 5);
  EXPECT_TRUE(absl::IsInvalidArgument(status));
  status = i_type_->AddOtherConstraint(ConstraintType::kGe, "imm12", 5);
  EXPECT_TRUE(absl::IsInvalidArgument(status));
  // Overlay.
  status = i_type_->AddOtherConstraint(ConstraintType::kLt, "sspecial", 5);
  EXPECT_TRUE(absl::IsInvalidArgument(status));
  status = i_type_->AddOtherConstraint(ConstraintType::kLe, "sspecial", 5);
  EXPECT_TRUE(absl::IsInvalidArgument(status));
  status = i_type_->AddOtherConstraint(ConstraintType::kGt, "sspecial", 5);
  EXPECT_TRUE(absl::IsInvalidArgument(status));
  status = i_type_->AddOtherConstraint(ConstraintType::kGe, "sspecial", 5);
  EXPECT_TRUE(absl::IsInvalidArgument(status));
}

TEST_F(InstructionEncodingTest, AddEqualUnsignedConstraint) {
  auto status = i_type_->AddEqualConstraint("func3", kFunc3Value);
  EXPECT_TRUE(status.ok());
  EXPECT_EQ(i_type_->GetValue(), kFunc3Value << 12);
  EXPECT_EQ(i_type_->GetMask(), kFunc3Mask);
  EXPECT_EQ(i_type_->GetCombinedMask(), kFunc3Mask);
  EXPECT_EQ(i_type_->equal_constraints().size(), 1);
  auto* constraint = i_type_->equal_constraints()[0];
  EXPECT_EQ(constraint->type, ConstraintType::kEq);
  EXPECT_EQ(constraint->field, i_type_fmt_->GetField("func3"));
  EXPECT_EQ(constraint->value, kFunc3Value);
  EXPECT_EQ(constraint->overlay, nullptr);
  EXPECT_EQ(constraint->can_ignore, false);

  // Other constraints are unaffected.
  EXPECT_TRUE(i_type_->equal_extracted_constraints().empty());
  EXPECT_TRUE(i_type_->other_constraints().empty());
}

TEST_F(InstructionEncodingTest, AddEqualExtractedConstraints) {
  auto status = i_type_->AddEqualConstraint("extract", 0b11011'11'00100);
  EXPECT_TRUE(status.ok());
  EXPECT_EQ(i_type_->GetValue(), 0);
  EXPECT_EQ(i_type_->GetMask(), 0);
  EXPECT_EQ(i_type_->GetCombinedMask(), 0);
  EXPECT_EQ(i_type_->equal_extracted_constraints().size(), 1);
  auto* constraint = i_type_->equal_extracted_constraints()[0];
  EXPECT_EQ(constraint->type, ConstraintType::kEq);
  EXPECT_EQ(constraint->field, i_type_fmt_->GetField("extract"));
  EXPECT_EQ(constraint->value, 0b11011'11'00100);
  EXPECT_NE(constraint->overlay, nullptr);
  EXPECT_EQ(constraint->can_ignore, false);
}

TEST_F(InstructionEncodingTest, AddOtherConstraints) {
  auto status =
      i_type_->AddOtherConstraint(ConstraintType::kGe, "func3", kFunc3Value);
  EXPECT_TRUE(status.ok());
  EXPECT_EQ(i_type_->GetValue(), 0);
  EXPECT_EQ(i_type_->GetMask(), 0);
  EXPECT_EQ(i_type_->GetCombinedMask(), kFunc3Mask);
  EXPECT_EQ(i_type_->other_constraints().size(), 1);
  auto* constraint = i_type_->other_constraints()[0];
  EXPECT_EQ(constraint->type, ConstraintType::kGe);
  EXPECT_EQ(constraint->field, i_type_fmt_->GetField("func3"));
  EXPECT_EQ(constraint->value, kFunc3Value);
  EXPECT_EQ(constraint->overlay, nullptr);
  EXPECT_EQ(constraint->can_ignore, false);

  // Other constraints are unaffected.
  EXPECT_TRUE(i_type_->equal_extracted_constraints().empty());
  EXPECT_TRUE(i_type_->equal_constraints().empty());
}

}  // namespace
