Можно задать заменяющие записи кода для операций на типах данных с фиксированной точкой как соответствие с сетевым наклоном между входными параметрами оператора и вывести. Сетевые наклонные записи могут сопоставить область значений наклона и сместить значения к заменяющей функции для умножения или деления.
Этот пример создает заменяющую запись кода для деления типов данных с фиксированной точкой, использование переносятся на режиме насыщения переполнения и сетевом наклоне. Пример задает функцию, сопоставляющую программно. В качестве альтернативы можно использовать Code Replacement Tool, чтобы задать то же отображение.
Создайте табличный файл определения, который содержит функциональное определение. Например:
function hTable = crl_table_fixed_netslopesaturate
В теле функции составьте таблицу путем вызова функционального RTW.TflTable
.
hTable = RTW.TflTable;
Создайте запись для отображения оператора с вызовом 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;
Установите параметры записи оператора с вызовом setTflCOperationEntryParameters
функция. Параметры задают тип операции как деление, режим насыщения, как переносятся на переполнении, округляя режимы, столь же незаданные, и имя заменяющей функции как user_div_*
. NetSlopeAdjustmentFactor
и NetFixedExponent
задайте F
и E
части сетевого наклонного
.F
2E
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']);
Создайте концептуальные аргументы 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);
Создайте аргументы реализации. Существует несколько способов настроить аргументы реализации. Этот пример использует вызовы 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);
Добавьте запись в заменяющую таблицу кода с вызовом addEntry
функция.
addEntry(hTable, op_entry);
Задайте функции, которые определяют размер слова типа данных.
%------------------------------------------------------------- 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);
Сохраните табличный файл определения. Используйте имя табличной функции определения, чтобы назвать файл.
Можно задать заменяющие записи кода для умножения и операций деления на типах данных с фиксированной точкой, таким образом, что они совпадают с сетевым наклоном между входными параметрами оператора и выводят. Сетевые наклонные записи могут сопоставить область значений наклона и сместить значения к заменяющей функции для умножения или деления.
Этот пример создает заменяющую запись кода для деления типов данных с фиксированной точкой, с помощью режима округления потолка и сетевого наклонного масштабного коэффициента. Пример задает функцию, сопоставляющую программно. В качестве альтернативы можно использовать Code Replacement Tool, чтобы задать то же отображение.
Создайте табличный файл определения, который содержит функциональное определение. Например:
function hTable = crl_table_fixed_netsloperound
В теле функции составьте таблицу путем вызова функционального RTW.TflTable
.
hTable = RTW.TflTable;
Создайте запись для отображения оператора с вызовом RTW.TflCOperationEntryGenerator_Netslope
функция, которая обеспечивает доступ к параметрам фиксированной точки NetSlopeAdjustmentFactor
и NetFixedExponent
.
op_entry = RTW.TflCOperationEntryGenerator_NetSlope;
Установите параметры записи оператора с вызовом setTflCOperationEntryParameters
функция. Параметры задают тип операции как деление, режим насыщения как насыщение прочь, округляя режимы, столь же круглые к потолку и имени заменяющей функции как s16_div_s16_s16
. NetSlopeAdjustmentFactor
и NetFixedExponent
задайте F
и E
части относительного масштабного коэффициента
.F
2E
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');
Создайте концептуальные аргументы 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);
Создайте аргументы реализации. Существует несколько способов настроить аргументы реализации. Этот пример использует вызовы 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);
Добавьте запись в заменяющую таблицу кода с вызовом addEntry
функция.
addEntry(hTable, op_entry);
Сохраните табличный файл определения. Используйте имя табличной функции определения, чтобы назвать файл.
Протестировать этот пример:
Укажите заменяющее отображение кода.
Создайте модель.
Для этой модели:
Установите 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
.
Сконфигурируйте модель со следующими настройками:
На панели Solver выберите фиксированный шаг, дискретный решатель.
На панели Code Generation выберите ERT-based system target file.
На Code Generation> панель Interface, выберите заменяющую библиотеку кода, которая содержит вашу запись операции сложения.
Сгенерируйте код и отчет генерации кода.
Рассмотрите замены кода.