aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ecp5/arch.cc36
-rw-r--r--ecp5/arch.h14
2 files changed, 50 insertions, 0 deletions
diff --git a/ecp5/arch.cc b/ecp5/arch.cc
index 90950492..a817651e 100644
--- a/ecp5/arch.cc
+++ b/ecp5/arch.cc
@@ -344,6 +344,42 @@ std::vector<PortPin> Arch::getBelPins(BelId bel) const
return ret;
}
+BelId Arch::getBelByLocation(Loc loc) const {
+ if (loc.x >= chip_info->width || loc.y >= chip_info->height)
+ return BelId();
+ const LocationTypePOD &locI = chip_info->locations[chip_info->location_type[loc.y * chip_info->width + loc.x]];
+ for (int i = 0; i < locI.num_bels; i++) {
+ if (locI.bel_data[i].z == loc.z) {
+ BelId bi;
+ bi.location.x = loc.x;
+ bi.location.y = loc.y;
+ bi.index = i;
+ return bi;
+ }
+ }
+ return BelId();
+}
+
+BelRange Arch::getBelsByTile(int x, int y) const {
+ BelRange br;
+
+ int num_bels = 0;
+
+ if (x < chip_info->width && y < chip_info->height) {
+ const LocationTypePOD &locI = chip_info->locations[chip_info->location_type[y * chip_info->width + x]];
+ num_bels = locI.num_bels;
+ }
+
+ br.b.cursor_tile = y * chip_info->width + x;
+ br.e.cursor_tile = y * chip_info->width + x;
+ br.b.cursor_index = 0;
+ br.e.cursor_index = num_bels - 1;
+ br.b.chip = chip_info;
+ br.e.chip = chip_info;
+ ++br.e;
+ return br;
+}
+
// -----------------------------------------------------------------------
void Arch::estimatePosition(BelId bel, int &x, int &y, bool &gb) const
diff --git a/ecp5/arch.h b/ecp5/arch.h
index 9d99da8c..92240719 100644
--- a/ecp5/arch.h
+++ b/ecp5/arch.h
@@ -426,6 +426,20 @@ struct Arch : BaseCtx
bel_to_cell[bel] = IdString();
}
+ Loc getBelLocation(BelId bel) const
+ {
+ Loc loc;
+ loc.x = bel.location.x;
+ loc.y = bel.location.y;
+ loc.z = locInfo(bel)->bel_data[bel.index].z;
+ return loc;
+ }
+
+ BelId getBelByLocation(Loc loc) const;
+ BelRange getBelsByTile(int x, int y) const;
+
+ bool getBelGlobalBuf(BelId bel) const { return false; }
+
bool checkBelAvail(BelId bel) const
{
NPNR_ASSERT(bel != BelId());