#include <cstdio>
#include <cstring>
using namespace std;

#include "util.h"
#include "hash.h"
#include "vpr_types.h"
#include "OptionTokens.h"
#include "ReadOptions.h"
#include "read_settings.h"
#include "globals.h"

static bool EchoEnabled;

static bool Generate_PostSynthesis_Netlist;

static bool *echoFileEnabled = NULL;
static char **echoFileNames = NULL;

static char **outputFileNames = NULL;

/******** Function prototypes ********/

static char **ReadBaseToken(INP char **Args, OUTP enum e_OptionBaseToken *Token);
static void Error(INP const char *Token);
static char **ProcessOption(INP char **Args, INOUTP t_options * Options);
static void MergeOptions(INOUTP t_options * dest, INP t_options * src, int id);
static char **ReadFloat(INP char **Args, OUTP float *Val);
static char **ReadInt(INP char **Args, OUTP int *Val);
static char **ReadOnOff(INP char **Args, OUTP bool * Val);
static char **ReadClusterSeed(INP char **Args, OUTP enum e_cluster_seed *Type);
static char **ReadFixPins(INP char **Args, OUTP char **PinFile);
static char **ReadPlaceAlgorithm(INP char **Args,
		OUTP enum e_place_algorithm *Algo);
static char **ReadRouterAlgorithm(INP char **Args,
		OUTP enum e_router_algorithm *Algo);
static char **ReadPackerAlgorithm(INP char **Args,
		OUTP enum e_packer_algorithm *Algo);
static char **ReadRoutingPredictor(INP char **Args,
		OUTP enum e_routing_failure_predictor *RoutingPred);
static char **ReadBaseCostType(INP char **Args,
		OUTP enum e_base_cost_type *BaseCostType);
static char **ReadRouteType(INP char **Args, OUTP enum e_route_type *Type);
static char **ReadString(INP char **Args, OUTP char **Val);
static char **ReadChar(INP char **Args, OUTP char *Val);

/******** Globally Accessible Function ********/
/* Determines whether timing analysis should be on or off. 
 Unless otherwise specified, always default to timing.
 */
bool IsTimingEnabled(INP t_options *Options) {
	/* First priority to the '--timing_analysis' flag */
	if (Options->Count[OT_TIMING_ANALYSIS]) {
		return Options->TimingAnalysis;
	}
	return true;
}

/* Determines whether file echo should be on or off. 
 Unless otherwise specified, always default to on.
 */
bool IsEchoEnabled(INP t_options *Options) {
	/* First priority to the '--echo_file' flag */
	if (Options->Count[OT_CREATE_ECHO_FILE]) {
		return Options->CreateEchoFile;
	}
	return false;
}


bool getEchoEnabled(void) {
	return EchoEnabled;
}

void setEchoEnabled(bool echo_enabled) {
	/* enable echo outputs */
	EchoEnabled = echo_enabled;
	if(echoFileEnabled == NULL) {
		/* initialize default echo options */
		alloc_and_load_echo_file_info();
	}
}

bool GetPostSynthesisOption(void){
  return Generate_PostSynthesis_Netlist;
}

void SetPostSynthesisOption(bool post_synthesis_enabled){
  Generate_PostSynthesis_Netlist = post_synthesis_enabled;
}

bool IsPostSynthesisEnabled(INP t_options *Options) {
  /* First priority to the '--generate_postsynthesis_netlist' flag */
  if (Options->Count[OT_GENERATE_POST_SYNTHESIS_NETLIST]) {
    return Options->Generate_Post_Synthesis_Netlist;
  }
  return false;
}

void setAllEchoFileEnabled(bool value) {
	int i;
	for(i = 0; i < (int) E_ECHO_END_TOKEN; i++) {
		echoFileEnabled[i] = value;
	}
}

void setEchoFileEnabled(enum e_echo_files echo_option, bool value) {
	echoFileEnabled[(int)echo_option] = value;
}

void setEchoFileName(enum e_echo_files echo_option, const char *name) {
	if(echoFileNames[(int)echo_option] != NULL) {
		free(echoFileNames[(int)echo_option]);
	}
	echoFileNames[(int)echo_option] = my_strdup(name);
}

bool isEchoFileEnabled(enum e_echo_files echo_option) {
	if(echoFileEnabled == NULL) {
		return false;
	} else {
		return echoFileEnabled[(int)echo_option];
	}
}
char *getEchoFileName(enum e_echo_files echo_option) {
	return echoFileNames[(int)echo_option];
}

