#include "catch.hpp"

#include "lut.h"

namespace {

using Catch::Matchers::Equals;

TEST_CASE("default_lut", "[fasm]") {
    for(size_t num_inputs = 0; num_inputs < 10; ++num_inputs) {
        fasm::Lut lut(num_inputs);

        const LogicVec &table = lut.table();
        CHECK(table.size() == (1 << num_inputs));

        for(const vtr::LogicValue & value : table) {
            CHECK(value == vtr::LogicValue::FALSE);
        }
    }
}


TEST_CASE("const_true", "[fasm]") {
    for(size_t num_inputs = 0; num_inputs < 10; ++num_inputs) {
        fasm::Lut lut(num_inputs);
        lut.SetConstant(vtr::LogicValue::TRUE);

        const LogicVec &table = lut.table();
        CHECK(table.size() == (1 << num_inputs));

        for(const vtr::LogicValue & value : table) {
            CHECK(value == vtr::LogicValue::TRUE);
        }
    }
}

TEST_CASE("const_false", "[fasm]") {
    for(size_t num_inputs = 0; num_inputs < 10; ++num_inputs) {
        {
            fasm::Lut lut(num_inputs);
            lut.SetConstant(vtr::LogicValue::FALSE);

            const LogicVec &table = lut.table();
            CHECK(table.size() == (1 << num_inputs));

            for(const vtr::LogicValue & value : table) {
                CHECK(value == vtr::LogicValue::FALSE);
            }
        }
    }
}

TEST_CASE("wire", "[fasm]") {
    for(size_t num_inputs = 0; num_inputs < 10; ++num_inputs) {
        for(size_t input_pin = 0; input_pin < num_inputs; ++input_pin) {
            fasm::Lut lut(num_inputs);
            lut.CreateWire(input_pin);

            const LogicVec &table = lut.table();
            CHECK(table.size() == (1 << num_inputs));
            for(size_t i = 0; i < table.size(); ++i) {
                if(((1 << input_pin) & i) != 0) {
                    CHECK(table[i] == vtr::LogicValue::TRUE);
                } else {
                    CHECK(table[i] == vtr::LogicValue::FALSE);
                }
            }
        }
    }
}

TEST_CASE("lut_output", "[fasm]") {
    fasm::LutOutputDefinition lut_def("TEST[31:0]");

    CHECK_THAT(lut_def.fasm_feature, Equals("TEST"));
    CHECK(lut_def.num_inputs == 5);
    CHECK(lut_def.start_bit == 0);
    CHECK(lut_def.end_bit == 31);

    CHECK_THAT(lut_def.CreateConstant(vtr::LogicValue::TRUE), Equals("TEST[31:0]=32'b11111111111111111111111111111111"));
    CHECK_THAT(lut_def.CreateConstant(vtr::LogicValue::FALSE), Equals("TEST[31:0]=32'b00000000000000000000000000000000"));
    CHECK_THAT(lut_def.CreateWire(0), Equals("TEST[31:0]=32'b10101010101010101010101010101010"));
    CHECK_THAT(lut_def.CreateWire(1), Equals("TEST[31:0]=32'b11001100110011001100110011001100"));
}

TEST_CASE("lut_table_output", "[fasm]") {
    fasm::LutOutputDefinition lut_def("TEST[7:4]");

    CHECK_THAT(lut_def.fasm_feature, Equals("TEST"));
    CHECK(lut_def.num_inputs == 2);
    CHECK(lut_def.start_bit == 4);
    CHECK(lut_def.end_bit == 7);

    LogicVec vec(4, vtr::LogicValue::FALSE);

    CHECK_THAT(lut_def.CreateInit(vec), Equals("TEST[7:4]=4'b0000"));

    vec[0] = vtr::LogicValue::TRUE;
    CHECK_THAT(lut_def.CreateInit(vec), Equals("TEST[7:4]=4'b0001"));

    vec[3] = vtr::LogicValue::TRUE;
    CHECK_THAT(lut_def.CreateInit(vec), Equals("TEST[7:4]=4'b1001"));
}

} // namespace
