#include <assert.h>
#include <string>
#include "log.h"
#include "nextpnr.h"

NEXTPNR_NAMESPACE_BEGIN

bool check_all_nets_driven(Context *ctx)
{
    const bool debug = false;

    log_info("Rule checker, Verifying pre-placed design\n");

    for (auto &cell_entry : ctx->cells) {
        CellInfo *cell = cell_entry.second.get();

        if (debug)
            log_info("  Examining cell \'%s\', of type \'%s\'\n", cell->name.c_str(ctx), cell->type.c_str(ctx));
        for (auto port_entry : cell->ports) {
            PortInfo &port = port_entry.second;

            if (debug)
                log_info("    Checking name of port \'%s\' "
                         "against \'%s\'\n",
                         port_entry.first.c_str(ctx), port.name.c_str(ctx));
            NPNR_ASSERT(port.name == port_entry.first);
            NPNR_ASSERT(!port.name.empty());

            if (port.net == NULL) {
                if (debug)
                    log_warning("    Port \'%s\' in cell \'%s\' is unconnected\n", port.name.c_str(ctx),
                                cell->name.c_str(ctx));
            } else {
                NPNR_ASSERT(port.net);
                if (debug)
                    log_info("    Checking for a net named \'%s\'\n", port.net->name.c_str(ctx));
                NPNR_ASSERT(ctx->nets.count(port.net->name) > 0);
            }
        }
    }

    for (auto &net_entry : ctx->nets) {
        NetInfo *net = net_entry.second.get();

        NPNR_ASSERT(net->name == net_entry.first);
        if ((net->driver.cell != NULL) && (net->driver.cell->type != ctx->id("GND")) &&
            (net->driver.cell->type != ctx->id("VCC"))) {

            if (debug)
                log_info("    Checking for a driver cell named \'%s\'\n", net->driver.cell->name.c_str(ctx));
            NPNR_ASSERT(ctx->cells.count(net->driver.cell->name) > 0);
        }

        for (auto user : net->users) {
            if ((user.cell != NULL) && (user.cell->type != ctx->id("GND")) && (user.cell->type != ctx->id("VCC"))) {

                if (debug)
                    log_info("    Checking for a user   cell named \'%s\'\n", user.cell->name.c_str(ctx));
                NPNR_ASSERT(ctx->cells.count(user.cell->name) > 0);
            }
        }
    }

    if (debug)
        log_info("  Verified!\n");
    return true;
}

NEXTPNR_NAMESPACE_END
