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

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

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

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

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

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

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

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

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

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

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

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

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

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

      • Со знаком

      • Размер Word

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

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

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

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

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

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

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

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

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

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

Например:

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

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

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

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

  1. Создайте класс, например, TflCustomOperationEntry, это выведено из базового класса RTW.TflCOperationEntryML. Производный класс задает a 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)

Похожие темы