void alloc_and_load_echo_file_info() {
	echoFileEnabled = (bool*)my_calloc((int) E_ECHO_END_TOKEN, sizeof(bool));
	echoFileNames = (char**)my_calloc((int) E_ECHO_END_TOKEN, sizeof(char*));

	setAllEchoFileEnabled(true);

	setEchoFileName(E_ECHO_INITIAL_CLB_PLACEMENT, "initial_clb_placement.echo");
	setEchoFileName(E_ECHO_INITIAL_PLACEMENT_TIMING_GRAPH, "initial_placement_timing_graph.echo");
	setEchoFileName(E_ECHO_INITIAL_PLACEMENT_SLACK, "initial_placement_slack.echo");
	setEchoFileName(E_ECHO_INITIAL_PLACEMENT_CRITICALITY, "initial_placement_criticality.echo");
	setEchoFileName(E_ECHO_END_CLB_PLACEMENT, "end_clb_placement.echo");
	setEchoFileName(E_ECHO_PLACEMENT_SINK_DELAYS, "placement_sink_delays.echo");
	setEchoFileName(E_ECHO_FINAL_PLACEMENT_TIMING_GRAPH, "final_placement_timing_graph.echo");
	setEchoFileName(E_ECHO_FINAL_PLACEMENT_SLACK, "final_placement_slack.echo");
	setEchoFileName(E_ECHO_FINAL_PLACEMENT_CRITICALITY, "final_placement_criticality.echo");
	setEchoFileName(E_ECHO_PLACEMENT_CRIT_PATH, "placement_crit_path.echo");
	setEchoFileName(E_ECHO_PB_GRAPH, "pb_graph.echo");
	setEchoFileName(E_ECHO_LB_TYPE_RR_GRAPH, "lb_type_rr_graph.echo");
	setEchoFileName(E_ECHO_ARCH, "arch.echo");
	setEchoFileName(E_ECHO_PLACEMENT_CRITICAL_PATH, "placement_critical_path.echo");
	setEchoFileName(E_ECHO_PLACEMENT_LOWER_BOUND_SINK_DELAYS, "placement_lower_bound_sink_delays.echo");
	setEchoFileName(E_ECHO_PLACEMENT_LOGIC_SINK_DELAYS, "placement_logic_sink_delays.echo");
	setEchoFileName(E_ECHO_ROUTING_SINK_DELAYS, "routing_sink_delays.echo");
	setEchoFileName(E_ECHO_POST_FLOW_TIMING_GRAPH, "post_flow_timing_graph.blif");
	setEchoFileName(E_ECHO_POST_PACK_NETLIST, "post_pack_netlist.blif");
	setEchoFileName(E_ECHO_BLIF_INPUT, "blif_input.echo");
	setEchoFileName(E_ECHO_COMPRESSED_NETLIST, "compressed_netlist.echo");
	setEchoFileName(E_ECHO_NET_DELAY, "net_delay.echo");
	setEchoFileName(E_ECHO_TIMING_GRAPH, "timing_graph.echo");
	setEchoFileName(E_ECHO_PRE_PACKING_TIMING_GRAPH, "pre_packing_timing_graph.echo");
	setEchoFileName(E_ECHO_PRE_PACKING_TIMING_GRAPH_AS_BLIF, "pre_packing_timing_graph_as_blif.blif");
	setEchoFileName(E_ECHO_CLUSTERING_TIMING_INFO, "clustering_timing_info.echo");
	setEchoFileName(E_ECHO_PRE_PACKING_SLACK, "pre_packing_slack.echo");
	setEchoFileName(E_ECHO_PRE_PACKING_CRITICALITY, "pre_packing_criticality.echo");
	setEchoFileName(E_ECHO_CLUSTERING_BLOCK_CRITICALITIES, "clustering_block_criticalities.echo");
	setEchoFileName(E_ECHO_PRE_PACKING_MOLECULES_AND_PATTERNS, "pre_packing_molecules_and_patterns.echo");
	setEchoFileName(E_ECHO_MEM, "mem.echo");
	setEchoFileName(E_ECHO_RR_GRAPH, "rr_graph.echo");
	setEchoFileName(E_ECHO_TIMING_CONSTRAINTS, "timing_constraints.echo");	
	setEchoFileName(E_ECHO_CRITICAL_PATH, "critical_path.echo");	
	setEchoFileName(E_ECHO_SLACK, "slack.echo");	
	setEchoFileName(E_ECHO_COMPLETE_NET_TRACE, "complete_net_trace.echo");
	setEchoFileName(E_ECHO_SEG_DETAILS, "seg_details.txt");
	setEchoFileName(E_ECHO_CHAN_DETAILS, "chan_details.txt");
	setEchoFileName(E_ECHO_SBLOCK_PATTERN, "sblock_pattern.txt");
}

void free_echo_file_info() {
	int i;
	if(echoFileEnabled != NULL) {
		for(i = 0; i < (int) E_ECHO_END_TOKEN; i++) {
			if(echoFileNames[i] != NULL) {
				free(echoFileNames[i]);
			}
		}
		free(echoFileNames);
		free(echoFileEnabled);
		echoFileNames = NULL;
		echoFileEnabled = NULL;
	}
}

void setOutputFileName(enum e_output_files ename, const char *name, const char *default_name) {
	if(outputFileNames == NULL) {
		alloc_and_load_output_file_names(default_name);
	}
	if(outputFileNames[(int)ename] != NULL) {
		free(outputFileNames[(int)ename]);
	}
	outputFileNames[(int)ename] = my_strdup(name);
}

char *getOutputFileName(enum e_output_files ename) {
	return outputFileNames[(int)ename];
}

