exponenta event banner

Настройка процесса сопоставления и замены

В процессе построения генератор кода использует:

  • Предустановленные критерии соответствия для определения функций и операторов, для которых реализации, специфичные для приложения, заменяют реализации по умолчанию.

  • Предварительно заданная сигнатура функции замены.

Возможно, что заданные критерии соответствия и предварительно заданные сигнатуры функции замены не полностью соответствуют вашим потребностям в замене функции и оператора. Например:

  • Оператор необходимо заменить определенной функцией реализации с фиксированной точкой, только если длины дробей находятся в определенном диапазоне.

  • При совпадении необходимо изменить сигнатуру замещающей функции на основе информации о времени компиляции, такой как передача значений длины дроби в функцию.

Чтобы добавить дополнительную логику в процесс сопоставления и замены кода, создайте пользовательские записи таблицы замены кода. С помощью пользовательских записей можно указать дополнительные критерии соответствия и изменить сигнатуру функции замены в соответствии с требованиями приложения.

Чтобы создать пользовательскую запись замены кода:

  1. Создание пользовательского класса записи замены кода, производного от RTW.TflCFunctionEntryML (for function replacement) or RTW.TflCOperationEntryML (для замены оператора).

  2. В производном классе реализуйте do_match способ с фиксированной заданной сигнатурой в качестве функции MATLAB ®. В вашемdo_match предоставьте одну или обе из следующих настроек, создающих экземпляр класса:

    • Добавьте критерии соответствия, которые базовый класс не предоставляет. Базовый класс обеспечивает соответствие на основе:

      • Номер аргумента

      • Имя аргумента

      • Signedness

      • Размер слова

      • Уклон (если не указан с подстановочными знаками)

      • Смещение (если не указано с подстановочными знаками)

      • Математические режимы, такие как насыщение и округление

      • Оператор или функциональная клавиша

    • Измените сигнатуру реализации, добавив дополнительные аргументы или установив постоянные значения входных аргументов. Можно ввести постоянное значение, например входное значение масштабирования, в качестве дополнительного аргумента функции замены.

  3. Создание записей замены кода, создающих экземпляр класса настраиваемых записей.

  4. Зарегистрируйте библиотеку, содержащую таблицу замены кода, содержащую записи.

Во время создания кода процесс сопоставления замены кода пытается сопоставить узлы вызовов функций или операторов с базовым классом производного класса ввода. Если процесс находит совпадение, программа вызывает do_match метод для выполнения дополнительной логики соответствия (при наличии) и настроек функции замены (при наличии).

Настройка соответствия кода и замены функций

