Переключите левые операции и замену кода

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

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

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

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

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

    op_entry = RTW.TflCOperationEntry;
    
  4. Установите параметры записи оператора с вызовом setTflCOperationEntryParameters функция. Параметры задают тип операции как оставленный сдвиг и имя заменяющей функции как my_shift_left.

    setTflCOperationEntryParameters(op_entry, ...
        'Key',                      'RTW_OP_SL', ...
        'Priority',                 50, ...
        'ImplementationName',       'my_shift_left', ...
        'ImplementationHeaderFile', 'some_hdr.h', ...
        'ImplementationSourceFile', 'some_hdr.c');
  5. Создайте int16 аргумент в качестве концептуального аргумента y1 и возвращаемое значение реализации. Существует несколько способов настроить концептуальные аргументы и аргументы реализации. Этот пример использует вызовы getTflArgFromString и addConceptualArg функции, чтобы создать концептуальный аргумент и добавить его в запись. Удобный метод setReturn задает аргумент как возвращаемое значение реализации.

    arg = getTflArgFromString(hTable, 'y1', 'int16');
    arg.IOType = 'RTW_IO_OUTPUT';
    addConceptualArg(op_entry, arg);
    op_entry.Implementation.setReturn(arg);
  6. Создайте int16 аргумент как концептуальные и аргумент u1 реализации. Этот пример использует вызовы getTflArgFromString и addConceptualArg функции, чтобы создать концептуальный аргумент и добавить его в запись. Удобный метод addArgument задает аргумент как входной параметр реализации.

    arg = getTflArgFromString(hTable, 'u1', 'int16');
    addConceptualArg(op_entry, arg);
    op_entry.Implementation.addArgument(arg);
    
  7. Создайте int8 аргумент как концептуальные и аргумент u2 реализации. Этот пример использует вызовы getTflArgFromString и addConceptualArg функции, чтобы создать концептуальный аргумент и добавить его в запись. Этот аргумент задает количество битов, чтобы переключить предыдущий входной параметр. Поскольку тип аргумента не релевантен, пример отключает проверяющий типа, устанавливающий CheckType свойство к false. Удобный метод addArgument задает аргумент как входной параметр реализации.

    arg = getTflArgFromString(hTable, 'u2', 'int8');
    arg.CheckType = false;
    addConceptualArg(op_entry, arg);
    op_entry.Implementation.addArgument(arg);
  • Функциональный getTflArgFromString называется, чтобы создать int8 входной параметр. Этот аргумент добавляется к записи оператора и в качестве третьего концептуального аргумента и в качестве второго входного параметра реализации.

  • Добавьте запись в заменяющую таблицу кода с вызовом addEntry функция.

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

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

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

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

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

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

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

    InFL = 2;
    InWL = 16;
    InSgn = true;
    OutFL = 4;
    OutWL = 32;
    OutSgn = true;
    setTflCOperationEntryParameters(op_entry, ...
       'Key',                       'RTW_OP_SL', ...
       'Priority',                  50, ...
       'SaturationMode',            'RTW_SATURATE_ON_OVERFLOW', ...
       'RoundingModes',             {'RTW_ROUND_FLOOR'}, ...
       'NetSlopeAdjustmentFactor',  1.0, ...
       'NetFixedExponent',          (OutFL - InFL),...
       'ImplementationName',        'my_fxp_shift_left', ...
       'ImplementationHeaderFile',  'some_hdr.h', ...
       'ImplementationSourceFile',  'some_hdr.c');
  5. Создайте концептуальные аргументы y1 и u1. Существует несколько способов настроить концептуальные аргументы. Этот пример использует вызовы createAndAddConceptualArg функция, чтобы создать и добавить аргумент с одним вызовом функции. Каждый аргумент задан как фиксированная точка и подписан. Каждый аргумент указывает, что заменяющая обработка запросов кода не проверяет на точное совпадение наклону сайта вызова и смещает значения.

    createAndAddConceptualArg(op_entry, 'RTW.TflArgNumeric', ...
        'Name',         'y1', ...
        'IOType',       'RTW_IO_OUTPUT', ...
        'CheckSlope',   false, ...
        'CheckBias',    false, ...
        'DataTypeMode', 'Fixed-point: binary point scaling', ...
        'IsSigned',     OutSgn, ...
        'WordLength',   OutWL, ...
        'FractionLength',OutFL);
    
    createAndAddConceptualArg(op_entry, 'RTW.TflArgNumeric', ...
        'Name',         'u1', ...
        'IOType',       'RTW_IO_INPUT', ...
        'CheckSlope',   false, ...
        'CheckBias',    false, ...
        'DataTypeMode', 'Fixed-point: binary point scaling', ...
        'IsSigned',     InSgn, ...
        'WordLength',   InWL, ...
        'FractionLength',InFL);
  6. Создайте аргументы реализации. Существует несколько способов настроить аргументы реализации. Этот пример использует вызовы createAndSetCImplementationReturn и createAndAddImplementationArg функции, чтобы создать и добавить аргументы реализации в запись. Аргументы реализации должны описать основные типы числовых данных (не типы данных с фиксированной точкой).

    createAndSetCImplementationReturn(op_entry, 'RTW.TflArgNumeric', ...
        'Name',           'y1', ...
        'IOType',         'RTW_IO_OUTPUT', ...
        'IsSigned',       OutSgn, ...
        'WordLength',     OutWL, ...
        'FractionLength', 0);
    
    createAndAddImplementationArg(op_entry, 'RTW.TflArgNumeric', ...
         'Name',           'u1', ...
         'IOType',         'RTW_IO_INPUT', ...
         'IsSigned',       InSgn, ...
         'WordLength',     InWL, ...
         'FractionLength', 0);
  7. Создайте int8 аргумент как концептуальные и аргумент u2 реализации. Этот пример использует вызовы getTflArgFromString и addConceptualArg функции, чтобы создать концептуальный аргумент и добавить его в запись. Этот аргумент задает количество битов, чтобы переключить предыдущий входной параметр. Поскольку тип аргумента не релевантен, введите проверку, отключен путем установки CheckType свойство к false. Удобный метод addArgument задает аргумент как входной параметр реализации.

    arg = getTflArgFromString(hTable, 'u2', 'uint8');
    arg.CheckType = false;
    addConceptualArg(op_entry, arg);
    op_entry.Implementation.addArgument(arg);
    
  8. Добавьте запись в заменяющую таблицу кода с вызовом addEntry функция.

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

Похожие темы