aboutsummaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorDavid Shah <dave@ds0.me>2020-02-04 16:08:08 +0000
committerGitHub <noreply@github.com>2020-02-04 16:08:08 +0000
commit1ceffbe0bcba4f31a40c58c436df9370899fa4a2 (patch)
treef3cff1e5f8a067159a4e0fecd870a7acacba57a0 /generic
parentb4d029a55cd67bafcc9c364d609208a818227204 (diff)
parenta1c902dadc3165fe9abab7c96a75b5f4808836cd (diff)
downloadnextpnr-1ceffbe0bcba4f31a40c58c436df9370899fa4a2.tar.gz
nextpnr-1ceffbe0bcba4f31a40c58c436df9370899fa4a2.tar.bz2
nextpnr-1ceffbe0bcba4f31a40c58c436df9370899fa4a2.zip
Merge pull request #391 from YosysHQ/router2-upstream
Upstreaming router2
Diffstat (limited to 'generic')
-rw-r--r--generic/arch.cc42
-rw-r--r--generic/arch.h4
2 files changed, 44 insertions, 2 deletions
diff --git a/generic/arch.cc b/generic/arch.cc
index c1c01d26..6979673a 100644
--- a/generic/arch.cc
+++ b/generic/arch.cc
@@ -23,6 +23,7 @@
#include "placer1.h"
#include "placer_heap.h"
#include "router1.h"
+#include "router2.h"
#include "util.h"
NEXTPNR_NAMESPACE_BEGIN
@@ -514,6 +515,30 @@ delay_t Arch::predictDelay(const NetInfo *net_info, const PortRef &sink) const
bool Arch::getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t &budget) const { return false; }
+ArcBounds Arch::getRouteBoundingBox(WireId src, WireId dst) const
+{
+ ArcBounds bb;
+
+ int src_x = wires.at(src).x;
+ int src_y = wires.at(src).y;
+ int dst_x = wires.at(dst).x;
+ int dst_y = wires.at(dst).y;
+
+ bb.x0 = src_x;
+ bb.y0 = src_y;
+ bb.x1 = src_x;
+ bb.y1 = src_y;
+
+ auto extend = [&](int x, int y) {
+ bb.x0 = std::min(bb.x0, x);
+ bb.x1 = std::max(bb.x1, x);
+ bb.y0 = std::min(bb.y0, y);
+ bb.y1 = std::max(bb.y1, y);
+ };
+ extend(dst_x, dst_y);
+ return bb;
+}
+
// ---------------------------------------------------------------
bool Arch::place()
@@ -553,10 +578,19 @@ bool Arch::place()
bool Arch::route()
{
- bool retVal = router1(getCtx(), Router1Cfg(getCtx()));
+ std::string router = str_or_default(settings, id("router"), defaultRouter);
+ bool result;
+ if (router == "router1") {
+ result = router1(getCtx(), Router1Cfg(getCtx()));
+ } else if (router == "router2") {
+ router2(getCtx(), Router2Cfg(getCtx()));
+ result = true;
+ } else {
+ log_error("iCE40 architecture does not support router '%s'\n", router.c_str());
+ }
getCtx()->settings[getCtx()->id("route")] = 1;
archInfoToAttributes();
- return retVal;
+ return result;
}
// ---------------------------------------------------------------
@@ -653,6 +687,10 @@ const std::vector<std::string> Arch::availablePlacers = {"sa",
"heap"
#endif
};
+
+const std::string Arch::defaultRouter = "router1";
+const std::vector<std::string> Arch::availableRouters = {"router1", "router2"};
+
void Arch::assignArchInfo()
{
for (auto &cell : getCtx()->cells) {
diff --git a/generic/arch.h b/generic/arch.h
index 444d2636..cbfb943d 100644
--- a/generic/arch.h
+++ b/generic/arch.h
@@ -267,6 +267,8 @@ struct Arch : BaseCtx
uint32_t getDelayChecksum(delay_t v) const { return 0; }
bool getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t &budget) const;
+ ArcBounds getRouteBoundingBox(WireId src, WireId dst) const;
+
bool pack();
bool place();
bool route();
@@ -288,6 +290,8 @@ struct Arch : BaseCtx
static const std::string defaultPlacer;
static const std::vector<std::string> availablePlacers;
+ static const std::string defaultRouter;
+ static const std::vector<std::string> availableRouters;
// ---------------------------------------------------------------
// Internal usage