aboutsummaryrefslogtreecommitdiffstats
path: root/ice40/arch.h
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/arch.h
parent0816f447b768ebe0632f419e9b696714dda4e860 (diff)
downloadnextpnr-9e4f97290a50fc5d9dc0cbe6ead945840b9811b1.tar.gz
nextpnr-9e4f97290a50fc5d9dc0cbe6ead945840b9811b1.tar.bz2
nextpnr-9e4f97290a50fc5d9dc0cbe6ead945840b9811b1.zip
Make PnR use Unlocked methods
Diffstat (limited to 'ice40/arch.h')
-rw-r--r--ice40/arch.h117
1 files changed, 96 insertions, 21 deletions
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];
}