Repository: spinnakermanchester/spinnfrontendcommon
Issue: ReverseIPTagMulticastSourceMachineVertex has different  meanings for send_buffer_time is None

The class ReverseIPTagMulticastSourceMachineVertex has different  meanings for send_buffer_time is None
And this effects the sdram cost for recording

in method _recording_sdram_per_timestep(...
the assumption is send_buffer_times is None means  recording live data

in the init and empty  send_buffer_times is converted to None.  
However an empty  send_buffer_times param does not indicate live data.

Caught in spy8 integration test  TestSpikeSourceArray.test_recording_with_empty_lists
IF ReverseIpTagMultiCastSource.create_machine_vertex(....
has an extra
        if resources_required:
            assert (resources_required == machine_vertex.resources_required)


Changed files:
spinn_front_end_common/utility_models/reverse_ip_tag_multi_cast_source.py
spinn_front_end_common/utility_models/reverse_ip_tag_multicast_source_machine_vertex.py

diff --git a/spinn_front_end_common/utility_models/reverse_ip_tag_multi_cast_source.py b/spinn_front_end_common/utility_models/reverse_ip_tag_multi_cast_source.py
index 2a5c62ffa..19eed0795 100644
--- a/spinn_front_end_common/utility_models/reverse_ip_tag_multi_cast_source.py
+++ b/spinn_front_end_common/utility_models/reverse_ip_tag_multi_cast_source.py
@@ -179,6 +179,17 @@ class ReverseIpTagMultiCastSource(
             if hasattr(send_buffer_times[0], "__len__"):
                 send_buffer_times = send_buffer_times[
                     vertex_slice.lo_atom:vertex_slice.hi_atom + 1]
+                # Check the buffer times on the slice are not empty
+                n_buffer_times = 0
+                for i in send_buffer_times:
+                    if hasattr(i, "__len__"):
+                        n_buffer_times += len(i)
+                    else:
+                        # assuming this must be a single integer
+                        n_buffer_times += 1
+                if n_buffer_times == 0:
+                    send_buffer_times = None
+
         sim = globals_variables.get_simulator()
         container = ResourceContainer(
             sdram=ReverseIPTagMulticastSourceMachineVertex.get_sdram_usage(
@@ -261,8 +272,8 @@ class ReverseIpTagMultiCastSource(
             enable_injection=self._enable_injection)
         machine_vertex.enable_recording(self._is_recording)
         # Known issue with ReverseIPTagMulticastSourceMachineVertex
-        # if resources_required:
-        #    assert (resources_required == machine_vertex.resources_required)
+        if resources_required:
+            assert (resources_required == machine_vertex.resources_required)
         return machine_vertex
 
     def __repr__(self):
diff --git a/spinn_front_end_common/utility_models/reverse_ip_tag_multicast_source_machine_vertex.py b/spinn_front_end_common/utility_models/reverse_ip_tag_multicast_source_machine_vertex.py
index 04681247f..5cc2cc976 100644
--- a/spinn_front_end_common/utility_models/reverse_ip_tag_multicast_source_machine_vertex.py
+++ b/spinn_front_end_common/utility_models/reverse_ip_tag_multicast_source_machine_vertex.py
@@ -13,11 +13,13 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+import logging
 import math
 import struct
 import numpy
 from enum import IntEnum
 from six.moves import xrange
+from spinn_utilities.log import FormatAdapter
 from spinn_utilities.overrides import overrides
 from spinnman.messages.eieio import EIEIOPrefix, EIEIOType
 from spinnman.messages.eieio.data_messages import EIEIODataHeader
@@ -60,6 +62,8 @@ from spinn_front_end_common.interface.buffer_management.recording_utilities \\
 from spinn_front_end_common.utilities.utility_objs import (
     ProvenanceDataItem, ExecutableType)
 
+logger = FormatAdapter(logging.getLogger(__name__))
+
 _DEFAULT_MALLOC_REGIONS = 2
 _ONE_WORD = struct.Struct("<I")
 _TWO_SHORTS = struct.Struct("<HH")
@@ -204,6 +208,11 @@ class ReverseIPTagMulticastSourceMachineVertex(
                 else:
                     # assuming this must be a single integer
                     n_buffer_times += 1
+            if n_buffer_times == 0:
+                logger.warning(
+                    "Combination of send_buffer_times {} and slice {} results "
+                    "in a core with a ReverseIPTagMulticastSourceMachineVertex"
+                    " which does not spike", send_buffer_times, vertex_slice)
         if n_buffer_times == 0:
             self._send_buffer_times = None
             self._send_buffers = None
@@ -369,8 +378,8 @@ class ReverseIPTagMulticastSourceMachineVertex(
     def resources_required(self):
         sim = globals_variables.get_simulator()
         sdram = self.get_sdram_usage(
-                self._send_buffer_times, self._is_recording,
-                sim.machine_time_step, self._receive_rate, self._n_keys)
+            self._send_buffer_times, self._is_recording,
+            sim.machine_time_step, self._receive_rate, self._n_keys)
 
         resources = ResourceContainer(
             dtcm=DTCMResource(self.get_dtcm_usage()),