aboutsummaryrefslogtreecommitdiffstats
path: root/ecp5/arch.h
diff options
context:
space:
mode:
authorDavid Shah <davey1576@gmail.com>2018-08-18 19:04:32 +0100
committerDavid Shah <davey1576@gmail.com>2018-08-18 19:04:32 +0100
commit0b35cb4e60c114b3d84ae39d0462a20085ef2bd4 (patch)
tree90223b0b15e6ced4f73dc2ae0a9b2425f36d2c42 /ecp5/arch.h
parent72a9a475fad693dd6e96c5fa55d02a8869e97120 (diff)
downloadnextpnr-0b35cb4e60c114b3d84ae39d0462a20085ef2bd4.tar.gz
nextpnr-0b35cb4e60c114b3d84ae39d0462a20085ef2bd4.tar.bz2
nextpnr-0b35cb4e60c114b3d84ae39d0462a20085ef2bd4.zip
ecp5: Flatten bel_to_cell for performance
Signed-off-by: David Shah <davey1576@gmail.com>
Diffstat (limited to 'ecp5/arch.h')
-rw-r--r--ecp5/arch.h40
1 files changed, 18 insertions, 22 deletions
diff --git a/ecp5/arch.h b/ecp5/arch.h
index 5b2738b5..410ab15d 100644
--- a/ecp5/arch.h
+++ b/ecp5/arch.h
@@ -404,7 +404,7 @@ struct Arch : BaseCtx
mutable std::unordered_map<IdString, WireId> wire_by_name;
mutable std::unordered_map<IdString, PipId> pip_by_name;
- std::unordered_map<BelId, CellInfo *> bel_to_cell;
+ std::vector<CellInfo *> bel_to_cell;
std::unordered_map<WireId, NetInfo *> wire_to_net;
std::unordered_map<PipId, NetInfo *> pip_to_net;
@@ -443,11 +443,18 @@ struct Arch : BaseCtx
uint32_t getBelChecksum(BelId bel) const { return bel.index; }
+ const int max_loc_bels = 20;
+ int getBelFlatIndex(BelId bel) const
+ {
+ return (bel.location.y * chip_info->width + bel.location.x) * max_loc_bels + bel.index;
+ }
+
void bindBel(BelId bel, CellInfo *cell, PlaceStrength strength)
{
NPNR_ASSERT(bel != BelId());
- NPNR_ASSERT(bel_to_cell[bel] == nullptr);
- bel_to_cell[bel] = cell;
+ int idx = getBelFlatIndex(bel);
+ NPNR_ASSERT(bel_to_cell.at(idx) == nullptr);
+ bel_to_cell[idx] = cell;
cell->bel = bel;
cell->belStrength = strength;
refreshUiBel(bel);
@@ -456,10 +463,11 @@ struct Arch : BaseCtx
void unbindBel(BelId bel)
{
NPNR_ASSERT(bel != BelId());
- NPNR_ASSERT(bel_to_cell[bel] != nullptr);
- bel_to_cell[bel]->bel = BelId();
- bel_to_cell[bel]->belStrength = STRENGTH_NONE;
- bel_to_cell[bel] = nullptr;
+ int idx = getBelFlatIndex(bel);
+ NPNR_ASSERT(bel_to_cell.at(idx) != nullptr);
+ bel_to_cell[idx]->bel = BelId();
+ bel_to_cell[idx]->belStrength = STRENGTH_NONE;
+ bel_to_cell[idx] = nullptr;
refreshUiBel(bel);
}
@@ -480,31 +488,19 @@ struct Arch : BaseCtx
bool checkBelAvail(BelId bel) const
{
NPNR_ASSERT(bel != BelId());
- auto found = bel_to_cell.find(bel);
- if (found == bel_to_cell.end())
- return true;
- else
- return found->second == nullptr;
+ return bel_to_cell[getBelFlatIndex(bel)] == nullptr;
}
CellInfo *getBoundBelCell(BelId bel) const
{
NPNR_ASSERT(bel != BelId());
- auto found = bel_to_cell.find(bel);
- if (found == bel_to_cell.end())
- return nullptr;
- else
- return found->second;
+ return bel_to_cell[getBelFlatIndex(bel)];
}
CellInfo *getConflictingBelCell(BelId bel) const
{
NPNR_ASSERT(bel != BelId());
- auto found = bel_to_cell.find(bel);
- if (found == bel_to_cell.end())
- return nullptr;
- else
- return found->second;
+ return bel_to_cell[getBelFlatIndex(bel)];
}
BelRange getBels() const