Сетевой наклон, масштабирующий замену кода

Умножение и деление с насыщением

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

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

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

    function hTable = crl_table_fixed_netslopesaturate
    
  2. В теле функции составьте таблицу путем вызова функционального RTW.TflTable.

    hTable = RTW.TflTable;
    
  3. Создайте запись для отображения оператора с вызовом функции RTW.TflCOperationEntryGenerator_Netslope, которая обеспечивает доступ к параметрам фиксированной точки NetSlopeAdjustmentFactor и NetFixedExponent.

    wv = [16,32];
    for iy = 1:2
      for inum = 1:2
        for iden = 1:2
          hTable = getDivOpEntry(hTable, ...
             fixdt(1,wv(iy)),fixdt(1,wv(inum)),fixdt(1,wv(iden)));
        end
      end
    end
    
    
    %---------------------------------------------------------
    function hTable = getDivOpEntry(hTable,dty,dtnum,dtden)
    %---------------------------------------------------------
    % Create an entry for division of fixed-point data types where
    % arguments are specified using Slope and Bias scaling
    % Saturation on, Rounding unspecified
    
    funcStr = sprintf('user_div_%s_%s_%s',...
            typeStrFunc(dty),...
            typeStrFunc(dtnum),...
            typeStrFunc(dtden));
    
    op_entry = RTW.TflCOperationEntryGenerator_NetSlope;
    
  4. Установите параметры записи оператора с вызовом функции setTflCOperationEntryParameters. Параметры задают тип операции как деление, режим насыщения, как переносятся на переполнении, округляя режимы, столь же незаданные, и имя заменяющей функции как user_div_*. NetSlopeAdjustmentFactor и NetFixedExponent задают F и части E сетевого наклонного F2E.

    setTflCOperationEntryParameters(op_entry, ...
       'Key',                      'RTW_OP_DIV', ...
       'Priority',                 90, ...
       'SaturationMode',           'RTW_WRAP_ON_OVERFLOW',...
       'RoundingModes',            {'RTW_ROUND_UNSPECIFIED'},...
       'NetSlopeAdjustmentFactor', 1.0, ...
       'NetFixedExponent',         0.0, ...
       'ImplementationName',       funcStr, ...
       'ImplementationHeaderFile', [funcStr,'.h'], ...
       'ImplementationSourceFile', [funcStr,'.c']);
  5. Создайте концептуальные аргументы y1, u1 и u2. Существует несколько способов настроить концептуальные аргументы. Этот пример использует вызовы функции createAndAddConceptualArg, чтобы создать и добавить аргумент с одним вызовом функции. Задайте каждый аргумент как фиксированную точку и подписанный. Кроме того, для каждого аргумента укажите, что заменяющая обработка запросов кода не проверяет на точное совпадение наклону сайта вызова и смещает значения.

    createAndAddConceptualArg(op_entry, ...
       'RTW.TflArgNumeric', ...
       'Name',           'y1',...
       'IOType',         'RTW_IO_OUTPUT',...
       'CheckSlope',     false,...
       'CheckBias',      false,...
       'DataTypeMode',   'Fixed-point: slope and bias scaling',...
       'IsSigned',       dty.Signed,...
       'WordLength',     dty.WordLength,...
       'Bias',           0);
    
    createAndAddConceptualArg(op_entry, ...
       'RTW.TflArgNumeric',...
       'Name',           'u1', ...
       'IOType',         'RTW_IO_INPUT',...
       'CheckSlope',     false,...
       'CheckBias',      false,...
       'DataTypeMode',   'Fixed-point: slope and bias scaling',...
       'IsSigned',       dtnum.Signed,...
       'WordLength',     dtnum.WordLength,...
       'Bias',           0);
    
    createAndAddConceptualArg(op_entry, ...
       'RTW.TflArgNumeric', ...
       'Name',           'u2', ...
       'IOType',         'RTW_IO_INPUT',...
       'CheckSlope',     false,...
       'CheckBias',      false,...
       'DataTypeMode',   'Fixed-point: slope and bias scaling',...
       'IsSigned',       dtden.Signed,...
       'WordLength',     dtden.WordLength,...
       'Bias',           0);
    
  6. Создайте аргументы реализации. Существует несколько способов настроить аргументы реализации. Этот пример использует вызовы функции getTflArgFromString, чтобы создать аргументы. Аргументы реализации должны описать основные типы числовых данных (не типы данных с фиксированной точкой). setReturn удобных методов и addArgument задают, является ли аргумент возвращаемым значением или аргументом. Эти методы добавляют аргумент в массив записи аргументов реализации.

    arg = getTflArgFromString(hTable, 'y1', typeStrBase(dty));
    op_entry.Implementation.setReturn(arg);
    
    arg = getTflArgFromString(hTable, 'u1', typeStrBase(dtnum));
    op_entry.Implementation.addArgument(arg);
    
    arg = getTflArgFromString(hTable, 'u2',typeStrBase(dtden));
    op_entry.Implementation.addArgument(arg);
    
  7. Добавьте запись в заменяющую таблицу кода с вызовом функции addEntry.

    addEntry(hTable, op_entry);
  8. Задайте функции, которые определяют размер слова типа данных.

    %-------------------------------------------------------------
    function str = typeStrFunc(dt)
    %-------------------------------------------------------------
    
    if dt.Signed
        sstr = 's';
    else
        sstr = 'u';
    end
    str = sprintf('%s%d',sstr,dt.WordLength);
    
    %-------------------------------------------------------------
    function str = typeStrBase(dt)
    %-------------------------------------------------------------
    
    if dt.Signed
        sstr = ;
    else
        sstr = 'u';
    end
    str = sprintf('%sint%d',sstr,dt.WordLength);
  9. Сохраните табличный файл определения. Используйте имя табличной функции определения, чтобы назвать файл.

Умножение и деление с округлением режима и дополнительных аргументов реализации

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

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

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

    function hTable = crl_table_fixed_netsloperound
    
  2. В теле функции составьте таблицу путем вызова функционального RTW.TflTable.

    hTable = RTW.TflTable;
    
  3. Создайте запись для отображения оператора с вызовом функции RTW.TflCOperationEntryGenerator_Netslope, которая обеспечивает доступ к параметрам фиксированной точки NetSlopeAdjustmentFactor и NetFixedExponent.

    op_entry = RTW.TflCOperationEntryGenerator_NetSlope;
    
  4. Установите параметры записи оператора с вызовом функции setTflCOperationEntryParameters. Параметры задают тип операции как деление, режим насыщения как насыщение прочь, округляя режимы, столь же круглые к потолку и имени заменяющей функции как s16_div_s16_s16. NetSlopeAdjustmentFactor и NetFixedExponent задают F и части E относительного масштабного коэффициента F2E.

    setTflCOperationEntryParameters(op_entry, ...
       'Key',                      'RTW_OP_DIV', ...
       'Priority',                 90, ...
       'SaturationMode',           'RTW_WRAP_ON_OVERFLOW', ...
       'RoundingModes',            {'RTW_ROUND_CEILING'}, ...
       'NetSlopeAdjustmentFactor',   1.0, ...
       'NetFixedExponent',           0.0, ...
       'ImplementationName',       's16_div_s16_s16', ...
       'ImplementationHeaderFile', 's16_div_s16_s16.h', ...
       'ImplementationSourceFile', 's16_div_s16_s16.c');
  5. Создайте концептуальные аргументы y1, u1 и u2. Существует несколько способов настроить концептуальные аргументы. Этот пример использует вызовы функции createAndAddConceptualArg, чтобы создать и добавить аргумент с одним вызовом функции. Задайте каждый аргумент как фиксированную точку, 16 битов, и подписанный. Кроме того, для каждого аргумента укажите, что заменяющая обработка запросов кода не проверяет на точное совпадение наклону сайта вызова и смещает значения.

    createAndAddConceptualArg(op_entry, 'RTW.TflArgNumeric', ...
       'Name',           'y1', ...
       'IOType',         'RTW_IO_OUTPUT', ...
       'CheckSlope',     false, ...
       'CheckBias',      false, ...
       'DataType',       'Fixed', ...
       'IsSigned',       true, ...
       'WordLength',     16);
    
    createAndAddConceptualArg(op_entry, 'RTW.TflArgNumeric', ...
       'Name',           'u1', ...
       'IOType',         'RTW_IO_INPUT', ...
       'CheckSlope',     false, ...
       'CheckBias',      false, ...
       'DataType',       'Fixed', ...
       'IsSigned',       true, ...
       'WordLength',     16);
    
    createAndAddConceptualArg(op_entry, 'RTW.TflArgNumeric', ...
       'Name',           'u2', ...
       'IOType',         'RTW_IO_INPUT', ...
       'CheckSlope',     false, ...
       'CheckBias',      false, ...
       'DataType',       'Fixed', ...
       'IsSigned',       true, ...
       'WordLength',     16);
    
  6. Создайте аргументы реализации. Существует несколько способов настроить аргументы реализации. Этот пример использует вызовы createAndSetCImplementationReturn и функций createAndAddImplementationArg, чтобы создать и добавить аргументы реализации в запись. Аргументы реализации должны описать основные типы числовых данных (не типы данных с фиксированной точкой). В этом случае выходные аргументы и входные параметры составляют 16 битов и подписались (int16).

    createAndSetCImplementationReturn(op_entry, 'RTW.TflArgNumeric', ...
                                  'Name',           'y1', ...
                                  'IOType',         'RTW_IO_OUTPUT', ...
                                  'IsSigned',       true, ...
                                  'WordLength',     16, ...
                                  'FractionLength', 0);
    
    createAndAddImplementationArg(op_entry, 'RTW.TflArgNumeric',...
                                  'Name',           'u1', ...
                                  'IOType',         'RTW_IO_INPUT', ...
                                  'IsSigned',       true, ...
                                  'WordLength',     16, ...
                                  'FractionLength', 0);
    
    createAndAddImplementationArg(op_entry, 'RTW.TflArgNumeric',...
                                  'Name',           'u2', ...
                                  'IOType',         'RTW_IO_INPUT', ...
                                  'IsSigned',       true, ...
                                  'WordLength',     16, ...
                                  'FractionLength', 0);
  7. Добавьте запись в заменяющую таблицу кода с вызовом функции addEntry.

    addEntry(hTable, op_entry);
  8. Сохраните табличный файл определения. Используйте имя табличной функции определения, чтобы назвать файл.

Протестировать этот пример:

  1. Укажите заменяющее отображение кода.

  2. Создайте модель.

  3. Для этой модели:

    • Установите Inport 1 Data type на int16.

    • Установите Inport 2 Data type на fixdt(1,16,-5).

    • В блоке Divide:

      • Установите Output data type на fixdt(1,16,-13).

      • Установите Integer rounding mode на Ceiling.

  4. Сконфигурируйте модель со следующими настройками:

    • На панели Solver выберите фиксированный шаг, дискретный решатель.

    • На панели Code Generation выберите ERT-based system target file.

    • На Code Generation> панель Interface, выберите заменяющую библиотеку кода, которая содержит вашу запись операции сложения.

  5. Сгенерируйте код и отчет генерации кода.

  6. Рассмотрите замены кода.

Похожие темы