Fix import of VHDL enums
authorMiodrag Milanovic <mmicko@gmail.com>
Sun, 30 Aug 2020 10:25:23 +0000 (12:25 +0200)
committerMiodrag Milanovic <mmicko@gmail.com>
Sun, 30 Aug 2020 10:25:23 +0000 (12:25 +0200)
frontends/verific/verific.cc

index 52047ae2bde00d1dd72284aad1b03dc4efb3b57e..0bac2b57ca7f609d2aa39bc1ec3b1ce49ce26a24 100644 (file)
@@ -199,12 +199,19 @@ void VerificImporter::import_attributes(dict<RTLIL::IdString, RTLIL::Const> &att
                                attributes.emplace(stringf("\\enum_value_%s", p+2), RTLIL::escape_id(k));
                        }
                        else if (nl->IsFromVhdl()) {
-                               // Expect "<binary>"
+                               // Expect "<binary>" or plain <binary>
                                auto p = v;
                                if (p) {
-                                       if (*p != '"')
-                                               p = nullptr;
-                                       else {
+                                       if (*p != '"') {
+                                               auto *q = p;
+                                               for (; *q != '\0'; q++)
+                                                       if (*q != '0' && *q != '1') {
+                                                               p = nullptr;
+                                                               break;
+                                                       }
+                                               if (p != nullptr)
+                                                       attributes.emplace(stringf("\\enum_value_%s", p), RTLIL::escape_id(k));
+                                       } else {
                                                auto *q = p+1;
                                                for (; *q != '"'; q++)
                                                        if (*q != '0' && *q != '1') {
@@ -213,16 +220,20 @@ void VerificImporter::import_attributes(dict<RTLIL::IdString, RTLIL::Const> &att
                                                        }
                                                if (p && *(q+1) != '\0')
                                                        p = nullptr;
+
+                                               if (p != nullptr)
+                                               {
+                                                       auto l = strlen(p);
+                                                       auto q = (char*)malloc(l+1-2);
+                                                       strncpy(q, p+1, l-2);
+                                                       q[l-2] = '\0';
+                                                       attributes.emplace(stringf("\\enum_value_%s", q), RTLIL::escape_id(k));
+                                                       free(q);
+                                               }
                                        }
                                }
                                if (p == nullptr)
-                                       log_error("Expected TypeRange value '%s' to be of form \"<binary>\".\n", v);
-                               auto l = strlen(p);
-                               auto q = (char*)malloc(l+1-2);
-                               strncpy(q, p+1, l-2);
-                               q[l-2] = '\0';
-                               attributes.emplace(stringf("\\enum_value_%s", q), RTLIL::escape_id(k));
-                               free(q);
+                                       log_error("Expected TypeRange value '%s' to be of form \"<binary>\" or <binary>.\n", v);
                        }
                }
        }