主要内容

仅限二进制点缩放代码替换

您可以为定点数据类型上的操作定义代码替换项,以便它们匹配操作符输入和输出的仅二进制点缩放组合。这个例子展示了如何开发一个代码替换库来优化定点数据类型操作的性能,通过提供将二进制点尺度条目映射到添加操作员。要开发代码替换库,仅使用程序方法。有关更多信息,请参阅开发代码替换库

此示例修改了定点加法替换,以便实现函数将输入和输出数据类型的小数部分长度作为参数传入。

要创建将逻辑添加到代码替换匹配和替换过程的自定义代码替换条目请参阅自定义标量操作的代码匹配和替换.您可以在类定义中或在实例化此类的每个代码替换条目定义中创建和添加三个其他实现函数参数。此示例创建参数,将它们添加到代码替换表定义文件中,并将其设置为Class定义代码中的特定值。

Classdef.tflcustomoperationEnterrybinarypointopl.tflcopoperationEntryml方法函数ent = do_match (hThis,......hCSO,......%#好的targetBitPerChar,......%#好的targetbitpershort,......%#好的targetBitPerInt,......%#好的targetbitperlong,......%#好的TargetbitPerlonglong)%#好的% DO_MATCH -创建一个自定义匹配函数。基类%在调用此之前检查参数的类型%的方法。这个类将检查额外的数据并可以%修改实现函数。%基类检查字的大小和符号。斜坡和偏见%已被通配符使用,因此要做的唯一额外检查是%来检查偏差为零,并且只有3个偏差%概念参数(一个输出,两个输入)ent = [];%默认返回为空,表示匹配失败如果长度(hcso.conceptualargs)== 3 &&......hcso.conceptualargs(1).type.bias == 0 &&......hCSO.ConceptualArgs .Type(2)。偏差== 0 &&......hcso.conceptualargs(3).type.bias == 0%修改默认实现。因为这是一个%Generator条目,使用此条目创建一个具体条目%作为模板。创建的条目类型是标准的% TflCOperationEntry。使用标准操作入口%提供必需的信息,而您不需要%自定义匹配函数。ent = RTW.TflCOperationEntry (hThis);由于这个条目正在修改特定的实现%分数长度值(参数3、4和5),概念参数必须删除通配符(通配符是从当它用作混凝土条目的模板时%发生器)。这个具体的条目现在是一个特定的坡度和偏差。%HCSO保存斜率和偏置值(由代码生成器创建)。为了idx = 1:3 ent.ConceptualArgs (idx)。CheckSlope = true;ent.ConceptualArgs (idx)。CheckBias = true;设定特定的斜率和偏差ent.ConceptualArgs .Type (idx)。斜率= hCSO.ConceptualArgs (idx) .Type.Slope;ent.ConceptualArgs .Type (idx)。偏见= 0;结尾%在实现函数中设置分数长值。ENT.IMPLENTATION.ARGUMENTS(3).Value =......-1.0 * hCSO.ConceptualArgs (2) .Type.FixedExponent;ent.Implementation.Arguments(4)。值=......-1.0 * hCSO.ConceptualArgs (3) .Type.FixedExponent;ent.Implementation.Arguments(5)。值=......-1.0 * hCSO.ConceptualArgs (1) .Type.FixedExponent;结尾结尾结尾结尾

以编程方式开发代码替换库

  1. 从中打开程序化界面MATLAB通过选择菜单>函数

  2. 创建一个表。

    1. 创建一个函数,其中代码替换库表的名称没有参数并返回表对象。您可以使用此功能调用代码替换库表。

    2. 通过调用RTW.TFLTABLE.

    函数hTable = crl_table_fixed_binptscale ()%创建一个函数来调用代码替换库表%%创建表对象hTable = RTW.TflTable;
  3. 创建一个条目。由于此示例替换了函数,因此通过调用自定义输入函数在表中创建代码替换条目。

    函数hTable = crl_table_fixed_binptscale ()%创建代码替换库表%%创建表对象hTable = RTW.TflTable;%%创建一个条目hentry = tflcustomoperationEnterrybinarypoint;
  4. 创建输入参数。因为这个例子替换了一个函数,所以通过调用函数来创建入口参数settflcoperationentryparameters.

    函数hTable = crl_table_fixed_binptscale ()%创建代码替换库表%%创建表对象hTable = RTW.TflTable;%%创建一个条目hentry = tflcustomoperationEnterrybinarypoint;%%创建条目参数setTflCOperationEntryParameters (hEntry......'钥匙''rtw_op_add'......“优先”30岁的......'饱和模特'“RTW_SATURATE_ON_OVERFLOW”......“RoundingModes”, {'rtw_round_floor'},......'simptionsname''myfixptadd_binarypoint'......'IloversheaderFile''myfixptadd.h'......“ImplementationSourceFile”“myFixptAdd.c”);
  5. 创建概念表示。概念表示描述要替换的函数的签名。要显式指定参数属性,请调用函数createandaddconceptualarg.

    函数hTable = crl_table_fixed_binptscale ()%创建代码替换库表%%创建表对象hTable = RTW.TflTable;%%创建一个条目hentry = tflcustomoperationEnterrybinarypoint;%%创建条目参数setTflCOperationEntryParameters (hEntry......'钥匙''rtw_op_add'......“优先”30岁的......'饱和模特'“RTW_SATURATE_ON_OVERFLOW”......“RoundingModes”, {'rtw_round_floor'},......'simptionsname''myfixptadd_binarypoint'......'IloversheaderFile''myfixptadd.h'......“ImplementationSourceFile”“myFixptAdd.c”);%%创建概念表示createandaddconceptualarg(entry,'rtw.tflargnumeric'......'姓名''y1'......'iotype'“RTW_IO_OUTPUT”......'checkslope', 错误的,......'checkbias', 错误的,......'数据类型''固定的'......'缩放'“BinaryPoint”......“IsSigned”, 错误的,......'wordlength',32);createandaddconceptualarg(entry,'rtw.tflargnumeric'......'姓名'‘u1’......'iotype''RTW_IO_INPUT'......'checkslope', 错误的,......'checkbias', 错误的,......'数据类型''固定的'......'缩放'“BinaryPoint”......“IsSigned”, 错误的,......'wordlength',32);createandaddconceptualarg(entry,'rtw.tflargnumeric'......'姓名''U2'......'iotype''RTW_IO_INPUT'......'checkslope', 错误的,......'checkbias', 错误的,......'数据类型''固定的'......'缩放'“BinaryPoint”......“IsSigned”, 错误的,......'wordlength',32);
  6. 创建实现表示。实现表示描述了优化函数的签名。要指定实现参数具有与概念参数相同的顺序和属性,请调用该函数createAndSetCImplementationReturncreateandaddimplementationarg..通过调用函数将完整的条目添加到表中插手

    函数hTable = crl_table_fixed_binptscale ()%创建代码替换库表%%创建表对象hTable = RTW.TflTable;%%创建一个条目hentry = tflcustomoperationEnterrybinarypoint;%%创建条目参数setTflCOperationEntryParameters (hEntry......'钥匙''rtw_op_add'......“优先”30岁的......'饱和模特'“RTW_SATURATE_ON_OVERFLOW”......“RoundingModes”, {'rtw_round_floor'},......'simptionsname''myfixptadd_binarypoint'......'IloversheaderFile''myfixptadd.h'......“ImplementationSourceFile”“myFixptAdd.c”);%%创建概念表示createandaddconceptualarg(entry,'rtw.tflargnumeric'......'姓名''y1'......'iotype'“RTW_IO_OUTPUT”......'checkslope', 错误的,......'checkbias', 错误的,......'数据类型''固定的'......'缩放'“BinaryPoint”......“IsSigned”, 错误的,......'wordlength',32);createandaddconceptualarg(entry,'rtw.tflargnumeric'......'姓名'‘u1’......'iotype''RTW_IO_INPUT'......'checkslope', 错误的,......'checkbias', 错误的,......'数据类型''固定的'......'缩放'“BinaryPoint”......“IsSigned”, 错误的,......'wordlength',32);createandaddconceptualarg(entry,'rtw.tflargnumeric'......'姓名''U2'......'iotype''RTW_IO_INPUT'......'checkslope', 错误的,......'checkbias', 错误的,......'数据类型''固定的'......'缩放'“BinaryPoint”......“IsSigned”, 错误的,......'wordlength',32);%%创建实现表示%指定替换函数签名createandsetcimplementationreturn(entry,'rtw.tflargnumeric'......'姓名''y1'......'iotype'“RTW_IO_OUTPUT”......“IsSigned”, 错误的,......'wordlength'32岁的......'fractionlength', 0);createAndAddImplementationArg (hEntry'rtw.tflargnumeric'......'姓名'‘u1’......'iotype''RTW_IO_INPUT'......“IsSigned”, 错误的,......'wordlength'32岁的......'fractionlength', 0);createAndAddImplementationArg (hEntry'rtw.tflargnumeric'......'姓名''U2'......'iotype''RTW_IO_INPUT'......“IsSigned”, 错误的,......'wordlength'32岁的......'fractionlength', 0);%添加3个分数长度args。在代码生成期间设置实际值。createAndAddImplementationArg (hEntry'rtw.tflargnumericConstant'......'姓名'“fl_in1”......'iotype''RTW_IO_INPUT'......“IsSigned”, 错误的,......'wordlength'32岁的......'fractionlength',0,......'价值', 0);createAndAddImplementationArg (hEntry'rtw.tflargnumericConstant'......'姓名'“fl_in2”......'iotype''RTW_IO_INPUT'......“IsSigned”, 错误的,......'wordlength'32岁的......'fractionlength',0,......'价值', 0);createAndAddImplementationArg (hEntry'rtw.tflargnumericConstant'......'姓名''fl_out'......'iotype''RTW_IO_INPUT'......“IsSigned”, 错误的,......'wordlength'32岁的......'fractionlength',0,......'价值', 0);%%将该表项添加到表中htable.addentry(op_entry);
  7. 指定构建信息。在条目参数中,指定代码生成器需要代码替换的文件(标题,源,对象)。对于此示例,不需要构建信息。

  8. 验证并保存自定义文件。来自MATLAB菜单,通过选择保存此定制文件文件>保存.从命令行中,通过调用它来验证代码替换库表:

    >> HETABLE = CRL_TABLE_FIXED_BINPTSCALE
  9. 注册代码替换库。注册通过定义库名称,代码替换表和其他信息来创建代码替换库。使用这些规范创建注册文件(新功能文件):

    函数rtwTargetInfo (cm) cm.registerTargetInfo (@loc_register_crl);结尾函数这个= loc_register_cl这个(1)= rtw.tflregistry;这个(1).name ='二进制点缩放CRL'CRL;(1)。TableList = {“crl_table_fixed_binptscale.m”};%表这个(1).targethwdeviceType = {‘*’};这个(1).description ='示例代码替换库';结尾

    要使用代码替换库,请使用以下命令刷新当前MATLAB会话:

    > > sl_refresh_customizations

  10. 验证代码替换库。从MATLAB命令行中,使用代码替换查看器并验证是否正确指定了表和条目。有关更多信息,请参阅验证代码替换库.配置模型以使用代码替换库,生成代码,并验证替换是否按预期发生。如果出现意外的行为,请检查命中和错误日志以解决问题。

相关话题