def to_ctype(self, t): """ Convert Parakeet type to string representing its C type. The base class implementation only handles scalars, support for Tuples, Slices, and Arrays is in the overload FlatFnCompiler.to_ctype """ return type_mappings.to_ctype(t)
def get_boxed_array_ptr(self, v, parakeet_ptr_t): self.check_array(v) c_struct_type = self.to_ctype(parakeet_ptr_t) c_ptr_type = type_mappings.to_ctype(parakeet_ptr_t) data_field = "(%s) (((PyArrayObject*) %s)->data)" % (c_ptr_type, v) # get the data field but also fill the base object return self.fresh_var(c_struct_type, "data", "{%s, %s}" % (data_field, v))
def attribute(self, v, attr, t, boxed=False): if attr == "data": if boxed: self.check_array(v) struct_type = self.to_ctype(t) ptr_type = type_mappings.to_ctype(t) data_field = "(%s) PyArray_DATA(((PyArrayObject*) %s))" % ( ptr_type, v) # get the data field but also fill the base object return self.fresh_var(struct_type, "data", "{%s, %s}" % (data_field, v)) else: return "%s.data" % v elif attr == "shape": shape_name = self.fresh_name("shape") elt_types = t.elt_types n = len(elt_types) elt_t = elt_types[0] if boxed: self.check_array(v) assert all(t == elt_t for t in elt_types) shape_array = "PyArray_DIMS( (PyArrayObject*) %s)" % v self.append("npy_intp* %s = %s;" % (shape_name, shape_array)) else: self.append("npy_intp* %s = %s.shape;" % (shape_name, v)) return self.array_to_tuple(shape_name, n, elt_t) elif attr == "strides": elt_types = t.elt_types n = len(elt_types) elt_t = elt_types[0] if boxed: assert False, "Can't directly use NumPy strides without dividing by itemsize" else: strides_name = self.fresh_var("npy_intp*", "strides", "%s.strides" % v) return self.array_to_tuple(strides_name, n, elt_t) elif attr == 'offset': if boxed: return "0" else: return "%s.offset" % v elif attr in ('size', 'nelts'): if boxed: return "PyArray_Size(%s)" % v else: return "%s.size" % v elif attr in ('start', 'stop', 'step') or attr.startswith("elt"): if boxed: self.check_slice(v) obj = "((PySliceObject*)%s)->%s" % (v, attr) return self.unbox_scalar(obj, t, attr) else: return "%s.%s" % (v, attr) else: assert False, "Unsupported attribute %s" % attr
def visit_Alloc(self, expr): elt_t = expr.elt_type nelts = self.fresh_var("npy_intp", "nelts", self.visit_expr(expr.count)) bytes_per_elt = elt_t.nbytes nbytes = self.mul(nelts, bytes_per_elt)#"%s * %d" % (nelts, bytes_per_elt) raw_ptr = "(%s) malloc(%s)" % (type_mappings.to_ctype(expr.type), nbytes) struct_type = self.to_ctype(expr.type) return self.fresh_var(struct_type, "new_ptr", "{%s, NULL}" % raw_ptr)
def get_boxed_array_ptr(self, v, parakeet_ptr_t): self.check_array(v) c_struct_type = self.to_ctype(parakeet_ptr_t) c_ptr_type = type_mappings.to_ctype(parakeet_ptr_t) data_field = "(%s) PyArray_DATA(((PyArrayObject*) %s))" % (c_ptr_type, v) # get the data field but also fill the base object return self.fresh_var(c_struct_type, "data", "{%s, %s}" % (data_field, v))
def attribute(self, v, attr, t, boxed = False): if attr == "data": if boxed: self.check_array(v) struct_type = self.to_ctype(t) ptr_type = type_mappings.to_ctype(t) data_field = "(%s) (((PyArrayObject*) %s)->data)" % (ptr_type, v) # get the data field but also fill the base object return self.fresh_var(struct_type, "data", "{%s, %s}" % (data_field, v)) else: return "%s.data" % v elif attr == "shape": shape_name = self.fresh_name("shape") elt_types = t.elt_types n = len(elt_types) elt_t = elt_types[0] if boxed: self.check_array(v) assert all(t == elt_t for t in elt_types) shape_array = "PyArray_DIMS( (PyArrayObject*) %s)" % v self.append("npy_intp* %s = %s;" % (shape_name, shape_array)) else: self.append("npy_intp* %s = %s.shape;" % (shape_name, v)) return self.array_to_tuple(shape_name, n, elt_t) elif attr == "strides": elt_types = t.elt_types n = len(elt_types) elt_t = elt_types[0] if boxed: assert False, "Can't directly use NumPy strides without dividing by itemsize" else: strides_name = self.fresh_var("npy_intp*", "strides", "%s.strides" % v) return self.array_to_tuple(strides_name, n, elt_t) elif attr == 'offset': if boxed: return "0" else: return "%s.offset" % v elif attr in ('size', 'nelts'): if boxed: return "PyArray_Size(%s)" % v else: return "%s.size" % v elif attr in ('start', 'stop', 'step'): if boxed: self.check_slice(v) obj = "((PySliceObject*)%s)->%s" % (v, attr) return self.unbox_scalar(obj, t, attr) else: return "%s.%s" % (v, attr) else: assert False, "Unsupported attribute %s" % attr
def to_ctype(self, parakeet_type): if isinstance(parakeet_type, TupleT): return self.struct_type_from_fields(parakeet_type.elt_types) elif isinstance(parakeet_type, ClosureT): return self.struct_type_from_fields(parakeet_type.arg_types) elif isinstance(parakeet_type, PtrT): return self.ptr_struct_type(parakeet_type.elt_type) elif isinstance(parakeet_type, ArrayT): elt_t = parakeet_type.elt_type rank = parakeet_type.rank return self.array_struct_type(elt_t, rank) elif isinstance(parakeet_type, SliceT): return self.slice_struct_type() elif isinstance(parakeet_type, (NoneT, ScalarT)): return type_mappings.to_ctype(parakeet_type) else: assert False, "Don't know how to make C type for %s" % parakeet_type
def to_ctype(self, parakeet_type): if isinstance(parakeet_type, (NoneT, ScalarT)): return type_mappings.to_ctype(parakeet_type) elif isinstance(parakeet_type, TupleT): return self.struct_type_from_fields(parakeet_type.elt_types) elif isinstance(parakeet_type, PtrT): return self.ptr_struct_type(parakeet_type.elt_type) elif isinstance(parakeet_type, ArrayT): elt_t = parakeet_type.elt_type rank = parakeet_type.rank return self.array_struct_type(elt_t, rank) elif isinstance(parakeet_type, SliceT): return self.slice_struct_type() elif isinstance(parakeet_type, ClosureT): return self.struct_type_from_fields(parakeet_type.arg_types) elif isinstance(parakeet_type, TypeValueT): return "int" else: assert False, "Don't know how to make C type for %s" % parakeet_type