#include <cstring>
#include <climits>
#include <cmath>
#include <set>
#include <time.h>
using namespace std;

#include "vtr_assert.h"
#include "vtr_log.h"

#include "vpr_types.h"
#include "vpr_error.h"

#include "globals.h"
#include "atom_netlist.h"
#include "path_delay.h"
#include "path_delay2.h"
#include "net_delay.h"
#include "vpr_utils.h"
#include "read_xml_arch_file.h"
#include "echo_files.h"
#include "read_sdc.h"
#include "stats.h"

/**************************** Top-level summary ******************************

Timing analysis by Vaughn Betz, Jason Luu, and Michael Wainberg.

Timing analysis is a three-step process:
1. Interpret the constraints specified by the user in an SDC (Synopsys Design
Constraints) file or, if none is specified, use default constraints.
2. Convert the pre- or post-packed netlist (depending on the stage of the 
flow) into a timing graph, where nodes represent pins and edges represent 
dependencies and delays between pins (see "Timing graph structure", below).
3. Traverse the timing graph to obtain information about which connections 
to optimize, as well as statistics for the user.

Steps 1 and 2 are performed through one of two helper functions:
alloc_and_load_timing_graph and alloc_and_load_pre_packing_timing_graph.
The first step is to create the timing graph, which is stored in the array 
timing_ctx.tnodes ("timing node").  This is done through alloc_and_load_tnodes (post-
packed) or alloc_and_load_tnodes_from_prepacked_netlist. Then, the timing 
graph is topologically sorted ("levelized") in 
alloc_and_load_timing_graph_levels, to allow for faster traversals later.

read_sdc reads the SDC file, interprets its contents and stores them in 
the data structure timing_ctx.sdc.  (This data structure does not need to remain 
global but it is probably easier, since its information is used in both
netlists and only needs to be read in once.)

load_clock_domain_and_clock_and_io_delay then gives each flip-flop and I/O
the index of a constrained clock from the SDC file in timing_ctx.sdc->constrained_
clocks, or -1 if an I/O is unconstrained.

process_constraints does a pre-traversal through the timing graph and prunes 
all constraints between domains that never intersect so they are not analysed.

Step 3 is performed through do_timing_analysis.  For each constraint between 
a pair of clock domains we do a forward traversal from the "source" domain
to the "sink" domain to compute each tnode's arrival time, the time when the 
latest signal would arrive at the node.  We also do a backward traversal to 
compute required time, the time when the earliest signal has to leave the 
node to meet the constraint.  The "slack" of each sink pin on each net is 
basically the difference between the two times. 

If path counting is on, we calculate a forward and backward path weight in 
do_path_counting.  These represent the importance of paths fanning, 
respectively, into and out of this pin, in such a way that paths with a 
higher slack are discounted exponentially in importance.

If path counting is off and we are using the pre-packed netlist, we also 
calculate normalized costs for the clusterer (normalized arrival time, slack 
and number of critical paths) in normalized_costs. The clusterer uses these 
to calculate a criticality for each block.

Finally, in update_slacks, we calculate the slack for each sink pin on each net
for printing, as well as a derived metric, timing criticality, which the 
optimizers actually use. If path counting is on, we calculate a path criticality
from the forward and backward weights on each tnode. */

/************************* Timing graph structure ****************************

Author:  V. Betz

We can build timing graphs that match either the primitive (atom_ctx.nlist) 
netlist (of basic elements before clustering, like FFs and LUTs) or that 
match the clustered netlist (block).  You pass in the is_pre_packed flag to 
say which kind of netlist and timing graph you are working with.
                                                                                                                                           
Every used (not OPEN) block pin becomes a timing node, both on primitive
blocks and (if you are building the timing graph that matches a clustered 
netlist) on clustered blocks.  For the clustered (not pre_packed) timing
graph, every used pin within a clustered (pb_type) block also becomes a timing
node.  So a CLB that contains ALMs that contains LUTs will have nodes created 
for the CLB pins, ALM pins and LUT pins, with edges that connect them as 
specified in the clustered netlist.  Unused (OPEN) pins don't create any 
timing nodes. 

The primitive blocks have edges from the tnodes that represent input pins and
output pins that represent the timing dependencies within these lowest level 
blocks (e.g. LUTs and FFs and IOs).  The exact edges created come from reading
the architecture file.  A LUT for example will have delays specified from all
its inputs to its output, and hence we will create a tedge from each tnode 
corresponding to an input pin of the LUT to the tnode that represents the LUT
output pin.  The delay marked on each edge is read from the architecture file.

A FF has nodes representing its pins, but also two extra nodes, representing 
the TN_FF_SINK and TN_FF_SOURCE.  Those two nodes represent the internal storage 
node of the FF.  The TN_FF_SINK has edges going to it from the regular FF inputs
(but not the clock input), with appropriate delays.  It has no outgoing edges,
since it terminates timing paths. The TN_FF_SOURCE has an edge going from it to
the FF output pin, with the appropriate delay.  TN_FF_SOURCES have no edges; they
start timing paths.  FF clock pins have no outgoing edges, but the delay to 
them can be looked up, and is used in the timing traversals to compute clock 
delay for slack computations. 

In the timing graph I create, input pads and constant generators have no   
inputs (incoming edges), just like TN_FF_SOURCES.  Every input pad and output 
pad is represented by two tnodes -- an input pin/source and an output pin/
sink.  For an input pad the input source comes from off chip and has no fanin, 
while the output pin drives signals within the chip.  For output pads, the 
input pin is driven by signal (net) within the chip, and the output sink node 
goes off chip and has no fanout (out-edges).  I need two nodes to respresent 
things like pads because I mark all delay on tedges, not on tnodes.                         
                                                                          
One other subblock that needs special attention is a constant generator.   
This has no used inputs, but its output is used.  I create an extra tnode, 
a dummy input, in addition to the output pin tnode.  The dummy tnode has   
no fanin.  Since constant generators really generate their outputs at T =  
-infinity, I set the delay from the input tnode to the output to a large-  
magnitude negative number.  This guarantees every block that needs the     
output of a constant generator sees it available very early.               
                                                                           
The main structure of the timing graph is given by the nodes and the edges 
that connect them.  We also store some extra information on tnodes that
(1) lets us figure out how to map from a tnode back to the netlist pin (or 
other item) it represents and (2) figure out what clock domain it is on, if 
it is a timing path start point (no incoming edges) or end point (no outgoing
edges) and (3) lets us figure out the delay of the clock to that node, if it 
is a timing path start or end point.

To map efficiently from tedges back to the netlist pins, we create the tedge 
array driven by a tnode the represents a netlist output pin *in the same order 
as the netlist net pins*.  That means the edge index for the tedge array from 
such a tnode guarantees iedge = net_pin_index  1.  The code to map slacks 
from the timing graph back to the netlist relies on this. */

/******************** Variables local to this module ************************/

#define NUM_BUCKETS 5 /* Used when printing slack and criticality. */

/* Variables for "chunking" the tedge memory.  If the head pointer in tedge_ch is NULL, *
 * no timing graph exists now.															*/

static vtr::t_chunk tedge_ch;

static vector<size_t> f_num_timing_net_pins;

static t_timing_stats * f_timing_stats = nullptr; /* Critical path delay and worst-case slack per constraint. */

static int * f_net_to_driver_tnode; 
/* [0..net.size() - 1]. Gives the index of the tnode that drives each net. 
Used for both pre- and post-packed netlists. If you just want the number
of edges on the driver tnode, use:
	num_edges = timing_nets[inet].num_sinks;
instead of the equivalent but more convoluted:
	driver_tnode = f_net_to_driver_tnode[inet];
	num_edges = timing_ctx.tnodes[driver_tnode].num_edges;
Only use this array if you want the actual edges themselves or the index 
of the driver tnode. */

/***************** Subroutines local to this module *************************/

static t_slack * alloc_slacks();

static void update_slacks(t_slack * slacks, float criticality_denom,
    bool update_slack, bool is_final_analysis, float smallest_slack_in_design, const t_timing_inf &timing_inf);

static void alloc_and_load_tnodes(const t_timing_inf &timing_inf);

static void alloc_and_load_tnodes_from_prepacked_netlist(float inter_cluster_net_delay,
        const std::unordered_map<AtomBlockId,t_pb_graph_node*>& expected_lowest_cost_pb_gnode);

static void mark_max_block_delay(const std::unordered_map<AtomBlockId,t_pb_graph_node*>& expected_lowest_cost_pb_gnode);

static void alloc_timing_stats();

static float do_timing_analysis_for_constraint(int source_clock_domain, int sink_clock_domain, 
	bool is_prepacked, bool is_final_analysis, long * max_critical_input_paths_ptr, 
    long * max_critical_output_paths_ptr, vtr::vector_map<ClusterBlockId, t_pb **> &pin_id_to_pb_mapping, const t_timing_inf &timing_inf);

#ifdef PATH_COUNTING
static void do_path_counting(float criticality_denom);
#endif

static float find_least_slack(bool is_prepacked, vtr::vector_map<ClusterBlockId, t_pb **> &pin_id_to_pb_mapping);

static void load_tnode(t_pb_graph_pin *pb_graph_pin, const ClusterBlockId iblock,
		int *inode);

#ifndef PATH_COUNTING
static void update_normalized_costs(float T_arr_max_this_domain, long max_critical_input_paths,
    long max_critical_output_paths, const t_timing_inf &timing_inf);
#endif

//static void print_primitive_as_blif(FILE *fpout, int iblk, int **lookup_tnode_from_pin_id);

static void load_clock_domain_and_clock_and_io_delay(bool is_prepacked, vtr::vector_map<ClusterBlockId, std::vector<int>> &lookup_tnode_from_pin_id, vtr::vector_map<ClusterBlockId, t_pb **> &pin_id_to_pb_mapping);

static const char * find_tnode_net_name(int inode, bool is_prepacked, vtr::vector_map<ClusterBlockId, t_pb **> &pin_id_to_pb_mapping);

static t_tnode * find_ff_clock_tnode(int inode, bool is_prepacked, vtr::vector_map<ClusterBlockId, std::vector<int>> &lookup_tnode_from_pin_id);

static inline bool has_valid_T_arr(int inode);

static inline bool has_valid_T_req(int inode);

static int find_clock(const char * net_name);

static int find_input(const char * net_name);

static int find_output(const char * net_name);

static int find_cf_constraint(const char * source_clock_name, const char * sink_ff_name);

static void propagate_clock_domain_and_skew(int inode);

static void process_constraints();

static void print_global_criticality_stats(FILE * fp, float ** criticality, const char * singular_name, const char * capitalized_plural_name);

static void print_timing_constraint_info(const char *fname);

static void print_spaces(FILE * fp, int num_spaces);

//The following functions handle counting of net pins for both
//the atom and clb netlist.
//TODO: remove - these are temporarily in use until re-unify the timing graph to be directly driven by the atom netlist only
static std::vector<size_t> init_timing_net_pins();
static std::vector<size_t> init_atom_timing_net_pins();
size_t num_timing_nets();
size_t num_timing_net_pins(int inet);
size_t num_timing_net_sinks(int inet);

/********************* Subroutine definitions *******************************/

t_slack * alloc_and_load_timing_graph(t_timing_inf timing_inf) {

	/* This routine builds the graph used for timing analysis.  Every cb pin is a 
	 * timing node (tnode).  The connectivity between pins is					*
	 * represented by timing edges (tedges).  All delay is marked on edges, not *
	 * on nodes.  Returns two arrays that will store slack values:				*
	 * slack and criticality ([0..net.size()-1][1..num_pins]).           */

	/*  For pads, only the first two pin locations are used (input to pad is first,
	 * output of pad is second).  For CLBs, all OPEN pins on the cb have their 
	 * mapping set to OPEN so I won't use it by mistake.                          */

	t_slack * slacks = nullptr;
	bool do_process_constraints = false;
	vtr::vector_map<ClusterBlockId, std::vector<int>> lookup_tnode_from_pin_id;
	vtr::vector_map<ClusterBlockId, t_pb **> pin_id_to_pb_mapping = alloc_and_load_pin_id_to_pb_mapping();
	
	if (tedge_ch.chunk_ptr_head != nullptr) {
		vpr_throw(VPR_ERROR_TIMING, __FILE__, __LINE__, 
				"in alloc_and_load_timing_graph: An old timing graph still exists.\n");
	}

    f_num_timing_net_pins = init_timing_net_pins();

	alloc_and_load_tnodes(timing_inf);

    detect_and_fix_timing_graph_combinational_loops();

	alloc_and_load_timing_graph_levels();

	check_timing_graph();

	slacks = alloc_slacks();

    auto& timing_ctx = g_vpr_ctx.timing();

	if (timing_ctx.sdc == nullptr) {
		/* the SDC timing constraints only need to be read in once; *
		 * if they haven't been already, do it now				    */
		read_sdc(timing_inf);
		do_process_constraints = true;
	}

	lookup_tnode_from_pin_id = alloc_and_load_tnode_lookup_from_pin_id();
		
	load_clock_domain_and_clock_and_io_delay(false, lookup_tnode_from_pin_id, pin_id_to_pb_mapping);

	if (do_process_constraints) 
		process_constraints();
	
	if (f_timing_stats == nullptr)
		alloc_timing_stats();

	free_tnode_lookup_from_pin_id(lookup_tnode_from_pin_id);
	free_pin_id_to_pb_mapping(pin_id_to_pb_mapping);

	return slacks;
}

t_slack * alloc_and_load_pre_packing_timing_graph(float inter_cluster_net_delay, t_timing_inf timing_inf,
        const std::unordered_map<AtomBlockId,t_pb_graph_node*>& expected_lowest_cost_pb_gnode) {

	/* This routine builds the graph used for timing analysis.  Every technology-
	 * mapped netlist pin is a timing node (tnode).  The connectivity between pins is *
	 * represented by timing edges (tedges).  All delay is marked on edges, not *
	 * on nodes.  Returns two arrays that will store slack values:				 *
	 * slack and criticality ([0..net.size()-1][1..num_pins]).           */

	/*  For pads, only the first two pin locations are used (input to pad is first,
	 * output of pad is second).  For CLBs, all OPEN pins on the cb have their 
	 * mapping set to OPEN so I won't use it by mistake.                          */
	
	t_slack * slacks = nullptr;
	bool do_process_constraints = false;
	vtr::vector_map<ClusterBlockId, std::vector<int>> lookup_tnode_from_pin_id;
	vtr::vector_map<ClusterBlockId, t_pb **> pin_id_to_pb_mapping = alloc_and_load_pin_id_to_pb_mapping();
	
	if (tedge_ch.chunk_ptr_head != nullptr) {
		vpr_throw(VPR_ERROR_TIMING,__FILE__, __LINE__, 
				"in alloc_and_load_timing_graph: An old timing graph still exists.\n");
	}

	lookup_tnode_from_pin_id = alloc_and_load_tnode_lookup_from_pin_id();

    f_num_timing_net_pins = init_atom_timing_net_pins();

	alloc_and_load_tnodes_from_prepacked_netlist(inter_cluster_net_delay, expected_lowest_cost_pb_gnode);

    mark_max_block_delay(expected_lowest_cost_pb_gnode);

    detect_and_fix_timing_graph_combinational_loops();

	alloc_and_load_timing_graph_levels();

	slacks = alloc_slacks();

	check_timing_graph();

    auto& timing_ctx = g_vpr_ctx.timing();

	if (timing_ctx.sdc == nullptr) {
		/* the SDC timing constraints only need to be read in once; *
		 * if they haven't been already, do it now				    */
		read_sdc(timing_inf);
		do_process_constraints = true;
	}
	
	load_clock_domain_and_clock_and_io_delay(true, lookup_tnode_from_pin_id, pin_id_to_pb_mapping);

	if (do_process_constraints) 
		process_constraints();
	
	if (f_timing_stats == nullptr)
		alloc_timing_stats();

	free_pin_id_to_pb_mapping(pin_id_to_pb_mapping);
	free_tnode_lookup_from_pin_id(lookup_tnode_from_pin_id);

	return slacks;
}

static t_slack * alloc_slacks() {

	/* Allocates the slack, criticality and path_criticality structures 
	([0..net.size()-1][1..num_pins-1]). Chunk allocated to save space. */

	t_slack * slacks = (t_slack *) vtr::malloc(sizeof(t_slack));
	
	slacks->slack   = (float **) vtr::malloc(num_timing_nets() * sizeof(float *));
	slacks->timing_criticality = (float **) vtr::malloc(num_timing_nets() * sizeof(float *));
#ifdef PATH_COUNTING
	slacks->path_criticality = (float **) vtr::malloc(num_timing_nets() * sizeof(float *));
#endif
	for (size_t inet = 0; inet < num_timing_nets(); inet++) {
		slacks->slack[inet]	  = (float *) vtr::chunk_malloc(num_timing_net_pins(inet) * sizeof(float), &tedge_ch);
		slacks->timing_criticality[inet] = (float *) vtr::chunk_malloc(num_timing_net_pins(inet) * sizeof(float), &tedge_ch);
#ifdef PATH_COUNTING
		slacks->path_criticality[inet] = (float *) vtr::chunk_malloc(num_timing_net_pins(inet) * sizeof(float), &tedge_ch);
#endif
	}

	return slacks;
}

void load_timing_graph_net_delays(vtr::vector_map<ClusterNetId, float *> &net_delay) {

	/* Sets the delays of the inter-CLB nets to the values specified by          *
	 * net_delay[0..net.size()-1][1..num_pins-1].  These net delays should have    *
	 * been allocated and loaded with the net_delay routines.  This routine      *
	 * marks the corresponding edges in the timing graph with the proper delay.  */

    clock_t begin = clock();

    VTR_ASSERT(net_delay.size());

	int inode;
	unsigned ipin;
	t_tedge *tedge;

    auto& timing_ctx = g_vpr_ctx.mutable_timing();

	for (size_t inet = 0; inet < num_timing_nets(); inet++) {
		inode = f_net_to_driver_tnode[inet];
		tedge = timing_ctx.tnodes[inode].out_edges;

		/* Note that the edges of a tnode corresponding to a CLB or INPAD opin must  *
		 * be in the same order as the pins of the net driven by the tnode.          */

		for (ipin = 1; ipin < num_timing_net_pins(inet); ipin++)
			tedge[ipin - 1].Tdel = net_delay[(ClusterNetId)inet][ipin];
	}

    clock_t end = clock();

    timing_ctx.stats.old_delay_annotation_wallclock_time  += double(end - begin) / CLOCKS_PER_SEC;
}

void free_timing_graph(t_slack * slacks) {

	int inode;

    auto& timing_ctx = g_vpr_ctx.mutable_timing();

	if (tedge_ch.chunk_ptr_head == nullptr) {
        vtr::printf_warning(__FILE__, __LINE__, "in free_timing_graph: No timing graph to free.\n");
	}

	free_chunk_memory(&tedge_ch);

	if (timing_ctx.tnodes != nullptr && timing_ctx.tnodes[0].prepacked_data) {
		/* If we allocated prepacked_data for the first node, 
		it must be allocated for all other nodes too. */
		for (inode = 0; inode < timing_ctx.num_tnodes; inode++) {
			free(timing_ctx.tnodes[inode].prepacked_data);
		}
	}
	free(timing_ctx.tnodes);
	free(f_net_to_driver_tnode);
	vtr::free_ivec_vector(timing_ctx.tnodes_at_level, 0, timing_ctx.num_tnode_levels - 1);

	free(slacks->slack);
	free(slacks->timing_criticality);
#ifdef PATH_COUNTING
	free(slacks->path_criticality);
#endif
	free(slacks);
	
	timing_ctx.tnodes = nullptr;
	timing_ctx.num_tnodes = 0;
	f_net_to_driver_tnode = nullptr;
	//timing_ctx.tnodes_at_level = NULL;
	timing_ctx.num_tnode_levels = 0;
	slacks = nullptr;
}

void free_timing_stats() {
	int i;
    auto& timing_ctx = g_vpr_ctx.timing();

	if(f_timing_stats != nullptr) {
		for (i = 0; i < timing_ctx.sdc->num_constrained_clocks; i++) {
			free(f_timing_stats->cpd[i]);
			free(f_timing_stats->least_slack[i]);
		}
		free(f_timing_stats->cpd);
		free(f_timing_stats->least_slack);
		free(f_timing_stats);
	}
	f_timing_stats = nullptr;
}

void print_slack(float ** slack, bool slack_is_normalized, const char *fname) {

	/* Prints slacks into a file. */

	int ibucket, driver_tnode, num_unused_slacks = 0;
	t_tedge * tedge;
	FILE *fp;
	float max_slack = HUGE_NEGATIVE_FLOAT, min_slack = HUGE_POSITIVE_FLOAT, 
		total_slack = 0, total_negative_slack = 0, bucket_size, slk;
	int slacks_in_bucket[NUM_BUCKETS]; 

    auto& timing_ctx = g_vpr_ctx.timing();

	fp = vtr::fopen(fname, "w");

	if (slack_is_normalized) {
		fprintf(fp, "The following slacks have been normalized to be non-negative by "
					"relaxing the required times to the maximum arrival time.\n\n");
	}

	/* Go through slack once to get the largest and smallest slack, both for reporting and 
	   so that we can delimit the buckets. Also calculate the total negative slack in the design. */
	for (size_t inet = 0; inet < num_timing_nets(); inet++) {
		size_t num_edges = num_timing_net_sinks(inet);
		for (size_t iedge = 0; iedge < num_edges; iedge++) { 
			slk = slack[inet][iedge + 1];
			if (slk < HUGE_POSITIVE_FLOAT - 1) { /* if slack was analysed */
				max_slack = max(max_slack, slk);
				min_slack = min(min_slack, slk);
				total_slack += slk;
				if (slk < NEGATIVE_EPSILON) { 
					total_negative_slack -= slk; /* By convention, we'll have total_negative_slack be a positive number. */
				}
			} else { /* slack was never analysed */
				num_unused_slacks++;
			}
		}
	}

	if (max_slack > HUGE_NEGATIVE_FLOAT + 1) {
		fprintf(fp, "Largest slack in design: %g\n", max_slack);
	} else {
		fprintf(fp, "Largest slack in design: --\n");
	}
	
	if (min_slack < HUGE_POSITIVE_FLOAT - 1) {
		fprintf(fp, "Smallest slack in design: %g\n", min_slack);
	} else {
		fprintf(fp, "Smallest slack in design: --\n");
	}

	fprintf(fp, "Total slack in design: %g\n", total_slack);
	fprintf(fp, "Total negative slack: %g\n", total_negative_slack);

	if (max_slack - min_slack > EPSILON) { /* Only sort the slacks into buckets if not all slacks are the same (if they are identical, no need to sort). */
		/* Initialize slacks_in_bucket, an array counting how many slacks are within certain linearly-spaced ranges (buckets). */
		for (ibucket = 0; ibucket < NUM_BUCKETS; ibucket++) {
			slacks_in_bucket[ibucket] = 0;
		}

		/* The size of each bucket is the range of slacks, divided by the number of buckets. */
		bucket_size = (max_slack - min_slack)/NUM_BUCKETS;

		/* Now, pass through again, incrementing the number of slacks in the nth bucket 
			for each slack between (min_slack + n*bucket_size) and (min_slack + (n+1)*bucket_size). */

		for (size_t inet = 0; inet < num_timing_nets(); inet++) {
			size_t num_edges = num_timing_net_sinks(inet);
			for (size_t iedge = 0; iedge < num_edges; iedge++) { 
				slk = slack[inet][iedge + 1];
				if (slk < HUGE_POSITIVE_FLOAT - 1) {
					/* We have to watch out for the special case where slack = max_slack, in which case ibucket = NUM_BUCKETS and we go out of bounds of the array. */
					ibucket = min(NUM_BUCKETS - 1, (int) ((slk - min_slack)/bucket_size));
					VTR_ASSERT(ibucket >= 0 && ibucket < NUM_BUCKETS);
					slacks_in_bucket[ibucket]++;
				}
			}
		}

		/* Now print how many slacks are in each bucket. */
		fprintf(fp, "\n\nRange\t\t");
		for (ibucket = 0; ibucket < NUM_BUCKETS; ibucket++) {
			fprintf(fp, "%.1e to ", min_slack);
			min_slack += bucket_size;
			fprintf(fp, "%.1e\t", min_slack);
		}
		fprintf(fp, "Not analysed");
		fprintf(fp, "\nSlacks in range\t\t");
		for (ibucket = 0; ibucket < NUM_BUCKETS; ibucket++) {
			fprintf(fp, "%d\t\t\t", slacks_in_bucket[ibucket]);
		}
		fprintf(fp, "%d", num_unused_slacks);
	}

	/* Finally, print all the slacks, organized by net. */
	fprintf(fp, "\n\nNet #\tDriver_tnode\tto_node\tSlack\n\n");

	for (size_t inet = 0; inet < num_timing_nets(); inet++) {
		driver_tnode = f_net_to_driver_tnode[inet];
		size_t num_edges = timing_ctx.tnodes[driver_tnode].num_edges;
		tedge = timing_ctx.tnodes[driver_tnode].out_edges;
		slk = slack[inet][1];
		if (slk < HUGE_POSITIVE_FLOAT - 1) {
			fprintf(fp, "%5zu\t%5d\t\t%5d\t%g\n", inet, driver_tnode, tedge[0].to_node, slk);
		} else { /* Slack is meaningless, so replace with --. */
			fprintf(fp, "%5zu\t%5d\t\t%5d\t--\n", inet, driver_tnode, tedge[0].to_node);
		}
		for (size_t iedge = 1; iedge < num_edges; iedge++) { /* newline and indent subsequent edges after the first */
			slk = slack[inet][iedge+1];
			if (slk < HUGE_POSITIVE_FLOAT - 1) {
				fprintf(fp, "\t\t\t%5d\t%g\n", tedge[iedge].to_node, slk);
			} else { /* Slack is meaningless, so replace with --. */
				fprintf(fp, "\t\t\t%5d\t--\n", tedge[iedge].to_node);
			}
		}
	}

	fclose(fp);
}

