summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Kuzminsky <seb@highlab.com>2016-04-22 07:36:42 -0600
committerSebastian Kuzminsky <seb@highlab.com>2016-04-22 07:36:42 -0600
commit904f69d691805bdbb6fa53f72f0f71cd80dc233a (patch)
tree288c55aa9508e9256e1f2b75be00717ca006401d
parentaab32bc757e185420a2e1cc81d10ac82137a1b6a (diff)
add an initialization bugfix from Clifford Wolf (upstream)
-rw-r--r--debian/patches/fixup-initalization.patch46
-rw-r--r--debian/patches/series1
2 files changed, 47 insertions, 0 deletions
diff --git a/debian/patches/fixup-initalization.patch b/debian/patches/fixup-initalization.patch
new file mode 100644
index 00000000..6207ad80
--- /dev/null
+++ b/debian/patches/fixup-initalization.patch
@@ -0,0 +1,46 @@
+commit 965b0d59b5da01dc34f01e01d723b75140df7c60 (clifford-wolf/master, clifford-wolf/HEAD)
+Author: Clifford Wolf <clifford@clifford.at>
+Date: Fri Apr 22 12:13:06 2016 +0200
+
+ More flexible handling of initialization values
+
+diff --git a/passes/proc/proc_init.cc b/passes/proc/proc_init.cc
+index 523af0a..0c8fb83 100644
+--- a/passes/proc/proc_init.cc
++++ b/passes/proc/proc_init.cc
+@@ -61,13 +61,28 @@ void proc_init(RTLIL::Module *mod, RTLIL::Process *proc)
+ log_cmd_error("Failed to get a constant init value for %s: %s\n", log_signal(lhs), log_signal(rhs));
+
+ int offset = 0;
+- for (auto &lhs_c : lhs.chunks()) {
+- if (lhs_c.wire != NULL) {
+- RTLIL::SigSpec value = rhs.extract(offset, lhs_c.width);
+- if (value.size() != lhs_c.wire->width)
+- log_cmd_error("Init value is not for the entire wire: %s = %s\n", log_signal(lhs_c), log_signal(value));
+- log(" Setting init value: %s = %s\n", log_signal(lhs_c.wire), log_signal(value));
+- lhs_c.wire->attributes["\\init"] = value.as_const();
++ for (auto &lhs_c : lhs.chunks())
++ {
++ if (lhs_c.wire != nullptr)
++ {
++ SigSpec valuesig = rhs.extract(offset, lhs_c.width);
++ if (!valuesig.is_fully_const())
++ log_cmd_error("Non-const initialization value: %s = %s\n", log_signal(lhs_c), log_signal(valuesig));
++
++ Const value = valuesig.as_const();
++ Const &wireinit = lhs_c.wire->attributes["\\init"];
++
++ while (GetSize(wireinit.bits) < lhs_c.wire->width)
++ wireinit.bits.push_back(State::Sx);
++
++ for (int i = 0; i < lhs_c.width; i++) {
++ auto &initbit = wireinit.bits[i + lhs_c.offset];
++ if (initbit != State::Sx && initbit != value[i])
++ log_cmd_error("Conflicting initialization values for %s.\n", log_signal(lhs_c));
++ initbit = value[i];
++ }
++
++ log(" Set init value: %s = %s\n", log_signal(lhs_c.wire), log_signal(wireinit));
+ }
+ offset += lhs_c.width;
+ }
diff --git a/debian/patches/series b/debian/patches/series
index 01697657..11e4a281 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -7,3 +7,4 @@ switch-to-free-font.patch
manual-build.patch
add-missing-headers.patch
kfreebsd-support.patch
+fixup-initalization.patch