Единственная двоичной точкой замена масштабирования кода

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

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

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

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

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

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

  2. Составление таблицы.

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

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

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

    function hTable = crl_table_fixed_binptscale()
    % Create a code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = TflCustomOperationEntryBinaryPoint;
    
  4. Создайте параметры записи. Поскольку это, примеры заменяют функцию, создают параметры записи путем вызова функционального setTflCOperationEntryParameters.

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

    function hTable = crl_table_fixed_binptscale()
    % Create a code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = TflCustomOperationEntryBinaryPoint;
    
    
    %% Create entry parameters
    setTflCOperationEntryParameters(hEntry, ...
        'Key',                      'RTW_OP_ADD', ...
        'Priority',                 30, ...
        'SaturationMode',           'RTW_SATURATE_ON_OVERFLOW', ...
        'RoundingModes',            {'RTW_ROUND_FLOOR'}, ...
        'ImplementationName',       'myFixptAdd_binarypoint', ...
        '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',    'BinaryPoint', ...
         'IsSigned',   false, ...
         'WordLength', 32);
    
    createAndAddConceptualArg(hEntry, 'RTW.TflArgNumeric', ...
          'Name',       'u1', ...
          'IOType',     'RTW_IO_INPUT', ...
          'CheckSlope', false, ...
          'CheckBias',  false, ...
          'DataType',   'Fixed', ...
          'Scaling',    'BinaryPoint', ...
          'IsSigned',   false, ...
          'WordLength', 32);
    
    createAndAddConceptualArg(hEntry, 'RTW.TflArgNumeric', ...
           'Name',       'u2', ...
           'IOType',     'RTW_IO_INPUT', ...
           'CheckSlope', false, ...
           'CheckBias',  false, ...
           'DataType',   'Fixed', ...
           'Scaling',    'BinaryPoint', ...
           'IsSigned',   false, ...
           'WordLength', 32);
  6. Создайте представление реализации. Представление реализации описывает подпись оптимизационной функции. Чтобы указать, что аргументы реализации имеют тот же порядок и свойства в качестве концептуальных аргументов, вызовите функциональный createAndSetCImplementationReturn и createAndAddImplementationArg. Добавьте полную запись в таблицу путем вызова функционального addEntry.

    function hTable = crl_table_fixed_binptscale()
    % Create a code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = TflCustomOperationEntryBinaryPoint;
    
    
    %% Create entry parameters
    setTflCOperationEntryParameters(hEntry, ...
        'Key',                      'RTW_OP_ADD', ...
        'Priority',                 30, ...
        'SaturationMode',           'RTW_SATURATE_ON_OVERFLOW', ...
        'RoundingModes',            {'RTW_ROUND_FLOOR'}, ...
        'ImplementationName',       'myFixptAdd_binarypoint', ...
        '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',    'BinaryPoint', ...
         'IsSigned',   false, ...
         'WordLength', 32);
    
    createAndAddConceptualArg(hEntry, 'RTW.TflArgNumeric', ...
          'Name',       'u1', ...
          'IOType',     'RTW_IO_INPUT', ...
          'CheckSlope', false, ...
          'CheckBias',  false, ...
          'DataType',   'Fixed', ...
          'Scaling',    'BinaryPoint', ...
          'IsSigned',   false, ...
          'WordLength', 32);
    
    createAndAddConceptualArg(hEntry, 'RTW.TflArgNumeric', ...
           'Name',       'u2', ...
           'IOType',     'RTW_IO_INPUT', ...
           'CheckSlope', false, ...
           'CheckBias',  false, ...
           'DataType',   'Fixed', ...
           'Scaling',    'BinaryPoint', ...
           '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.
    createAndAddImplementationArg(hEntry, 'RTW.TflArgNumericConstant', ...
        'Name',       'fl_in1', ...
        'IOType',     'RTW_IO_INPUT', ...
        'IsSigned',   false, ...
        'WordLength', 32, ...
        'FractionLength', 0, ...
        'Value',       0);
    
    createAndAddImplementationArg(hEntry, 'RTW.TflArgNumericConstant', ...
        'Name',       'fl_in2', ...
        'IOType',     'RTW_IO_INPUT', ...
        'IsSigned',   false, ...
        'WordLength', 32, ...
        'FractionLength', 0, ...
        'Value',       0);
    
    createAndAddImplementationArg(hEntry, 'RTW.TflArgNumericConstant', ...
        'Name',       'fl_out', ...
        'IOType',     'RTW_IO_INPUT', ...
        'IsSigned',   false, ...
        'WordLength', 32, ...
        'FractionLength', 0, ...
        'Value',       0);
    
    
    
    %% Add the entry to the table
    hTable.addEntry(op_entry);
  7. Укажите информацию сборки. В параметрах записи задайте файлы (заголовок, источник, объект), в котором генератор кода нужен для замены кода. В данном примере создайте информацию, не требуется.

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

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

    function rtwTargetInfo(cm)
     
    cm.registerTargetInfo(@loc_register_crl);
    end
     
    function this = loc_register_crl 
     
    this(1) = RTW.TflRegistry; 
    this(1).Name = 'CRL for binary point scaling CRL’;
    this(1).TableList = {'crl_table_fixed_binptscale.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 и проверьте, что таблица и запись правильно заданы. Для получения дополнительной информации смотрите, Проверяют Заменяющую Библиотеку Кода. Сконфигурируйте свою модель, чтобы пользоваться заменяющей библиотекой кода, сгенерировать код и проверить, что замена происходит как ожидалось. Если неожиданное поведение происходит, исследуйте журналы удачи и неудачи, чтобы диагностировать проблемы.

Похожие темы