aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Shah <dave@ds0.me>2020-02-03 13:55:07 +0000
committerGitHub <noreply@github.com>2020-02-03 13:55:07 +0000
commitb4d029a55cd67bafcc9c364d609208a818227204 (patch)
treeba83fbf0d6c4b1e3b7644c921960929a23f8735a
parentaed93a9390dd909111ab4526e7f3df8d24a2ee0a (diff)
parentf1dbb0c4f2242862dd365da8865e059d2c05a310 (diff)
downloadnextpnr-b4d029a55cd67bafcc9c364d609208a818227204.tar.gz
nextpnr-b4d029a55cd67bafcc9c364d609208a818227204.tar.bz2
nextpnr-b4d029a55cd67bafcc9c364d609208a818227204.zip
Merge pull request #385 from YosysHQ/router1-arc-fixes
Fixes for partial reconfig demo
-rw-r--r--common/router1.cc26
-rw-r--r--ecp5/globals.cc3
-rw-r--r--frontend/frontend_base.h21
-rw-r--r--generic/pack.cc3
4 files changed, 50 insertions, 3 deletions
diff --git a/common/router1.cc b/common/router1.cc
index a89d870d..ef788fc2 100644
--- a/common/router1.cc
+++ b/common/router1.cc
@@ -400,7 +400,7 @@ struct Router1
dst_to_arc[dst_wire] = arc;
- if (net_info->wires.count(src_wire) == 0) {
+ if (net_info->wires.count(dst_wire) == 0) {
arc_queue_insert(arc, src_wire, dst_wire);
continue;
}
@@ -527,6 +527,18 @@ struct Router1
conflictWireNet = ctx->getConflictingWireNet(next_wire);
if (conflictWireNet == nullptr)
continue;
+ else {
+ if (conflictWireNet->wires.count(next_wire) &&
+ conflictWireNet->wires.at(next_wire).strength > STRENGTH_STRONG)
+ continue;
+ }
+ } else {
+ NetInfo *conflicting = ctx->getBoundWireNet(conflictWireWire);
+ if (conflicting != nullptr) {
+ if (conflicting->wires.count(conflictWireWire) &&
+ conflicting->wires.at(conflictWireWire).strength > STRENGTH_STRONG)
+ continue;
+ }
}
}
@@ -538,6 +550,18 @@ struct Router1
conflictPipNet = ctx->getConflictingPipNet(pip);
if (conflictPipNet == nullptr)
continue;
+ else {
+ if (conflictPipNet->wires.count(next_wire) &&
+ conflictPipNet->wires.at(next_wire).strength > STRENGTH_STRONG)
+ continue;
+ }
+ } else {
+ NetInfo *conflicting = ctx->getBoundWireNet(conflictPipWire);
+ if (conflicting != nullptr) {
+ if (conflicting->wires.count(conflictPipWire) &&
+ conflicting->wires.at(conflictPipWire).strength > STRENGTH_STRONG)
+ continue;
+ }
}
}
diff --git a/ecp5/globals.cc b/ecp5/globals.cc
index c0f4b504..6dbd7b6b 100644
--- a/ecp5/globals.cc
+++ b/ecp5/globals.cc
@@ -457,7 +457,8 @@ class Ecp5GlobalRouter
log_info("Promoting globals...\n");
auto clocks = get_clocks();
for (auto clock : clocks) {
- bool is_noglobal = bool_or_default(clock->attrs, ctx->id("noglobal"), false);
+ bool is_noglobal = bool_or_default(clock->attrs, ctx->id("noglobal"), false) ||
+ bool_or_default(clock->attrs, ctx->id("ECP5_IS_GLOBAL"), false);
if (is_noglobal)
continue;
log_info(" promoting clock net %s to global network\n", clock->name.c_str(ctx));
diff --git a/frontend/frontend_base.h b/frontend/frontend_base.h
index df562c9a..fa0e30b9 100644
--- a/frontend/frontend_base.h
+++ b/frontend/frontend_base.h
@@ -284,6 +284,7 @@ template <typename FrontendType> struct GenericFrontend
}
import_module_netnames(m, data);
import_module_cells(m, data);
+ import_net_attrs(m, data);
if (m.is_toplevel) {
import_toplevel_ports(m, data);
// Mark design as loaded through nextpnr
@@ -410,6 +411,26 @@ template <typename FrontendType> struct GenericFrontend
});
}
+ void import_net_attrs(HierModuleState &m, const mod_dat_t &data)
+ {
+ impl.foreach_netname(data, [&](const std::string &basename, const netname_dat_t &nn) {
+ const auto &bits = impl.get_net_bits(nn);
+ int width = impl.get_vector_length(bits);
+ for (int i = 0; i < width; i++) {
+ if (impl.is_vector_bit_constant(bits, i))
+ continue;
+ int net_bit = impl.get_vector_bit_signal(bits, i);
+ int mapped_bit = m.net_by_idx(net_bit);
+ if (mapped_bit != -1) {
+ NetInfo *ni = net_flatindex.at(mapped_bit);
+ impl.foreach_attr(nn, [&](const std::string &name, const Property &value) {
+ ni->attrs[ctx->id(name)] = value;
+ });
+ }
+ }
+ });
+ }
+
// Create a new constant net; given a hint for what the name should be and its value
NetInfo *create_constant_net(HierModuleState &m, const std::string &name_hint, char constval)
{
diff --git a/generic/pack.cc b/generic/pack.cc
index 0eebfb99..43157b6c 100644
--- a/generic/pack.cc
+++ b/generic/pack.cc
@@ -251,7 +251,8 @@ static void pack_io(Context *ctx)
iob = new_cells.back().get();
}
packed_cells.insert(ci->name);
- std::copy(ci->attrs.begin(), ci->attrs.end(), std::inserter(iob->attrs, iob->attrs.begin()));
+ if (iob != nullptr)
+ std::copy(ci->attrs.begin(), ci->attrs.end(), std::inserter(iob->attrs, iob->attrs.begin()));
}
}
for (auto pcell : packed_cells) {