В этом примере показано, как использовать пользовательские записи таблицы замены кода для уточнения логики соответствия и замены для функций. В примере показано, как:

  • Изменение замены синусоидальной функции возможно только в том случае, если размер целого числа на текущей целевой платформе составляет 32 бита.

  • Измените замену таким образом, чтобы функция реализации передавалась в флаге degrees-version-radians в качестве входного аргумента.

  1. Для выполнения записей таблицы, созданных в этом примере, создайте модель на основе ERT с синусоидальным функциональным блоком. Например:

    В параметрах блока Inport установите тип сигнала Data равным double. Если значение, выбранное для Configuration Parameters > Hardware Implementation > Device type, поддерживает целочисленный размер, отличный от 32, выполните одно из следующих действий.

    • Выберите временную целевую платформу с 32-разрядным целым размером.

    • Измените код, чтобы он соответствовал целому размеру целевой платформы.

  2. Создание класса, например TflCustomFunctionEntry, который является производным от базового класса RTW.TflCFunctionEntryML. Производный класс определяет do_match метод с подписью:

    function ent = do_match(hThis, ...
            hCSO, ...
            targetBitPerChar, ...
            targetBitPerShort, ...
            targetBitPerInt, ...
            targetBitPerLong, ...
            targetBitPerLongLong) 

    В do_match подпись:

    • ent является дескриптором возврата, который возвращается либо как пустой (указывающий на неудачу сопоставления), либо как TflCFunctionEntry рукоятка.

    • hThis является дескриптором экземпляра класса.

    • hCSO является дескриптором объекта, создаваемого генератором кода для запроса библиотеки на замену.

    • Остальные аргументы - это количество битов для различных типов данных текущего целевого объекта.

    do_match способ:

    • Добавляет необходимые дополнительные критерии соответствия, которые не предоставляются базовым классом.

    • Вносит необходимые изменения в подпись реализации.

    В этом случае do_match метод должен соответствовать только targetBitPerInt, представляющее количество битов в C int тип данных для текущего целевого объекта до значения 32. Если генератор кода находит совпадение, метод задает дескриптор возврата, создает и добавляет входной аргумент. Входной аргумент представляет, выражаются ли единицы в градусах или радианах, сигнатуре функции замены.

    Либо создайте и добавьте аргумент дополнительной функции реализации для передачи флага units в каждый файл определения таблицы замены кода, который создает экземпляр этого класса. В этом случае этот код определения класса не создает аргумент. Этот код задает только значение аргумента. Пример создания и добавления дополнительных аргументов функции реализации в файл определения таблицы см. в разделе Настройка соответствия кода и замены для скалярных операций.

    classdef TflCustomFunctionEntry < RTW.TflCFunctionEntryML
      methods
        function ent = do_match(hThis, ...
            hCSO, ... %#ok
            targetBitPerChar, ... %#ok
            targetBitPerShort, ... %#ok
            targetBitPerInt, ... %#ok
            targetBitPerLong, ... %#ok
            targetBitPerLongLong) %#ok
          % DO_MATCH - Create a custom match function. The base class
          % checks the types of the arguments prior to calling this
          % method. This will check additional data and perhaps modify
          % the implementation function.
    
          ent = []; % default the return to empty, indicating the match failed.
    
          % Match sine function only if the target int size is 32 bits
          if targetBitPerInt == 32
            % Need to modify the default implementation, starting from a copy
            % of the standard TflCFunctionEntry.
            ent = RTW.TflCFunctionEntry(hThis);
    
            % If the target int size is 32 bits, the implementation function
            % takes an additional input flag argument indicating degress vs.
            % radians. The additional argument can be created and added either
            % in the CRL table definition file that instantiates this class, or
            % here in the class definition, as follows:
            createAndAddImplementationArg(ent, 'RTW.TflArgNumericConstant', ...
                                          'Name',           'u2', ...
                                          'IsSigned',       true, ...
                                          'WordLength',     32, ...
                                          'FractionLength', 0, ...
                                          'Value',          1);
          end
        end
      end
    end

    Выйдите из папки класса и вернитесь в предыдущую рабочую папку.

  3. Создайте и сохраните следующий файл определения таблицы замены кода, crl_table_custom_sinfcn_double.m. Этот файл определяет таблицу замены кода, которая содержит запись таблицы функций для синуса с double вход и выход. Эта запись создает экземпляр производного класса из предыдущего шага, TflCustomFunctionEntry.

    function hTable = crl_table_custom_sinfcn_double
    
    hTable = RTW.TflTable;
    
    %% Add TflCustomFunctionEntry
    fcn_entry = TflCustomFunctionEntry;
    setTflCFunctionEntryParameters(fcn_entry, ...
        'Key',                      'sin', ...
        'Priority',                 30, ...
        'ImplementationName',       'mySin', ...
        'ImplementationHeaderFile', 'mySin.h', ...
        'ImplementationSourceFile', 'mySin.c');
    
    createAndAddConceptualArg(fcn_entry, 'RTW.TflArgNumeric', ...
         'Name',         'y1', ...
         'IOType',       'RTW_IO_OUTPUT', ...
         'DataTypeMode', 'double');
    
    createAndAddConceptualArg(fcn_entry, 'RTW.TflArgNumeric', ...
         'Name',         'u1', ...
         'IOType',       'RTW_IO_INPUT', ...
         'DataTypeMode', 'double');
    
    % TflCustomFunctionEntry class do_match method will create and add
    % an implementation function argument during code generation if
    % the supported integer size on the current target is 32 bits.
    copyConceptualArgsToImplementation(fcn_entry);
    
    addEntry(hTable, fcn_entry);
  4. Проверьте действительность записи таблицы замены кода.

    • В командной строке вызовите файл определения таблицы.

      tbl = crl_table_custom_sinfcn_double
    • В средстве просмотра замены кода просмотрите файл определения таблицы.

      crviewer(crl_table_custom_sinfcn_double)

