#include <cstring>

#include "read_activity.h"

#include "vtr_log.h"
#include "vtr_util.h"

#include "vpr_error.h"

#include "atom_netlist.h"

static bool add_activity_to_net(const AtomNetlist& netlist, std::unordered_map<AtomNetId, t_net_power>& atom_net_power, char* net_name, float probability, float density);

static bool add_activity_to_net(const AtomNetlist& netlist, std::unordered_map<AtomNetId, t_net_power>& atom_net_power, char* net_name, float probability, float density) {
    AtomNetId net_id = netlist.find_net(net_name);
    if (net_id) {
        atom_net_power[net_id].probability = probability;
        atom_net_power[net_id].density = density;
        return false;
    }

    VTR_LOG(
        "Error: net %s found in activity file, but it does not exist in the .blif file.\n",
        net_name);
    return true;
}

std::unordered_map<AtomNetId, t_net_power> read_activity(const AtomNetlist& netlist, const char* activity_file) {
    char buf[vtr::bufsize];
    char* ptr;
    char* word1;
    char* word2;
    char* word3;

    FILE* act_file_hdl;

    std::unordered_map<AtomNetId, t_net_power> atom_net_power;

    for (auto net_id : netlist.nets()) {
        atom_net_power[net_id].probability = -1.0;
        atom_net_power[net_id].density = -1.0;
    }

    act_file_hdl = vtr::fopen(activity_file, "r");
    if (act_file_hdl == nullptr) {
        VPR_FATAL_ERROR(VPR_ERROR_BLIF_F,
                        "Error: could not open activity file: %s\n", activity_file);
    }

    ptr = vtr::fgets(buf, vtr::bufsize, act_file_hdl);
    while (ptr != nullptr) {
        word1 = strtok(buf, TOKENS);
        word2 = strtok(nullptr, TOKENS);
        word3 = strtok(nullptr, TOKENS);
        add_activity_to_net(netlist, atom_net_power, word1, vtr::atof(word2), vtr::atof(word3));

        ptr = vtr::fgets(buf, vtr::bufsize, act_file_hdl);
    }
    fclose(act_file_hdl);

    /* Make sure all nets have an activity value */
    for (auto net_id : netlist.nets()) {
        if (atom_net_power[net_id].probability < 0.0
            || atom_net_power[net_id].density < 0.0) {
            VPR_FATAL_ERROR(VPR_ERROR_BLIF_F,
                            "Error: Activity file does not contain signal %s\n",
                            netlist.net_name(net_id).c_str());
        }
    }
    return atom_net_power;
}
