#ifndef CLUSTER_LEGALITY_H
#define CLUSTER_LEGALITY_H

/* Legalizes routing for a cluster
 */
void alloc_and_load_cluster_legality_checker(void);

void alloc_and_load_legalizer_for_cluster(INP t_block* clb, INP int clb_index, INP const t_arch *arch);

void free_legalizer_for_cluster(INP t_block* clb, boolean free_local_rr_graph);

void free_cluster_legality_checker(void);

void reset_legalizer_for_cluster(t_block *clb);

/* order of use: 1. save cluster 2. Add blocks.  3. route 4. save if successful, undo if not successful */
void save_and_reset_routing_cluster(void);
void setup_intracluster_routing_for_molecule(INP t_pack_molecule *molecule, INOUTP t_pb_graph_node **primitives_list);
boolean try_breadth_first_route_cluster(void);
void restore_routing_cluster(void);
void save_cluster_solution(void);

boolean is_pin_open(int i);

void set_pb_graph_mode(t_pb_graph_node *pb_graph_node, int mode, int isOn);

void alloc_and_load_rr_graph_for_pb_graph_node(INP t_pb_graph_node *pb_graph_node, INP const t_arch* arch, int mode);


/* Power user options */
void reload_ext_net_rr_terminal_cluster(void);
void force_post_place_route_cb_input_pins(int iblock);
void setup_intracluster_routing_for_logical_block(INP int iblock,
		INP t_pb_graph_node *primitive);

#endif