From cabdfe361655a9eb8132ff5c7afe8c1fa7a3847b Mon Sep 17 00:00:00 2001 From: David Shah Date: Fri, 15 Jun 2018 21:29:02 +0200 Subject: ice40: Only place IO at valid pins Signed-off-by: David Shah --- ice40/arch_place.cc | 7 ++++--- ice40/chip.cc | 9 +++++++++ ice40/chip.h | 1 + 3 files changed, 14 insertions(+), 3 deletions(-) (limited to 'ice40') diff --git a/ice40/arch_place.cc b/ice40/arch_place.cc index e4a6c5d7..492ed846 100644 --- a/ice40/arch_place.cc +++ b/ice40/arch_place.cc @@ -22,8 +22,8 @@ NEXTPNR_NAMESPACE_BEGIN -static const NetInfo * -get_net_or_nullptr(const CellInfo *cell, const IdString port) +static const NetInfo *get_net_or_nullptr(const CellInfo *cell, + const IdString port) { auto found = cell->ports.find(port); if (found != cell->ports.end()) @@ -97,7 +97,8 @@ bool isValidBelForCell(Design *design, CellInfo *cell, BelId bel) cells.push_back(cell); return logicCellsCompatible(cells); - + } else if (cell->type == "SB_IO") { + return design->chip.getBelPackagePin(bel) != ""; } else { // TODO: IO cell clock checks return true; diff --git a/ice40/chip.cc b/ice40/chip.cc index b40963bf..e24fb9ac 100644 --- a/ice40/chip.cc +++ b/ice40/chip.cc @@ -273,6 +273,15 @@ BelId Chip::getPackagePinBel(const std::string &pin) const return BelId(); } +std::string Chip::getBelPackagePin(BelId bel) const +{ + for (int i = 0; i < package_info->num_pins; i++) { + if (package_info->pins[i].bel_index == bel.index) { + return std::string(package_info->pins[i].name); + } + } + return ""; +} // ----------------------------------------------------------------------- bool Chip::estimatePosition(BelId bel, float &x, float &y) const diff --git a/ice40/chip.h b/ice40/chip.h index e2b54cdf..c0b0ec72 100644 --- a/ice40/chip.h +++ b/ice40/chip.h @@ -691,6 +691,7 @@ struct Chip } BelId getPackagePinBel(const std::string &pin) const; + std::string getBelPackagePin(BelId bel) const; // ------------------------------------------------- -- cgit v1.2.3