use crate::api::*;
pub struct rknn {
__library: ::libloading::Library,
pub rknn_init: Result<
unsafe extern "C" fn(
context: *mut rknn_context,
model: *mut ::std::os::raw::c_void,
size: u32,
flag: u32,
extend: *mut rknn_init_extend,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_dup_context: Result<
unsafe extern "C" fn(
context_in: *mut rknn_context,
context_out: *mut rknn_context,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_destroy: Result<
unsafe extern "C" fn(context: rknn_context) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_query: Result<
unsafe extern "C" fn(
context: rknn_context,
cmd: rknn_query_cmd,
info: *mut ::std::os::raw::c_void,
size: u32,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_inputs_set: Result<
unsafe extern "C" fn(
context: rknn_context,
n_inputs: u32,
inputs: *mut rknn_input,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_set_batch_core_num: Result<
unsafe extern "C" fn(
context: rknn_context,
core_num: ::std::os::raw::c_int,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_set_core_mask: Result<
unsafe extern "C" fn(
context: rknn_context,
core_mask: rknn_core_mask,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_run: Result<
unsafe extern "C" fn(
context: rknn_context,
extend: *mut rknn_run_extend,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_wait: Result<
unsafe extern "C" fn(
context: rknn_context,
extend: *mut rknn_run_extend,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_outputs_get: Result<
unsafe extern "C" fn(
context: rknn_context,
n_outputs: u32,
outputs: *mut rknn_output,
extend: *mut rknn_output_extend,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_outputs_release: Result<
unsafe extern "C" fn(
context: rknn_context,
n_ouputs: u32,
outputs: *mut rknn_output,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_create_mem_from_phys: Result<
unsafe extern "C" fn(
ctx: rknn_context,
phys_addr: u64,
virt_addr: *mut ::std::os::raw::c_void,
size: u32,
) -> *mut rknn_tensor_mem,
::libloading::Error,
>,
pub rknn_create_mem_from_fd: Result<
unsafe extern "C" fn(
ctx: rknn_context,
fd: i32,
virt_addr: *mut ::std::os::raw::c_void,
size: u32,
offset: i32,
) -> *mut rknn_tensor_mem,
::libloading::Error,
>,
pub rknn_create_mem_from_mb_blk: Result<
unsafe extern "C" fn(
ctx: rknn_context,
mb_blk: *mut ::std::os::raw::c_void,
offset: i32,
) -> *mut rknn_tensor_mem,
::libloading::Error,
>,
pub rknn_create_mem: Result<
unsafe extern "C" fn(ctx: rknn_context, size: u32) -> *mut rknn_tensor_mem,
::libloading::Error,
>,
pub rknn_create_mem2: Result<
unsafe extern "C" fn(
ctx: rknn_context,
size: u64,
alloc_flags: u64,
) -> *mut rknn_tensor_mem,
::libloading::Error,
>,
pub rknn_destroy_mem: Result<
unsafe extern "C" fn(ctx: rknn_context, mem: *mut rknn_tensor_mem) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_set_weight_mem: Result<
unsafe extern "C" fn(ctx: rknn_context, mem: *mut rknn_tensor_mem) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_set_internal_mem: Result<
unsafe extern "C" fn(ctx: rknn_context, mem: *mut rknn_tensor_mem) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_set_io_mem: Result<
unsafe extern "C" fn(
ctx: rknn_context,
mem: *mut rknn_tensor_mem,
attr: *mut rknn_tensor_attr,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_set_input_shape: Result<
unsafe extern "C" fn(
ctx: rknn_context,
attr: *mut rknn_tensor_attr,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_set_input_shapes: Result<
unsafe extern "C" fn(
ctx: rknn_context,
n_inputs: u32,
attr: *mut rknn_tensor_attr,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_mem_sync: Result<
unsafe extern "C" fn(
context: rknn_context,
mem: *mut rknn_tensor_mem,
mode: rknn_mem_sync_mode,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_matmul_create: Result<
unsafe extern "C" fn(
ctx: *mut rknn_matmul_ctx,
info: *mut rknn_matmul_info,
io_attr: *mut rknn_matmul_io_attr,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_matmul_create_dynamic_shape: Result<
unsafe extern "C" fn(
ctx: *mut rknn_matmul_ctx,
info: *mut rknn_matmul_info,
shape_num: ::std::os::raw::c_int,
dynamic_shapes: *mut rknn_matmul_shape,
io_attrs: *mut rknn_matmul_io_attr,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_matmul_set_io_mem: Result<
unsafe extern "C" fn(
ctx: rknn_matmul_ctx,
mem: *mut rknn_tensor_mem,
attr: *mut rknn_matmul_tensor_attr,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_matmul_set_core_mask: Result<
unsafe extern "C" fn(
context: rknn_matmul_ctx,
core_mask: rknn_core_mask,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_matmul_set_quant_params: Result<
unsafe extern "C" fn(
context: rknn_matmul_ctx,
params: *mut rknn_quant_params,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_matmul_get_quant_params: Result<
unsafe extern "C" fn(
ctx: rknn_matmul_ctx,
params: *mut rknn_quant_params,
scale: *mut f32,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_matmul_set_dynamic_shape: Result<
unsafe extern "C" fn(
ctx: rknn_matmul_ctx,
shape: *mut rknn_matmul_shape,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_matmul_run: Result<
unsafe extern "C" fn(ctx: rknn_matmul_ctx) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_matmul_destroy: Result<
unsafe extern "C" fn(ctx: rknn_matmul_ctx) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_B_normal_layout_to_native_layout: Result<
unsafe extern "C" fn(
B_input: *mut ::std::os::raw::c_void,
B_output: *mut ::std::os::raw::c_void,
K: ::std::os::raw::c_int,
N: ::std::os::raw::c_int,
info: *mut rknn_matmul_info,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_register_custom_ops: Result<
unsafe extern "C" fn(
ctx: rknn_context,
op: *mut rknn_custom_op,
custom_op_num: u32,
) -> ::std::os::raw::c_int,
::libloading::Error,
>,
pub rknn_custom_op_get_op_attr: Result<
unsafe extern "C" fn(
op_ctx: *mut rknn_custom_op_context,
attr_name: *const ::std::os::raw::c_char,
op_attr: *mut rknn_custom_op_attr,
),
::libloading::Error,
>,
}
impl rknn {
pub unsafe fn new<P>(path: P) -> Result<Self, ::libloading::Error>
where
P: AsRef<::std::ffi::OsStr>,
{
let library = ::libloading::Library::new(path)?;
Self::from_library(library)
}
pub unsafe fn from_library<L>(library: L) -> Result<Self, ::libloading::Error>
where
L: Into<::libloading::Library>,
{
let __library = library.into();
let rknn_init = __library.get(b"rknn_init\0").map(|sym| *sym);
let rknn_dup_context = __library.get(b"rknn_dup_context\0").map(|sym| *sym);
let rknn_destroy = __library.get(b"rknn_destroy\0").map(|sym| *sym);
let rknn_query = __library.get(b"rknn_query\0").map(|sym| *sym);
let rknn_inputs_set = __library.get(b"rknn_inputs_set\0").map(|sym| *sym);
let rknn_set_batch_core_num = __library.get(b"rknn_set_batch_core_num\0").map(|sym| *sym);
let rknn_set_core_mask = __library.get(b"rknn_set_core_mask\0").map(|sym| *sym);
let rknn_run = __library.get(b"rknn_run\0").map(|sym| *sym);
let rknn_wait = __library.get(b"rknn_wait\0").map(|sym| *sym);
let rknn_outputs_get = __library.get(b"rknn_outputs_get\0").map(|sym| *sym);
let rknn_outputs_release = __library.get(b"rknn_outputs_release\0").map(|sym| *sym);
let rknn_create_mem_from_phys = __library
.get(b"rknn_create_mem_from_phys\0")
.map(|sym| *sym);
let rknn_create_mem_from_fd = __library.get(b"rknn_create_mem_from_fd\0").map(|sym| *sym);
let rknn_create_mem_from_mb_blk = __library
.get(b"rknn_create_mem_from_mb_blk\0")
.map(|sym| *sym);
let rknn_create_mem = __library.get(b"rknn_create_mem\0").map(|sym| *sym);
let rknn_create_mem2 = __library.get(b"rknn_create_mem2\0").map(|sym| *sym);
let rknn_destroy_mem = __library.get(b"rknn_destroy_mem\0").map(|sym| *sym);
let rknn_set_weight_mem = __library.get(b"rknn_set_weight_mem\0").map(|sym| *sym);
let rknn_set_internal_mem = __library.get(b"rknn_set_internal_mem\0").map(|sym| *sym);
let rknn_set_io_mem = __library.get(b"rknn_set_io_mem\0").map(|sym| *sym);
let rknn_set_input_shape = __library.get(b"rknn_set_input_shape\0").map(|sym| *sym);
let rknn_set_input_shapes = __library.get(b"rknn_set_input_shapes\0").map(|sym| *sym);
let rknn_mem_sync = __library.get(b"rknn_mem_sync\0").map(|sym| *sym);
let rknn_matmul_create = __library.get(b"rknn_matmul_create\0").map(|sym| *sym);
let rknn_matmul_create_dynamic_shape = __library
.get(b"rknn_matmul_create_dynamic_shape\0")
.map(|sym| *sym);
let rknn_matmul_set_io_mem = __library.get(b"rknn_matmul_set_io_mem\0").map(|sym| *sym);
let rknn_matmul_set_core_mask = __library
.get(b"rknn_matmul_set_core_mask\0")
.map(|sym| *sym);
let rknn_matmul_set_quant_params = __library
.get(b"rknn_matmul_set_quant_params\0")
.map(|sym| *sym);
let rknn_matmul_get_quant_params = __library
.get(b"rknn_matmul_get_quant_params\0")
.map(|sym| *sym);
let rknn_matmul_set_dynamic_shape = __library
.get(b"rknn_matmul_set_dynamic_shape\0")
.map(|sym| *sym);
let rknn_matmul_run = __library.get(b"rknn_matmul_run\0").map(|sym| *sym);
let rknn_matmul_destroy = __library.get(b"rknn_matmul_destroy\0").map(|sym| *sym);
let rknn_B_normal_layout_to_native_layout = __library
.get(b"rknn_B_normal_layout_to_native_layout\0")
.map(|sym| *sym);
let rknn_register_custom_ops = __library.get(b"rknn_register_custom_ops\0").map(|sym| *sym);
let rknn_custom_op_get_op_attr = __library
.get(b"rknn_custom_op_get_op_attr\0")
.map(|sym| *sym);
Ok(rknn {
__library,
rknn_init,
rknn_dup_context,
rknn_destroy,
rknn_query,
rknn_inputs_set,
rknn_set_batch_core_num,
rknn_set_core_mask,
rknn_run,
rknn_wait,
rknn_outputs_get,
rknn_outputs_release,
rknn_create_mem_from_phys,
rknn_create_mem_from_fd,
rknn_create_mem_from_mb_blk,
rknn_create_mem,
rknn_create_mem2,
rknn_destroy_mem,
rknn_set_weight_mem,
rknn_set_internal_mem,
rknn_set_io_mem,
rknn_set_input_shape,
rknn_set_input_shapes,
rknn_mem_sync,
rknn_matmul_create,
rknn_matmul_create_dynamic_shape,
rknn_matmul_set_io_mem,
rknn_matmul_set_core_mask,
rknn_matmul_set_quant_params,
rknn_matmul_get_quant_params,
rknn_matmul_set_dynamic_shape,
rknn_matmul_run,
rknn_matmul_destroy,
rknn_B_normal_layout_to_native_layout,
rknn_register_custom_ops,
rknn_custom_op_get_op_attr,
})
}
pub unsafe fn rknn_init(
&self,
context: *mut rknn_context,
model: *mut ::std::os::raw::c_void,
size: u32,
flag: u32,
extend: *mut rknn_init_extend,
) -> ::std::os::raw::c_int {
(self
.rknn_init
.as_ref()
.expect("Expected function, got error."))(context, model, size, flag, extend)
}
pub unsafe fn rknn_dup_context(
&self,
context_in: *mut rknn_context,
context_out: *mut rknn_context,
) -> ::std::os::raw::c_int {
(self
.rknn_dup_context
.as_ref()
.expect("Expected function, got error."))(context_in, context_out)
}
pub unsafe fn rknn_destroy(&self, context: rknn_context) -> ::std::os::raw::c_int {
(self
.rknn_destroy
.as_ref()
.expect("Expected function, got error."))(context)
}
pub unsafe fn rknn_query(
&self,
context: rknn_context,
cmd: rknn_query_cmd,
info: *mut ::std::os::raw::c_void,
size: u32,
) -> ::std::os::raw::c_int {
(self
.rknn_query
.as_ref()
.expect("Expected function, got error."))(context, cmd, info, size)
}
pub unsafe fn rknn_inputs_set(
&self,
context: rknn_context,
n_inputs: u32,
inputs: *mut rknn_input,
) -> ::std::os::raw::c_int {
(self
.rknn_inputs_set
.as_ref()
.expect("Expected function, got error."))(context, n_inputs, inputs)
}
pub unsafe fn rknn_set_batch_core_num(
&self,
context: rknn_context,
core_num: ::std::os::raw::c_int,
) -> ::std::os::raw::c_int {
(self
.rknn_set_batch_core_num
.as_ref()
.expect("Expected function, got error."))(context, core_num)
}
pub unsafe fn rknn_set_core_mask(
&self,
context: rknn_context,
core_mask: rknn_core_mask,
) -> ::std::os::raw::c_int {
(self
.rknn_set_core_mask
.as_ref()
.expect("Expected function, got error."))(context, core_mask)
}
pub unsafe fn rknn_run(
&self,
context: rknn_context,
extend: *mut rknn_run_extend,
) -> ::std::os::raw::c_int {
(self
.rknn_run
.as_ref()
.expect("Expected function, got error."))(context, extend)
}
pub unsafe fn rknn_wait(
&self,
context: rknn_context,
extend: *mut rknn_run_extend,
) -> ::std::os::raw::c_int {
(self
.rknn_wait
.as_ref()
.expect("Expected function, got error."))(context, extend)
}
pub unsafe fn rknn_outputs_get(
&self,
context: rknn_context,
n_outputs: u32,
outputs: *mut rknn_output,
extend: *mut rknn_output_extend,
) -> ::std::os::raw::c_int {
(self
.rknn_outputs_get
.as_ref()
.expect("Expected function, got error."))(context, n_outputs, outputs, extend)
}
pub unsafe fn rknn_outputs_release(
&self,
context: rknn_context,
n_ouputs: u32,
outputs: *mut rknn_output,
) -> ::std::os::raw::c_int {
(self
.rknn_outputs_release
.as_ref()
.expect("Expected function, got error."))(context, n_ouputs, outputs)
}
pub unsafe fn rknn_create_mem_from_phys(
&self,
ctx: rknn_context,
phys_addr: u64,
virt_addr: *mut ::std::os::raw::c_void,
size: u32,
) -> *mut rknn_tensor_mem {
(self
.rknn_create_mem_from_phys
.as_ref()
.expect("Expected function, got error."))(ctx, phys_addr, virt_addr, size)
}
pub unsafe fn rknn_create_mem_from_fd(
&self,
ctx: rknn_context,
fd: i32,
virt_addr: *mut ::std::os::raw::c_void,
size: u32,
offset: i32,
) -> *mut rknn_tensor_mem {
(self
.rknn_create_mem_from_fd
.as_ref()
.expect("Expected function, got error."))(ctx, fd, virt_addr, size, offset)
}
pub unsafe fn rknn_create_mem_from_mb_blk(
&self,
ctx: rknn_context,
mb_blk: *mut ::std::os::raw::c_void,
offset: i32,
) -> *mut rknn_tensor_mem {
(self
.rknn_create_mem_from_mb_blk
.as_ref()
.expect("Expected function, got error."))(ctx, mb_blk, offset)
}
pub unsafe fn rknn_create_mem(&self, ctx: rknn_context, size: u32) -> *mut rknn_tensor_mem {
(self
.rknn_create_mem
.as_ref()
.expect("Expected function, got error."))(ctx, size)
}
pub unsafe fn rknn_create_mem2(
&self,
ctx: rknn_context,
size: u64,
alloc_flags: u64,
) -> *mut rknn_tensor_mem {
(self
.rknn_create_mem2
.as_ref()
.expect("Expected function, got error."))(ctx, size, alloc_flags)
}
pub unsafe fn rknn_destroy_mem(
&self,
ctx: rknn_context,
mem: *mut rknn_tensor_mem,
) -> ::std::os::raw::c_int {
(self
.rknn_destroy_mem
.as_ref()
.expect("Expected function, got error."))(ctx, mem)
}
pub unsafe fn rknn_set_weight_mem(
&self,
ctx: rknn_context,
mem: *mut rknn_tensor_mem,
) -> ::std::os::raw::c_int {
(self
.rknn_set_weight_mem
.as_ref()
.expect("Expected function, got error."))(ctx, mem)
}
pub unsafe fn rknn_set_internal_mem(
&self,
ctx: rknn_context,
mem: *mut rknn_tensor_mem,
) -> ::std::os::raw::c_int {
(self
.rknn_set_internal_mem
.as_ref()
.expect("Expected function, got error."))(ctx, mem)
}
pub unsafe fn rknn_set_io_mem(
&self,
ctx: rknn_context,
mem: *mut rknn_tensor_mem,
attr: *mut rknn_tensor_attr,
) -> ::std::os::raw::c_int {
(self
.rknn_set_io_mem
.as_ref()
.expect("Expected function, got error."))(ctx, mem, attr)
}
pub unsafe fn rknn_set_input_shape(
&self,
ctx: rknn_context,
attr: *mut rknn_tensor_attr,
) -> ::std::os::raw::c_int {
(self
.rknn_set_input_shape
.as_ref()
.expect("Expected function, got error."))(ctx, attr)
}
pub unsafe fn rknn_set_input_shapes(
&self,
ctx: rknn_context,
n_inputs: u32,
attr: *mut rknn_tensor_attr,
) -> ::std::os::raw::c_int {
(self
.rknn_set_input_shapes
.as_ref()
.expect("Expected function, got error."))(ctx, n_inputs, attr)
}
pub unsafe fn rknn_mem_sync(
&self,
context: rknn_context,
mem: *mut rknn_tensor_mem,
mode: rknn_mem_sync_mode,
) -> ::std::os::raw::c_int {
(self
.rknn_mem_sync
.as_ref()
.expect("Expected function, got error."))(context, mem, mode)
}
pub unsafe fn rknn_matmul_create(
&self,
ctx: *mut rknn_matmul_ctx,
info: *mut rknn_matmul_info,
io_attr: *mut rknn_matmul_io_attr,
) -> ::std::os::raw::c_int {
(self
.rknn_matmul_create
.as_ref()
.expect("Expected function, got error."))(ctx, info, io_attr)
}
pub unsafe fn rknn_matmul_create_dynamic_shape(
&self,
ctx: *mut rknn_matmul_ctx,
info: *mut rknn_matmul_info,
shape_num: ::std::os::raw::c_int,
dynamic_shapes: *mut rknn_matmul_shape,
io_attrs: *mut rknn_matmul_io_attr,
) -> ::std::os::raw::c_int {
(self
.rknn_matmul_create_dynamic_shape
.as_ref()
.expect("Expected function, got error."))(
ctx,
info,
shape_num,
dynamic_shapes,
io_attrs,
)
}
pub unsafe fn rknn_matmul_set_io_mem(
&self,
ctx: rknn_matmul_ctx,
mem: *mut rknn_tensor_mem,
attr: *mut rknn_matmul_tensor_attr,
) -> ::std::os::raw::c_int {
(self
.rknn_matmul_set_io_mem
.as_ref()
.expect("Expected function, got error."))(ctx, mem, attr)
}
pub unsafe fn rknn_matmul_set_core_mask(
&self,
context: rknn_matmul_ctx,
core_mask: rknn_core_mask,
) -> ::std::os::raw::c_int {
(self
.rknn_matmul_set_core_mask
.as_ref()
.expect("Expected function, got error."))(context, core_mask)
}
pub unsafe fn rknn_matmul_set_quant_params(
&self,
context: rknn_matmul_ctx,
params: *mut rknn_quant_params,
) -> ::std::os::raw::c_int {
(self
.rknn_matmul_set_quant_params
.as_ref()
.expect("Expected function, got error."))(context, params)
}
pub unsafe fn rknn_matmul_get_quant_params(
&self,
ctx: rknn_matmul_ctx,
params: *mut rknn_quant_params,
scale: *mut f32,
) -> ::std::os::raw::c_int {
(self
.rknn_matmul_get_quant_params
.as_ref()
.expect("Expected function, got error."))(ctx, params, scale)
}
pub unsafe fn rknn_matmul_set_dynamic_shape(
&self,
ctx: rknn_matmul_ctx,
shape: *mut rknn_matmul_shape,
) -> ::std::os::raw::c_int {
(self
.rknn_matmul_set_dynamic_shape
.as_ref()
.expect("Expected function, got error."))(ctx, shape)
}
pub unsafe fn rknn_matmul_run(&self, ctx: rknn_matmul_ctx) -> ::std::os::raw::c_int {
(self
.rknn_matmul_run
.as_ref()
.expect("Expected function, got error."))(ctx)
}
pub unsafe fn rknn_matmul_destroy(&self, ctx: rknn_matmul_ctx) -> ::std::os::raw::c_int {
(self
.rknn_matmul_destroy
.as_ref()
.expect("Expected function, got error."))(ctx)
}
pub unsafe fn rknn_B_normal_layout_to_native_layout(
&self,
B_input: *mut ::std::os::raw::c_void,
B_output: *mut ::std::os::raw::c_void,
K: ::std::os::raw::c_int,
N: ::std::os::raw::c_int,
info: *mut rknn_matmul_info,
) -> ::std::os::raw::c_int {
(self
.rknn_B_normal_layout_to_native_layout
.as_ref()
.expect("Expected function, got error."))(B_input, B_output, K, N, info)
}
pub unsafe fn rknn_register_custom_ops(
&self,
ctx: rknn_context,
op: *mut rknn_custom_op,
custom_op_num: u32,
) -> ::std::os::raw::c_int {
(self
.rknn_register_custom_ops
.as_ref()
.expect("Expected function, got error."))(ctx, op, custom_op_num)
}
pub unsafe fn rknn_custom_op_get_op_attr(
&self,
op_ctx: *mut rknn_custom_op_context,
attr_name: *const ::std::os::raw::c_char,
op_attr: *mut rknn_custom_op_attr,
) {
(self
.rknn_custom_op_get_op_attr
.as_ref()
.expect("Expected function, got error."))(op_ctx, attr_name, op_attr)
}
}