blob: 3896cd84ea28bf3018f7e055cad75a2cc4e065b9 [file] [log] [blame]
#include "channel_stats.h"
#include "route_util.h"
#include "histogram.h"
#include "globals.h"
void print_channel_stats() {
std::vector<HistogramBucket> histogram;
auto& device_ctx = g_vpr_ctx.device();
//Bins by 10%, with final > 1 bin
histogram.emplace_back(0., 0.1);
histogram.emplace_back(0.1, 0.2);
histogram.emplace_back(0.2, 0.3);
histogram.emplace_back(0.3, 0.4);
histogram.emplace_back(0.4, 0.5);
histogram.emplace_back(0.5, 0.6);
histogram.emplace_back(0.7, 0.8);
histogram.emplace_back(0.8, 0.9);
histogram.emplace_back(0.9, 1.0);
histogram.emplace_back(1.0, std::numeric_limits<float>::infinity());
auto chanx_usage = calculate_routing_usage(CHANX);
auto chany_usage = calculate_routing_usage(CHANY);
auto chanx_avail = calculate_routing_avail(CHANX);
auto chany_avail = calculate_routing_avail(CHANY);
auto comp = [](const HistogramBucket& bucket, float value) {
return bucket.max_value < value;
};
float max_util = 0.;
size_t peak_x = 0.;
size_t peak_y = 0.;
for (size_t x = 0; x < device_ctx.grid.width() - 1; ++x) {
for (size_t y = 0; y < device_ctx.grid.height() - 1; ++y) {
float chanx_util = routing_util(chanx_usage[x][y], chanx_avail[x][y]);
float chany_util = routing_util(chanx_usage[x][y], chanx_avail[x][y]);
for (float util : {chanx_util, chany_util}) {
//Record peak utilization
if (util > max_util) {
max_util = util;
peak_x = x;
peak_y = y;
}
//Find histogram bin
auto iter = std::lower_bound(histogram.begin(), histogram.end(), util, comp);
VTR_ASSERT(iter != histogram.end());
iter->count++; //Add to bin
}
}
}
//Makes more sense from high to low, so reverse
std::reverse(histogram.begin(), histogram.end());
VTR_LOG("\n");
VTR_LOG("Routing channel utilization histogram:\n");
print_histogram(histogram);
VTR_LOG("Maximum routing channel utilization: %9.2g at (%zu,%zu)\n", max_util, peak_x, peak_y);
}