コード例 #1
0
ファイル: fractions.py プロジェクト: cr1901/artiq
 def _o_addsub(self, other, builder, sub, invert=False):
     if isinstance(other, VFloat):
         a = self.o_getattr("numerator", builder)
         b = self.o_getattr("denominator", builder)
         if sub:
             if invert:
                 return operators.truediv(
                     operators.sub(operators.mul(other,
                                                 b,
                                                 builder),
                                   a,
                                   builder),
                     b,
                     builder)
             else:
                 return operators.truediv(
                     operators.sub(a,
                                   operators.mul(other,
                                                 b,
                                                 builder),
                                   builder),
                     b,
                     builder)
         else:
             return operators.truediv(
                 operators.add(operators.mul(other,
                                             b,
                                             builder),
                               a,
                               builder),
                 b,
                 builder)
     else:
         if not isinstance(other, (VFraction, VInt)):
             return NotImplemented
         r = VFraction()
         if builder is not None:
             if isinstance(other, VInt):
                 i = other.o_int64(builder).auto_load(builder)
                 x, rd = self._nd(builder)
                 y = builder.mul(rd, i)
             else:
                 a, b = self._nd(builder)
                 c, d = other._nd(builder)
                 rd = builder.mul(b, d)
                 x = builder.mul(a, d)
                 y = builder.mul(c, b)
             if sub:
                 if invert:
                     rn = builder.sub(y, x)
                 else:
                     rn = builder.sub(x, y)
             else:
                 rn = builder.add(x, y)
             rn, rd = _reduce(builder, rn, rd)  # rd is already > 0
             r.auto_store(builder, _make_ssa(builder, rn, rd))
         return r
コード例 #2
0
 def _o_addsub(self, other, builder, sub, invert=False):
     if isinstance(other, VFloat):
         a = self.o_getattr("numerator", builder)
         b = self.o_getattr("denominator", builder)
         if sub:
             if invert:
                 return operators.truediv(
                     operators.sub(operators.mul(other,
                                                 b,
                                                 builder),
                                   a,
                                   builder),
                     b,
                     builder)
             else:
                 return operators.truediv(
                     operators.sub(a,
                                   operators.mul(other,
                                                 b,
                                                 builder),
                                   builder),
                     b,
                     builder)
         else:
             return operators.truediv(
                 operators.add(operators.mul(other,
                                             b,
                                             builder),
                               a,
                               builder),
                 b,
                 builder)
     else:
         if not isinstance(other, (VFraction, VInt)):
             return NotImplemented
         r = VFraction()
         if builder is not None:
             if isinstance(other, VInt):
                 i = other.o_int64(builder).auto_load(builder)
                 x, rd = self._nd(builder)
                 y = builder.mul(rd, i)
             else:
                 a, b = self._nd(builder)
                 c, d = other._nd(builder)
                 rd = builder.mul(b, d)
                 x = builder.mul(a, d)
                 y = builder.mul(c, b)
             if sub:
                 if invert:
                     rn = builder.sub(y, x)
                 else:
                     rn = builder.sub(x, y)
             else:
                 rn = builder.add(x, y)
             rn, rd = _reduce(builder, rn, rd)  # rd is already > 0
             r.auto_store(builder, _make_ssa(builder, rn, rd))
         return r
コード例 #3
0
ファイル: iterators.py プロジェクト: yuyichao/artiq
    def __init__(self, builder, args):
        minimum, step = None, None
        if len(args) == 1:
            maximum = args[0]
        elif len(args) == 2:
            minimum, maximum = args
        else:
            minimum, maximum, step = args
        if minimum is None:
            minimum = VInt()
            if builder is not None:
                minimum.set_const_value(builder, 0)
        if step is None:
            step = VInt()
            if builder is not None:
                step.set_const_value(builder, 1)

        self._counter = minimum.new()
        self._counter.merge(maximum)
        self._counter.merge(step)
        self._minimum = self._counter.new()
        self._maximum = self._counter.new()
        self._step = self._counter.new()

        if builder is not None:
            self._minimum.alloca(builder, "irange_min")
            self._maximum.alloca(builder, "irange_max")
            self._step.alloca(builder, "irange_step")
            self._counter.alloca(builder, "irange_count")

            self._minimum.set_value(builder, minimum)
            self._maximum.set_value(builder, maximum)
            self._step.set_value(builder, step)

            counter_init = operators.sub(self._minimum, self._step, builder)
            self._counter.set_value(builder, counter_init)
コード例 #4
0
    def __init__(self, builder, args):
        minimum, step = None, None
        if len(args) == 1:
            maximum = args[0]
        elif len(args) == 2:
            minimum, maximum = args
        else:
            minimum, maximum, step = args
        if minimum is None:
            minimum = VInt()
            if builder is not None:
                minimum.set_const_value(builder, 0)
        if step is None:
            step = VInt()
            if builder is not None:
                step.set_const_value(builder, 1)

        self._counter = minimum.new()
        self._counter.merge(maximum)
        self._counter.merge(step)
        self._minimum = self._counter.new()
        self._maximum = self._counter.new()
        self._step = self._counter.new()

        if builder is not None:
            self._minimum.alloca(builder, "irange_min")
            self._maximum.alloca(builder, "irange_max")
            self._step.alloca(builder, "irange_step")
            self._counter.alloca(builder, "irange_count")

            self._minimum.set_value(builder, minimum)
            self._maximum.set_value(builder, maximum)
            self._step.set_value(builder, step)

            counter_init = operators.sub(self._minimum, self._step, builder)
            self._counter.set_value(builder, counter_init)