void alloc_and_load_output_file_names(const char *default_name) {
	char *name;

	if(outputFileNames == NULL) {

		outputFileNames = (char**)my_calloc((int)E_FILE_END_TOKEN, sizeof(char*));

		name = (char*)my_malloc((strlen(default_name) + 40) * sizeof(char));
		sprintf(name, "%s.critical_path.out", default_name);
		setOutputFileName(E_CRIT_PATH_FILE, name, default_name);
	
		sprintf(name, "%s.slack.out", default_name);
		setOutputFileName(E_SLACK_FILE, name, default_name);

		sprintf(name, "%s.criticality.out", default_name);
		setOutputFileName(E_CRITICALITY_FILE, name, default_name);

		free(name);
	}
}

void free_output_file_names() {
	int i;
	if(outputFileNames != NULL) {
		for(i = 0; i < (int)E_FILE_END_TOKEN; i++) {
			if(outputFileNames[i] != NULL) {
				free(outputFileNames[i]);
				outputFileNames[i] = NULL;
			}
		}
		free(outputFileNames);
		outputFileNames = NULL;
	}
}



/******** Subroutine implementations ********/

void ReadOptions(INP int argc, INP char **argv, OUTP t_options * Options) {
	char **Args, **head;
	int offset;
	
	/* Clear values and pointers to zero */
	memset(Options, 0, sizeof(t_options));

	/* Alloc a new pointer list for args with a NULL at end.
	 * This makes parsing the same as for archfile for consistency.
	 * Skips the first arg as it is the program image path */
	--argc;
	++argv;
	head = Args = (char **) my_malloc(sizeof(char *) * (argc + 1));
	memcpy(Args, argv, (sizeof(char *) * argc));
	Args[argc] = NULL;

	/* Go through the command line args. If they have hyphens they are 
	 * options. Otherwise assume they are part of the four mandatory
	 * arguments */
	while (*Args) {
		if (strncmp("--", *Args, 2) == 0) {
			*Args += 2; /* Skip the prefix */
			Args = ProcessOption(Args, Options);
		} else if (strncmp("-", *Args, 1) == 0) {
			*Args += 1; /* Skip the prefix */
			Args = ProcessOption(Args, Options);
		} else if (NULL == Options->ArchFile) {
			Options->ArchFile = my_strdup(*Args);
			vpr_printf_info("Architecture file: %s\n", Options->ArchFile);
			++Args;
		} else if (NULL == Options->CircuitName) {
			Options->CircuitName = my_strdup(*Args);
			/*if the user entered the circuit name with the .blif extension, remove it now*/
			offset = strlen(Options->CircuitName) - 5;
			if (offset > 0 && !strcmp(Options->CircuitName + offset, ".blif")) {
				Options->CircuitName[offset] = '\0';
			}
			vpr_printf_info("Circuit name: %s.blif\n", Options->CircuitName);
			vpr_printf_info("\n");
			++Args;
		} else {
			/* Not an option and arch and net already specified so fail */
			Error(*Args);
		}

		if (Options->Count[OT_SETTINGS_FILE] != Options->read_settings)
		{
			int tmp_argc = 0;
			char **tmp_argv = NULL;
			t_options SettingsFileOptions;

			tmp_argc = read_settings_file(Options->SettingsFile, &tmp_argv);

			ReadOptions(tmp_argc, tmp_argv, &SettingsFileOptions);

			MergeOptions(Options, &SettingsFileOptions, Options->Count[OT_SETTINGS_FILE]);

			Options->read_settings = Options->Count[OT_SETTINGS_FILE];

			/* clean up local data structures */
			free(tmp_argv);
		}
	}
	free(head);
}

