コード例 #1
0
ファイル: base_compiler.py プロジェクト: iskandr/parakeet
 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)
コード例 #2
0
ファイル: base_compiler.py プロジェクト: Abramovuch/parakeet
 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)
コード例 #3
0
ファイル: pymodule_compiler.py プロジェクト: tlevine/parakeet
 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))
コード例 #4
0
    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
コード例 #5
0
ファイル: fn_compiler.py プロジェクト: rjpower/parakeet
 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)
コード例 #6
0
 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)
コード例 #7
0
 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))
コード例 #8
0
ファイル: pymodule_compiler.py プロジェクト: tlevine/parakeet
  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 
コード例 #9
0
ファイル: fn_compiler.py プロジェクト: waytai/parakeet
 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
コード例 #10
0
 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