def make_bv_sizes_equal(bv1: BV, bv2: BV) -> Tuple[BV, BV]: """ Makes two BVs equal in length through sign extension. """ if bv1.size() < bv2.size(): return (bv1.sign_extend(bv2.size() - bv1.size()), bv2) elif bv1.size() > bv2.size(): return (bv1, bv2.sign_extend(bv1.size() - bv2.size())) else: return (bv1, bv2)
def evaluate_binary(self, size_out: int, size_in: int, in1: BV, in2: BV) -> BV: if in2.size() < in1.size(): in2 = in2.sign_extend(in1.size() - in2.size()) return (in1 >> (in2 * 8)) & (2**(size_out * 8) - 1)
def evaluate_unary(self, size_out: int, size_in: int, in1: BV) -> BV: return in1.sign_extend((size_out - size_in) * 8)
def evaluate_binary(self, size_out: int, size_in: int, in1: BV, in2: BV) -> BV: if in2.size() < in1.size(): in2 = in2.sign_extend(in1.size() - in2.size()) return in1.LShR(in2)