static char **
ProcessOption(INP char **Args, INOUTP t_options * Options) {
	enum e_OptionBaseToken Token;
	char **PrevArgs;

	PrevArgs = Args;
	Args = ReadBaseToken(Args, &Token);
	
	if (Token < OT_BASE_UNKNOWN) {
		/* If this was previously set by a lower priority source
		 * (ie. a settings file), reset the provenance and the
		 * count */
		if (Options->Provenance[Token])
		{
			Options->Provenance[Token] = 0;
			Options->Count[Token] = 1;
		}
		else
			++Options->Count[Token];
	}

	switch (Token) {
		/* File naming options */
	case OT_BLIF_FILE:
		return ReadString(Args, &Options->BlifFile);
	case OT_NET_FILE:
		return ReadString(Args, &Options->NetFile);
	case OT_PLACE_FILE:
		return ReadString(Args, &Options->PlaceFile);
	case OT_ROUTE_FILE:
		return ReadString(Args, &Options->RouteFile);
	case OT_SDC_FILE:
		return ReadString(Args, &Options->SDCFile);
	case OT_SETTINGS_FILE:
		return ReadString(Args, &Options->SettingsFile);
	case OT_DUMP_RR_STRUCTS_FILE:
		return ReadString(Args, &Options->dump_rr_structs_file);
		/* General Options */
	case OT_NODISP:
	case OT_CONGESTION_ANALYSIS:
	case OT_FANOUT_ANALYSIS:
    case OT_SWITCH_USAGE_ANALYSIS:
		return Args;
	case OT_AUTO:
		return ReadInt(Args, &Options->GraphPause);
	case OT_PACK:
	case OT_ROUTE:
	case OT_PLACE:
		return Args;
    case OT_SLACK_DEFINITION:
        return ReadChar(Args, &Options->SlackDefinition);
	case OT_TIMING_ANALYZE_ONLY_WITH_NET_DELAY:
		return ReadFloat(Args, &Options->constant_net_delay);
	case OT_FAST:
	case OT_FULL_STATS:
		return Args;
	case OT_TIMING_ANALYSIS:
		return ReadOnOff(Args, &Options->TimingAnalysis);
	case OT_OUTFILE_PREFIX:
		return ReadString(Args, &Options->out_file_prefix);
	case OT_CREATE_ECHO_FILE:
		return ReadOnOff(Args, &Options->CreateEchoFile);
	case OT_GEN_NELIST_AS_BLIF:
		return Args;
	case OT_GENERATE_POST_SYNTHESIS_NETLIST:          
	  return ReadOnOff(Args, &Options->Generate_Post_Synthesis_Netlist);
		/* Clustering Options */
	case OT_GLOBAL_CLOCKS:
		return ReadOnOff(Args, &Options->global_clocks);
	case OT_HILL_CLIMBING_FLAG:
		return ReadOnOff(Args, &Options->hill_climbing_flag);
	case OT_SWEEP_HANGING_NETS_AND_INPUTS:
		return ReadOnOff(Args, &Options->sweep_hanging_nets_and_inputs);
	case OT_TIMING_DRIVEN_CLUSTERING:
		return ReadOnOff(Args, &Options->timing_driven);
	case OT_CLUSTER_SEED:
		return ReadClusterSeed(Args, &Options->cluster_seed_type);
	case OT_ALPHA_CLUSTERING:
		return ReadFloat(Args, &Options->alpha);
	case OT_BETA_CLUSTERING:
		return ReadFloat(Args, &Options->beta);
	case OT_RECOMPUTE_TIMING_AFTER:
		return ReadInt(Args, &Options->recompute_timing_after);
	case OT_CLUSTER_BLOCK_DELAY:
		return ReadFloat(Args, &Options->block_delay);
	case OT_ALLOW_UNRELATED_CLUSTERING:
		return ReadOnOff(Args, &Options->allow_unrelated_clustering);
	case OT_ALLOW_EARLY_EXIT:
		return ReadOnOff(Args, &Options->allow_early_exit);
	case OT_INTRA_CLUSTER_NET_DELAY:
		return ReadFloat(Args, &Options->intra_cluster_net_delay);
	case OT_INTER_CLUSTER_NET_DELAY:
		return ReadFloat(Args, &Options->inter_cluster_net_delay);
	case OT_CONNECTION_DRIVEN_CLUSTERING:
		return ReadOnOff(Args, &Options->connection_driven);
	case OT_SKIP_CLUSTERING:
		return Args;
	case OT_PACKER_ALGORITHM:
		return ReadPackerAlgorithm(Args, &Options->packer_algorithm);

		/* Placer Options */
	case OT_PLACE_ALGORITHM:
		return ReadPlaceAlgorithm(Args, &Options->PlaceAlgorithm);
	case OT_INIT_T:
		return ReadFloat(Args, &Options->PlaceInitT);
	case OT_EXIT_T:
		return ReadFloat(Args, &Options->PlaceExitT);
	case OT_ALPHA_T:
		return ReadFloat(Args, &Options->PlaceAlphaT);
	case OT_INNER_NUM:
		return ReadFloat(Args, &Options->PlaceInnerNum);
	case OT_SEED:
		return ReadInt(Args, &Options->Seed);
	case OT_PLACE_COST_EXP:
		return ReadFloat(Args, &Options->place_cost_exp);
	case OT_PLACE_CHAN_WIDTH:
		return ReadInt(Args, &Options->PlaceChanWidth);
	case OT_FIX_PINS:
		return ReadFixPins(Args, &Options->PinFile);
	case OT_ENABLE_TIMING_COMPUTATIONS:
		return ReadOnOff(Args, &Options->ShowPlaceTiming);
	case OT_BLOCK_DIST:
		return ReadInt(Args, &Options->block_dist);

		/* Placement Options Valid Only for Timing-Driven Placement */
	case OT_TIMING_TRADEOFF:
		return ReadFloat(Args, &Options->PlaceTimingTradeoff);
	case OT_RECOMPUTE_CRIT_ITER:
		return ReadInt(Args, &Options->RecomputeCritIter);
	case OT_INNER_LOOP_RECOMPUTE_DIVIDER:
		return ReadInt(Args, &Options->inner_loop_recompute_divider);
	case OT_TD_PLACE_EXP_FIRST:
		return ReadFloat(Args, &Options->place_exp_first);
	case OT_TD_PLACE_EXP_LAST:
		return ReadFloat(Args, &Options->place_exp_last);

		/* Router Options */
	case OT_MAX_ROUTER_ITERATIONS:
		return ReadInt(Args, &Options->max_router_iterations);
	case OT_BB_FACTOR:
		return ReadInt(Args, &Options->bb_factor);
	case OT_INITIAL_PRES_FAC:
		return ReadFloat(Args, &Options->initial_pres_fac);
	case OT_PRES_FAC_MULT:
		return ReadFloat(Args, &Options->pres_fac_mult);
	case OT_ACC_FAC:
		return ReadFloat(Args, &Options->acc_fac);
	case OT_FIRST_ITER_PRES_FAC:
		return ReadFloat(Args, &Options->first_iter_pres_fac);
	case OT_BEND_COST:
		return ReadFloat(Args, &Options->bend_cost);
	case OT_ROUTE_TYPE:
		return ReadRouteType(Args, &Options->RouteType);
	case OT_VERIFY_BINARY_SEARCH:
		return Args;
	case OT_ROUTE_CHAN_WIDTH:
		return ReadInt(Args, &Options->RouteChanWidth);
	case OT_TRIM_EMPTY_CHAN:
		return ReadOnOff(Args, &Options->TrimEmptyChan);
	case OT_TRIM_OBS_CHAN:
		return ReadOnOff(Args, &Options->TrimObsChan);
	case OT_ROUTER_ALGORITHM:
		return ReadRouterAlgorithm(Args, &Options->RouterAlgorithm);
	case OT_BASE_COST_TYPE:
		return ReadBaseCostType(Args, &Options->base_cost_type);

		/* Routing options valid only for timing-driven routing */
	case OT_ASTAR_FAC:
		return ReadFloat(Args, &Options->astar_fac);
	case OT_MAX_CRITICALITY:
		return ReadFloat(Args, &Options->max_criticality);
	case OT_CRITICALITY_EXP:
		return ReadFloat(Args, &Options->criticality_exp);
	case OT_ROUTING_FAILURE_PREDICTOR:
		return ReadRoutingPredictor(Args, &Options->routing_failure_predictor);

#ifdef INTERPOSER_BASED_ARCHITECTURE
	case OT_PERCENT_WIRES_CUT:
		return ReadInt(Args, &Options->percent_wires_cut);
	case OT_NUM_CUTS:
		return ReadInt(Args, &Options->num_cuts);
	case OT_DELAY_INCREASE:
		return ReadInt(Args, &Options->delay_increase);
	case OT_PLACER_COST_CONSTANT:
		return ReadFloat(Args, &Options->placer_cost_constant);
	case OT_CONSTANT_TYPE:
		return ReadInt(Args, &Options->constant_type);
		
	/* used for interposer-based architecture experiments */
	case OT_ALLOW_CHANX_CONN:
		return ReadOnOff(Args, &Options->allow_chanx_interposer_connections);
	case OT_ALLOW_FANIN_TRANSFER:
		return ReadOnOff(Args, &Options->transfer_interposer_fanins);
	case OT_ALLOW_ADDITIONAL_FANIN:
		return ReadOnOff(Args, &Options->allow_additional_interposer_fanins);
	case OT_ALLOW_FANOUT_TRANSFER:
		return ReadOnOff(Args, &Options->transfer_interposer_fanouts);
	case OT_ALLOW_ADDITIONAL_FANOUT:
		return ReadOnOff(Args, &Options->allow_additional_interposer_fanouts);
	case OT_PCT_INTERP_TO_DRIVE:
		return ReadInt(Args, &Options->pct_of_interposer_nodes_each_chany_can_drive);
	case OT_PCT_INTERP_TO_BE_DRIVEN_BY:
		return ReadInt(Args, &Options->pct_of_chany_wires_an_interposer_node_can_drive);
#endif

		/* Power options */
	case OT_POWER:
		return Args;
	case OT_ACTIVITY_FILE:
		return ReadString(Args, &Options->ActFile);
	case OT_POWER_OUT_FILE:
		return ReadString(Args, &Options->PowerFile);
	case OT_CMOS_TECH_BEHAVIOR_FILE:
		return ReadString(Args, &Options->CmosTechFile);

	default:
		vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, 
			"Unexpected option '%s' on command line.\n", *PrevArgs);
		return NULL;
	}
}

