Source code for qlazy.lib.cmem_c

# -*- coding: utf-8 -*-
""" wrapper functions for CMem """
import ctypes
from ctypes.util import find_library
import pathlib
import numpy as np

from qlazy.util import get_lib_ext
from qlazy.CMem import CMem

lib = ctypes.CDLL(str(pathlib.Path(__file__).with_name('libqlz.'+get_lib_ext())))
libc = ctypes.CDLL(find_library("c"), mode=ctypes.RTLD_GLOBAL)

[docs]def cmem_init(cmem_num): """ initialize classical memory """ if cmem_num < 1: raise ValueError("cmem size must be positive integer.") cmem = None c_cmem = ctypes.c_void_p(cmem) lib.cmem_init.restype = ctypes.c_bool lib.cmem_init.argtypes = [ctypes.c_int, ctypes.POINTER(ctypes.c_void_p)] ret = lib.cmem_init(ctypes.c_int(cmem_num), c_cmem) if ret is False: raise ValueError("can't initialize cmem.") return c_cmem
[docs]def cmem_copy(cm): """ copy classical memory """ cmem = None c_cmem = ctypes.c_void_p(cmem) lib.cmem_copy.restype = ctypes.c_bool lib.cmem_copy.argtypes = [ctypes.POINTER(CMem), ctypes.POINTER(ctypes.c_void_p)] ret = lib.cmem_copy(ctypes.byref(cm), c_cmem) if ret is False: raise ValueError("can't copy cmem.") return c_cmem
[docs]def cmem_get_bits(cmem): """ get bits of the classical memory """ if cmem is None: raise Valueerror("cmem must be set.") cmem_num = cmem.cmem_num bits = None c_bits = ctypes.c_void_p(bits) lib.cmem_get_bits.restype = ctypes.c_bool lib.cmem_get_bits.argtypes = [ctypes.POINTER(CMem), ctypes.POINTER(ctypes.c_void_p)] ret = lib.cmem_get_bits(ctypes.byref(cmem), c_bits) if ret is False: raise ValueError("can't get element of the classical memory.") o = ctypes.cast(c_bits.value, ctypes.POINTER(ctypes.c_ubyte)) out = [o[i] for i in range(cmem_num)] libc.free.argtypes = [ctypes.POINTER(ctypes.c_ubyte)] libc.free(o) return np.array(out)
[docs]def cmem_set_bits(cmem, bits): """ get bits of the classical memory """ if cmem is None: raise Valueerror("cmem must be set.") cmem_num = cmem.cmem_num num = len(bits) ByteArray = ctypes.c_char * cmem_num c_bits = ByteArray(*bits) lib.cmem_set_bits.restype = ctypes.c_bool lib.cmem_set_bits.argtypes = [ctypes.POINTER(CMem), ByteArray, ctypes.c_int] ret = lib.cmem_set_bits(ctypes.byref(cmem), c_bits, ctypes.c_int(num)) if ret is False: raise ValueError("can't set element of the classical memory.")
[docs]def cmem_free(cmem): """ free classical memory """ lib.cmem_free.argtypes = [ctypes.POINTER(CMem)] lib.cmem_free(ctypes.byref(cmem))