neg, inv, lshift, rshift, lt, eq)
from openpower.util import log
+EFFECTIVELY_UNLIMITED = 1024
def check_extsign(a, b):
if isinstance(b, FieldSelectableInt):
b = b.get_range()
if isinstance(b, int):
return SelectableInt(b, a.bits)
- if b.bits != 256:
+ if b.bits != EFFECTIVELY_UNLIMITED:
return b
return SelectableInt(b.value, a.bits)
self.br = br # map of indices
def eq(self, b):
- if isinstance(b, int):
- # convert integer to same SelectableInt of same bitlength as range
- blen = len(self.br)
- b = SelectableInt(b, blen)
- for i in range(b.bits):
- self[i] = b[i]
- elif isinstance(b, SelectableInt):
- for i in range(b.bits):
- self[i] = b[i]
- else:
- self.si = copy(b.si)
- self.br = copy(b.br)
+ if not isinstance(b, SelectableInt):
+ b = SelectableInt(b, len(self.br))
+ for i in range(b.bits):
+ self[i] = b[i]
def _op(self, op, b):
vi = self.get_range()
return len(self.br)
def __getitem__(self, key):
- log("getitem", key, self.br)
+ #log("getitem", key, self.br)
if isinstance(key, SelectableInt):
key = key.value
FieldSelectableInt can then operate on partial bits, and because there
is a bit width associated with SelectableInt, slices operate correctly
including negative start/end points.
+
+ value: int
+ the bits contained by `self`
+ bits: int
+ the number of bits contained by `self`.
+ ok: bool
+ a flag to detect if outputs have been written by pseudo-code
+
+ instruction inputs have `ok` set to `False`, all changed or new
+ SelectableInt instances set `ok` to `True`.
"""
- def __init__(self, value, bits=None):
+ def __init__(self, value, bits=None, *, ok=True):
+ if isinstance(value, FieldSelectableInt):
+ value = value.get_range()
if isinstance(value, SelectableInt):
if bits is not None:
# check if the bitlength is different. TODO, allow override?
raise ValueError(value)
bits = value.bits
value = value.value
- elif isinstance(value, FieldSelectableInt):
- if bits is not None:
- raise ValueError(value)
- bits = len(value.br)
- value = value.si.value
+ # intentionally don't copy ok
else:
if not isinstance(value, int):
raise ValueError(value)
self.value = value & mask
self.bits = bits
self.overflow = (value & ~mask) != 0
+ self.ok = ok
def eq(self, b):
self.value = b.value
self.bits = b.bits
+ self.ok = True
def to_signed_int(self):
log ("to signed?", self.value & (1<<(self.bits-1)), self.value)
def __rsub__(self, b):
log("rsub", b, self.value)
if isinstance(b, int):
- b = SelectableInt(b, 256) # max extent
+ b = SelectableInt(b, EFFECTIVELY_UNLIMITED) # max extent
#b = check_extsign(self, b)
#assert b.bits == self.bits
return SelectableInt(b.value - self.value, b.bits)
return selectconcat(*bits)
def __setitem__(self, key, value):
+ self.ok = True
if isinstance(key, SelectableInt):
key = key.value
if isinstance(key, int):
return self.value != 0
def __repr__(self):
- value = f"value={hex(self.value)}, bits={self.bits}"
- return f"{self.__class__.__name__}({value})"
+ value = "value=%#x, bits=%d" % (self.value, self.bits)
+ if not self.ok:
+ value += ", ok=False"
+ return "%s(%s)" % (self.__class__.__name__, value)
def __len__(self):
return self.bits
for i in range(repeat):
tmp += args
args = tmp
- res = copy(args[0])
+ if isinstance(args[0], FieldSelectableInt):
+ res = args[0].get_range()
+ else:
+ assert isinstance(args[0], SelectableInt), "can only concat SIs, sorry"
+ res = SelectableInt(args[0])
for i in args[1:]:
if isinstance(i, FieldSelectableInt):
- i = i.si
+ i = i.get_range()
assert isinstance(i, SelectableInt), "can only concat SIs, sorry"
res.bits += i.bits
res.value = (res.value << i.bits) | i.value