diff options
Diffstat (limited to 'common/timing_opt.cc')
-rw-r--r-- | common/timing_opt.cc | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/common/timing_opt.cc b/common/timing_opt.cc index b33c2db0..de8e00a5 100644 --- a/common/timing_opt.cc +++ b/common/timing_opt.cc @@ -34,6 +34,83 @@ class TimingOptimiser bool optimise() {} private: + // Ratio of available to already-candidates to begin borrowing + const float borrow_thresh = 0.2; + + bool check_cell_delay_limits(CellInfo *cell) { + + } + + bool acceptable_bel_candidate(CellInfo *cell, BelId newBel) { + bool result = true; + // At the moment we have to actually do the swap to get an accurate legality result + // Switching to macro swaps might help with this + BelId oldBel = cell->bel; + CellInfo *other_cell = ctx->getBoundBelCell(newBel); + if (other_cell != nullptr && other_cell->belStrength > STRENGTH_WEAK) { + return false; + } + + ctx->bindBel(newBel, cell, STRENGTH_WEAK); + if (other_cell != nullptr) { + ctx->bindBel(oldBel, other_cell, STRENGTH_WEAK); + } + if (!ctx->isBelLocationValid(newBel) || ((other_cell != nullptr && !ctx->isBelLocationValid(oldBel)))) { + result = false; + goto unbind; + } + + + +unbind: + ctx->unbindBel(newBel); + if (other_cell != nullptr) + ctx->unbindBel(oldBel); + // Undo the swap + ctx->bindBel(oldBel, cell, STRENGTH_WEAK); + if (other_cell != nullptr) { + ctx->bindBel(newBel, other_cell, STRENGTH_WEAK); + } + return result; + } + + void find_neighbours(CellInfo *cell, int d) { + BelId curr = cell->bel; + Loc curr_loc = ctx->getBelLocation(curr); + for (int dy = -d; dy <= d; dy++) { + for (int dx = -d; dx <= d; dx++) { + if (dx == 0 && dy == 0) + continue; + // Go through all the Bels at this location + // First, find all bels of the correct type that are either unbound or bound normally + // Strongly bound bels are ignored + // FIXME: This means that we cannot touch carry chains or similar relatively constrained macros + std::vector<BelId> free_bels_at_loc; + std::vector<BelId> bound_bels_at_loc; + for (auto bel : ctx->getBelsByTile(curr_loc.x + dx, curr_loc.y + dy)) { + if (ctx->getBelType(bel) != cell->type) + continue; + CellInfo *bound = ctx->getBoundBelCell(bel); + if (bound == nullptr) { + free_bels_at_loc.push_back(bel); + } else if (bound->belStrength <= STRENGTH_WEAK) { + bound_bels_at_loc.push_back(bel); + } + } + bool found = false; + + if (found) + continue; + } + } + } + + // Current candidate Bels for cells (linked in both direction> + std::vector<IdString> path_cells; + std::unordered_map<IdString, std::unordered_set<BelId>> cell_neighbour_bels; + std::unordered_map<BelId, std::unordered_set<IdString>> bel_candidate_cells; + // Map net users to net delay limit + std::unordered_map<IdString, std::vector<delay_t>> max_net_delay; Context *ctx; }; |