void print_criticality(t_slack * slacks, const char *fname) {

	/* Prints timing criticalities (and path criticalities if enabled) into a file. */

	int iedge, driver_tnode, num_edges;
	t_tedge * tedge;
	FILE *fp;

    auto& timing_ctx = g_vpr_ctx.timing();

	fp = vtr::fopen(fname, "w");

	print_global_criticality_stats(fp, slacks->timing_criticality, "timing criticality", "Timing criticalities");
#ifdef PATH_COUNTING
	print_global_criticality_stats(fp, slacks->path_criticality, "path criticality", "Path criticalities");
#endif

	/* Finally, print all the criticalities, organized by net. */
	fprintf(fp, "\n\nNet #\tDriver_tnode\t to_node\tTiming criticality"
#ifdef PATH_COUNTING
		"\tPath criticality"
#endif
		"\n");

	for (size_t inet = 0; inet < num_timing_nets(); inet++) {
		driver_tnode = f_net_to_driver_tnode[inet];
		num_edges = timing_ctx.tnodes[driver_tnode].num_edges;
		tedge = timing_ctx.tnodes[driver_tnode].out_edges;

		fprintf(fp, "\n%5zu\t%5d\t\t%5d\t\t%.6f", inet, driver_tnode, tedge[0].to_node, slacks->timing_criticality[inet][1]);
#ifdef PATH_COUNTING
		fprintf(fp, "\t\t%g", slacks->path_criticality[inet][1]);
#endif
		for (iedge = 1; iedge < num_edges; iedge++) { /* newline and indent subsequent edges after the first */
			fprintf(fp, "\n\t\t\t%5d\t\t%.6f", tedge[iedge].to_node, slacks->timing_criticality[inet][iedge+1]);
#ifdef PATH_COUNTING
			fprintf(fp, "\t\t%g", slacks->path_criticality[inet][iedge+1]);
#endif
		}
	}

	fclose(fp);
}

static void print_global_criticality_stats(FILE * fp, float ** criticality, const char * singular_name, const char * capitalized_plural_name) {
	
	/* Prints global stats for timing or path criticality to the file pointed to by	fp,
	including maximum criticality, minimum criticality, total criticality in the design,
	and the number of criticalities within various ranges, or buckets. */

	int iedge, num_edges, ibucket, criticalities_in_bucket[NUM_BUCKETS];
	float crit, max_criticality = HUGE_NEGATIVE_FLOAT, min_criticality = HUGE_POSITIVE_FLOAT, 
		total_criticality = 0, bucket_size;

	/* Go through criticality once to get the largest and smallest timing criticality, 
	both for reporting and so that we can delimit the buckets. */
	for (size_t inet = 0; inet < num_timing_nets(); inet++) {
		num_edges = num_timing_net_sinks(inet);
		for (iedge = 0; iedge < num_edges; iedge++) { 
			crit = criticality[inet][iedge + 1];
			max_criticality = max(max_criticality, crit);
			min_criticality = min(min_criticality, crit);
			total_criticality += crit;
		}
	}

	fprintf(fp, "Largest %s in design: %g\n", singular_name, max_criticality);
	fprintf(fp, "Smallest %s in design: %g\n", singular_name, min_criticality);
	fprintf(fp, "Total %s in design: %g\n", singular_name, total_criticality);

	if (max_criticality - min_criticality > EPSILON) { /* Only sort the criticalities into buckets if not all criticalities are the same (if they are identical, no need to sort). */
		/* Initialize criticalities_in_bucket, an array counting how many criticalities are within certain linearly-spaced ranges (buckets). */
		for (ibucket = 0; ibucket < NUM_BUCKETS; ibucket++) {
			criticalities_in_bucket[ibucket] = 0;
		}

		/* The size of each bucket is the range of criticalities, divided by the number of buckets. */
		bucket_size = (max_criticality - min_criticality)/NUM_BUCKETS;

		/* Now, pass through again, incrementing the number of criticalities in the nth bucket 
			for each criticality between (min_criticality + n*bucket_size) and (min_criticality + (n+1)*bucket_size). */

		for (size_t inet = 0; inet < num_timing_nets(); inet++) {
			num_edges = num_timing_net_sinks(inet);
			for (iedge = 0; iedge < num_edges; iedge++) { 
				crit = criticality[inet][iedge + 1];
				/* We have to watch out for the special case where criticality = max_criticality, in which case ibucket = NUM_BUCKETS and we go out of bounds of the array. */
				ibucket = min(NUM_BUCKETS - 1, (int) ((crit - min_criticality)/bucket_size));
				VTR_ASSERT(ibucket >= 0 && ibucket < NUM_BUCKETS);
				criticalities_in_bucket[ibucket]++;
			}
		}

		/* Now print how many criticalities are in each bucket. */
		fprintf(fp, "\nRange\t\t");
		for (ibucket = 0; ibucket < NUM_BUCKETS; ibucket++) {
			fprintf(fp, "%.1e to ", min_criticality);
			min_criticality += bucket_size;
			fprintf(fp, "%.1e\t", min_criticality);
		}
		fprintf(fp, "\n%s in range\t\t", capitalized_plural_name);
		for (ibucket = 0; ibucket < NUM_BUCKETS; ibucket++) {
			fprintf(fp, "%d\t\t\t", criticalities_in_bucket[ibucket]);
		}
	}
	fprintf(fp, "\n\n");
}

void print_net_delay(vtr::vector_map<ClusterNetId, float *> &net_delay, const char *fname) {

	/* Prints the net delays into a file. */

	int iedge, driver_tnode, num_edges;
	t_tedge * tedge;
	FILE *fp;

    auto& timing_ctx = g_vpr_ctx.timing();

	fp = vtr::fopen(fname, "w");

	fprintf(fp, "Net #\tDriver_tnode\tto_node\tDelay\n\n");

	for (size_t inet = 0; inet < num_timing_nets(); inet++) {
		driver_tnode = f_net_to_driver_tnode[inet];
		num_edges = timing_ctx.tnodes[driver_tnode].num_edges;
		tedge = timing_ctx.tnodes[driver_tnode].out_edges;
		fprintf(fp, "%5zu\t%5d\t\t%5d\t%g\n", inet, driver_tnode, tedge[0].to_node, net_delay[(ClusterNetId)inet][1]);
		for (iedge = 1; iedge < num_edges; iedge++) { /* newline and indent subsequent edges after the first */
			fprintf(fp, "\t\t\t%5d\t%g\n", tedge[iedge].to_node, net_delay[(ClusterNetId)inet][iedge+1]);
		}
	}

	fclose(fp);
}

#ifndef PATH_COUNTING
void print_clustering_timing_info(const char *fname) {
	/* Print information from tnodes which is used by the clusterer. */
	int inode;
	FILE *fp;

    auto& timing_ctx = g_vpr_ctx.timing();

	fp = vtr::fopen(fname, "w");

	fprintf(fp, "inode  ");
	if (timing_ctx.sdc->num_constrained_clocks <= 1) {
		/* These values are from the last constraint analysed, 
		so they're not meaningful unless there was only one constraint. */
		fprintf(fp, "Critical input paths  Critical output paths  ");
	}
	fprintf(fp, "Normalized slack  Normalized Tarr  Normalized total crit paths\n");
	for (inode = 0; inode < timing_ctx.num_tnodes; inode++) {
		fprintf(fp, "%d\t", inode);
		/* Only print normalized values for tnodes which have valid normalized values. (If normalized_T_arr is valid, the others will be too.) */
		if (has_valid_normalized_T_arr(inode)) {
			if (timing_ctx.sdc->num_constrained_clocks <= 1) {
				fprintf(fp, "%ld\t\t\t%ld\t\t\t", timing_ctx.tnodes[inode].prepacked_data->num_critical_input_paths, timing_ctx.tnodes[inode].prepacked_data->num_critical_output_paths); 
			}
			fprintf(fp, "%f\t%f\t%f\n", timing_ctx.tnodes[inode].prepacked_data->normalized_slack, timing_ctx.tnodes[inode].prepacked_data->normalized_T_arr, timing_ctx.tnodes[inode].prepacked_data->normalized_total_critical_paths);
		} else {
			if (timing_ctx.sdc->num_constrained_clocks <= 1) {
				fprintf(fp, "--\t\t\t--\t\t\t"); 
			}
			fprintf(fp, "--\t\t--\t\t--\n");
		}
	}

	fclose(fp);
}
#endif
/* Count # of tnodes, allocates space, and loads the tnodes and its associated edges */
static void alloc_and_load_tnodes(const t_timing_inf &timing_inf) {
	int j, k;
	int inode, num_nodes_in_block;
	int count, i_pin_id;
	int dport, dpin, dnode;
	ClusterBlockId iblock, dblock;
	ClusterNetId net_id;
	int normalized_pin, normalization;
	t_pb_graph_pin *ipb_graph_pin;
	t_pb_route *intra_lb_route, *d_intra_lb_route;
	int num_dangling_pins;
	t_pb_graph_pin*** intra_lb_pb_pin_lookup; 
	vtr::vector_map<ClusterBlockId, std::vector<int>> lookup_tnode_from_pin_id;

    auto& device_ctx = g_vpr_ctx.mutable_device();
    auto& cluster_ctx = g_vpr_ctx.clustering();
    auto& atom_ctx = g_vpr_ctx.atom();
    auto& timing_ctx = g_vpr_ctx.mutable_timing();

	f_net_to_driver_tnode = (int*)vtr::malloc(num_timing_nets() * sizeof(int));

	intra_lb_pb_pin_lookup = new t_pb_graph_pin**[device_ctx.num_block_types];
	for (int i = 0; i < device_ctx.num_block_types; i++) {
		intra_lb_pb_pin_lookup[i] = alloc_and_load_pb_graph_pin_lookup_from_index(&device_ctx.block_types[i]);
	}

	for (size_t i = 0; i < num_timing_nets(); i++) {
		f_net_to_driver_tnode[i] = OPEN;
	}

	/* allocate space for tnodes */
	timing_ctx.num_tnodes = 0;
	for (auto blk_id : cluster_ctx.clb_nlist.blocks()) {
		num_nodes_in_block = 0;
		int itype = cluster_ctx.clb_nlist.block_type(blk_id)->index;
		for (j = 0; j < cluster_ctx.clb_nlist.block_pb(blk_id)->pb_graph_node->total_pb_pins; j++) {
			if (cluster_ctx.clb_nlist.block_pb(blk_id)->pb_route[j].atom_net_id) {
				if (intra_lb_pb_pin_lookup[itype][j]->type == PB_PIN_INPAD
					|| intra_lb_pb_pin_lookup[itype][j]->type == PB_PIN_OUTPAD
					|| intra_lb_pb_pin_lookup[itype][j]->type == PB_PIN_SEQUENTIAL) {
					num_nodes_in_block += 2;
				} else {
					num_nodes_in_block++;
				}
			}
		}
		timing_ctx.num_tnodes += num_nodes_in_block;
	}
	timing_ctx.tnodes = (t_tnode*)vtr::calloc(timing_ctx.num_tnodes, sizeof(t_tnode));

	/* load tnodes with all info except edge info */
	/* populate tnode lookups for edge info */
	inode = 0;
	for (auto blk_id : cluster_ctx.clb_nlist.blocks()) {
		int itype = cluster_ctx.clb_nlist.block_type(blk_id)->index;
		for (j = 0; j < cluster_ctx.clb_nlist.block_pb(blk_id)->pb_graph_node->total_pb_pins; j++) {
			if (cluster_ctx.clb_nlist.block_pb(blk_id)->pb_route[j].atom_net_id) {
				VTR_ASSERT(timing_ctx.tnodes[inode].pb_graph_pin == nullptr);
				load_tnode(intra_lb_pb_pin_lookup[itype][j], blk_id, &inode);
			}
		}
	}
	VTR_ASSERT(inode == timing_ctx.num_tnodes);
	num_dangling_pins = 0;

	lookup_tnode_from_pin_id = alloc_and_load_tnode_lookup_from_pin_id();


	/* load edge delays and initialize clock domains to OPEN 
	and prepacked_data (which is not used post-packing) to NULL. */
    std::set<int> const_gen_tnodes;
	for (int i = 0; i < timing_ctx.num_tnodes; i++) {
		timing_ctx.tnodes[i].clock_domain = OPEN;
		timing_ctx.tnodes[i].prepacked_data = nullptr;

		/* 3 primary scenarios for edge delays
		 1.  Point-to-point delays inside block
		 2.  
		 */
		count = 0;
		iblock = timing_ctx.tnodes[i].block;
		int itype = cluster_ctx.clb_nlist.block_type(iblock)->index;
		switch (timing_ctx.tnodes[i].type) {
		case TN_INPAD_OPIN:
		case TN_INTERMEDIATE_NODE:
		case TN_PRIMITIVE_OPIN:
		case TN_FF_OPIN:
		case TN_CLOCK_OPIN:
		case TN_CB_IPIN:
			/* fanout is determined by intra-cluster connections */
			/* Allocate space for edges  */
			i_pin_id = timing_ctx.tnodes[i].pb_graph_pin->pin_count_in_cluster;
			intra_lb_route = cluster_ctx.clb_nlist.block_pb(iblock)->pb_route;
			ipb_graph_pin = intra_lb_pb_pin_lookup[itype][i_pin_id];

			if (ipb_graph_pin->parent_node->pb_type->max_internal_delay
					!= UNDEFINED) {
				if (device_ctx.pb_max_internal_delay == UNDEFINED) {
					device_ctx.pb_max_internal_delay = ipb_graph_pin->parent_node->pb_type->max_internal_delay;
					device_ctx.pbtype_max_internal_delay = ipb_graph_pin->parent_node->pb_type;
				} else if (device_ctx.pb_max_internal_delay < ipb_graph_pin->parent_node->pb_type->max_internal_delay) {
					device_ctx.pb_max_internal_delay = ipb_graph_pin->parent_node->pb_type->max_internal_delay;
					device_ctx.pbtype_max_internal_delay = ipb_graph_pin->parent_node->pb_type;
				}
			}

			for (j = 0; j < ipb_graph_pin->num_output_edges; j++) {
				VTR_ASSERT(ipb_graph_pin->output_edges[j]->num_output_pins == 1);
				dnode = ipb_graph_pin->output_edges[j]->output_pins[0]->pin_count_in_cluster;
				if (intra_lb_route[dnode].driver_pb_pin_id == i_pin_id) {
					count++;
				}
			}
			VTR_ASSERT(count >= 0);
			timing_ctx.tnodes[i].num_edges = count;
			timing_ctx.tnodes[i].out_edges = (t_tedge *) vtr::chunk_malloc(
					count * sizeof(t_tedge), &tedge_ch);

			/* Load edges */
			count = 0;
			for (j = 0; j < ipb_graph_pin->num_output_edges; j++) {
				VTR_ASSERT(ipb_graph_pin->output_edges[j]->num_output_pins == 1);
				dnode = ipb_graph_pin->output_edges[j]->output_pins[0]->pin_count_in_cluster;
				if (intra_lb_route[dnode].driver_pb_pin_id == i_pin_id) {
					VTR_ASSERT(intra_lb_route[dnode].atom_net_id == intra_lb_route[i_pin_id].atom_net_id);

					timing_ctx.tnodes[i].out_edges[count].Tdel = ipb_graph_pin->output_edges[j]->delay_max;
					timing_ctx.tnodes[i].out_edges[count].to_node = lookup_tnode_from_pin_id[iblock][dnode];
					VTR_ASSERT(timing_ctx.tnodes[i].out_edges[count].to_node != OPEN);

                    AtomNetId atom_net_id = intra_lb_route[i_pin_id].atom_net_id;
					if (atom_ctx.nlist.net_is_constant(atom_net_id) && timing_ctx.tnodes[i].type == TN_PRIMITIVE_OPIN) {
						timing_ctx.tnodes[i].out_edges[count].Tdel = HUGE_NEGATIVE_FLOAT;
						timing_ctx.tnodes[i].type = TN_CONSTANT_GEN_SOURCE;
                        const_gen_tnodes.insert(i);
					}

					count++;
				}
			}
			VTR_ASSERT(count >= 0);

			break;
		case TN_PRIMITIVE_IPIN:
			/* Pin info comes from pb_graph block delays
			 */
			/*there would be no slack information if timing analysis is off*/
			if (timing_inf.timing_analysis_enabled)
			{
				i_pin_id = timing_ctx.tnodes[i].pb_graph_pin->pin_count_in_cluster;
				intra_lb_route = cluster_ctx.clb_nlist.block_pb(iblock)->pb_route;
				ipb_graph_pin = intra_lb_pb_pin_lookup[itype][i_pin_id];
				timing_ctx.tnodes[i].num_edges = ipb_graph_pin->num_pin_timing;
				timing_ctx.tnodes[i].out_edges = (t_tedge *) vtr::chunk_malloc(
						ipb_graph_pin->num_pin_timing * sizeof(t_tedge),
						&tedge_ch);
				k = 0;

				for (j = 0; j < timing_ctx.tnodes[i].num_edges; j++) {
					/* Some outpins aren't used, ignore these.  Only consider output pins that are used */
                    int cluster_pin_idx = ipb_graph_pin->pin_timing[j]->pin_count_in_cluster;
					if (intra_lb_route[cluster_pin_idx].atom_net_id) {
						timing_ctx.tnodes[i].out_edges[k].Tdel = ipb_graph_pin->pin_timing_del_max[j];
						timing_ctx.tnodes[i].out_edges[k].to_node = lookup_tnode_from_pin_id[timing_ctx.tnodes[i].block][ipb_graph_pin->pin_timing[j]->pin_count_in_cluster];
						VTR_ASSERT(timing_ctx.tnodes[i].out_edges[k].to_node != OPEN);
						k++;
					}
				}
				timing_ctx.tnodes[i].num_edges -= (j - k); /* remove unused edges */
				if (timing_ctx.tnodes[i].num_edges == 0) {
					/* Dangling pin */
					num_dangling_pins++;
				}
			}
			break;
		case TN_CB_OPIN:
			/* load up net info */
			i_pin_id = timing_ctx.tnodes[i].pb_graph_pin->pin_count_in_cluster;
			intra_lb_route = cluster_ctx.clb_nlist.block_pb(iblock)->pb_route;
			ipb_graph_pin = intra_lb_pb_pin_lookup[itype][i_pin_id];

			VTR_ASSERT(intra_lb_route[i_pin_id].atom_net_id);
			net_id = atom_ctx.lookup.clb_net(intra_lb_route[i_pin_id].atom_net_id);
			VTR_ASSERT(net_id != ClusterNetId::INVALID());
			f_net_to_driver_tnode[(size_t)net_id] = i;
			timing_ctx.tnodes[i].num_edges = cluster_ctx.clb_nlist.net_sinks(net_id).size();
			timing_ctx.tnodes[i].out_edges = (t_tedge *) vtr::chunk_malloc(
					timing_ctx.tnodes[i].num_edges * sizeof(t_tedge),
					&tedge_ch);
			for (j = 1; j < (int)cluster_ctx.clb_nlist.net_pins(net_id).size(); j++) {
				dblock = cluster_ctx.clb_nlist.net_pin_block(net_id, j);
				normalization = cluster_ctx.clb_nlist.block_type(dblock)->num_pins
						/ cluster_ctx.clb_nlist.block_type(dblock)->capacity;
				normalized_pin = cluster_ctx.clb_nlist.net_pin_physical_index(net_id, j) % normalization;
				d_intra_lb_route = cluster_ctx.clb_nlist.block_pb(dblock)->pb_route;
				dpin = OPEN;
				dport = OPEN;
				count = 0;

				for (k = 0; k < cluster_ctx.clb_nlist.block_pb(dblock)->pb_graph_node->num_input_ports && dpin == OPEN; k++) {
					if (normalized_pin >= count 
                        && (count + cluster_ctx.clb_nlist.block_pb(dblock)->pb_graph_node->num_input_pins[k] > normalized_pin)) {
						dpin = normalized_pin - count;
						dport = k;
						break;
					}
					count += cluster_ctx.clb_nlist.block_pb(dblock)->pb_graph_node->num_input_pins[k];
				}
				if (dpin == OPEN) {
					for (k = 0; k < cluster_ctx.clb_nlist.block_pb(dblock)->pb_graph_node->num_output_ports && dpin == OPEN; k++) {
						count += cluster_ctx.clb_nlist.block_pb(dblock)->pb_graph_node->num_output_pins[k];
					}
					for (k = 0; k < cluster_ctx.clb_nlist.block_pb(dblock)->pb_graph_node->num_clock_ports && dpin == OPEN; k++) {
						if (normalized_pin >= count 
                            && (count + cluster_ctx.clb_nlist.block_pb(dblock)->pb_graph_node->num_clock_pins[k] > normalized_pin)) {
							dpin = normalized_pin - count;
							dport = k;
						}
						count += cluster_ctx.clb_nlist.block_pb(dblock)->pb_graph_node->num_clock_pins[k];
					}
					VTR_ASSERT(dpin != OPEN);

                    t_pb_graph_node* pb_gnode = cluster_ctx.clb_nlist.block_pb(dblock)->pb_graph_node;
                    int pin_count_in_cluster = pb_gnode->clock_pins[dport][dpin].pin_count_in_cluster;
					ClusterNetId net_id_check = atom_ctx.lookup.clb_net(d_intra_lb_route[pin_count_in_cluster].atom_net_id);
					VTR_ASSERT(net_id == net_id_check);

					timing_ctx.tnodes[i].out_edges[j - 1].to_node = lookup_tnode_from_pin_id[dblock][pin_count_in_cluster];
					VTR_ASSERT(timing_ctx.tnodes[i].out_edges[j - 1].to_node != OPEN);
				} else {
					VTR_ASSERT(dpin != OPEN);

                    t_pb_graph_node* pb_gnode = cluster_ctx.clb_nlist.block_pb(dblock)->pb_graph_node;
                    int pin_count_in_cluster = pb_gnode->input_pins[dport][dpin].pin_count_in_cluster;
					ClusterNetId net_id_check = atom_ctx.lookup.clb_net(d_intra_lb_route[pin_count_in_cluster].atom_net_id);
					VTR_ASSERT(net_id == net_id_check);

					/* delays are assigned post routing */
					timing_ctx.tnodes[i].out_edges[j - 1].to_node = lookup_tnode_from_pin_id[dblock][pin_count_in_cluster];
					VTR_ASSERT(timing_ctx.tnodes[i].out_edges[j - 1].to_node != OPEN);
				}
				timing_ctx.tnodes[i].out_edges[j - 1].Tdel = 0;
				VTR_ASSERT(net_id != ClusterNetId::INVALID());
			}
			break;
		case TN_OUTPAD_IPIN:
		case TN_INPAD_SOURCE:
		case TN_OUTPAD_SINK:
		case TN_FF_SINK:
		case TN_FF_SOURCE:
		case TN_FF_IPIN:
		case TN_FF_CLOCK:
		case TN_CLOCK_SOURCE:
			break;
		default:
			vtr::printf_error(__FILE__, __LINE__, 
					"Consistency check failed: Unknown tnode type %d.\n", timing_ctx.tnodes[i].type);
			VTR_ASSERT(0);
			break;
		}
	}
	if(num_dangling_pins > 0) {
		vtr::printf_warning(__FILE__, __LINE__, 
				"Unconnected logic in design, number of dangling tnodes = %d\n", num_dangling_pins);
	}

    //In some instances, we may end-up with constant generators driving constant generators
    //(which is illegal in the timing graph since constant generators shouldn't have any input
    //edges). So we remove those edges now.
    int const_gen_edge_break_count = 0;
    for(inode = 0; inode < timing_ctx.num_tnodes; ++inode) {
        for(int iedge = 0; iedge <timing_ctx.tnodes[inode].num_edges; ++iedge) {
            int& to_node = timing_ctx.tnodes[inode].out_edges[iedge].to_node;
            if(const_gen_tnodes.count(to_node)) {
                //This edge points to a constant generator, mark it invalid 
                VTR_ASSERT(timing_ctx.tnodes[to_node].type == TN_CONSTANT_GEN_SOURCE);

                to_node = DO_NOT_ANALYSE;

                ++const_gen_edge_break_count;
            }
        }
    }
    vtr::printf_info("Disconnected %d redundant timing edges to constant generators\n", const_gen_edge_break_count);

	
	for (int i = 0; i < device_ctx.num_block_types; i++) {
		free_pb_graph_pin_lookup_from_index(intra_lb_pb_pin_lookup[i]);
	}
	free_tnode_lookup_from_pin_id(lookup_tnode_from_pin_id);
	delete[] intra_lb_pb_pin_lookup;
}

/* Allocate timing graph for pre packed netlist
 Count number of tnodes first
 Then connect up tnodes with edges
 */
