router2: Congestion map generation
Signed-off-by: David Shah <dave@ds0.me>
This commit is contained in:
parent
010e7ba8cb
commit
c21db8a0c1
@ -29,6 +29,7 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <boost/container/flat_map.hpp>
|
#include <boost/container/flat_map.hpp>
|
||||||
#include <deque>
|
#include <deque>
|
||||||
|
#include <fstream>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "nextpnr.h"
|
#include "nextpnr.h"
|
||||||
@ -670,6 +671,45 @@ struct Router2
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void write_heatmap(std::ostream &out, bool congestion = false)
|
||||||
|
{
|
||||||
|
std::vector<std::vector<int>> hm_xy;
|
||||||
|
int max_x = 0, max_y = 0;
|
||||||
|
for (auto &w : wires) {
|
||||||
|
auto &wd = w.second;
|
||||||
|
int val = int(wd.bound_nets.size()) - (congestion ? 1 : 0);
|
||||||
|
if (wd.bound_nets.empty())
|
||||||
|
continue;
|
||||||
|
// Estimate wire location by driving pip location
|
||||||
|
PipId drv;
|
||||||
|
for (auto &bn : wd.bound_nets)
|
||||||
|
if (bn.second.second != PipId()) {
|
||||||
|
drv = bn.second.second;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (drv == PipId())
|
||||||
|
continue;
|
||||||
|
Loc l = ctx->getPipLocation(drv);
|
||||||
|
max_x = std::max(max_x, l.x);
|
||||||
|
max_y = std::max(max_y, l.y);
|
||||||
|
if (l.y >= int(hm_xy.size()))
|
||||||
|
hm_xy.resize(l.y + 1);
|
||||||
|
if (l.x >= int(hm_xy.at(l.y).size()))
|
||||||
|
hm_xy.at(l.y).resize(l.x + 1);
|
||||||
|
if (val > 0)
|
||||||
|
hm_xy.at(l.y).at(l.x) += val;
|
||||||
|
}
|
||||||
|
for (int y = 0; y <= max_y; y++) {
|
||||||
|
for (int x = 0; x <= max_x; x++) {
|
||||||
|
if (y >= int(hm_xy.size()) || x >= int(hm_xy.at(y).size()))
|
||||||
|
out << "0,";
|
||||||
|
else
|
||||||
|
out << hm_xy.at(y).at(x) << ",";
|
||||||
|
}
|
||||||
|
out << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void router_test()
|
void router_test()
|
||||||
{
|
{
|
||||||
setup_nets();
|
setup_nets();
|
||||||
@ -691,6 +731,12 @@ struct Router2
|
|||||||
}
|
}
|
||||||
route_queue.clear();
|
route_queue.clear();
|
||||||
update_congestion();
|
update_congestion();
|
||||||
|
#if 1
|
||||||
|
if (iter == 1 && ctx->debug) {
|
||||||
|
std::ofstream cong_map("cong_map_0.csv");
|
||||||
|
write_heatmap(cong_map, true);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (overused_wires == 0) {
|
if (overused_wires == 0) {
|
||||||
// Try and actually bind nextpnr Arch API wires
|
// Try and actually bind nextpnr Arch API wires
|
||||||
bind_and_check_all();
|
bind_and_check_all();
|
||||||
|
Loading…
Reference in New Issue
Block a user