| #include "vtr_assert.h" |
| |
| #include "vtr_util.h" |
| |
| #include "endpoint_timing.h" |
| |
| |
| #include "path_delay.h" |
| #include "globals.h" |
| |
| void print_tnode_info(FILE* fp, int inode, const char* identifier); |
| |
| void print_endpoint_timing(char* filename) { |
| FILE* fp = vtr::fopen(filename, "w"); |
| |
| auto& cluster_ctx = g_vpr_ctx.clustering(); |
| auto& timing_ctx = g_vpr_ctx.timing(); |
| |
| vtr::vector_map<ClusterBlockId, std::vector<int>> tnode_lookup_from_pin_id = alloc_and_load_tnode_lookup_from_pin_id(); |
| |
| fprintf(fp, "{\n"); |
| fprintf(fp, " \"endpoint_timing\": [\n"); |
| |
| std::vector<int> outpad_sink_tnodes; |
| |
| for(int inode = 0; inode < timing_ctx.num_tnodes; inode++) { |
| if(timing_ctx.tnodes[inode].type == TN_OUTPAD_SINK) { |
| outpad_sink_tnodes.push_back(inode); |
| } |
| } |
| |
| for(size_t i = 0; i < outpad_sink_tnodes.size(); ++i) { |
| int inode = outpad_sink_tnodes[i]; |
| const char* identifier = cluster_ctx.clb_nlist.block_name(timing_ctx.tnodes[inode].block).c_str() + 4; //Trim out: |
| print_tnode_info(fp, inode, identifier); |
| |
| if(i != outpad_sink_tnodes.size() - 1) { |
| fprintf(fp, ","); |
| } |
| fprintf(fp, "\n"); |
| } |
| |
| fprintf(fp, " ]\n"); |
| fprintf(fp, "}\n"); |
| |
| |
| free_tnode_lookup_from_pin_id(tnode_lookup_from_pin_id); |
| |
| fclose(fp); |
| } |
| |
| void print_tnode_info(FILE* fp, int inode, const char* identifier) { |
| auto& timing_ctx = g_vpr_ctx.timing(); |
| fprintf(fp, " {\n"); |
| fprintf(fp, " \"node_identifier\": \"%s\",\n", identifier); |
| fprintf(fp, " \"tnode_id\": \"%d\",\n", inode); |
| |
| if(timing_ctx.tnodes[inode].type == TN_OUTPAD_SINK) { |
| fprintf(fp, " \"tnode_type\": \"TN_OUTPAD_SINK\",\n"); |
| } else { |
| VTR_ASSERT(timing_ctx.tnodes[inode].type == TN_FF_SINK); |
| fprintf(fp, " \"tnode_type\": \"TN_FF_SINK\",\n"); |
| } |
| |
| double T_arr = timing_ctx.tnodes[inode].T_arr; |
| double T_req = timing_ctx.tnodes[inode].T_req; |
| |
| if(T_arr <= HUGE_NEGATIVE_FLOAT) { |
| //Un-specified (e.g. driven by constant generator |
| T_arr = 0.; |
| } |
| if(T_req >= HUGE_POSITIVE_FLOAT) { |
| //Un-specified (e.g. driven by constant generator |
| T_req = 0.; |
| } |
| |
| fprintf(fp, " \"T_arr\": \"%g\",\n", T_arr); |
| fprintf(fp, " \"T_req\": \"%g\"\n", T_req); |
| |
| fprintf(fp, " }"); |
| } |