static void alloc_and_load_tnodes_from_prepacked_netlist(float inter_cluster_net_delay,
        const std::unordered_map<AtomBlockId,t_pb_graph_node*>& expected_lowest_cost_pb_gnode) {
	t_pb_graph_pin *from_pb_graph_pin, *to_pb_graph_pin;

    auto& atom_ctx = g_vpr_ctx.mutable_atom();
    auto& timing_ctx = g_vpr_ctx.mutable_timing();

	/* Determine the number of tnode's */
	timing_ctx.num_tnodes = 0;
    for(AtomBlockId blk_id : atom_ctx.nlist.blocks()) {

		const t_model* model = atom_ctx.nlist.block_model(blk_id);
		if (atom_ctx.nlist.block_type(blk_id) == AtomBlockType::INPAD) {
            auto pins = atom_ctx.nlist.block_output_pins(blk_id);
            if(pins.size() == 1) {
                timing_ctx.num_tnodes += 2; //SOURCE and OPIN
            } else {
                VTR_ASSERT(pins.size() == 0); //Swept
            }
		} else if (atom_ctx.nlist.block_type(blk_id) == AtomBlockType::OUTPAD) {
            auto pins = atom_ctx.nlist.block_input_pins(blk_id);
            if(pins.size() == 1) {
                timing_ctx.num_tnodes += 2; //SINK and OPIN
            } else {
                VTR_ASSERT(pins.size() == 0); //Swept
            }
		} else {
            int incr;
			if (atom_ctx.nlist.block_is_combinational(blk_id)) {
				incr = 1; //Non-sequential so only an IPIN or OPIN node
			} else {
                VTR_ASSERT(atom_ctx.nlist.block_clock_pins(blk_id).size() > 0);
				incr = 2; //Sequential so both and IPIN/OPIN and a SOURCE/SINK nodes
			}
			int j = 0;
			const t_model_ports* model_port = model->inputs;
			while (model_port) {
                AtomPortId port_id = atom_ctx.nlist.find_atom_port(blk_id, model_port);
                if(port_id) {
                    if (model_port->is_clock == false) {
                        //Non-clock port, so add tnodes for each used input pin
                        for (int k = 0; k < model_port->size; k++) {
                            if(atom_ctx.nlist.port_pin(port_id, k)) {
                                timing_ctx.num_tnodes += incr;
                            }
                        }
                        j++;
                    } else {
                        //A clock port so only an FF_CLOCK node
                        VTR_ASSERT(model_port->is_clock);
                        timing_ctx.num_tnodes++; //TODO: consider multi-bit clock ports
                    }
                }
				model_port = model_port->next;
			}

			j = 0;
			model_port = model->outputs;
			while (model_port) {
                AtomPortId port_id = atom_ctx.nlist.find_atom_port(blk_id, model_port);
                if (port_id) {
                    //Add tnodes for each output pin
                    for (int k = 0; k < model_port->size; k++) {
                        if(atom_ctx.nlist.port_pin(port_id, k)) {
                            timing_ctx.num_tnodes += incr;
                        }
                    }
                    j++;
                }
				model_port = model_port->next;
			}
		}
	}

    /* Allocate the tnodes */
	timing_ctx.tnodes = (t_tnode *)vtr::calloc(timing_ctx.num_tnodes, sizeof(t_tnode));
	
	/* Allocate space for prepacked_data, which is only used pre-packing. */
    //TODO: get rid of prepacked_data
	for (int inode = 0; inode < timing_ctx.num_tnodes; inode++) {
		timing_ctx.tnodes[inode].prepacked_data = (t_prepacked_tnode_data *) vtr::malloc(sizeof(t_prepacked_tnode_data));
	}

	/* load tnodes, alloc edges for tnodes, load all known tnodes */
	int inode = 0;
    for(AtomBlockId blk_id : atom_ctx.nlist.blocks()) {

		const t_model* model = atom_ctx.nlist.block_model(blk_id);
		if (atom_ctx.nlist.block_type(blk_id) == AtomBlockType::INPAD) {
            //A primary input

            //Single output pin
            VTR_ASSERT(atom_ctx.nlist.block_input_pins(blk_id).empty());
            VTR_ASSERT(atom_ctx.nlist.block_clock_pins(blk_id).empty());
            auto pins = atom_ctx.nlist.block_output_pins(blk_id);
            if(pins.size() == 1) {
                auto pin_id = *pins.begin();

                //Look-ups
                atom_ctx.lookup.set_atom_pin_classic_tnode(pin_id, inode);

                //The OPIN
                timing_ctx.tnodes[inode].prepacked_data->model_pin = 0;
                timing_ctx.tnodes[inode].prepacked_data->model_port = 0;
                timing_ctx.tnodes[inode].prepacked_data->model_port_ptr = model->outputs;
                timing_ctx.tnodes[inode].block = ClusterBlockId::INVALID();
                timing_ctx.tnodes[inode].type = TN_INPAD_OPIN;

                auto net_id = atom_ctx.nlist.pin_net(pin_id);
                timing_ctx.tnodes[inode].num_edges = atom_ctx.nlist.net_sinks(net_id).size();
                timing_ctx.tnodes[inode].out_edges = (t_tedge *) vtr::chunk_malloc(
                        timing_ctx.tnodes[inode].num_edges * sizeof(t_tedge),
                        &tedge_ch);

                //The source
                timing_ctx.tnodes[inode + 1].type = TN_INPAD_SOURCE;
                timing_ctx.tnodes[inode + 1].block = ClusterBlockId::INVALID();
                timing_ctx.tnodes[inode + 1].num_edges = 1;
                timing_ctx.tnodes[inode + 1].out_edges = (t_tedge *) vtr::chunk_malloc( 1 * sizeof(t_tedge), &tedge_ch);
                timing_ctx.tnodes[inode + 1].out_edges->Tdel = 0;
                timing_ctx.tnodes[inode + 1].out_edges->to_node = inode;

                inode += 2;
            } else {
                VTR_ASSERT(pins.size() == 0); //Driven net was swept
            }
		} else if (atom_ctx.nlist.block_type(blk_id) == AtomBlockType::OUTPAD) {
            //A primary input

            //Single input pin
            VTR_ASSERT(atom_ctx.nlist.block_output_pins(blk_id).empty());
            VTR_ASSERT(atom_ctx.nlist.block_clock_pins(blk_id).empty());

            //Single pin
            auto pins = atom_ctx.nlist.block_input_pins(blk_id);
            if(pins.size() == 1) {
                auto pin_id = *pins.begin();

                //Look-ups
                atom_ctx.lookup.set_atom_pin_classic_tnode(pin_id, inode);

                //The IPIN
                timing_ctx.tnodes[inode].prepacked_data->model_pin = 0;
                timing_ctx.tnodes[inode].prepacked_data->model_port = 0;
                timing_ctx.tnodes[inode].prepacked_data->model_port_ptr = model->inputs;
                timing_ctx.tnodes[inode].block = ClusterBlockId::INVALID();
                timing_ctx.tnodes[inode].type = TN_OUTPAD_IPIN;
                timing_ctx.tnodes[inode].num_edges = 1;
                timing_ctx.tnodes[inode].out_edges = (t_tedge *) vtr::chunk_malloc(1 * sizeof(t_tedge), &tedge_ch);
                timing_ctx.tnodes[inode].out_edges->Tdel = 0;
                timing_ctx.tnodes[inode].out_edges->to_node = inode + 1;

                //The sink
                timing_ctx.tnodes[inode + 1].type = TN_OUTPAD_SINK;
                timing_ctx.tnodes[inode + 1].block = ClusterBlockId::INVALID();
                timing_ctx.tnodes[inode + 1].num_edges = 0;
                timing_ctx.tnodes[inode + 1].out_edges = nullptr;

                inode += 2;
            } else {
                VTR_ASSERT(pins.size() == 0); //Input net was swept
            }
		} else {
            //A regular block

            //Process the block's outputs
			int j = 0;
			t_model_ports* model_port = model->outputs;
			while (model_port) {

                AtomPortId port_id = atom_ctx.nlist.find_atom_port(blk_id, model_port);

                if(port_id) {

                    if (model_port->is_clock == false) {
                        //A non-clock output
                        for (int k = 0; k < model_port->size; k++) {
                            auto pin_id = atom_ctx.nlist.port_pin(port_id, k);
                            if (pin_id) {
                                //Look-ups 
                                atom_ctx.lookup.set_atom_pin_classic_tnode(pin_id, inode);

                                //The pin's associated net
                                auto net_id = atom_ctx.nlist.pin_net(pin_id);

                                //The first tnode
                                timing_ctx.tnodes[inode].prepacked_data->model_pin = k;
                                timing_ctx.tnodes[inode].prepacked_data->model_port = j;
                                timing_ctx.tnodes[inode].prepacked_data->model_port_ptr = model_port;
                                timing_ctx.tnodes[inode].block = ClusterBlockId::INVALID();
                                timing_ctx.tnodes[inode].num_edges = atom_ctx.nlist.net_sinks(net_id).size();
                                timing_ctx.tnodes[inode].out_edges = (t_tedge *) vtr::chunk_malloc( timing_ctx.tnodes[inode].num_edges * sizeof(t_tedge), &tedge_ch);

                                if (atom_ctx.nlist.block_is_combinational(blk_id)) {
                                    //Non-sequentail block so only a single OPIN tnode
                                    timing_ctx.tnodes[inode].type = TN_PRIMITIVE_OPIN;

                                    inode++;
                                } else {
                                    VTR_ASSERT(atom_ctx.nlist.block_clock_pins(blk_id).size() > 0);
                                    //A sequential block, so the first tnode was an FF_OPIN
                                    timing_ctx.tnodes[inode].type = TN_FF_OPIN;

                                    //The second tnode is the FF_SOURCE
                                    timing_ctx.tnodes[inode + 1].type = TN_FF_SOURCE;
                                    timing_ctx.tnodes[inode + 1].block = ClusterBlockId::INVALID();

                                    //Initialize the edge between SOURCE and OPIN with the clk-to-q delay
                                    auto iter = expected_lowest_cost_pb_gnode.find(blk_id);
                                    VTR_ASSERT(iter != expected_lowest_cost_pb_gnode.end());

                                    from_pb_graph_pin = get_pb_graph_node_pin_from_model_port_pin(model_port, k, 
                                                            iter->second);
                                    timing_ctx.tnodes[inode + 1].num_edges = 1;
                                    timing_ctx.tnodes[inode + 1].out_edges = (t_tedge *) vtr::chunk_malloc( 1 * sizeof(t_tedge), &tedge_ch);
                                    timing_ctx.tnodes[inode + 1].out_edges->to_node = inode;
                                    timing_ctx.tnodes[inode + 1].out_edges->Tdel = from_pb_graph_pin->tco_max; //Set the clk-to-Q delay

                                    inode += 2;
                                }
                            }
                        }
                    } else {
                        //An output clock port, meaning a clock source (e.g. PLL output)

                        //For every non-empty pin on the clock port create a clock pin and clock source tnode
                        for (int k = 0; k < model_port->size; k++) {
                            auto pin_id = atom_ctx.nlist.port_pin(port_id, k);
                            if (pin_id) {
                                //Look-ups
                                atom_ctx.lookup.set_atom_pin_classic_tnode(pin_id, inode);

                                //Create the OPIN
                                timing_ctx.tnodes[inode].type = TN_CLOCK_OPIN;

                                timing_ctx.tnodes[inode].prepacked_data->model_pin = k;
                                timing_ctx.tnodes[inode].prepacked_data->model_port = j;
                                timing_ctx.tnodes[inode].prepacked_data->model_port_ptr = model_port;
                                timing_ctx.tnodes[inode].block = ClusterBlockId::INVALID();

                                //Allocate space for the output edges
                                auto net_id = atom_ctx.nlist.pin_net(pin_id);
                                timing_ctx.tnodes[inode].num_edges = atom_ctx.nlist.net_sinks(net_id).size();
                                timing_ctx.tnodes[inode].out_edges = (t_tedge *) vtr::chunk_malloc( timing_ctx.tnodes[inode].num_edges * sizeof(t_tedge), &tedge_ch);


                                //Create the clock SOURCE
                                auto iter = expected_lowest_cost_pb_gnode.find(blk_id);
                                VTR_ASSERT(iter != expected_lowest_cost_pb_gnode.end());

                                timing_ctx.tnodes[inode + 1].type = TN_CLOCK_SOURCE;
                                timing_ctx.tnodes[inode + 1].block = ClusterBlockId::INVALID();
                                timing_ctx.tnodes[inode + 1].num_edges = 1;
                                timing_ctx.tnodes[inode + 1].prepacked_data->model_pin = k;
                                timing_ctx.tnodes[inode + 1].prepacked_data->model_port = j;
                                timing_ctx.tnodes[inode + 1].prepacked_data->model_port_ptr = model_port;

                                //Initialize the edge between them
                                timing_ctx.tnodes[inode + 1].out_edges = (t_tedge *) vtr::chunk_malloc( 1 * sizeof(t_tedge), &tedge_ch);
                                timing_ctx.tnodes[inode + 1].out_edges->to_node = inode;
                                timing_ctx.tnodes[inode + 1].out_edges->Tdel = 0.; //PLL output delay? Not clear what this reallly means... perhaps clock insertion delay from PLL?

                                inode += 2;
                            }
                        }
                    }
                }
                j++;
				model_port = model_port->next;
			}

            //Process the block's inputs
			j = 0;
			model_port = model->inputs;
			while (model_port) {

                AtomPortId port_id = atom_ctx.nlist.find_atom_port(blk_id, model_port);
                if(port_id) {

                    if (model_port->is_clock == false) {
                        //A non-clock (i.e. data) input

                        //For every non-empty pin create the associated tnode(s)
                        for (int k = 0; k < model_port->size; k++) {
                            auto pin_id = atom_ctx.nlist.port_pin(port_id, k);
                            if (pin_id) {

                                //Look-ups
                                atom_ctx.lookup.set_atom_pin_classic_tnode(pin_id, inode);

                                //Initialize the common part of the first tnode
                                timing_ctx.tnodes[inode].prepacked_data->model_pin = k;
                                timing_ctx.tnodes[inode].prepacked_data->model_port = j;
                                timing_ctx.tnodes[inode].prepacked_data->model_port_ptr = model_port;
                                timing_ctx.tnodes[inode].block = ClusterBlockId::INVALID();

                                auto iter = expected_lowest_cost_pb_gnode.find(blk_id);
                                VTR_ASSERT(iter != expected_lowest_cost_pb_gnode.end());

                                from_pb_graph_pin = get_pb_graph_node_pin_from_model_port_pin(model_port, k, 
                                                        iter->second);

                                if (atom_ctx.nlist.block_is_combinational(blk_id)) {
                                    //A non-sequential/combinational block

                                    timing_ctx.tnodes[inode].type = TN_PRIMITIVE_IPIN;

                                    //Allocate space for all possible the edges
                                    timing_ctx.tnodes[inode].out_edges = (t_tedge *) vtr::chunk_malloc( from_pb_graph_pin->num_pin_timing * sizeof(t_tedge), &tedge_ch);

                                    //Initialize the delay and sink tnodes (i.e. PRIMITIVE_OPINs)
                                    int count = 0;
                                    for(int m = 0; m < from_pb_graph_pin->num_pin_timing; m++) {
                                        to_pb_graph_pin = from_pb_graph_pin->pin_timing[m];

                                        //Find the tnode associated with the sink port & pin
                                        auto sink_blk_id = blk_id; //Within a single atom, so the source and sink blocks are the same
                                        auto sink_port_id = atom_ctx.nlist.find_atom_port(sink_blk_id, to_pb_graph_pin->port->model_port);
                                        if(sink_port_id) {
                                            auto sink_pin_id = atom_ctx.nlist.port_pin(sink_port_id, to_pb_graph_pin->pin_number);
                                            if(sink_pin_id) {
                                                //Pin is in use

                                                int to_node = atom_ctx.lookup.atom_pin_classic_tnode(sink_pin_id);
                                                VTR_ASSERT(to_node != OPEN);

                                                //Skip pins with no connections
                                                if(!sink_pin_id) {
                                                    continue;
                                                }

                                                //Mark the delay
                                                timing_ctx.tnodes[inode].out_edges[count].Tdel = from_pb_graph_pin->pin_timing_del_max[m];

                                                VTR_ASSERT(timing_ctx.tnodes[to_node].type == TN_PRIMITIVE_OPIN);

                                                timing_ctx.tnodes[inode].out_edges[count].to_node = to_node;

                                                count++;
                                            }
                                        }
                                    }
                                    //Mark the number of used edges (note that this may be less than the number allocated, since
                                    //some allocated edges may correspond to pins which were not connected)
                                    timing_ctx.tnodes[inode].num_edges = count;
                                    inode++;
                                } else {
                                    VTR_ASSERT(atom_ctx.nlist.block_clock_pins(blk_id).size() > 0);

                                    //A sequential input
                                    timing_ctx.tnodes[inode].type = TN_FF_IPIN;

                                    //Allocate the edge to the sink, and mark the setup-time on it
                                    timing_ctx.tnodes[inode].num_edges = 1;
                                    timing_ctx.tnodes[inode].out_edges = (t_tedge *) vtr::chunk_malloc( 1 * sizeof(t_tedge), &tedge_ch);
                                    timing_ctx.tnodes[inode].out_edges->to_node = inode + 1;
                                    timing_ctx.tnodes[inode].out_edges->Tdel = from_pb_graph_pin->tsu;

                                    //Initialize the FF_SINK node
                                    timing_ctx.tnodes[inode + 1].type = TN_FF_SINK;
                                    timing_ctx.tnodes[inode + 1].num_edges = 0;
                                    timing_ctx.tnodes[inode + 1].out_edges = nullptr;
                                    timing_ctx.tnodes[inode + 1].block = ClusterBlockId::INVALID();

                                    inode += 2;
                                }
                            }
                        }
                        j++;
                    } else {
                        //A clock input
                        //TODO: consider more than one clock per primitive
                        auto pins = atom_ctx.nlist.port_pins(port_id);
                        VTR_ASSERT(pins.size() == 1);
                        auto pin_id = *pins.begin();

                        if (pin_id) {
                            //Look-up
                            atom_ctx.lookup.set_atom_pin_classic_tnode(pin_id, inode);

                            //Initialize the clock tnode
                            timing_ctx.tnodes[inode].type = TN_FF_CLOCK;
                            timing_ctx.tnodes[inode].block = ClusterBlockId::INVALID();
                            timing_ctx.tnodes[inode].prepacked_data->model_pin = 0;
                            timing_ctx.tnodes[inode].prepacked_data->model_port = 0;
                            timing_ctx.tnodes[inode].prepacked_data->model_port_ptr = model_port;
                            timing_ctx.tnodes[inode].num_edges = 0;
                            timing_ctx.tnodes[inode].out_edges = nullptr;

                            inode++;
                        }
                    }
                }
				model_port = model_port->next;
			}
		}
	}
	VTR_ASSERT(inode == timing_ctx.num_tnodes);

	/* Load net delays and initialize clock domains to OPEN. */
    std::set<int> const_gen_tnodes;
	for (int i = 0; i < timing_ctx.num_tnodes; i++) {
		timing_ctx.tnodes[i].clock_domain = OPEN;

        //Since the setup/clock-to-q/combinational delays have already been set above,
        //we only set the net related delays here
		switch (timing_ctx.tnodes[i].type) {
            case TN_INPAD_OPIN:     //fallthrough
            case TN_PRIMITIVE_OPIN: //fallthrough
            case TN_FF_OPIN:        //fallthrough
            case TN_CLOCK_OPIN: {
                /* An output pin tnode */

                //Find the net driven by the OPIN
                auto pin_id = atom_ctx.lookup.classic_tnode_atom_pin(i);
                auto net_id = atom_ctx.nlist.pin_net(pin_id);
                VTR_ASSERT(net_id);
                VTR_ASSERT_MSG(pin_id == atom_ctx.nlist.net_driver(net_id), "OPIN must be net driver");

                bool is_const_net = atom_ctx.nlist.pin_is_constant(pin_id);
                //TODO: const generators should really be treated by sources launching at t=-inf
                if(is_const_net) {
                    VTR_ASSERT(timing_ctx.tnodes[i].type == TN_PRIMITIVE_OPIN);
                    timing_ctx.tnodes[i].type = TN_CONSTANT_GEN_SOURCE;
                    const_gen_tnodes.insert(i);
                }

                //Look at each sink
                int j = 0;
                for(auto sink_pin_id : atom_ctx.nlist.net_sinks(net_id)) {
                    if (is_const_net) {
                        //The net is a constant generator, we override the driver
                        //tnode type appropriately and set the delay to a large
                        //negative value to ensure the signal is treated as already
                        //'arrived'
                        timing_ctx.tnodes[i].out_edges[j].Tdel = HUGE_NEGATIVE_FLOAT;
                    } else {
                        //This is a real net, so use the default delay
                        timing_ctx.tnodes[i].out_edges[j].Tdel = inter_cluster_net_delay;
                    }

                    //Find the sink tnode
                    int to_node = atom_ctx.lookup.atom_pin_classic_tnode(sink_pin_id);
                    VTR_ASSERT(to_node != OPEN);

                    //Connect the edge to the sink
                    timing_ctx.tnodes[i].out_edges[j].to_node = to_node;
                    ++j;
                }
                VTR_ASSERT(timing_ctx.tnodes[i].num_edges == static_cast<int>(atom_ctx.nlist.net_sinks(net_id).size()));
                break;
            }
            case TN_PRIMITIVE_IPIN: //fallthrough
            case TN_OUTPAD_IPIN:    //fallthrough
            case TN_INPAD_SOURCE:   //fallthrough
            case TN_OUTPAD_SINK:    //fallthrough
            case TN_FF_SINK:        //fallthrough
            case TN_FF_SOURCE:      //fallthrough
            case TN_FF_IPIN:        //fallthrough
            case TN_FF_CLOCK:       //fallthrough
            case TN_CLOCK_SOURCE:   //fallthrough
                /* All other tnode's have had their edge-delays initialized */
                break;
            default:
                VPR_THROW(VPR_ERROR_TIMING, "Unknown tnode type %d.\n", timing_ctx.tnodes[i].type);
                break;
		}
	}

    //In some instances, we may end-up with constant generators driving constant generators
    //(which is illegal in the timing graph since constant generators shouldn't have any input
    //edges). So we remove those edges now.
    int const_gen_edge_break_count = 0;
    for(inode = 0; inode < timing_ctx.num_tnodes; ++inode) {
        for(int iedge = 0; iedge <timing_ctx.tnodes[inode].num_edges; ++iedge) {
            int& to_node = timing_ctx.tnodes[inode].out_edges[iedge].to_node;
            if(const_gen_tnodes.count(to_node)) {
                //This edge points to a constant generator, mark it invalid 
                VTR_ASSERT(timing_ctx.tnodes[to_node].type == TN_CONSTANT_GEN_SOURCE);

                to_node = DO_NOT_ANALYSE;

                ++const_gen_edge_break_count;
            }
        }
    }
    vtr::printf_info("Disconnected %d redundant timing edges to constant generators\n", const_gen_edge_break_count);


    //Build the net to driver look-up
    //  TODO: convert to use net_id directly when timing graph re-unified
	f_net_to_driver_tnode = (int*)vtr::malloc(num_timing_nets() * sizeof(int));
    auto nets = atom_ctx.nlist.nets();
	for (size_t i = 0; i < num_timing_nets(); i++) {
        auto net_id = *(nets.begin() + i); //XXX: Ugly hack relying on sequentially increasing net id's
        VTR_ASSERT(net_id);

        auto driver_pin_id = atom_ctx.nlist.net_driver(net_id);
        VTR_ASSERT(driver_pin_id);

        f_net_to_driver_tnode[i] = atom_ctx.lookup.atom_pin_classic_tnode(driver_pin_id);
    }

    //Sanity check, every net should have a valid driver tnode
	for (size_t i = 0; i < num_timing_nets(); i++) {
		VTR_ASSERT(f_net_to_driver_tnode[i] != OPEN);
	}
}

