aboutsummaryrefslogtreecommitdiff
path: root/driver_library/python/src/ethosu_driver/swig/typemaps/buffer.i
blob: bb4627cbf7ab7a2f478b7d2505d2286ae4325ff0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//
// SPDX-FileCopyrightText: Copyright 2021-2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
// SPDX-License-Identifier: Apache-2.0
//

%define BUFFER_FLAG_RO 0 %enddef
%define BUFFER_FLAG_RW PyBUF_WRITABLE %enddef

%define %buffer_in(TYPEMAP, SIZE, FLAG)
    %typemap(in) (TYPEMAP, SIZE) {
      Py_buffer view;

      int res = PyObject_GetBuffer($input, &view, FLAG);
      if (res < 0) {
        PyErr_Clear();
        %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
      }

      void *buf = view.buf;
      size_t size = view.len;
      PyBuffer_Release(&view);

      $1 = ($1_ltype) buf;
      $2 = ($2_ltype) size;
    }

    %typemap(typecheck) (TYPEMAP, SIZE) {
        $1 = PyObject_CheckBuffer($input) || PyTuple_Check($input) ? 1 : 0;
    }
%enddef

%define %clear_buffer_in(TYPEMAP, SIZE)
    %typemap(in) (TYPEMAP, SIZE);
    %typemap(typecheck) (TYPEMAP, SIZE);
%enddef

%define %driver_buffer_out
    %typemap(out) (char*) {
        auto size = arg1->size();
        int readOnly = 0;
        $result = PyMemoryView_FromMemory($1, size, readOnly);
    }
%enddef

%define %clear_driver_buffer_out
    %typemap(out) (char*);
%enddef