Added RTLIL::IdString::in(...)
authorClifford Wolf <clifford@clifford.at>
Mon, 4 Aug 2014 13:08:35 +0000 (15:08 +0200)
committerClifford Wolf <clifford@clifford.at>
Mon, 4 Aug 2014 13:40:07 +0000 (15:40 +0200)
kernel/rtlil.h
passes/cmds/wreduce.cc

index ab15024e0fbb6a8e40a58b0708ad433b46fa1802..8dfcbcaa07c98235316fc79baf15d91cec5e2061 100644 (file)
@@ -170,20 +170,20 @@ namespace RTLIL
                        return std::string(global_id_storage_.at(index_));
                }
 
-               bool operator<(const IdString &rhs) const {
+               bool operator<(IdString rhs) const {
                        return index_ < rhs.index_;
                }
 
-               bool operator==(const IdString &rhs) const { return index_ == rhs.index_; }
-               bool operator!=(const IdString &rhs) const { return index_ != rhs.index_; }
+               bool operator==(IdString rhs) const { return index_ == rhs.index_; }
+               bool operator!=(IdString rhs) const { return index_ != rhs.index_; }
 
                // The methods below are just convinience functions for better compatibility with std::string.
 
                bool operator==(const std::string &rhs) const { return str() == rhs; }
                bool operator!=(const std::string &rhs) const { return str() != rhs; }
 
-               bool operator==(const char *rhs) const { return str() == rhs; }
-               bool operator!=(const char *rhs) const { return str() != rhs; }
+               bool operator==(const char *rhs) const { return strcmp(c_str(), rhs) == 0; }
+               bool operator!=(const char *rhs) const { return strcmp(c_str(), rhs) != 0; }
 
                char operator[](size_t i) const {
                        const char *p = c_str();
@@ -220,6 +220,19 @@ namespace RTLIL
                                return (a == nullptr || b == nullptr) ? (a < b) : (a->name < b->name);
                        }
                };
+
+               // often one needs to check if a given IdString is part of a list (for example a list
+               // of cell types). the following functions helps with that.
+
+               template<typename T, typename... Args>
+               bool in(T first, Args... rest) {
+                       return in(first) || in(rest...);
+               }
+
+               bool in(IdString rhs) { return *this == rhs; }
+               bool in(const char *rhs) { return *this == rhs; }
+               bool in(const std::string &rhs) { return *this == rhs; }
+               bool in(const std::set<IdString> &rhs) { return rhs.count(*this) != 0; }
        };
 
        static inline std::string escape_id(std::string str) {
index bd0b315e7bbf80449615f5a7a76f218b45c90daf..9cef14f482b22aaaab2498456126e7822e6cd996 100644 (file)
@@ -109,10 +109,10 @@ struct WreduceWorker
 
        void run_cell(Cell *cell)
        {
-               if (config->supported_cell_types.count(cell->type) == 0)
+               if (!cell->type.in(config->supported_cell_types))
                        return;
 
-               if (cell->type == ID("$shl") || cell->type == ID("$shr") || cell->type == ID("$sshl") || cell->type == ID("$sshr"))
+               if (cell->type.in("$shl", "$shr", "$sshl", "$sshr"))
                        cell->setParam("\\B_SIGNED", false);
 
                if (cell->hasParam("\\A_SIGNED"))
@@ -135,8 +135,7 @@ struct WreduceWorker
                        bits_removed++;
                }
 
-               if (cell->type == ID("$pos") || cell->type == ID("$bu0") || cell->type == ID("$add") || cell->type == ID("$mul") ||
-                               cell->type == ID("$and") || cell->type == ID("$or") || cell->type == ID("$xor"))
+               if (cell->type.in("$pos", "$bu0", "$add", "$mul", "$and", "$or", "$xor"))
                {
                        bool is_signed = cell->getParam("\\A_SIGNED").as_bool();