static void load_tnode(t_pb_graph_pin *pb_graph_pin, const ClusterBlockId iblock,
		int *inode) {
    auto& atom_ctx = g_vpr_ctx.mutable_atom();
    auto& timing_ctx = g_vpr_ctx.mutable_timing();

	int i = *inode;
	timing_ctx.tnodes[i].pb_graph_pin = pb_graph_pin;
	timing_ctx.tnodes[i].block = iblock;


	if (timing_ctx.tnodes[i].pb_graph_pin->parent_node->pb_type->blif_model == nullptr) {
		VTR_ASSERT(timing_ctx.tnodes[i].pb_graph_pin->type == PB_PIN_NORMAL);
		if (timing_ctx.tnodes[i].pb_graph_pin->parent_node->parent_pb_graph_node == nullptr) {
			if (timing_ctx.tnodes[i].pb_graph_pin->port->type == IN_PORT) {
				timing_ctx.tnodes[i].type = TN_CB_IPIN;
			} else {
				VTR_ASSERT(timing_ctx.tnodes[i].pb_graph_pin->port->type == OUT_PORT);
				timing_ctx.tnodes[i].type = TN_CB_OPIN;
			}
		} else {
			timing_ctx.tnodes[i].type = TN_INTERMEDIATE_NODE;
		}
	} else {
        AtomPinId atom_pin = find_atom_pin(iblock, pb_graph_pin);

		if (timing_ctx.tnodes[i].pb_graph_pin->type == PB_PIN_INPAD) {
			VTR_ASSERT(timing_ctx.tnodes[i].pb_graph_pin->port->type == OUT_PORT);
			timing_ctx.tnodes[i].type = TN_INPAD_OPIN;
			timing_ctx.tnodes[i + 1].num_edges = 1;
			timing_ctx.tnodes[i + 1].out_edges = (t_tedge *) vtr::chunk_malloc(
					1 * sizeof(t_tedge), &tedge_ch);
			timing_ctx.tnodes[i + 1].out_edges->Tdel = 0;
			timing_ctx.tnodes[i + 1].out_edges->to_node = i;
			timing_ctx.tnodes[i + 1].pb_graph_pin = pb_graph_pin; /* Necessary for propagate_clock_domain_and_skew(). */
			timing_ctx.tnodes[i + 1].type = TN_INPAD_SOURCE;
			timing_ctx.tnodes[i + 1].block = iblock;


            atom_ctx.lookup.set_atom_pin_classic_tnode(atom_pin, i + 1);

			(*inode)++;
		} else if (timing_ctx.tnodes[i].pb_graph_pin->type == PB_PIN_OUTPAD) {
			VTR_ASSERT(timing_ctx.tnodes[i].pb_graph_pin->port->type == IN_PORT);
			timing_ctx.tnodes[i].type = TN_OUTPAD_IPIN;
			timing_ctx.tnodes[i].num_edges = 1;
			timing_ctx.tnodes[i].out_edges = (t_tedge *) vtr::chunk_malloc(
					1 * sizeof(t_tedge), &tedge_ch);
			timing_ctx.tnodes[i].out_edges->Tdel = 0;
			timing_ctx.tnodes[i].out_edges->to_node = i + 1;
			timing_ctx.tnodes[i + 1].pb_graph_pin = pb_graph_pin; /* Necessary for find_tnode_net_name(). */
			timing_ctx.tnodes[i + 1].type = TN_OUTPAD_SINK;
			timing_ctx.tnodes[i + 1].block = iblock;
			timing_ctx.tnodes[i + 1].num_edges = 0;
			timing_ctx.tnodes[i + 1].out_edges = nullptr;

            atom_ctx.lookup.set_atom_pin_classic_tnode(atom_pin, i + 1);
			(*inode)++;
		} else if (timing_ctx.tnodes[i].pb_graph_pin->type == PB_PIN_SEQUENTIAL) {
			if (timing_ctx.tnodes[i].pb_graph_pin->port->type == IN_PORT) {
				timing_ctx.tnodes[i].type = TN_FF_IPIN;
				timing_ctx.tnodes[i].num_edges = 1;
				timing_ctx.tnodes[i].out_edges = (t_tedge *) vtr::chunk_malloc(
						1 * sizeof(t_tedge), &tedge_ch);
				timing_ctx.tnodes[i].out_edges->Tdel = pb_graph_pin->tsu;
				timing_ctx.tnodes[i].out_edges->to_node = i + 1;
				timing_ctx.tnodes[i + 1].pb_graph_pin = pb_graph_pin;
				timing_ctx.tnodes[i + 1].type = TN_FF_SINK;
				timing_ctx.tnodes[i + 1].block = iblock;
				timing_ctx.tnodes[i + 1].num_edges = 0;
				timing_ctx.tnodes[i + 1].out_edges = nullptr;

                atom_ctx.lookup.set_atom_pin_classic_tnode(atom_pin, i + 1);
			} else {
				VTR_ASSERT(timing_ctx.tnodes[i].pb_graph_pin->port->type == OUT_PORT);
                //Determine whether we are a standard clocked output pin (TN_FF_OPIN with TN_FF_SOURCE)
                //or a clock source (TN_CLOCK_OPIN with TN_CLOCK_SOURCE)
                t_model_ports* model_port = timing_ctx.tnodes[i].pb_graph_pin->port->model_port;
                if(!model_port->is_clock) {
                    //Standard sequential output
                    timing_ctx.tnodes[i].type = TN_FF_OPIN;
                    timing_ctx.tnodes[i + 1].num_edges = 1;
                    timing_ctx.tnodes[i + 1].out_edges = (t_tedge *) vtr::chunk_malloc(
                            1 * sizeof(t_tedge), &tedge_ch);
                    timing_ctx.tnodes[i + 1].out_edges->Tdel = pb_graph_pin->tco_max;
                    timing_ctx.tnodes[i + 1].out_edges->to_node = i;
                    timing_ctx.tnodes[i + 1].pb_graph_pin = pb_graph_pin;
                    timing_ctx.tnodes[i + 1].type = TN_FF_SOURCE;
                    timing_ctx.tnodes[i + 1].block = iblock;

                    atom_ctx.lookup.set_atom_pin_classic_tnode(atom_pin, i + 1);
                } else {
                    //Clock source
                    timing_ctx.tnodes[i].type = TN_CLOCK_OPIN;
                    timing_ctx.tnodes[i + 1].num_edges = 1;
                    timing_ctx.tnodes[i + 1].out_edges = (t_tedge *) vtr::chunk_malloc(
                            1 * sizeof(t_tedge), &tedge_ch);
                    timing_ctx.tnodes[i + 1].out_edges->Tdel = 0.; //Not clear what this delay physically represents
                    timing_ctx.tnodes[i + 1].out_edges->to_node = i;
                    timing_ctx.tnodes[i + 1].pb_graph_pin = pb_graph_pin;
                    timing_ctx.tnodes[i + 1].type = TN_CLOCK_SOURCE;
                    timing_ctx.tnodes[i + 1].block = iblock;

                    atom_ctx.lookup.set_atom_pin_classic_tnode(atom_pin, i + 1);
                }
			}
			(*inode)++;
		} else if (timing_ctx.tnodes[i].pb_graph_pin->type == PB_PIN_CLOCK) {
			timing_ctx.tnodes[i].type = TN_FF_CLOCK;
			timing_ctx.tnodes[i].num_edges = 0;
			timing_ctx.tnodes[i].out_edges = nullptr;

            atom_ctx.lookup.set_atom_pin_classic_tnode(atom_pin, i);
		} else {
			if (timing_ctx.tnodes[i].pb_graph_pin->port->type == IN_PORT) {
				VTR_ASSERT(timing_ctx.tnodes[i].pb_graph_pin->type == PB_PIN_TERMINAL);
				timing_ctx.tnodes[i].type = TN_PRIMITIVE_IPIN;

                atom_ctx.lookup.set_atom_pin_classic_tnode(atom_pin, i);
			} else {
				VTR_ASSERT(timing_ctx.tnodes[i].pb_graph_pin->port->type == OUT_PORT);
				VTR_ASSERT(timing_ctx.tnodes[i].pb_graph_pin->type == PB_PIN_TERMINAL);
				timing_ctx.tnodes[i].type = TN_PRIMITIVE_OPIN;

                atom_ctx.lookup.set_atom_pin_classic_tnode(atom_pin, i);
			}
		}
	}
	(*inode)++;
}

void print_timing_graph(const char *fname) {

	/* Prints the timing graph into a file. */

	FILE *fp;
	int inode, iedge, ilevel, i;
	t_tedge *tedge;
	e_tnode_type itype;
	const char *tnode_type_names[] = {  "TN_INPAD_SOURCE", "TN_INPAD_OPIN", "TN_OUTPAD_IPIN",
			"TN_OUTPAD_SINK", "TN_CB_IPIN", "TN_CB_OPIN", "TN_INTERMEDIATE_NODE",
			"TN_PRIMITIVE_IPIN", "TN_PRIMITIVE_OPIN", "TN_FF_IPIN", "TN_FF_OPIN", "TN_FF_SINK",
			"TN_FF_SOURCE", "TN_FF_CLOCK", "TN_CLOCK_SOURCE", "TN_CLOCK_OPIN", "TN_CONSTANT_GEN_SOURCE" };

    auto& cluster_ctx = g_vpr_ctx.clustering();
    auto& timing_ctx = g_vpr_ctx.timing();

	fp = vtr::fopen(fname, "w");

	fprintf(fp, "timing_ctx.num_tnodes: %d\n", timing_ctx.num_tnodes);
	fprintf(fp, "Node #\tType\t\tipin\tiblk\tDomain\tSkew\tI/O Delay\t# edges\t"
			"to_node     Tdel\n\n");

	for (inode = 0; inode < timing_ctx.num_tnodes; inode++) {
		fprintf(fp, "%d\t", inode);

		itype = timing_ctx.tnodes[inode].type;
		fprintf(fp, "%-15.15s\t", tnode_type_names[itype]);

		if (timing_ctx.tnodes[inode].pb_graph_pin != nullptr) {
			fprintf(fp, "%d\t%zu\t",
					timing_ctx.tnodes[inode].pb_graph_pin->pin_count_in_cluster,
					size_t(timing_ctx.tnodes[inode].block));
		} else {
			fprintf(fp, "\t%zu\t", size_t(timing_ctx.tnodes[inode].block));
		}

		if (itype == TN_FF_CLOCK || itype == TN_FF_SOURCE || itype == TN_FF_SINK) {
			fprintf(fp, "%d\t%.3e\t\t", timing_ctx.tnodes[inode].clock_domain, timing_ctx.tnodes[inode].clock_delay);
		} else if (itype == TN_INPAD_SOURCE || itype ==TN_CLOCK_SOURCE) {
			fprintf(fp, "%d\t\t%.3e\t", timing_ctx.tnodes[inode].clock_domain, timing_ctx.tnodes[inode].out_edges ? timing_ctx.tnodes[inode].out_edges[0].Tdel : -1);
		} else if (itype == TN_OUTPAD_SINK) {
			VTR_ASSERT(timing_ctx.tnodes[inode-1].type == TN_OUTPAD_IPIN); /* Outpad ipins should be one prior in the tnode array */
			fprintf(fp, "%d\t\t%.3e\t", timing_ctx.tnodes[inode].clock_domain, timing_ctx.tnodes[inode-1].out_edges[0].Tdel);
		} else {
			fprintf(fp, "\t\t\t\t");
		}

		fprintf(fp, "%d", timing_ctx.tnodes[inode].num_edges);

		/* Print all edges after edge 0 on separate lines */
		tedge = timing_ctx.tnodes[inode].out_edges;
		if (timing_ctx.tnodes[inode].num_edges > 0) {
			fprintf(fp, "\t%4d\t%7.3g", tedge[0].to_node, tedge[0].Tdel);
			for (iedge = 1; iedge < timing_ctx.tnodes[inode].num_edges; iedge++) {
				fprintf(fp, "\n\t\t\t\t\t\t\t\t\t\t%4d\t%7.3g", tedge[iedge].to_node, tedge[iedge].Tdel);
			}
		}
		fprintf(fp, "\n");
	}

	fprintf(fp, "\n\ntiming_ctx.num_tnode_levels: %d\n", timing_ctx.num_tnode_levels);

	for (ilevel = 0; ilevel < timing_ctx.num_tnode_levels; ilevel++) {
		fprintf(fp, "\n\nLevel: %d  Num_nodes: %zu\nNodes:", ilevel,
				timing_ctx.tnodes_at_level[ilevel].size());
		for (unsigned j = 0; j < timing_ctx.tnodes_at_level[ilevel].size(); j++)
			fprintf(fp, "\t%d", timing_ctx.tnodes_at_level[ilevel][j]);
	}

	fprintf(fp, "\n");
	fprintf(fp, "\n\nNet #\tNet_to_driver_tnode\n");

	for (i = 0; i < (int) cluster_ctx.clb_nlist.nets().size(); i++)
		fprintf(fp, "%4d\t%6d\n", i, f_net_to_driver_tnode[i]);

	if (timing_ctx.sdc && timing_ctx.sdc->num_constrained_clocks == 1) {

		/* Arrival and required times, and forward and backward weights, will be meaningless for multiclock
		designs, since the values currently on the graph will only correspond to the most recent traversal. */
		fprintf(fp, "\n\nNode #\t\tT_arr\t\tT_req"
#ifdef PATH_COUNTING
			"\tForward weight\tBackward weight"
#endif
			"\n\n");

		for (inode = 0; inode < timing_ctx.num_tnodes; inode++) {
			if (timing_ctx.tnodes[inode].T_arr > HUGE_NEGATIVE_FLOAT + 1) {
				fprintf(fp, "%d\t%12g", inode, timing_ctx.tnodes[inode].T_arr);
			} else {
				fprintf(fp, "%d\t\t   -", inode);
			}
			if (timing_ctx.tnodes[inode].T_req < HUGE_POSITIVE_FLOAT - 1) {
				fprintf(fp, "\t%12g", timing_ctx.tnodes[inode].T_req);
			} else {
				fprintf(fp, "\t\t   -");
			}
#ifdef PATH_COUNTING
			fprintf(fp, "\t%12g\t%12g", timing_ctx.tnodes[inode].forward_weight, timing_ctx.tnodes[inode].backward_weight);
#endif
            fprintf(fp, "\n");
		}
	}

	fclose(fp);
}
static void process_constraints() {
	/* Removes all constraints between domains which never intersect. We need to do this 
	so that criticality_denom in do_timing_analysis is not affected	by unused constraints. 
	BFS through the levelized graph once for each source domain. Whenever we get to a sink, 
	mark off that we've used that sink clock domain.  After	each traversal, set all unused
	constraints to DO_NOT_ANALYSE. 
	
	Also, print timing_ctx.sdc->domain_constraints, constrained I/Os and override constraints, 
	and convert timing_ctx.sdc->domain_constraints and flip-flop-level override constraints
	to be in seconds rather than nanoseconds. We don't need to normalize timing_ctx.sdc->cc_constraints
	because they're already on the timing_ctx.sdc->domain_constraints matrix, and we don't need
	to normalize constrained_ios because we already did the normalization when
	we put the delays onto the timing graph in load_clock_domain_and_clock_and_io_delay. */

	int source_clock_domain, sink_clock_domain, inode, ilevel, num_at_level, i,
		num_edges, iedge, to_node, icf, ifc, iff;
	t_tedge * tedge;
	float constraint;

    auto& timing_ctx = g_vpr_ctx.timing();

	bool * constraint_used = (bool *) vtr::malloc(timing_ctx.sdc->num_constrained_clocks * sizeof(bool));

	for (source_clock_domain = 0; source_clock_domain < timing_ctx.sdc->num_constrained_clocks; source_clock_domain++) {
		/* We're going to use arrival time to flag which nodes we've reached, 
		even though the values we put in will not correspond to actual arrival times. 
		Nodes which are reached on this traversal will get an arrival time of 0. 
		Reset arrival times now to an invalid number. */
		for (inode = 0; inode < timing_ctx.num_tnodes; inode++) {
			timing_ctx.tnodes[inode].T_arr = HUGE_NEGATIVE_FLOAT;
		}

		/* Reset all constraint_used entries. */
		for (sink_clock_domain = 0; sink_clock_domain < timing_ctx.sdc->num_constrained_clocks; sink_clock_domain++) {
			constraint_used[sink_clock_domain] = false;
		}

		/* Set arrival times for each top-level tnode on this clock domain. */
        if(!timing_ctx.tnodes_at_level.empty()) {
            num_at_level = timing_ctx.tnodes_at_level[0].size();	
        } else {
            num_at_level = 0;
        }
		for (i = 0; i < num_at_level; i++) {
			inode = timing_ctx.tnodes_at_level[0][i];
			if (timing_ctx.tnodes[inode].clock_domain == source_clock_domain) {
				timing_ctx.tnodes[inode].T_arr = 0.;
			}
		}

		for (ilevel = 0; ilevel < timing_ctx.num_tnode_levels; ilevel++) {	/* Go down one level at a time. */
			num_at_level = timing_ctx.tnodes_at_level[ilevel].size();			
						
			for (i = 0; i < num_at_level; i++) {					
				inode = timing_ctx.tnodes_at_level[ilevel][i];	/* Go through each of the tnodes at the level we're on. */
				if (has_valid_T_arr(inode)) {	/* If this tnode has been used */
					num_edges = timing_ctx.tnodes[inode].num_edges;
					if (num_edges == 0) { /* sink */
						/* We've reached the sink domain of this tnode, so set constraint_used  
						to true for this tnode's clock domain (if it has a valid one). */
						sink_clock_domain = timing_ctx.tnodes[inode].clock_domain;
						if (sink_clock_domain != -1) {
							constraint_used[sink_clock_domain] = true;
						}
					} else {
						/* Set arrival time to a valid value (0.) for each tnode in this tnode's fanout. */
						tedge = timing_ctx.tnodes[inode].out_edges;	
						for (iedge = 0; iedge < num_edges; iedge++) {
							to_node = tedge[iedge].to_node;
							if(to_node == DO_NOT_ANALYSE) continue; //Skip marked invalid nodes

							timing_ctx.tnodes[to_node].T_arr = 0.;
						}
					}
				}
			}
		}

		/* At the end of the source domain traversal, see which sink domains haven't been hit, 
		and set the constraint for the pair of source and sink domains to DO_NOT_ANALYSE */

		for (sink_clock_domain = 0; sink_clock_domain < timing_ctx.sdc->num_constrained_clocks; sink_clock_domain++) {
			if (!constraint_used[sink_clock_domain]) {
                if(timing_ctx.sdc->domain_constraint[source_clock_domain][sink_clock_domain] != DO_NOT_ANALYSE) {
                    vtr::printf_warning(__FILE__, __LINE__, "Timing constraint from clock %d to %d of value %f will be disabled"
                                                           " since it is not activated by any path in the timing graph.\n",
                                                           source_clock_domain, sink_clock_domain,
                                                           timing_ctx.sdc->domain_constraint[source_clock_domain][sink_clock_domain]);
                }
				timing_ctx.sdc->domain_constraint[source_clock_domain][sink_clock_domain] = DO_NOT_ANALYSE;
			}
		}
	}

	free(constraint_used);

	/* Print constraints */	
	if (getEchoEnabled() && isEchoFileEnabled(E_ECHO_TIMING_CONSTRAINTS)) {
		print_timing_constraint_info(getEchoFileName(E_ECHO_TIMING_CONSTRAINTS));
	}

	/* Convert timing_ctx.sdc->domain_constraint and ff-level override constraints to be in seconds, not nanoseconds. */
	for (source_clock_domain = 0; source_clock_domain < timing_ctx.sdc->num_constrained_clocks; source_clock_domain++) {
		for (sink_clock_domain = 0; sink_clock_domain < timing_ctx.sdc->num_constrained_clocks; sink_clock_domain++) {
			constraint = timing_ctx.sdc->domain_constraint[source_clock_domain][sink_clock_domain];
			if (constraint > NEGATIVE_EPSILON) { /* if constraint does not equal DO_NOT_ANALYSE */
				timing_ctx.sdc->domain_constraint[source_clock_domain][sink_clock_domain] = constraint * 1e-9;
			}
		}
	}
	for (icf = 0; icf < timing_ctx.sdc->num_cf_constraints; icf++) {
		timing_ctx.sdc->cf_constraints[icf].constraint *= 1e-9;
	}
	for (ifc = 0; ifc < timing_ctx.sdc->num_fc_constraints; ifc++) {
		timing_ctx.sdc->fc_constraints[ifc].constraint *= 1e-9;
	}
	for (iff = 0; iff < timing_ctx.sdc->num_ff_constraints; iff++) {
		timing_ctx.sdc->ff_constraints[iff].constraint *= 1e-9;
	}

	/* Finally, free timing_ctx.sdc->cc_constraints since all of its info is contained in timing_ctx.sdc->domain_constraint. */
	free_override_constraint(timing_ctx.sdc->cc_constraints, timing_ctx.sdc->num_cc_constraints);
}

static void alloc_timing_stats() {

	/* Allocate f_timing_stats data structure. */

	int i;

    auto& timing_ctx = g_vpr_ctx.timing();

	f_timing_stats = (t_timing_stats *) vtr::malloc(sizeof(t_timing_stats));
	f_timing_stats->cpd = (float **) vtr::malloc(timing_ctx.sdc->num_constrained_clocks * sizeof(float *));
	f_timing_stats->least_slack = (float **) vtr::malloc(timing_ctx.sdc->num_constrained_clocks * sizeof(float *));
	for (i = 0; i < timing_ctx.sdc->num_constrained_clocks; i++) {
		f_timing_stats->cpd[i] = (float *) vtr::malloc(timing_ctx.sdc->num_constrained_clocks * sizeof(float));
		f_timing_stats->least_slack[i] = (float *) vtr::malloc(timing_ctx.sdc->num_constrained_clocks * sizeof(float));
	}
}

