Skip to content

Commit 3848e4d

Browse files
committed
added frombuffer array initialisation function
1 parent a093b3a commit 3848e4d

File tree

5 files changed

+65
-0
lines changed

5 files changed

+65
-0
lines changed

code/ulab.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,10 @@ STATIC const mp_map_elem_t ulab_globals_table[] = {
162162
{ MP_ROM_QSTR(MP_QSTR_eye), (mp_obj_t)&create_eye_obj },
163163
#endif
164164
#endif /* ULAB_MAX_DIMS */
165+
// frombuffer adds 600 bytes to the firmware
166+
#if ULAB_CREATE_HAS_FROMBUFFER
167+
{ MP_ROM_QSTR(MP_QSTR_frombuffer), (mp_obj_t)&create_frombuffer_obj },
168+
#endif
165169
#if ULAB_CREATE_HAS_FULL
166170
{ MP_ROM_QSTR(MP_QSTR_full), (mp_obj_t)&create_full_obj },
167171
#endif

code/ulab.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@
148148
#define ULAB_CREATE_HAS_CONCATENATE (1)
149149
#define ULAB_CREATE_HAS_DIAG (1)
150150
#define ULAB_CREATE_HAS_EYE (1)
151+
#define ULAB_CREATE_HAS_FROMBUFFER (1)
151152
#define ULAB_CREATE_HAS_FULL (1)
152153
#define ULAB_CREATE_HAS_LINSPACE (1)
153154
#define ULAB_CREATE_HAS_LOGSPACE (1)

code/ulab_create.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,3 +630,51 @@ mp_obj_t create_zeros(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args
630630

631631
MP_DEFINE_CONST_FUN_OBJ_KW(create_zeros_obj, 0, create_zeros);
632632
#endif
633+
634+
#if ULAB_CREATE_HAS_FROMBUFFER
635+
mp_obj_t create_frombuffer(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
636+
static const mp_arg_t allowed_args[] = {
637+
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, { .u_rom_obj = mp_const_none } },
638+
{ MP_QSTR_dtype, MP_ARG_KW_ONLY | MP_ARG_OBJ, { .u_rom_obj = MP_ROM_INT(NDARRAY_FLOAT) } },
639+
{ MP_QSTR_count, MP_ARG_KW_ONLY | MP_ARG_OBJ, { .u_rom_obj = MP_ROM_INT(-1) } },
640+
{ MP_QSTR_offset, MP_ARG_KW_ONLY | MP_ARG_OBJ, { .u_rom_obj = MP_ROM_INT(0) } },
641+
};
642+
643+
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
644+
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
645+
646+
uint8_t dtype = mp_obj_get_int(args[1].u_obj);
647+
size_t offset = mp_obj_get_int(args[3].u_obj);
648+
649+
mp_buffer_info_t bufinfo;
650+
if(mp_get_buffer(args[0].u_obj, &bufinfo, MP_BUFFER_READ)) {
651+
size_t sz = 1;
652+
if(dtype != NDARRAY_BOOL) { // mp_binary_get_size doesn't work with Booleans
653+
sz = mp_binary_get_size('@', dtype, NULL);
654+
}
655+
if(bufinfo.len < offset) {
656+
mp_raise_ValueError(translate("offset must be non-negative and no greater than buffer length"));
657+
}
658+
size_t len = (bufinfo.len - offset) / sz;
659+
if((len * sz) != (bufinfo.len - offset)) {
660+
mp_raise_ValueError(translate("buffer size must be a multiple of element size"));
661+
}
662+
if(mp_obj_get_int(args[2].u_obj) > 0) {
663+
size_t count = mp_obj_get_int(args[2].u_obj);
664+
if(len < count) {
665+
mp_raise_ValueError(translate("buffer is smaller than requested size"));
666+
} else {
667+
len -= count;
668+
}
669+
}
670+
ndarray_obj_t *ndarray = ndarray_new_linear_array(len, dtype);
671+
uint8_t *array = (uint8_t *)ndarray->array;
672+
uint8_t *buffer = bufinfo.buf;
673+
memcpy(array, buffer + offset, len * sz);
674+
return MP_OBJ_FROM_PTR(ndarray);
675+
}
676+
return mp_const_none;
677+
}
678+
679+
MP_DEFINE_CONST_FUN_OBJ_KW(create_frombuffer_obj, 1, create_frombuffer);
680+
#endif

code/ulab_create.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,10 @@ mp_obj_t create_zeros(size_t , const mp_obj_t *, mp_map_t *);
6262
MP_DECLARE_CONST_FUN_OBJ_KW(create_zeros_obj);
6363
#endif
6464

65+
66+
#if ULAB_CREATE_HAS_FROMBUFFER
67+
mp_obj_t create_frombuffer(size_t , const mp_obj_t *, mp_map_t *);
68+
MP_DECLARE_CONST_FUN_OBJ_KW(create_frombuffer_obj);
69+
#endif
70+
6571
#endif

docs/ulab-change-log.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
Thu, 14 Jan 2021
22

3+
version 1.7.0
4+
5+
added frombuffer
6+
7+
Thu, 14 Jan 2021
8+
39
version 1.6.2
410

511
fix indexing issue in diff

0 commit comments

Comments
 (0)