Copy attributes to _TECHMAP_REPLACE_ cells
authorClifford Wolf <clifford@clifford.at>
Thu, 16 Feb 2017 11:28:42 +0000 (12:28 +0100)
committerClifford Wolf <clifford@clifford.at>
Thu, 16 Feb 2017 11:28:42 +0000 (12:28 +0100)
passes/techmap/techmap.cc

index b351d3be8fbbb715a4313e06db0dd70bb5c0340f..e85714b5798eb309974392d7558e447c85f7ceae 100644 (file)
@@ -327,8 +327,9 @@ struct TechmapWorker
                for (auto &it : tpl->cells_)
                {
                        std::string c_name = it.second->name.str();
+                       bool techmap_replace_cell = (!flatten_mode) && (c_name == "\\_TECHMAP_REPLACE_");
 
-                       if (!flatten_mode && c_name == "\\_TECHMAP_REPLACE_")
+                       if (techmap_replace_cell)
                                c_name = orig_cell_name;
                        else
                                apply_prefix(cell->name.str(), c_name);
@@ -358,6 +359,11 @@ struct TechmapWorker
 
                        if (c->attributes.count("\\src"))
                                c->add_strpool_attribute("\\src", extra_src_attrs);
+
+                       if (techmap_replace_cell)
+                               for (auto attr : cell->attributes)
+                                       if (!c->attributes.count(attr.first))
+                                               c->attributes[attr.first] = attr.second;
                }
 
                for (auto &it : tpl->connections()) {
@@ -1005,7 +1011,7 @@ struct TechmapPass : public Pass {
                log("constant value.\n");
                log("\n");
                log("A cell with the name _TECHMAP_REPLACE_ in the map file will inherit the name\n");
-               log("of the cell that is being replaced.\n");
+               log("and attributes of the cell that is being replaced.\n");
                log("\n");
                log("See 'help extract' for a pass that does the opposite thing.\n");
                log("\n");