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

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

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

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

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

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

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

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

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

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

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

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

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

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

      • Со знаком

      • Размер Word

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

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

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

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

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

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

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

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

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

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

Например:

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

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

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

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

  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. Например, чтобы поддержать 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)

Похожие темы