Настройка соответствия кода и замены для нескалярных операций

В этом примере показано, как создать пользовательские записи замены кода, которые добавляют логику в процесс сопоставления кода и замены для нескалярной операции. Пользовательские записи определяют дополнительные критерии соответствия или изменяют сигнатуру функции замены в соответствии с требованиями приложения.

В этом примере критерии соответствия для замены умножения по элементам ограничиваются элементами с определенным диапазоном измерений. При совпадении настраиваемый параметр do_match метод изменяет сигнатуру замены для передачи количества элементов в функцию.

Файлы для разработки и тестирования этого примера библиотеки замены кода доступны в matlab/help/toolbox/ecoder/examples/code_replacement/custom_elemmult:

  • do_match метод - @MyElemMultEntry/MyElemMultEntry.m

  • Исходные и заголовочные файлы функции замены - src/myMulImplLib.c и src/myMulImplLib.h

  • Модель - myElemMul.slx

  • Определение таблицы замены кода - myElemMultCrlTable.m

  • Регистрационный файл - rtwTargetInfo.m

Чтобы создать пользовательские записи замены кода, которые добавляют логику в процесс сопоставления замены кода и замены, выполните следующие действия.

  1. Создание класса, например MyElemMultEntry, который является производным от базового класса RTW.TflCOperationEntryML. Производный класс определяет do_match метод со следующей подписью:

    function ent = do_match(hThis, ...
        hCSO, ... 
        targetBitPerChar, ...
        targetBitPerShort, ...
        targetBitPerInt, ...
        targetBitPerLong, ...
        targetBitPerLongLong)

    В do_match подпись:

    • ent является дескриптором возврата, который возвращается как пустой (указывающий, что совпадение не выполнено) или как TflCOperationEntry рукоятка.

    • hThis является дескриптором производного экземпляра.

    • hCSO является дескриптором объекта, создаваемого генератором кода для запроса библиотеки на замену.

    • Остальные аргументы - это количество битов для различных типов данных текущего целевого объекта.

    do_match способ:

    • Добавляет критерии соответствия, которые не предоставляются базовым классом.

    • Вносит изменения в подпись реализации.

    do_match метод основан на базовом классе для проверки типов данных и диапазонов измерений. Если генератор кода находит совпадение, do_match:

    • Задает дескриптор возврата.

    • Использует концептуальные аргументы для вычисления количества элементов в массиве. В возвращаемой записи замены устанавливает значение аргумента реализации константы как количество элементов массива.

    • Обновляет запись замены кода таким образом, чтобы она соответствовала CSO, имеющим одинаковые измерения аргументов.

    classdef MyElemMultEntry < RTW.TflCOperationEntryML
        methods
            function obj = MyElemMultEntry(varargin)
                mlock;
                obj@RTW.TflCOperationEntryML(varargin{:});
            end
            
            function ent = do_match(hThis, ...
                hCSO, ... %#ok
                targetBitPerChar, ... %#ok
                targetBitPerShort, ... %#ok
                targetBitPerInt, ... %#ok
                targetBitPerLong, ... %#ok
                targetBitPerLongLong ) %#ok
                
                %  Fourth implementation arg represents number of elements for producing matches.
                assert(strcmp(hThis.Implementation.Arguments(4).Name,'numElements'));
                
                ent = RTW.TflCOperationEntry(hThis);
                
                % Calculate number of elements and set value of injected constant.
                ent.Implementation.Arguments(4).Value = prod(hCSO.ConceptualArgs(1).DimRange(1,:));
                
                % Since implementation has been modified for specific DimRange, update 
                % returned entry to match similar CSOs only.
                for idx =1:3
                    ent.ConceptualArgs(idx).DimRange = hCSO.ConceptualArgs(idx).DimRange;
                end
            end
        end
    end
  2. Создайте и сохраните следующий файл определения таблицы замены кода, myElemMultCrlTable.m. Этот файл определяет таблицу замены кода, которая содержит генератор записи оператора для умножения по элементам. Запись таблицы:

    • Создает экземпляр производного класса myElemMultEntry из предыдущего шага.

    • Установка параметров ввода оператора с вызовом setTflCOperationEntryParameters функция.

    • Создание концептуальных аргументов y1, u1, и u2. Класс аргументов RTW.TflArgMatrix указывает аргументы матрицы для сопоставления. Три аргумента настраиваются так, чтобы соответствовать двумерным матрицам, по крайней мере, с двумя элементами в каждом измерении.

    • Вызывает getTflArgFromString для создания возвращаемого значения и четырех аргументов реализации. Аргументы u1 и u2 являются операндами, y1 - произведение, а четвертый аргумент - количество элементов.

      В качестве альтернативы, do_match метод производного класса myElemMultEntry может создавать и добавлять аргументы реализации. Если количество необходимых дополнительных аргументов реализации может варьироваться в зависимости от информации о времени компиляции, используйте альтернативный подход.

    • Требования addEntry для добавления записи в таблицу замены кода.

    function hLib = myElemMultCrlTable
    
    libPath = fullfile(fileparts(which(mfilename)),'src');
    
    hLib = RTW.TflTable;
    %---------- entry: RTW_OP_ELEM_MUL ----------- 
    hEnt = MyElemMultEntry;
    hEnt.setTflCOperationEntryParameters( ...
              'Key', 'RTW_OP_ELEM_MUL', ...
              'Priority', 100, ...
              'SaturationMode', 'RTW_WRAP_ON_OVERFLOW', ...
              'ImplementationName', 'myElemMul_s32', ...
              'ImplementationSourceFile', 'myMulImplLib.c', ...
              'ImplementationSourcePath', libPath, ...
              'ImplementationHeaderFile', 'myMulImplLib.h', ...
              'ImplementationHeaderPath', libPath, ...
              'SideEffects', true, ...
              'GenCallback','RTW.copyFileToBuildDir');
    
    % Conceptual Args
    
    arg = RTW.TflArgMatrix('y1', 'RTW_IO_OUTPUT',  'int32');
    arg.DimRange = [2 2; Inf Inf];
    hEnt.addConceptualArg(arg);
    
    arg = RTW.TflArgMatrix('u1', 'RTW_IO_INPUT',  'int32');
    arg.DimRange = [2 2; Inf Inf];
    hEnt.addConceptualArg(arg);
    
    arg = RTW.TflArgMatrix('u2', 'RTW_IO_INPUT',  'int32');
    arg.DimRange = [2 2; Inf Inf];
    hEnt.addConceptualArg(arg);
    
    % Implementation Args 
    
    arg = hEnt.getTflArgFromString('unused','void');
    arg.IOType = 'RTW_IO_OUTPUT';
    hEnt.Implementation.setReturn(arg); 
    
    arg = hEnt.getTflArgFromString('u1','int32*');
    hEnt.Implementation.addArgument(arg);
    
    arg = hEnt.getTflArgFromString('u2','int32*');
    hEnt.Implementation.addArgument(arg);
    
    arg = hEnt.getTflArgFromString('y1','int32*');
    arg.IOType = 'RTW_IO_OUTPUT';
    hEnt.Implementation.addArgument(arg);
    
    arg = hEnt.getTflArgFromString('numElements','uint32',0);
    hEnt.Implementation.addArgument(arg);
    
    hLib.addEntry( hEnt );
  3. Проверьте действительность записи таблицы замены кода.

    • В командной строке вызовите файл определения таблицы.

      tbl = myElemMultCrlTable
    • В средстве просмотра замены кода просмотрите файл определения таблицы.

      crviewer(myElemMultCrlTable)

