#include "vtr_log.h"

#include "vpr_types.h"
#include "vpr_error.h"
#include "globals.h"
#include "echo_files.h"
#include "read_xml_arch_file.h"
#include "CheckSetup.h"

void CheckSetup(
        const t_packer_opts& PackerOpts,
        const t_placer_opts& PlacerOpts,
		const t_router_opts& RouterOpts,
		const t_det_routing_arch& RoutingArch, 
        const t_segment_inf * Segments,
		const t_timing_inf Timing, 
        const t_chan_width_dist Chans) {
	int i;
	int Tmp;

    if(!Timing.timing_analysis_enabled && PackerOpts.timing_driven) {
		vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, 
				"Packing cannot be timing driven without timing analysis enabled\n");
    }

	if ((GLOBAL == RouterOpts.route_type)
			&& (TIMING_DRIVEN == RouterOpts.router_algorithm)) {

		vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, 
				"The global router does not support timing-drvien routing.\n");
	}

	if ((GLOBAL == RouterOpts.route_type)
			&& (BOUNDING_BOX_PLACE != PlacerOpts.place_algorithm)) {

		/* Works, but very weird.  Can't optimize timing well, since you're
		 * not doing proper architecture delay modelling. */
		vtr::printf_warning(__FILE__, __LINE__, 
				"Using global routing with timing-driven placement. "
				"This is allowed, but strange, and circuit speed will suffer.\n");
	}

	if ((false == Timing.timing_analysis_enabled)
			&& (PlacerOpts.place_algorithm == PATH_TIMING_DRIVEN_PLACE)) {

		/* May work, not tested */
		vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, 
				"Timing analysis must be enabled for timing-driven placement.\n");
	}

	if (!PlacerOpts.doPlacement && (USER == PlacerOpts.pad_loc_type)) {
		vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, 
				"A pad location file requires that placement is enabled.\n");
	}

	if (RouterOpts.doRouting) {
		if ((TIMING_DRIVEN == RouterOpts.router_algorithm)
				&& (false == Timing.timing_analysis_enabled)) {
			vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, 
					"Cannot perform timing-driven routing when timing analysis is disabled.\n");
		}

		if ((false == Timing.timing_analysis_enabled)
				&& (DEMAND_ONLY != RouterOpts.base_cost_type)) {
			vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, 
					"base_cost_type must be demand_only when timing analysis is disabled.\n");
		}
	}

	if (DETAILED == RouterOpts.route_type) {
		if ((Chans.chan_x_dist.type != UNIFORM)
				|| (Chans.chan_y_dist.type != UNIFORM)
				|| (Chans.chan_x_dist.peak != Chans.chan_y_dist.peak)) {
			vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, 
					"Detailed routing currently only supported on FPGAs with all channels of equal width.\n");
		}
	}

	for (i = 0; i < RoutingArch.num_segment; ++i) {
		Tmp = Segments[i].arch_opin_switch;
        auto& device_ctx = g_vpr_ctx.device();
		if (false == device_ctx.arch_switch_inf[Tmp].buffered()) {
			vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, 
					"arch_opin_switch (#%d) of segment type #%d is not buffered.\n", Tmp, i);
		}
	}

    if ((PlacerOpts.place_chan_width != NO_FIXED_CHANNEL_WIDTH) && PlacerOpts.place_chan_width < 0) {
        vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, 
                "Place channel width must be positive.\n");
    }
    if ((RouterOpts.fixed_channel_width != NO_FIXED_CHANNEL_WIDTH) && RouterOpts.fixed_channel_width < 0) {
        vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, 
                "Routing channel width must be positive.\n");
    }

	if (UNI_DIRECTIONAL == RoutingArch.directionality) {
		if ((RouterOpts.fixed_channel_width != NO_FIXED_CHANNEL_WIDTH)
				&& (RouterOpts.fixed_channel_width % 2 > 0)) {
			vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, 
					"Routing channel width must be even for unidirectional.\n");
		}
		if ((PlacerOpts.place_chan_width != NO_FIXED_CHANNEL_WIDTH)
				&& (PlacerOpts.place_chan_width % 2 > 0)) {
			vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, 
					"Place channel width must be even for unidirectional.\n");
		}
	}
}