/*
 * Map options set in the source t_options to a target t_options
 * structure.  Existing values in the destination have priority
 * and will not be overwritten
 */
static void MergeOptions(INOUTP t_options * dest, INP t_options * src, int id)
{
	int Token;

	for (Token = 0; Token < OT_BASE_UNKNOWN; Token++)
	{
		/* Don't override values already set in the
		 * target destination.  Also do not process
		 * Tokens that are not present in the source.
		 */
		if ((dest->Count[Token] || (!src->Count[Token])))
			continue;

		dest->Count[Token] = src->Count[Token];
		dest->Provenance[Token] = id;

		switch (Token) {
			/* File naming options */
		case OT_BLIF_FILE:
			dest->BlifFile = src->BlifFile;
			break;
		case OT_NET_FILE:
			dest->NetFile = src->NetFile;
			break;
		case OT_PLACE_FILE:
			dest->PlaceFile = src->PlaceFile;
			break;
		case OT_ROUTE_FILE:
			dest->RouteFile = src->RouteFile;
			break;
		case OT_SETTINGS_FILE:
			dest->SettingsFile = src->SettingsFile;
			break;
		case OT_SDC_FILE:
			dest->SDCFile = src->SDCFile;
			break;
			/* General Options */
		case OT_NODISP:
		case OT_CONGESTION_ANALYSIS:
		case OT_FANOUT_ANALYSIS:
        case OT_SWITCH_USAGE_ANALYSIS:
			break;
		case OT_AUTO:
			dest->GraphPause = src->GraphPause;
			break;
		case OT_PACK:
		case OT_ROUTE:
		case OT_PLACE:
			break;
		case OT_TIMING_ANALYZE_ONLY_WITH_NET_DELAY:
			dest->constant_net_delay = src->constant_net_delay;
			break;
		case OT_GEN_NELIST_AS_BLIF:
			break;
		case OT_FAST:
		case OT_FULL_STATS:
			break;
		case OT_TIMING_ANALYSIS:
			dest->TimingAnalysis = src->TimingAnalysis;
			break;
		case OT_OUTFILE_PREFIX:
			dest->out_file_prefix = src->out_file_prefix;
			break;
		case OT_CREATE_ECHO_FILE:
			dest->CreateEchoFile = src->CreateEchoFile;
			break;

			/* Clustering Options */
		case OT_GLOBAL_CLOCKS:
			dest->global_clocks = src->global_clocks;
			break;
		case OT_HILL_CLIMBING_FLAG:
			dest->hill_climbing_flag = src->hill_climbing_flag;
			break;
		case OT_SWEEP_HANGING_NETS_AND_INPUTS:
			dest->sweep_hanging_nets_and_inputs = src->sweep_hanging_nets_and_inputs;
			break;
		case OT_TIMING_DRIVEN_CLUSTERING:
			dest->timing_driven = src->timing_driven;
			break;
		case OT_CLUSTER_SEED:
			dest->cluster_seed_type = src->cluster_seed_type;
			break;
		case OT_ALPHA_CLUSTERING:
			dest->alpha = src->alpha;
			break;
		case OT_BETA_CLUSTERING:
			dest->beta = src->beta;
			break;
		case OT_RECOMPUTE_TIMING_AFTER:
			dest->recompute_timing_after = src->recompute_timing_after;
			break;
		case OT_CLUSTER_BLOCK_DELAY:
			dest->block_delay = src->block_delay;
			break;
		case OT_ALLOW_UNRELATED_CLUSTERING:
			dest->allow_unrelated_clustering = src->allow_unrelated_clustering;
			break;
		case OT_ALLOW_EARLY_EXIT:
			dest->allow_early_exit = src->allow_early_exit;
			break;
		case OT_INTRA_CLUSTER_NET_DELAY:
			dest->intra_cluster_net_delay = src->intra_cluster_net_delay;
			break;
		case OT_INTER_CLUSTER_NET_DELAY:
			dest->inter_cluster_net_delay = src->inter_cluster_net_delay;
			break;
		case OT_CONNECTION_DRIVEN_CLUSTERING:
			dest->connection_driven = src->connection_driven;
			break;
		case OT_SKIP_CLUSTERING:
			break;
		case OT_PACKER_ALGORITHM:
			dest->packer_algorithm = src->packer_algorithm;
			break;

			/* Placer Options */
		case OT_PLACE_ALGORITHM:
			dest->PlaceAlgorithm = src->PlaceAlgorithm;
			break;
		case OT_INIT_T:
			dest->PlaceInitT = src->PlaceInitT;
			break;
		case OT_EXIT_T:
			dest->PlaceExitT = src->PlaceExitT;
			break;
		case OT_ALPHA_T:
			dest->PlaceAlphaT = src->PlaceAlphaT;
			break;
		case OT_INNER_NUM:
			dest->PlaceInnerNum = src->PlaceInnerNum;
			break;
		case OT_SEED:
			dest->Seed = src->Seed;
			break;
		case OT_PLACE_COST_EXP:
			dest->place_cost_exp = src->place_cost_exp;
			break;
		case OT_PLACE_CHAN_WIDTH:
			dest->PlaceChanWidth = src->PlaceChanWidth;
			break;
		case OT_FIX_PINS:
			dest->PinFile = src->PinFile;
			break;
		case OT_ENABLE_TIMING_COMPUTATIONS:
			dest->ShowPlaceTiming = src->ShowPlaceTiming;
			break;
		case OT_BLOCK_DIST:
			dest->block_dist = src->block_dist;
			break;

			/* Placement Options Valid Only for Timing-Driven Placement */
		case OT_TIMING_TRADEOFF:
			dest->PlaceTimingTradeoff = src->PlaceTimingTradeoff;
			break;
		case OT_RECOMPUTE_CRIT_ITER:
			dest->RecomputeCritIter = src->RecomputeCritIter;
			break;
		case OT_INNER_LOOP_RECOMPUTE_DIVIDER:
			dest->inner_loop_recompute_divider = src->inner_loop_recompute_divider;
			break;
		case OT_TD_PLACE_EXP_FIRST:
			dest->place_exp_first = src->place_exp_first;
			break;
		case OT_TD_PLACE_EXP_LAST:
			dest->place_exp_last = src->place_exp_last;
			break;

			/* Router Options */
		case OT_MAX_ROUTER_ITERATIONS:
			dest->max_router_iterations = src->max_router_iterations;
			break;
		case OT_BB_FACTOR:
			dest->bb_factor = src->bb_factor;
			break;
		case OT_INITIAL_PRES_FAC:
			dest->initial_pres_fac = src->initial_pres_fac;
			break;
		case OT_PRES_FAC_MULT:
			dest->pres_fac_mult = src->pres_fac_mult;
			break;
		case OT_ACC_FAC:
			dest->acc_fac = src->acc_fac;
			break;
		case OT_FIRST_ITER_PRES_FAC:
			dest->first_iter_pres_fac = src->first_iter_pres_fac;
			break;
		case OT_BEND_COST:
			dest->bend_cost = src->bend_cost;
			break;
		case OT_ROUTE_TYPE:
			dest->RouteType = src->RouteType;
			break;
		case OT_VERIFY_BINARY_SEARCH:
			break;
		case OT_ROUTE_CHAN_WIDTH:
			dest->RouteChanWidth = src->RouteChanWidth;
			break;
		case OT_TRIM_EMPTY_CHAN:
			dest->TrimEmptyChan = src->TrimEmptyChan;
			break;
		case OT_TRIM_OBS_CHAN:
			dest->TrimObsChan = src->TrimObsChan;
			break;
		case OT_ROUTER_ALGORITHM:
			dest->RouterAlgorithm = src->RouterAlgorithm;
			break;
		case OT_BASE_COST_TYPE:
			dest->base_cost_type = src->base_cost_type;
			break;

			/* Routing options valid only for timing-driven routing */
		case OT_ASTAR_FAC:
			dest->astar_fac = src->astar_fac;
			break;
		case OT_MAX_CRITICALITY:
			dest->max_criticality = src->max_criticality;
			break;
		case OT_CRITICALITY_EXP:
			dest->criticality_exp = src->criticality_exp;
			break;
		default:
			break;
		}
	}
}

