Checking and fixing specify cells in genRTLIL
authorClifford Wolf <clifford@clifford.at>
Mon, 22 Apr 2019 00:33:12 +0000 (02:33 +0200)
committerClifford Wolf <clifford@clifford.at>
Tue, 23 Apr 2019 19:36:59 +0000 (21:36 +0200)
Signed-off-by: Clifford Wolf <clifford@clifford.at>
frontends/ast/genrtlil.cc

index b3a2a84be51e99e6e45c7b05cdcb7b7620b4bde8..b2a22b49ab6abc191b7cf976e35ad39cbe3ade45 100644 (file)
@@ -1521,9 +1521,23 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)
                        }
                        for (auto &attr : attributes) {
                                if (attr.second->type != AST_CONSTANT)
-                                       log_file_error(filename, linenum, "Attribute `%s' with non-constant value!\n", attr.first.c_str());
+                                       log_file_error(filename, linenum, "Attribute `%s' with non-constant value.\n", attr.first.c_str());
                                cell->attributes[attr.first] = attr.second->asAttrConst();
                        }
+                       if (cell->type.in("$specify2", "$specify3")) {
+                               int src_width = GetSize(cell->getPort("\\SRC"));
+                               int dst_width = GetSize(cell->getPort("\\DST"));
+                               bool full = cell->getParam("\\FULL").as_bool();
+                               if (!full && src_width != dst_width)
+                                       log_file_error(filename, linenum, "Parallel specify SRC width does not match DST width.\n");
+                               if (cell->type == "$specify3") {
+                                       int dat_width = GetSize(cell->getPort("\\DAT"));
+                                       if (dat_width != dst_width)
+                                               log_file_error(filename, linenum, "Specify DAT width does not match DST width.\n");
+                               }
+                               cell->setParam("\\SRC_WIDTH", Const(src_width));
+                               cell->setParam("\\DST_WIDTH", Const(dst_width));
+                       }
                }
                break;