abc9_ops: -check for negative arrival/required times
authorEddie Hung <eddie@fpgeh.com>
Mon, 27 Jan 2020 22:22:46 +0000 (14:22 -0800)
committerEddie Hung <eddie@fpgeh.com>
Mon, 27 Jan 2020 22:22:46 +0000 (14:22 -0800)
passes/techmap/abc9_ops.cc

index 0fc4de3bb34f6669f80ab6f12d1cda5e4e661d32..2b4a5c8021d83831a84aa56d10dd5f971118c075 100644 (file)
@@ -77,11 +77,20 @@ void check(RTLIL::Design *design)
                        auto it = w->attributes.find("\\abc9_arrival");
                        if (it != w->attributes.end()) {
                                int count = 0;
-                               if (it->second.flags == 0)
+                               if (it->second.flags == 0) {
+                                       if (it->second.as_int() < 0)
+                                               log_error("%s.%s has negative arrival value %d!\n", log_id(m), log_id(port_name),
+                                                               it->second.as_int());
                                        count++;
+                               }
                                else
                                        for (const auto &tok : split_tokens(it->second.decode_string())) {
-                                               (void) tok;
+                                               if (tok.find_first_not_of("0123456789") != std::string::npos)
+                                                       log_error("%s.%s has non-integer arrival value '%s'!\n", log_id(m), log_id(port_name),
+                                                                       tok.c_str());
+                                               if (atoi(tok.c_str()) < 0)
+                                                       log_error("%s.%s has negative arrival value %s!\n", log_id(m), log_id(port_name),
+                                                                       tok.c_str());
                                                count++;
                                        }
                                if (count > 1 && count != GetSize(w))
@@ -92,11 +101,20 @@ void check(RTLIL::Design *design)
                        it = w->attributes.find("\\abc9_required");
                        if (it != w->attributes.end()) {
                                int count = 0;
-                               if (it->second.flags == 0)
+                               if (it->second.flags == 0) {
+                                       if (it->second.as_int() < 0)
+                                               log_error("%s.%s has negative required value %d!\n", log_id(m), log_id(port_name),
+                                                               it->second.as_int());
                                        count++;
+                               }
                                else
                                        for (const auto &tok : split_tokens(it->second.decode_string())) {
-                                               (void) tok;
+                                               if (tok.find_first_not_of("0123456789") != std::string::npos)
+                                                       log_error("%s.%s has non-integer required value '%s'!\n", log_id(m), log_id(port_name),
+                                                                       tok.c_str());
+                                               if (atoi(tok.c_str()) < 0)
+                                                       log_error("%s.%s has negative required value %s!\n", log_id(m), log_id(port_name),
+                                                                       tok.c_str());
                                                count++;
                                        }
                                if (count > 1 && count != GetSize(w))