void do_timing_analysis(t_slack * slacks, const t_timing_inf &timing_inf, bool is_prepacked, bool is_final_analysis) {

/*  Performs timing analysis on the circuit.  Before this routine is called, t_slack * slacks 
	must have been allocated, and the circuit must have been converted into a timing graph.
	The nodes of the timing graph represent pins and the edges between them represent delays 
	and m dependencies from one pin to another.  Most elements are modeled as a pair of nodes so
	that the delay through the element can be marked on the edge between them (e.g.
	TN_INPAD_SOURCE->TN_INPAD_OPIN, TN_OUTPAD_IPIN->TN_OUTPAD_SINK, TN_PRIMITIVE_OPIN->
	TN_PRIMITIVE_OPIN, etc.).
	
	The timing graph nodes are stored as an array, tnode [0..timing_ctx.num_tnodes - 1]. Each tnode 
	includes an array of all edges, tedge, which fan out from it. Each tedge includes the
	index of the node on its far end (in the tnode array), and the delay to that node.

	The timing graph has sources at each TN_FF_SOURCE (Q output), TN_INPAD_SOURCE (input I/O pad)
	and TN_CONSTANT_GEN_SOURCE (constant 1 or 0 generator) node and sinks at TN_FF_SINK (D input) 
	and TN_OUTPAD_SINK (output I/O pad) nodes. Two traversals, one forward (sources to sinks)
	and one backward, are performed for each valid constraint (one which is not DO_NOT_ANALYSE) 
	between a source and a sink clock domain in the matrix timing_ctx.sdc->domain_constraint 
	[0..timing_ctx.sdc->num_constrained_clocks - 1][0..timing_ctx.sdc->num_constrained_clocks - 1]. This matrix has been 
	pruned so that all domain pairs with no paths between them have been set to DO_NOT_ANALYSE.
	
	During the traversal pair for each constraint, all nodes in the fanout of sources on the
	source clock domain are assigned a T_arr, the arrival time of the last input signal to the node.
	All nodes in the fanin of sinks on the sink clock domain are assigned a T_req, the required 
	arrival time of the last input signal to the node if the critical path for this constraint is 
	not to be lengthened.  Nodes which receive both a valid T_arr and T_req are flagged with 
	used_on_this_traversal, and nodes which are used on at least one traversal pair	are flagged 
	with has_valid_slack so that later functions know the slack is valid.

	After each traversal pair, a slack is calculated for each sink pin on each net (or equivalently, 
	each connection or tedge fanning out from that net's driver tnode). Slack is calculated as:
		T_req (dest node) - T_arr (source node) - Tdel (edge)
	and represents the amount of delay which could be added to this connection before the critical 
	path delay for this constraint would worsen.  Edges on the critical path have a slack of 0.  
	Slacks which are never used are set to HUGE_POSITIVE_FLOAT.
	
	The optimizers actually use a metric called timing_criticality.  Timing criticality is defined 
	as 1 - slack / criticality_denom, where the normalization factor criticality_denom is the max
	of all arrival times in the constraint and the constraint itself (T_req-relaxed slacks) or
	all arrival times and constraints in the design (shifted slacks).  See below for a further 
	discussion of these two regimes.  Timing criticality is always between 0 (not critical) and 1
	(very critical).  Unlike slack, which is set to HUGE_POSITIVE_FLOAT for unanalysed connections,
	timing criticality is 0 for these, meaning no special check has to be made for which connections
	have been analysed.

	If path counting is on (PATH_COUNTING is defined in vpr_types.h), the optimizers use a weighted
	sum of timing_criticality and path_criticality, the latter of which is an estimate of the 
	importance of the number of paths using a particular connection.  As a path's timing_criticality
	decreases, it will become exponentially less important to the path_criticality of any connection
	which this path uses.  Path criticality also goes from 0 (not critical or unanalysed) to 1.

	Slack and criticalities are only calculated if both the driver of the net and the sink pin were
	used_on_this_traversal, and are only overwritten if lower than previously-obtained values. 
	The optimizers actually use criticality rather than slack, but slack is useful for human 
	designers and so we calculate it only if we need to print it.
	
	This routine outputs slack and criticality to t_slack * slacks. It also stores least slack and
	critical path delay per constraint [0..timing_ctx.sdc->num_constrained_clocks - 1][0..timing_ctx.sdc->num_constrained_clocks - 1] 
	in the file-scope variable f_timing_stats. 

	Is_prepacked flags whether to calculate normalized costs for the clusterer (normalized_slack, 
	normalized_Tarr, normalized_total_critical_paths). Setting this to false saves time in post-
	packed timing analyses.

	Is_final_analysis flags whether this is the final, analysis pass.  If it is, the analyser will 
	compute actual slacks instead of relaxed ones. We "relax" slacks by setting the required time to 
	the maximum arrival time for tight constraints so that no slacks are negative (which confuses 
	the optimizers). This is called "T_req-relaxed" slack.  However, human designers want to see 
	actual slack values, so we report those in the final analysis.  The alternative ways of making 
	slacks positive are shifting them upwards by the value of the largest negative slack, after 
	all traversals are complete ("shifted slacks"), which can be enabled by changing slack_definition 
	from 'R' to 'I'; or using either 'R' or 'I' with a criticality denominator which 
	is the same for every traversal (respectively called 'G' and 'S").

	To do: flip-flop to flip-flop and flip-flop to clock domain constraints (set_false_path, set_max_delay,
	and especially set_multicycle_path). All the info for these constraints is contained in timing_ctx.sdc->fc_constraints and 
	timing_ctx.sdc->ff_constraints, but graph traversals are not included yet. Probably, an entire traversal will be needed for
	each constraint. Clock domain to flip-flop constraints are coded but not tested, and are done within 
	existing traversals. */

    /* Description of slack_definition:
    slack_definition determines how to normalize negative slacks for the optimizers (not in the final timing analysis
    for output statistics):
    'R' (T_req-relaxed): For each constraint, set the required time at sink nodes to the max of the true required time
    (constraint + timing_ctx.tnodes[inode].clock_skew) and the max arrival time. This means that the required time is "relaxed"
    to the max arrival time for tight constraints which would otherwise give negative slack.
    'I' (Improved Shifted): After all slacks are computed, increase the value of all slacks by the magnitude of the
    largest negative slack, if it exists. More computationally demanding. Equivalent to 'R' for a single clock.
    'S' (Shifted): Same as improved shifted, but criticalities are only computed after all traversals.  Equivalent to 'R'
    for a single clock.
    'G' (Global T_req-relaxed): Same as T_req-relaxed, but criticalities are only computed after all traversals.
    Equivalent to 'R' for a single clock.  Note: G is a global version of R, just like S is a global version of I.
    'C' (Clipped): All negative slacks are clipped to 0.
    'N' (None): Negative slacks are not normalized.

    This definition also affects how criticality is computed.  For all methods except 'S', the criticality denominator
    is the maximum required time for each constraint, and criticality is updated after each constraint.  'S' only updates
    criticalities once after all traversals, and the criticality denominator is the maximum required time over all
    traversals.

    Because the criticality denominator must be >= the largest slack it is used on, and slack normalization affects the
    size of the largest slack, the denominator must also be normalized.  We choose the following normalization methods:

    'R': Denominator is already taken care of because the maximum required time now depends on the constraint. No further
    normalization is necessary.
    'I': Denominator is increased by the magnitude of the largest negative slack.
    'S': Denominator is the maximum of the 'I' denominator over all constraints.
    'G': Denominator is the maximum of the 'R' denominator over all constraints.
    'C': Denominator is unchanged.  However, if Treq_max is 0, there is division by 0.  To avoid this, note that in this
    case, all of the slacks will be clipped to zero anyways, so we can just set the criticality to 1.
    'N': Denominator is set to max(max_Treq, max_Tarr), so that the magnitude of criticality will at least be bounded to
    2.  This is the same denominator as 'R', though calculated differently.
    */

    clock_t begin = clock();

#ifdef PATH_COUNTING
	float max_path_criticality = HUGE_NEGATIVE_FLOAT /* used to normalize path_criticalities */;
#endif

	bool update_slack = (is_final_analysis || getEchoEnabled());
								 /* Only update slack values if we need to print it, i.e.
								 for the final output file (is_final_analysis) or echo files. */

	float criticality_denom; /* (slack_definition == 'R' and 'I' only) For a particular constraint, the maximum of 
							 the constraint and all arrival times for the constraint's traversal. Used to 
							 normalize the clusterer's normalized_slack and, more importantly, criticality. */

	long max_critical_output_paths, max_critical_input_paths;

	float smallest_slack_in_design = HUGE_POSITIVE_FLOAT;
	/* For slack_definition == 'S', shift all slacks upwards by this number if it is negative. */

    float criticality_denom_global = HUGE_NEGATIVE_FLOAT;
    /* Denominator of criticality for slack_definition == 'S' || slack_definition == 'G' -
    max of all arrival times and all constraints. */

    update_slack = bool(timing_inf.slack_definition == std::string("S") || timing_inf.slack_definition == std::string("G"));
	/* Update slack values for certain slack definitions where they are needed to compute timing criticalities. */

    auto& timing_ctx = g_vpr_ctx.mutable_timing();

	/* Reset all values which need to be reset once per 
	timing analysis, rather than once per traversal pair. */

	/* Reset slack and criticality */
	for (size_t inet = 0; inet < num_timing_nets(); inet++) {
		for (int ipin = 1; ipin < (int) num_timing_net_pins(inet); ipin++) {
			slacks->slack[inet][ipin]			   = HUGE_POSITIVE_FLOAT; 
			slacks->timing_criticality[inet][ipin] = 0.; 
#ifdef PATH_COUNTING
			slacks->path_criticality[inet][ipin] = 0.;
#endif
		}
	}

	/* Reset f_timing_stats. */
	for (int i = 0; i < timing_ctx.sdc->num_constrained_clocks; i++) {	
		for (int j = 0; j < timing_ctx.sdc->num_constrained_clocks; j++) {
			f_timing_stats->cpd[i][j]		  = HUGE_NEGATIVE_FLOAT;
			f_timing_stats->least_slack[i][j] = HUGE_POSITIVE_FLOAT;
		}
	}

#ifndef PATH_COUNTING
	/* Reset normalized values for clusterer. */
	if (is_prepacked) { 
		for (int inode = 0; inode < timing_ctx.num_tnodes; inode++) {			
			timing_ctx.tnodes[inode].prepacked_data->normalized_slack = HUGE_POSITIVE_FLOAT;
			timing_ctx.tnodes[inode].prepacked_data->normalized_T_arr = HUGE_NEGATIVE_FLOAT;
			timing_ctx.tnodes[inode].prepacked_data->normalized_total_critical_paths = HUGE_NEGATIVE_FLOAT;
		}
	}
#endif

	vtr::vector_map<ClusterBlockId, t_pb **> pin_id_to_pb_mapping = alloc_and_load_pin_id_to_pb_mapping();
    
    if (timing_inf.slack_definition == std::string("I")) {
        /* Find the smallest slack in the design, if negative. */
        smallest_slack_in_design = find_least_slack(is_prepacked, pin_id_to_pb_mapping);
        if (smallest_slack_in_design > 0) smallest_slack_in_design = 0;
    }

	/* For each valid constraint (pair of source and sink clock domains), we do one 
	forward and one backward topological traversal to find arrival and required times,
	in do_timing_analysis_for_constraint. If path counting is on, we then do another, 
	simpler traversal to find forward and backward weights, relying on the largest 
	required time we found from the first traversal.  After each constraint's traversals,
	we update the slacks, timing criticalities and (if necessary) path criticalities or
	normalized costs used by the clusterer. */

	for (int source_clock_domain = 0; source_clock_domain < timing_ctx.sdc->num_constrained_clocks; source_clock_domain++) {
		for (int sink_clock_domain = 0; sink_clock_domain < timing_ctx.sdc->num_constrained_clocks; sink_clock_domain++) {
            if (timing_ctx.sdc->domain_constraint[source_clock_domain][sink_clock_domain] > NEGATIVE_EPSILON) { /* i.e. != DO_NOT_ANALYSE */

                /* Perform the forward and backward traversal for this constraint. */
                criticality_denom = do_timing_analysis_for_constraint(source_clock_domain, sink_clock_domain,
                    is_prepacked, is_final_analysis, &max_critical_input_paths, &max_critical_output_paths, 
                    pin_id_to_pb_mapping, timing_inf);
#ifdef PATH_COUNTING
                /* Weight the importance of each net, used in slack calculation. */
                do_path_counting(criticality_denom);
#endif

                if (timing_inf.slack_definition == std::string("I")) {
                    criticality_denom -= smallest_slack_in_design;
                    /* Remember, smallest_slack_in_design is negative, so we're INCREASING criticality_denom. */
                }

				/* Update the slack and criticality for each edge of each net which was  
				analysed on the most recent traversal and has a lower (slack) or 
				higher (criticality) value than before. */
				update_slacks(slacks, criticality_denom, 
					update_slack, is_final_analysis, smallest_slack_in_design, timing_inf);

#ifndef PATH_COUNTING
				/* Update the normalized costs used by the clusterer. */
				if (is_prepacked) {
					update_normalized_costs(criticality_denom, max_critical_input_paths, max_critical_output_paths, timing_inf);
				}
#endif

                if (timing_inf.slack_definition == std::string("S") || timing_inf.slack_definition == std::string("G")) {
				    /* Set criticality_denom_global to the max of criticality_denom over all traversals. */
				    criticality_denom_global = max(criticality_denom_global, criticality_denom);
                }
			}
		}
	} 

#ifdef PATH_COUNTING
	/* Normalize path criticalities by the largest value in the 
	circuit. Otherwise, path criticalities would be unbounded. */

	for (inet = 0; inet < num_timing_nets(); inet++) {
		num_edges = num_timing_net_sinks(inet);
		for (iedge = 0; iedge < num_edges; iedge++) {
			max_path_criticality = max(max_path_criticality, slacks->path_criticality[inet][iedge + 1]);
		}
	}

	for (inet = 0; inet < num_timing_nets(); inet++) {
		num_edges = num_timing_net_sinks(inet);
		for (iedge = 0; iedge < num_edges; iedge++) {
			slacks->path_criticality[inet][iedge + 1] /= max_path_criticality;
		}
	}

#endif

    if (timing_inf.slack_definition == std::string("S") || timing_inf.slack_definition == std::string("G")) {
        if (!is_final_analysis) {
            if (timing_inf.slack_definition == std::string("S")) {
                /* Find the smallest slack in the design. */
                for (int i = 0; i < timing_ctx.sdc->num_constrained_clocks; i++) {
                    for (int j = 0; j < timing_ctx.sdc->num_constrained_clocks; j++) {
                        smallest_slack_in_design = min(smallest_slack_in_design, f_timing_stats->least_slack[i][j]);
                    }
                }

                /* Increase all slacks by the value of the smallest slack in the design, if it's negative.
                Or clip all negative slacks to 0, based on how we choose to normalize slacks*/
                if (smallest_slack_in_design < 0) {
                    for (size_t inet = 0; inet < num_timing_nets(); inet++) {
                        int num_edges = num_timing_net_sinks(inet);
                        for (int iedge = 0; iedge < num_edges; iedge++) {
                            slacks->slack[inet][iedge + 1] -= smallest_slack_in_design; 
                            /* Remember, smallest_slack_in_design is negative, so we're INCREASING all the slacks. */
                            /* Note that if slack was equal to HUGE_POSITIVE_FLOAT, it will still be equal to more than this, 
                            so it will still be ignored when we calculate criticalities. */
                        }
                    }
                    criticality_denom_global -= smallest_slack_in_design;
                    /* Also need to increase the criticality denominator. In some cases, slack > criticality_denom_global, causing 
                    timing_criticality < 0 when calculated later. Do this shift to keep timing_criticality non-negative.
                    */
                }
            }

		    /* We can now calculate criticalities (for 'S', this must be done after we normalize slacks). */
		    for (size_t inet = 0; inet < num_timing_nets(); inet++) {
			    int num_edges = num_timing_net_sinks(inet);
			    for (int iedge = 0; iedge < num_edges; iedge++) {
				    if (slacks->slack[inet][iedge + 1] < HUGE_POSITIVE_FLOAT - 1) { /* if the slack is valid */
					    slacks->timing_criticality[inet][iedge + 1] = 1 - slacks->slack[inet][iedge + 1]/criticality_denom_global; 
					    VTR_ASSERT(slacks->timing_criticality[inet][iedge + 1] > -0.01);
					    VTR_ASSERT(slacks->timing_criticality[inet][iedge + 1] <  1.01);
				    }
				    /* otherwise, criticality remains 0, as it was initialized */
			    }
		    }
	    }		
    }
    free_pin_id_to_pb_mapping(pin_id_to_pb_mapping);

    clock_t end = clock();
    timing_ctx.stats.old_sta_wallclock_time  += double(end - begin) / CLOCKS_PER_SEC;
    timing_ctx.stats.num_old_sta_full_updates  += 1;
}

static float find_least_slack(bool is_prepacked, vtr::vector_map<ClusterBlockId, t_pb **> &pin_id_to_pb_mapping) {
	/* Perform a simplified version of do_timing_analysis_for_constraint 
	to compute only the smallest slack in the design. 
    USED ONLY WHEN slack_definition == 'I'! */

	float smallest_slack_in_design = HUGE_POSITIVE_FLOAT;

    auto& timing_ctx = g_vpr_ctx.timing();

	for (int source_clock_domain = 0; source_clock_domain < timing_ctx.sdc->num_constrained_clocks; source_clock_domain++) {
		for (int sink_clock_domain = 0; sink_clock_domain < timing_ctx.sdc->num_constrained_clocks; sink_clock_domain++) {
			if (timing_ctx.sdc->domain_constraint[source_clock_domain][sink_clock_domain] > NEGATIVE_EPSILON) { /* i.e. != DO_NOT_ANALYSE */

				/* Reset all arrival and required times. */
				for (int inode = 0; inode < timing_ctx.num_tnodes; inode++) {
					timing_ctx.tnodes[inode].T_arr = HUGE_NEGATIVE_FLOAT; 
					timing_ctx.tnodes[inode].T_req = HUGE_POSITIVE_FLOAT;
				}

				/* Set arrival times for each top-level tnode on this source domain. */
				int num_at_level = timing_ctx.tnodes_at_level[0].size();	
				for (int i = 0; i < num_at_level; i++) {
					int inode = timing_ctx.tnodes_at_level[0][i];	
					if (timing_ctx.tnodes[inode].clock_domain == source_clock_domain) {
						if (timing_ctx.tnodes[inode].type == TN_FF_SOURCE) { 
							timing_ctx.tnodes[inode].T_arr = timing_ctx.tnodes[inode].clock_delay;
						} else if (timing_ctx.tnodes[inode].type == TN_INPAD_SOURCE) { 
							timing_ctx.tnodes[inode].T_arr = 0.;
						}
					}
				}

				/* Forward traversal, to compute arrival times. */
				for (int ilevel = 0; ilevel < timing_ctx.num_tnode_levels; ilevel++) {	
					num_at_level = timing_ctx.tnodes_at_level[ilevel].size();		

					for (int i = 0; i < num_at_level; i++) {				
						int inode = timing_ctx.tnodes_at_level[ilevel][i];		
						if (timing_ctx.tnodes[inode].T_arr < NEGATIVE_EPSILON) {	
							continue;																
						}

						int num_edges = timing_ctx.tnodes[inode].num_edges;				
						t_tedge *tedge = timing_ctx.tnodes[inode].out_edges;					

						for (int iedge = 0; iedge < num_edges; iedge++) {
							int to_node = tedge[iedge].to_node;	
							if(to_node == DO_NOT_ANALYSE) continue; //Skip marked invalid nodes

							timing_ctx.tnodes[to_node].T_arr = max(timing_ctx.tnodes[to_node].T_arr, timing_ctx.tnodes[inode].T_arr + tedge[iedge].Tdel);
						}
					}
				}

				/* Backward traversal, to compute required times and slacks.  We can skip nodes which are more than 
				1 away from a sink, because the path with the least slack has to use a connection between a sink 
				and one node away from a sink. */
				for (int ilevel = timing_ctx.num_tnode_levels - 1; ilevel >= 0; ilevel--) {
					num_at_level = timing_ctx.tnodes_at_level[ilevel].size();
	
					for (int i = 0; i < num_at_level; i++) {
						int inode = timing_ctx.tnodes_at_level[ilevel][i];
						int num_edges = timing_ctx.tnodes[inode].num_edges;
						if (num_edges == 0) { /* sink */
							if (timing_ctx.tnodes[inode].type == TN_FF_CLOCK || timing_ctx.tnodes[inode].T_arr < HUGE_NEGATIVE_FLOAT + 1
								|| timing_ctx.tnodes[inode].clock_domain != sink_clock_domain) {
								continue; 
							}

							float constraint;
							if (timing_ctx.sdc->num_cf_constraints > 0) {
								char *source_domain_name = timing_ctx.sdc->constrained_clocks[source_clock_domain].name;
								const char *sink_register_name = find_tnode_net_name(inode, is_prepacked, pin_id_to_pb_mapping);
								int icf = find_cf_constraint(source_domain_name, sink_register_name);
								if (icf != DO_NOT_ANALYSE) {
									constraint = timing_ctx.sdc->cf_constraints[icf].constraint;
									if (constraint < NEGATIVE_EPSILON) { 
										continue;
									}
								} else {
									constraint = timing_ctx.sdc->domain_constraint[source_clock_domain][sink_clock_domain];
								}
							} else { 
								constraint = timing_ctx.sdc->domain_constraint[source_clock_domain][sink_clock_domain];
							}

							timing_ctx.tnodes[inode].T_req = constraint + timing_ctx.tnodes[inode].clock_delay;
						} else {

							if (timing_ctx.tnodes[inode].T_arr < HUGE_NEGATIVE_FLOAT + 1) { 
								continue; 
							}
				
							bool found = false;
							t_tedge *tedge = timing_ctx.tnodes[inode].out_edges;
							for (int iedge = 0; iedge < num_edges && !found; iedge++) { 
								int to_node = tedge[iedge].to_node;
								if(to_node == DO_NOT_ANALYSE) continue; //Skip marked invalid nodes

								if(timing_ctx.tnodes[to_node].T_req < HUGE_POSITIVE_FLOAT) {
									found = true;
								}
							}
							if (!found) {
								continue;
							}

							for (int iedge = 0; iedge < num_edges; iedge++) {
								int to_node = tedge[iedge].to_node;
								if(to_node == DO_NOT_ANALYSE) continue; //Skip marked invalid nodes

								if (timing_ctx.tnodes[to_node].num_edges == 0 && 
										timing_ctx.tnodes[to_node].clock_domain == sink_clock_domain) { // one away from a register on this sink domain
									float Tdel = tedge[iedge].Tdel;
									float T_req = timing_ctx.tnodes[to_node].T_req;
									smallest_slack_in_design = min(smallest_slack_in_design, T_req - Tdel - timing_ctx.tnodes[inode].T_arr);
								}
							}
						}
					}
				} 
			}
		}
	}

	return smallest_slack_in_design;
}

