HeAP: Make solver tolerance arch-configurable
Signed-off-by: David Shah <dave@ds0.me>
This commit is contained in:
parent
7bda6f15a9
commit
1ff060c5ad
@ -97,7 +97,7 @@ template <typename T> struct EquationSystem
|
|||||||
|
|
||||||
void add_rhs(int row, T val) { rhs[row] += val; }
|
void add_rhs(int row, T val) { rhs[row] += val; }
|
||||||
|
|
||||||
void solve(std::vector<T> &x)
|
void solve(std::vector<T> &x, float tolerance)
|
||||||
{
|
{
|
||||||
using namespace Eigen;
|
using namespace Eigen;
|
||||||
if (x.empty())
|
if (x.empty())
|
||||||
@ -123,7 +123,7 @@ template <typename T> struct EquationSystem
|
|||||||
vb[i] = rhs.at(i);
|
vb[i] = rhs.at(i);
|
||||||
|
|
||||||
ConjugateGradient<SparseMatrix<T>, Lower | Upper> solver;
|
ConjugateGradient<SparseMatrix<T>, Lower | Upper> solver;
|
||||||
solver.setTolerance(1e-5);
|
solver.setTolerance(tolerance);
|
||||||
VectorXd xr = solver.compute(mat).solveWithGuess(vb, vx);
|
VectorXd xr = solver.compute(mat).solveWithGuess(vb, vx);
|
||||||
for (int i = 0; i < int(x.size()); i++)
|
for (int i = 0; i < int(x.size()); i++)
|
||||||
x.at(i) = xr[i];
|
x.at(i) = xr[i];
|
||||||
@ -712,7 +712,7 @@ class HeAPPlacer
|
|||||||
auto cell_pos = [&](CellInfo *cell) { return yaxis ? cell_locs.at(cell->name).y : cell_locs.at(cell->name).x; };
|
auto cell_pos = [&](CellInfo *cell) { return yaxis ? cell_locs.at(cell->name).y : cell_locs.at(cell->name).x; };
|
||||||
std::vector<double> vals;
|
std::vector<double> vals;
|
||||||
std::transform(solve_cells.begin(), solve_cells.end(), std::back_inserter(vals), cell_pos);
|
std::transform(solve_cells.begin(), solve_cells.end(), std::back_inserter(vals), cell_pos);
|
||||||
es.solve(vals);
|
es.solve(vals, cfg.solverTolerance);
|
||||||
for (size_t i = 0; i < vals.size(); i++)
|
for (size_t i = 0; i < vals.size(); i++)
|
||||||
if (yaxis) {
|
if (yaxis) {
|
||||||
cell_locs.at(solve_cells.at(i)->name).rawy = vals.at(i);
|
cell_locs.at(solve_cells.at(i)->name).rawy = vals.at(i);
|
||||||
@ -1610,6 +1610,7 @@ PlacerHeapCfg::PlacerHeapCfg(Context *ctx)
|
|||||||
criticalityExponent = ctx->setting<int>("placerHeap/criticalityExponent", 2);
|
criticalityExponent = ctx->setting<int>("placerHeap/criticalityExponent", 2);
|
||||||
timingWeight = ctx->setting<int>("placerHeap/timingWeight", 10);
|
timingWeight = ctx->setting<int>("placerHeap/timingWeight", 10);
|
||||||
timing_driven = ctx->setting<bool>("timing_driven");
|
timing_driven = ctx->setting<bool>("timing_driven");
|
||||||
|
solverTolerance = 1e-5;
|
||||||
}
|
}
|
||||||
|
|
||||||
NEXTPNR_NAMESPACE_END
|
NEXTPNR_NAMESPACE_END
|
||||||
|
@ -39,6 +39,7 @@ struct PlacerHeapCfg
|
|||||||
float criticalityExponent;
|
float criticalityExponent;
|
||||||
float timingWeight;
|
float timingWeight;
|
||||||
bool timing_driven;
|
bool timing_driven;
|
||||||
|
float solverTolerance;
|
||||||
|
|
||||||
std::unordered_set<IdString> ioBufTypes;
|
std::unordered_set<IdString> ioBufTypes;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user