ice40_wrapcarry -unwrap to preserve 'src' attribute
authorEddie Hung <eddie@fpgeh.com>
Mon, 9 Dec 2019 22:28:54 +0000 (14:28 -0800)
committerEddie Hung <eddie@fpgeh.com>
Mon, 9 Dec 2019 22:28:54 +0000 (14:28 -0800)
passes/pmgen/ice40_wrapcarry.cc

index 4bddece30d3d703cd8a309da269bb81a8843f382..6e154147f5ee6a0afa41d61220fd51898631ee57 100644 (file)
@@ -121,16 +121,24 @@ struct Ice40WrapCarryPass : public Pass {
                                        lut->setPort(ID(A), {cell->getPort(ID(I0)), cell->getPort(ID(A)), cell->getPort(ID(B)), cell->getPort(ID(I3)) });
                                        lut->setPort(ID(Y), cell->getPort(ID(O)));
 
+                                       Const src;
                                        for (const auto &a : cell->attributes)
                                                if (a.first.begins_with("\\SB_CARRY.\\"))
                                                        carry->attributes[a.first.c_str() + strlen("\\SB_CARRY.")] = a.second;
                                                else if (a.first.begins_with("\\SB_LUT4.\\"))
                                                        lut->attributes[a.first.c_str() + strlen("\\SB_LUT4.")] = a.second;
-                                               else if (a.first.in(ID(SB_LUT4.name), ID::keep, ID(module_not_derived), ID(src)))
+                                               else if (a.first == ID(src))
+                                                       src = a.second;
+                                               else if (a.first.in(ID(SB_LUT4.name), ID::keep, ID(module_not_derived)))
                                                        continue;
                                                else
                                                        log_abort();
 
+                                       if (!src.empty()) {
+                                               carry->attributes.insert(std::make_pair(ID(src), src));
+                                               lut->attributes.insert(std::make_pair(ID(src), src));
+                                       }
+
                                        module->remove(cell);
                                }
                        }