Замена кода масштабирования смещения наклона

Можно задать замену кода для операций с типами данных с фиксированной точкой как соответствие комбинации масштабирования смещения наклона на входах оператора и выходе. В этом примере показов, как разработать библиотеку замены кода для оптимизации эффективности операций с фиксированным точкой типом данных путем предоставления информации о том, как задать замену кода для division оператор. Для разработки библиотеки замещения кода используйте только программный подход. Для получения дополнительной информации см. раздел «Разработка библиотеки замещения кода».

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

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

classdef TflCustomOperationEntrySlopeBias < 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

        % 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 = hCSO.ConceptualArgs(idx).Type.Bias;
        end

        % Set the Slope and Bias values in the implementation function.
        ent.Implementation.Arguments(3).Value = hCSO.ConceptualArgs(2).Type.Slope;
        ent.Implementation.Arguments(4).Value = hCSO.ConceptualArgs(2).Type.Bias;
        ent.Implementation.Arguments(5).Value = hCSO.ConceptualArgs(3).Type.Slope;
        ent.Implementation.Arguments(6).Value = hCSO.ConceptualArgs(3).Type.Bias;
        ent.Implementation.Arguments(7).Value = hCSO.ConceptualArgs(1).Type.Slope;
        ent.Implementation.Arguments(8).Value = hCSO.ConceptualArgs(1).Type.Bias;
      end
    end
  end
end

