ice40_opt to restore attributes/name when unwrapping
authorEddie Hung <eddie@fpgeh.com>
Mon, 9 Dec 2019 22:29:29 +0000 (14:29 -0800)
committerEddie Hung <eddie@fpgeh.com>
Mon, 9 Dec 2019 22:29:29 +0000 (14:29 -0800)
techlibs/ice40/ice40_opt.cc

index aa5c436491d38e4d0c883b878621299c946ff563..371ceb623486d6c69a9fb1ac343ce3054827dd3a 100644 (file)
@@ -117,6 +117,21 @@ static void run_ice40_opts(Module *module)
 
                        if (GetSize(replacement_output)) {
                                optimized_co.insert(sigmap(cell->getPort("\\CO")[0]));
+                               auto it = cell->attributes.find(ID(SB_LUT4.name));
+                               if (it != cell->attributes.end()) {
+                                       module->rename(cell, it->second.decode_string());
+                                       decltype(Cell::attributes) new_attr;
+                                       for (const auto &a : cell->attributes)
+                                               if (a.first.begins_with("\\SB_LUT4.\\"))
+                                                       new_attr[a.first.c_str() + strlen("\\SB_LUT4.")] = a.second;
+                                               else if (a.first == ID(src))
+                                                       new_attr.insert(std::make_pair(a.first, a.second));
+                                               else if (a.first.in(ID(SB_LUT4.name), ID::keep, ID(module_not_derived)))
+                                                       continue;
+                                               else
+                                                       log_abort();
+                                       cell->attributes = std::move(new_attr);
+                               }
                                module->connect(cell->getPort("\\CO")[0], replacement_output);
                                module->design->scratchpad_set_bool("opt.did_something", true);
                                log("Optimized $__ICE40_CARRY_WRAPPER cell back to logic (without SB_CARRY) %s.%s: CO=%s\n",