HeAP: Add multithreading
Signed-off-by: David Shah <dave@ds0.me>
This commit is contained in:
parent
eb638c47b3
commit
05e9ae183d
@ -32,6 +32,7 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
#include <thread>
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "nextpnr.h"
|
#include "nextpnr.h"
|
||||||
#include "place_common.h"
|
#include "place_common.h"
|
||||||
@ -130,18 +131,15 @@ class HeAPPlacer
|
|||||||
update_all_chains();
|
update_all_chains();
|
||||||
wirelen_t hpwl = total_hpwl();
|
wirelen_t hpwl = total_hpwl();
|
||||||
log_info("Initial placer starting hpwl = %d\n", int(hpwl));
|
log_info("Initial placer starting hpwl = %d\n", int(hpwl));
|
||||||
for (int i = 0; i < 20; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
setup_solve_cells();
|
setup_solve_cells();
|
||||||
|
|
||||||
EquationSystem<double> esx(solve_cells.size(), solve_cells.size());
|
std::thread xaxis([&](){build_solve_direction(false, -1);});
|
||||||
build_equations(esx, false);
|
std::thread yaxis([&](){build_solve_direction(true, -1);});
|
||||||
// log_info("x-axis\n");
|
|
||||||
solve_equations(esx, false);
|
xaxis.join();
|
||||||
|
yaxis.join();
|
||||||
|
|
||||||
EquationSystem<double> esy(solve_cells.size(), solve_cells.size());
|
|
||||||
build_equations(esy, true);
|
|
||||||
// log_info("y-axis\n");
|
|
||||||
solve_equations(esy, true);
|
|
||||||
|
|
||||||
update_all_chains();
|
update_all_chains();
|
||||||
|
|
||||||
@ -165,26 +163,16 @@ class HeAPPlacer
|
|||||||
best_hpwl = std::numeric_limits<wirelen_t>::max();
|
best_hpwl = std::numeric_limits<wirelen_t>::max();
|
||||||
valid = true;
|
valid = true;
|
||||||
}
|
}
|
||||||
|
setup_solve_cells();
|
||||||
|
|
||||||
for (int i = 0; i < 5; i++) {
|
std::thread xaxis([&](){build_solve_direction(false, (iter == 0) ? -1 : iter);});
|
||||||
setup_solve_cells();
|
std::thread yaxis([&](){build_solve_direction(true, (iter == 0) ? -1 : iter);});
|
||||||
|
|
||||||
EquationSystem<double> esx(solve_cells.size(), solve_cells.size());
|
xaxis.join();
|
||||||
build_equations(esx, false, (iter == 0) ? -1 : iter);
|
yaxis.join();
|
||||||
// log_info("x-axis\n");
|
|
||||||
solve_equations(esx, false);
|
|
||||||
|
|
||||||
EquationSystem<double> esy(solve_cells.size(), solve_cells.size());
|
|
||||||
build_equations(esy, true, (iter == 0) ? -1 : iter);
|
|
||||||
// log_info("y-axis\n");
|
|
||||||
solve_equations(esy, true);
|
|
||||||
|
|
||||||
update_all_chains();
|
|
||||||
|
|
||||||
solved_hpwl = total_hpwl();
|
|
||||||
log_info("Initial placer iter %d, hpwl = %d\n", i, int(solved_hpwl));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
update_all_chains();
|
||||||
|
solved_hpwl = total_hpwl();
|
||||||
log_info("Solved HPWL = %d\n", int(solved_hpwl));
|
log_info("Solved HPWL = %d\n", int(solved_hpwl));
|
||||||
|
|
||||||
update_all_chains();
|
update_all_chains();
|
||||||
@ -397,6 +385,15 @@ class HeAPPlacer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Build and solve in one direction
|
||||||
|
void build_solve_direction(bool yaxis, int iter) {
|
||||||
|
for (int i = 0; i < 5; i++) {
|
||||||
|
EquationSystem<double> esx(solve_cells.size(), solve_cells.size());
|
||||||
|
build_equations(esx, yaxis, iter);
|
||||||
|
solve_equations(esx, yaxis);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Check if a cell has any meaningful connectivity
|
// Check if a cell has any meaningful connectivity
|
||||||
bool has_connectivity(CellInfo *cell)
|
bool has_connectivity(CellInfo *cell)
|
||||||
{
|
{
|
||||||
@ -599,7 +596,7 @@ class HeAPPlacer
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (iter != -1) {
|
if (iter != -1) {
|
||||||
const float alpha = 0.3;
|
const float alpha = 0.2;
|
||||||
for (size_t row = 0; row < solve_cells.size(); row++) {
|
for (size_t row = 0; row < solve_cells.size(); row++) {
|
||||||
int l_pos = legal_pos(solve_cells.at(row));
|
int l_pos = legal_pos(solve_cells.at(row));
|
||||||
int c_pos = cell_pos(solve_cells.at(row));
|
int c_pos = cell_pos(solve_cells.at(row));
|
||||||
|
Loading…
Reference in New Issue
Block a user