Skip to content

Commit

Permalink
Remove NonHierarchyIndexableObject from ModifiableObject's MRO
Browse files Browse the repository at this point in the history
  • Loading branch information
ktbarrett committed Sep 24, 2021
1 parent 02a5234 commit b56d887
Showing 1 changed file with 105 additions and 1 deletion.
106 changes: 105 additions & 1 deletion cocotb/handle.py
Original file line number Diff line number Diff line change
Expand Up @@ -554,6 +554,8 @@ def __setitem__(self, index, value):
"Setting values on handles using the ``dut.handle[i] = value`` syntax is deprecated. "
"Instead use the ``handle[i].value = value`` syntax",
DeprecationWarning, stacklevel=2)
if self.is_const:
raise TypeError(f"{self._path} is constant")
self[index].value = value

def __getitem__(self, index):
Expand Down Expand Up @@ -656,9 +658,13 @@ def _as_gpi_args_for(self, hdl):
return 0, 2 # GPI_RELEASE


class ModifiableObject(NonHierarchyIndexableObject):
class ModifiableObject(NonHierarchyObject):
"""Base class for simulator objects whose values can be modified."""

def __init__(self, handle, path):
super().__init__(handle, path)
self._range = self._handle.get_range()

def drivers(self):
"""An iterator for gathering all drivers for a signal.
Expand All @@ -675,6 +681,50 @@ def loads(self):
"""
return self._handle.iterate(simulator.LOADS)

def _range_iter(self, left, right):
if left > right:
while left >= right:
yield left
left = left - 1
else:
while left <= right:
yield left
left = left + 1

def __iter__(self):
if self._range is None:
return

self._log.debug("Iterating with range [%d:%d]", self._range[0], self._range[1])
for i in self._range_iter(self._range[0], self._range[1]):
try:
result = self[i]
yield result
except IndexError:
continue

def __setitem__(self, index, value):
"""Provide transparent assignment to indexed array handles."""
warnings.warn(
"Setting values on handles using the ``dut.handle[i] = value`` syntax is deprecated. "
"Instead use the ``handle[i].value = value`` syntax",
DeprecationWarning, stacklevel=2)
self[index].value = value

def __getitem__(self, index):
if isinstance(index, slice):
raise IndexError("Slice indexing is not supported")
if self._range is None:
raise IndexError("%s is not indexable. Unable to get object at index %d" % (self._fullname, index))
if index in self._sub_handles:
return self._sub_handles[index]
new_handle = self._handle.get_handle_by_index(index)
if not new_handle:
raise IndexError("%s contains no object at index %d" % (self._fullname, index))
path = self._path + "[" + str(index) + "]"
self._sub_handles[index] = SimHandle(new_handle, path)
return self._sub_handles[index]

def _check_for_set_action(self, value):
if not isinstance(value, _SetAction):
return value, 0 # GPI_DEPOSIT
Expand Down Expand Up @@ -826,6 +876,24 @@ def __int__(self):
def __float__(self):
return float(self.value)

def __iter__(self):
warnings.warn(
"Attempting to iterate over RealObject is deprecated",
DeprecationWarning, stacklevel=2)
return super().__iter__()

def __getitem__(self, item):
warnings.warn(
"Attempting to index RealObject is deprecated",
DeprecationWarning, stacklevel=2)
return super().__getitem__(item)

def __setitem__(self, item):
warnings.warn(
"Attempting to set an index on a RealObject is deprecated",
DeprecationWarning, stacklevel=2)
super().__setitem__(item)


class EnumObject(ModifiableObject):
"""Specific object handle for enumeration signals and variables."""
Expand Down Expand Up @@ -867,6 +935,24 @@ def value(self) -> int:
def __int__(self):
return int(self.value)

def __iter__(self):
warnings.warn(
"Attempting to iterate over RealObject is deprecated",
DeprecationWarning, stacklevel=2)
return super().__iter__()

def __getitem__(self, item):
warnings.warn(
"Attempting to index RealObject is deprecated",
DeprecationWarning, stacklevel=2)
return super().__getitem__(item)

def __setitem__(self, item):
warnings.warn(
"Attempting to set an index on a RealObject is deprecated",
DeprecationWarning, stacklevel=2)
super().__setitem__(item)


class IntegerObject(ModifiableObject):
"""Specific object handle for integer and enumeration signals and variables."""
Expand Down Expand Up @@ -911,6 +997,24 @@ def value(self) -> int:
def __int__(self):
return int(self.value)

def __iter__(self):
warnings.warn(
"Attempting to iterate over RealObject is deprecated",
DeprecationWarning, stacklevel=2)
return super().__iter__()

def __getitem__(self, item):
warnings.warn(
"Attempting to index RealObject is deprecated",
DeprecationWarning, stacklevel=2)
return super().__getitem__(item)

def __setitem__(self, item):
warnings.warn(
"Attempting to set an index on a RealObject is deprecated",
DeprecationWarning, stacklevel=2)
super().__setitem__(item)


class StringObject(ModifiableObject):
"""Specific object handle for String variables."""
Expand Down

0 comments on commit b56d887

Please sign in to comment.