diff --git a/artiq/language/environment.py b/artiq/language/environment.py index 3a2d9164c..b6936e771 100644 --- a/artiq/language/environment.py +++ b/artiq/language/environment.py @@ -291,7 +291,12 @@ class HasEnvironment: a given position in a NumPy array) If the dataset was created in broadcast mode, the modification is - immediately transmitted.""" + immediately transmitted. + + If the index is a tuple of integers, it is interpreted as + ``slice(*index)``. + If the index is a tuple of tuples, each sub-tuple is interpreted + as ``slice(*sub_tuple)`` (multi-dimensional slicing).""" if self.__parent is not None: self.__parent.mutate_dataset(key, index, value) if self.__dataset_mgr is None: diff --git a/artiq/master/worker_db.py b/artiq/master/worker_db.py index 1262d120e..72db11739 100644 --- a/artiq/master/worker_db.py +++ b/artiq/master/worker_db.py @@ -1,3 +1,4 @@ +from operator import setitem from collections import OrderedDict import importlib import logging @@ -169,7 +170,13 @@ class DatasetManager: target = self.broadcast[key][1] if target is None: raise KeyError("Cannot mutate non-existing dataset") - target[index] = value + + if isinstance(index, tuple): + if isinstance(index[0], tuple): + index = tuple(slice(*e) for e in index) + else: + index = slice(*index) + setitem(target, index, value) def get(self, key): if key in self.local: