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

Во время процесса сборки, использования генератора кода:

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

  • Задайте заменяющие подписи функции.

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

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

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

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

Создать заменяющую запись пользовательского кода:

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

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

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

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

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

      • Со знаком

      • Размер Word

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

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

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

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

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

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

  4. Укажите библиотеку, содержащую заменяющую таблицу кода, которая включает ваши записи.

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

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

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

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

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

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

    В параметрах блоков Inport, набор Data type сигнала к 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, представление количества битов в int C тип данных для текущей цели, к значению 32. Если генератор кода находит соответствие, метод устанавливает указатель возврата и создает и добавляет входной параметр. Входной параметр представляет, выражаются ли модули как степени или радианы к заменяющей подписи функции.

    В качестве альтернативы создайте и добавьте дополнительный аргумент функции реализации для передачи модульного флага в каждом заменяющем табличном файле определения кода, который инстанцирует этого класса. В этом случае этот код определения класса не создает аргумент. То, что кодовые наборы только значение аргумента. Для примера создания и добавления дополнительных аргументов функции реализации в табличном файле определения, смотрите, Настраивают Соответствие Кода и Замену для Скалярных Операций.

    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:

    • Устанавливает указатель возврата.

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

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

    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 задает матричные аргументы, чтобы соответствовать. Эти три аргумента настраиваются, чтобы совпадать с 2-мерными матрицами по крайней мере двум элементам в каждой размерности.

    • Вызывает 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 от предыдущего шага. Если вы хотите заменить размеры слова и атрибуты со знаком, можно использовать тот же производный класс, но не ту же запись, потому что вы не можете использовать подстановочный знак с WordLength и IsSigned аргументы. Например, чтобы поддержать uint8int8uint16int16, и 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)

Похожие темы