diff --git a/ndscan/experiment/result_channels.py b/ndscan/experiment/result_channels.py
index 6652e0a..6d4c4c5 100644
--- a/ndscan/experiment/result_channels.py
+++ b/ndscan/experiment/result_channels.py
@@ -2,7 +2,7 @@
 Result handling building blocks.
 """
 
-from artiq.language import HasEnvironment, portable, rpc
+from artiq.language import HasEnvironment, kernel, portable, rpc
 import artiq.language.units
 from typing import Any
 from .utils import dump_json
@@ -280,8 +280,13 @@ def __init__(self,
         self._value_pushed: bool = False
         self._last_value = self._coerce_to_type(0)
 
-    @portable
+    @kernel
     def get_last(self):
+        """ Returns the last value pushed to this result channel.
+
+        This method is a workaround for limitations of ARTIQ python, which make it
+        impractical to extract values from the sinks without going through RPCs.
+        """
         if not self._value_pushed:
             raise RuntimeError("No value pushed to channel")