Программно разрабатывайте библиотеку замещения кода

  1. Откройте программный интерфейс из меню MATLAB, выбрав New > Function.

  2. Составьте таблицу.

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

    2. Создайте объект таблицы путем вызова RTW.TflTable.

    function hTable = crl_table_custom_add_ufix32_slopebias
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
  3. Создайте запись. Поскольку этот пример заменяет функцию, создайте запись замены кода в таблице, вызвав пользовательскую функцию ввода.

    function hTable = crl_table_custom_add_ufix32_slopebias
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = TflCustomOperationEntrySlopeBias;;
  4. Создайте параметры входа. Поскольку эти примеры заменяют функцию, создайте параметры входа путем вызова функции setTflCFunctionEntryParameters.

    function hTable = crl_table_custom_add_ufix32_slopebias
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = TflCustomOperationEntrySlopeBias;;
    
    %% Create entry parameters
    setTflCOperationEntryParameters(hEntry, ...
        'Key',                      'RTW_OP_ADD', ...
        'Priority',                 30, ...
        'SaturationMode',           'RTW_SATURATE_ON_OVERFLOW', ...
        'RoundingModes',            {'RTW_ROUND_FLOOR'}, ...
        'ImplementationName',       'myFixptAdd_slopebias', ...
        'ImplementationHeaderFile', 'myFixptAdd.h', ...
        'ImplementationSourceFile', 'myFixptAdd.c');
  5. Создайте концептуальное представление. Концептуальное представление описывает сигнатуру функции, которую вы хотите заменить. Чтобы явным образом задать свойства аргумента, вызовите функцию createAndAddConceptualArg.

    function hTable = crl_table_custom_add_ufix32_slopebias
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = TflCustomOperationEntrySlopeBias;;
    
    %% Create entry parameters
    setTflCOperationEntryParameters(hEntry, ...
        'Key',                      'RTW_OP_ADD', ...
        'Priority',                 30, ...
        'SaturationMode',           'RTW_SATURATE_ON_OVERFLOW', ...
        'RoundingModes',            {'RTW_ROUND_FLOOR'}, ...
        'ImplementationName',       'myFixptAdd_slopebias', ...
        'ImplementationHeaderFile', 'myFixptAdd.h', ...
        'ImplementationSourceFile', 'myFixptAdd.c');
    
    %% Create the conceptual representation
    createAndAddConceptualArg(hEntry, 'RTW.TflArgNumeric', ...
         'Name',       'y1', ...
         'IOType',     'RTW_IO_OUTPUT', ...
         'CheckSlope', false, ...
         'CheckBias',  false, ...
         'DataType',   'Fixed', ...
         'Scaling',    'SlopeBias', ...
         'IsSigned',   false, ...
         'WordLength', 32);
    
    createAndAddConceptualArg(hEntry, 'RTW.TflArgNumeric', ...
          'Name',       'u1', ...
          'IOType',     'RTW_IO_INPUT', ...
          'CheckSlope', false, ...
          'CheckBias',  false, ...
          'DataType',   'Fixed', ...
          'Scaling',    'SlopeBias', ...
          'IsSigned',   false, ...
          'WordLength', 32);
    
    createAndAddConceptualArg(hEntry, 'RTW.TflArgNumeric', ...
           'Name',       'u2', ...
           'IOType',     'RTW_IO_INPUT', ...
           'CheckSlope', false, ...
           'CheckBias',  false, ...
           'DataType',   'Fixed', ...
           'Scaling',    'SlopeBias', ...
           'IsSigned',   false, ...
           'WordLength', 32);
  6. Создайте представление реализации. Представление реализации описывает сигнатуру оптимизационной функции. Чтобы указать, что аргументы реализации имеют тот же порядок и свойства, что и концептуальные аргументы, вызовите функцию createAndSetCImplementationReturn и createAndAddImplementationArg. Добавьте полную запись в таблицу путем вызова функции addEntry.

    function hTable = crl_table_custom_add_ufix32_slopebias
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = TflCustomOperationEntrySlopeBias;;
    
    %% Create entry parameters
    setTflCOperationEntryParameters(hEntry, ...
        'Key',                      'RTW_OP_ADD', ...
        'Priority',                 30, ...
        'SaturationMode',           'RTW_SATURATE_ON_OVERFLOW', ...
        'RoundingModes',            {'RTW_ROUND_FLOOR'}, ...
        'ImplementationName',       'myFixptAdd_slopebias', ...
        'ImplementationHeaderFile', 'myFixptAdd.h', ...
        'ImplementationSourceFile', 'myFixptAdd.c');
    
    %% Create the conceptual representation
    createAndAddConceptualArg(hEntry, 'RTW.TflArgNumeric', ...
         'Name',       'y1', ...
         'IOType',     'RTW_IO_OUTPUT', ...
         'CheckSlope', false, ...
         'CheckBias',  false, ...
         'DataType',   'Fixed', ...
         'Scaling',    'SlopeBias', ...
         'IsSigned',   false, ...
         'WordLength', 32);
    
    createAndAddConceptualArg(hEntry, 'RTW.TflArgNumeric', ...
          'Name',       'u1', ...
          'IOType',     'RTW_IO_INPUT', ...
          'CheckSlope', false, ...
          'CheckBias',  false, ...
          'DataType',   'Fixed', ...
          'Scaling',    'SlopeBias', ...
          'IsSigned',   false, ...
          'WordLength', 32);
    
    createAndAddConceptualArg(hEntry, 'RTW.TflArgNumeric', ...
           'Name',       'u2', ...
           'IOType',     'RTW_IO_INPUT', ...
           'CheckSlope', false, ...
           'CheckBias',  false, ...
           'DataType',   'Fixed', ...
           'Scaling',    'SlopeBias', ...
           'IsSigned',   false, ...
           'WordLength', 32);
    
    %% Create the implementation Representation
    % Specify replacement function signature
    createAndSetCImplementationReturn(hEntry, 'RTW.TflArgNumeric', ...
        'Name',       'y1', ...
        'IOType',     'RTW_IO_OUTPUT', ...
        'IsSigned',   false, ...
        'WordLength', 32, ...
        'FractionLength', 0);
    
    createAndAddImplementationArg(hEntry, 'RTW.TflArgNumeric', ...
        'Name',       'u1', ...
        'IOType',     'RTW_IO_INPUT', ...
        'IsSigned',   false, ...
        'WordLength', 32, ...
        'FractionLength', 0);
    
    createAndAddImplementationArg(hEntry, '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.
    createAndSetCImplementationReturn(hEntry, 'RTW.TflArgNumeric', ...
        'Name',       'y1', ...
        'IOType',     'RTW_IO_OUTPUT', ...
        'IsSigned',   false, ...
        'WordLength', 32, ...
        'FractionLength', 0);
    
    createAndAddImplementationArg(hEntry, 'RTW.TflArgNumeric', ...
        'Name',       'u1', ...
        'IOType',     'RTW_IO_INPUT', ...
        'IsSigned',   false, ...
        'WordLength', 32, ...
        'FractionLength', 0);
    
    createAndAddImplementationArg(hEntry, 'RTW.TflArgNumeric', ...
        'Name',       'u2', ...
        'IOType',     'RTW_IO_INPUT', ...
        'IsSigned',   false, ...
        'WordLength', 32, ...
        'FractionLength', 0);
    
    % Add 6 args for slopes and biases. 
    % Actual values are set during code generation.
    createAndAddImplementationArg(hEntry, 'RTW.TflArgNumericConstant', ...
        'Name',       'slope_in1', ...
        'IOType',     'RTW_IO_INPUT', ...
        'IsSigned',   false, ...
        'WordLength', 32, ...
        'FractionLength', 0, ...
        'Value',       0);
    
    createAndAddImplementationArg(hEntry, 'RTW.TflArgNumericConstant', ...
        'Name',       'bias_in1', ...
        'IOType',     'RTW_IO_INPUT', ...
        'IsSigned',   true, ...
        'WordLength', 32, ...
        'FractionLength', 0, ...
        'Value',       0);
    
    createAndAddImplementationArg(hEntry, 'RTW.TflArgNumericConstant', ...
        'Name',       'slope_in2', ...
        'IOType',     'RTW_IO_INPUT', ...
        'IsSigned',   false, ...
        'WordLength', 32, ...
        'FractionLength', 0, ...
        'Value',       0);
    
    createAndAddImplementationArg(hEntry, 'RTW.TflArgNumericConstant', ...
        'Name',       'bias_in2', ...
        'IOType',     'RTW_IO_INPUT', ...
        'IsSigned',   true, ...
        'WordLength', 32, ...
        'FractionLength', 0, ...
        'Value',       0);
    
    createAndAddImplementationArg(hEntry, 'RTW.TflArgNumericConstant', ...
        'Name',       'slope_out1', ...
        'IOType',     'RTW_IO_INPUT', ...
        'IsSigned',   false, ...
        'WordLength', 32, ...
        'FractionLength', 0, ...
        'Value',       0);
    
    createAndAddImplementationArg(hEntry, 'RTW.TflArgNumericConstant', ...
        'Name',       'bias_out1', ...
        'IOType',     'RTW_IO_INPUT', ...
        'IsSigned',   true, ...
        'WordLength', 32, ...
        'FractionLength', 0, ...
        'Value',       0);
    
    addEntry(hTable, hEntry);
  7. Укажите сведения о сборке. В параметрах входа укажите файлы (заголовок, источник, объект), которые нужны генератору кода для замены кода. В данном примере информация о сборке не требуется.

  8. Проверьте и сохраните файл индивидуальной настройки. В меню MATLAB сохраните этот файл индивидуальной настройки, выбрав File > Save. В командной строке проверьте таблицу библиотеки замещения кода, вызвав ее:

    >> hTable = crl_table_custom_add_ufix32_slopebias
  9. Зарегистрируйте библиотеку замещения кода. Регистрация создает библиотеку замещения кода путем определения имени библиотеки, таблиц замещения кода и другой информации. Создайте файл регистрации (новый файл функции) с этими спецификациями:

    function rtwTargetInfo(cm)
     
    cm.registerTargetInfo(@loc_register_crl);
    end
     
    function this = loc_register_crl 
     
    this(1) = RTW.TflRegistry; 
    this(1).Name = 'CRL for slope bias scaling function replacement’;
    this(1).TableList = {'crl_table_custom_add_ufix32_slopebias.m'}; 
    % table created in this example
    this(1).TargetHWDeviceType = {'*'};
    this(1).Description = 'Example code replacement library';
    
    end
    

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

    >>sl_refresh_customizations

  10. Проверьте библиотеку замещения кода. Из командной строки MATLAB откройте библиотеку с помощью Code Replacement Viewer и проверьте, что таблица и запись заданы правильно. Дополнительные сведения см. в разделе Проверка библиотеки замещения кода. Сконфигурируйте модель, чтобы использовать библиотеку замены кода, сгенерировать код и проверить, что замена происходит должным образом. Если происходит непредвиденное поведение, исследуйте журналы попадания и пропуска, чтобы устранить проблемы.

Похожие темы