aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2018-11-11 17:50:42 +0100
committerClifford Wolf <clifford@clifford.at>2018-11-11 17:50:42 +0100
commitf9a512633840a88d8c846f1387681c62161ea6a7 (patch)
treef26dc2cad5ece03eb6be15a99554c6853ed27b43 /common
parentf93129634b479ba54d8e33186eb79f412eaeb4a9 (diff)
downloadnextpnr-f9a512633840a88d8c846f1387681c62161ea6a7.tar.gz
nextpnr-f9a512633840a88d8c846f1387681c62161ea6a7.tar.bz2
nextpnr-f9a512633840a88d8c846f1387681c62161ea6a7.zip
Another router1 bugfix
Signed-off-by: Clifford Wolf <clifford@clifford.at>
Diffstat (limited to 'common')
-rw-r--r--common/router1.cc115
-rw-r--r--common/router1.h3
2 files changed, 55 insertions, 63 deletions
diff --git a/common/router1.cc b/common/router1.cc
index 64f01c0d..ad2b6757 100644
--- a/common/router1.cc
+++ b/common/router1.cc
@@ -459,77 +459,72 @@ struct Router1
WireId conflictWireWire = WireId(), conflictPipWire = WireId();
NetInfo *conflictWireNet = nullptr, *conflictPipNet = nullptr;
- bool wire_reuse = net_info->wires.count(next_wire);
- bool pip_reuse = wire_reuse && net_info->wires.at(next_wire).pip == pip;
-
- if (!ctx->checkWireAvail(next_wire) && !wire_reuse) {
- if (!ripup)
- continue;
- conflictWireWire = ctx->getConflictingWireWire(next_wire);
- if (conflictWireWire == WireId()) {
- conflictWireNet = ctx->getConflictingWireNet(next_wire);
- if (conflictWireNet == nullptr)
+ if (net_info->wires.count(next_wire) && net_info->wires.at(next_wire).pip == pip) {
+ next_bonus += cfg.reuseBonus;
+ } else {
+ if (!ctx->checkWireAvail(next_wire)) {
+ if (!ripup)
continue;
+ conflictWireWire = ctx->getConflictingWireWire(next_wire);
+ if (conflictWireWire == WireId()) {
+ conflictWireNet = ctx->getConflictingWireNet(next_wire);
+ if (conflictWireNet == nullptr)
+ continue;
+ }
}
- }
- if (!ctx->checkPipAvail(pip) && !pip_reuse) {
- if (!ripup)
- continue;
- conflictPipWire = ctx->getConflictingPipWire(pip);
- if (conflictPipWire == WireId()) {
- conflictPipNet = ctx->getConflictingPipNet(pip);
- if (conflictPipNet == nullptr)
+ if (!ctx->checkPipAvail(pip)) {
+ if (!ripup)
continue;
+ conflictPipWire = ctx->getConflictingPipWire(pip);
+ if (conflictPipWire == WireId()) {
+ conflictPipNet = ctx->getConflictingPipNet(pip);
+ if (conflictPipNet == nullptr)
+ continue;
+ }
}
- }
-
- if (conflictWireNet != nullptr && conflictPipWire != WireId() && conflictWireNet->wires.count(conflictPipWire))
- conflictPipWire = WireId();
-
- if (conflictPipNet != nullptr && conflictWireWire != WireId() && conflictPipNet->wires.count(conflictWireWire))
- conflictWireWire = WireId();
- if (conflictWireWire == conflictPipWire)
- conflictWireWire = WireId();
+ if (conflictWireNet != nullptr && conflictPipWire != WireId() && conflictWireNet->wires.count(conflictPipWire))
+ conflictPipWire = WireId();
- if (conflictWireNet == conflictPipNet)
- conflictWireNet = nullptr;
+ if (conflictPipNet != nullptr && conflictWireWire != WireId() && conflictPipNet->wires.count(conflictWireWire))
+ conflictWireWire = WireId();
- if (wire_reuse)
- next_bonus += cfg.wireReuseBonus;
+ if (conflictWireWire == conflictPipWire)
+ conflictWireWire = WireId();
- if (pip_reuse)
- next_bonus += cfg.pipReuseBonus;
+ if (conflictWireNet == conflictPipNet)
+ conflictWireNet = nullptr;
- if (conflictWireWire != WireId()) {
- auto scores_it = wireScores.find(conflictWireWire);
- if (scores_it != wireScores.end())
- next_penalty += scores_it->second * cfg.wireRipupPenalty;
- next_penalty += cfg.wireRipupPenalty;
- }
+ if (conflictWireWire != WireId()) {
+ auto scores_it = wireScores.find(conflictWireWire);
+ if (scores_it != wireScores.end())
+ next_penalty += scores_it->second * cfg.wireRipupPenalty;
+ next_penalty += cfg.wireRipupPenalty;
+ }
- if (conflictPipWire != WireId()) {
- auto scores_it = wireScores.find(conflictPipWire);
- if (scores_it != wireScores.end())
- next_penalty += scores_it->second * cfg.wireRipupPenalty;
- next_penalty += cfg.wireRipupPenalty;
- }
+ if (conflictPipWire != WireId()) {
+ auto scores_it = wireScores.find(conflictPipWire);
+ if (scores_it != wireScores.end())
+ next_penalty += scores_it->second * cfg.wireRipupPenalty;
+ next_penalty += cfg.wireRipupPenalty;
+ }
- if (conflictWireNet != nullptr) {
- auto scores_it = netScores.find(conflictWireNet);
- if (scores_it != netScores.end())
- next_penalty += scores_it->second * cfg.netRipupPenalty;
- next_penalty += cfg.netRipupPenalty;
- next_penalty += conflictWireNet->wires.size() * cfg.wireRipupPenalty;
- }
+ if (conflictWireNet != nullptr) {
+ auto scores_it = netScores.find(conflictWireNet);
+ if (scores_it != netScores.end())
+ next_penalty += scores_it->second * cfg.netRipupPenalty;
+ next_penalty += cfg.netRipupPenalty;
+ next_penalty += conflictWireNet->wires.size() * cfg.wireRipupPenalty;
+ }
- if (conflictPipNet != nullptr) {
- auto scores_it = netScores.find(conflictPipNet);
- if (scores_it != netScores.end())
- next_penalty += scores_it->second * cfg.netRipupPenalty;
- next_penalty += cfg.netRipupPenalty;
- next_penalty += conflictPipNet->wires.size() * cfg.wireRipupPenalty;
+ if (conflictPipNet != nullptr) {
+ auto scores_it = netScores.find(conflictPipNet);
+ if (scores_it != netScores.end())
+ next_penalty += scores_it->second * cfg.netRipupPenalty;
+ next_penalty += cfg.netRipupPenalty;
+ next_penalty += conflictPipNet->wires.size() * cfg.wireRipupPenalty;
+ }
}
delay_t next_score = next_delay + next_penalty;
@@ -676,9 +671,7 @@ Router1Cfg::Router1Cfg(Context *ctx) : Settings(ctx)
wireRipupPenalty = ctx->getRipupDelayPenalty();
netRipupPenalty = 10*ctx->getRipupDelayPenalty();
-
- wireReuseBonus = wireRipupPenalty/8;
- pipReuseBonus = wireRipupPenalty/2;
+ reuseBonus = wireRipupPenalty/2;
estimatePrecision = 100 * ctx->getRipupDelayPenalty();
}
diff --git a/common/router1.h b/common/router1.h
index d6113441..80d7aa96 100644
--- a/common/router1.h
+++ b/common/router1.h
@@ -35,8 +35,7 @@ struct Router1Cfg : Settings
bool useEstimate;
delay_t wireRipupPenalty;
delay_t netRipupPenalty;
- delay_t wireReuseBonus;
- delay_t pipReuseBonus;
+ delay_t reuseBonus;
delay_t estimatePrecision;
};