static char **
ReadBaseToken(INP char **Args, OUTP enum e_OptionBaseToken *Token) {
	struct s_TokenPair *Cur;

	/* Empty string is end of tokens marker */
	if (NULL == *Args)
		Error(*Args);

	/* Linear search for the pair */
	Cur = OptionBaseTokenList;
	while (Cur->Str) {
		if (strcmp(*Args, Cur->Str) == 0) {
			*Token = (enum e_OptionBaseToken) Cur->Enum;
			return ++Args;
		}
		++Cur;
	}

	*Token = OT_BASE_UNKNOWN;
	return ++Args;
}

static char **
ReadToken(INP char **Args, OUTP enum e_OptionArgToken *Token) {
	struct s_TokenPair *Cur;

	/* Empty string is end of tokens marker */
	if (NULL == *Args)
		Error(*Args);

	/* Linear search for the pair */
	Cur = OptionArgTokenList;
	while (Cur->Str) {
		if (strcmp(*Args, Cur->Str) == 0) {
			*Token = (enum e_OptionArgToken)Cur->Enum;
			return ++Args;
		}
		++Cur;
	}

	*Token = OT_ARG_UNKNOWN;
	return ++Args;
}

/* Called for parse errors. Spits out a message and then exits program. */
static void Error(INP const char *Token) {
	if (Token) {
		vpr_throw(VPR_ERROR_OTHER, __FILE__, __LINE__, 
		"Unexpected token '%s' on command line.\n", Token);
	} else {
		vpr_throw(VPR_ERROR_OTHER,__FILE__, __LINE__, 
		"Missing token at end of command line.\n");
	}
}