static float do_timing_analysis_for_constraint(int source_clock_domain, int sink_clock_domain, 
	bool is_prepacked, bool is_final_analysis, long * max_critical_input_paths_ptr, 
	long * max_critical_output_paths_ptr, vtr::vector_map<ClusterBlockId, t_pb **> &pin_id_to_pb_mapping, const t_timing_inf &timing_inf) {
    
	/* Performs a single forward and backward traversal for the domain pair 
	source_clock_domain and sink_clock_domain. Returns the denominator that
	will be later used to normalize criticality - the maximum of all arrival 
	times from this traversal and the constraint for this pair of domains. 
	Also returns the maximum number of critical input and output paths of any 
	node analysed for this constraint, passed by reference from do_timing_analysis. */

	int inode, num_at_level, i, total, ilevel, num_edges, iedge, to_node;
	float constraint, Tdel, T_req; 
	
	float max_Tarr = HUGE_NEGATIVE_FLOAT; /* Max of all arrival times for this constraint - 
											 used to relax required times for slack_definition 'R' and 'G'
                                             and to normalize slacks for slack_definition 'N'. */

	float max_Treq = HUGE_NEGATIVE_FLOAT; /* Max of all required time for this constraint - 
											 used in criticality denominator. */

    auto& timing_ctx = g_vpr_ctx.mutable_timing();

	t_tedge * tedge;
	int num_dangling_nodes;
	bool found;
	long max_critical_input_paths = 0, max_critical_output_paths = 0;

    /* If not passed in, alloc and load pin_id_to_pb_mapping (and make sure to free later). */
    bool must_free_mapping = false;
    if (pin_id_to_pb_mapping.size() == 0) {
        pin_id_to_pb_mapping = alloc_and_load_pin_id_to_pb_mapping();
        must_free_mapping = true;
    }
    
	/* Reset all values which need to be reset once per 
	traversal pair, rather than once per timing analysis. */

	/* Reset all arrival and required times. */
	for (inode = 0; inode < timing_ctx.num_tnodes; inode++) {
		timing_ctx.tnodes[inode].T_arr = HUGE_NEGATIVE_FLOAT; 
		timing_ctx.tnodes[inode].T_req = HUGE_POSITIVE_FLOAT;
	}

#ifndef PATH_COUNTING
	/* Reset num_critical_output_paths. */
	if (is_prepacked) {
		for (inode = 0; inode < timing_ctx.num_tnodes; inode++) {
			timing_ctx.tnodes[inode].prepacked_data->num_critical_output_paths = 0;
		}
	}
#endif

	/* Set arrival times for each top-level tnode on this source domain. */
	num_at_level = timing_ctx.tnodes_at_level[0].size();	
	for (i = 0; i < num_at_level; i++) {
		inode = timing_ctx.tnodes_at_level[0][i];	

		if (timing_ctx.tnodes[inode].clock_domain == source_clock_domain) {

			if (timing_ctx.tnodes[inode].type == TN_FF_SOURCE) { 
				/* Set the arrival time of this flip-flop tnode to its clock skew. */
				timing_ctx.tnodes[inode].T_arr = timing_ctx.tnodes[inode].clock_delay;

			} else if (timing_ctx.tnodes[inode].type == TN_INPAD_SOURCE) { 
				/* There's no such thing as clock skew for external clocks, and
				input delay is already marked on the edge coming out from this node. 
				As a result, the signal can be said to arrive at t = 0. */
				timing_ctx.tnodes[inode].T_arr = 0.;
			}

		}
	}

	/* Compute arrival times with a forward topological traversal from sources
	(TN_FF_SOURCE, TN_INPAD_SOURCE, TN_CONSTANT_GEN_SOURCE) to sinks (TN_FF_SINK, TN_OUTPAD_SINK). */

	total = 0;												/* We count up all tnodes to error-check at the end. */
	for (ilevel = 0; ilevel < timing_ctx.num_tnode_levels; ilevel++) {	/* For each level of our levelized timing graph... */
		num_at_level = timing_ctx.tnodes_at_level[ilevel].size();		/* ...there are num_at_level tnodes at that level. */
		total += num_at_level;
		
		for (i = 0; i < num_at_level; i++) {					
			inode = timing_ctx.tnodes_at_level[ilevel][i];		/* Go through each of the tnodes at the level we're on. */
			if (timing_ctx.tnodes[inode].T_arr < NEGATIVE_EPSILON) {	/* If the arrival time is less than 0 (i.e. HUGE_NEGATIVE_FLOAT)... */
				continue;									/* End this iteration of the num_at_level for loop since 
															this node is not part of the clock domain we're analyzing. 
															(If it were, it would have received an arrival time already.) */
			}

			num_edges = timing_ctx.tnodes[inode].num_edges;				/* Get the number of edges fanning out from the node we're visiting */
			tedge = timing_ctx.tnodes[inode].out_edges;					/* Get the list of edges from the node we're visiting */
#ifndef PATH_COUNTING		
			if (is_prepacked && ilevel == 0) {
				timing_ctx.tnodes[inode].prepacked_data->num_critical_input_paths = 1;	/* Top-level tnodes have one locally-critical input path. */
			}

			/* Using a somewhat convoluted procedure inherited from T-VPack, 
			count how many locally-critical input paths fan into each tnode,
			and also find the maximum number over all tnodes. */
			if (is_prepacked) {
				for (iedge = 0; iedge < num_edges; iedge++) {		
					to_node = tedge[iedge].to_node;
					if(to_node == DO_NOT_ANALYSE) continue; //Skip marked invalid nodes

					if (fabs(timing_ctx.tnodes[to_node].T_arr - (timing_ctx.tnodes[inode].T_arr + tedge[iedge].Tdel)) < EPSILON) {
						/* If the "local forward slack" (T_arr(to_node) - T_arr(inode) - T_del) for this edge 
						is 0 (i.e. the path from inode to to_node is locally as critical as any other path to
						to_node), add to_node's num critical input paths to inode's number. */
						timing_ctx.tnodes[to_node].prepacked_data->num_critical_input_paths += timing_ctx.tnodes[inode].prepacked_data->num_critical_input_paths;
					} else if (timing_ctx.tnodes[to_node].T_arr < (timing_ctx.tnodes[inode].T_arr + tedge[iedge].Tdel)) {
						/* If the "local forward slack" for this edge is negative,
						reset to_node's num critical input paths to inode's number. */
						timing_ctx.tnodes[to_node].prepacked_data->num_critical_input_paths = timing_ctx.tnodes[inode].prepacked_data->num_critical_input_paths;
					}
					/* Set max_critical_input_paths to the maximum number of critical 
					input paths for all tnodes analysed on this traversal. */
					if (timing_ctx.tnodes[to_node].prepacked_data->num_critical_input_paths	> max_critical_input_paths) {
						max_critical_input_paths = timing_ctx.tnodes[to_node].prepacked_data->num_critical_input_paths;
					}
				}
			}
#endif			
            for (iedge = 0; iedge < num_edges; iedge++) {	/* Now go through each edge coming out from this tnode */
                to_node = tedge[iedge].to_node;				/* Get the index of the destination tnode of this edge. */
                if (to_node == DO_NOT_ANALYSE) continue; //Skip marked invalid nodes

                /* The arrival time T_arr at the destination node is set to the maximum of all
                the possible arrival times from all edges fanning in to the node. The arrival
                time represents the latest time that all inputs must arrive at a node. */
                timing_ctx.tnodes[to_node].T_arr = max(timing_ctx.tnodes[to_node].T_arr, timing_ctx.tnodes[inode].T_arr + tedge[iedge].Tdel);

                if (timing_inf.slack_definition == std::string("R") || timing_inf.slack_definition == std::string("G")) {
                    /* Since we updated the destination node (to_node), change the max arrival  
                    time for the forward traversal if to_node's arrival time is greater than 
                    the existing maximum, and it is on the sink clock domain. */
                    if (timing_ctx.tnodes[to_node].num_edges == 0 && timing_ctx.tnodes[to_node].clock_domain == sink_clock_domain) {
                        max_Tarr = max(max_Tarr, timing_ctx.tnodes[to_node].T_arr);
                    }
                }
			}
		}
	}
	
    auto& atom_ctx = g_vpr_ctx.atom();

	VTR_ASSERT(total == timing_ctx.num_tnodes);
	num_dangling_nodes = 0;
	/* Compute required times with a backward topological traversal from sinks to sources. */
	for (ilevel = timing_ctx.num_tnode_levels - 1; ilevel >= 0; ilevel--) {
		num_at_level = timing_ctx.tnodes_at_level[ilevel].size();
	
		for (i = 0; i < num_at_level; i++) {
			inode = timing_ctx.tnodes_at_level[ilevel][i];
			num_edges = timing_ctx.tnodes[inode].num_edges;
	
			if (ilevel == 0) {
				if (!(timing_ctx.tnodes[inode].type == TN_INPAD_SOURCE || timing_ctx.tnodes[inode].type == TN_FF_SOURCE || timing_ctx.tnodes[inode].type == TN_CONSTANT_GEN_SOURCE ||
                      timing_ctx.tnodes[inode].type == TN_CLOCK_SOURCE) && !timing_ctx.tnodes[inode].is_comb_loop_breakpoint) {
					//We suppress node type errors if they have the is_comb_loop_breakpoint flag set.
					//The flag denotes that an input edge to this node was disconnected to break a combinational
					//loop, and hence we don't consider this an error.
                    AtomPinId pin_id = atom_ctx.lookup.classic_tnode_atom_pin(inode);
                    if(pin_id) {
                        AtomPortId port_id = atom_ctx.nlist.pin_port(pin_id);
                        AtomBlockId blk_id = atom_ctx.nlist.pin_block(pin_id);
                        vpr_throw(VPR_ERROR_TIMING,__FILE__, __LINE__, 
                                "Timing graph discovered unexpected edge to node %d  atom block '%s' port '%s' port_bit '%zu'.",
                                inode,
                                atom_ctx.nlist.block_name(blk_id).c_str(),
                                atom_ctx.nlist.port_name(port_id).c_str(),
                                atom_ctx.nlist.pin_port_bit(pin_id));
                    } else if(timing_ctx.tnodes[inode].pb_graph_pin) {
                        vpr_throw(VPR_ERROR_TIMING, __FILE__, __LINE__, 
                                "Timing graph started on unexpected node %d %s.%s[%d].",
                                inode,
                                timing_ctx.tnodes[inode].pb_graph_pin->parent_node->pb_type->name, 
                                timing_ctx.tnodes[inode].pb_graph_pin->port->name, 
                                timing_ctx.tnodes[inode].pb_graph_pin->pin_number);
                    } else {
                        vpr_throw(VPR_ERROR_TIMING, __FILE__, __LINE__, 
                                "Timing graph started on unexpected node %d.",
                                inode);
                    }
				}
			} else {
				if ((timing_ctx.tnodes[inode].type == TN_INPAD_SOURCE || timing_ctx.tnodes[inode].type == TN_FF_SOURCE || timing_ctx.tnodes[inode].type == TN_CONSTANT_GEN_SOURCE)) {
                    AtomPinId pin_id = atom_ctx.lookup.classic_tnode_atom_pin(inode);
                    if(pin_id) {
                        AtomPortId port_id = atom_ctx.nlist.pin_port(pin_id);
                        AtomBlockId blk_id = atom_ctx.nlist.pin_block(pin_id);
                        vpr_throw(VPR_ERROR_TIMING,__FILE__, __LINE__, 
                                "Timing graph discovered unexpected edge to node %d  atom block '%s' port '%s' port_bit '%zu'.",
                                inode,
                                atom_ctx.nlist.block_name(blk_id).c_str(),
                                atom_ctx.nlist.port_name(port_id).c_str(),
                                atom_ctx.nlist.pin_port_bit(pin_id));
                    } else if(timing_ctx.tnodes[inode].pb_graph_pin) {
                        vpr_throw(VPR_ERROR_TIMING,__FILE__, __LINE__, 
                                "Timing graph discovered unexpected edge to node %d %s.%s[%d].",
                                inode,
                                timing_ctx.tnodes[inode].pb_graph_pin->parent_node->pb_type->name, 
                                timing_ctx.tnodes[inode].pb_graph_pin->port->name, 
                                timing_ctx.tnodes[inode].pb_graph_pin->pin_number);
                    } else {
                        vpr_throw(VPR_ERROR_TIMING,__FILE__, __LINE__, 
                                "Timing graph discovered unexpected edge to node %d.",
                                inode);
                    }
				}
			}
	
			/* Unlike the forward traversal, the sinks are all on different levels, so we always have to
			check whether a node is a sink. We give every sink on the sink clock domain we're considering
			a valid required time. Every non-sink node in the fanin of one of these sinks and the fanout of
			some source from the forward traversal also gets a valid required time. */
			
			if (num_edges == 0) { /* sink */

				if (timing_ctx.tnodes[inode].type == TN_FF_CLOCK || timing_ctx.tnodes[inode].T_arr < HUGE_NEGATIVE_FLOAT + 1) {
					continue; /* Skip nodes on the clock net itself, and nodes with unset arrival times. */
				}
	
				if (!(timing_ctx.tnodes[inode].type == TN_OUTPAD_SINK || timing_ctx.tnodes[inode].type == TN_FF_SINK)) {
					if(is_prepacked) {
                        AtomPinId pin_id = atom_ctx.lookup.classic_tnode_atom_pin(inode);
                        VTR_ASSERT(pin_id);
                        AtomBlockId blk_id = atom_ctx.nlist.pin_block(pin_id);
						vtr::printf_warning(__FILE__, __LINE__, 
								"Pin on block %s.%s[%d] not used\n", 
                                atom_ctx.nlist.block_name(blk_id).c_str(),
								timing_ctx.tnodes[inode].prepacked_data->model_port_ptr->name, 
								timing_ctx.tnodes[inode].prepacked_data->model_pin);
					}
					num_dangling_nodes++;
					/* Note: Still need to do standard traversals with dangling pins so that algorithm runs properly, but T_arr and T_Req to values such that it dangling nodes do not affect actual timing values */
				}
		
				/* Skip nodes not on the sink clock domain of the 
				constraint we're currently considering */
				if (timing_ctx.tnodes[inode].clock_domain != sink_clock_domain) { 
					continue;
				}
	
				/* See if there's an override constraint between the source clock domain (name is 
				timing_ctx.sdc->constrained_clocks[source_clock_domain].name) and the flip-flop or outpad we're at 
				now (name is find_tnode_net_name(inode, is_prepacked)). We test if 
				timing_ctx.sdc->num_cf_constraints > 0 first so that we can save time looking up names in the vast 
				majority of cases where there are no such constraints. */

				if (timing_ctx.sdc->num_cf_constraints > 0) {
					char *source_domain_name = timing_ctx.sdc->constrained_clocks[source_clock_domain].name;
					const char *sink_register_name = find_tnode_net_name(inode, is_prepacked, pin_id_to_pb_mapping);
					int icf = find_cf_constraint(source_domain_name, sink_register_name);
					if (icf != DO_NOT_ANALYSE) {
						constraint = timing_ctx.sdc->cf_constraints[icf].constraint;
						if (constraint < NEGATIVE_EPSILON) { 
							/* Constraint is DO_NOT_ANALYSE (-1) for this particular sink. */
							continue;
						}
					} else {
						/* Use the default constraint from timing_ctx.sdc->domain_constraint. */
						constraint = timing_ctx.sdc->domain_constraint[source_clock_domain][sink_clock_domain];
						/* Constraint is guaranteed to be valid since we checked for it at the very beginning. */
					}
				} else { 
					constraint = timing_ctx.sdc->domain_constraint[source_clock_domain][sink_clock_domain];
				}
	
				/* Now we know we should analyse this tnode. */
	
                if (timing_inf.slack_definition == std::string("R") || timing_inf.slack_definition == std::string("G")) {
				    /* Assign the required time T_req for this leaf node, taking into account clock skew. T_req is the 
				    time all inputs to a tnode must arrive by before it would degrade this constraint's critical path delay. 

				    Relax the required time at the sink node to be non-negative by taking the max of the "real" required 
				    time (constraint + timing_ctx.tnodes[inode].clock_delay) and the max arrival time in this domain (max_Tarr), except
				    for the final analysis where we report actual slack. We do this to prevent any slacks from being 
				    negative, since negative slacks are not used effectively by the optimizers.

				    E.g. if we have a 10 ns constraint and it takes 14 ns to get here, we'll have a slack of at most -4 ns 
				    for any edge along the path that got us here.  If we say the required time is 14 ns (no less than the 
				    arrival time), we don't have a negative slack anymore.  However, in the final timing analysis, the real 
				    slacks are computed (that's what human designers care about), not the relaxed ones. */	
	
				    if (is_final_analysis) {
					    timing_ctx.tnodes[inode].T_req = constraint + timing_ctx.tnodes[inode].clock_delay;
				    } else {
					    timing_ctx.tnodes[inode].T_req = max(constraint + timing_ctx.tnodes[inode].clock_delay, max_Tarr);
				    }
                } else {
					/* Don't do the relaxation and always set T_req equal to the "real" required time. */
				    timing_ctx.tnodes[inode].T_req = constraint + timing_ctx.tnodes[inode].clock_delay;
                }

				max_Treq = max(max_Treq, timing_ctx.tnodes[inode].T_req);
							
				/* Store the largest critical path delay for this constraint (source domain AND sink domain) 
				in the matrix critical_path_delay. C.P.D. = T_arr at destination - clock skew at destination 
				= (datapath delay + clock delay to source) - clock delay to destination.

				Critical path delay is really telling us how fast we can run the source clock before we can no
				longer meet this constraint.  e.g. If the datapath delay is 10 ns, the clock delay at source is
				2 ns and the clock delay at destination is 5 ns, then C.P.D. is 7 ns by the above formula. We 
				can run the source clock at 7 ns because the clock skew gives us 3 ns extra to meet the 10 ns 
				datapath delay. */

				f_timing_stats->cpd[source_clock_domain][sink_clock_domain] = 
					max(f_timing_stats->cpd[source_clock_domain][sink_clock_domain], 
					   (timing_ctx.tnodes[inode].T_arr - timing_ctx.tnodes[inode].clock_delay)); 

#ifndef PATH_COUNTING
				if (is_prepacked) {
					timing_ctx.tnodes[inode].prepacked_data->num_critical_output_paths = 1; /* Bottom-level tnodes have one locally-critical input path. */
				}
#endif
			} else { /* not a sink */

				VTR_ASSERT(!(timing_ctx.tnodes[inode].type == TN_OUTPAD_SINK || timing_ctx.tnodes[inode].type == TN_FF_SINK || timing_ctx.tnodes[inode].type == TN_FF_CLOCK));

				/* We need to skip this node unless it is on a path from source_clock_domain to 
				sink_clock_domain.  We need to skip all nodes which:
				   1. Fan out to the sink domain but do not fan in from the source domain. 
				   2. Fan in from the source domain but do not fan out to the sink domain.
				   3. Do not fan in or out to either domain. 
				If a node does not fan in from the source domain, it will not have a valid arrival time.  
				So cases 1 and 3 can be skipped by continuing if T_arr = HUGE_NEGATIVE_FLOAT. We cannot 
				treat case 2 as simply since the required time for this node has not yet been assigned, 
				so we have to look at the required time for every node in its immediate fanout instead. */

				/* Cases 1 and 3 */
				if (timing_ctx.tnodes[inode].T_arr < HUGE_NEGATIVE_FLOAT + 1) { 
					continue; /* Skip nodes with unset arrival times. */
				}
				
				/* Case 2 */
				found = false;
				tedge = timing_ctx.tnodes[inode].out_edges;
				for (iedge = 0; iedge < num_edges && !found; iedge++) { 
					to_node = tedge[iedge].to_node;
					if(to_node == DO_NOT_ANALYSE) continue; //Skip marked invalid nodes
					
					if (timing_ctx.tnodes[to_node].T_req < HUGE_POSITIVE_FLOAT) {
					    found = true;
					}
				}
				if (!found) {
					continue;
				}

				/* Now we know this node is on a path from source_clock_domain to 
				sink_clock_domain, and needs to be analyzed. */

				/* Opposite to T_arr, set T_req to the MINIMUM of the 
				required times of all edges fanning OUT from this node. */
				for (iedge = 0; iedge < num_edges; iedge++) {
					to_node = tedge[iedge].to_node;
					if(to_node == DO_NOT_ANALYSE) continue; //Skip marked invalid nodes
					
					Tdel = tedge[iedge].Tdel;
					T_req = timing_ctx.tnodes[to_node].T_req;
					timing_ctx.tnodes[inode].T_req = min(timing_ctx.tnodes[inode].T_req, T_req - Tdel);

					/* Update least slack per constraint. This is NOT the same as the minimum slack we will
					calculate on this traversal for post-packed netlists, which only count inter-cluster 
					slacks. We only look at edges adjacent to sink nodes on the sink clock domain since
					all paths go through one of these edges. */
					if (timing_ctx.tnodes[to_node].num_edges == 0 && timing_ctx.tnodes[to_node].clock_domain == sink_clock_domain) {
					    f_timing_stats->least_slack[source_clock_domain][sink_clock_domain] = 
					        min(f_timing_stats->least_slack[source_clock_domain][sink_clock_domain],
					           (T_req - Tdel - timing_ctx.tnodes[inode].T_arr)); 
					}
				}
#ifndef PATH_COUNTING

				/* Similar to before, we count how many locally-critical output paths fan out from each tnode, 
				and also find the maximum number over all tnodes. Unlike for input paths, where we haven't set
				the arrival time at to_node before analysing it, here the required time is set at both nodes,
				so the "local backward slack" (T_req(to_node) - T_req(inode) - T_del) will never be negative.  
				Hence, we only have to test if the "local backward slack" is 0. */
				if (is_prepacked) {
					for (iedge = 0; iedge < num_edges; iedge++) { 
						to_node = tedge[iedge].to_node;
						if(to_node == DO_NOT_ANALYSE) continue; //Skip marked invalid nodes
						
						/* If the "local backward slack" (T_arr(to_node) - T_arr(inode) - T_del) for this edge 
						is 0 (i.e. the path from inode to to_node is locally as critical as any other path to
						to_node), add to_node's num critical output paths to inode's number. */
						if (fabs(timing_ctx.tnodes[to_node].T_req - (timing_ctx.tnodes[inode].T_req + tedge[iedge].Tdel)) < EPSILON) {
						    timing_ctx.tnodes[inode].prepacked_data->num_critical_output_paths += timing_ctx.tnodes[to_node].prepacked_data->num_critical_output_paths;
						}
						/* Set max_critical_output_paths to the maximum number of critical 
						output paths for all tnodes analysed on this traversal. */
						if (timing_ctx.tnodes[to_node].prepacked_data->num_critical_output_paths > max_critical_output_paths) {
						    max_critical_output_paths = timing_ctx.tnodes[to_node].prepacked_data->num_critical_output_paths;
						}
					}
				}
#endif
			}
		}
	}

    if (must_free_mapping) {
        free_pin_id_to_pb_mapping(pin_id_to_pb_mapping);
    }

	/* Return max critical input/output paths for this constraint through 
	the pointers we passed in. */
	if (max_critical_input_paths_ptr && max_critical_output_paths_ptr) {
		*max_critical_input_paths_ptr = max_critical_input_paths;
		*max_critical_output_paths_ptr = max_critical_output_paths;
	}

	if(num_dangling_nodes > 0 && (is_final_analysis || is_prepacked)) {
		vtr::printf_warning(__FILE__, __LINE__, 
				"%d unused pins \n",  num_dangling_nodes);
	}

	/* The criticality denominator is the maximum required time, except for slack_definition == 'N'
	where it is the max of all arrival and required times.

	For definitions except 'R' and 'N', this works out to the maximum of constraint + 
	timing_ctx.tnodes[inode].clock_delay over all nodes.  For 'R' and 'N', this works out to the maximum of
	that value and max_Tarr.  The max_Tarr is implicitly incorporated into the denominator through
	its inclusion in the required time, but we have to explicitly include it for 'N'. */
    if (timing_inf.slack_definition == std::string("N")) {
        return max_Treq + max_Tarr;
    } else {
        return max_Treq;
    }
}
#ifdef PATH_COUNTING
static void do_path_counting(float criticality_denom) {
	/* Count the importance of the number of paths going through each net 
	by giving each net a forward and backward path weight. This is the first step of
	"A Novel Net Weighting Algorithm for Timing-Driven Placement" (Kong, 2002). 
	We only visit nodes with set arrival and required times, so this function 
	must be called after do_timing_analysis_for_constraints, which sets T_arr and T_req. */
	
	int inode, num_at_level, i, ilevel, num_edges, iedge, to_node;
	t_tedge * tedge;
	float forward_local_slack, backward_local_slack, discount;

	/* Reset forward and backward weights for all tnodes. */
	for (inode = 0; inode < timing_ctx.num_tnodes; inode++) {
		timing_ctx.tnodes[inode].forward_weight = 0;
		timing_ctx.tnodes[inode].backward_weight = 0;
	}

	/* Set foward weights for each top-level tnode. */
	num_at_level = timing_ctx.tnodes_at_level[0].size();	
	for (i = 0; i < num_at_level; i++) {
		inode = timing_ctx.tnodes_at_level[0][i];	
		timing_ctx.tnodes[inode].forward_weight = 1.;
	}

	/* Do a forward topological traversal to populate forward weights. */
	for (ilevel = 0; ilevel < timing_ctx.num_tnode_levels; ilevel++) {	
		num_at_level = timing_ctx.tnodes_at_level[ilevel].size();			
		
		for (i = 0; i < num_at_level; i++) {					
			inode = timing_ctx.tnodes_at_level[ilevel][i];			
			if (!(has_valid_T_arr(inode) && has_valid_T_req(inode))) {
				continue;	
			}
			tedge = timing_ctx.tnodes[inode].out_edges;
			num_edges = timing_ctx.tnodes[inode].num_edges;
			for (iedge = 0; iedge < num_edges; iedge++) {
				to_node = tedge[iedge].to_node;
				if(to_node == DO_NOT_ANALYSE) continue; //Skip marked invalid nodes
				
				if (!(has_valid_T_arr(to_node) && has_valid_T_req(to_node))) {
				    continue;	
				}
				forward_local_slack = timing_ctx.tnodes[to_node].T_arr - timing_ctx.tnodes[inode].T_arr - tedge[iedge].Tdel;
				discount = pow((float) DISCOUNT_FUNCTION_BASE, -1 * forward_local_slack / criticality_denom);
				timing_ctx.tnodes[to_node].forward_weight += discount * timing_ctx.tnodes[inode].forward_weight;
			}
		}
	}

	/* Do a backward topological traversal to populate backward weights. 
	Since the sinks are all on different levels, we have to check for them as we go. */
	for (ilevel = timing_ctx.num_tnode_levels - 1; ilevel >= 0; ilevel--) {
		num_at_level = timing_ctx.tnodes_at_level[ilevel].size();
	
		for (i = 0; i < num_at_level; i++) {
			inode = timing_ctx.tnodes_at_level[ilevel][i];
			if (!(has_valid_T_arr(inode) && has_valid_T_req(inode))) {
				continue;	
			}
			num_edges = timing_ctx.tnodes[inode].num_edges;
			if (num_edges == 0) { /* sink */
				timing_ctx.tnodes[inode].backward_weight = 1.;
			} else {
				tedge = timing_ctx.tnodes[inode].out_edges;
				for (iedge = 0; iedge < num_edges; iedge++) {
					to_node = tedge[iedge].to_node;
					if(to_node == DO_NOT_ANALYSE) continue; //Skip marked invalid nodes
					if (!(has_valid_T_arr(to_node) && has_valid_T_req(to_node))) {
					    continue;	
					}
					backward_local_slack = timing_ctx.tnodes[to_node].T_req - timing_ctx.tnodes[inode].T_req - tedge[iedge].Tdel;
					discount = pow((float) DISCOUNT_FUNCTION_BASE, -1 * backward_local_slack / criticality_denom);
					timing_ctx.tnodes[inode].backward_weight += discount * timing_ctx.tnodes[to_node].backward_weight;
				}
			}
		}
	}
}
#endif

static void update_slacks(t_slack * slacks, float criticality_denom,
    bool update_slack, bool is_final_analysis, float smallest_slack_in_design, const t_timing_inf &timing_inf) {

	/* Updates the slack and criticality of each sink pin, or equivalently 
	each edge, of each net. Go through the list of nets. If the net's 
	driver tnode has been used,	go through each tedge of that tnode and 
	take the minimum of the slack/criticality for this traversal and the 
	existing values. Since the criticality_denom can vary greatly between 
	traversals, we have to update slack and criticality separately. 
	Only update slack if we need to print it later (update_slack == true). 
	
	Note: there is a correspondence in indexing between out_edges and the 
	net data structure: out_edges[iedge] = net[inet].node_block[iedge + 1]
	There is an offset of 1 because net[inet].node_block includes the driver
	node at index 0, while out_edges is part of the driver node and does
	not bother to refer to itself. */

	int iedge, inode, to_node, num_edges;
	t_tedge *tedge;
	float T_arr, Tdel, T_req, slack;
	float timing_criticality;

    auto& timing_ctx = g_vpr_ctx.timing();

	for (size_t inet = 0; inet < num_timing_nets(); inet++) {
		inode = f_net_to_driver_tnode[inet];
		T_arr = timing_ctx.tnodes[inode].T_arr;

		if (!(has_valid_T_arr(inode) && has_valid_T_req(inode))) {
			continue; /* Only update this net on this traversal if its 
					  driver node has been updated on this traversal. */
		}

		num_edges = timing_ctx.tnodes[inode].num_edges;
		tedge = timing_ctx.tnodes[inode].out_edges;

        VTR_ASSERT_MSG(static_cast<size_t>(num_edges) == num_timing_net_sinks(inet), "Number of tnode edges and net sinks do not match");

		for (iedge = 0; iedge < num_edges; iedge++) {
			to_node = tedge[iedge].to_node;
			if(to_node == DO_NOT_ANALYSE) continue; //Skip marked invalid nodes

			if (!(has_valid_T_arr(to_node) && has_valid_T_req(to_node))) {
				continue; /* Only update this edge on this traversal if this 
						  particular sink node has been updated on this traversal. */
			}
			Tdel = tedge[iedge].Tdel;
			T_req = timing_ctx.tnodes[to_node].T_req;

			slack = T_req - T_arr - Tdel;

			if (!is_final_analysis) {
                if (timing_inf.slack_definition == std::string("I")) {
                    /* Shift slack UPWARDS by subtracting the smallest slack in the
                    design (which is negative or zero). */
                    slack -= smallest_slack_in_design;
                } else if (timing_inf.slack_definition == std::string("C")) {
				    /* Clip all negative slacks to 0. */
				    if (slack < 0) slack = 0;
                }
			}
			
			if (update_slack) {
				/* Update the slack for this edge if slk is the new minimum value */		
				slacks->slack[inet][iedge + 1] = min(slack, slacks->slack[inet][iedge + 1]);
			}

            if (timing_inf.slack_definition != std::string("S") && timing_inf.slack_definition != std::string("G")) {
                if (!is_final_analysis) { // Criticality is not meaningful using non-normalized slacks.

                    /* Since criticality_denom is not the same on each traversal,
                    we have to update criticality separately. */

                    if (timing_inf.slack_definition == std::string("C")) {
                        /* For clipped, criticality_denom is the raw maximum required time, and this can
                        be 0 if the constraint was 0, leading to division by 0.  In this case, all of the
                        slacks will be clipped to zero anyways, so we can just set the criticality to 1. */
                        timing_criticality = criticality_denom ? 1 - slack / criticality_denom : 1;
                    } else {
                        // VTR_ASSERT(criticality_denom);
                        timing_criticality = 1 - slack / criticality_denom;
                    }

                    // Criticality must be normalized to between 0 and 1 
                    // Note: floating-point error may be ~1e-5 since we are dividing by a small
                    // criticality_denom (~1e-9).
                    VTR_ASSERT(timing_criticality > -0.01);
                    VTR_ASSERT(timing_criticality <  1.01);

                    slacks->timing_criticality[inet][iedge + 1] =
                        max(timing_criticality, slacks->timing_criticality[inet][iedge + 1]);

#ifdef PATH_COUNTING
                    /* Also update path criticality separately.  Kong uses slack / T_crit for the exponent, 
                    which is equivalent to criticality - 1.  Depending on how PATH_COUNTING is defined,
                    different functional forms are used. */
#if PATH_COUNTING == 'S' /* Use sum of forward and backward weights. */
                    slacks->path_criticality[inet][iedge + 1] = max(slacks->path_criticality[inet][iedge + 1],
                        (timing_ctx.tnodes[inode].forward_weight + timing_ctx.tnodes[to_node].backward_weight) * 
                        pow((float) FINAL_DISCOUNT_FUNCTION_BASE, timing_criticality - 1));
#elif PATH_COUNTING == 'P' /* Use product of forward and backward weights. */
                    slacks->path_criticality[inet][iedge + 1] = max(slacks->path_criticality[inet][iedge + 1],
                        timing_ctx.tnodes[inode].forward_weight * timing_ctx.tnodes[to_node].backward_weight * 
                        pow((float) FINAL_DISCOUNT_FUNCTION_BASE, timing_criticality - 1));
#elif PATH_COUNTING == 'L' /* Use natural log of product of forward and backward weights. */
                    slacks->path_criticality[inet][iedge + 1] = max(slacks->path_criticality[inet][iedge + 1], 
                        log(timing_ctx.tnodes[inode].forward_weight * timing_ctx.tnodes[to_node].backward_weight) * 
                        pow((float) FINAL_DISCOUNT_FUNCTION_BASE, timing_criticality - 1));
#elif PATH_COUNTING == 'R' /* Use product of natural logs of forward and backward weights. */
                    slacks->path_criticality[inet][iedge + 1] = max(slacks->path_criticality[inet][iedge + 1], 
                        log(timing_ctx.tnodes[inode].forward_weight) * log(timing_ctx.tnodes[to_node].backward_weight) * 
                        pow((float) FINAL_DISCOUNT_FUNCTION_BASE, timing_criticality - 1));
#endif				
#endif
                }
            }
		}
	}
}


void print_critical_path(const char *fname, const t_timing_inf &timing_inf) {

	/* Prints the critical path to a file. */

	vtr::t_linked_int *critical_path_head, *critical_path_node;
	FILE *fp;
	int nets_on_crit_path, tnodes_on_crit_path, inode;
	e_tnode_type type;
	float total_net_delay, total_logic_delay, Tdel;

    auto& timing_ctx = g_vpr_ctx.timing();

	vtr::vector_map<ClusterBlockId, t_pb **> pin_id_to_pb_mapping = alloc_and_load_pin_id_to_pb_mapping();

	critical_path_head = allocate_and_load_critical_path(timing_inf);
	critical_path_node = critical_path_head;

	fp = vtr::fopen(fname, "w");

	nets_on_crit_path = 0;
	tnodes_on_crit_path = 0;
	total_net_delay = 0.;
	total_logic_delay = 0.;

	while (critical_path_node != nullptr) {
		Tdel = print_critical_path_node(fp, critical_path_node, pin_id_to_pb_mapping);
		inode = critical_path_node->data;
		type = timing_ctx.tnodes[inode].type;
		tnodes_on_crit_path++;

		if (type == TN_CB_OPIN) {
            nets_on_crit_path++;

			total_net_delay += Tdel;
		} else {
			total_logic_delay += Tdel;
		}

		critical_path_node = critical_path_node->next;
	}

	fprintf(fp, "\nTnodes on critical path: %d  Nets on critical path: %d."
			"\n", tnodes_on_crit_path, nets_on_crit_path);
	fprintf(fp, "Total logic delay: %g (s)  Total net delay: %g (s)\n",
			total_logic_delay, total_net_delay);

	vtr::printf_info("Nets on critical path: %d normal.\n",
			nets_on_crit_path);

	vtr::printf_info("Total logic delay: %g (s), total net delay: %g (s)\n",
			total_logic_delay, total_net_delay);

	/* Make sure total_logic_delay and total_net_delay add 
	up to critical path delay,within 5 decimal places. */
	VTR_ASSERT(std::isnan(get_critical_path_delay()) || total_logic_delay + total_net_delay - get_critical_path_delay()/1e9 < 1e-5);

	fclose(fp);
	free_pin_id_to_pb_mapping(pin_id_to_pb_mapping);
	free_int_list(&critical_path_head);
}

