#include "vtr_memory.h"

#include "vpr_types.h"
#include "vpr_error.h"

#include "globals.h"
#include "rr_graph_util.h"

int seg_index_of_cblock(t_rr_type from_rr_type, int to_node) {
    /* Returns the segment number (distance along the channel) of the connection *
     * box from from_rr_type (CHANX or CHANY) to to_node (IPIN).                 */

    auto& device_ctx = g_vpr_ctx.device();

    if (from_rr_type == CHANX)
        return (device_ctx.rr_nodes[to_node].xlow());
    else
        /* CHANY */
        return (device_ctx.rr_nodes[to_node].ylow());
}

int seg_index_of_sblock(int from_node, int to_node) {
    /* Returns the segment number (distance along the channel) of the switch box *
     * box from from_node (CHANX or CHANY) to to_node (CHANX or CHANY).  The     *
     * switch box on the left side of a CHANX segment at (i,j) has seg_index =   *
     * i-1, while the switch box on the right side of that segment has seg_index *
     * = i.  CHANY stuff works similarly.  Hence the range of values returned is *
     * 0 to device_ctx.grid.width()-1 (if from_node is a CHANX) or 0 to device_ctx.grid.height()-1 (if from_node is a CHANY).   */

    t_rr_type from_rr_type, to_rr_type;

    auto& device_ctx = g_vpr_ctx.device();

    from_rr_type = device_ctx.rr_nodes[from_node].type();
    to_rr_type = device_ctx.rr_nodes[to_node].type();

    if (from_rr_type == CHANX) {
        if (to_rr_type == CHANY) {
            return (device_ctx.rr_nodes[to_node].xlow());
        } else if (to_rr_type == CHANX) {
            if (device_ctx.rr_nodes[to_node].xlow() > device_ctx.rr_nodes[from_node].xlow()) { /* Going right */
                return (device_ctx.rr_nodes[from_node].xhigh());
            } else { /* Going left */
                return (device_ctx.rr_nodes[to_node].xhigh());
            }
        } else {
            vpr_throw(VPR_ERROR_ROUTE, __FILE__, __LINE__,
                      "in seg_index_of_sblock: to_node %d is of type %d.\n",
                      to_node, to_rr_type);
            return OPEN; //Should not reach here once thrown
        }
    }
    /* End from_rr_type is CHANX */
    else if (from_rr_type == CHANY) {
        if (to_rr_type == CHANX) {
            return (device_ctx.rr_nodes[to_node].ylow());
        } else if (to_rr_type == CHANY) {
            if (device_ctx.rr_nodes[to_node].ylow() > device_ctx.rr_nodes[from_node].ylow()) { /* Going up */
                return (device_ctx.rr_nodes[from_node].yhigh());
            } else { /* Going down */
                return (device_ctx.rr_nodes[to_node].yhigh());
            }
        } else {
            vpr_throw(VPR_ERROR_ROUTE, __FILE__, __LINE__,
                      "in seg_index_of_sblock: to_node %d is of type %d.\n",
                      to_node, to_rr_type);
            return OPEN; //Should not reach here once thrown
        }
    }
    /* End from_rr_type is CHANY */
    else {
        vpr_throw(VPR_ERROR_ROUTE, __FILE__, __LINE__,
                  "in seg_index_of_sblock: from_node %d is of type %d.\n",
                  from_node, from_rr_type);
        return OPEN; //Should not reach here once thrown
    }
}
