/*
 *  nextpnr -- Next Generation Place and Route
 *
 *  Copyright (C) 2018  Clifford Wolf <clifford@symbioticeda.com>
 *  Copyright (C) 2018  Miodrag Milanovic <miodrag@symbioticeda.com>
 *
 *  Permission to use, copy, modify, and/or distribute this software for any
 *  purpose with or without fee is hereby granted, provided that the above
 *  copyright notice and this permission notice appear in all copies.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 */

#include <vector>
#include "gtest/gtest.h"
#include "nextpnr.h"

USING_NEXTPNR_NAMESPACE

class HX8KTest : public ::testing::Test
{
  protected:
    virtual void SetUp()
    {
        chipArgs.type = ArchArgs::HX8K;
        chipArgs.package = "ct256";
        ctx = new Context(chipArgs);
    }

    virtual void TearDown() { delete ctx; }

    ArchArgs chipArgs;
    Context *ctx;
};

TEST_F(HX8KTest, bel_names)
{
    int bel_count = 0;
    for (auto bel : ctx->getBels()) {
        auto name = ctx->getBelName(bel);
        ASSERT_EQ(bel, ctx->getBelByName(name));
        bel_count++;
    }
    ASSERT_EQ(bel_count, 7979);
}

TEST_F(HX8KTest, wire_names)
{
    int wire_count = 0;
    for (auto wire : ctx->getWires()) {
        auto name = ctx->getWireName(wire);
        assert(wire == ctx->getWireByName(name));
        wire_count++;
    }
    ASSERT_EQ(wire_count, 165894);
}

TEST_F(HX8KTest, pip_names)
{
    int pip_count = 0;
    for (auto pip : ctx->getPips()) {
        auto name = ctx->getPipName(pip);
        assert(pip == ctx->getPipByName(name));
        pip_count++;
    }
    ASSERT_EQ(pip_count, 1806080);
}

TEST_F(HX8KTest, uphill_to_downhill)
{
    for (auto dst : ctx->getWires()) {
        for (auto uphill_pip : ctx->getPipsUphill(dst)) {
            bool found_downhill = false;
            for (auto downhill_pip : ctx->getPipsDownhill(ctx->getPipSrcWire(uphill_pip))) {
                if (uphill_pip == downhill_pip) {
                    ASSERT_FALSE(found_downhill);
                    found_downhill = true;
                }
            }
            ASSERT_TRUE(found_downhill);
        }
    }
}

TEST_F(HX8KTest, downhill_to_uphill)
{
    for (auto dst : ctx->getWires()) {
        for (auto downhill_pip : ctx->getPipsDownhill(dst)) {
            bool found_uphill = false;
            for (auto uphill_pip : ctx->getPipsUphill(ctx->getPipDstWire(downhill_pip))) {
                if (uphill_pip == downhill_pip) {
                    ASSERT_FALSE(found_uphill);
                    found_uphill = true;
                }
            }
            ASSERT_TRUE(found_uphill);
        }
    }
}
