|
| 1 | +#include <fstream> |
| 2 | +#include <sstream> |
| 3 | + |
1 | 4 | #include "timing_reports.h"
|
2 | 5 |
|
3 | 6 | #include "tatum/TimingReporter.hpp"
|
@@ -61,3 +64,58 @@ void generate_hold_timing_stats(const std::string& prefix,
|
61 | 64 |
|
62 | 65 | timing_reporter.report_unconstrained_hold(prefix + "report_unconstrained_timing.hold.rpt", *timing_info.hold_analyzer());
|
63 | 66 | }
|
| 67 | + |
| 68 | +void generate_net_timing_report(const std::string& prefix, |
| 69 | + const SetupHoldTimingInfo& timing_info, |
| 70 | + const AnalysisDelayCalculator& delay_calc) { |
| 71 | + /* Create a report file for net timing information */ |
| 72 | + std::ofstream os(prefix + "report_net_timing.rpt"); |
| 73 | + const auto& atom_netlist = g_vpr_ctx.atom().netlist(); |
| 74 | + const auto& atom_lookup = g_vpr_ctx.atom().lookup(); |
| 75 | + |
| 76 | + const auto& timing_ctx = g_vpr_ctx.timing(); |
| 77 | + const auto& timing_graph = timing_ctx.graph; |
| 78 | + |
| 79 | + for (const auto& net : atom_netlist.nets()) { |
| 80 | + /* Skip constant nets */ |
| 81 | + if (atom_netlist.net_is_constant(net)) { |
| 82 | + continue; |
| 83 | + } |
| 84 | + |
| 85 | + const auto& net_name = atom_netlist.net_name(net); |
| 86 | + |
| 87 | + /* Get source pin and its timing information */ |
| 88 | + const auto& source_pin = *atom_netlist.net_pins(net).begin(); |
| 89 | + auto source_pin_slack = timing_info.setup_pin_slack(source_pin); |
| 90 | + /* Timing graph node id corresponding to the net's source pin */ |
| 91 | + auto tg_source_node = atom_lookup.atom_pin_tnode(source_pin); |
| 92 | + VTR_ASSERT(tg_source_node.is_valid()); |
| 93 | + |
| 94 | + const size_t fanout = atom_netlist.net_sinks(net).size(); |
| 95 | + os << net_name << " : " << fanout << " : " << atom_netlist.pin_name(source_pin).c_str() << " " << source_pin_slack << " : "; |
| 96 | + |
| 97 | + /* Iterate over all fanout pins and print their timing information */ |
| 98 | + for (size_t net_pin_index = 1; net_pin_index <= fanout; ++net_pin_index) { |
| 99 | + const auto& pin = *(atom_netlist.net_pins(net).begin() + net_pin_index); |
| 100 | + |
| 101 | + /* Get timing graph node id corresponding to the fanout pin */ |
| 102 | + const auto& tg_sink_node = atom_lookup.atom_pin_tnode(pin); |
| 103 | + VTR_ASSERT(tg_sink_node.is_valid()); |
| 104 | + |
| 105 | + /* Get timing graph edge id between atom pins */ |
| 106 | + const auto& tg_edge_id = timing_graph->find_edge(tg_source_node, tg_sink_node); |
| 107 | + VTR_ASSERT(tg_edge_id.is_valid()); |
| 108 | + |
| 109 | + /* Get timing information for the fanout pin */ |
| 110 | + const auto& pin_setup_slack = timing_info.setup_pin_slack(pin); |
| 111 | + const auto& pin_delay = delay_calc.max_edge_delay(*timing_graph, tg_edge_id); |
| 112 | + |
| 113 | + const auto& pin_name = atom_netlist.pin_name(pin); |
| 114 | + os << pin_name << " " << std::scientific << pin_setup_slack << " " << pin_delay; |
| 115 | + if (net_pin_index < fanout) { |
| 116 | + os << " : "; |
| 117 | + } |
| 118 | + } |
| 119 | + os << "," << std::endl; |
| 120 | + } |
| 121 | +} |
0 commit comments