aboutsummaryrefslogtreecommitdiffstats
path: root/ice40/arch.cc
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2018-07-20 18:09:22 +0200
committerClifford Wolf <clifford@clifford.at>2018-07-20 18:09:22 +0200
commitfd8239e170a7391d9c25d8681083507d9960abef (patch)
treea051a9eef682ab922c474850d235f301c2c708fd /ice40/arch.cc
parentf6fa0300ae95a0896a12b9acf0c7e76851c13d37 (diff)
downloadnextpnr-fd8239e170a7391d9c25d8681083507d9960abef.tar.gz
nextpnr-fd8239e170a7391d9c25d8681083507d9960abef.tar.bz2
nextpnr-fd8239e170a7391d9c25d8681083507d9960abef.zip
Add Location APIs to generic arch
Signed-off-by: Clifford Wolf <clifford@clifford.at>
Diffstat (limited to 'ice40/arch.cc')
-rw-r--r--ice40/arch.cc26
1 files changed, 19 insertions, 7 deletions
diff --git a/ice40/arch.cc b/ice40/arch.cc
index ceafca17..e9a7d2b6 100644
--- a/ice40/arch.cc
+++ b/ice40/arch.cc
@@ -255,24 +255,36 @@ BelId Arch::getBelByName(IdString name) const
return ret;
}
-BelId Arch::getBelByLocation(int x, int y, int z) const
+BelId Arch::getBelByLocation(Loc loc) const
{
+ BelId bel;
+
if (bel_by_loc.empty()) {
- for (int i = 0; i < chip_info->num_bels; i++)
- bel_by_loc[getBelLocation(BelId{i})] = i;
+ for (int i = 0; i < chip_info->num_bels; i++) {
+ BelId b;
+ b.index = i;
+ bel_by_loc[getBelLocation(b)] = i;
+ }
}
- auto it = bel_by_loc.find(Loc{x, y, z});
+ auto it = bel_by_loc.find(loc);
if (it != bel_by_loc.end())
- return BelId{it->second};
- return BelId();
+ bel.index = it->second;
+
+ return bel;
}
BelRange Arch::getBelsByTile(int x, int y) const
{
// In iCE40 chipdb bels at the same tile are consecutive and dense z ordinates are used
BelRange br;
- br.b.cursor = Arch::getBelByLocation(x, y, 0);
+
+ Loc loc;
+ loc.x = x;
+ loc.y = y;
+ loc.z = 0;
+
+ br.b.cursor = Arch::getBelByLocation(loc).index;
br.e.cursor = br.b.cursor;
if (br.e.cursor != -1) {