Inject MachXO2 globals info into RoutingGraph. Create stub BRANCH handling, and handle "DCC" globals connecting L/R to U/D.
diff --git a/libtrellis/include/RoutingGraph.hpp b/libtrellis/include/RoutingGraph.hpp
index dadb32d..be23e77 100644
--- a/libtrellis/include/RoutingGraph.hpp
+++ b/libtrellis/include/RoutingGraph.hpp
@@ -8,6 +8,9 @@
#include <set>
#include <boost/functional/hash.hpp>
+#include "Chip.hpp"
+#include "Database.hpp"
+
using namespace std;
namespace Trellis {
@@ -167,6 +170,9 @@
// Algorithm to give global nets a unique position in MachXO2 devices.
// ECP5 defers global routing to nextpnr.
RoutingId find_machxo2_global_position(int row, int col, const std::string &db_name);
+ // We need access to globals.json to correctly assign global positions.
+ // Internal use only- do NOT expose to pytrellis for now.
+ MachXO2GlobalsInfo global_data_machxo2;
};
}
diff --git a/libtrellis/src/RoutingGraph.cpp b/libtrellis/src/RoutingGraph.cpp
index 7eea329..5c50fbc 100644
--- a/libtrellis/src/RoutingGraph.cpp
+++ b/libtrellis/src/RoutingGraph.cpp
@@ -30,6 +30,9 @@
chip_prefix = "1200_";
else
assert(false);
+
+ if(c.info.family == "MachXO2")
+ global_data_machxo2 = get_global_info_machxo2(DeviceLocator{c.info.family, c.info.name});
}
ident_t IdStore::ident(const std::string &str) const
@@ -281,6 +284,8 @@
// Globals are given their nominal position, even if they span multiple
// tiles, by the following rules:
+ static const std::regex clk_dcc(R"(^G_CLK[IO]\d[TB]_DCC)", std::regex::optimize);
+ smatch m;
pair<int, int> center = center_map[make_pair(max_row, max_col)];
RoutingId curr_global;
@@ -311,6 +316,7 @@
curr_global.id = ident(db_copy);
curr_global.loc.x = center.second;
curr_global.loc.y = center.first;
+
return curr_global;
// U/D wires get the nominal position of center row, current column.
@@ -343,6 +349,16 @@
curr_global.loc.y = center.first;
return curr_global;
}
+ } else if(db_name.find("BRANCH") != string::npos) {
+ curr_global.id = ident(db_name);
+ curr_global.loc.x = -2;
+ curr_global.loc.y = -2;
+ return curr_global;
+ } else if(regex_match(db_name, m, clk_dcc)) {
+ curr_global.id = ident(db_name);
+ curr_global.loc.x = col;
+ curr_global.loc.y = row;
+ return curr_global;
} else {
// TODO: Not fuzzed yet!
return RoutingId();