diff --git a/passes/techmap/attrmap.cc b/passes/techmap/attrmap.cc index f715b63ed..dec81d216 100644 --- a/passes/techmap/attrmap.cc +++ b/passes/techmap/attrmap.cc @@ -33,13 +33,32 @@ Const make_value(string &value) return sig.as_const(); } +bool string_compare_nocase(const string &str1, const string &str2) +{ + if (str1.size() != str2.size()) + return false; + + for (size_t i = 0; i < str1.size(); i++) + { + char ch1 = str1[i], ch2 = str2[i]; + if ('a' <= ch1 && ch1 <= 'z') + ch1 -= 'a' - 'A'; + if ('a' <= ch2 && ch2 <= 'z') + ch2 -= 'a' - 'A'; + if (ch1 != ch2) + return false; + } + + return true; +} + bool match_name(string &name, IdString &id, bool ignore_case=false) { string str1 = RTLIL::escape_id(name); string str2 = id.str(); if (ignore_case) - return !strcasecmp(str1.c_str(), str2.c_str()); + return string_compare_nocase(str1, str2); return str1 == str2; } @@ -49,7 +68,7 @@ bool match_value(string &value, Const &val, bool ignore_case=false) if (ignore_case && ((val.flags & RTLIL::CONST_FLAG_STRING) != 0) && GetSize(value) && value.front() == '"' && value.back() == '"') { string str1 = value.substr(1, GetSize(value)-2); string str2 = val.decode_string(); - return !strcasecmp(str1.c_str(), str2.c_str()); + return string_compare_nocase(str1, str2); } return make_value(value) == val;