summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2014-07-24 03:48:38 +0200
committerClifford Wolf <clifford@clifford.at>2014-07-24 03:48:38 +0200
commit6b1018314c130ffa12df2e8c73f1c0cd5853b6f7 (patch)
tree73621bf960d0e90beb7b1804fbb39cd0ddaa5d4b /kernel
parentb31762d158f4c9fb406cd787361254330f4ec03e (diff)
Added cover() API
Diffstat (limited to 'kernel')
-rw-r--r--kernel/log.cc2
-rw-r--r--kernel/log.h33
2 files changed, 35 insertions, 0 deletions
diff --git a/kernel/log.cc b/kernel/log.cc
index 949bf432..26414d49 100644
--- a/kernel/log.cc
+++ b/kernel/log.cc
@@ -29,6 +29,8 @@
#include <vector>
#include <list>
+CoverAgent *CoverAgent::first_cover_agent = NULL;
+
std::vector<FILE*> log_files;
FILE *log_errfile = NULL;
bool log_time = false;
diff --git a/kernel/log.h b/kernel/log.h
index 00265dbe..51780806 100644
--- a/kernel/log.h
+++ b/kernel/log.h
@@ -63,6 +63,39 @@ void log_cell(RTLIL::Cell *cell, std::string indent = "");
#define log_assert(_assert_expr_) do { if (_assert_expr_) break; log_error("Assert `%s' failed in %s:%d.\n", #_assert_expr_, __FILE__, __LINE__); } while (0)
#define log_ping() log("-- %s:%d %s --\n", __FILE__, __LINE__, __PRETTY_FUNCTION__)
+#ifndef NDEBUG
+# define cover(_id) do { \
+ static CoverAgent _cover_agent(__FILE__, __LINE__, __FUNCTION__, _id); \
+ _cover_agent.ticks++; \
+ } while (0)
+#else
+# define cover(_id) do { } while (0)
+#endif
+
+struct CoverAgent
+{
+ static struct CoverAgent *first_cover_agent;
+ struct CoverAgent *next_cover_agent;
+
+ const char *file;
+ int line;
+ const char *func;
+ const char *id;
+ int ticks;
+
+ CoverAgent(const char *file, int line, const char *func, const char *id) :
+ file(file), line(line), func(func), id(id), ticks(0)
+ {
+ next_cover_agent = first_cover_agent;
+ first_cover_agent = this;
+ };
+};
+
+
+// ------------------------------------------------------------
+// everything below this line are utilities for troubleshooting
+// ------------------------------------------------------------
+
// simple timer for performance measurements
// toggle the '#if 1' to get a baseline for the perormance penalty added by the measurement
struct PerformanceTimer