Во время процесса сборки, использования генератора кода:
Задайте критерии соответствия, чтобы идентифицировать функции и операторы, для которых специализированные реализации заменяют реализации по умолчанию.
Задайте заменяющие подписи функции.
Возможно, что задает критерии соответствия, и предварительно установленные заменяющие подписи функции не полностью соответствуют вашей функции и заменяющим потребностям оператора. Например:
Вы хотите заменить оператор на конкретную функцию реализации фиксированной точки только, когда дробные длины в конкретной области значений.
Когда соответствие происходит, вы хотите изменить свою заменяющую подпись функции на основе информации о времени компиляции, такой как передающие значения дробной длины в функцию.
Чтобы добавить дополнительную логику в заменяющий процесс соответствия и замены кода, создайте заменяющие записи таблицы пользовательского кода. С пользовательскими записями можно задать дополнительные критерии соответствия и изменить заменяющую подпись функции, чтобы удовлетворить потребности приложения.
Создать заменяющую запись пользовательского кода:
Создайте заменяющий класс записи пользовательского кода, выведенный из RTW.TflCFunctionEntryML (for function replacement) or RTW.TflCOperationEntryML
(для замены оператора).
В вашем производном классе реализуйте a do_match
метод с фиксированной предварительно установленной подписью как функция MATLAB®. В вашем do_match
метод, обеспечьте или или обе из следующих индивидуальных настроек, которые инстанцируют класса:
Добавьте критерии соответствия, которые не обеспечивает базовый класс. Базовый класс обеспечивает соответствие на основе:
Номер аргумента
Имя аргумента
Со знаком
Размер Word
Наклон (если не заданный с подстановочными знаками)
Смещение (если не заданный с подстановочными знаками)
Математические режимы, такие как насыщение и округление
Оператор или функциональная клавиша
Измените подпись реализации путем добавления дополнительных аргументов или устанавливания постоянных значений входного параметра. Можно ввести постоянное значение, такое как входное значение масштабирования, в качестве дополнительного аргумента к заменяющей функции.
Создайте заменяющие записи кода, которые инстанцируют пользовательского класса записи.
Укажите библиотеку, содержащую заменяющую таблицу кода, которая включает ваши записи.
Во время генерации кода заменяющий процесс соответствия кода пытается совпадать с функцией или сайтами вызова оператора с базовым классом вашего выведенного класса записи. Если процесс находит соответствие, программное обеспечение вызывает ваш do_match
метод, чтобы выполнить вашу дополнительную логику соответствия (если таковые имеются) и ваши заменяющие индивидуальные настройки функции (если таковые имеются).
В этом примере показано, как использовать заменяющие записи таблицы пользовательского кода, чтобы совершенствовать логику соответствия и замены для функций. Пример показывает как:
Измените замену синусоидальной функции, только если целочисленный размер на текущей целевой платформе составляет 32 бита.
Измените замену, таким образом, что реализация функционирует передачи во флаге степеней по сравнению с радианами как входной параметр.
Чтобы осуществить записи таблицы, которые вы создаете в этом примере, создайте основанную на ERT модель с блоком синусоидальной функции. Например:
В параметрах блоков Inport, набор Data type сигнала к double
. Если значение выбрало для Configuration Parameters> Hardware Implementation>, Device type поддерживает целочисленный размер кроме 32, выполнить одно из следующих действий:
Выберите временную целевую платформу с 32-битным целочисленным размером.
Измените код, чтобы совпадать с целочисленным размером вашей целевой платформы.
Создайте класс, например, TflCustomFunctionEntry
, это выведено из базового класса RTW.TflCFunctionEntryML
. Производный класс задает do_match
метод с подписью:
function ent = do_match(hThis, ... hCSO, ... targetBitPerChar, ... targetBitPerShort, ... targetBitPerInt, ... targetBitPerLong, ... targetBitPerLongLong)
В do_match
подпись:
ent
указатель возврата, который возвращен любой как пустой (указание, что соответствие перестало работать), или как TflCFunctionEntry
указатель.
hThis
указатель на экземпляр класса.
hCSO
указатель на объект, который генератор кода создает для запроса библиотеки для замены.
Остающиеся аргументы являются количеством битов для различных типов данных текущей цели.
do_match
метод:
Добавляют требуемые дополнительные критерии соответствия, которые не обеспечивает базовый класс.
Делает требуемые модификации к подписи реализации.
В этом случае, do_match
метод должен совпадать только с targetBitPerInt
, представление количества битов в int
C тип данных для текущей цели, к значению 32. Если генератор кода находит соответствие, метод устанавливает указатель возврата и создает и добавляет входной параметр. Входной параметр представляет, описываются ли модули как степени или радианы к заменяющей подписи функции.
В качестве альтернативы создайте и добавьте дополнительный аргумент функции реализации для передачи модульного флага в каждом заменяющем табличном файле определения кода, который инстанцирует этого класса. В этом случае этот код определения класса не создает аргумент. То, что кодовые наборы только значение аргумента. Для примера создания и добавления дополнительных аргументов функции реализации в табличном файле определения, смотрите, Настраивают Соответствие Кода и Замену для Скалярных Операций.
classdef TflCustomFunctionEntry < RTW.TflCFunctionEntryML 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 will check additional data and perhaps modify % the implementation function. ent = []; % default the return to empty, indicating the match failed. % Match sine function only if the target int size is 32 bits if targetBitPerInt == 32 % Need to modify the default implementation, starting from a copy % of the standard TflCFunctionEntry. ent = RTW.TflCFunctionEntry(hThis); % If the target int size is 32 bits, the implementation function % takes an additional input flag argument indicating degress vs. % radians. The additional argument can be created and added either % in the CRL table definition file that instantiates this class, or % here in the class definition, as follows: createAndAddImplementationArg(ent, 'RTW.TflArgNumericConstant', ... 'Name', 'u2', ... 'IsSigned', true, ... 'WordLength', 32, ... 'FractionLength', 0, ... 'Value', 1); end end end end
Выйдите из папки класса и возвратитесь к предыдущей рабочей папке.
Создайте и сохраните следующий заменяющий табличный файл определения кода, crl_table_custom_sinfcn_double.m
. Этот файл задает заменяющую таблицу кода, которая содержит функциональную запись таблицы для синуса с double
ввод и вывод. Эта запись инстанцирует производного класса от предыдущего шага, TflCustomFunctionEntry
.
function hTable = crl_table_custom_sinfcn_double hTable = RTW.TflTable; %% Add TflCustomFunctionEntry fcn_entry = TflCustomFunctionEntry; setTflCFunctionEntryParameters(fcn_entry, ... 'Key', 'sin', ... 'Priority', 30, ... 'ImplementationName', 'mySin', ... 'ImplementationHeaderFile', 'mySin.h', ... 'ImplementationSourceFile', 'mySin.c'); createAndAddConceptualArg(fcn_entry, 'RTW.TflArgNumeric', ... 'Name', 'y1', ... 'IOType', 'RTW_IO_OUTPUT', ... 'DataTypeMode', 'double'); createAndAddConceptualArg(fcn_entry, 'RTW.TflArgNumeric', ... 'Name', 'u1', ... 'IOType', 'RTW_IO_INPUT', ... 'DataTypeMode', 'double'); % TflCustomFunctionEntry class do_match method will create and add % an implementation function argument during code generation if % the supported integer size on the current target is 32 bits. copyConceptualArgsToImplementation(fcn_entry); addEntry(hTable, fcn_entry);
Проверяйте валидность заменяющей записи таблицы кода.
В командной строке вызовите табличный файл определения.
tbl = crl_table_custom_sinfcn_double
В Заменяющем Средстве просмотра Кода просмотрите табличный файл определения.
crviewer(crl_table_custom_sinfcn_double)
В этом примере показано, как создать заменяющие записи пользовательского кода, которые добавляют логику в процесс соответствия и замены кода для нескалярной операции. Пользовательские записи задают дополнительные критерии соответствия или изменяют заменяющую подпись функции, чтобы удовлетворить потребности приложения.
Этот пример ограничивает критерии соответствия поэлементной замены умножения к записям с определенной областью значений размерности. Когда соответствие происходит, пользовательское do_match
метод изменяет заменяющую подпись, чтобы передать число элементов в функцию.
Файлы для разработки и тестирования этого заменяющего примера библиотеки кода доступны в matlab/help/toolbox/ecoder/examples/code_replacement/custom_elemmult
:
do_match
метод — @MyElemMultEntry/MyElemMultEntry.m
Заменяющий источник функции и заголовочные файлы — src/myMulImplLib.c
и src/myMulImplLib.h
Модель — myElemMul.slx
Заменяющее табличное определение кода — myElemMultCrlTable.m
Регистрационный файл — rtwTargetInfo.m
Чтобы создать заменяющие записи пользовательского кода, которые добавляют логику в заменяющий процесс соответствия и замены кода:
Создайте класс, например, MyElemMultEntry
, который выведен из базового класса RTW.TflCOperationEntryML
. Производный класс задает a do_match
метод со следующей подписью:
function ent = do_match(hThis, ... hCSO, ... targetBitPerChar, ... targetBitPerShort, ... targetBitPerInt, ... targetBitPerLong, ... targetBitPerLongLong)
В do_match
подпись:
ent
указатель возврата, который возвращен как пустой (указание, что соответствие перестало работать), или как TflCOperationEntry
указатель.
hThis
указатель на выведенный экземпляр.
hCSO
указатель на объект, который генератор кода создает для запроса библиотеки для замены.
Остающиеся аргументы являются количеством битов для различных типов данных текущей цели.
do_match
метод:
Добавляют критерии соответствия, которые не обеспечивает базовый класс.
Вносит изменения в подпись реализации.
do_match
метод использует базовый класс для проверки области значений размерности и типы данных. Если генератор кода находит соответствие, do_match
:
Устанавливает указатель возврата.
Использует концептуальные аргументы, чтобы вычислить число элементов в массиве. В заменяющей возвращенной записи, устанавливает значение постоянного аргумента реализации как число элементов массива.
Обновляет заменяющую запись кода, таким образом, что она совпадает с CSOs, которые имеют те же размерности аргумента.
classdef MyElemMultEntry < RTW.TflCOperationEntryML methods function obj = MyElemMultEntry(varargin) mlock; obj@RTW.TflCOperationEntryML(varargin{:}); end function ent = do_match(hThis, ... hCSO, ... %#ok targetBitPerChar, ... %#ok targetBitPerShort, ... %#ok targetBitPerInt, ... %#ok targetBitPerLong, ... %#ok targetBitPerLongLong ) %#ok % Fourth implementation arg represents number of elements for producing matches. assert(strcmp(hThis.Implementation.Arguments(4).Name,'numElements')); ent = RTW.TflCOperationEntry(hThis); % Calculate number of elements and set value of injected constant. ent.Implementation.Arguments(4).Value = prod(hCSO.ConceptualArgs(1).DimRange(1,:)); % Since implementation has been modified for specific DimRange, update % returned entry to match similar CSOs only. for idx =1:3 ent.ConceptualArgs(idx).DimRange = hCSO.ConceptualArgs(idx).DimRange; end end end end
Создайте и сохраните следующий заменяющий табличный файл определения кода, myElemMultCrlTable.m
. Этот файл задает заменяющую таблицу кода, которая содержит генератор записи оператора для поэлементного умножения. Запись таблицы:
Инстанцирует производного класса myElemMultEntry
от предыдущего шага.
Устанавливает параметры записи оператора с вызовом setTflCOperationEntryParameters
функция.
Создает концептуальные аргументы y1
, u1
, и u2
. Класс аргумента RTW.TflArgMatrix
задает матричные аргументы, чтобы соответствовать. Эти три аргумента настраиваются, чтобы совпадать с 2-мерными матрицами по крайней мере двум элементам в каждой размерности.
Вызывает getTflArgFromString
функция, чтобы создать возвращаемое значение и четыре аргумента реализации. Аргументы u1
и u2
операнды, y1
продукт, и четвертый аргумент является числом элементов.
В качестве альтернативы do_match
метод производного класса myElemMultEntry
может создать и добавить аргументы реализации. Когда количество дополнительных требуемых аргументов реализации сможет варьироваться на основе информации о времени компиляции, используйте альтернативный подход.
Вызовы addEntry
добавить запись в заменяющую таблицу кода.
function hLib = myElemMultCrlTable libPath = fullfile(fileparts(which(mfilename)),'src'); hLib = RTW.TflTable; %---------- entry: RTW_OP_ELEM_MUL ----------- hEnt = MyElemMultEntry; hEnt.setTflCOperationEntryParameters( ... 'Key', 'RTW_OP_ELEM_MUL', ... 'Priority', 100, ... 'SaturationMode', 'RTW_WRAP_ON_OVERFLOW', ... 'ImplementationName', 'myElemMul_s32', ... 'ImplementationSourceFile', 'myMulImplLib.c', ... 'ImplementationSourcePath', libPath, ... 'ImplementationHeaderFile', 'myMulImplLib.h', ... 'ImplementationHeaderPath', libPath, ... 'SideEffects', true, ... 'GenCallback','RTW.copyFileToBuildDir'); % Conceptual Args arg = RTW.TflArgMatrix('y1', 'RTW_IO_OUTPUT', 'int32'); arg.DimRange = [2 2; Inf Inf]; hEnt.addConceptualArg(arg); arg = RTW.TflArgMatrix('u1', 'RTW_IO_INPUT', 'int32'); arg.DimRange = [2 2; Inf Inf]; hEnt.addConceptualArg(arg); arg = RTW.TflArgMatrix('u2', 'RTW_IO_INPUT', 'int32'); arg.DimRange = [2 2; Inf Inf]; hEnt.addConceptualArg(arg); % Implementation Args arg = hEnt.getTflArgFromString('unused','void'); arg.IOType = 'RTW_IO_OUTPUT'; hEnt.Implementation.setReturn(arg); arg = hEnt.getTflArgFromString('u1','int32*'); hEnt.Implementation.addArgument(arg); arg = hEnt.getTflArgFromString('u2','int32*'); hEnt.Implementation.addArgument(arg); arg = hEnt.getTflArgFromString('y1','int32*'); arg.IOType = 'RTW_IO_OUTPUT'; hEnt.Implementation.addArgument(arg); arg = hEnt.getTflArgFromString('numElements','uint32',0); hEnt.Implementation.addArgument(arg); hLib.addEntry( hEnt );
Проверяйте валидность заменяющей записи таблицы кода.
В командной строке вызовите табличный файл определения.
tbl = myElemMultCrlTable
В Заменяющем Средстве просмотра Кода просмотрите табличный файл определения.
crviewer(myElemMultCrlTable)
В этом примере показано, как создать заменяющие записи пользовательского кода, которые добавляют логику в процесс соответствия и замены кода для скалярной операции. Пользовательские записи задают дополнительные критерии соответствия или изменяют заменяющую подпись функции, чтобы удовлетворить потребности приложения.
Например:
Когда дробные длины в определенной области значений, заменяют оператор на функцию реализации фиксированной точки.
Когда соответствие произойдет, измените заменяющую подпись функции на основе информации о времени компиляции, такой как передающие значения дробной длины в функцию.
Этот пример изменяет замену сложения фиксированной точки, таким образом, что реализация функционирует передачи в дробных длинах типов входных и выходных данных в качестве аргументов.
Чтобы создать заменяющие записи пользовательского кода, которые добавляют логику в заменяющий процесс соответствия и замены кода:
Создайте класс, например, TflCustomOperationEntry
, это выведено из базового класса RTW.TflCOperationEntryML
. Производный класс задает a do_match
метод со следующей подписью:
function ent = do_match(hThis, ... hCSO, ... targetBitPerChar, ... targetBitPerShort, ... targetBitPerInt, ... targetBitPerLong, ... targetBitPerLongLong)
В do_match
подпись:
ent
указатель возврата, который возвращен как пустой (указание, что соответствие перестало работать), или как TflCOperationEntry
указатель.
hThis
указатель на экземпляр класса.
hCSO
указатель на объект, который генератор кода создает для запроса библиотеки для замены.
Остающиеся аргументы являются количеством битов для различных типов данных текущей цели.
do_match
метод добавляет критерии соответствия, которые не обеспечивает базовый класс. Метод делает модификации к подписи реализации. В этом случае, do_match
метод использует базовый класс для проверки размера слова и со знаком. do_match
должен совпадать только с количеством концептуальных аргументов к значению 3 (два входных параметров и один выход) и смещение для каждого аргумента, чтобы оценить 0. Если генератор кода находит соответствие, do_match
:
Устанавливает указатель возврата.
Удаляет наклон, и подстановочные знаки смещения от концептуальных аргументов (соответствие для определенного наклона и значений смещения).
Значения дробной длины записей для входных параметров и выхода в заменяющие аргументы функции 3, 4, и 5.
Можно создать и добавить три дополнительных аргумента функции реализации для передачи дробных длин в определении класса или в каждом заменяющем определении записи кода, которое инстанцирует этого класса. Этот пример создает аргументы, добавляет их в заменяющий табличный файл определения кода и устанавливает их на определенные значения в коде определения класса.
classdef TflCustomOperationEntry < 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
Выйдите из папки класса и возвратитесь к предыдущей рабочей папке.
Создайте и сохраните следующий заменяющий табличный файл определения кода, crl_table_custom_add_ufix32.m
. Этот файл задает заменяющую таблицу кода, которая содержит одну запись оператора, генератор записи для 32-битных операций сложения фиксированной точки без знака, с произвольными значениями дробной длины на входных параметрах и выходе. Запись таблицы:
Инстанцирует производного класса TflCustomOperationEntry
от предыдущего шага. Если вы хотите заменить размеры слова и атрибуты со знаком, можно использовать тот же производный класс, но не ту же запись, потому что вы не можете использовать подстановочный знак с WordLength
и IsSigned
аргументы. Например, чтобы поддержать uint8
int8
uint16
int16
, и int32
, добавьте пять других отличных записей. Чтобы использовать различные функции реализации для насыщения и округления режимов кроме переполнения и вокруг на пол, добавьте записи для тех сочетаний соответствия.
Устанавливает параметры записи оператора с вызовом setTflCOperationEntryParameters
функция.
Вызывает createAndAddConceptualArg
функция, чтобы создать концептуальные аргументы y1
, u1
, и u2
.
Вызовы createAndSetCImplementationReturn
и createAndAddImplementationArg
задавать подпись для заменяющей функции. Три из вызовов createAndAddImplementationArg
создайте аргументы реализации, чтобы содержать значения дробной длины для входных параметров и вывести. В качестве альтернативы запись может не использовать те определения аргумента. Вместо этого do_match
метод производного класса TflCustomOperationEntry
может создать и добавить три аргумента реализации. Когда количество дополнительных требуемых аргументов реализации сможет варьироваться на основе информации о времени компиляции, используйте альтернативный подход.
Вызовы addEntry
добавить запись в заменяющую таблицу кода.
function hTable = crl_table_custom_add_ufix32 hTable = RTW.TflTable; % Add TflCustomOperationEntry op_entry = TflCustomOperationEntry; setTflCOperationEntryParameters(op_entry, ... 'Key', 'RTW_OP_ADD', ... 'Priority', 30, ... 'SaturationMode', 'RTW_SATURATE_ON_OVERFLOW', ... 'RoundingModes', {'RTW_ROUND_FLOOR'}, ... 'ImplementationName', 'myFixptAdd', ... 'ImplementationHeaderFile', 'myFixptAdd.h', ... 'ImplementationSourceFile', 'myFixptAdd.c'); createAndAddConceptualArg(op_entry, 'RTW.TflArgNumeric', ... 'Name', 'y1', ... 'IOType', 'RTW_IO_OUTPUT', ... 'CheckSlope', false, ... 'CheckBias', false, ... 'DataType', 'Fixed', ... 'Scaling', 'BinaryPoint', ... 'IsSigned', false, ... 'WordLength', 32); createAndAddConceptualArg(op_entry, 'RTW.TflArgNumeric', ... 'Name', 'u1', ... 'IOType', 'RTW_IO_INPUT', ... 'CheckSlope', false, ... 'CheckBias', false, ... 'DataType', 'Fixed', ... 'Scaling', 'BinaryPoint', ... 'IsSigned', false, ... 'WordLength', 32); createAndAddConceptualArg(op_entry, 'RTW.TflArgNumeric', ... 'Name', 'u2', ... 'IOType', 'RTW_IO_INPUT', ... 'CheckSlope', false, ... 'CheckBias', false, ... 'DataType', 'Fixed', ... 'Scaling', 'BinaryPoint', ... 'IsSigned', false, ... 'WordLength', 32); % Specify replacement function signature createAndSetCImplementationReturn(op_entry, 'RTW.TflArgNumeric', ... 'Name', 'y1', ... 'IOType', 'RTW_IO_OUTPUT', ... 'IsSigned', false, ... 'WordLength', 32, ... 'FractionLength', 0); createAndAddImplementationArg(op_entry, 'RTW.TflArgNumeric', ... 'Name', 'u1', ... 'IOType', 'RTW_IO_INPUT', ... 'IsSigned', false, ... 'WordLength', 32, ... 'FractionLength', 0); createAndAddImplementationArg(op_entry, '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(op_entry, 'RTW.TflArgNumericConstant', ... 'Name', 'fl_in1', ... 'IOType', 'RTW_IO_INPUT', ... 'IsSigned', false, ... 'WordLength', 32, ... 'FractionLength', 0, ... 'Value', 0); createAndAddImplementationArg(op_entry, 'RTW.TflArgNumericConstant', ... 'Name', 'fl_in2', ... 'IOType', 'RTW_IO_INPUT', ... 'IsSigned', false, ... 'WordLength', 32, ... 'FractionLength', 0, ... 'Value', 0); createAndAddImplementationArg(op_entry, 'RTW.TflArgNumericConstant', ... 'Name', 'fl_out', ... 'IOType', 'RTW_IO_INPUT', ... 'IsSigned', false, ... 'WordLength', 32, ... 'FractionLength', 0, ... 'Value', 0); addEntry(hTable, op_entry);
Проверяйте валидность записи оператора.
В командной строке вызовите табличный файл определения.
tbl = crl_table_custom_add_ufix32
В Заменяющем Средстве просмотра Кода просмотрите табличный файл определения.
crviewer(crl_table_custom_add_ufix32)