Merge performance samples

Update the Ethos-U Monitor to merge performance samples where the
qread or status register have not changed.

Change-Id: I8b4ea728e004bd2ff05ad1c90326a864dc592f4d
diff --git a/lib/ethosu_monitor/src/ethosu_monitor.cpp b/lib/ethosu_monitor/src/ethosu_monitor.cpp
index d13e6c2..e4e100c 100644
--- a/lib/ethosu_monitor/src/ethosu_monitor.cpp
+++ b/lib/ethosu_monitor/src/ethosu_monitor.cpp
@@ -21,18 +21,27 @@
 #include <inttypes.h>
 #include <stdio.h>
 
-EthosUMonitor::EthosUMonitor(Backend __backend) : backend(__backend) {}
+EthosUMonitor::EthosUMonitor(Backend __backend, bool _merge) : backend(__backend), merge(_merge) {}
 
 void EthosUMonitor::monitorSample(ethosu_driver *drv) {
     switch (backend) {
     case EVENT_RECORDER: {
-        EthosuEventRecord record = {ETHOSU_PMU_Get_CCNTR(drv),
-                                    ETHOSU_PMU_Get_QREAD(drv),
-                                    ETHOSU_PMU_Get_STATUS(drv),
-                                    {{ethosuEventIds[0], ETHOSU_PMU_Get_EVCNTR(drv, 0)},
-                                     {ethosuEventIds[1], ETHOSU_PMU_Get_EVCNTR(drv, 1)},
-                                     {ethosuEventIds[2], ETHOSU_PMU_Get_EVCNTR(drv, 2)},
-                                     {ethosuEventIds[3], ETHOSU_PMU_Get_EVCNTR(drv, 3)}}};
+        const EthosuEventRecord record = {ETHOSU_PMU_Get_CCNTR(drv),
+                                          ETHOSU_PMU_Get_QREAD(drv),
+                                          ETHOSU_PMU_Get_STATUS(drv),
+                                          {{ethosuEventIds[0], ETHOSU_PMU_Get_EVCNTR(drv, 0)},
+                                           {ethosuEventIds[1], ETHOSU_PMU_Get_EVCNTR(drv, 1)},
+                                           {ethosuEventIds[2], ETHOSU_PMU_Get_EVCNTR(drv, 2)},
+                                           {ethosuEventIds[3], ETHOSU_PMU_Get_EVCNTR(drv, 3)}}};
+
+        // Merge records if qread or status has not changed
+        if (merge && prevRecord.qread == record.qread && prevRecord.status == record.status) {
+            mergeCount++;
+            break;
+        }
+
+        prevRecord.qread  = record.qread;
+        prevRecord.status = record.status;
 
         EventRecordData(EventID(EventLevelDetail, EthosuEventComponentNo, 0), &record, sizeof(record));
         break;
@@ -48,3 +57,7 @@
 void EthosUMonitor::release(ethosu_driver *drv) {
     ETHOSU_PMU_Disable(drv);
 }
+
+size_t EthosUMonitor::getMergeCount() const {
+    return mergeCount;
+}