#ifndef READOPTIONS_H
#define READOPTIONS_H

typedef struct s_options t_options;
struct s_options
{
	/* File names */
    char *ArchFile;
    char *CircuitName;
    char *NetFile;
    char *PlaceFile;
    char *RouteFile;
	char *BlifFile;
	char *OutFilePrefix;

	/* General options */
	int GraphPause;
	float constant_net_delay;
    boolean TimingAnalysis;
    
	/* Clustering options */
	boolean global_clocks;
	int cluster_size;
	int inputs_per_cluster;
	int lut_size;
	boolean hill_climbing_flag;
	boolean sweep_hanging_nets_and_inputs;
	boolean timing_driven;
	enum e_cluster_seed cluster_seed_type;
	float alpha;
	float beta;
	int recompute_timing_after;
	float block_delay;
	float intra_cluster_net_delay;
	float inter_cluster_net_delay;
	boolean skip_clustering;
	boolean allow_unrelated_clustering;
	boolean allow_early_exit;
	boolean connection_driven;
	enum e_packer_algorithm packer_algorithm;

	/* Placement options */
    enum e_place_algorithm PlaceAlgorithm;
    float PlaceInitT;
    float PlaceExitT;
    float PlaceAlphaT;
    float PlaceInnerNum;
    int Seed;
	float place_cost_exp;
    enum place_c_types PlaceCostType;
    int PlaceChanWidth;
    int PlaceNonlinearRegions;
    char *PinFile;
    boolean ShowPlaceTiming;
    int block_dist;

	/* Timing-driven placement options only */
	float PlaceTimingTradeoff;
	int RecomputeCritIter;
	int inner_loop_recompute_divider;
	float place_exp_first;
	float place_exp_last;
    
	/* Router Options */
	int max_router_iterations;
	int bb_factor;
	float initial_pres_fac;
	float pres_fac_mult;
	float acc_fac;
	float first_iter_pres_fac;
	float bend_cost;
    enum e_route_type RouteType;
	int RouteChanWidth;
    enum e_router_algorithm RouterAlgorithm;
	enum e_base_cost_type base_cost_type;

	/* Timing-driven router options only */
	float astar_fac;
	float criticality_exp;
	float max_criticality;
	
    int Count[OT_BASE_UNKNOWN];
};

void ReadOptions(INP int argc,
		 INP char **argv,
		 OUTP t_options * Options);

#endif