Настройка соответствия кода и замены для скалярных операций

В этом примере показано, как создать пользовательские записи замены кода, которые добавляют логику в процесс сопоставления кода и замены для скалярной операции. Пользовательские записи определяют дополнительные критерии соответствия или изменяют сигнатуру функции замены в соответствии с требованиями приложения.

Например:

  • Если длины дробей находятся в определенном диапазоне, замените оператор функцией реализации с фиксированной точкой.

  • При совпадении измените сигнатуру функции замещения на основе информации о времени компиляции, например, передавая в функцию значения длины дроби.

В этом примере модифицируется добавочная замена с фиксированной точкой, так что функция реализации проходит в долях типов входных и выходных данных в качестве аргументов.

Чтобы создать пользовательские записи замены кода, которые добавляют логику в процесс сопоставления замены кода и замены, выполните следующие действия.

  1. Создание класса, например TflCustomOperationEntry, который является производным от базового класса RTW.TflCOperationEntryML. Производный класс определяет do_match метод со следующей подписью:

    function ent = do_match(hThis, ...
            hCSO, ...
            targetBitPerChar, ...
            targetBitPerShort, ...
            targetBitPerInt, ...
            targetBitPerLong, ...
            targetBitPerLongLong) 

    В do_match подпись:

    • ent является дескриптором возврата, который возвращается как пустой (указывающий, что совпадение не выполнено) или как TflCOperationEntry рукоятка.

    • hThis является дескриптором экземпляра класса.

    • hCSO является дескриптором объекта, создаваемого генератором кода для запроса библиотеки на замену.

    • Остальные аргументы - это количество битов для различных типов данных текущего целевого объекта.

    do_match добавляет критерии соответствия, которые базовый класс не предоставляет. Метод вносит изменения в сигнатуру реализации. В этом случае do_match способ основан на базовом классе для проверки размера слова и сигнатуры. do_match должно соответствовать только количеству концептуальных аргументов значению 3 (два входа и один выход) и смещению для каждого аргумента к значению 0. Если генератор кода находит совпадение, do_match:

    • Задает дескриптор возврата.

    • Удаляет подстановочные знаки наклона и смещения из концептуальных аргументов (совпадение для определенных значений наклона и смещения).

    • Записывает значения длины дроби для входов и выходов в аргументы функции замещения 3, 4 и 5.

    Можно создать и добавить три дополнительных аргумента функции реализации для передачи длин дробей в определении класса или в каждом определении записи замены кода, которое создает экземпляр этого класса. Этот пример создает аргументы, добавляет их в файл определения таблицы замены кода и устанавливает для них определенные значения в коде определения класса.

    classdef TflCustomOperationEntry < RTW.TflCOperationEntryML
      methods
        function ent = do_match(hThis, ...
            hCSO, ... %#ok
            targetBitPerChar, ... %#ok
            targetBitPerShort, ... %#ok
            targetBitPerInt, ... %#ok
            targetBitPerLong, ... %#ok
            targetBitPerLongLong) %#ok
    
          % DO_MATCH - Create a custom match function. The base class
          % checks the types of the arguments prior to calling this
          % method. This class will check additional data and can
          % modify the implementation function.
    
          % The base class checks word size and signedness. Slopes and biases
          % have been wildcarded, so the only additional checking to do is
          % to check that the biases are zero and that there are only three
          % conceptual arguments (one output, two inputs)
    
          ent = []; % default the return to empty, indicating the match failed
    
          if length(hCSO.ConceptualArgs) == 3 && ...
              hCSO.ConceptualArgs(1).Type.Bias == 0 && ...
              hCSO.ConceptualArgs(2).Type.Bias == 0 && ...
              hCSO.ConceptualArgs(3).Type.Bias == 0
    
            % Modify the default implementation. Since this is a
            % generator entry, a concrete entry is created using this entry
            % as a template. The type of entry being created is a standard
            % TflCOperationEntry. Using the standard operation entry
            % provides required information, and you do not need
            % a custom match function.
            ent = RTW.TflCOperationEntry(hThis);
    
            % Since this entry is modifying the implementation for specific
            % fraction-length values (arguments 3, 4, and 5), the conceptual argument
            % wild cards must be removed (the wildcards were inherited from the
            % generator when it was used as a template for the concrete entry).
            % This concrete entry is now for a specific slope and bias. 
            % hCSO holds the slope and bias values (created by the code generator).
            for idx=1:3
              ent.ConceptualArgs(idx).CheckSlope = true;
              ent.ConceptualArgs(idx).CheckBias = true;
    
              % Set the specific Slope and Biases
              ent.ConceptualArgs(idx).Type.Slope = hCSO.ConceptualArgs(idx).Type.Slope;
              ent.ConceptualArgs(idx).Type.Bias = 0;
            end
    
            % Set the fraction-length values in the implementation function.
            ent.Implementation.Arguments(3).Value = ...
               -1.0*hCSO.ConceptualArgs(2).Type.FixedExponent;
            ent.Implementation.Arguments(4).Value = ...
               -1.0*hCSO.ConceptualArgs(3).Type.FixedExponent;
            ent.Implementation.Arguments(5).Value = ...
               -1.0*hCSO.ConceptualArgs(1).Type.FixedExponent;
          end
        end
      end
    end

    Выйдите из папки класса и вернитесь в предыдущую рабочую папку.

  2. Создайте и сохраните следующий файл определения таблицы замены кода, crl_table_custom_add_ufix32.m. Этот файл определяет таблицу замены кода, которая содержит одну запись оператора, генератор записи для неподписанных 32-разрядных операций сложения с фиксированной точкой, с произвольными значениями длины дроби на входах и выходе. Запись таблицы:

    • Создает экземпляр производного класса TflCustomOperationEntry из предыдущего шага. Если требуется заменить размеры слов и атрибуты signedness, можно использовать один и тот же производный класс, но не одну и ту же запись, поскольку нельзя использовать подстановочный символ с WordLength и IsSigned аргументы. Например, для поддержки uint8, int8, uint16, int16, и int32, добавить еще пять отдельных позиций. Чтобы использовать различные функции реализации для режимов насыщения и округления, отличных от переполнения и округления до пола, добавьте записи для этих соответствующих перестановок.

    • Установка параметров ввода оператора с вызовом setTflCOperationEntryParameters функция.

    • Вызывает createAndAddConceptualArg функция для создания концептуальных аргументов y1, u1, и u2.

    • Требования createAndSetCImplementationReturn и createAndAddImplementationArg для определения подписи для функции замены. Три из вызовов createAndAddImplementationArg создание аргументов реализации для хранения значений длины дроби для входных и выходных данных. Кроме того, запись может опустить эти определения аргументов. Вместо этого, do_match метод производного класса TflCustomOperationEntry может создавать и добавлять три аргумента реализации. Если количество необходимых дополнительных аргументов реализации может варьироваться в зависимости от информации о времени компиляции, используйте альтернативный подход.

    • Требования addEntry для добавления записи в таблицу замены кода.

    function hTable = crl_table_custom_add_ufix32
    
    hTable = RTW.TflTable;
    
    % Add TflCustomOperationEntry
    op_entry = TflCustomOperationEntry;
    
    setTflCOperationEntryParameters(op_entry, ...
        'Key',                      'RTW_OP_ADD', ...
        'Priority',                 30, ...
        'SaturationMode',           'RTW_SATURATE_ON_OVERFLOW', ...
        'RoundingModes',            {'RTW_ROUND_FLOOR'}, ...
        'ImplementationName',       'myFixptAdd', ...
        'ImplementationHeaderFile', 'myFixptAdd.h', ...
        'ImplementationSourceFile', 'myFixptAdd.c');
    
    createAndAddConceptualArg(op_entry, 'RTW.TflArgNumeric', ...
         'Name',       'y1', ...
         'IOType',     'RTW_IO_OUTPUT', ...
         'CheckSlope', false, ...
         'CheckBias',  false, ...
         'DataType',   'Fixed', ...
         'Scaling',    'BinaryPoint', ...
         'IsSigned',   false, ...
         'WordLength', 32);
    
    createAndAddConceptualArg(op_entry, 'RTW.TflArgNumeric', ...
          'Name',       'u1', ...
          'IOType',     'RTW_IO_INPUT', ...
          'CheckSlope', false, ...
          'CheckBias',  false, ...
          'DataType',   'Fixed', ...
          'Scaling',    'BinaryPoint', ...
          'IsSigned',   false, ...
          'WordLength', 32);
    
    createAndAddConceptualArg(op_entry, 'RTW.TflArgNumeric', ...
           'Name',       'u2', ...
           'IOType',     'RTW_IO_INPUT', ...
           'CheckSlope', false, ...
           'CheckBias',  false, ...
           'DataType',   'Fixed', ...
           'Scaling',    'BinaryPoint', ...
           'IsSigned',   false, ...
           'WordLength', 32);
    
    % Specify replacement function signature
    createAndSetCImplementationReturn(op_entry, 'RTW.TflArgNumeric', ...
        'Name',       'y1', ...
        'IOType',     'RTW_IO_OUTPUT', ...
        'IsSigned',   false, ...
        'WordLength', 32, ...
        'FractionLength', 0);
    
    createAndAddImplementationArg(op_entry, 'RTW.TflArgNumeric', ...
        'Name',       'u1', ...
        'IOType',     'RTW_IO_INPUT', ...
        'IsSigned',   false, ...
        'WordLength', 32, ...
        'FractionLength', 0);
    
    createAndAddImplementationArg(op_entry, 'RTW.TflArgNumeric', ...
        'Name',       'u2', ...
        'IOType',     'RTW_IO_INPUT', ...
        'IsSigned',   false, ...
        'WordLength', 32, ...
        'FractionLength', 0);
    
    % Add 3 fraction-length args. Actual values are set during code generation.
    createAndAddImplementationArg(op_entry, 'RTW.TflArgNumericConstant', ...
        'Name',       'fl_in1', ...
        'IOType',     'RTW_IO_INPUT', ...
        'IsSigned',   false, ...
        'WordLength', 32, ...
        'FractionLength', 0, ...
        'Value',       0);
    
    createAndAddImplementationArg(op_entry, 'RTW.TflArgNumericConstant', ...
        'Name',       'fl_in2', ...
        'IOType',     'RTW_IO_INPUT', ...
        'IsSigned',   false, ...
        'WordLength', 32, ...
        'FractionLength', 0, ...
        'Value',       0);
    
    createAndAddImplementationArg(op_entry, 'RTW.TflArgNumericConstant', ...
        'Name',       'fl_out', ...
        'IOType',     'RTW_IO_INPUT', ...
        'IsSigned',   false, ...
        'WordLength', 32, ...
        'FractionLength', 0, ...
        'Value',       0);
    
    addEntry(hTable, op_entry);
    
  3. Проверьте действительность записи оператора.

    • В командной строке вызовите файл определения таблицы.

      tbl = crl_table_custom_add_ufix32
    • В средстве просмотра замены кода просмотрите файл определения таблицы.

      crviewer(crl_table_custom_add_ufix32)

Связанные темы