forked from M-Labs/artiq
py2llvm/fractions: add numerator/denominator getattr support
This commit is contained in:
parent
e2d834928f
commit
71b8575d7a
|
@ -76,6 +76,20 @@ class VFraction(VGeneric):
|
||||||
raise TypeError
|
raise TypeError
|
||||||
self.set_ssa_value(builder, n.get_ssa_value(builder))
|
self.set_ssa_value(builder, n.get_ssa_value(builder))
|
||||||
|
|
||||||
|
def o_getattr(self, attr, builder):
|
||||||
|
if attr == "numerator":
|
||||||
|
idx = 0
|
||||||
|
elif attr == "denominator":
|
||||||
|
idx = 1
|
||||||
|
else:
|
||||||
|
raise AttributeError
|
||||||
|
r = VInt(64)
|
||||||
|
if builder is not None:
|
||||||
|
elt = builder.extract_element(
|
||||||
|
self.get_ssa_value(builder), lc.Constant.int(lc.Type.int(), idx))
|
||||||
|
r.set_ssa_value(builder, elt)
|
||||||
|
return r
|
||||||
|
|
||||||
def o_bool(self, builder):
|
def o_bool(self, builder):
|
||||||
r = VBool()
|
r = VBool()
|
||||||
if builder is not None:
|
if builder is not None:
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import unittest
|
import unittest
|
||||||
import ast
|
import ast
|
||||||
import inspect
|
import inspect
|
||||||
|
from fractions import Fraction
|
||||||
|
|
||||||
from llvm import ee as le
|
from llvm import ee as le
|
||||||
|
|
||||||
|
@ -79,8 +80,19 @@ def is_prime(x):
|
||||||
d += 1
|
d += 1
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def simplify_encode(n, d):
|
||||||
|
f = Fraction(n, d)
|
||||||
|
return f.numerator*1000 + f.denominator
|
||||||
|
|
||||||
class CodeGenCase(unittest.TestCase):
|
class CodeGenCase(unittest.TestCase):
|
||||||
def test_is_prime(self):
|
def test_is_prime(self):
|
||||||
is_prime_c = CompiledFunction(is_prime, {"x": base_types.VInt(32)})
|
is_prime_c = CompiledFunction(is_prime, {"x": base_types.VInt()})
|
||||||
for i in range(200):
|
for i in range(200):
|
||||||
self.assertEqual(is_prime_c(i), is_prime(i))
|
self.assertEqual(is_prime_c(i), is_prime(i))
|
||||||
|
|
||||||
|
def test_frac_simplify(self):
|
||||||
|
simplify_encode_c = CompiledFunction(
|
||||||
|
simplify_encode, {"n": base_types.VInt(), "d": base_types.VInt()})
|
||||||
|
for n in range(5, 20):
|
||||||
|
for d in range(5, 20):
|
||||||
|
self.assertEqual(simplify_encode_c(n, d), simplify_encode(n, d))
|
||||||
|
|
Loading…
Reference in New Issue