def shift_left(value, size, signed=True): if isinstance(value, vtypes.Int): value = value.value if isinstance(value, int) and isinstance(size, int): return value << size if isinstance(value, bool) and isinstance(size, int): return value << size return vtypes.Sll(value, size)
def __init__(self, left, right): lpoint = left.point if isinstance(left, _FixedBase) else 0 rpoint = right.point if isinstance(right, _FixedBase) else 0 lsigned = vtypes.get_signed(left) rsigned = vtypes.get_signed(right) point = _max_mux(lpoint, rpoint) signed = lsigned and rsigned if not self.overwrite_signed else False lwidth = vtypes.get_width(left) rwidth = vtypes.get_width(right) if lpoint <= rpoint: ldata, rdata = adjust(left, right, lpoint, rpoint, signed) shift_size = point else: ldata = left rdata = right shift_size = point - (lpoint - rpoint) try: lmsb = ldata[lwidth - 1] except: lmsb = (ldata >> (lwidth - 1) & vtypes.Int(1, 1, base=2)) try: rmsb = rdata[rwidth - 1] except: rmsb = (rdata >> (rwidth - 1) & vtypes.Int(1, 1, base=2)) abs_ldata = (ldata if not lsigned else vtypes.Mux( vtypes.Ulnot(lmsb), ldata, vtypes.Unot(ldata) + 1)) abs_rdata = (rdata if not rsigned else vtypes.Mux( vtypes.Ulnot(rmsb), rdata, vtypes.Unot(rdata) + 1)) abs_data = vtypes.Divide(abs_ldata, abs_rdata) data = (abs_data if not signed else vtypes.Mux( vtypes.Eq(lmsb, rmsb), abs_data, vtypes.Unot(abs_data) + 1)) if shift_size > 0: data = vtypes.Sll(data, shift_size) _FixedSkipUnaryOperator.__init__(self, data, point, signed)
def visit_Sll(self, node): left = self.visit(node.left) right = self.visit(node.right) return vtypes.Sll(left, right)