def test_mismatch_type_mod(self) -> None: with self.assertRaises(pt.TypeCheckError): pt.Program("module").add_func( "foo", (), pt.Int32_t, pt.Block([pt.Return(pt.Mod(pt.Int8(2), pt.Int32(2)))]), ) with self.assertRaises(pt.TypeCheckError): pt.Program("module").add_func( "foo", (), pt.Int32_t, pt.Block([pt.Return(pt.Mod(pt.Int32(2), pt.Int8(2)))]), ) with self.assertRaises(pt.TypeCheckError): pt.Program("module").add_func( "foo", (), pt.Int64_t, pt.Block([pt.Return(pt.Mod(pt.Int16(2), pt.Int64(2)))]), ) with self.assertRaises(pt.TypeCheckError): pt.Program("module").add_func( "foo", (), pt.Int64_t, pt.Block([pt.Return(pt.Mod(pt.Int64(2), pt.Int16(2)))]), )
def test_return_call_nothing_for_int32_t(self) -> None: with self.assertRaises(pt.TypeCheckError): pt.Program("module").add_func( "nothing", (), (), pt.Block([pt.Return(())])).add_func( "call_nothing", (), pt.Int32_t, pt.Block([pt.Return(pt.Call("nothing", []))]), )
def test_assign_undeclared_variable(self) -> None: with self.assertRaises(pt.TypeCheckError): pt.Program("module").add_func( "foo", (), pt.Int32_t, pt.Block([ pt.Assign(pt.Var(x), pt.Int32(500)), pt.Return(pt.Int32(2)), ]), )
def test_declare_wrong_type(self) -> None: with self.assertRaises(pt.TypeCheckError): pt.Program("module").add_func( "foo", (), pt.Int32_t, pt.Block([ pt.DefineVar(z, pt.Int32(2)), pt.Return(pt.Int32(2)), ]), ) with self.assertRaises(pt.TypeCheckError): pt.Program("module").add_func( "foo", (), pt.Int32_t, pt.Block([ pt.DefineVar(x, pt.Int8(2)), pt.Return(pt.Int32(2)), ]), )
def test_redeclared_variable(self) -> None: with self.assertRaises(pt.TypeCheckError): pt.Program("module").add_func( "foo", (), pt.Int32_t, pt.Block([ pt.DefineVar(x, pt.Int32(2)), pt.DefineVar(x, pt.Int32(3)), pt.Return(pt.Int32(2)), ]), )
def test_mismatch_type_deref(self) -> None: with self.assertRaises(pt.TypeCheckError): pt.Program("module").add_func( "foo", (), pt.Int32_t, pt.Block([pt.Return(pt.Deref(pt.Int64(123)))]), ) with self.assertRaises(pt.TypeCheckError): pt.Program("module").add_func( "foo", (ptr, ), (), pt.Block([ pt.DefineVar(v32, pt.Deref(pt.Var(ptr))), ]))
import petra as pt import unittest from ctypes import CFUNCTYPE, c_int32, c_bool program = pt.Program("module") program.add_func( "if_else_true", (), pt.Int32_t, pt.Block([ pt.If( pt.Lt(pt.Int32(0), pt.Int32(1)), pt.Block([ pt.Return(pt.Int32(1)), ]), pt.Block([pt.Return(pt.Int32(2))]), ), pt.Return(pt.Int32(0)), ]), ) program.add_func( "if_else_false", (), pt.Int32_t, pt.Block([ pt.If( pt.Lt(pt.Int32(1), pt.Int32(0)), pt.Block([
pt.DefineVar(f, pt.Add(pt.Int8(0), pt.Int8(3))), pt.DefineVar(g, pt.Add(pt.Int8(7), pt.Int8(-8))), pt.DefineVar(h, pt.Add(pt.Int8(7), pt.Int8(0))), pt.DefineVar(i, pt.Add(pt.Int8(7), pt.Int8(8))), pt.Return( pt.Add( pt.Var(a), pt.Add( pt.Var(b), pt.Add( pt.Var(c), pt.Add( pt.Var(d), pt.Add( pt.Var(e), pt.Add( pt.Var(f), pt.Add( pt.Var(g), pt.Add(pt.Var(h), pt.Var(i)), ), ), ), ), ), ), )), ]), ) # Int16_t functions.
import petra as pt program = pt.Program("module") n = pt.Symbol(pt.Int32_t, "n") program.add_func( "collatz", (n, ), pt.Int32_t, pt.Block([ pt.If( pt.Eq(pt.Var(n), pt.Int32(1)), pt.Block([pt.Return(pt.Int32(0))]), pt.Block([]), ), pt.If( pt.Eq(pt.Mod(pt.Var(n), pt.Int32(2)), pt.Int32(0)), pt.Block([pt.Assign(pt.Var(n), pt.Div(pt.Var(n), pt.Int32(2)))]), pt.Block([ pt.Assign( pt.Var(n), pt.Add(pt.Mul(pt.Int32(3), pt.Var(n)), pt.Int32(1)), ), ]), ), pt.Return(pt.Add(pt.Int32(1), pt.Call("collatz", [pt.Var(n)]))), ]), ) program.save_object("collatz.py.o")
from typing import cast, Callable import petra as pt import unittest from ctypes import CFUNCTYPE, c_int8, c_int16, c_int32, c_int64 program = pt.Program("module") # Int8_t functions. program.add_func("return_m2_i8", (), pt.Int8_t, pt.Block([pt.Return(pt.Int8(-2))])) program.add_func("return_0_i8", (), pt.Int8_t, pt.Block([pt.Return(pt.Int8(0))])) program.add_func("return_2_i8", (), pt.Int8_t, pt.Block([pt.Return(pt.Int8(2))])) # Int16_t functions. program.add_func("return_m2_i16", (), pt.Int16_t, pt.Block([pt.Return(pt.Int16(-2))])) program.add_func("return_0_i16", (), pt.Int16_t, pt.Block([pt.Return(pt.Int16(0))])) program.add_func("return_2_i16", (), pt.Int16_t, pt.Block([pt.Return(pt.Int16(2))]))
[ pt.DefineVar(array_var), pt.Assign( pt.Var(array_var), pt.SetElement(pt.Var(array_var), pt.Int32(1), 0) ), pt.Assign( pt.Var(array_var), pt.SetElement(pt.Var(array_var), pt.Int32(2), 1) ), pt.Assign( pt.Var(array_var), pt.SetElement(pt.Var(array_var), pt.Int32(3), 2) ), pt.Return( pt.Add( pt.GetElement(pt.Var(array_var), 0), pt.Add( pt.GetElement(pt.Var(array_var), 1), pt.GetElement(pt.Var(array_var), 2), ), ) ), ] ), ) class ArraysTestCase(unittest.TestCase): def setUp(self) -> None: self.engine = program.compile() array_set_get_values = self.engine.get_function_address("array_set_get_values") self.array_set_get_values = cast(
import petra as pt import unittest from ctypes import CFUNCTYPE, c_bool, c_int8 program = pt.Program("module") x, y = pt.Symbol(pt.Int8_t, "x"), pt.Symbol(pt.Int8_t, "y") z, w = pt.Symbol(pt.Bool_t, "z"), pt.Symbol(pt.Bool_t, "w") program.add_func( "lt", (x, y), pt.Bool_t, pt.Block([pt.Return(pt.Lt(pt.Var(x), pt.Var(y)))]), ) program.add_func( "lte", (x, y), pt.Bool_t, pt.Block([pt.Return(pt.Lte(pt.Var(x), pt.Var(y)))]), ) program.add_func( "gt", (x, y), pt.Bool_t, pt.Block([pt.Return(pt.Gt(pt.Var(x), pt.Var(y)))]), )
import petra as pt program = pt.Program("module") program.add_func_decl("sqrtf", (pt.Float32_t, ), pt.Float32_t) x = pt.Symbol(pt.Float32_t, "x") program.add_func( "call_sqrtf", (x, ), pt.Float32_t, pt.Block([pt.Return(pt.Call("sqrtf", [pt.Var(x)]))]), ) program.save_object("sqrt.py.o")
import unittest from ctypes import CFUNCTYPE, c_int32 program = pt.Program("module") x = pt.Symbol(pt.Int32_t, "x") y = pt.Symbol(pt.Int32_t, "y") z = pt.Symbol(pt.Int8_t, "z") program.add_func( "return_temp", (), pt.Int32_t, pt.Block([pt.DefineVar(x, pt.Int32(2)), pt.Return(pt.Var(x))]), ) program.add_func( "return_shuffle_temp", (), pt.Int32_t, pt.Block([ pt.DefineVar(x, pt.Int32(2)), pt.DefineVar(y, pt.Var(x)), pt.Return(pt.Var(y)), ]), ) program.add_func( "temp_unused",
domain_point_x_plus_1, pt.Call("legion_domain_point_from_point_1d", [pt.Var(point1d_x_plus_1)]), ), pt.DefineVar( result, pt.Call( "legion_logical_partition_get_logical_subregion_by_color_domain_point", [ pt.Var(runtime), pt.Deref(pt.Var(parent_ptr)), pt.Var(domain_point_x_plus_1) ], ), ), pt.Return(pt.Var(result)), ]), attributes=("byval", "byval", "byval", "byval"), ) class ProjectionFunctor(unittest.TestCase): def setUp(self) -> None: program.load_library("libtest_proj_functor.so") self.engine = program.compile() proj_functor = self.engine.get_function_address("proj_functor") self.proj_functor = cast(Callable[[], int], CFUNCTYPE(c_int32)(proj_functor)) # self.proj_functor = cast(
# void* memset ( void* ptr, int value, size_t num ); program.add_func_decl("memset", (Pointer_Int64_t, pt.Int32_t, pt.Int64_t), Pointer_Int64_t) ptr = pt.Symbol(Pointer_Int64_t, "ptr") val = pt.Symbol(pt.Int64_t, "val") v32 = pt.Symbol(pt.Int32_t, "val") program.add_func( "malloc_free", (), pt.Int32_t, pt.Block([ pt.DefineVar(ptr, pt.Call("malloc", [pt.Int64(8)])), pt.Call("free", [pt.Var(ptr)]), pt.Return(pt.Int32(1)), ]), ) program.add_func( "malloc_memset", (), pt.Int64_t, pt.Block([ pt.DefineVar(ptr, pt.Call("malloc", [pt.Int64(8)])), pt.Assign( pt.Var(ptr), pt.Call("memset", [pt.Var(ptr), pt.Int32(0x3A), pt.Int64(8)]), ),
from typing import cast, Callable import petra as pt import unittest from ctypes import CFUNCTYPE, c_int32 program = pt.Program("module") x, y = pt.Symbol(pt.Int32_t, "x"), pt.Symbol(pt.Int32_t, "y") program.add_func("return_2", (), pt.Int32_t, pt.Block([pt.Return(pt.Int32(2))])) program.add_func("call_return_2", (), pt.Int32_t, pt.Block([pt.Return(pt.Call("return_2", []))])) program.add_func( "call_return_2_discard", (), pt.Int32_t, pt.Block([pt.Call("return_2", []), pt.Return(pt.Int32(3))]), ) program.add_func( "iden", (x, ), pt.Int32_t, pt.Block([pt.Return(pt.Var(x))]), )