diff options
author | Sebastian Kuzminsky <seb@highlab.com> | 2016-04-22 07:36:42 -0600 |
---|---|---|
committer | Sebastian Kuzminsky <seb@highlab.com> | 2016-04-22 07:36:42 -0600 |
commit | 904f69d691805bdbb6fa53f72f0f71cd80dc233a (patch) | |
tree | 288c55aa9508e9256e1f2b75be00717ca006401d /debian | |
parent | aab32bc757e185420a2e1cc81d10ac82137a1b6a (diff) |
add an initialization bugfix from Clifford Wolf (upstream)
Diffstat (limited to 'debian')
-rw-r--r-- | debian/patches/fixup-initalization.patch | 46 | ||||
-rw-r--r-- | debian/patches/series | 1 |
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 |