vtr::t_linked_int * allocate_and_load_critical_path(const t_timing_inf &timing_inf) {

	/* Finds the critical path and returns a list of the tnodes on the critical *
	 * path in a linked list, from the path SOURCE to the path SINK.			*/

	vtr::t_linked_int *critical_path_head, *curr_crit_node, *prev_crit_node;
	int inode, iedge, to_node, num_at_level_zero, i, j, crit_node = OPEN, num_edges;
	int source_clock_domain = UNDEFINED, sink_clock_domain = UNDEFINED;
	float min_slack = HUGE_POSITIVE_FLOAT, slack;
	t_tedge *tedge;
	vtr::vector_map<ClusterBlockId, t_pb **> empty_pin_id_to_pb_mapping; //Empty vector_map for do_timing_analysis_for_constraint

    auto& timing_ctx = g_vpr_ctx.timing();

	/* If there's only one clock, we can use the arrival and required times 
	currently on the timing graph to find the critical path. If there are multiple 
	clocks, however, the values currently on the timing graph correspond to the 
	last constraint (pair of clock domains) analysed, which may not be the constraint 
	with the critical path.	In this case, we have to find the constraint with the 
	least slack and redo the timing analysis for this constraint so we get the right
	values onto the timing graph. */

	if (timing_ctx.sdc->num_constrained_clocks > 1) {
		/* The critical path belongs to the source and sink clock domains 
		with the least slack. Find these clock domains now. */

		for (i = 0; i < timing_ctx.sdc->num_constrained_clocks; i++) {
			for (j = 0; j < timing_ctx.sdc->num_constrained_clocks; j++) {
				// Use the true, unrelaxed, least slack (constraint - critical path delay).
				slack = timing_ctx.sdc->domain_constraint[i][j] - f_timing_stats->cpd[i][j];
				if (slack < min_slack) {
					min_slack = slack;
					source_clock_domain = i;
					sink_clock_domain = j;
				}
			}
		}

		/* Do a timing analysis for this clock domain pair only. 
		Set is_prepacked to false since we don't care about the clusterer's normalized values. 
		Set is_final_analysis to false to get actual, rather than relaxed, slacks.
		Set max critical input/output paths to NULL since they aren't used unless is_prepacked is true. */
		do_timing_analysis_for_constraint(source_clock_domain, sink_clock_domain, false, false, nullptr, nullptr, empty_pin_id_to_pb_mapping, timing_inf);
	}

	/* Start at the source (level-0) tnode with the least slack (T_req-T_arr). 
	This will form the head of our linked list of tnodes on the critical path. */
	min_slack = HUGE_POSITIVE_FLOAT;
	num_at_level_zero = timing_ctx.tnodes_at_level[0].size();
	for (i = 0; i < num_at_level_zero; i++) { 
		inode = timing_ctx.tnodes_at_level[0][i];
		if (has_valid_T_arr(inode) && has_valid_T_req(inode)) { /* Valid arrival and required times */
			slack = timing_ctx.tnodes[inode].T_req - timing_ctx.tnodes[inode].T_arr;
			if (slack < min_slack) {
				crit_node = inode;
				min_slack = slack;
			}
		}
	}
	critical_path_head = (vtr::t_linked_int *) vtr::malloc(sizeof(vtr::t_linked_int));
	critical_path_head->data = crit_node;
	VTR_ASSERT(crit_node != OPEN);
	prev_crit_node = critical_path_head;
	num_edges = timing_ctx.tnodes[crit_node].num_edges;

	/* Keep adding the tnode in this tnode's fanout which has the least slack
	to our critical path linked list, then jump to that tnode and repeat, until
	we hit a tnode with no edges, which is the sink of the critical path. */
	while (num_edges != 0) { 
		curr_crit_node = (vtr::t_linked_int *) vtr::malloc(sizeof(vtr::t_linked_int));
		prev_crit_node->next = curr_crit_node;
		tedge = timing_ctx.tnodes[crit_node].out_edges;
		min_slack = HUGE_POSITIVE_FLOAT;

		for (iedge = 0; iedge < num_edges; iedge++) {
			to_node = tedge[iedge].to_node;
			if(to_node == DO_NOT_ANALYSE) continue; //Skip marked invalid nodes

			if (has_valid_T_arr(to_node) && has_valid_T_req(to_node)) { /* Valid arrival and required times */
				slack = timing_ctx.tnodes[to_node].T_req - timing_ctx.tnodes[to_node].T_arr;
				if (slack < min_slack) {
					crit_node = to_node;
					min_slack = slack;
				}
			}
		}

		curr_crit_node->data = crit_node;
		prev_crit_node = curr_crit_node;
		num_edges = timing_ctx.tnodes[crit_node].num_edges;
	}

	prev_crit_node->next = nullptr;
	return (critical_path_head);
}

#ifndef PATH_COUNTING
static void update_normalized_costs(float criticality_denom, long max_critical_input_paths,
    long max_critical_output_paths, const t_timing_inf &timing_inf) {
    int inode;

    /* Update the normalized costs for the clusterer.  On each traversal, each cost is
    updated for tnodes analysed on this traversal if it would give this tnode a higher
    criticality when calculating block criticality for the clusterer. */

    if (timing_inf.slack_definition == std::string("R") || timing_inf.slack_definition == std::string("I")) {
        /*VTR_ASSERT(criticality_denom != 0); */
        /* Possible if timing analysis is being run pre-packing
                                        with all delays set to 0. This is not currently done, 
                                        but if you're going to do it, you need to decide how 
                                        best to normalize these values to suit your purposes. */
    }

    auto& timing_ctx = g_vpr_ctx.mutable_timing();

	for (inode = 0; inode < timing_ctx.num_tnodes; inode++) {
		/* Only calculate for tnodes which have valid arrival and required times. */
		if (has_valid_T_arr(inode) && has_valid_T_req(inode)) {
			timing_ctx.tnodes[inode].prepacked_data->normalized_slack = min(timing_ctx.tnodes[inode].prepacked_data->normalized_slack, 
				(timing_ctx.tnodes[inode].T_req - timing_ctx.tnodes[inode].T_arr)/criticality_denom);
			timing_ctx.tnodes[inode].prepacked_data->normalized_T_arr = max(timing_ctx.tnodes[inode].prepacked_data->normalized_T_arr, 
				timing_ctx.tnodes[inode].T_arr/criticality_denom);
			timing_ctx.tnodes[inode].prepacked_data->normalized_total_critical_paths = max(timing_ctx.tnodes[inode].prepacked_data->normalized_total_critical_paths, 
					((float) timing_ctx.tnodes[inode].prepacked_data->num_critical_input_paths + timing_ctx.tnodes[inode].prepacked_data->num_critical_output_paths) /
							 ((float) max_critical_input_paths + max_critical_output_paths));
		}
	}
}
#endif


static void load_clock_domain_and_clock_and_io_delay(bool is_prepacked, vtr::vector_map<ClusterBlockId, std::vector<int>> &lookup_tnode_from_pin_id, vtr::vector_map<ClusterBlockId, t_pb **> &pin_id_to_pb_mapping) {
/* Loads clock domain and clock delay onto TN_FF_SOURCE and TN_FF_SINK tnodes.
The clock domain of each clock is its index in timing_ctx.sdc->constrained_clocks.
We do this by matching each clock input pad (TN_INPAD_SOURCE), or internal clock 
source (TN_CLOCK_SOURCE) to a constrained clock name, then propagating forward its 
domain index to all flip-flops fed by it (TN_FF_CLOCK tnodes), then later looking 
up the TN_FF_CLOCK tnode corresponding to every TN_FF_SOURCE and TN_FF_SINK tnode. 
We also add up the delays along the clock net to each TN_FF_CLOCK tnode to give it 
(and the SOURCE/SINK nodes) a clock delay.

Also loads input delay/output delay (from set_input_delay or set_output_delay SDC 
constraints) onto the tedges between TN_INPAD_SOURCE/OPIN and TN_OUTPAD_IPIN/SINK 
tnodes.  Finds fanout of each clock domain, including virtual (external) clocks.  
Marks unconstrained I/Os with a dummy clock domain (-1). */

	int i, iclock, inode, num_at_level, clock_index, input_index, output_index;
	const char * net_name;
	t_tnode * clock_node;

    auto& timing_ctx = g_vpr_ctx.timing();

	/* Wipe fanout of each clock domain in timing_ctx.sdc->constrained_clocks. */
	for (iclock = 0; iclock < timing_ctx.sdc->num_constrained_clocks; iclock++) {
		timing_ctx.sdc->constrained_clocks[iclock].fanout = 0;
	}

	/* First, visit all TN_INPAD_SOURCE and TN_CLOCK_SOURCE tnodes 
     * We only need to check the first level of the timing graph, since all SOURCEs should appear there*/
    if(!timing_ctx.tnodes_at_level.empty()) {
        num_at_level = timing_ctx.tnodes_at_level[0].size(); /* There are num_at_level top-level tnodes. */
    } else {
        num_at_level = 0;
    }
    for(i = 0; i < num_at_level; i++) {
        inode = timing_ctx.tnodes_at_level[0][i];	/* Iterate through each tnode. inode is the index of the tnode in the array tnode. */
		if (timing_ctx.tnodes[inode].type == TN_INPAD_SOURCE || timing_ctx.tnodes[inode].type == TN_CLOCK_SOURCE) {	/* See if this node is the start of an I/O pad, or a clock source. */			
			net_name = find_tnode_net_name(inode, is_prepacked, pin_id_to_pb_mapping);
			if ((clock_index = find_clock(net_name)) != -1) { /* We have a clock inpad or clock source. */
				/* Set clock skew to 0 at the source and propagate skew 
				recursively to all connected nodes, adding delay as we go. 
				Set the clock domain to the index of the clock in the
				timing_ctx.sdc->constrained_clocks array and propagate unchanged. */
				timing_ctx.tnodes[inode].clock_delay = 0.;
				timing_ctx.tnodes[inode].clock_domain = clock_index;
				propagate_clock_domain_and_skew(inode);

				/* Set the clock domain of this clock inpad to -1, so that we do not analyse it.  
				If we did not do this, the clock net would be analysed on the same iteration of 
				the timing analyzer as the flip-flops it drives! */
				timing_ctx.tnodes[inode].clock_domain = DO_NOT_ANALYSE;

			} else if (timing_ctx.tnodes[inode].type == TN_INPAD_SOURCE && (input_index = find_input(net_name)) != -1) {
				/* We have a constrained non-clock inpad - find the clock it's constrained on. */
				clock_index = find_clock(timing_ctx.sdc->constrained_inputs[input_index].clock_name);
				VTR_ASSERT(clock_index != -1);
				/* The clock domain for this input is that of its virtual clock */
				timing_ctx.tnodes[inode].clock_domain = clock_index;
				/* Increment the fanout of this virtual clock domain. */
				timing_ctx.sdc->constrained_clocks[clock_index].fanout++;
				/* Mark input delay specified in SDC file on the timing graph edge leading out from the TN_INPAD_SOURCE node. */
				timing_ctx.tnodes[inode].out_edges[0].Tdel = timing_ctx.sdc->constrained_inputs[input_index].delay * 1e-9; /* normalize to be in seconds not ns */
			} else { /* We have an unconstrained input - mark with dummy clock domain and do not analyze. */
				timing_ctx.tnodes[inode].clock_domain = DO_NOT_ANALYSE;
			}
		}
	}	

    /* Second, visit all TN_OUTPAD_SINK tnodes. Unlike for TN_INPAD_SOURCE tnodes,
	we have to search the entire tnode array since these are all on different levels. */
	for (inode = 0; inode < timing_ctx.num_tnodes; inode++) {
		if (timing_ctx.tnodes[inode].type == TN_OUTPAD_SINK) {
			/*  Since the pb_graph_pin of TN_OUTPAD_SINK tnodes points to NULL, we have to find the net 
			from the pb_graph_pin of the corresponding TN_OUTPAD_IPIN node. 
			Exploit the fact that the TN_OUTPAD_IPIN node will always be one prior in the tnode array. */
			VTR_ASSERT(timing_ctx.tnodes[inode - 1].type == TN_OUTPAD_IPIN);
			net_name = find_tnode_net_name(inode, is_prepacked, pin_id_to_pb_mapping);
			output_index = find_output(net_name + 4); /* the + 4 removes the prefix "out:" automatically prepended to outputs */
			if (output_index != -1) {
				/* We have a constrained outpad, find the clock it's constrained on. */
				clock_index = find_clock(timing_ctx.sdc->constrained_outputs[output_index].clock_name);
				VTR_ASSERT(clock_index != -1);
				/* The clock doain for this output is that of its virtual clock */
				timing_ctx.tnodes[inode].clock_domain = clock_index;
				/* Increment the fanout of this virtual clock domain. */
				timing_ctx.sdc->constrained_clocks[clock_index].fanout++;
				/* Mark output delay specified in SDC file on the timing graph edge leading into the TN_OUTPAD_SINK node. 
				However, this edge is part of the corresponding TN_OUTPAD_IPIN node. 
				Exploit the fact that the TN_OUTPAD_IPIN node will always be one prior in the tnode array. */
				timing_ctx.tnodes[inode - 1].out_edges[0].Tdel = timing_ctx.sdc->constrained_outputs[output_index].delay * 1e-9; /* normalize to be in seconds not ns */

			} else { /* We have an unconstrained input - mark with dummy clock domain and do not analyze. */
				timing_ctx.tnodes[inode].clock_domain = -1;
			}
		}
	}

	/* Third, visit all TN_FF_SOURCE and TN_FF_SINK tnodes, and transfer the clock domain and skew from their corresponding TN_FF_CLOCK tnodes*/
	for (inode = 0; inode < timing_ctx.num_tnodes; inode++) {
		if (timing_ctx.tnodes[inode].type == TN_FF_SOURCE || timing_ctx.tnodes[inode].type == TN_FF_SINK) {
			clock_node = find_ff_clock_tnode(inode, is_prepacked, lookup_tnode_from_pin_id);
			timing_ctx.tnodes[inode].clock_domain = clock_node->clock_domain;
			timing_ctx.tnodes[inode].clock_delay   = clock_node->clock_delay;
		}
	}
}

static void propagate_clock_domain_and_skew(int inode) {
/* Given a tnode indexed by inode (which is part of a clock net), 
 * propagate forward the clock domain (unchanged) and skew (adding the delay of edges) to all nodes in its fanout. 
 * We then call recursively on all children in a depth-first search.  If num_edges is 0, we should be at an TN_FF_CLOCK tnode;
 * We implicitly rely on a tnode not being part of two separate clock nets, since undefined behaviour would result if one DFS 
 * overwrote the results of another.  This may be problematic in cases of multiplexed or locally-generated clocks. */

	int iedge, to_node;
	t_tedge * tedge;

    auto& timing_ctx = g_vpr_ctx.timing();

	tedge = timing_ctx.tnodes[inode].out_edges;	/* Get the list of edges from the node we're visiting. */

	if (!tedge) { /* Leaf/sink node; base case of the recursion. */
		if(timing_ctx.tnodes[inode].type != TN_FF_CLOCK && timing_ctx.tnodes[inode].type != TN_OUTPAD_SINK) {
            vtr::printf_warning(__FILE__, __LINE__, "tnode %d appears to take clock as a data input\n", inode);
            return;
        }

		VTR_ASSERT(timing_ctx.tnodes[inode].clock_domain != -1); /* Make sure clock domain is valid. */

		timing_ctx.sdc->constrained_clocks[timing_ctx.tnodes[inode].clock_domain].fanout++;
		return;
	}

	for (iedge = 0; iedge < timing_ctx.tnodes[inode].num_edges; iedge++) {	/* Go through each edge coming out from this tnode */
		to_node = tedge[iedge].to_node;
		if(to_node == DO_NOT_ANALYSE) continue; //Skip marked invalid nodes

		/* Propagate clock skew forward along this clock net, adding the delay of the wires (edges) of the clock network. */ 
		timing_ctx.tnodes[to_node].clock_delay = timing_ctx.tnodes[inode].clock_delay + tedge[iedge].Tdel; 
		/* Propagate clock domain forward unchanged */
		timing_ctx.tnodes[to_node].clock_domain = timing_ctx.tnodes[inode].clock_domain;
		/* Finally, call recursively on the destination tnode. */
		propagate_clock_domain_and_skew(to_node);
	}
}

static const char * find_tnode_net_name(int inode, bool is_prepacked, vtr::vector_map<ClusterBlockId, t_pb **> &pin_id_to_pb_mapping) {
	/* Finds the name of the net which a tnode (inode) is on (different for pre-/post-packed netlists). */
	
	t_pb_graph_pin * pb_graph_pin;

    auto& timing_ctx = g_vpr_ctx.timing();

	if (is_prepacked) {
        //We only store pin mappings for tnode's which correspond to netlist pins,
        //so we need to convert sources/sinks to their relevant pin tnode's before
        //looking up the netlist pin/net
        auto& atom_ctx = g_vpr_ctx.atom();

        int inode_pin = OPEN;
        if(timing_ctx.tnodes[inode].type == TN_INPAD_SOURCE || timing_ctx.tnodes[inode].type == TN_FF_SOURCE || timing_ctx.tnodes[inode].type == TN_CLOCK_SOURCE) {
            VTR_ASSERT(timing_ctx.tnodes[inode].num_edges == 1);
            inode_pin = timing_ctx.tnodes[inode].out_edges[0].to_node;
        } else if (timing_ctx.tnodes[inode].type == TN_OUTPAD_SINK || timing_ctx.tnodes[inode].type == TN_FF_SINK) {
            inode_pin = inode - 1;
            VTR_ASSERT(timing_ctx.tnodes[inode_pin].out_edges[0].to_node == inode);
        } else {
            inode_pin = inode;
        }
        VTR_ASSERT(inode_pin != OPEN);

        AtomPinId pin_id = atom_ctx.lookup.classic_tnode_atom_pin(inode_pin);
        VTR_ASSERT(pin_id);

        if(timing_ctx.tnodes[inode].type == TN_INPAD_SOURCE || timing_ctx.tnodes[inode].type == TN_INPAD_OPIN ||
           timing_ctx.tnodes[inode].type == TN_OUTPAD_SINK || timing_ctx.tnodes[inode].type == TN_OUTPAD_IPIN) {
            AtomBlockId blk_id = atom_ctx.nlist.pin_block(pin_id);

            //For input/input pads the net name is the same as the block name
            return atom_ctx.nlist.block_name(blk_id).c_str();
        } else {
            AtomNetId net_id = atom_ctx.nlist.pin_net(pin_id);

            return atom_ctx.nlist.net_name(net_id).c_str();
        }
	} else {
        auto& cluster_ctx = g_vpr_ctx.clustering();

        ClusterBlockId iblock = timing_ctx.tnodes[inode].block;
        if(timing_ctx.tnodes[inode].type == TN_INPAD_SOURCE || timing_ctx.tnodes[inode].type == TN_INPAD_OPIN ||
           timing_ctx.tnodes[inode].type == TN_OUTPAD_SINK || timing_ctx.tnodes[inode].type == TN_OUTPAD_IPIN) {
            //For input/input pads the net name is the same as the block name
            pb_graph_pin = timing_ctx.tnodes[inode].pb_graph_pin;
			return pin_id_to_pb_mapping[iblock][pb_graph_pin->pin_count_in_cluster]->name;
        } else {
            //We need to find the TN_CB_OPIN/TN_CB_IPIN that this node drives, so that we can look up
            //the net name in the global clb netlist
            int inode_search = inode;
            while(timing_ctx.tnodes[inode_search].type != TN_CB_IPIN && timing_ctx.tnodes[inode_search].type != TN_CB_OPIN ) { 
                //Assume we don't have any internal fanout inside the block
                //  Should be true for most source-types
                VTR_ASSERT(timing_ctx.tnodes[inode_search].num_edges == 1);
                inode_search = timing_ctx.tnodes[inode_search].out_edges[0].to_node;
            }
            VTR_ASSERT(timing_ctx.tnodes[inode_search].type == TN_CB_IPIN || timing_ctx.tnodes[inode_search].type == TN_CB_OPIN);

            //Now that we have a complex block pin, we can look-up its connected net in the CLB netlist
            pb_graph_pin = timing_ctx.tnodes[inode_search].pb_graph_pin;
            int ipin = pb_graph_pin->pin_count_in_cluster; //Pin into the CLB
            
			ClusterNetId net_id = cluster_ctx.clb_nlist.block_net(timing_ctx.tnodes[inode_search].block, ipin); //Net index into the clb netlist
            return cluster_ctx.clb_nlist.net_name(net_id).c_str();
        }
	}
}

static t_tnode * find_ff_clock_tnode(int inode, bool is_prepacked, vtr::vector_map<ClusterBlockId, std::vector<int>> &lookup_tnode_from_pin_id) {
	/* Finds the TN_FF_CLOCK tnode on the same flipflop as an TN_FF_SOURCE or TN_FF_SINK tnode. */
	
	t_tnode * ff_clock_tnode;
	int ff_tnode;
	t_pb_graph_node * parent_pb_graph_node;
	t_pb_graph_pin * ff_source_or_sink_pb_graph_pin, * clock_pb_graph_pin;

    auto& timing_ctx = g_vpr_ctx.timing();

	if (is_prepacked) {
        //TODO: handle multiple clocks
        
        int i_pin_tnode = OPEN;
        if(timing_ctx.tnodes[inode].type == TN_FF_SOURCE) {
            VTR_ASSERT(timing_ctx.tnodes[inode].num_edges == 1);

            i_pin_tnode = timing_ctx.tnodes[inode].out_edges[0].to_node; 
            VTR_ASSERT(timing_ctx.tnodes[i_pin_tnode].type == TN_FF_OPIN);
        } else if (timing_ctx.tnodes[inode].type == TN_FF_SINK) {

            i_pin_tnode = inode - 1;

            VTR_ASSERT(timing_ctx.tnodes[i_pin_tnode].type == TN_FF_IPIN);
            VTR_ASSERT(timing_ctx.tnodes[i_pin_tnode].num_edges == 1);
            VTR_ASSERT(timing_ctx.tnodes[i_pin_tnode].out_edges[0].to_node == inode);
        } else {
            VTR_ASSERT(false);
        }

        auto& atom_ctx = g_vpr_ctx.atom();

        auto pin_id = atom_ctx.lookup.classic_tnode_atom_pin(i_pin_tnode);
        VTR_ASSERT(pin_id);

        auto blk_id = atom_ctx.nlist.pin_block(pin_id);
        VTR_ASSERT(blk_id);

        //Get the single clock pin
        auto clock_pins = atom_ctx.nlist.block_clock_pins(blk_id);
        VTR_ASSERT(clock_pins.size() == 1);
        auto clock_pin_id = *clock_pins.begin();

        //Get the associated tnode index
        int i_ff_clock = atom_ctx.lookup.atom_pin_classic_tnode(clock_pin_id);
        VTR_ASSERT(i_ff_clock != OPEN);

        ff_clock_tnode = &timing_ctx.tnodes[i_ff_clock];

	} else {
        ClusterBlockId iblock = timing_ctx.tnodes[inode].block;
		ff_source_or_sink_pb_graph_pin = timing_ctx.tnodes[inode].pb_graph_pin;
		parent_pb_graph_node = ff_source_or_sink_pb_graph_pin->parent_node;
		/* Make sure there's only one clock port and only one clock pin in that port */
		VTR_ASSERT(parent_pb_graph_node->num_clock_ports == 1);
		VTR_ASSERT(parent_pb_graph_node->num_clock_pins[0] == 1);
		clock_pb_graph_pin = &parent_pb_graph_node->clock_pins[0][0];
		ff_tnode = lookup_tnode_from_pin_id[iblock][clock_pb_graph_pin->pin_count_in_cluster];
		VTR_ASSERT(ff_tnode != OPEN);
		ff_clock_tnode = &timing_ctx.tnodes[ff_tnode];
	}
	VTR_ASSERT(ff_clock_tnode != nullptr);
	VTR_ASSERT(ff_clock_tnode->type == TN_FF_CLOCK);
	return ff_clock_tnode;
}

static int find_clock(const char * net_name) {
/* Given a string net_name, find whether it's the name of a clock in the array timing_ctx.sdc->constrained_clocks.  *
 * if it is, return the clock's index in timing_ctx.sdc->constrained_clocks; if it's not, return -1. */
    auto& timing_ctx = g_vpr_ctx.timing();

	for (int index = 0; index < timing_ctx.sdc->num_constrained_clocks; index++) {
		if (strcmp(net_name, timing_ctx.sdc->constrained_clocks[index].name) == 0) {
			return index;
		}
	}
	return -1;
}

static int find_input(const char * net_name) {
/* Given a string net_name, find whether it's the name of a constrained input in the array timing_ctx.sdc->constrained_inputs.  *
 * if it is, return its index in timing_ctx.sdc->constrained_inputs; if it's not, return -1. */
    auto& timing_ctx = g_vpr_ctx.timing();
	for (int index = 0; index < timing_ctx.sdc->num_constrained_inputs; index++) {
		if (strcmp(net_name, timing_ctx.sdc->constrained_inputs[index].name) == 0) {
			return index;
		}
	}
	return -1;
}

static int find_output(const char * net_name) {
/* Given a string net_name, find whether it's the name of a constrained output in the array timing_ctx.sdc->constrained_outputs.  *
 * if it is, return its index in timing_ctx.sdc->constrained_outputs; if it's not, return -1. */
    auto& timing_ctx = g_vpr_ctx.timing();

	for (int index = 0; index < timing_ctx.sdc->num_constrained_outputs; index++) {
		if (strcmp(net_name, timing_ctx.sdc->constrained_outputs[index].name) == 0) {
			return index;
		}
	}
	return -1;
}

