Merge pull request #71 from SymbiFlow/ddrn
IO primitive fixes
diff --git a/libtrellis/include/Bels.hpp b/libtrellis/include/Bels.hpp
index 0141c83..cb4b5ea 100644
--- a/libtrellis/include/Bels.hpp
+++ b/libtrellis/include/Bels.hpp
@@ -19,7 +19,7 @@
void add_pcsclkdiv(RoutingGraph &graph, int x, int y, int z);
void add_iologic(RoutingGraph &graph, int x, int y, int z, bool s);
void add_misc(RoutingGraph &graph, const std::string &name, int x, int y);
-void add_ioclk_bel(RoutingGraph &graph, const std::string &name, int x, int y, int i);
+void add_ioclk_bel(RoutingGraph &graph, const std::string &name, int x, int y, int i, int bank = -1);
}
}
diff --git a/libtrellis/src/Bels.cpp b/libtrellis/src/Bels.cpp
index da6f71f..7a84774 100644
--- a/libtrellis/src/Bels.cpp
+++ b/libtrellis/src/Bels.cpp
@@ -517,7 +517,7 @@
graph.add_bel(bel);
}
-void add_ioclk_bel(RoutingGraph &graph, const std::string &name, int x, int y, int i) {
+void add_ioclk_bel(RoutingGraph &graph, const std::string &name, int x, int y, int i, int bank) {
std::string postfix;
RoutingBel bel;
@@ -541,15 +541,20 @@
add_output("CDIVX");
} else if (name == "ECLKSYNCB") {
postfix = "ECLKSYNC" + std::to_string(i);
- bel.name = graph.ident(postfix);
- bel.z = 2 + i;
+ bel.name = graph.ident(postfix + "_BK" + std::to_string(bank));
+ bel.z = 8 + i;
add_input("ECLKI", false);
add_input("STOP");
add_output("ECLKO");
+ } else if (name == "TRELLIS_ECLKBUF") {
+ bel.z = 10 + i;
+ bel.name = graph.ident("ECLKBUF" + std::to_string(i));
+ graph.add_bel_input(bel, graph.ident("ECLKI"), x, y, graph.ident(fmt("JECLK" << i)));
+ graph.add_bel_output(bel, graph.ident("ECLKO"), 0, 0, graph.ident(fmt("G_BANK" << bank << "ECLK" << i)));
} else if (name == "DLLDELD") {
postfix = "DLLDEL";
bel.name = graph.ident(postfix);
- bel.z = 4;
+ bel.z = 12;
add_input("A");
add_input("DDRDEL", false);
add_input("LOADN");
diff --git a/libtrellis/src/Chip.cpp b/libtrellis/src/Chip.cpp
index 52ac8c9..a95f2e3 100644
--- a/libtrellis/src/Chip.cpp
+++ b/libtrellis/src/Chip.cpp
@@ -199,12 +199,16 @@
if (tile->info.type == "EFB1_PICB1")
Bels::add_misc(*rg, "USRMCLK", x-5, y);
if (tile->info.type == "ECLK_L") {
- Bels::add_ioclk_bel(*rg, "CLKDIVF", x-2, y, 0);
- Bels::add_ioclk_bel(*rg, "CLKDIVF", x-2, y, 1);
- Bels::add_ioclk_bel(*rg, "ECLKSYNCB", x-2, y, 0);
- Bels::add_ioclk_bel(*rg, "ECLKSYNCB", x-2, y, 1);
- Bels::add_ioclk_bel(*rg, "ECLKSYNCB", x-2, y+1, 0);
- Bels::add_ioclk_bel(*rg, "ECLKSYNCB", x-2, y+1, 1);
+ Bels::add_ioclk_bel(*rg, "CLKDIVF", x-2, y, 0, 7);
+ Bels::add_ioclk_bel(*rg, "CLKDIVF", x-2, y, 1, 6);
+ Bels::add_ioclk_bel(*rg, "ECLKSYNCB", x-2, y, 0, 7);
+ Bels::add_ioclk_bel(*rg, "ECLKSYNCB", x-2, y, 1, 7);
+ Bels::add_ioclk_bel(*rg, "ECLKSYNCB", x-2, y+1, 0, 6);
+ Bels::add_ioclk_bel(*rg, "ECLKSYNCB", x-2, y+1, 1, 6);
+ Bels::add_ioclk_bel(*rg, "TRELLIS_ECLKBUF", x-2, y, 0, 7);
+ Bels::add_ioclk_bel(*rg, "TRELLIS_ECLKBUF", x-2, y, 1, 7);
+ Bels::add_ioclk_bel(*rg, "TRELLIS_ECLKBUF", x-2, y+1, 0, 6);
+ Bels::add_ioclk_bel(*rg, "TRELLIS_ECLKBUF", x-2, y+1, 1, 6);
Bels::add_ioclk_bel(*rg, "DLLDELD", x-2, y-1, 0);
Bels::add_ioclk_bel(*rg, "DLLDELD", x-2, y, 0);
Bels::add_ioclk_bel(*rg, "DLLDELD", x-2, y+1, 0);
@@ -213,10 +217,14 @@
if (tile->info.type == "ECLK_R") {
Bels::add_ioclk_bel(*rg, "CLKDIVF", x+2, y, 0);
Bels::add_ioclk_bel(*rg, "CLKDIVF", x+2, y, 1);
- Bels::add_ioclk_bel(*rg, "ECLKSYNCB", x+2, y, 0);
- Bels::add_ioclk_bel(*rg, "ECLKSYNCB", x+2, y, 1);
- Bels::add_ioclk_bel(*rg, "ECLKSYNCB", x+2, y+1, 0);
- Bels::add_ioclk_bel(*rg, "ECLKSYNCB", x+2, y+1, 1);
+ Bels::add_ioclk_bel(*rg, "ECLKSYNCB", x+2, y, 0, 2);
+ Bels::add_ioclk_bel(*rg, "ECLKSYNCB", x+2, y, 1, 2);
+ Bels::add_ioclk_bel(*rg, "ECLKSYNCB", x+2, y+1, 0, 3);
+ Bels::add_ioclk_bel(*rg, "ECLKSYNCB", x+2, y+1, 1, 3);
+ Bels::add_ioclk_bel(*rg, "TRELLIS_ECLKBUF", x+2, y, 0, 2);
+ Bels::add_ioclk_bel(*rg, "TRELLIS_ECLKBUF", x+2, y, 1, 2);
+ Bels::add_ioclk_bel(*rg, "TRELLIS_ECLKBUF", x+2, y+1, 0, 3);
+ Bels::add_ioclk_bel(*rg, "TRELLIS_ECLKBUF", x+2, y+1, 1, 3);
Bels::add_ioclk_bel(*rg, "DLLDELD", x+2, y-1, 0);
Bels::add_ioclk_bel(*rg, "DLLDELD", x+2, y, 0);
Bels::add_ioclk_bel(*rg, "DLLDELD", x+2, y+1, 0);
diff --git a/libtrellis/src/RoutingGraph.cpp b/libtrellis/src/RoutingGraph.cpp
index 2f1b39d..728a9bd 100644
--- a/libtrellis/src/RoutingGraph.cpp
+++ b/libtrellis/src/RoutingGraph.cpp
@@ -62,8 +62,6 @@
return RoutingId();
}
}
- if (stripped_name.find("BNK_") == 0 || stripped_name.find("DQSG_") == 0) // Not yet implemented
- return RoutingId();
// Workaround for PCSA/B sharing tile dbs
if (col >= 69) {
size_t pcsa_pos = stripped_name.find("PCSA");