def testSetSlice(self): self.seqsSetup() toggle = 0 for s in self.seqs: n = long(s, 2) for i in range(1, len(s) + 5): for j in range(0, len(s) + 5): for v in self.seqv: ext = "0" * (i - j - len(v)) extv = ext + v bv = intbv(n) bvi = intbv(~n) val = long(v, 2) toggle ^= 1 if toggle: val = intbv(val) try: bv[i:j] = val except ValueError: assert i <= j or val >= 2 ** (i - j) continue else: ref = long(setSlice(s, i, j, extv), 2) assert bv == ref mask = (2 ** (i - j)) - 1 vali = val ^ mask try: bvi[i:j] = vali except ValueError: assert vali >= 2 ** (i - j) continue else: refi = ~long(setSlice(s, i, j, extv), 2) assert bvi == refi
def testSetSlice(self): self.seqsSetup() toggle = 0 for s in self.seqs: n = long(s, 2) for i in range(1, len(s) + 5): for j in range(0, len(s) + 5): for v in self.seqv: ext = '0' * (i - j - len(v)) extv = ext + v bv = intbv(n) bvi = intbv(~n) val = long(v, 2) toggle ^= 1 if toggle: val = intbv(val) try: bv[i:j] = val except ValueError: self.assertTrue(i <= j or val >= 2**(i - j)) continue else: ref = long(setSlice(s, i, j, extv), 2) self.assertEqual(bv, ref) mask = (2**(i - j)) - 1 vali = val ^ mask try: bvi[i:j] = vali except ValueError: self.assertTrue(vali >= 2**(i - j)) continue else: refi = ~long(setSlice(s, i, j, extv), 2) self.assertEqual(bvi, refi)
def testSliceAssign(self): a = intbv(min=-24, max=34) for i in (-24, -2, 13, 33): for k in (6, 9, 10): a[:] = 0 a[k:] = i self.assertEqual(a, i) for i in (-25, -128, 34, 35, 229): for k in (0, 9, 10): try: a[k:] = i except ValueError: pass else: self.fail() a = intbv(5)[8:] for v in (0, 2**8-1, 100): a[:] = v for v in (-1, 2**8, -10, 1000): try: a[:] = v except ValueError: pass else: self.fail()
def testSetSlice(self): self.seqsSetup() toggle = 0 for s in self.seqs: n = int(s, 2) for i in range(1, len(s)+5): for j in range(0, len(s)+5): for v in self.seqv: ext = '0' * (i-j -len(v)) extv = ext + v bv = intbv(n) bvi = intbv(~n) val = int(v, 2) toggle ^= 1 if toggle: val = intbv(val) try: bv[i:j] = val except ValueError: assert i<=j or val >= 2**(i-j) continue else: ref = int(setSlice(s, i, j, extv), 2) assert bv == ref mask = (2**(i-j))-1 vali = val ^ mask try: bvi[i:j] = vali except ValueError: assert vali >= 2**(i-j) continue else: refi = ~int(setSlice(s, i, j, extv), 2) assert bvi == refi
def testSliceAssign(self): a = intbv(min=-24, max=34) for i in (-24, -2, 13, 33): for k in (6, 9, 10): a[:] = 0 a[k:] = i self.assertEqual(a, i) for i in (-25, -128, 34, 35, 229): for k in (0, 9, 10): try: a[k:] = i except ValueError: pass else: self.fail() a = intbv(5)[8:] for v in (0, 2**8 - 1, 100): a[:] = v for v in (-1, 2**8, -10, 1000): try: a[:] = v except ValueError: pass else: self.fail()
def testInit(self): with pytest.raises(ValueError): intbv(15, min=-8, max=8) x = modbv(15, min=-8, max=8) assert -1 == x # Arbitrary boundraries support (no exception) modbv(5, min=-3, max=8)
def testNoWrap(self): # Validate the base class fails for the wraps x = intbv(0, min=-8, max=8) with pytest.raises(ValueError): x[:] += 15 x = intbv(0, min=-8, max=8) with pytest.raises(ValueError): x[:] += 15
def concat(base, *args): if isinstance(base, intbv): basewidth = base._nrbits val = base._val elif isinstance(base, integer_types): if isinstance(base, bool): basewidth = 1 else: basewidth = 0 val = base elif isinstance(base, _Signal): basewidth = base._nrbits if isinstance(base._val, intbv): val = base._val._val else: val = base._val elif isinstance(base, str): basewidth = len(base) val = long(base, 2) else: raise TypeError("concat: inappropriate first argument type: %s" % type(base)) width = 0 for i, arg in enumerate(args): if isinstance(arg, intbv): w = arg._nrbits v = arg._val elif isinstance(arg, _Signal): w = arg._nrbits if isinstance(arg._val, intbv): v = arg._val._val else: v = arg._val elif isinstance(arg, bool): w = 1 v = arg elif isinstance(arg, str): w = len(arg) v = long(arg, 2) else: raise TypeError("concat: inappropriate argument type: %s" % type(arg)) if not w: raise TypeError("concat: arg on pos %d should have length" % (i + 1)) width += w val = val << w | v & (long(1) << w) - 1 if basewidth: return intbv(val, _nrbits=basewidth + width) else: return intbv(val)
def concat(base, *args): if isinstance(base, intbv): basewidth = base._nrbits val = base._val elif isinstance(base, integer_types): if isinstance(base, bool): basewidth = 1 else: basewidth = 0 val = base elif isinstance(base, _Signal): basewidth = base._nrbits if isinstance(base._val, intbv): val = base._val._val else: val = base._val elif isinstance(base, str): basewidth = len(base) val = long(base, 2) else: raise TypeError("concat: inappropriate first argument type: %s" \ % type(base)) width = 0 for i, arg in enumerate(args): if isinstance(arg, intbv): w = arg._nrbits v = arg._val elif isinstance(arg, _Signal): w = arg._nrbits if isinstance(arg._val, intbv): v = arg._val._val else: v = arg._val elif isinstance(arg, bool): w = 1 v = arg elif isinstance(arg, str): w = len(arg) v = long(arg, 2) else: raise TypeError("concat: inappropriate argument type: %s" \ % type(arg)) if not w: raise TypeError("concat: arg on pos %d should have length" % (i+1)) width += w val = val << w | v & (long(1) << w)-1 if basewidth: return intbv(val, _nrbits=basewidth + width) else: return intbv(val)
def comparisonCheck(self, op, imin=0, imax=None, jmin=0, jmax=None): self.seqSetup(imin=imin, imax=imax, jmin=jmin, jmax=jmax) for i, j in zip(self.seqi, self.seqj): bi = intbv(i) bj = intbv(j) ref = op(i, j) r1 = op(bi, j) r2 = op(i, bj) r3 = op(bi, bj) assert r1 == ref assert r2 == ref assert r3 == ref
def comparisonCheck(self, op, imin=0, imax=None, jmin=0, jmax=None): self.seqSetup(imin=imin, imax=imax, jmin=jmin, jmax=jmax) for i, j in zip(self.seqi, self.seqj): bi = intbv(i) bj = intbv(j) exec("ref = i %s j" % op) exec("r1 = bi %s j" % op) exec("r2 = i %s bj" % op) exec("r3 = bi %s bj" % op) self.assertEqual(r1, ref) self.assertEqual(r2, ref) self.assertEqual(r3, ref)
def comparisonCheck(self, op, imin=0, imax=None, jmin=0, jmax=None): self.seqSetup(imin=imin, imax=imax, jmin=jmin, jmax=jmax) for i, j in zip(self.seqi, self.seqj): bi = intbv(i) bj = intbv(j) ref = op(i, j) r1 = op(bi, j) r2 = op(i, bj) r3 = op(bi, bj) self.assertEqual(r1, ref) self.assertEqual(r2, ref) self.assertEqual(r3, ref)
def testConcatMixToUnsizedBase(self): bases = [] for base in self.bases: seq = (long(base, 2), Signal(long(base, 2))) bases.append(random.choice(seq)) extslist = [] for exts in self.extslist: newexts = [] for ext in exts: seq = (ext, intbv(ext), Signal(intbv(ext))) newexts.append(random.choice(seq)) extslist.append(newexts) self.ConcatToUnsizedBase(bases, extslist)
def testGetSliceLeftOpen(self): self.seqsSetup() for s in self.seqs: n = long(s, 2) bv = intbv(n) bvi = intbv(~n) for j in range(0, len(s) + 20): res = bv[:j] resi = bvi[:j] ref = long(getSliceLeftOpen(s, j), 2) self.assertEqual(res, ref) self.assertEqual(type(res), intbv) self.assertEqual(resi + ref, -1) self.assertEqual(type(res), intbv)
def testGetSliceLeftOpen(self): self.seqsSetup() for s in self.seqs: n = long(s, 2) bv = intbv(n) bvi = intbv(~n) for j in range(0, len(s) + 20): res = bv[:j] resi = bvi[:j] ref = long(getSliceLeftOpen(s, j), 2) assert res == ref assert type(res) == intbv assert resi + ref == -1 assert type(res) == intbv
def testGetSliceLeftOpen(self): self.seqsSetup() for s in self.seqs: n = long(s, 2) bv = intbv(n) bvi = intbv(~n) for j in range(0,len(s)+20): res = bv[:j] resi = bvi[:j] ref = long(getSliceLeftOpen(s, j), 2) self.assertEqual(res, ref) self.assertEqual(type(res), intbv) self.assertEqual(resi+ref, -1) self.assertEqual(type(res), intbv)
def testGetItem(self): self.seqsSetup() for s in self.seqs: n = long(s, 2) bv = intbv(n) bvi = intbv(~n) for i in range(len(s) + 20): ref = long(getItem(s, i), 2) res = bv[i] resi = bvi[i] self.assertEqual(res, ref) self.assertEqual(type(res), bool) self.assertEqual(resi, ref ^ 1) self.assertEqual(type(resi), bool)
def testGetItem(self): self.seqsSetup() for s in self.seqs: n = long(s, 2) bv = intbv(n) bvi = intbv(~n) for i in range(len(s) + 20): ref = long(getItem(s, i), 2) res = bv[i] resi = bvi[i] assert res == ref assert type(res) == bool assert resi == ref ^ 1 assert type(resi) == bool
def testGetItem(self): self.seqsSetup() for s in self.seqs: n = long(s, 2) bv = intbv(n) bvi = intbv(~n) for i in range(len(s)+20): ref = long(getItem(s, i), 2) res = bv[i] resi = bvi[i] self.assertEqual(res, ref) self.assertEqual(type(res), bool) self.assertEqual(resi, ref^1) self.assertEqual(type(resi), bool)
def testConcatIntbvsBoolsToIntbv(self): if type(bool) is not type: return bases = [intbv(base) for base in self.bases] extslist = [] for exts in self.extslist: newexts = [] for ext in exts: if len(ext) == 1: newexts.append(bool(int(ext))) else: newexts.append(intbv(ext)) extslist.append(newexts) self.ConcatToSizedBase(bases, extslist)
def binaryCheck(self, op, imin=0, imax=None, jmin=0, jmax=None): self.seqSetup(imin=imin, imax=imax, jmin=jmin, jmax=jmax) for i, j in zip(self.seqi, self.seqj): bi = intbv(long(i)) bj = intbv(j) ref = op(long(i), j) r1 = op(bi, j) r2 = op(long(i), bj) r3 = op(bi, bj) #self.assertEqual(type(r1), intbv) #self.assertEqual(type(r2), intbv) #self.assertEqual(type(r3), intbv) self.assertEqual(r1, ref) self.assertEqual(r2, ref) self.assertEqual(r3, ref)
def testNoWrap(self): # Validate the base class fails for the wraps x = intbv(0, min=-8, max=8) try: x[:] += 15 self.fail() except ValueError: pass x = intbv(0, min=-8, max=8) try: x[:] += 15 self.fail() except ValueError: pass
def binaryCheck(self, op, imin=0, imax=None, jmin=0, jmax=None): self.seqSetup(imin=imin, imax=imax, jmin=jmin, jmax=jmax) for i, j in zip(self.seqi, self.seqj): bi = intbv(long(i)) bj = intbv(j) ref = op(long(i), j) r1 = op(bi, j) r2 = op(long(i), bj) r3 = op(bi, bj) # self.assertEqual(type(r1), intbv) # self.assertEqual(type(r2), intbv) # self.assertEqual(type(r3), intbv) assert r1 == ref assert r2 == ref assert r3 == ref
def toVerilog(self): lines = [] ini = intbv(self._initval)[self._nrbits:] hi = self._nrbits for a in self._args: if isinstance(a, bool): w = 1 else: w = len(a) lo = hi - w if w == 1: if isinstance(a, _Signal): if a._type == bool: lines.append("assign %s[%s] = %s;" % (self._name, lo, a._name)) else: lines.append("assign %s[%s] = %s[0];" % (self._name, lo, a._name)) else: lines.append("assign %s[%s] = 'b%s;" % (self._name, lo, bin(ini[lo]))) else: if isinstance(a, _Signal): lines.append("assign %s[%s-1:%s] = %s;" % (self._name, hi, lo, a._name)) else: lines.append("assign %s[%s-1:%s] = 'b%s;" % (self._name, hi, lo, bin(ini[hi:lo], w))) hi = lo return "\n".join(lines)
def toVHDL(self): lines = [] ini = intbv(self._initval)[self._nrbits:] hi = self._nrbits for a in self._args: if isinstance(a, bool): w = 1 else: w = len(a) lo = hi - w if w == 1: if isinstance(a, _Signal): if a._type == bool: # isinstance(a._type , bool): <- doesn't work lines.append("%s(%s) <= %s;" % (self._name, lo, a._name)) else: lines.append("%s(%s) <= %s(0);" % (self._name, lo, a._name)) else: lines.append("%s(%s) <= '%s';" % (self._name, lo, bin(ini[lo]))) else: if isinstance(a, _Signal): lines.append("%s(%s-1 downto %s) <= %s;" % (self._name, hi, lo, a._name)) else: lines.append('%s(%s-1 downto %s) <= "%s";' % (self._name, hi, lo, bin(ini[hi:lo],w))) hi = lo return "\n".join(lines)
def __init__(self, *args): assert len(args) >= 2 self._args = args self._sigargs = sigargs = [] nrbits = 0 val = 0 for a in args: if isinstance(a, intbv): w = a._nrbits v = a._val elif isinstance(a, _Signal): sigargs.append(a) w = a._nrbits if isinstance(a._val, intbv): v = a._val._val else: v = a._val elif isinstance(a, bool): w = 1 v = a elif isinstance(a, str): w = len(a) v = long(a, 2) else: raise TypeError("ConcatSignal: inappropriate argument type: %s" \ % type(a)) nrbits += w val = val << w | v & (long(1) << w)-1 self._initval = val ini = intbv(val)[nrbits:] _ShadowSignal.__init__(self, ini) gen = self.genfunc() self._waiter = _SignalTupleWaiter(gen)
def __init__(self, sig, left, right, signed): # XXX error checks if not signed: _ShadowSignal.__init__(self, sig[left:right]) else: if sig[left - 1]: val = -(2**(left - right) - sig[left:right]) else: val = sig[left:right] _ShadowSignal.__init__( self, intbv(val, min=-2**(left - right - 1), max=2**(left - right - 1))) self._sig = sig self._left = left self._right = right # if right is None: # gen = self._genfuncIndex() # else: gen = self._genfuncSlice() self._waiter = _SignalWaiter(gen) # 6jun16 jb sig._read = True self._driven = 'wire'
def toVerilog(self): lines = [] ini = intbv(self._initval)[self._nrbits:] hi = self._nrbits for a in self._args: if isinstance(a, bool): w = 1 else: w = len(a) lo = hi - w if w == 1: if isinstance(a, _Signal): if a._type == bool: lines.append("assign %s[%s] = %s;" % (self._name, lo, a._name)) else: lines.append("assign %s[%s] = %s[0];" % (self._name, lo, a._name)) else: lines.append("assign %s[%s] = 'b%s;" % (self._name, lo, bin(ini[lo]))) else: if isinstance(a, _Signal): lines.append("assign %s[%s-1:%s] = %s;" % (self._name, hi, lo, a._name)) else: lines.append("assign %s[%s-1:%s] = 'b%s;" % (self._name, hi, lo, bin(ini[hi:lo],w))) hi = lo return "\n".join(lines)
def __init__(self, *args): assert len(args) >= 2 self._args = args self._sigargs = sigargs = [] nrbits = 0 val = 0 for a in args: if isinstance(a, intbv): w = a._nrbits v = a._val elif isinstance(a, _Signal): sigargs.append(a) w = a._nrbits if isinstance(a._val, intbv): v = a._val._val else: v = a._val elif isinstance(a, bool): w = 1 v = a elif isinstance(a, str): w = len(a) v = long(a, 2) else: raise TypeError("ConcatSignal: inappropriate argument type: %s" \ % type(a)) nrbits += w val = val << w | v & (long(1) << w) - 1 self._initval = val ini = intbv(val)[nrbits:] _ShadowSignal.__init__(self, ini) gen = self.genfunc() self._waiter = _SignalTupleWaiter(gen)
def toVHDL(self): lines = [] ini = intbv(self._initval)[self._nrbits:] hi = self._nrbits for a in self._args: if isinstance(a, bool): w = 1 else: w = len(a) lo = hi - w if w == 1: if isinstance(a, _Signal): if a._type == bool: # isinstance(a._type , bool): <- doesn't work lines.append("%s(%s) <= %s;" % (self._name, lo, a._name)) else: lines.append("%s(%s) <= %s(0);" % (self._name, lo, a._name)) else: lines.append("%s(%s) <= '%s';" % (self._name, lo, bin(ini[lo]))) else: if isinstance(a, _Signal): lines.append("%s(%s-1 downto %s) <= %s;" % (self._name, hi, lo, a._name)) else: lines.append('%s(%s-1 downto %s) <= "%s";' % (self._name, hi, lo, bin(ini[hi:lo], w))) hi = lo return "\n".join(lines)
def concat(base, *args): if isinstance(base, intbv): basewidth = base._nrbits val = base._val elif isinstance(base, (int, long)): if isinstance(base, bool): basewidth = 1 else: basewidth = 0 val = base elif isinstance(base, Signal): basewidth = base._nrbits val = base._val elif isinstance(base, str): basewidth = len(base) val = long(base, 2) else: raise TypeError("concat: inappropriate first argument type: %s" \ % type(base)) width = 0 for arg in args: if isinstance(arg, intbv): w = arg._nrbits v = arg._val elif isinstance(arg, Signal): w = arg._nrbits v = arg._val elif isinstance(arg, bool): w = 1 v = arg elif isinstance(arg, str): w = len(arg) v = long(arg, 2) else: raise TypeError("concat: inappropriate argument type: %s" \ % type(arg)) if not w: raise TypeError, "concat: arg to concat should have length" width += w val = val*(2**w) + v if basewidth: return intbv(val, _nrbits=basewidth + width) else: return intbv(val)
def conversionCheck(self, op, imin=0, imax=None): self.seqSetup(imin=imin, imax=imax) for i in self.seqi: bi = intbv(i) ref = op(i) r1 = op(bi) assert type(r1) == type(ref) assert r1 == ref
def unaryCheck(self, op, imin=0, imax=None): self.seqSetup(imin=imin, imax=imax) for i in self.seqi: bi = intbv(i) ref = op(i) r1 = op(bi) # self.assertEqual(type(r1), intbv) assert r1 == ref
def conversionCheck(self, op, imin=0, imax=None): self.seqSetup(imin=imin, imax=imax) for i in self.seqi: bi = intbv(i) ref = op(i) r1 = op(bi) self.assertEqual(type(r1), type(ref)) self.assertEqual(r1, ref)
def unaryCheck(self, op, imin=0, imax=None): self.seqSetup(imin=imin, imax=imax) for i in self.seqi: bi = intbv(i) ref = op(i) r1 = op(bi) #self.assertEqual(type(r1), intbv) self.assertEqual(r1, ref)
def testSliceAssign(self): a = intbv(min=-24, max=34) for i in (-24, -2, 13, 33): for k in (6, 9, 10): a[:] = 0 a[k:] = i assert a == i for i in (-25, -128, 34, 35, 229): for k in (0, 9, 10): with pytest.raises(ValueError): a[k:] = i a = intbv(5)[8:] for v in (0, 2**8 - 1, 100): a[:] = v for v in (-1, 2**8, -10, 1000): with pytest.raises(ValueError): a[:] = v
def testConcatMixBoolToSizedBase(self): if type(bool) is not type: return bases = [] for base in self.bases: seq = (base, intbv(base), Signal(intbv(base))) bases.append(random.choice(seq)) extslist = [] for exts in self.extslist: newexts = [] for ext in exts: if len(ext) == 1: seq = (ext, bool(int(ext)), Signal(bool(int(ext)))) else: seq = (ext, intbv(ext), Signal(intbv(ext))) newexts.append(random.choice(seq)) extslist.append(newexts) self.ConcatToSizedBase(bases, extslist)
def testSliceAssign(self): a = intbv(min=-24, max=34) for i in (-24, -2, 13, 33): for k in (6, 9, 10): a[:] = 0 a[k:] = i assert a == i for i in (-25, -128, 34, 35, 229): for k in (0, 9, 10): with pytest.raises(ValueError): a[k:] = i a = intbv(5)[8:] for v in (0, 2 ** 8 - 1, 100): a[:] = v for v in (-1, 2 ** 8, -10, 1000): with pytest.raises(ValueError): a[:] = v
def augmentedAssignCheck(self, op, imin=0, imax=None, jmin=0, jmax=None): self.seqSetup(imin=imin, imax=imax, jmin=jmin, jmax=jmax) for i, j in zip(self.seqi, self.seqj): bj = intbv(j) ref = long(i) exec("ref %s j" % op) r1 = bi1 = intbv(long(i)) exec("r1 %s j" % op) r2 = long(i) exec("r2 %s bj" % op) r3 = bi3 = intbv(long(i)) exec("r3 %s bj" % op) self.assertEqual(type(r1), intbv) self.assertEqual(type(r3), intbv) self.assertEqual(r1, ref) self.assertEqual(r2, ref) self.assertEqual(r3, ref) self.assert_(r1 is bi1) self.assert_(r3 is bi3)
def augmentedAssignCheck(self, op, imin=0, imax=None, jmin=0, jmax=None): self.seqSetup(imin=imin, imax=imax, jmin=jmin, jmax=jmax) for i, j in zip(self.seqi, self.seqj): bj = intbv(j) ref = long(i) ref = op(ref, j) r1 = bi1 = intbv(long(i)) r1 = op(r1, j) r2 = long(i) r2 = op(r2, bj) r3 = bi3 = intbv(long(i)) r3 = op(r3, bj) self.assertEqual(type(r1), intbv) self.assertEqual(type(r3), intbv) self.assertEqual(r1, ref) self.assertEqual(r2, ref) self.assertEqual(r3, ref) self.assertTrue(r1 is bi1) self.assertTrue(r3 is bi3)
def testSetSliceLeftOpen(self): self.seqsSetup() toggle = 0 for s in self.seqs: n = long(s, 2) for j in range(0, len(s) + 5): for v in self.seqv: bv = intbv(n) bvi = intbv(~n) val = long(v, 2) toggle ^= 1 if toggle: val = intbv(val) bv[:j] = val bvi[:j] = -1 - val ref = long(setSliceLeftOpen(s, j, v), 2) self.assertEqual(bv, ref) refi = ~long(setSliceLeftOpen(s, j, v), 2) self.assertEqual(bvi, refi)
def augmentedAssignCheck(self, op, imin=0, imax=None, jmin=0, jmax=None): self.seqSetup(imin=imin, imax=imax, jmin=jmin, jmax=jmax) for i, j in zip(self.seqi, self.seqj): bj = intbv(j) ref = long(i) ref = op(ref, j) r1 = bi1 = intbv(long(i)) r1 = op(r1, j) r2 = long(i) r2 = op(r2, bj) r3 = bi3 = intbv(long(i)) r3 = op(r3, bj) assert type(r1) == intbv assert type(r3) == intbv assert r1 == ref assert r2 == ref assert r3 == ref assert r1 is bi1 assert r3 is bi3
def testSetSliceLeftOpen(self): self.seqsSetup() toggle = 0 for s in self.seqs: n = long(s, 2) for j in range(0, len(s) + 5): for v in self.seqv: bv = intbv(n) bvi = intbv(~n) val = long(v, 2) toggle ^= 1 if toggle: val = intbv(val) bv[:j] = val bvi[:j] = -1 - val ref = long(setSliceLeftOpen(s, j, v), 2) assert bv == ref refi = ~long(setSliceLeftOpen(s, j, v), 2) assert bvi == refi
def testGetSlice(self): self.seqsSetup() for s in self.seqs: n = long(s, 2) bv = intbv(n) bvi = intbv(~n) for i in range(1, len(s) + 20): for j in range(0, len(s) + 20): try: res = bv[i:j] resi = bvi[i:j] except ValueError: assert i <= j continue ref = long(getSlice(s, i, j), 2) assert res == ref assert type(res) == intbv mask = (2 ** (i - j)) - 1 assert resi == ref ^ mask assert type(resi) == intbv