static int find_cf_constraint(const char * source_clock_name, const char * sink_ff_name) {
	/* Given a source clock domain and a sink flip-flop, find out if there's an override constraint between them.
	If there is, return the index in timing_ctx.sdc->cf_constraints; if there is not, return -1. */
	int icf, isource, isink;

    auto& timing_ctx = g_vpr_ctx.timing();

	for (icf = 0; icf < timing_ctx.sdc->num_cf_constraints; icf++) {
		for (isource = 0; isource < timing_ctx.sdc->cf_constraints[icf].num_source; isource++) {
			if (strcmp(timing_ctx.sdc->cf_constraints[icf].source_list[isource], source_clock_name) == 0) {
				for (isink = 0; isink < timing_ctx.sdc->cf_constraints[icf].num_sink; isink++) {
					if (strcmp(timing_ctx.sdc->cf_constraints[icf].sink_list[isink], sink_ff_name) == 0) {
						return icf;
					}
				}
			}
		}
	}
	return -1;
}

static inline bool has_valid_T_arr(int inode) {
	/* Has this tnode's arrival time been changed from its original value of HUGE_NEGATIVE_FLOAT? */
    auto& timing_ctx = g_vpr_ctx.timing();
	return (bool) (timing_ctx.tnodes[inode].T_arr > HUGE_NEGATIVE_FLOAT + 1);
}

static inline bool has_valid_T_req(int inode) {
	/* Has this tnode's required time been changed from its original value of HUGE_POSITIVE_FLOAT? */
    auto& timing_ctx = g_vpr_ctx.timing();
	return (bool) (timing_ctx.tnodes[inode].T_req < HUGE_POSITIVE_FLOAT - 1);
}

#ifndef PATH_COUNTING
bool has_valid_normalized_T_arr(int inode) {
	/* Has this tnode's normalized_T_arr been changed from its original value of HUGE_NEGATIVE_FLOAT? */
    auto& timing_ctx = g_vpr_ctx.timing();
	return (bool) (timing_ctx.tnodes[inode].prepacked_data->normalized_T_arr > HUGE_NEGATIVE_FLOAT + 1);
}
#endif

float get_critical_path_delay() {
	/* Finds the critical path delay, which is the minimum clock period required to meet the constraint
	corresponding to the pair of source and sink clock domains with the least slack in the design. */
	
	int source_clock_domain, sink_clock_domain;
	float least_slack_in_design = HUGE_POSITIVE_FLOAT, critical_path_delay = NAN;

    auto& timing_ctx = g_vpr_ctx.timing();
    auto& device_ctx = g_vpr_ctx.device();

	if (!timing_ctx.sdc) return UNDEFINED; /* If timing analysis is off, for instance. */

	for (source_clock_domain = 0; source_clock_domain < timing_ctx.sdc->num_constrained_clocks; source_clock_domain++) {
		for (sink_clock_domain = 0; sink_clock_domain < timing_ctx.sdc->num_constrained_clocks; sink_clock_domain++) {
			if (least_slack_in_design > f_timing_stats->least_slack[source_clock_domain][sink_clock_domain]) {
				least_slack_in_design = f_timing_stats->least_slack[source_clock_domain][sink_clock_domain];
				critical_path_delay = f_timing_stats->cpd[source_clock_domain][sink_clock_domain];
			}
		}
	}
	if (device_ctx.pb_max_internal_delay != UNDEFINED && device_ctx.pb_max_internal_delay > critical_path_delay) {
		critical_path_delay = device_ctx.pb_max_internal_delay;
    }

	return critical_path_delay * 1e9; /* Convert to nanoseconds */
}

void print_timing_stats() {

	/* Prints critical path delay/fmax, least slack in design, and, for multiple-clock designs, 
	minimum required clock period to meet each constraint, least slack per constraint,
	geometric average clock frequency, and fanout-weighted geometric average clock frequency. */

	int source_clock_domain, sink_clock_domain, clock_domain, fanout, total_fanout = 0, 
		num_netlist_clocks_with_intra_domain_paths = 0;
	float geomean_period = 1., least_slack_in_design = HUGE_POSITIVE_FLOAT, critical_path_delay = UNDEFINED;
	double fanout_weighted_geomean_period = 0.;
	bool found;

    auto& timing_ctx = g_vpr_ctx.timing();

	for (source_clock_domain = 0; source_clock_domain < timing_ctx.sdc->num_constrained_clocks; source_clock_domain++) {
		for (sink_clock_domain = 0; sink_clock_domain < timing_ctx.sdc->num_constrained_clocks; sink_clock_domain++) {
			if (least_slack_in_design > f_timing_stats->least_slack[source_clock_domain][sink_clock_domain]) {
				least_slack_in_design = f_timing_stats->least_slack[source_clock_domain][sink_clock_domain];
            }
        }
    }

	/* Find critical path delay. If the device_ctx.pb_max_internal_delay is greater than this, it becomes
	 the limiting factor on critical path delay, so print that instead, with a special message. */
    critical_path_delay = get_critical_path_delay();
    vtr::printf_info("Final critical path: %g ns", critical_path_delay);

	if (timing_ctx.sdc->num_constrained_clocks <= 1) {
		/* Although critical path delay is always well-defined, it doesn't make sense to talk about fmax for multi-clock circuits */
		vtr::printf_direct(", f_max: %g MHz", 1e3 / critical_path_delay);
	}
	vtr::printf_direct("\n");
	
	/* Also print the least slack in the design */
	vtr::printf_info("\n");
	vtr::printf_info("Least slack in design: %g ns\n", 1e9 * least_slack_in_design);
	vtr::printf_info("\n");

	if (timing_ctx.sdc->num_constrained_clocks > 1) { /* Multiple-clock design */

		/* Print minimum possible clock period to meet each constraint. Convert to nanoseconds. */

		vtr::printf_info("Minimum possible clock period to meet each constraint (including skew effects):\n");
		for (source_clock_domain = 0; source_clock_domain < timing_ctx.sdc->num_constrained_clocks; source_clock_domain++) {
			/* Print the intra-domain constraint if it was analysed. */
			if (timing_ctx.sdc->domain_constraint[source_clock_domain][source_clock_domain] > NEGATIVE_EPSILON) { 
				vtr::printf_info("%s to %s: %g ns (%g MHz)\n", 
						timing_ctx.sdc->constrained_clocks[source_clock_domain].name,
						timing_ctx.sdc->constrained_clocks[source_clock_domain].name, 
						1e9 * f_timing_stats->cpd[source_clock_domain][source_clock_domain],
						1e-6 / f_timing_stats->cpd[source_clock_domain][source_clock_domain]);
			} else {
				vtr::printf_info("%s to %s: --\n", 
						timing_ctx.sdc->constrained_clocks[source_clock_domain].name,
						timing_ctx.sdc->constrained_clocks[source_clock_domain].name);
			}
			/* Then, print all other constraints on separate lines, indented. We re-print 
			the source clock domain's name so there's no ambiguity when parsing. */
			for (sink_clock_domain = 0; sink_clock_domain < timing_ctx.sdc->num_constrained_clocks; sink_clock_domain++) {
				if (source_clock_domain == sink_clock_domain) continue; /* already done that */
				if (timing_ctx.sdc->domain_constraint[source_clock_domain][sink_clock_domain] > NEGATIVE_EPSILON) { 
					/* If this domain pair was analysed */
					vtr::printf_info("\t%s to %s: %g ns (%g MHz)\n", 
							timing_ctx.sdc->constrained_clocks[source_clock_domain].name,
							timing_ctx.sdc->constrained_clocks[sink_clock_domain].name, 
							1e9 * f_timing_stats->cpd[source_clock_domain][sink_clock_domain],
							1e-6 / f_timing_stats->cpd[source_clock_domain][sink_clock_domain]);
				} else {
					vtr::printf_info("\t%s to %s: --\n", 
							timing_ctx.sdc->constrained_clocks[source_clock_domain].name,
							timing_ctx.sdc->constrained_clocks[sink_clock_domain].name);
				}
			}
		}

		/* Print least slack per constraint. */

		vtr::printf_info("\n");
		vtr::printf_info("Least slack per constraint:\n");
		for (source_clock_domain = 0; source_clock_domain < timing_ctx.sdc->num_constrained_clocks; source_clock_domain++) {
			/* Print the intra-domain slack if valid. */
			if (f_timing_stats->least_slack[source_clock_domain][source_clock_domain] < HUGE_POSITIVE_FLOAT - 1) {
				vtr::printf_info("%s to %s: %g ns\n", 
						timing_ctx.sdc->constrained_clocks[source_clock_domain].name, 
						timing_ctx.sdc->constrained_clocks[source_clock_domain].name, 
						1e9 * f_timing_stats->least_slack[source_clock_domain][source_clock_domain]);
			} else {
				vtr::printf_info("%s to %s: --\n", 
						timing_ctx.sdc->constrained_clocks[source_clock_domain].name,
						timing_ctx.sdc->constrained_clocks[source_clock_domain].name);
			}
			/* Then, print all other slacks on separate lines. */
			for (sink_clock_domain = 0; sink_clock_domain < timing_ctx.sdc->num_constrained_clocks; sink_clock_domain++) {
				if (source_clock_domain == sink_clock_domain) continue; /* already done that */
				if (f_timing_stats->least_slack[source_clock_domain][sink_clock_domain] < HUGE_POSITIVE_FLOAT - 1) {
					/* If this domain pair was analysed and has a valid slack */
					vtr::printf_info("\t%s to %s: %g ns\n", 
							timing_ctx.sdc->constrained_clocks[source_clock_domain].name,
							timing_ctx.sdc->constrained_clocks[sink_clock_domain].name, 
							1e9 * f_timing_stats->least_slack[source_clock_domain][sink_clock_domain]);
				} else {
					vtr::printf_info("\t%s to %s: --\n", 
							timing_ctx.sdc->constrained_clocks[source_clock_domain].name,
							timing_ctx.sdc->constrained_clocks[sink_clock_domain].name);
				}
			}
		}
	
		/* Calculate geometric mean f_max (fanout-weighted and unweighted) from the diagonal (intra-domain) entries of critical_path_delay, 
		excluding domains without intra-domain paths (for which the timing constraint is DO_NOT_ANALYSE) and virtual clocks. */
		found = false;
		for (clock_domain = 0; clock_domain < timing_ctx.sdc->num_constrained_clocks; clock_domain++) {
			if (timing_ctx.sdc->domain_constraint[clock_domain][clock_domain] > NEGATIVE_EPSILON && timing_ctx.sdc->constrained_clocks[clock_domain].is_netlist_clock) {
				geomean_period *= f_timing_stats->cpd[clock_domain][clock_domain];
				fanout = timing_ctx.sdc->constrained_clocks[clock_domain].fanout;
				fanout_weighted_geomean_period += log((double) f_timing_stats->cpd[clock_domain][clock_domain])*(double)fanout;
				total_fanout += fanout;
				num_netlist_clocks_with_intra_domain_paths++;
				found = true;
			}
		}
		if (found) { /* Only print these if we found at least one clock domain with intra-domain paths. */
			geomean_period = pow(geomean_period, (float) 1/num_netlist_clocks_with_intra_domain_paths);
			fanout_weighted_geomean_period = exp(fanout_weighted_geomean_period/total_fanout);
			/* Convert to MHz */
			vtr::printf_info("\n");
			vtr::printf_info("Geometric mean intra-domain period: %g ns (%g MHz)\n", 
					1e9 * geomean_period, 1e-6 / geomean_period);
			vtr::printf_info("Fanout-weighted geomean intra-domain period: %g ns (%g MHz)\n", 
					1e9 * fanout_weighted_geomean_period, 1e-6 / fanout_weighted_geomean_period);
		}

		vtr::printf_info("\n");
	}
}

static void print_timing_constraint_info(const char *fname) {
	/* Prints the contents of timing_ctx.sdc->domain_constraint, timing_ctx.sdc->constrained_clocks, constrained_ios and timing_ctx.sdc->cc_constraints to a file. */
	
	FILE * fp;
	int source_clock_domain, sink_clock_domain, i, j;
	int max_clock_name_length = INT_MIN;
	char * clock_name;

    auto& timing_ctx = g_vpr_ctx.timing();

	int * clock_name_length = (int *) vtr::malloc(timing_ctx.sdc->num_constrained_clocks * sizeof(int)); /* Array of clock name lengths */

	fp = vtr::fopen(fname, "w");

	/* Get lengths of each clock name and max length so we can space the columns properly. */
	for (sink_clock_domain = 0; sink_clock_domain < timing_ctx.sdc->num_constrained_clocks; sink_clock_domain++) {
		clock_name = timing_ctx.sdc->constrained_clocks[sink_clock_domain].name;
		clock_name_length[sink_clock_domain] = strlen(clock_name);
		if (clock_name_length[sink_clock_domain] > max_clock_name_length) {
			max_clock_name_length = clock_name_length[sink_clock_domain];	
		}
	}

	/* First, combine info from timing_ctx.sdc->domain_constraint and timing_ctx.sdc->constrained_clocks into a matrix 
	(they're indexed the same as each other). */

	fprintf(fp, "Timing constraints in ns (source clock domains down left side, sink along top).\n"
				"A value of -1.00 means the pair of source and sink domains will not be analysed.\n\n");

	print_spaces(fp, max_clock_name_length + 4); 

	for (sink_clock_domain = 0; sink_clock_domain < timing_ctx.sdc->num_constrained_clocks; sink_clock_domain++) {
		fprintf(fp, "%s", timing_ctx.sdc->constrained_clocks[sink_clock_domain].name);
		/* Minimum column width of 8 */
		print_spaces(fp, max(8 - clock_name_length[sink_clock_domain], 4));
	}
	fprintf(fp, "\n");

	for (source_clock_domain = 0; source_clock_domain < timing_ctx.sdc->num_constrained_clocks; source_clock_domain++) {
		fprintf(fp, "%s", timing_ctx.sdc->constrained_clocks[source_clock_domain].name);
		print_spaces(fp, max_clock_name_length + 4 - clock_name_length[source_clock_domain]);
		for (sink_clock_domain = 0; sink_clock_domain < timing_ctx.sdc->num_constrained_clocks; sink_clock_domain++) {
			fprintf(fp, "%5.2f", timing_ctx.sdc->domain_constraint[source_clock_domain][sink_clock_domain]);
			/* Minimum column width of 8 */
			print_spaces(fp, max(clock_name_length[sink_clock_domain] - 1, 3));
		}
		fprintf(fp, "\n");
	}

	free(clock_name_length);

	/* Second, print I/O constraints. */
	fprintf(fp, "\nList of constrained inputs (note: constraining a clock net input has no effect):\n");
	for (i = 0; i < timing_ctx.sdc->num_constrained_inputs; i++) {
		fprintf(fp, "Input name %s on clock %s with input delay %.2f ns\n", 
			timing_ctx.sdc->constrained_inputs[i].name, timing_ctx.sdc->constrained_inputs[i].clock_name, timing_ctx.sdc->constrained_inputs[i].delay);
	}

	fprintf(fp, "\nList of constrained outputs:\n");
	for (i = 0; i < timing_ctx.sdc->num_constrained_outputs; i++) {
		fprintf(fp, "Output name %s on clock %s with output delay %.2f ns\n", 
			timing_ctx.sdc->constrained_outputs[i].name, timing_ctx.sdc->constrained_outputs[i].clock_name, timing_ctx.sdc->constrained_outputs[i].delay);
	}

	/* Third, print override constraints. */
	fprintf(fp, "\nList of override constraints (non-default constraints created by set_false_path, set_clock_groups, \nset_max_delay, and set_multicycle_path):\n");
	
	for (i = 0; i < timing_ctx.sdc->num_cc_constraints; i++) {
		fprintf(fp, "Clock domain");
		for (j = 0; j < timing_ctx.sdc->cc_constraints[i].num_source; j++) {
			fprintf(fp, " %s,", timing_ctx.sdc->cc_constraints[i].source_list[j]); 
		}
		fprintf(fp, " to clock domain");
		for (j = 0; j < timing_ctx.sdc->cc_constraints[i].num_sink - 1; j++) {
			fprintf(fp, " %s,", timing_ctx.sdc->cc_constraints[i].sink_list[j]); 
		} /* We have to print the last one separately because we don't want a comma after it. */
		if (timing_ctx.sdc->cc_constraints[i].num_multicycles == 0) { /* not a multicycle constraint */
			fprintf(fp, " %s: %.2f ns\n", timing_ctx.sdc->cc_constraints[i].sink_list[j], timing_ctx.sdc->cc_constraints[i].constraint);
		} else { /* multicycle constraint */
			fprintf(fp, " %s: %d multicycles\n", timing_ctx.sdc->cc_constraints[i].sink_list[j], timing_ctx.sdc->cc_constraints[i].num_multicycles);
		}
	}

	for (i = 0; i < timing_ctx.sdc->num_cf_constraints; i++) {
		fprintf(fp, "Clock domain");
		for (j = 0; j < timing_ctx.sdc->cf_constraints[i].num_source; j++) {
			fprintf(fp, " %s,", timing_ctx.sdc->cf_constraints[i].source_list[j]); 
		}
		fprintf(fp, " to flip-flop");
		for (j = 0; j < timing_ctx.sdc->cf_constraints[i].num_sink - 1; j++) {
			fprintf(fp, " %s,", timing_ctx.sdc->cf_constraints[i].sink_list[j]); 
		} /* We have to print the last one separately because we don't want a comma after it. */
		if (timing_ctx.sdc->cf_constraints[i].num_multicycles == 0) { /* not a multicycle constraint */
			fprintf(fp, " %s: %.2f ns\n", timing_ctx.sdc->cf_constraints[i].sink_list[j], timing_ctx.sdc->cf_constraints[i].constraint);
		} else { /* multicycle constraint */
			fprintf(fp, " %s: %d multicycles\n", timing_ctx.sdc->cf_constraints[i].sink_list[j], timing_ctx.sdc->cf_constraints[i].num_multicycles);
		}
	}

	for (i = 0; i < timing_ctx.sdc->num_fc_constraints; i++) {
		fprintf(fp, "Flip-flop");
		for (j = 0; j < timing_ctx.sdc->fc_constraints[i].num_source; j++) {
			fprintf(fp, " %s,", timing_ctx.sdc->fc_constraints[i].source_list[j]); 
		}
		fprintf(fp, " to clock domain");
		for (j = 0; j < timing_ctx.sdc->fc_constraints[i].num_sink - 1; j++) {
			fprintf(fp, " %s,", timing_ctx.sdc->fc_constraints[i].sink_list[j]); 
		} /* We have to print the last one separately because we don't want a comma after it. */
		if (timing_ctx.sdc->fc_constraints[i].num_multicycles == 0) { /* not a multicycle constraint */
			fprintf(fp, " %s: %.2f ns\n", timing_ctx.sdc->fc_constraints[i].sink_list[j], timing_ctx.sdc->fc_constraints[i].constraint);
		} else { /* multicycle constraint */
			fprintf(fp, " %s: %d multicycles\n", timing_ctx.sdc->fc_constraints[i].sink_list[j], timing_ctx.sdc->fc_constraints[i].num_multicycles);
		}
	}

	for (i = 0; i < timing_ctx.sdc->num_ff_constraints; i++) {
		fprintf(fp, "Flip-flop");
		for (j = 0; j < timing_ctx.sdc->ff_constraints[i].num_source; j++) {
			fprintf(fp, " %s,", timing_ctx.sdc->ff_constraints[i].source_list[j]); 
		}
		fprintf(fp, " to flip-flop");
		for (j = 0; j < timing_ctx.sdc->ff_constraints[i].num_sink - 1; j++) {
			fprintf(fp, " %s,", timing_ctx.sdc->ff_constraints[i].sink_list[j]); 
		} /* We have to print the last one separately because we don't want a comma after it. */
		if (timing_ctx.sdc->ff_constraints[i].num_multicycles == 0) { /* not a multicycle constraint */
			fprintf(fp, " %s: %.2f ns\n", timing_ctx.sdc->ff_constraints[i].sink_list[j], timing_ctx.sdc->ff_constraints[i].constraint);
		} else { /* multicycle constraint */
			fprintf(fp, " %s: %d multicycles\n", timing_ctx.sdc->ff_constraints[i].sink_list[j], timing_ctx.sdc->ff_constraints[i].num_multicycles);
		}
	}

	fclose(fp);
}

static void print_spaces(FILE * fp, int num_spaces) {
	/* Prints num_spaces spaces to file pointed to by fp. */
	for ( ; num_spaces > 0; num_spaces--) {
		fprintf(fp, " ");
	}
}

/*
 Create a lookup table that returns the tnode index for [iblock][pb_graph_pin_id]
*/
vtr::vector_map<ClusterBlockId, std::vector<int>> alloc_and_load_tnode_lookup_from_pin_id() {
    auto& cluster_ctx = g_vpr_ctx.clustering();
    auto& timing_ctx = g_vpr_ctx.timing();

	vtr::vector_map<ClusterBlockId, std::vector<int>> tnode_lookup;
	tnode_lookup.resize(cluster_ctx.clb_nlist.blocks().size());

	for (auto blk_id : cluster_ctx.clb_nlist.blocks()) {
		int num_pins = cluster_ctx.clb_nlist.block_type(blk_id)->pb_graph_head->total_pb_pins;
		tnode_lookup[blk_id].resize(num_pins);
		for (int j = 0; j < num_pins; j++) {
			tnode_lookup[blk_id][j] = OPEN;
		}
	}

	for (int i = 0; i < timing_ctx.num_tnodes; i++) {
		if (timing_ctx.tnodes[i].pb_graph_pin != nullptr) {
			if (timing_ctx.tnodes[i].type != TN_CLOCK_SOURCE &&
				timing_ctx.tnodes[i].type != TN_FF_SOURCE &&
				timing_ctx.tnodes[i].type != TN_INPAD_SOURCE &&
				timing_ctx.tnodes[i].type != TN_FF_SINK &&
				timing_ctx.tnodes[i].type != TN_OUTPAD_SINK
				) {
				int pb_pin_id = timing_ctx.tnodes[i].pb_graph_pin->pin_count_in_cluster;
				ClusterBlockId iblk = timing_ctx.tnodes[i].block;
				VTR_ASSERT(tnode_lookup[iblk][pb_pin_id] == OPEN);				
				tnode_lookup[iblk][pb_pin_id] = i;
			}
		}
	}
	return tnode_lookup;
}

void free_tnode_lookup_from_pin_id(vtr::vector_map<ClusterBlockId, std::vector<int>> &tnode_lookup) {
    auto& cluster_ctx = g_vpr_ctx.clustering();

	for (auto blk_id : cluster_ctx.clb_nlist.blocks()) {
		tnode_lookup[blk_id].clear();
	}
	tnode_lookup.clear();
}

std::vector<size_t> init_timing_net_pins() {
    std::vector<size_t> timing_net_pin_counts;
    auto& cluster_ctx = g_vpr_ctx.clustering();

    for(auto net_id : cluster_ctx.clb_nlist.nets()) {
        timing_net_pin_counts.push_back(cluster_ctx.clb_nlist.net_pins(net_id).size());
    }

    VTR_ASSERT(timing_net_pin_counts.size() == cluster_ctx.clb_nlist.nets().size());

    return timing_net_pin_counts;
}

std::vector<size_t> init_atom_timing_net_pins() {
    std::vector<size_t> timing_net_pin_counts;
    auto& atom_ctx = g_vpr_ctx.atom();

    for(auto net_id : atom_ctx.nlist.nets()) {
        timing_net_pin_counts.push_back(atom_ctx.nlist.net_pins(net_id).size());
    }

    VTR_ASSERT(timing_net_pin_counts.size() == atom_ctx.nlist.nets().size());

    return timing_net_pin_counts;
}

size_t num_timing_nets() {
    return f_num_timing_net_pins.size();
}

size_t num_timing_net_pins(int inet) {
    return f_num_timing_net_pins[inet];
}

size_t num_timing_net_sinks(int inet) {
    VTR_ASSERT(f_num_timing_net_pins[inet] > 0);
    return f_num_timing_net_pins[inet] - 1;
}

void print_classic_cpds() {
    auto& timing_ctx = g_vpr_ctx.timing();

	for (int source_clock_domain = 0; source_clock_domain < timing_ctx.sdc->num_constrained_clocks; source_clock_domain++) {
		for (int sink_clock_domain = 0; sink_clock_domain < timing_ctx.sdc->num_constrained_clocks; sink_clock_domain++) {
            float least_slack = f_timing_stats->least_slack[source_clock_domain][sink_clock_domain];
            float critical_path_delay = f_timing_stats->cpd[source_clock_domain][sink_clock_domain];

            vtr::printf("Classic %d -> %d: least_slack=%g cpd=%g\n", source_clock_domain, sink_clock_domain, least_slack, critical_path_delay);
		}
	}
}

static void mark_max_block_delay(const std::unordered_map<AtomBlockId,t_pb_graph_node*>& expected_lowest_cost_pb_gnode) {
    auto& atom_ctx = g_vpr_ctx.atom();
    auto& device_ctx = g_vpr_ctx.mutable_device();

    for(AtomBlockId blk : atom_ctx.nlist.blocks()) {
        auto iter = expected_lowest_cost_pb_gnode.find(blk);
        if(iter != expected_lowest_cost_pb_gnode.end()) {
            const t_pb_graph_node* gnode = iter->second;
            const t_pb_type* pb_type = gnode->pb_type;

			if (pb_type->max_internal_delay != UNDEFINED) {
				if (device_ctx.pb_max_internal_delay == UNDEFINED) {
					device_ctx.pb_max_internal_delay = pb_type->max_internal_delay;
					device_ctx.pbtype_max_internal_delay = pb_type;
				} else if (device_ctx.pb_max_internal_delay < pb_type->max_internal_delay) {
					device_ctx.pb_max_internal_delay = pb_type->max_internal_delay;
					device_ctx.pbtype_max_internal_delay = pb_type;
				}
			}
        }
    }
}
