Improved ID matching scheme in select (and thus for all commands)
authorClifford Wolf <clifford@clifford.at>
Thu, 28 Nov 2013 20:13:16 +0000 (21:13 +0100)
committerClifford Wolf <clifford@clifford.at>
Thu, 28 Nov 2013 20:13:16 +0000 (21:13 +0100)
passes/cmds/select.cc

index 1ab15c9a9359a8403f4f5f7c014d7ccf905ba6db..31afea209e7a59165db2d2140a7868b90b7e4c78 100644 (file)
@@ -29,10 +29,20 @@ static std::vector<RTLIL::Selection> work_stack;
 
 static bool match_ids(RTLIL::IdString id, std::string pattern)
 {
-       if (!fnmatch(pattern.c_str(), id.c_str(), FNM_NOESCAPE))
+       if (id == pattern)
                return true;
-       if (id.size() > 0 && id[0] == '\\' && !fnmatch(pattern.c_str(), id.substr(1).c_str(), FNM_NOESCAPE))
+       if (id.size() > 0 && id[0] == '\\' && id.substr(1) == pattern)
                return true;
+       if (!fnmatch(pattern.c_str(), id.c_str(), 0))
+               return true;
+       if (id.size() > 0 && id[0] == '\\' && !fnmatch(pattern.c_str(), id.substr(1).c_str(), 0))
+               return true;
+       if (id.size() > 0 && id[0] == '$' && pattern.size() > 0 && pattern[0] == '$') {
+               const char *p = id.c_str();
+               const char *q = strrchr(p, '$');
+               if (pattern == q)
+                       return true;
+       }
        return false;
 }