static char **
ReadClusterSeed(INP char **Args, OUTP enum e_cluster_seed *Type) {
	enum e_OptionArgToken Token;
	char **PrevArgs;

	PrevArgs = Args;
	Args = ReadToken(Args, &Token);
	switch (Token) {
	case OT_TIMING:
		*Type = VPACK_TIMING;
		break;
	case OT_MAX_INPUTS:
		*Type = VPACK_MAX_INPUTS;
		break;
	case OT_BLEND:
		*Type = VPACK_BLEND;
		break;
	default:
		Error(*PrevArgs);
	}

	return Args;
}

static char **
ReadPackerAlgorithm(INP char **Args, OUTP enum e_packer_algorithm *Algo) {
	enum e_OptionArgToken Token;
	char **PrevArgs;

	PrevArgs = Args;
	Args = ReadToken(Args, &Token);
	switch (Token) {
	case OT_GREEDY:
		*Algo = PACK_GREEDY;
		break;
	case OT_BRUTE_FORCE:
		*Algo = PACK_BRUTE_FORCE;
		break;
	default:
		Error(*PrevArgs);
	}

	return Args;
}


static char **
ReadRouterAlgorithm(INP char **Args, OUTP enum e_router_algorithm *Algo) {
	enum e_OptionArgToken Token;
	char **PrevArgs;

	PrevArgs = Args;
	Args = ReadToken(Args, &Token);
	switch (Token) {
	case OT_BREADTH_FIRST:
		*Algo = BREADTH_FIRST;
		break;
	case OT_NO_TIMING:
		*Algo = NO_TIMING;
		break;
	case OT_TIMING_DRIVEN:
		*Algo = TIMING_DRIVEN;
		break;
	default:
		Error(*PrevArgs);
	}

	return Args;
}

