aboutsummaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorMiodrag Milanovic <mmicko@gmail.com>2018-08-08 10:48:05 +0200
committerMiodrag Milanovic <mmicko@gmail.com>2018-08-08 10:48:05 +0200
commit5df90bc5a5a273f5c50764f4045012b282e7fa36 (patch)
tree5f91c9800f958a810441120794dd28572e401c6f /generic
parentb0741e292c7ec7191f2c92fe7695e34018469b67 (diff)
parent8553573d2485ac2ec60d1c49949c254e02d35490 (diff)
downloadnextpnr-5df90bc5a5a273f5c50764f4045012b282e7fa36.tar.gz
nextpnr-5df90bc5a5a273f5c50764f4045012b282e7fa36.tar.bz2
nextpnr-5df90bc5a5a273f5c50764f4045012b282e7fa36.zip
Merge remote-tracking branch 'origin/master' into common_main
# Conflicts: # ecp5/main.cc # ice40/main.cc
Diffstat (limited to 'generic')
-rw-r--r--generic/arch.cc56
-rw-r--r--generic/arch.h29
2 files changed, 44 insertions, 41 deletions
diff --git a/generic/arch.cc b/generic/arch.cc
index 3389ac0d..e867d310 100644
--- a/generic/arch.cc
+++ b/generic/arch.cc
@@ -214,27 +214,27 @@ uint32_t Arch::getBelChecksum(BelId bel) const
return 0;
}
-void Arch::bindBel(BelId bel, IdString cell, PlaceStrength strength)
+void Arch::bindBel(BelId bel, CellInfo *cell, PlaceStrength strength)
{
bels.at(bel).bound_cell = cell;
- cells.at(cell)->bel = bel;
- cells.at(cell)->belStrength = strength;
+ cell->bel = bel;
+ cell->belStrength = strength;
refreshUiBel(bel);
}
void Arch::unbindBel(BelId bel)
{
- cells.at(bels.at(bel).bound_cell)->bel = BelId();
- cells.at(bels.at(bel).bound_cell)->belStrength = STRENGTH_NONE;
- bels.at(bel).bound_cell = IdString();
+ bels.at(bel).bound_cell->bel = BelId();
+ bels.at(bel).bound_cell->belStrength = STRENGTH_NONE;
+ bels.at(bel).bound_cell = nullptr;
refreshUiBel(bel);
}
-bool Arch::checkBelAvail(BelId bel) const { return bels.at(bel).bound_cell == IdString(); }
+bool Arch::checkBelAvail(BelId bel) const { return bels.at(bel).bound_cell == nullptr; }
-IdString Arch::getBoundBelCell(BelId bel) const { return bels.at(bel).bound_cell; }
+CellInfo *Arch::getBoundBelCell(BelId bel) const { return bels.at(bel).bound_cell; }
-IdString Arch::getConflictingBelCell(BelId bel) const { return bels.at(bel).bound_cell; }
+CellInfo *Arch::getConflictingBelCell(BelId bel) const { return bels.at(bel).bound_cell; }
const std::vector<BelId> &Arch::getBels() const { return bel_ids; }
@@ -271,34 +271,34 @@ uint32_t Arch::getWireChecksum(WireId wire) const
return 0;
}
-void Arch::bindWire(WireId wire, IdString net, PlaceStrength strength)
+void Arch::bindWire(WireId wire, NetInfo *net, PlaceStrength strength)
{
wires.at(wire).bound_net = net;
- nets.at(net)->wires[wire].pip = PipId();
- nets.at(net)->wires[wire].strength = strength;
+ net->wires[wire].pip = PipId();
+ net->wires[wire].strength = strength;
refreshUiWire(wire);
}
void Arch::unbindWire(WireId wire)
{
- auto &net_wires = nets[wires.at(wire).bound_net]->wires;
+ auto &net_wires = wires.at(wire).bound_net->wires;
auto pip = net_wires.at(wire).pip;
if (pip != PipId()) {
- pips.at(pip).bound_net = IdString();
+ pips.at(pip).bound_net = nullptr;
refreshUiPip(pip);
}
net_wires.erase(wire);
- wires.at(wire).bound_net = IdString();
+ wires.at(wire).bound_net = nullptr;
refreshUiWire(wire);
}
-bool Arch::checkWireAvail(WireId wire) const { return wires.at(wire).bound_net == IdString(); }
+bool Arch::checkWireAvail(WireId wire) const { return wires.at(wire).bound_net == nullptr; }
-IdString Arch::getBoundWireNet(WireId wire) const { return wires.at(wire).bound_net; }
+NetInfo *Arch::getBoundWireNet(WireId wire) const { return wires.at(wire).bound_net; }
-IdString Arch::getConflictingWireNet(WireId wire) const { return wires.at(wire).bound_net; }
+NetInfo *Arch::getConflictingWireNet(WireId wire) const { return wires.at(wire).bound_net; }
const std::vector<BelPin> &Arch::getWireBelPins(WireId wire) const { return wires.at(wire).bel_pins; }
@@ -323,13 +323,13 @@ uint32_t Arch::getPipChecksum(PipId wire) const
return 0;
}
-void Arch::bindPip(PipId pip, IdString net, PlaceStrength strength)
+void Arch::bindPip(PipId pip, NetInfo *net, PlaceStrength strength)
{
WireId wire = pips.at(pip).dstWire;
pips.at(pip).bound_net = net;
wires.at(wire).bound_net = net;
- nets.at(net)->wires[wire].pip = pip;
- nets.at(net)->wires[wire].strength = strength;
+ net->wires[wire].pip = pip;
+ net->wires[wire].strength = strength;
refreshUiPip(pip);
refreshUiWire(wire);
}
@@ -337,18 +337,18 @@ void Arch::bindPip(PipId pip, IdString net, PlaceStrength strength)
void Arch::unbindPip(PipId pip)
{
WireId wire = pips.at(pip).dstWire;
- nets.at(wires.at(wire).bound_net)->wires.erase(wire);
- pips.at(pip).bound_net = IdString();
- wires.at(wire).bound_net = IdString();
+ wires.at(wire).bound_net->wires.erase(wire);
+ pips.at(pip).bound_net = nullptr;
+ wires.at(wire).bound_net = nullptr;
refreshUiPip(pip);
refreshUiWire(wire);
}
-bool Arch::checkPipAvail(PipId pip) const { return pips.at(pip).bound_net == IdString(); }
+bool Arch::checkPipAvail(PipId pip) const { return pips.at(pip).bound_net == nullptr; }
-IdString Arch::getBoundPipNet(PipId pip) const { return pips.at(pip).bound_net; }
+NetInfo *Arch::getBoundPipNet(PipId pip) const { return pips.at(pip).bound_net; }
-IdString Arch::getConflictingPipNet(PipId pip) const { return pips.at(pip).bound_net; }
+NetInfo *Arch::getConflictingPipNet(PipId pip) const { return pips.at(pip).bound_net; }
const std::vector<PipId> &Arch::getPips() const { return pip_ids; }
@@ -408,7 +408,7 @@ delay_t Arch::predictDelay(const NetInfo *net_info, const PortRef &sink) const
return (dx + dy) * grid_distance_to_delay;
}
-delay_t Arch::getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t budget) const { return budget; }
+bool Arch::getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t &budget) const { return false; }
// ---------------------------------------------------------------
diff --git a/generic/arch.h b/generic/arch.h
index 10cd1d5a..0e0aec27 100644
--- a/generic/arch.h
+++ b/generic/arch.h
@@ -31,7 +31,8 @@ struct WireInfo;
struct PipInfo
{
- IdString name, type, bound_net;
+ IdString name, type;
+ NetInfo *bound_net;
WireId srcWire, dstWire;
DelayInfo delay;
DecalXY decalxy;
@@ -39,7 +40,8 @@ struct PipInfo
struct WireInfo
{
- IdString name, type, bound_net;
+ IdString name, type;
+ NetInfo *bound_net;
std::vector<PipId> downhill, uphill, aliases;
BelPin uphill_bel_pin;
std::vector<BelPin> downhill_bel_pins;
@@ -57,7 +59,8 @@ struct PinInfo
struct BelInfo
{
- IdString name, type, bound_cell;
+ IdString name, type;
+ CellInfo *bound_cell;
std::unordered_map<IdString, PinInfo> pins;
DecalXY decalxy;
int x, y, z;
@@ -144,11 +147,11 @@ struct Arch : BaseCtx
const std::vector<BelId> &getBelsByTile(int x, int y) const;
bool getBelGlobalBuf(BelId bel) const;
uint32_t getBelChecksum(BelId bel) const;
- void bindBel(BelId bel, IdString cell, PlaceStrength strength);
+ void bindBel(BelId bel, CellInfo *cell, PlaceStrength strength);
void unbindBel(BelId bel);
bool checkBelAvail(BelId bel) const;
- IdString getBoundBelCell(BelId bel) const;
- IdString getConflictingBelCell(BelId bel) const;
+ CellInfo *getBoundBelCell(BelId bel) const;
+ CellInfo *getConflictingBelCell(BelId bel) const;
const std::vector<BelId> &getBels() const;
BelType getBelType(BelId bel) const;
WireId getBelPinWire(BelId bel, PortPin pin) const;
@@ -159,11 +162,11 @@ struct Arch : BaseCtx
IdString getWireName(WireId wire) const;
IdString getWireType(WireId wire) const;
uint32_t getWireChecksum(WireId wire) const;
- void bindWire(WireId wire, IdString net, PlaceStrength strength);
+ void bindWire(WireId wire, NetInfo *net, PlaceStrength strength);
void unbindWire(WireId wire);
bool checkWireAvail(WireId wire) const;
- IdString getBoundWireNet(WireId wire) const;
- IdString getConflictingWireNet(WireId wire) const;
+ NetInfo *getBoundWireNet(WireId wire) const;
+ NetInfo *getConflictingWireNet(WireId wire) const;
DelayInfo getWireDelay(WireId wire) const { return DelayInfo(); }
const std::vector<WireId> &getWires() const;
const std::vector<BelPin> &getWireBelPins(WireId wire) const;
@@ -172,11 +175,11 @@ struct Arch : BaseCtx
IdString getPipName(PipId pip) const;
IdString getPipType(PipId pip) const;
uint32_t getPipChecksum(PipId pip) const;
- void bindPip(PipId pip, IdString net, PlaceStrength strength);
+ void bindPip(PipId pip, NetInfo *net, PlaceStrength strength);
void unbindPip(PipId pip);
bool checkPipAvail(PipId pip) const;
- IdString getBoundPipNet(PipId pip) const;
- IdString getConflictingPipNet(PipId pip) const;
+ NetInfo *getBoundPipNet(PipId pip) const;
+ NetInfo *getConflictingPipNet(PipId pip) const;
const std::vector<PipId> &getPips() const;
WireId getPipSrcWire(PipId pip) const;
WireId getPipDstWire(PipId pip) const;
@@ -199,7 +202,7 @@ struct Arch : BaseCtx
delay_t getRipupDelayPenalty() const { return 1.0; }
float getDelayNS(delay_t v) const { return v; }
uint32_t getDelayChecksum(delay_t v) const { return 0; }
- delay_t getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t budget) const;
+ bool getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t &budget) const;
bool pack() { return true; }
bool place();