aboutsummaryrefslogtreecommitdiffstats
path: root/common/timing_opt.cc
diff options
context:
space:
mode:
authorDavid Shah <dave@ds0.me>2018-12-01 13:22:57 +0000
committerDavid Shah <dave@ds0.me>2018-12-06 10:53:01 +0000
commit83e32775775cc06d0f70a18e2a18089c38ff3c35 (patch)
tree1cc78704329758d8a3b543d41588b141e7e2b477 /common/timing_opt.cc
parent9a42b64a6853a3802a6d934a1ca251e84ddb7e07 (diff)
downloadnextpnr-83e32775775cc06d0f70a18e2a18089c38ff3c35.tar.gz
nextpnr-83e32775775cc06d0f70a18e2a18089c38ff3c35.tar.bz2
nextpnr-83e32775775cc06d0f70a18e2a18089c38ff3c35.zip
timing_opt: Implement neighbour Bel finder
Signed-off-by: David Shah <dave@ds0.me>
Diffstat (limited to 'common/timing_opt.cc')
-rw-r--r--common/timing_opt.cc77
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;
};