Scade pragma: separate_io
概述
在 Scade 语言中,支持对用户自定义算子使用 separate_io
pragma 进行修饰。其形式如:
function #pragma kcg separate_io #end
N(x: int8) returns (y,z: int8)
let
y = x;
z = x;
tel
在上例中,算子N
就被 pragma #pragma kcg separate_io #end
修饰。该pragma 将影响 kcg 对算子输入参数和返回值列表的处理。输入参数在生成代码中,将不被包装在 Context 结构体中,而是以分离的输入参数的形式出现在生成代码中。类似地,输出流在生成代码中将不被包装在 Context 结构体中,而是以分离指针参数的形式存在。
上例对应的生成代码的函数签名如下
extern void N(kcg_int8 x, kcg_int8 *y, kcg_int8 *z);
其中 x
为输入流,y
, z
为输出流。
作为对比,无 separate_io pragma 的形式:
function
N2(x: int8) returns (y,z: int8)
let
y = x;
z = x;
tel
相应的生成代码的函数签名如下
typedef struct { kcg_int8 x; } inC_N2;
typedef struct {
kcg_int8 y;
kcg_int8 z;
} outC_N2;
extern void N2(inC_N2 *inC, outC_N2 *outC);
注意到,当无 separate_io pragma 时,输入被包装在 inC_N2
结构体中,输出被包装在 outC_N2
结构体中。
输出流仅有一项时的简化情况
当输出流仅有一项时,在使用 separate_io pragma 的情况下,生成代码会将输出流简化生成为 return
返回值,而不是作为指针参数。比如:
function #pragma kcg separate_io #end
M (x: int8) returns (y: int8)
y = x;
上例中,输出流仅有 y
, 并且使用了 separate_io
pragma。则生成代码的函数签名为:
extern kcg_int8 M(kcg_int8 x);
y
为函数 M 的返回值。