| #include <cstdio> |
| #include <cstring> |
| |
| #include "vtr_util.h" |
| #include "vtr_memory.h" |
| |
| #include "vpr_types.h" |
| #include "vpr_error.h" |
| |
| #include "hash.h" |
| #include "echo_files.h" |
| #include "globals.h" |
| |
| static bool EchoEnabled; |
| |
| static bool* echoFileEnabled = nullptr; |
| static char** echoFileNames = nullptr; |
| |
| static char** outputFileNames = nullptr; |
| |
| bool getEchoEnabled() { |
| return EchoEnabled; |
| } |
| |
| void setEchoEnabled(bool echo_enabled) { |
| /* enable echo outputs */ |
| EchoEnabled = echo_enabled; |
| if (echoFileEnabled == nullptr) { |
| /* initialize default echo options */ |
| alloc_and_load_echo_file_info(); |
| } |
| } |
| |
| void setAllEchoFileEnabled(bool value) { |
| int i; |
| for (i = 0; i < (int)E_ECHO_END_TOKEN; i++) { |
| echoFileEnabled[i] = value; |
| } |
| } |
| |
| void setEchoFileEnabled(enum e_echo_files echo_option, bool value) { |
| echoFileEnabled[(int)echo_option] = value; |
| } |
| |
| void setEchoFileName(enum e_echo_files echo_option, const char* name) { |
| if (echoFileNames[(int)echo_option] != nullptr) { |
| free(echoFileNames[(int)echo_option]); |
| } |
| echoFileNames[(int)echo_option] = vtr::strdup(name); |
| } |
| |
| bool isEchoFileEnabled(enum e_echo_files echo_option) { |
| if (echoFileEnabled == nullptr) { |
| return false; |
| } else { |
| return echoFileEnabled[(int)echo_option]; |
| } |
| } |
| |
| char* getEchoFileName(enum e_echo_files echo_option) { |
| return echoFileNames[(int)echo_option]; |
| } |
| |
| void alloc_and_load_echo_file_info() { |
| echoFileEnabled = (bool*)vtr::calloc((int)E_ECHO_END_TOKEN, sizeof(bool)); |
| echoFileNames = (char**)vtr::calloc((int)E_ECHO_END_TOKEN, sizeof(char*)); |
| |
| setAllEchoFileEnabled(getEchoEnabled()); |
| |
| //User input nelist |
| setEchoFileName(E_ECHO_ATOM_NETLIST_ORIG, "atom_netlist.orig.echo.blif"); |
| setEchoFileName(E_ECHO_ATOM_NETLIST_CLEANED, "atom_netlist.cleaned.echo.blif"); |
| |
| //Intra-block routing |
| setEchoFileName(E_ECHO_INTRA_LB_FAILED_ROUTE, "intra_lb_failed_route.echo"); |
| |
| //Timing Graphs |
| setEchoFileName(E_ECHO_PRE_PACKING_TIMING_GRAPH, "timing_graph.pre_pack.echo"); |
| setEchoFileName(E_ECHO_INITIAL_PLACEMENT_TIMING_GRAPH, "timing_graph.place_initial.echo"); |
| setEchoFileName(E_ECHO_FINAL_PLACEMENT_TIMING_GRAPH, "timing_graph.place_final.echo"); |
| setEchoFileName(E_ECHO_FINAL_ROUTING_TIMING_GRAPH, "timing_graph.route_final.echo"); |
| setEchoFileName(E_ECHO_ANALYSIS_TIMING_GRAPH, "timing_graph.analysis.echo"); |
| |
| setEchoFileName(E_ECHO_PLACE_MACROS, "place_macros.echo"); |
| setEchoFileName(E_ECHO_INITIAL_CLB_PLACEMENT, "initial_clb_placement.echo"); |
| setEchoFileName(E_ECHO_INITIAL_PLACEMENT_SLACK, "initial_placement_slack.echo"); |
| setEchoFileName(E_ECHO_INITIAL_PLACEMENT_CRITICALITY, "initial_placement_criticality.echo"); |
| setEchoFileName(E_ECHO_END_CLB_PLACEMENT, "end_clb_placement.echo"); |
| setEchoFileName(E_ECHO_PLACEMENT_SINK_DELAYS, "placement_sink_delays.echo"); |
| setEchoFileName(E_ECHO_FINAL_PLACEMENT_SLACK, "final_placement_slack.echo"); |
| setEchoFileName(E_ECHO_FINAL_PLACEMENT_CRITICALITY, "final_placement_criticality.echo"); |
| setEchoFileName(E_ECHO_PLACEMENT_CRIT_PATH, "placement_crit_path.echo"); |
| setEchoFileName(E_ECHO_PLACEMENT_DELTA_DELAY_MODEL, "placement_delta_delay_model.echo"); |
| setEchoFileName(E_ECHO_PB_GRAPH, "pb_graph.echo"); |
| setEchoFileName(E_ECHO_LB_TYPE_RR_GRAPH, "lb_type_rr_graph.echo"); |
| setEchoFileName(E_ECHO_ARCH, "arch.echo"); |
| setEchoFileName(E_ECHO_PLACEMENT_CRITICAL_PATH, "placement_critical_path.echo"); |
| setEchoFileName(E_ECHO_PLACEMENT_LOWER_BOUND_SINK_DELAYS, "placement_lower_bound_sink_delays.echo"); |
| setEchoFileName(E_ECHO_PLACEMENT_LOGIC_SINK_DELAYS, "placement_logic_sink_delays.echo"); |
| setEchoFileName(E_ECHO_ROUTING_SINK_DELAYS, "routing_sink_delays.echo"); |
| setEchoFileName(E_ECHO_POST_PACK_NETLIST, "post_pack_netlist.blif"); |
| setEchoFileName(E_ECHO_NET_DELAY, "net_delay.echo"); |
| setEchoFileName(E_ECHO_CLUSTERING_TIMING_INFO, "clustering_timing_info.echo"); |
| setEchoFileName(E_ECHO_PRE_PACKING_SLACK, "pre_packing_slack.echo"); |
| setEchoFileName(E_ECHO_PRE_PACKING_CRITICALITY, "pre_packing_criticality.echo"); |
| setEchoFileName(E_ECHO_CLUSTERING_BLOCK_CRITICALITIES, "clustering_block_criticalities.echo"); |
| setEchoFileName(E_ECHO_PRE_PACKING_MOLECULES_AND_PATTERNS, "pre_packing_molecules_and_patterns.echo"); |
| setEchoFileName(E_ECHO_MEM, "mem.echo"); |
| setEchoFileName(E_ECHO_TIMING_CONSTRAINTS, "timing_constraints.echo"); |
| setEchoFileName(E_ECHO_CRITICAL_PATH, "critical_path.echo"); |
| setEchoFileName(E_ECHO_SLACK, "slack.echo"); |
| setEchoFileName(E_ECHO_COMPLETE_NET_TRACE, "complete_net_trace.echo"); |
| setEchoFileName(E_ECHO_SEG_DETAILS, "seg_details.txt"); |
| setEchoFileName(E_ECHO_CHAN_DETAILS, "chan_details.txt"); |
| setEchoFileName(E_ECHO_SBLOCK_PATTERN, "sblock_pattern.txt"); |
| setEchoFileName(E_ECHO_ENDPOINT_TIMING, "endpoint_timing.echo.json"); |
| } |
| |
| void free_echo_file_info() { |
| int i; |
| if (echoFileEnabled != nullptr) { |
| for (i = 0; i < (int)E_ECHO_END_TOKEN; i++) { |
| if (echoFileNames[i] != nullptr) { |
| free(echoFileNames[i]); |
| } |
| } |
| free(echoFileNames); |
| free(echoFileEnabled); |
| echoFileNames = nullptr; |
| echoFileEnabled = nullptr; |
| } |
| } |
| |
| void setOutputFileName(enum e_output_files ename, const char* name, const char* default_name) { |
| if (outputFileNames == nullptr) { |
| alloc_and_load_output_file_names(default_name); |
| } |
| if (outputFileNames[(int)ename] != nullptr) { |
| free(outputFileNames[(int)ename]); |
| } |
| outputFileNames[(int)ename] = vtr::strdup(name); |
| } |
| |
| char* getOutputFileName(enum e_output_files ename) { |
| return outputFileNames[(int)ename]; |
| } |
| |
| void alloc_and_load_output_file_names(const std::string default_name) { |
| char* name; |
| |
| if (outputFileNames == nullptr) { |
| outputFileNames = (char**)vtr::calloc((int)E_FILE_END_TOKEN, sizeof(char*)); |
| |
| name = (char*)vtr::malloc((strlen(default_name.c_str()) + 40) * sizeof(char)); |
| sprintf(name, "%s.critical_path.out", default_name.c_str()); |
| setOutputFileName(E_CRIT_PATH_FILE, name, default_name.c_str()); |
| |
| sprintf(name, "%s.slack.out", default_name.c_str()); |
| setOutputFileName(E_SLACK_FILE, name, default_name.c_str()); |
| |
| sprintf(name, "%s.criticality.out", default_name.c_str()); |
| setOutputFileName(E_CRITICALITY_FILE, name, default_name.c_str()); |
| |
| free(name); |
| } |
| } |
| |
| void free_output_file_names() { |
| int i; |
| if (outputFileNames != nullptr) { |
| for (i = 0; i < (int)E_FILE_END_TOKEN; i++) { |
| if (outputFileNames[i] != nullptr) { |
| free(outputFileNames[i]); |
| outputFileNames[i] = nullptr; |
| } |
| } |
| free(outputFileNames); |
| outputFileNames = nullptr; |
| } |
| } |