aboutsummaryrefslogtreecommitdiffstats
path: root/ice40
diff options
context:
space:
mode:
authorSergiusz Bazanski <q3k@q3k.org>2018-07-13 14:50:58 +0100
committerSergiusz Bazanski <q3k@q3k.org>2018-07-13 14:50:58 +0100
commit9e4f97290a50fc5d9dc0cbe6ead945840b9811b1 (patch)
tree92ceb562f28bb42d4bd1913dbeba38dd34c5ca94 /ice40
parent0816f447b768ebe0632f419e9b696714dda4e860 (diff)
downloadnextpnr-9e4f97290a50fc5d9dc0cbe6ead945840b9811b1.tar.gz
nextpnr-9e4f97290a50fc5d9dc0cbe6ead945840b9811b1.tar.bz2
nextpnr-9e4f97290a50fc5d9dc0cbe6ead945840b9811b1.zip
Make PnR use Unlocked methods
Diffstat (limited to 'ice40')
-rw-r--r--ice40/arch.cc26
-rw-r--r--ice40/arch.h117
-rw-r--r--ice40/arch_place.cc6
-rw-r--r--ice40/place_legaliser.cc14
4 files changed, 129 insertions, 34 deletions
diff --git a/ice40/arch.cc b/ice40/arch.cc
index 88a900d8..6c00f0d2 100644
--- a/ice40/arch.cc
+++ b/ice40/arch.cc
@@ -242,6 +242,11 @@ IdString Arch::archArgsToId(ArchArgs args) const
BelId Arch::getBelByName(IdString name) const
{
boost::lock_guard<boost::shared_mutex> lock(mtx_);
+ return getBelByNameUnlocked(name);
+}
+
+BelId Arch::getBelByNameUnlocked(IdString name) const
+{
BelId ret;
if (bel_by_name.empty()) {
@@ -276,8 +281,13 @@ BelRange Arch::getBelsAtSameTile(BelId bel) const
WireId Arch::getWireBelPin(BelId bel, PortPin pin) const
{
- WireId ret;
boost::shared_lock_guard<boost::shared_mutex> lock(mtx_);
+ return getWireBelPinUnlocked(bel, pin);
+}
+
+WireId Arch::getWireBelPinUnlocked(BelId bel, PortPin pin) const
+{
+ WireId ret;
NPNR_ASSERT(bel != BelId());
@@ -297,8 +307,13 @@ WireId Arch::getWireBelPin(BelId bel, PortPin pin) const
WireId Arch::getWireByName(IdString name) const
{
- WireId ret;
boost::shared_lock_guard<boost::shared_mutex> lock(mtx_);
+ return getWireByNameUnlocked(name);
+}
+
+WireId Arch::getWireByNameUnlocked(IdString name) const
+{
+ WireId ret;
if (wire_by_name.empty()) {
for (int i = 0; i < chip_info->num_wires; i++)
@@ -316,8 +331,13 @@ WireId Arch::getWireByName(IdString name) const
PipId Arch::getPipByName(IdString name) const
{
- PipId ret;
boost::shared_lock_guard<boost::shared_mutex> lock(mtx_);
+ return getPipByNameUnlocked(name);
+}
+
+PipId Arch::getPipByNameUnlocked(IdString name) const
+{
+ PipId ret;
if (pip_by_name.empty()) {
for (int i = 0; i < chip_info->num_pips; i++) {
diff --git a/ice40/arch.h b/ice40/arch.h
index 410df48b..ab66e7d8 100644
--- a/ice40/arch.h
+++ b/ice40/arch.h
@@ -362,6 +362,7 @@ public:
// -------------------------------------------------
BelId getBelByName(IdString name) const;
+ BelId getBelByNameUnlocked(IdString name) const;
IdString getBelName(BelId bel) const
{
@@ -371,11 +372,15 @@ public:
uint32_t getBelChecksum(BelId bel) const { return bel.index; }
- void bindBel(BelId bel, IdString cell, PlaceStrength strength)
+ void bindBel(BelId bel, IdString cell, PlaceStrength strength) {
+ boost::lock_guard<boost::shared_mutex> lock(mtx_);
+ bindBelUnlocked(bel, cell, strength);
+ }
+
+ void bindBelUnlocked(BelId bel, IdString cell, PlaceStrength strength)
{
NPNR_ASSERT(bel != BelId());
NPNR_ASSERT(bel_to_cell[bel.index] == IdString());
- boost::lock_guard<boost::shared_mutex> lock(mtx_);
bel_to_cell[bel.index] = cell;
cells[cell]->bel = bel;
cells[cell]->belStrength = strength;
@@ -383,9 +388,14 @@ public:
void unbindBel(BelId bel)
{
+ boost::lock_guard<boost::shared_mutex> lock(mtx_);
+ unbindBelUnlocked(bel);
+ }
+
+ void unbindBelUnlocked(BelId bel)
+ {
NPNR_ASSERT(bel != BelId());
NPNR_ASSERT(bel_to_cell[bel.index] != IdString());
- boost::lock_guard<boost::shared_mutex> lock(mtx_);
cells[bel_to_cell[bel.index]]->bel = BelId();
cells[bel_to_cell[bel.index]]->belStrength = STRENGTH_NONE;
bel_to_cell[bel.index] = IdString();
@@ -393,22 +403,37 @@ public:
bool checkBelAvail(BelId bel) const
{
- NPNR_ASSERT(bel != BelId());
boost::shared_lock_guard<boost::shared_mutex> lock(mtx_);
+ return checkBelAvailUnlocked(bel);
+ }
+
+ bool checkBelAvailUnlocked(BelId bel) const
+ {
+ NPNR_ASSERT(bel != BelId());
return bel_to_cell[bel.index] == IdString();
}
IdString getBoundBelCell(BelId bel) const
{
- NPNR_ASSERT(bel != BelId());
boost::shared_lock_guard<boost::shared_mutex> lock(mtx_);
+ return getBoundBelCellUnlocked(bel);
+ }
+
+ IdString getBoundBelCellUnlocked(BelId bel) const
+ {
+ NPNR_ASSERT(bel != BelId());
return bel_to_cell[bel.index];
}
IdString getConflictingBelCell(BelId bel) const
{
- NPNR_ASSERT(bel != BelId());
boost::shared_lock_guard<boost::shared_mutex> lock(mtx_);
+ return getConflictingBelCellUnlocked(bel);
+ }
+
+ IdString getConflictingBelCellUnlocked(BelId bel) const
+ {
+ NPNR_ASSERT(bel != BelId());
return bel_to_cell[bel.index];
}
@@ -425,11 +450,11 @@ public:
BelRange range;
// FIXME
#if 0
- if (type == "TYPE_A") {
- range.b.cursor = bels_type_a_begin;
- range.e.cursor = bels_type_a_end;
- }
- ...
+ if (type == "TYPE_A") {
+ range.b.cursor = bels_type_a_begin;
+ range.e.cursor = bels_type_a_end;
+ }
+ ...
#endif
return range;
}
@@ -443,6 +468,7 @@ public:
}
WireId getWireBelPin(BelId bel, PortPin pin) const;
+ WireId getWireBelPinUnlocked(BelId bel, PortPin pin) const;
BelPin getBelPinUphill(WireId wire) const
{
@@ -469,6 +495,7 @@ public:
// -------------------------------------------------
WireId getWireByName(IdString name) const;
+ WireId getWireByNameUnlocked(IdString name) const;
IdString getWireName(WireId wire) const
{
@@ -480,9 +507,14 @@ public:
void bindWire(WireId wire, IdString net, PlaceStrength strength)
{
+ boost::lock_guard<boost::shared_mutex> lock(mtx_);
+ bindWireUnlocked(wire, net, strength);
+ }
+
+ void bindWireUnlocked(WireId wire, IdString net, PlaceStrength strength)
+ {
NPNR_ASSERT(wire != WireId());
NPNR_ASSERT(wire_to_net[wire.index] == IdString());
- boost::lock_guard<boost::shared_mutex> lock(mtx_);
wire_to_net[wire.index] = net;
nets[net]->wires[wire].pip = PipId();
@@ -491,9 +523,14 @@ public:
void unbindWire(WireId wire)
{
+ boost::lock_guard<boost::shared_mutex> lock(mtx_);
+ unbindWireUnlocked(wire);
+ }
+
+ void unbindWireUnlocked(WireId wire)
+ {
NPNR_ASSERT(wire != WireId());
NPNR_ASSERT(wire_to_net[wire.index] != IdString());
- boost::lock_guard<boost::shared_mutex> lock(mtx_);
auto &net_wires = nets[wire_to_net[wire.index]]->wires;
auto it = net_wires.find(wire);
@@ -511,25 +548,37 @@ public:
bool checkWireAvail(WireId wire) const
{
- NPNR_ASSERT(wire != WireId());
boost::shared_lock_guard<boost::shared_mutex> lock(mtx_);
+ return checkWireAvailUnlocked(wire);
+ }
+ bool checkWireAvailUnlocked(WireId wire) const
+ {
+ NPNR_ASSERT(wire != WireId());
return wire_to_net[wire.index] == IdString();
}
IdString getBoundWireNet(WireId wire) const
{
- NPNR_ASSERT(wire != WireId());
boost::shared_lock_guard<boost::shared_mutex> lock(mtx_);
+ return getBoundWireNetUnlocked(wire);
+ }
+ IdString getBoundWireNetUnlocked(WireId wire) const
+ {
+ NPNR_ASSERT(wire != WireId());
return wire_to_net[wire.index];
}
IdString getConflictingWireNet(WireId wire) const
{
- NPNR_ASSERT(wire != WireId());
boost::shared_lock_guard<boost::shared_mutex> lock(mtx_);
+ return getConflictingWireNetUnlocked(wire);
+ }
+ IdString getConflictingWireNetUnlocked(WireId wire) const
+ {
+ NPNR_ASSERT(wire != WireId());
return wire_to_net[wire.index];
}
@@ -544,16 +593,22 @@ public:
// -------------------------------------------------
PipId getPipByName(IdString name) const;
+ PipId getPipByNameUnlocked(IdString name) const;
IdString getPipName(PipId pip) const;
uint32_t getPipChecksum(PipId pip) const { return pip.index; }
void bindPip(PipId pip, IdString net, PlaceStrength strength)
{
+ boost::lock_guard<boost::shared_mutex> lock(mtx_);
+ bindPipUnlocked(pip, net, strength);
+ }
+
+ void bindPipUnlocked(PipId pip, IdString net, PlaceStrength strength)
+ {
NPNR_ASSERT(pip != PipId());
NPNR_ASSERT(pip_to_net[pip.index] == IdString());
NPNR_ASSERT(switches_locked[chip_info->pip_data[pip.index].switch_index] == IdString());
- boost::lock_guard<boost::shared_mutex> lock(mtx_);
pip_to_net[pip.index] = net;
switches_locked[chip_info->pip_data[pip.index].switch_index] = net;
@@ -568,10 +623,15 @@ public:
void unbindPip(PipId pip)
{
+ boost::lock_guard<boost::shared_mutex> lock(mtx_);
+ unbindPipUnlocked(pip);
+ }
+
+ void unbindPipUnlocked(PipId pip)
+ {
NPNR_ASSERT(pip != PipId());
NPNR_ASSERT(pip_to_net[pip.index] != IdString());
NPNR_ASSERT(switches_locked[chip_info->pip_data[pip.index].switch_index] != IdString());
- boost::lock_guard<boost::shared_mutex> lock(mtx_);
WireId dst;
dst.index = chip_info->pip_data[pip.index].dst;
@@ -585,22 +645,37 @@ public:
bool checkPipAvail(PipId pip) const
{
- NPNR_ASSERT(pip != PipId());
boost::shared_lock_guard<boost::shared_mutex> lock(mtx_);
+ return checkPipAvailUnlocked(pip);
+ }
+
+ bool checkPipAvailUnlocked(PipId pip) const
+ {
+ NPNR_ASSERT(pip != PipId());
return switches_locked[chip_info->pip_data[pip.index].switch_index] == IdString();
}
IdString getBoundPipNet(PipId pip) const
{
- NPNR_ASSERT(pip != PipId());
boost::shared_lock_guard<boost::shared_mutex> lock(mtx_);
+ return getBoundPipNetUnlocked(pip);
+ }
+
+ IdString getBoundPipNetUnlocked(PipId pip) const
+ {
+ NPNR_ASSERT(pip != PipId());
return pip_to_net[pip.index];
}
IdString getConflictingPipNet(PipId pip) const
{
- NPNR_ASSERT(pip != PipId());
boost::shared_lock_guard<boost::shared_mutex> lock(mtx_);
+ return getConflictingPipNetUnlocked(pip);
+ }
+
+ IdString getConflictingPipNetUnlocked(PipId pip) const
+ {
+ NPNR_ASSERT(pip != PipId());
return switches_locked[chip_info->pip_data[pip.index].switch_index];
}
diff --git a/ice40/arch_place.cc b/ice40/arch_place.cc
index dc1bc3eb..c9dd26c5 100644
--- a/ice40/arch_place.cc
+++ b/ice40/arch_place.cc
@@ -80,7 +80,7 @@ bool Arch::isBelLocationValid(BelId bel) const
if (getBelType(bel) == TYPE_ICESTORM_LC) {
std::vector<const CellInfo *> bel_cells;
for (auto bel_other : getBelsAtSameTile(bel)) {
- IdString cell_other = getBoundBelCell(bel_other);
+ IdString cell_other = getBoundBelCellUnlocked(bel_other);
if (cell_other != IdString()) {
const CellInfo *ci_other = cells.at(cell_other).get();
bel_cells.push_back(ci_other);
@@ -88,7 +88,7 @@ bool Arch::isBelLocationValid(BelId bel) const
}
return logicCellsCompatible(bel_cells);
} else {
- IdString cellId = getBoundBelCell(bel);
+ IdString cellId = getBoundBelCellUnlocked(bel);
if (cellId == IdString())
return true;
else
@@ -104,7 +104,7 @@ bool Arch::isValidBelForCell(CellInfo *cell, BelId bel) const
std::vector<const CellInfo *> bel_cells;
for (auto bel_other : getBelsAtSameTile(bel)) {
- IdString cell_other = getBoundBelCell(bel_other);
+ IdString cell_other = getBoundBelCellUnlocked(bel_other);
if (cell_other != IdString() && bel_other != bel) {
const CellInfo *ci_other = cells.at(cell_other).get();
bel_cells.push_back(ci_other);
diff --git a/ice40/place_legaliser.cc b/ice40/place_legaliser.cc
index 559358c7..d42188f0 100644
--- a/ice40/place_legaliser.cc
+++ b/ice40/place_legaliser.cc
@@ -143,7 +143,7 @@ class PlacementLegaliser
// Using the non-standard API here to get (x, y, z) rather than just (x, y)
auto bi = ctx->chip_info->bel_data[bel.index];
int x = bi.x, y = bi.y, z = bi.z;
- IdString cell = ctx->getBoundBelCell(bel);
+ IdString cell = ctx->getBoundBelCellUnlocked(bel);
if (cell != IdString() && ctx->cells.at(cell)->belStrength >= STRENGTH_FIXED)
logic_bels.at(x).at(y).at(z) = std::make_pair(bel, true); // locked out of use
else
@@ -331,16 +331,16 @@ class PlacementLegaliser
NPNR_ASSERT(!loc.second);
BelId bel = loc.first;
// Check if there is a cell presently at the location, which we will need to rip up
- IdString existing = ctx->getBoundBelCell(bel);
+ IdString existing = ctx->getBoundBelCellUnlocked(bel);
if (existing != IdString()) {
// TODO: keep track of the previous position of the ripped up cell, as a hint
rippedCells.insert(existing);
- ctx->unbindBel(bel);
+ ctx->unbindBelUnlocked(bel);
}
if (cell->bel != BelId()) {
- ctx->unbindBel(cell->bel);
+ ctx->unbindBelUnlocked(cell->bel);
}
- ctx->bindBel(bel, cell->name, STRENGTH_LOCKED);
+ ctx->bindBelUnlocked(bel, cell->name, STRENGTH_LOCKED);
rippedCells.erase(cell->name); // If cell was ripped up previously, no need to re-place
loc.second = true; // Bel is now unavailable for further use
}
@@ -435,7 +435,7 @@ class PlacementLegaliser
CellInfo *target = nullptr;
for (int z = 0; z < 8; z++) {
BelId bel = logic_bels.at(x).at(y).at(z).first;
- IdString cell = ctx->getBoundBelCell(bel);
+ IdString cell = ctx->getBoundBelCellUnlocked(bel);
if (cell != IdString()) {
CellInfo *ci = ctx->cells.at(cell).get();
if (ci->belStrength >= STRENGTH_STRONG)
@@ -448,7 +448,7 @@ class PlacementLegaliser
}
}
if (target != nullptr) {
- ctx->unbindBel(target->bel);
+ ctx->unbindBelUnlocked(target->bel);
rippedCells.insert(target->name);
changed = true;
}