static char **
ReadRoutingPredictor(INP char **Args, OUTP enum e_routing_failure_predictor *RoutingPred) {
	enum e_OptionArgToken Token;
	char **PrevArgs;

	PrevArgs = Args;
	Args = ReadToken(Args, &Token);
	switch (Token) {
	case OT_OFF:
		*RoutingPred = OFF;
		break;
	case OT_ROUTING_FAILURE_SAFE:
		*RoutingPred = SAFE;
		break;
	case OT_ROUTING_FAILURE_AGGRESSIVE:
		*RoutingPred = AGGRESSIVE;
		break;
	default:
		Error(*PrevArgs);
	}

	return Args;
}

static char **
ReadBaseCostType(INP char **Args, OUTP enum e_base_cost_type *BaseCostType) {
	enum e_OptionArgToken Token;
	char **PrevArgs;

	PrevArgs = Args;
	Args = ReadToken(Args, &Token);
	switch (Token) {
	case OT_INTRINSIC_DELAY:
		*BaseCostType = INTRINSIC_DELAY;
		break;
	case OT_DELAY_NORMALIZED:
		*BaseCostType = DELAY_NORMALIZED;
		break;
	case OT_DEMAND_ONLY:
		*BaseCostType = DEMAND_ONLY;
		break;
	default:
		Error(*PrevArgs);
	}

	return Args;
}

static char **
ReadRouteType(INP char **Args, OUTP enum e_route_type *Type) {
	enum e_OptionArgToken Token;
	char **PrevArgs;

	PrevArgs = Args;
	Args = ReadToken(Args, &Token);
	switch (Token) {
	case OT_GLOBAL:
		*Type = GLOBAL;
		break;
	case OT_DETAILED:
		*Type = DETAILED;
		break;
	default:
		Error(*PrevArgs);
	}

	return Args;
}

static char **
ReadPlaceAlgorithm(INP char **Args, OUTP enum e_place_algorithm *Algo) {
	enum e_OptionArgToken Token;
	char **PrevArgs;

	PrevArgs = Args;
	Args = ReadToken(Args, &Token);
	switch (Token) {
	case OT_BOUNDING_BOX:
		*Algo = BOUNDING_BOX_PLACE;
		break;
	case OT_NET_TIMING_DRIVEN:
		*Algo = NET_TIMING_DRIVEN_PLACE;
		break;
	case OT_PATH_TIMING_DRIVEN:
		*Algo = PATH_TIMING_DRIVEN_PLACE;
		break;
	default:
		Error(*PrevArgs);
	}

	return Args;
}

static char **
ReadFixPins(INP char **Args, OUTP char **PinFile) {
	enum e_OptionArgToken Token;
	int Len;
	char **PrevArgs = Args;

	Args = ReadToken(Args, &Token);
	if (OT_RANDOM != Token) {
		Len = 1 + strlen(*PrevArgs);
		*PinFile = (char *) my_malloc(Len * sizeof(char));
		memcpy(*PinFile, *PrevArgs, Len);
	}
	return Args;
}

static char **
ReadOnOff(INP char **Args, OUTP bool * Val) {
	enum e_OptionArgToken Token;
	char **PrevArgs;

	PrevArgs = Args;
	Args = ReadToken(Args, &Token);
	switch (Token) {
	case OT_ON:
		*Val = true;
		break;
	case OT_OFF:
		*Val = false;
		break;
	default:
		Error(*PrevArgs);
	}
	return Args;
}

static char **
ReadInt(INP char **Args, OUTP int *Val) {
	if (NULL == *Args)
		Error(*Args);
	if ((**Args > '9') || (**Args < '0'))
		Error(*Args);

	*Val = atoi(*Args);

	return ++Args;
}

static char **
ReadFloat(INP char ** Args, OUTP float *Val) {
	if (NULL == *Args) {
		Error(*Args);
	}

	if ((**Args != '-') && (**Args != '.')
			&& ((**Args > '9') || (**Args < '0'))) {
		Error(*Args);
	}

	*Val = atof(*Args);

	return ++Args;
}

static char **
ReadString(INP char **Args, OUTP char **Val) {
	if (NULL == *Args) {
		Error(*Args);
	}

	*Val = my_strdup(*Args);

	return ++Args;
}

static char **
ReadChar(INP char **Args, OUTP char *Val) {
    if (NULL == *Args) {
        Error(*Args);
    }

    *Val = (*Args)[0];

    return ++Args;
}

