Source code for hwt.interfaces.signalOps
from hwt.doc_markers import internal
[docs]class SignalOps(object):
"""
Operands for Signal interface,
These operands are delegated on RtlSignal object for this interface
"""
[docs] def _auto_cast(self, toT):
return self._sig._auto_cast(toT)
[docs] @internal
def _convSign(self, signed):
return self._sig._convSign(signed)
[docs] def _signed(self):
return self._convSign(True)
[docs] def _unsigned(self):
return self._convSign(False)
[docs] def _vec(self):
return self._convSign(None)
[docs] def _reinterpret_cast(self, toT):
return self._sig._reinterpret_cast(toT)
# events
[docs] def _onRisingEdge(self):
return self._sig._onRisingEdge()
[docs] def _onFallingEdge(self):
return self._sig._onFallingEdge()
# comparison
[docs] def _isOn(self):
"""
convert this signal to hBool
"""
return self._sig._isOn()
[docs] def _eq(self, other):
"""
Equality operator "==" is not used because it would damage python
ecosystem
"""
return self._sig._eq(other)
def __ne__(self, other):
"""!="""
return self._sig.__ne__(other)
def __gt__(self, other):
""">"""
return self._sig.__gt__(other)
def __lt__(self, other):
"""<"""
return self._sig.__lt__(other)
def __ge__(self, other):
""">="""
return self._sig.__ge__(other)
def __le__(self, other):
"""<="""
return self._sig.__le__(other)
# bitwise
def __invert__(self):
"""~ operator - logical negation for one bit signals and hBool
bitwise inversion for wider signals """
return self._sig.__invert__()
def __and__(self, other):
"""
& operator - logical 'and' for one bit signals and hBool
bitwise and for wider signals
"""
return self._sig.__and__(other)
def __xor__(self, other):
"""
^ operator - logical '!=' for one bit signals and hBool
bitwise and for wider signals
"""
return self._sig.__xor__(other)
def __or__(self, other):
"""
| operator - logical 'or' for one bit signals and hBool
bitwise and for wider signals
"""
return self._sig.__or__(other)
# arithmetic
def __neg__(self):
"- operator (unary minus)"
return self._sig.__neg__()
def __add__(self, other):
"+ operator"
return self._sig.__add__(other)
def __sub__(self, other):
"- operator"
return self._sig.__sub__(other)
def __mul__(self, other):
"* operator"
return self._sig.__mul__(other)
def __pow__(self, other):
"** operator"
return self._sig.__pow__(other)
def __mod__(self, other):
"** operator"
return self._sig.__mod__(other)
def __truediv__(self, other):
"/ operator - floating point division"
return self._sig.__truediv__(other)
def __floordiv__(self, other):
"// operator - integer division"
return self._sig.__floordiv__(other)
def __lshift__(self, other):
"<< left shift (on fixed number of bits)"
return self._sig.__lshift__(other)
def __rshift__(self, other):
">> right shift (on fixed number of bits)"
return self._sig.__lshift__(other)
# hdl centric
[docs] def _reversed(self):
"""
reverse bitorder
"""
# https://stackoverflow.com/questions/27638960/python-reverse-magic-method
return self._sig._reversed()
[docs] def _concat(self, *others):
"""
concatenate signals to one big one
"""
return self._sig._concat(*others)
def __getitem__(self, key):
"""
[] operator key can be slice or index
"""
return self._sig.__getitem__(key)
[docs] def _ternary(self, ifTrue, ifFalse):
return self._sig._ternary(ifTrue, ifFalse)
def __call__(self, source, exclude=None, fit=False):
"""
connect this signal to driver
:attention: it is not call of function it is operator of assignment
:return: list of assignments
"""
assert self._isAccessible, self
return self._sig(source, exclude=None, fit=fit)