%if EXISTS("_DTYPELIB_") == 0
%assign _DTYPELIB_ = 1
%include "autosarsup.tlc"
%include "utillib.tlc"
%include "blkio_api.tlc"
%if EXISTS("DSP32")
%assign SizeOfDouble = 4
%else
%assign SizeOfDouble = 8
%endif
%assign int32MinValue = (-2147483647 - 1)
%<LibAddToCompiledModel("SizeOfDouble", SizeOfDouble)>
%if ::CompiledModel.CGTypes.IncludeSymbolicWidth
%include "CGTypes_SymbolicWidth.tlc"
%endif
%function SLibCoderTypesBaseName() void
%return ::CompiledModel.CoderTypesInfo.BaseName
%endfunction
%function SLibCoderModelReferenceTypesBaseName() void
%return ::CompiledModel.CoderTypesInfo.ModelReferenceTypesBaseName
%endfunction
%function SLibCoderBuiltinTypeidTypesBaseName() void
%return ::CompiledModel.CoderTypesInfo.BuiltinTypeidTypesBaseName
%endfunction
%function SLibCoderMultiwordTypesBaseName() void
%return ::CompiledModel.CoderTypesInfo.MultiwordTypesBaseName
%endfunction
%function SLibCoderZerocrossingTypesBaseName() void
%return ::CompiledModel.CoderTypesInfo.ZerocrossingTypesBaseName
%endfunction
%function SLibCoderHalfTypeHdrBaseName() void
%return ::CompiledModel.CoderTypesInfo.HalfTypeHdrBaseName
%endfunction
%function SLibCoderHalfTypeSrcBaseName() void
%return ::CompiledModel.CoderTypesInfo.HalfTypeSrcBaseName
%endfunction
%function SLibCoderTypesFilename() void
%return ::CompiledModel.CoderTypesInfo.FileName
%endfunction
%function SLibCoderModelReferenceTypesFilename() void
%return ::CompiledModel.CoderTypesInfo.ModelReferenceTypesFileName
%endfunction
%function SLibCoderBuiltinTypeidTypesFilename() void
%return ::CompiledModel.CoderTypesInfo.BuiltinTypeidTypesFileName
%endfunction
%function SLibCoderMultiwordTypesFilename() void
%return ::CompiledModel.CoderTypesInfo.MultiwordTypesFileName
%endfunction
%function SLibCoderZerocrossingTypesFilename() void
%return ::CompiledModel.CoderTypesInfo.ZerocrossingTypesFileName
%endfunction
%function SLibCoderHalfTypeHdrFilename() void
%return ::CompiledModel.CoderTypesInfo.HalfTypeHdrFileName
%endfunction
%function SLibCoderHalfTypeSrcFilename() void
%return ::CompiledModel.CoderTypesInfo.HalfTypeSrcFileName
%endfunction
%function SLibCoderTypesFilePath() void
%return ::CompiledModel.CoderTypesInfo.FilePath
%endfunction
%function SLibCoderModelReferenceTypesFilePath() void
%return ::CompiledModel.CoderTypesInfo.ModelReferenceTypesFilePath
%endfunction
%function SLibCoderBuiltinTypeidTypesFilePath() void
%return ::CompiledModel.CoderTypesInfo.BuiltinTypeidTypesFilePath
%endfunction
%function SLibCoderMultiwordTypesFilePath() void
%return ::CompiledModel.CoderTypesInfo.MultiwordTypesFilePath
%endfunction
%function SLibCoderZerocrossingTypesFilePath() void
%return ::CompiledModel.CoderTypesInfo.ZerocrossingTypesFilePath
%endfunction
%function SLibCoderHalfTypeHdrFilePath() void
%return ::CompiledModel.CoderTypesInfo.HalfTypeHdrFilePath
%endfunction
%function SLibCoderHalfTypeSrcFilePath() void
%return ::CompiledModel.CoderTypesInfo.HalfTypeSrcFilePath
%endfunction
%function SLibPotentialCoderTypesBaseNames() void
%return ::CompiledModel.CoderTypesInfo.PotentialBaseNames
%endfunction
%function FcnUsedCoderTypes(coderTypesFile) void
%assign usedCoderTypesFiles = SLibUsedCoderTypesFilenames()
%foreach fIdx = SIZE(usedCoderTypesFiles, 1)
%assign usedCoderTypesFile = usedCoderTypesFiles[fIdx]
%if usedCoderTypesFile == coderTypesFile
%return TLC_TRUE
%endif
%endforeach
%return TLC_FALSE
%endfunction
%function SLibUsedMultiwordTypes() void
%return FcnUsedCoderTypes(SLibCoderMultiwordTypesFilename())
%endfunction
%function SLibUsedZerocrossingTypes() void
%return FcnUsedCoderTypes(SLibCoderZerocrossingTypesFilename())
%endfunction
%function SLibUsedHalfPrecisionTypes() void
%return FcnUsedCoderTypes(SLibCoderHalfTypeHdrFilename())
%endfunction
%function SLibUsedBuiltinTypeidTypes() void
%return FcnUsedCoderTypes(SLibCoderBuiltinTypeidTypesFilename())
%endfunction
%function SLibUsedModelReferenceTypes() void
%return FcnUsedCoderTypes(SLibCoderModelReferenceTypesFilename())
%endfunction
%function SLibUsedCoderTypesFileNames() void
%return ::CompiledModel.CoderTypesInfo.UsedFilenames
%endfunction
%function SLibUsedCoderTypesFilenames() void
%return ::CompiledModel.CoderTypesInfo.UsedFilenames
%endfunction
%function SLibUsedNumericCoderTypesFilenames() void
%return ::CompiledModel.CoderTypesInfo.UsedNumericFilenames
%endfunction
%function SLibIncludeUsedCoderTypesFilenames() void
%assign coderTypesFiles = SLibUsedCoderTypesFilenames()
%openfile buffer
%foreach fIdx = SIZE(coderTypesFiles,1)
#include "%"
%endforeach
%closefile buffer
%return buffer
%endfunction
%function SLibIncludeUsedNumericCoderTypesFilenames() void
%assign coderTypesFiles = SLibUsedNumericCoderTypesFilenames()
%openfile buffer
%foreach fIdx = SIZE(coderTypesFiles,1)
#include "%"
%endforeach
%closefile buffer
%return buffer
%endfunction
%function FcnGenerateStructElementOffsetString(offsetList) void
%assign fullOffset = ""
%assign sep = ""
%foreach idxOffset = SIZE(offsetList,0)-1
%assign fullOffset = fullOffset + sep + offsetList[idxOffset+1][0]
%assign sep = " + "
%endforeach
%assign optOffset = ISEQUAL(offsetList[0][0],0) ? "" : "%"
%if WHITE_SPACE(fullOffset)
%assign fullOffset = WHITE_SPACE(optOffset) ? "" : "%<optOffset>"
%else
%assign fullOffset = WHITE_SPACE(optOffset) ? "%<fullOffset>" : "%<fullOffset> + %<optOffset>"
%endif
%return fullOffset
%endfunction
%function SLibAssignSLStructToUserStructND(dTypeId, width, dst, srcAddr, offsetList, level, isCplx) Output
%assign dataTypeSize = LibGetDataTypeSLSizeFromId(dTypeId)
%if isCplx
%assign reOffsetList = Matrix(1,1) [0]
%assign imOffsetList = Matrix(1,1) [0]
%endif
%if ISEQUAL(width,1)==TLC_FALSE
%assign loopCounter = "i%<level>"
%assign dtName = isCplx ? LibGetDataTypeComplexNameFromId(dTypeId) : LibGetDataTypeNameFromId(dTypeId)
%assign dst = "((" + dtName + "*)" + dst + ")[%<loopCounter>]"
%if isCplx
%assign loopOffset = ISEQUAL(dataTypeSize,1) ? "2*%<loopCounter>" : "%<dataTypeSize>*(2*%<loopCounter>)"
%assign reOffsetList = offsetList + ["%<loopOffset>"]
%assign loopOffset = ISEQUAL(dataTypeSize,1) ? "2*%<loopCounter> + 1" : "%<dataTypeSize>*(2*%<loopCounter> + 1)"
%assign imOffsetList = offsetList + ["%<loopOffset>"]
%else
%assign loopOffset = ISEQUAL(dataTypeSize,1) ? "%<loopCounter>" : "%<dataTypeSize>*%<loopCounter>"
%assign offsetList = offsetList + ["%<loopOffset>"]
%endif
{
int_T %<loopCounter>;
for (%<loopCounter> = 0; %<loopCounter> < %<width>; %<loopCounter>++) {
%assign level = level + 1
%else
%if isCplx
%assign reOffsetList = offsetList
%assign imOffsetList = offsetList + ["%<dataTypeSize>"]
%endif
%endif
%foreach idxE = LibDataTypeNumElements(dTypeId)
%assign eName = LibDataTypeElementName(dTypeId, idxE)
%assign eDTypeId = LibGetDataTypeIdAliasedThruToFromId(LibDataTypeElementDataTypeId(dTypeId, idxE))
%assign eWidth = LibDataTypeElementWidth(dTypeId, idxE)
%assign eOffset = LibDataTypeElementOffset(dTypeId, idxE)
%if !isCplx
%assign eOffsetList = offsetList
%assign eOffsetList[0][0] = eOffsetList[0][0] + eOffset
%else
%assign eReOffsetList = reOffsetList
%assign eReOffsetList[0][0] = eReOffsetList[0][0] + eOffset
%assign eImOffsetList = imOffsetList
%assign eImOffsetList[0][0] = eImOffsetList[0][0] + eOffset
%endif
%assign eIsCplx = LibDataTypeElementIsComplex(dTypeId, idxE)
%assert !(isCplx && eIsCplx)
%if !isCplx
%assign eDst = dst+"."+eName
%else
%assign eDstReal = dst+"."+tRealPart+"."+eName
%assign eDstImag = dst+"."+tImagPart+"."+eName
%endif
%if LibIsStructDataType(eDTypeId)
%if !isCplx
%<SLibAssignSLStructToUserStructND(eDTypeId, eWidth, ...
eDst, srcAddr, eOffsetList, level, eIsCplx)>/
%else
%<SLibAssignSLStructToUserStructND(eDTypeId, eWidth,...
eDstReal, srcAddr, eReOffsetList, level, eIsCplx)>/
%<SLibAssignSLStructToUserStructND(eDTypeId, eWidth, ...
eDstImag, srcAddr, eImOffsetList, level, eIsCplx)>/
%endif
%else
%assign eDTypeSize = LibGetDataTypeSLSizeFromId(eDTypeId)
%assign optAddr = ISEQUAL(eWidth,1) ? "&" : ""
%if eIsCplx
%assign eWidth = eWidth*2
%endif
%if !isCplx
%assign eOffsetStr = FcnGenerateStructElementOffsetString(eOffsetList)
%assign eSrc = WHITE_SPACE(eOffsetStr) ? srcAddr : srcAddr +" + %<eOffsetStr>"
%else
%assign eOffsetStr = FcnGenerateStructElementOffsetString(eReOffsetList)
%assign eSrcReal = WHITE_SPACE(eOffsetStr) ? srcAddr : srcAddr +" + %<eOffsetStr>"
%assign eOffsetStr = FcnGenerateStructElementOffsetString(eImOffsetList)
%assign eSrcImag = WHITE_SPACE(eOffsetStr) ? srcAddr : srcAddr +" + %<eOffsetStr>"
%endif
%if ISEQUAL(eWidth,1)
%if !isCplx
%<eDst> = *((%<LibGetDataTypeNameFromId(eDTypeId)>*)(%<eSrc>));
%else
%<eDstReal> = *((%<LibGetDataTypeNameFromId(eDTypeId)>*)(%<eSrcReal>));
%<eDstImag> = *((%<LibGetDataTypeNameFromId(eDTypeId)>*)(%<eSrcImag>));
%endif
%else
%if !isCplx
(void) %<LibGenMemFcnCall("memcpy", "%<optAddr>%<eDst>", ...
"%<eSrc>", "%")>;
%else
(void) %<LibGenMemFcnCall("memcpy", "%<optAddr>%<eDstReal>",...
"%<eSrcReal>", "%")>;
(void) %<LibGenMemFcnCall("memcpy", "%<optAddr>%<eDstImag>", ...
"%<eSrcImag>", "%")>;
%endif
%endif
%endif
%endforeach
%if ISEQUAL(width,1)==TLC_FALSE
}
}
%endif
%endfunction
%function SLibAssignUserStructToSLStructND(dTypeId, width, dstAddr, src, offsetList, level, isCplx) Output
%assign dataTypeSize = LibGetDataTypeSLSizeFromId(dTypeId)
%if isCplx
%assign reOffsetList = Matrix(1,1) [0]
%assign imOffsetList = Matrix(1,1) [0]
%endif
%if ISEQUAL(width,1)==TLC_FALSE
%assign loopCounter = "i%<level>"
%assign dtName = isCplx ? LibGetDataTypeComplexNameFromId(dTypeId) : LibGetDataTypeNameFromId(dTypeId)
%assign src = "((" + dtName + "*)" + src + ")[%<loopCounter>]"
%if isCplx
%assign loopOffset = ISEQUAL(dataTypeSize,1) ? "2*%<loopCounter>" : "%<dataTypeSize>*(2*%<loopCounter>)"
%assign reOffsetList = offsetList + ["%<loopOffset>"]
%assign loopOffset = ISEQUAL(dataTypeSize,1) ? "2*%<loopCounter> + 1" : "%<dataTypeSize>*(2*%<loopCounter> + 1)"
%assign imOffsetList = offsetList + ["%<loopOffset>"]
%else
%assign loopOffset = ISEQUAL(dataTypeSize,1) ? "%<loopCounter>" : "%<dataTypeSize>*%<loopCounter>"
%assign offsetList = offsetList + ["%<loopOffset>"]
%endif
{
int_T %<loopCounter>;
for (%<loopCounter> = 0; %<loopCounter> < %<width>; %<loopCounter>++) {
%assign level = level + 1
%else
%if isCplx
%assign reOffsetList = offsetList
%assign imOffsetList = offsetList + ["%<dataTypeSize>"]
%endif
%endif
%foreach idxE = LibDataTypeNumElements(dTypeId)
%assign eName = LibDataTypeElementName(dTypeId, idxE)
%assign eDTypeId = LibGetDataTypeIdAliasedThruToFromId(LibDataTypeElementDataTypeId(dTypeId, idxE))
%assign eWidth = LibDataTypeElementWidth(dTypeId, idxE)
%assign eOffset = LibDataTypeElementOffset(dTypeId, idxE)
%if !isCplx
%assign eOffsetList = offsetList
%assign eOffsetList[0][0] = eOffsetList[0][0] + eOffset
%else
%assign eReOffsetList = reOffsetList
%assign eReOffsetList[0][0] = eReOffsetList[0][0] + eOffset
%assign eImOffsetList = imOffsetList
%assign eImOffsetList[0][0] = eImOffsetList[0][0] + eOffset
%endif
%assign eIsCplx = LibDataTypeElementIsComplex(dTypeId, idxE)
%if !isCplx
%assign eSrc = src+"."+eName
%else
%assign eSrcReal = src+"."+tRealPart+"."+eName
%assign eSrcImag = src+"."+tImagPart+"."+eName
%endif
%if LibIsStructDataType(eDTypeId)
%if !isCplx
%<SLibAssignUserStructToSLStructND(eDTypeId, eWidth, dstAddr, ...
eSrc, eOffsetList, level, eIsCplx)>/
%else
%<SLibAssignUserStructToSLStructND(eDTypeId, eWidth, dstAddr, ...
eSrcReal, eReOffsetList, level, eIsCplx)>/
%<SLibAssignUserStructToSLStructND(eDTypeId, eWidth, dstAddr, ...
eSrcImag, eImOffsetList, level, eIsCplx)>/
%endif
%else
%assign eDTypeSize = LibGetDataTypeSLSizeFromId(eDTypeId)
%assign optAddr = ISEQUAL(eWidth,1) ? "&" : ""
%if eIsCplx
%assign eWidth = eWidth*2
%endif
%if !isCplx
%assign eOffsetStr = FcnGenerateStructElementOffsetString(eOffsetList)
%assign eDst = WHITE_SPACE(eOffsetStr) ? dstAddr : dstAddr+ " + %<eOffsetStr>"
%else
%assign eOffsetStr = FcnGenerateStructElementOffsetString(eReOffsetList)
%assign eDstReal = WHITE_SPACE(eOffsetStr) ? dstAddr : dstAddr +" + %<eOffsetStr>"
%assign eOffsetStr = FcnGenerateStructElementOffsetString(eImOffsetList)
%assign eDstImag = WHITE_SPACE(eOffsetStr) ? dstAddr : dstAddr +" + %<eOffsetStr>"
%endif
%if ISEQUAL(eWidth,1)
%if !isCplx
*((%<LibGetDataTypeNameFromId(eDTypeId)>*)(%<eDst>)) = %<eSrc>;
%else
*((%<LibGetDataTypeNameFromId(eDTypeId)>*)(%<eDstReal>)) = %<eSrcReal>;
*((%<LibGetDataTypeNameFromId(eDTypeId)>*)(%<eDstImag>)) = %<eSrcImag>;
%endif
%else
%if !isCplx
(void) %<LibGenMemFcnCall("memcpy", "%<eDst>", ...
"%<optAddr>%<eSrc>", "%")>;
%else
(void) %<LibGenMemFcnCall("memcpy", "%<eDstReal>",...
"%<optAddr>%<eSrcReal>", "%")>;
(void) %<LibGenMemFcnCall("memcpy", "%<eDstImag>", ...
"%<optAddr>%<eSrcImag>", "%")>;
%endif
%endif
%endif
%endforeach
%if ISEQUAL(width,1)==TLC_FALSE
}
}
%endif
%endfunction
%function SLibAssignSLStructToUserStruct(dTypeId, dst, srcAddr, startOffset) Output
%<SLibAssignSLStructToUserStructND(dTypeId, 1, dst, srcAddr, Matrix(1,1) [0], 0, TLC_FALSE)>/
%endfunction
%function SLibAssignUserStructToSLStruct(dTypeId, dstAddr, src, startOffset) Output
%<SLibAssignUserStructToSLStructND(dTypeId, 1, dstAddr, src, Matrix(1,1) [0], 0, TLC_FALSE)>/
%endfunction
%function SLibValueIsAllZeros(dTypeId, valueToSet, bSetFltsAndDblsToZero) void
%if ISEQUAL(valueToSet,0)
%return 1
%endif
%if TYPE(valueToSet) == "String"
%if valueToSet == "0"
%return 1
%endif
%assign upperValueToSet = FEVAL("upper", valueToSet)
%if upperValueToSet == "0U" || ...
upperValueToSet == "0L" || ...
upperValueToSet == "0UL" || ...
upperValueToSet == "0LU" || ...
upperValueToSet == "0.0" || ...
upperValueToSet == "0.0F" || ...
upperValueToSet == "FLOATTOHALF(0.0F)"
%return 1
%endif
%if upperValueToSet == "FALSE"
%assign dThruId = LibGetDataTypeIdAliasedThruToFromId(dTypeId)
%if dThruId == tSS_BOOLEAN
%return 1
%endif
%endif
%if LibIsStructDataType(dTypeId) || LibIsEnumDataType(dTypeId)
%assign gndValue = SLibGetGroundValueFromId(dTypeId)
%if ISEQUAL(valueToSet, gndValue)
%return !(::CompiledModel.DataTypes.DataType[dTypeId].GroundHasNonZero || ...
(bSetFltsAndDblsToZero && ...
::CompiledModel.DataTypes.DataType[dTypeId].GroundHasFloats))
%endif
%endif
%endif
%return 0
%endfunction
%function SLibValueIsAllZeroBitsCrudeCheck(dTypeId, valueToSet) void
%if LibDoesDataTypeNeedConstructor(dTypeId)
%return TLC_FALSE
%else
%if TYPE(valueToSet) == "Vector"
%assign sze = SIZE(valueToSet)
%assign retVal = TLC_TRUE
%foreach idx = sze[1]
%assign val = SLibValueIsAllZeros(dTypeId, valueToSet[idx], InitFltsAndDblsToZero)
%if ISEQUAL(val,TLC_FALSE)
%return TLC_FALSE
%endif
%endforeach
%return retVal
%else
%return SLibValueIsAllZeros(dTypeId, valueToSet, InitFltsAndDblsToZero)
%endif
%endif
%endfunction
%function SLibDataTypeRequiresZeroInit(dTypeId, bSetFltsAndDblsToZero) void
%if LibDoesDataTypeNeedConstructor(dTypeId)
%return TLC_FALSE
%elseif LibIsStructDataType(dTypeId)
%if ::CompiledModel.DataTypes.DataType[dTypeId].GroundHasNonZero
%return TLC_FALSE
%elseif bSetFltsAndDblsToZero && ::CompiledModel.DataTypes.DataType[dTypeId].GroundHasFloats
%return TLC_FALSE
%else
%return TLC_TRUE
%endif
%else
%assign gndValue = SLibGetGroundValueFromIdStrictOpt(dTypeId,0)
%return SLibValueIsAllZeros(dTypeId, gndValue, bSetFltsAndDblsToZero)
%endif
%endfunction
%function SLibGroundIsZero(dTypeId) void
%return SLibDataTypeRequiresZeroInit(dTypeId, InitFltsAndDblsToZero)
%endfunction
%function SLibDefaultInitialValueIsAllZeroBits(dTypeId) void
%return SLibDataTypeRequiresZeroInit(dTypeId, InitFltsAndDblsToZero)
%endfunction
%function SLibAllValuesMatch(aValueVector) void
%if TYPE(aValueVector) == "Vector"
%assign vectSize = SIZE(aValueVector)
%assign retVal = TLC_TRUE
%assign firstEl = aValueVector[0]
%foreach idx = vectSize[1]
%if !ISEQUAL(aValueVector[idx], firstEl)
%return TLC_FALSE
%endif
%endforeach
%endif
%return TLC_TRUE
%endfunction
%function LibCGTypeIsComplex(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.GetIsComplex", cgTypeIdx)
%endfunction
%function SLibCGTypeIsComplexStrict(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.Constructor", cgTypeIdx) == "complex"
%endfunction
%function LibCGTypeIsPointer(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.Constructor", cgTypeIdx) == "pointer"
%endfunction
%function LibCGTypeIsReference(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.Constructor", cgTypeIdx) == "reference"
%endfunction
%function LibCGTypeIsRenamed(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.Constructor", cgTypeIdx) == "renamed"
%endfunction
%function LibCGTypeIsVoid(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.Constructor", cgTypeIdx) == "void"
%endfunction
%function LibCGTypeIsFixed(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.Constructor", cgTypeIdx) == "fixed"
%endfunction
%function LibCGTypeIsChar(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.Constructor", cgTypeIdx) == "char"
%endfunction
%function LibCGTypeIsString(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.Constructor", cgTypeIdx) == "string"
%endfunction
%function LibCGTypeIsUnknown(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.Constructor", cgTypeIdx) == "unknown"
%endfunction
name>_name>*"
%function LibCGTypeIsEmxArray(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.GetIsEmxArray", cgTypeIdx)
%endfunction
%function LibCGTypeIsConvertedToEmxArray(cgTypeIdx) void
%assign result = CGMODEL_ACCESS("CGType.GetConvertedToEmxArray", cgTypeIdx)
%return result != -1
%endfunction
%function LibCGTypeIsStdContainer(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.GetIsStdContainer", cgTypeIdx)
%endfunction
%function LibCGTypeContainsStdContainer(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.GetContainsStdContainer", cgTypeIdx)
%endfunction
%function LibCGTypeIsStdContainerClass(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.GetIsStdContainerClass", cgTypeIdx)
%endfunction
%function LibCGTypeStdContainerName(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.GetStdContainerName", cgTypeIdx)
%endfunction
%function LibCGTypeStdContainerReferenceIndex(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.GetStdContainerReferenceIndex", cgTypeIdx)
%endfunction
%function LibCGTypeIsEnum(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.GetIsEnum", cgTypeIdx)
%endfunction
%function SLibCGTypeIsEnumStrict(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.Constructor", cgTypeIdx) == "enum"
%endfunction
%function LibCGTypeScalarBaseType(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.GetScalarBaseType", cgTypeIdx)
%endfunction
%function LibCGTypeFixedPointBaseType(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.GetFixedPointBaseType", cgTypeIdx)
%endfunction
%function LibCGTypeTag(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.Tag", cgTypeIdx)
%endfunction
%function LibCGTypeIsOpaqueStruct(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.IsOpaque", cgTypeIdx)
%endfunction
%function LibCGTypeBias(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.Bias", cgTypeIdx)
%endfunction
%function LibCGTypeSlope(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.Slope", cgTypeIdx)
%endfunction
%function LibCGTypeNBits(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.NBits", cgTypeIdx)
%endfunction
%function LibCGTypeIsSigned(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.IsSigned", cgTypeIdx)
%endfunction
%function LibCGTypeExponent(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.Exponent", cgTypeIdx)
%endfunction
%function LibCGTypeIsLoweredMultiword(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.IsLoweredMultiword", cgTypeIdx)
%endfunction
%function LibCGTypeStructAlignment(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.StructAlignment", cgTypeIdx)
%endfunction
%function LibCGTypeNumMembers(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.NumMembers", cgTypeIdx)
%endfunction
%function LibCGTypeMemberName(cgTypeIdx, memberIdx) void
%return CGMODEL_ACCESS("CGType.Member.Name", cgTypeIdx, memberIdx)
%endfunction
%function LibCGTypeMemberCGTypeIdx(cgTypeIdx, memberIdx) void
%return CGMODEL_ACCESS("CGType.Member.CGTypeIdx", cgTypeIdx, memberIdx)
%endfunction
%function LibCGTypeMemberAlignment(cgTypeIdx, memberIdx) void
%return CGMODEL_ACCESS("CGType.Member.Alignment", cgTypeIdx, memberIdx)
%endfunction
%function LibGetRecordCGTypeIdx(record) void
%if ISFIELD(record, "CGTypeIdx")
%return record.CGTypeIdx
%elseif ISFIELD(record, "VarGroupIdx")
%assign varGroupIdx = record.VarGroupIdx
%return SLibVarGroupElementType(varGroupIdx[0], varGroupIdx[1])
%else
%assign errMsg = "Should not get here"
%<LibReportFatalError(errMsg)>
%endif
%endfunction
%function LibGetRecordIsMatrix(record) void
%assign cgTypeIdx = SLibGetRecordContainerCGTypeIdx(record)
%return LibCGTypeIsMatrix(cgTypeIdx) && "1" != LibCGTypeSymbolicWidth(cgTypeIdx)
%endfunction
%function LibCGTypeIsMatrix(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.GetIsMatrix", cgTypeIdx)
%endfunction
%function SLibCGTypeIsMatrixStrict(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.Constructor", cgTypeIdx) == "matrix"
%endfunction
%function LibCGTypeIsStruct(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.GetIsStruct", cgTypeIdx)
%endfunction
%function LibCGTypeIsClass(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.GetIsClass", cgTypeIdx)
%endfunction
%function SLibCGTypeIsStructStrict(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.Constructor", cgTypeIdx) == "struct"
%endfunction
%function LibCGTypeIsArrayOfStructs(cgTypeIdx) void
%assign arrayOfStructs = TLC_FALSE
%if LibCGTypeIsMatrix(cgTypeIdx)
%assign arrayOfStructs = LibCGTypeIsStruct(LibCGTypeBaseIndex(cgTypeIdx))
%endif
%return arrayOfStructs
%endfunction
%function LibCGTypeWidth(cgTypeIdx) void
%if cgTypeIdx < ::CompiledModel.DataTypes.NumSLBuiltInDataTypes
%return 1
%else
%return CGMODEL_ACCESS("CGType.Width", cgTypeIdx)
%endif
%endfunction
%function SLibEvalSymbolicWidth(aCGTypeIdx, aUseParamIdentifier) void
%assign prevVal = ::UseParamIdentifierForSymbolicDim
%assign ::UseParamIdentifierForSymbolicDim = aUseParamIdentifier
%assign fcnName = "SLibCGType" + "%<aCGTypeIdx>" + "SymbolicWidth"
%assign symDims = %<fcnName>()
%assign ::UseParamIdentifierForSymbolicDim = prevVal
%return symDims
%endfunction
%function LibCGTypeSymbolicWidth(cgTypeIdx) void
%assign cgType = ::CompiledModel.CGTypes.CGType[cgTypeIdx]
%if ISFIELD(cgType, "SymbolicWidth")
%if ISEMPTY(cgType.SymbolicWidth)
%assign cgType.SymbolicWidth = SLibEvalSymbolicWidth(cgTypeIdx, TLC_FALSE)
%addtorecord ::CompiledModel.CGTypes.CGType[cgTypeIdx] ...
SLSymbolicWidth SLibEvalSymbolicWidth(cgTypeIdx, TLC_TRUE)
%endif
%return cgType.SymbolicWidth
%else
%return "%<LibCGTypeWidth(cgTypeIdx)>"
%endif
%endfunction
%function LibCGTypeSymbolicDims(cgTypeIdx) void
%assign cgType = ::CompiledModel.CGTypes.CGType[cgTypeIdx]
%return cgType.Dimensions
%endfunction
%function LibCGTypeSymbolicVectorDims(cgTypeIdx) void
%assign width = LibCGTypeSymbolicWidth(cgTypeIdx)
%if "1" == width && !LibCGTypeIsMatrix(cgTypeIdx)
%return ""
%elseif LibCGTypeIsStdContainer(cgTypeIdx)
%return ""
%else
%assign dims = LibCGTypeSymbolicDimensions(cgTypeIdx)
%assign isScalar = TLC_TRUE
%assign nonSingletonDimsCount = 0
%assign retDims = ""
%foreach dimIdx = SIZE(dims, 1)
%if dims[dimIdx] != "1"
%assign isScalar = TLC_FALSE
%assign nonSingletonDimsCount = nonSingletonDimsCount + 1
%endif
%assign retDims = retDims + "[%]"
%endforeach
%if isScalar && !LibCGTypeIsMatrix(cgTypeIdx)
%return ""
%elseif nonSingletonDimsCount == 1
%return "[" + width + "]"
%else
%return retDims
%endif
%endif
%endfunction
%function LibCGTypeDimensions(idx) void
%if idx < ::CompiledModel.DataTypes.NumSLBuiltInDataTypes
%return 1
%endif
%if LibCGTypeIsMatrix(idx)
%return ::CompiledModel.CGTypes.CGType[idx].Dimensions
%elseif LibCGTypeIsPointer(idx) || LibCGTypeIsRenamed(idx)
%return LibCGTypeDimensions(LibCGTypeBaseIndex(idx))
%else
%return 1
%endif
%endfunction
%function SLibEvalSymbolicDimensions(aCGTypeIdx, aUseParamIdentifier) void
%assign prevVal = ::UseParamIdentifierForSymbolicDim
%assign ::UseParamIdentifierForSymbolicDim = aUseParamIdentifier
%assign fcnName = "SLibCGType" + "%<aCGTypeIdx>" + "SymbolicDimensions"
%assign symDims = %<fcnName>()
%assign ::UseParamIdentifierForSymbolicDim = prevVal
%return symDims
%endfunction
%function LibCGTypeSymbolicDimensions(idx) void
%if idx < ::CompiledModel.DataTypes.NumSLBuiltInDataTypes
%return ["1"]
%endif
%if LibCGTypeIsEmxArray(idx) || LibCGTypeIsConvertedToEmxArray(idx)
%return ["1"]
%endif
%if LibCGTypeIsMatrix(idx) && ...
ISFIELD(::CompiledModel.CGTypes.CGType[idx], "SymbolicDimensions")
%if ISEMPTY(::CompiledModel.CGTypes.CGType[idx].SymbolicDimensions)
%assign ::CompiledModel.CGTypes.CGType[idx].SymbolicDimensions = ...
SLibEvalSymbolicDimensions(idx, TLC_FALSE)
%addtorecord ::CompiledModel.CGTypes.CGType[idx] ...
SLSymbolicDimensions SLibEvalSymbolicDimensions(idx, TLC_TRUE)
%endif
%return ::CompiledModel.CGTypes.CGType[idx].SymbolicDimensions
%else
%assign dims = LibCGTypeDimensions(idx)
%assign ndims = SIZE(dims, 1)
%assign symbolicDims = Vector(%<ndims>) [""@%<ndims>]
%foreach dim = ndims
%assign symbolicDims[%<dim>] = "%"
%endforeach
%endif
%return symbolicDims
%endfunction
%function LibCGTypeBaseIndex(cgTypeIdx) void
%return CGMODEL_ACCESS("CGType.BaseIdx", cgTypeIdx)
%endfunction
%function SLibCGTypeToSLType(aCGTypeIdx, aReportError) void
%assign slTypeIdx = CGMODEL_ACCESS("CGType.GetSLTypeIdxForCGType", aCGTypeIdx)
%if ((slTypeIdx == -1) && aReportError)
%assign constructor = CGMODEL_ACCESS("CGType.Constructor", aCGTypeIdx)
%assign errMsg = "invalid SLTypeIdx %<slTypeIdx> for %<constructor>"
%<LibReportFatalError(errMsg)>
%endif
%return slTypeIdx
%endfunction
%function LibCGTypeToSLType(aCGTypeIdx) void
%return SLibCGTypeToSLType(aCGTypeIdx, TLC_TRUE)
%endfunction
%function LibCGTypeSLBaseType(cgTypeIdx) void
%foreach i = cgTypeIdx
%if ::CompiledModel.CGTypes.CGType[cgTypeIdx].SLTypeIdx > -1
%return ::CompiledModel.CGTypes.CGType[cgTypeIdx].SLTypeIdx
%elseif LibCGTypeIsEmxArray(cgTypeIdx)
%assign cgTypeIdx = LibCGTypeBaseIndex(cgTypeIdx)
%assign cgTypeIdx = LibCGTypeBaseIndex(cgTypeIdx)
%else
%if LibCGTypeIsMatrix(cgTypeIdx) || LibCGTypeIsComplex(cgTypeIdx) || ...
LibCGTypeIsPointer(cgTypeIdx) || LibCGTypeIsRenamed(cgTypeIdx)
%assign cgTypeIdx = LibCGTypeBaseIndex(cgTypeIdx)
%else
%assign constructor = CGMODEL_ACCESS("CGType.Constructor", cgTypeIdx)
%assign errMsg = "invalid SLTypeIdx -1 for %<constructor>"
%<LibReportFatalError(errMsg)>
%endif
%endif
%endforeach
%return cgTypeIdx
%endfunction
%function LibCGTypeName(cgTypeIdx) void
%return LibOptStdCGTypeName(cgTypeIdx, TLC_FALSE)
%endfunction
%function LibOptStdCGTypeName(cgTypeIdx, useStdContainerName) void
%foreach i = cgTypeIdx+1
%assign cgTypeRec = ::CompiledModel.CGTypes.CGType[cgTypeIdx]
%if ISFIELD(cgTypeRec, "Name")
%return cgTypeRec.Name
%elseif useStdContainerName && LibCGTypeIsStdContainer(cgTypeIdx)
%return LibCGTypeStdContainerName(cgTypeIdx)
%else
%assign isComplex = TLC_FALSE
%if LibCGTypeIsMatrix(cgTypeIdx)
%assign cgTypeIdx = LibCGTypeBaseIndex(cgTypeIdx)
%elseif LibCGTypeIsComplex(cgTypeIdx)
%assign isComplex = TLC_TRUE
%assign cgTypeRec = ::CompiledModel.CGTypes.CGType[LibCGTypeBaseIndex(cgTypeIdx)]
%elseif LibCGTypeIsEmxArray(cgTypeIdx)
%assign cgTypeRec = ::CompiledModel.CGTypes.CGType[LibCGTypeBaseIndex(cgTypeIdx)]
%if ISFIELD(cgTypeRec, "Name")
%return cgTypeRec.Name + "*"
%endif
%else
%assign slTypeIdx = cgTypeRec.SLTypeIdx
%if slTypeIdx < 0 || slTypeIdx >= ::CompiledModel.DataTypes.NumDataTypes
%assign constructor = CGMODEL_ACCESS("CGType.Constructor", cgTypeIdx)
%assign errMsg = "invalid SLTypeIdx %<slTypeIdx> for %<constructor>"
%<LibReportFatalError(errMsg)>
%endif
%if (isComplex)
%return LibGetDataTypeComplexNameFromId(slTypeIdx)
%else
%return LibGetDataTypeNameFromId(slTypeIdx)
%endif
%endif
%endif
%endforeach
%return "#error"
%endfunction
%function LibAliasedThruCGTypeName(cgTypeIdx) void
%foreach i = cgTypeIdx+1
%assign cgTypeRec = ::CompiledModel.CGTypes.CGType[cgTypeIdx]
%assign isComplex = TLC_FALSE
%if LibCGTypeIsMatrix(cgTypeIdx)
%assign cgTypeIdx = LibCGTypeBaseIndex(cgTypeIdx)
%elseif LibCGTypeIsComplex(cgTypeIdx)
%assign isComplex = TLC_TRUE
%assign cgTypeRec = ::CompiledModel.CGTypes.CGType[LibCGTypeBaseIndex(cgTypeIdx)]
%elseif LibCGTypeIsRenamed(cgTypeIdx)
%return LibCGTypeName(LibCGTypeBaseIndex(cgTypeIdx))
%else
%assign slTypeIdx = cgTypeRec.SLTypeIdx
%if slTypeIdx < 0 || slTypeIdx >= ::CompiledModel.DataTypes.NumDataTypes
%assign constructor = CGMODEL_ACCESS("CGType.Constructor", cgTypeIdx)
%assign errMsg = "invalid SLTypeIdx %<slTypeIdx> for %<constructor>"
%<LibReportFatalError(errMsg)>
%endif
%if (isComplex)
%return LibGetDataTypeComplexNameFromId(slTypeIdx)
%else
%return LibGetDataTypeNameFromId(slTypeIdx)
%endif
%endif
%endforeach
%return "#error"
%endfunction
%function SLibGetRecordOriginalCGTypeIdx(rec) void
%return ISFIELD(rec, "OriginalCGTypeIdx") ? ...
rec.OriginalCGTypeIdx : rec.CGTypeIdx
%endfunction
%function SLibGetRecordContainerCGTypeIdx(rec) void
%if ISFIELD(rec, "ContainerCGTypeIdx") && ...
rec.ContainerCGTypeIdx >= 0
%return rec.ContainerCGTypeIdx
%elseif (ISFIELD(rec, "RecordType") && rec.RecordType == "ZcSignalInfo")
%return SLibVarGroupElementType(rec.VarGroupIdx[0], rec.VarGroupIdx[1])
%else
%return rec.CGTypeIdx
%endif
%endfunction
%function SLibGetRecordContainerCGType(rec) void
%return ::CompiledModel.CGTypes.CGType[SLibGetRecordContainerCGTypeIdx(rec)]
%endfunction
%function SLibGetRecordContainerTypeName(rec) void
%return SLibGetRecordContainerOptStdTypeName(rec, TLC_FALSE)
%endfunction
%function SLibGetRecordContainerOptStdTypeName(rec, useStdContainerName) void
%assign containerCgTypeIdx = SLibGetRecordContainerCGTypeIdx(rec)
%if LibCGTypeIsEnum(SLibGetRecordOriginalCGTypeIdx(rec)) && ...
!(useStdContainerName && LibCGTypeIsStdContainer(containerCgTypeIdx))
%return LibOptStdCGTypeName(SLibGetRecordOriginalCGTypeIdx(rec), useStdContainerName)
%else
%return LibOptStdCGTypeName(containerCgTypeIdx, useStdContainerName)
%endif
%endfunction
%function SLibGetRecordContainerBaseTypeName(rec) void
%return LibCGTypeName(LibCGTypeScalarBaseType(SLibGetRecordContainerCGTypeIdx(rec)))
%endfunction
%function LibBlockInputSignalAliasedThruDataTypeId(idx)
%return LibGetDataTypeIdAliasedThruToFromId(...
LibBlockInputSignalDataTypeId(idx))
%endfunction
%function LibBlockOutputSignalAliasedThruDataTypeId(idx)
%return LibGetDataTypeIdAliasedThruToFromId(...
LibBlockOutputSignalDataTypeId(idx))
%endfunction
%function LibIsBuiltInDataType(id) void
%return LibGetDataTypeIdAliasedThruToFromId(id) < ::CompiledModel.DataTypes.NumSLBuiltInDataTypes
%endfunction
%function LibIsFundamentalBuiltInDataType(id) void
%return id >= 0 && id < ::CompiledModel.DataTypes.NumSLBuiltInDataTypes
%endfunction
%function LibIsDataTypeLogSupported(dTypeId, logIfConvertTLCFcnExists) void
%if LibIsHalfDataType(dTypeId)
%return 0
%elseif LibIsDataTypeBuiltinOrFixpt(dTypeId)
%return 1
%elseif LibIsEnumDataType(dTypeId)
%return 0
%elseif logIfConvertTLCFcnExists
%return (LibConvertBetweenTLCFcnName(dTypeId) != "")
%else
%return 0
%endif
%endfunction
%function LibIsDataTypeFixpt(dTypeId) void
%assign curDT = FixPt_GetDataTypeFromIndex(dTypeId)
%if curDT.IsFixedPoint
%return 1
%else
%return 0
%endif
%endfunction
%function LibIsDataTypeBuiltinOrFixpt(dTypeId) void
%if LibIsBuiltInDataType(dTypeId)
%return 1
%else
%return LibIsDataTypeFixpt(dTypeId)
%endif
%endfunction
%function LibIsBuiltInWordSize(wordSize)
%if wordSize == 8 || wordSize == 16 || wordSize == 32
%return 1
%endif
%return 0
%endfunction
%function LibMaxCodeGenWordSize()
%return 128
%endfunction
%function LibIsMultiWordValue(in)
%assign qualifier = "{"
%if (TYPE(in) == "String")
%if !ISEMPTY(FEVAL("strfind",in,qualifier))
%return TLC_TRUE
%endif
%endif
%return TLC_FALSE
%endfunction
%function LibIsDataTypeMultiWordFixpt(dTypeId)
%if LibIsBuiltInDataType(dTypeId)
%return 0
%else
%assign curDT = FixPt_GetDataTypeFromIndex(dTypeId)
%return FixPt_DataTypeIsMultiWord(curDT)
%endif
%endfunction
%function LibIsDataTypeNewLongestFixpt(dTypeId)
%if LibIsBuiltInDataType(dTypeId)
%return 0
%else
%assign curDT = FixPt_GetDataTypeFromIndex(dTypeId)
%if curDT.IsFixedPoint && !LibIsBuiltInWordSize(IntegerSizes.LongNumBits) ...
&& (LibGetDataTypeIdAliasedToFromId(dTypeId) == ::CompiledModel.tSS_LONG ...
|| LibGetDataTypeIdAliasedToFromId(dTypeId) == ::CompiledModel.tSS_ULONG)
%return 1
%elseif curDT.IsFixedPoint && !LibIsBuiltInWordSize(IntegerSizes.LongLongNumBits) ...
&& (LibGetDataTypeIdAliasedToFromId(dTypeId) == ::CompiledModel.tSS_LONG_LONG ...
|| LibGetDataTypeIdAliasedToFromId(dTypeId) == ::CompiledModel.tSS_ULONG_LONG)
%return 1
%else
%return 0
%endif
%endif
%endfunction
%function LibIsNonBuiltInTypeNeededForFixpt(dTypeId)
%return LibIsDataTypeMultiWordFixpt(dTypeId) || ...
LibIsDataTypeNewLongestFixpt(dTypeId)
%endfunction
%function LibIsAliasDataType(id) void
%return LibGetDataTypeIdAliasedThruToFromId(id) != id
%endfunction
%function LibDataTypeNumElements(id) void
%return ::CompiledModel.DataTypes.DataType[id].NumElements
%endfunction
%function LibDataTypeIsBus(id) void
%return ::CompiledModel.DataTypes.DataType[id].IsBus
%endfunction
%function LibDataTypeIsAnonymousStruct(id) void
%return LibIsStructDataType(id) && !LibIsDataTypeFixpt(id) /
&& !SLibDataTypeHasObject(id)
%endfunction
%function SLibDataTypeHasObject(id) void
%return ::CompiledModel.DataTypes.DataType[id].HasObject != 0
%endfunction
%function LibDataTypeElementName(id, idx) void
%return ::CompiledModel.DataTypes.DataType[id].Elements[idx].Name
%endfunction
%function LibDataTypeElementDescription(id, idx) void
%return ::CompiledModel.DataTypes.DataType[id].Elements[idx].Description
%endfunction
%function LibDataTypeElementUnit(id, idx) void
%assert CGMODEL_ACCESS("CGModel.SLUnit") > 0
%return LibGetRecordUnitExpr(::CompiledModel.DataTypes.DataType[id].Elements[idx])
%endfunction
%function LibDataTypeElementASCIIEscapedUnits(id, idx) void
%assert CGMODEL_ACCESS("CGModel.SLUnit") > 0
%return SLibGetRecordASCIIEscapedUnitExpr(::CompiledModel.DataTypes.DataType[id].Elements[idx])
%endfunction
%function LibDataTypeElementDocUnits(id, idx) void
%return ::CompiledModel.DataTypes.DataType[id].Elements[idx].DocUnits
%endfunction
%function (id, idx) void
%assign eComment = ""
%if (ConfigSet.SimulinkDataObjDesc == 1)
%assign eDesc = LibDataTypeElementDescription(id, idx)
%if !ISEMPTY(eDesc)
%assign eComment = "/* " + eDesc + " *//n"
%endif
%endif
%return eComment
%endfunction
%function LibDataTypeElementDataTypeId(id, idx) void
%assign element = ::CompiledModel.DataTypes.DataType[id].Elements[idx]
%return LibGetRecordDataTypeId(element)
%endfunction
%function LibDataTypeElementContainerName(id, idx) void
%assign element = ::CompiledModel.DataTypes.DataType[id].Elements[idx]
%return SLibGetRecordContainerOptStdTypeName(element, TLC_TRUE)
%endfunction
%function LibDataTypeElementPadding(id, idx) void
%return ::CompiledModel.DataTypes.DataType[id].Elements[idx].Padding
%endfunction
%function LibDataTypeElementIsComplex(id, idx) void
%assign element = ::CompiledModel.DataTypes.DataType[id].Elements[idx]
%return LibGetRecordIsComplex(element)
%endfunction
%function LibDataTypeElementIsFixPt(id, idx) void
%return ::CompiledModel.DataTypes.DataType[LibDataTypeElementDataTypeId(id,idx)].IsFixedPoint
%endfunction
%function LibDataTypeElementSymbolicWidth(id, idx) void
%assign element = ::CompiledModel.DataTypes.DataType[id].Elements[idx]
%return LibGetSymbolicRecordWidth(element)
%endfunction
%function LibDataTypeElementVectorDims(id, idx) void
%assign element = ::CompiledModel.DataTypes.DataType[id].Elements[idx]
%return LibGetRecordVectorDims(element)
%endfunction
%function LibDataTypeElementVectorWidth(id, idx) void
%assign element = ::CompiledModel.DataTypes.DataType[id].Elements[idx]
%return LibGetRecordVectorWidth(element)
%endfunction
%function LibDataTypeElementWidth(id, idx) void
%assign element = ::CompiledModel.DataTypes.DataType[id].Elements[idx]
%return LibGetRecordWidth(element)
%endfunction
%function LibDataTypeElementNumDimensions(id, idx) void
%assign element = ::CompiledModel.DataTypes.DataType[id].Elements[idx]
%return LibGetRecordNumDimensions(element)
%endfunction
%function LibDataTypeElementDimensions(id, idx) void
%assign element = ::CompiledModel.DataTypes.DataType[id].Elements[idx]
%return LibGetRecordDimensions(element)
%endfunction
%function LibDataTypeElementOffset(id, idx) void
%return ::CompiledModel.DataTypes.DataType[id].Elements[idx].Offset
%endfunction
%function LibDataTypeElementMax(id, idx) void
%return DataTypes.DataType[id].Elements[idx].Max
%endfunction
%function LibDataTypeElementMin(id, idx) void
%return DataTypes.DataType[id].Elements[idx].Min
%endfunction
%function LibDataTypeElementIsStdContainer(id, idx) void
%assign element = ::CompiledModel.DataTypes.DataType[id].Elements[idx]
%return LibGetRecordIsStdContainer(element)
%endfunction
%function LibIsStringDataType(id) void
%assign dtId = LibGetDataTypeIdAliasedThruToFromId(id)
%assign dt = ::CompiledModel.DataTypes.DataType[dtId]
%if ISFIELD(dt, "IsStringType")
%return dt.IsStringType
%else
%return TLC_FALSE
%endif
%endfunction
%function LibGetStringTypeMaxLength(id) void
%if LibIsStringDataType(id)
%assign dtId = LibGetDataTypeIdAliasedThruToFromId(id)
%assign dt = ::CompiledModel.DataTypes.DataType[dtId]
%if ISFIELD(dt, "Object")
%return dt.Object.ObjectProperties.MaximumLength
%else
%return 0
%endif
%else
%return -1
%endif
%endfunction
%function LibIsStructDataType(id) void
%return LibDataTypeNumElements(id) > 0
%endfunction
%function LibIsDataTypeCGClassOrContainClass(id) void
%assign dt = ::CompiledModel.DataTypes.DataType[id]
%assign isClass = TLC_FALSE
%if LibIsStructDataType(id)
%assign numElements = dt.NumElements
%foreach eIdx = numElements
%assign eDtId = LibDataTypeElementDataTypeId(dt.Id, eIdx)
%if LibIsDataTypeCGClassType(eDtId)
%return TLC_TRUE
%endif
%endforeach
%return TLC_FALSE
%else
%return ( ( ISFIELD(dt,"CGTypeIdx") && LibCGTypeIsClass">LibCGTypeIsClass(dt.CGTypeIdx) ) || (ISFIELD(dt,"ContainerCGTypeIdx") && LibCGTypeIsClass">LibCGTypeIsClass(dt.ContainerCGTypeIdx) ) )
%endif
%endfunction
%function LibIsDataTypeCGClassType(id) void
%assign dt = ::CompiledModel.DataTypes.DataType[id]
%return ( ( ISFIELD(dt,"CGTypeIdx") && LibCGTypeIsClass">LibCGTypeIsClass(dt.CGTypeIdx) ) || (ISFIELD(dt,"ContainerCGTypeIdx") && LibCGTypeIsClass">LibCGTypeIsClass(dt.ContainerCGTypeIdx) ) )
%endfunction
%function LibDoesDataTypeNeedConstructor(id) void
%return !ISEMPTY(SLibDataTypeConstructFcnName(id)) || LibIsDataTypeCGClassType(id)
%endfunction
%function LibDoesDataTypeMemberNeedConstructor(id) void
%if LibIsStructDataType(id)
%assign dt = ::CompiledModel.DataTypes.DataType[id]
%assign numElements = dt.NumElements
%foreach eIdx = numElements
%assign eDtId = LibDataTypeElementDataTypeId(dt.Id, eIdx)
%if LibDoesDataTypeNeedConstructor(eDtId)
%return TLC_TRUE
%endif
%endforeach
%return TLC_FALSE
%else
%return TLC_FALSE
%endif
%endfunction
%function LibIsDataTypeContainerClass(id) void
%return !ISEMPTY(SLibDataTypeContainedDataFcn(id)) || LibIsDataTypeCGClassType(id)
%endfunction
%function LibIsDataTypeMessage(id) void
%assign dt = ::CompiledModel.DataTypes.DataType[id]
%if LibIsStructDataType(id)
%assign numElements = dt.NumElements
%foreach eIdx = numElements
%assign eDtId = LibDataTypeElementDataTypeId(dt.Id, eIdx)
%if LibIsDataTypeMessage(eDtId)
%return TLC_TRUE
%endif
%endforeach
%return TLC_FALSE
%else
%return ( ( ISFIELD(dt,"Name") && dt.Name == "___internal_slMsg_reserved_identifier___") )
%endif
%endfunction
%function LibIsHalfDataType(id) void
%assign dt = ::CompiledModel.DataTypes.DataType[id]
%assign retVal = FixPt_DataTypeIsHalf(dt)
%return retVal
%endfunction
%function LibIsBuiltInOrCustomFloatDatatype(id) void
%assign dTypeId = LibGetDataTypeIdAliasedThruToFromId(id)
%return (dTypeId == tSS_DOUBLE || dTypeId == tSS_SINGLE || LibIsHalfDataType(dTypeId))
%endfunction
%function LibIsEnumDataType(id) void
%assign dtId = LibGetDataTypeIdAliasedThruToFromId(id)
%return ::CompiledModel.DataTypes.DataType[dtId].IsEnumType
%endfunction
%function LibGetEnumTypeStorageType(id) void
%assign dtId = LibGetDataTypeIdAliasedThruToFromId(id)
%return ::CompiledModel.DataTypes.DataType[dtId].EnumStorageTypeId
%endfunction
%function LibIsEnumTypeStoredAsInt(id) void
%assign storageType = LibGetEnumTypeStorageType(id)
%return (storageType == -1)
%endfunction
%function (id) void
%assign dtId = LibGetDataTypeIdAliasedThruToFromId(id)
%return ::CompiledModel.DataTypes.DataType[dtId].NumEnumerations
%endfunction
%function FcnGetEnumTypeIndexOfDefaultValue(id) void
%assign dtId = LibGetDataTypeIdAliasedThruToFromId(id)
%return ::CompiledModel.DataTypes.DataType[dtId].IndexOfDefault
%endfunction
%function FcnGetEnumTypeDefaultCodeGenString(id) void
%assign dtId = LibGetDataTypeIdAliasedThruToFromId(id)
%return SLibGetEnumTypeCodeGenStringFromIndex(id, FcnGetEnumTypeIndexOfDefaultValue(id))
%endfunction
%function SLibGetEnumTypeCodeGenStringFromIndexForVariantPreprocessor(id, enumIdx) void
%assign dtId = LibGetDataTypeIdAliasedThruToFromId(id)
%assert(dtId < ::CompiledModel.DataTypes.NumDataTypes)
%return ::CompiledModel.DataTypes.DataType[dtId].Enumeration[enumIdx].String
%endfunction
%function FcnGetEnumTypeDefaultValue(id) void
%assign dtId = LibGetDataTypeIdAliasedThruToFromId(id)
%return SLibGetEnumTypeValueFromIndex(id, FcnGetEnumTypeIndexOfDefaultValue(id))
%endfunction
%function SLibGetEnumTypeStringFromIndex(id, enumIdx) void
%assign dtId = LibGetDataTypeIdAliasedThruToFromId(id)
%return ::CompiledModel.DataTypes.DataType[dtId].Enumeration[enumIdx].String
%endfunction
%function SLibGetEnumTypeCodeGenStringFromIndex(id, enumIdx) void
%assign dtId = LibGetDataTypeIdAliasedThruToFromId(id)
%return ::CompiledModel.DataTypes.DataType[dtId].Enumeration[enumIdx].CodeGenString
%endfunction
%function SLibGetEnumTypeValueFromIndex(id, enumIdx) void
%assign dtId = LibGetDataTypeIdAliasedThruToFromId(id)
%return ::CompiledModel.DataTypes.DataType[dtId].Enumeration[enumIdx].Value
%endfunction
%function SLibGetEnumTypeCodeGenStringFromValue(id, enumValue) void
%assign dtId = LibGetDataTypeIdAliasedThruToFromId(id)
%assign dt = ::CompiledModel.DataTypes.DataType[dtId]
%assign enumIdx = SLibGetEnumTypeIndexFromValue(id, enumValue)
%return dt.Enumeration[enumIdx].CodeGenString
%endfunction
%function SLibGetEnumTypeIndexFromValue(id, enumValue) void
%assign dtId = LibGetDataTypeIdAliasedThruToFromId(id)
%assign dt = ::CompiledModel.DataTypes.DataType[dtId]
%foreach enumIdx = dt.NumEnumerations
%if (dt.Enumeration[enumIdx].Value == enumValue)
%return enumIdx
%endif
%endforeach
%<LibReportFatalError("Enumeration value not found in enumerated data type")>
%endfunction
%function SLibGetEnumTypeMinValue(id) void
%assign dtId = LibGetDataTypeIdAliasedThruToFromId(id)
%assign dt = ::CompiledModel.DataTypes.DataType[dtId]
%assign minValue = dt.Enumeration[0].Value
%foreach enumIdx = dt.NumEnumerations
%if (dt.Enumeration[enumIdx].Value < minValue)
%assign minValue = dt.Enumeration[enumIdx].Value
%endif
%endforeach
%return minValue
%endfunction
%function SLibGetEnumTypeMaxValue(id) void
%assign dtId = LibGetDataTypeIdAliasedThruToFromId(id)
%assign dt = ::CompiledModel.DataTypes.DataType[dtId]
%assign maxValue = dt.Enumeration[0].Value
%foreach enumIdx = dt.NumEnumerations
%if (dt.Enumeration[enumIdx].Value > maxValue)
%assign maxValue = dt.Enumeration[enumIdx].Value
%endif
%endforeach
%return maxValue
%endfunction
%function SLibConvertBetweenEnumType(outDType,inDType,inLabel,options,outLabel) Output
%assign outDTypeName = LibGetDataTypeNameFromId(outDType)
%if outDType == tSS_BOOLEAN
%assign gnd = SLibGetEnumTypeCodeGenStringFromIndex(inDType, 0)
%<outLabel> = (%<outDTypeName>) %<inLabel>;
%elseif LibIsEnumDataType(outDType)
%assign numStrings = FcnGetEnumTypeNumEnums(outDType)
/* Convert to enumerated data type '%<outDTypeName>' */
switch (%<inLabel>) {
%foreach enumIdx = numStrings
%assign enumValue = SLibGetEnumTypeValueFromIndex(outDType, enumIdx)
%assign writeOutCase = TLC_TRUE
%foreach tmpIdx = enumIdx
%if (enumValue == SLibGetEnumTypeValueFromIndex(outDType, tmpIdx))
%assign writeOutCase = TLC_FALSE
%continue
%endif
%endforeach
%if writeOutCase
%assign enumString = SLibGetEnumTypeCodeGenStringFromIndex(outDType, enumIdx)
case %<enumValue>:
%<outLabel> = %<enumString>;
break;
%endif
%endforeach
default:
%assign assertText = "false && /"Invalid value for enumerated data type '%<outDTypeName>'./""
%<LibGenMathFcnCall("utAssert",tSS_BOOLEAN,assertText,"")>;
/* Assigning default enumeration string */
%<outLabel> = %<FcnGetEnumTypeDefaultCodeGenString(outDType)>;
}
%else
%<outLabel> = (%<outDTypeName>) %<inLabel>;
%endif
%return 1
%endfunction
%function LibDataTypeIsShared(dtIdx)
%if ISFIELD(::CompiledModel.DataTypes.DataType[dtIdx], "IsShared")
%return ::CompiledModel.DataTypes.DataType[dtIdx].IsShared
%else
%return TLC_FALSE
%endif
%endfunction
%function (dt)
%return LibHeaderForDataTypeIdx(dt.Id)
%endfunction
%function (dt)
%return LibHeaderFromOPForDataTypeIdx(dt.Id)
%endfunction
%function (dt, val) void
%<LibSetHeaderForDataTypeIdx(dt.Id, val)>;
%endfunction
%function (dt, dtHeaderFile)
%assign dependsOnHeaderFiles = []
%if LibIsAliasDataType(dt.Id)
%assign aliasedToId = LibGetDataTypeIdAliasedToFromId(dt.Id)
%assign dependsOnHeaderFileQuoted = LibHeaderForDataTypeIdx(aliasedToId)
%if dependsOnHeaderFileQuoted != ""
%assign sz = SIZE(dependsOnHeaderFileQuoted)
%assign len = sz[1]
%assign dependsOnHeaderFile = Substring(dependsOnHeaderFileQuoted, 1, len-1)
%if dependsOnHeaderFile != dtHeaderFile
%assign dependsOnHeaderFiles = AddToHeaderFiles(dependsOnHeaderFiles, dependsOnHeaderFile)
%endif
%endif
%elseif LibIsStructDataType(dt.Id)
%assign numElements = dt.NumElements
%foreach eIdx = numElements
%assign eDtId = LibDataTypeElementDataTypeId(dt.Id, eIdx)
%assign dependsOnHeaderFileQuoted = LibHeaderForDataTypeIdx(eDtId)
%if dependsOnHeaderFileQuoted != ""
%assign sz = SIZE(dependsOnHeaderFileQuoted)
%assign len = sz[1]
%assign dependsOnHeaderFile = Substring(dependsOnHeaderFileQuoted, 1, len-1)
%if dependsOnHeaderFile != dtHeaderFile
%assign dependsOnHeaderFiles = AddToHeaderFiles(dependsOnHeaderFiles, dependsOnHeaderFile)
%endif
%endif
%if LibIsDataTypeMultiWordFixpt(eDtId)
%assign dependsOnHeaderFiles = AddToHeaderFiles(dependsOnHeaderFiles, SLibCoderMultiwordTypesFilename())
%endif
%endforeach
%endif
%return dependsOnHeaderFiles
%endfunction
%function (dt, headerFiles, dtHeaderFile)
%if LibIsAliasDataType(dt.Id)
%assign aliasedToId = LibGetDataTypeIdAliasedToFromId(dt.Id)
%assign dependsOnHeaderFile = LibHeaderForDataTypeIdx(aliasedToId)
%if dependsOnHeaderFile != "" && dependsOnHeaderFile != dtHeaderFile
%assign headerFiles = RemoveFromHeaderFiles(headerFiles, dependsOnHeaderFile)
%endif
%elseif LibIsStructDataType(dt.Id)
%assign numElements = dt.NumElements
%foreach eIdx = numElements
%assign eDtId = LibDataTypeElementDataTypeId(dt.Id, eIdx)
%assign dependsOnHeaderFile = LibHeaderForDataTypeIdx(eDtId)
%if dependsOnHeaderFile != "" && dependsOnHeaderFile != dtHeaderFile
%assign headerFiles = RemoveFromHeaderFiles(headerFiles, dependsOnHeaderFile)
%endif
%endforeach
%endif
%return headerFiles
%endfunction
%function LibPackageForDataType(dt)
%if dt.HasObject == 0
%return ""
%else
%return dt.Object.Package
%endif
%endfunction
%function LibClassForDataType(dt)
%if dt.HasObject == 0
%return ""
%else
%return dt.Object.Class
%endif
%endfunction
%function LibDescriptionForDataTypeIdx(id) void
%if !SLibDataTypeHasObject(id)
%return ""
%else
%return ::CompiledModel.DataTypes.DataType[id].Object.ObjectProperties.Description
%endif
%endfunction
%function (id) void
%if ISFIELD(::CompiledModel.DataTypes.DataType[id], "HeaderFile")
%return ::CompiledModel.DataTypes.DataType[id].HeaderFile
%else
%return ""
%endif
%endfunction
%function (id) void
%if ::CompiledModel.DataTypes.DataType[id].HasObject == 0
%return ""
%else
%if ISFIELD(::CompiledModel.DataTypes.DataType[id].Object.ObjectProperties, "HeaderFile")
%return ::CompiledModel.DataTypes.DataType[id].Object.ObjectProperties.HeaderFile
%else
%return ""
%endif
%endif
%endfunction
%function (id, val) void
%assign ::CompiledModel.DataTypes.DataType[id].HeaderFile = val
%endfunction
%function SLibDataTypeConstructFcnName(id) void
%if ISFIELD(::CompiledModel.DataTypes.DataType[id], "ConstructFcnName")
%return ::CompiledModel.DataTypes.DataType[id].ConstructFcnName
%else
%return ""
%endif
%endfunction
%function SLibDataTypeContainedDataFcn(id) void
%if ISFIELD(::CompiledModel.DataTypes.DataType[id], "ContainedData")
%return ::CompiledModel.DataTypes.DataType[id].ContainedData
%else
%return ""
%endif
%endfunction
%function SLibDataTypeDestructFcnName(id) void
%if ISFIELD(::CompiledModel.DataTypes.DataType[id], "DestructFcnName")
%return ::CompiledModel.DataTypes.DataType[id].DestructFcnName
%else
%return ""
%endif
%endfunction
%function SLibDataTypeDeepCopyFcnName(id) void
%if ISFIELD(::CompiledModel.DataTypes.DataType[id], "DeepCopyFcnName")
%return ::CompiledModel.DataTypes.DataType[id].DeepCopyFcnName
%else
%return ""
%endif
%endfunction
%function LibConvertBetweenTLCFcnName(id) void
%if ISFIELD(::CompiledModel.DataTypes.DataType[id], "ConvertBetweenTLCFcnName")
%return ::CompiledModel.DataTypes.DataType[id].ConvertBetweenTLCFcnName
%else
%return ""
%endif
%endfunction
%function LibConvertBetweenTLCFcnFile(id) void
%if ISFIELD(::CompiledModel.DataTypes.DataType[id], "ConvertBetweenTLCFcnFile")
%return ::CompiledModel.DataTypes.DataType[id].ConvertBetweenTLCFcnFile
%else
%return ""
%endif
%endfunction
%function LibIsPositiveTLCFcnName(id) void
%if ISFIELD(::CompiledModel.DataTypes.DataType[id], "IsPositiveTLCFcnName")
%return ::CompiledModel.DataTypes.DataType[id].IsPositiveTLCFcnName
%else
%return ""
%endif
%endfunction
%function LibIsPositiveTLCFcnFile(id) void
%if ISFIELD(::CompiledModel.DataTypes.DataType[id], "IsPositiveTLCFcnFile")
%return ::CompiledModel.DataTypes.DataType[id].IsPositiveTLCFcnFile
%else
%return ""
%endif
%endfunction
%function LibSignTLCFcnName(id) void
%if ISFIELD(::CompiledModel.DataTypes.DataType[id], "SignTLCFcnName")
%return ::CompiledModel.DataTypes.DataType[id].SignTLCFcnName
%else
%return ""
%endif
%endfunction
%function LibSignTLCFcnFile(id) void
%if ISFIELD(::CompiledModel.DataTypes.DataType[id], "SignTLCFcnFile")
%return ::CompiledModel.DataTypes.DataType[id].SignTLCFcnFile
%else
%return ""
%endif
%endfunction
%function LibGetDataTypeNameFromId(id) void
%assign dtName = ::CompiledModel.DataTypes.DataType[id].Name
%if dtName == "string"
%assign dtName = "char_T"
%endif
%return dtName
%endfunction
%function LibGetDataTypeSLNameFromId(id) void
%return ::CompiledModel.DataTypes.DataType[id].DTName
%endfunction
%function LibGetDataTypeSLSizeFromId(id) void
%return ::CompiledModel.DataTypes.DataType[id].Size
%endfunction
%function LibGetDataTypeIdAliasedThruToForNonBusDtype(id) void
%assert(id >= 0)
%if LibDataTypeIsBus(id)
%return id
%else
%return ::CompiledModel.DataTypes.DataType[id].IdAliasedThruTo
%endif
%endfunction
%function LibGetDataTypeIdAliasedThruToFromId(id) void
%return CGMODEL_ACCESS("SLType.GetSLTypeAliasedThroughToIdx", id)
%endfunction
%function LibGetDataTypeIdAliasedToFromId(id) void
%return ::CompiledModel.DataTypes.DataType[id].IdAliasedTo
%endfunction
%function LibGetDataTypeStorageIdFromId(id) void
%return ::CompiledModel.DataTypes.DataType[id].StorageId
%endfunction
%function LibGetDataTypeEnumFromId(id) void
%return ::CompiledModel.DataTypes.DataType[id].Enum
%endfunction
%function LibGetDataTypeComplexNameFromId(id) void
%return ::CompiledModel.DataTypes.DataType[id].ComplexName
%endfunction
%function LibGetRecordDataTypeId(rec) void
%if ISFIELD(rec, "DataTypeIdx")
%assign idx = rec.DataTypeIdx
%elseif ISFIELD(rec, "DataTypeId")
%assign idx = rec.DataTypeId
%else
%assign idx = LibGetRecordCGTypeIdx(rec)
%assign idx = LibCGTypeToSLType(idx)
%endif
%return ::CompiledModel.DataTypes.DataType[idx].Id
%endfunction
%function LibGetRecordStorageDataTypeId(rec) void
%return LibGetDataTypeStorageIdFromId(LibGetRecordDataTypeId(rec))
%endfunction
%function LibGetRecordContainerDataTypeId(rec) void
%if ISFIELD(rec, "DataTypeIdx")
%assign idx = rec.DataTypeIdx
%elseif ISFIELD(rec, "DataTypeId")
%assign idx = rec.DataTypeId
%else
%assign idx = SLibGetRecordContainerCGTypeIdx(rec)
%if idx >= ::CompiledModel.DataTypes.NumSLBuiltInDataTypes
%assign idx = LibCGTypeToSLType(idx)
%endif
%endif
%return ::CompiledModel.DataTypes.DataType[idx].Id
%endfunction
%function SLibGetVectorDimsForCGType(cgTypeIdx)
%if cgTypeIdx < ::CompiledModel.DataTypes.NumSLBuiltInDataTypes
%return ""
%else
%return LibCGTypeSymbolicVectorDims(cgTypeIdx)
%endif
%endfunction
%function LibGetRecordVectorDims(rec)
%assign cgTypeIdx = SLibGetRecordContainerCGTypeIdx(rec)
%return SLibGetVectorDimsForCGType(cgTypeIdx)
%endfunction
%function LibGetRecordVectorWidth(rec)
%assign cgTypeIdx = SLibGetRecordContainerCGTypeIdx(rec)
%if cgTypeIdx < ::CompiledModel.DataTypes.NumSLBuiltInDataTypes
%return ""
%else
%return LibCGTypeSymbolicVectorDims(cgTypeIdx)
%endif
%endfunction
%function LibGetRecordWidth(rec) void
%if ISFIELD(rec, "Width")
%return rec.Width
%elseif ISFIELD(rec, "CGTypeIdx")
%return LibCGTypeWidth(LibGetRecordCGTypeIdx(rec))
%else
%assign errTxt = "Width is not contained within the specified record"
%<LibReportFatalError(errTxt)>
%endif
%return 1
%endfunction
%function LibRecordHasSymbolicWidth(rec) void
%if ISFIELD(rec, "RecordType") && rec.RecordType == "ZcSignalInfo"
%return 0
%endif
%assign cgTypeIdx = SLibGetRecordContainerCGTypeIdx(rec)
%assign cgType = ::CompiledModel.CGTypes.CGType[cgTypeIdx]
%return ISFIELD(cgType, "SymbolicWidth")
%endfunction
%function LibGetRecordSymbolicWidth(rec) void
%assign cgTypeIdx = SLibGetRecordContainerCGTypeIdx(rec)
%if SLibIsNdIndexingFeatureOn()
%return LibGetRecordSymbolicDims(rec)
%elseif LibCGTypeIsConvertedToEmxArray(cgTypeIdx)
%return "1"
%else
%return LibCGTypeSymbolicWidth(cgTypeIdx)
%endif
%endfunction
%function LibGetRecordSymbolicDims(rec) void
%assign cgTypeIdx = SLibGetRecordContainerCGTypeIdx(rec)
%assign recWidth = LibCGTypeSymbolicWidth(cgTypeIdx)
%if recWidth == "1"
%return recWidth
%else
%return LibCGTypeSymbolicDims(cgTypeIdx)
%endif
%endfunction
%function LibGetRecordNumDimensions(rec) void
%if ISFIELD(rec, "NumDimensions")
%assign dimensions = rec.NumDimensions
%elseif ISFIELD(rec, "CGTypeIdx")
%assign dimensions = LibCGTypeNumDimensions(LibGetRecordCGTypeIdx(rec))
%else
%assign errTxt = "NumDimensions is not contained within the specified record"
%<LibReportFatalError(errTxt)>
%endif
%return dimensions
%endfunction
%function LibGetRecordNumDimsFromContainerCgTypeIdx(rec) void
%return LibCGTypeNumDimensions(SLibGetRecordContainerCGTypeIdx(rec))
%endfunction
%function LibGetRecordDimensions(rec) void
%if ISFIELD(rec, "Dimensions")
%assign dimensions = rec.Dimensions
%elseif ISFIELD(rec, "CGTypeIdx")
%assign dimensions = LibCGTypeDimensions(LibGetRecordCGTypeIdx(rec))
%else
%assign errTxt = "Dimensions is not contained within the specified record"
%<LibReportFatalError(errTxt)>
%endif
%return dimensions
%endfunction
%function LibGetRecordSymbolicDimensions(rec) void
%if ISFIELD(rec, "CGTypeIdx")
%assign dimensions = LibCGTypeSymbolicDimensions(LibGetRecordCGTypeIdx(rec))
%else
%assign errTxt = ...
"Symbolic dimensions are not contained within the specified record"
%<LibReportFatalError(errTxt)>
%endif
%return dimensions
%endfunction
%function LibGetRecordIsComplex(rec)
%if ISFIELD(rec, "RecordType") && rec.RecordType == "ZcSignalInfo"
%return 0
%endif
%if ISFIELD(rec, "ComplexSignal")
%if TYPE(rec.ComplexSignal) == "Number"
%return rec.ComplexSignal
%else
%return (rec.ComplexSignal == "yes")
%endif
%elseif ISFIELD(rec, "IsComplex")
%return rec.IsComplex
%elseif ISFIELD(rec, "CGTypeIdx")
%return LibCGTypeIsComplex(LibGetRecordCGTypeIdx(rec))
%else
%assign errTxt = "ComplexSignal is not contained within specified record."
%<LibReportFatalError(errTxt)>
%endif
%return 0
%endfunction
%function LibGetRecordDataTypeName(rec, reim)
%return LibGetRecordOptStdDataTypeName(rec, reim, TLC_FALSE)
%endfunction
%function LibGetRecordOptStdDataTypeName(rec, reim, useStdContainerName)
%if ISFIELD(rec, "CGTypeIdx")
%assign cgTypeIdx = SLibGetRecordContainerCGTypeIdx(rec)
%if reim != ""
%assign cgTypeIdx = LibCGTypeScalarBaseType(cgTypeIdx)
%endif
%return LibOptStdCGTypeName(cgTypeIdx, useStdContainerName)
%else
%if reim == "" && LibGetRecordIsComplex(rec)
%return LibGetDataTypeComplexNameFromId(LibGetRecordDataTypeId(rec))
%else
%return LibGetDataTypeNameFromId(LibGetRecordDataTypeId(rec))
%endif
%endif
%endfunction
%function LibGetRecordAliasedThruDataTypeName(rec, reim)
%assign id = LibGetDataTypeIdAliasedThruToFromId(LibGetRecordDataTypeId(rec))
%if reim == "" && LibGetRecordIsComplex(rec)
%return LibGetDataTypeComplexNameFromId(id)
%else
%return LibGetDataTypeNameFromId(id)
%endif
%endfunction
%function LibGetRecordCompositeDataTypeName(rec) void
%return LibGetRecordCompositeOptStdDataTypeName(rec, TLC_FALSE)
%endfunction
%function LibGetRecordCompositeOptStdDataTypeName(rec, useStdContainerName) void
%return LibGetRecordOptStdDataTypeName(rec, "", useStdContainerName)
%endfunction
%function SLibGetDtGroundName(dtID, isComplex, reim)
%assign dtRec = ::CompiledModel.DataTypes.DataType[dtID]
%assign isGroundComplex = ...
(reim == "" && isComplex)
%if ISFIELD(dtRec, "GroundVariableName") && ...
!isGroundComplex
%assign name = dtRec.GroundVariableName
%else
%if LibIsStructDataType(dtID) || ...
LibDoesDataTypeNeedConstructor(dtID)
%<SLibSetDataTypeGroundReqInMemory(dtID)>
%endif
%if isGroundComplex
%assign name = dtRec.ComplexGroundName
%else
%assign name = dtRec.GroundName
%endif
%if name == ""
%assign strTxt = reim == "" ? "Complex" : ""
%assign errTxt = "The name for ground has been requested, however, " ...
"it has not been set by SLibSetDataType%<strTxt>GroundName()."
%<LibReportFatalError(errTxt)>
%endif
%endif
%return name
%endfunction
%function LibGetGroundName(rec, reim) void
%assign dtID = LibGetRecordDataTypeId(rec)
%assign isComplex = LibGetRecordIsComplex(rec)
%return SLibGetDtGroundName(dtID, isComplex, reim)
%endfunction
%function LibGetGroundValue(rec, reim) void
%assign value = SLibGetGroundValueStrictOpt(rec, reim, 1)
%return value
%endfunction
%function SLibGetDtGroundValue(dtID, isComplex, reim, isStrict) void
%if reim == "" && isComplex
%assign errTxt = "Complex ground values are undefined."
%<LibReportFatalError(errTxt)>
%endif
%return SLibGetGroundValueFromIdStrictOpt(dtID, isStrict)
%endfunction
%function SLibGetGroundValueStrictOpt(rec, reim, isStrict) void
%assign dataTypeID = LibGetRecordDataTypeId(rec)
%assign isComplex = LibGetRecordIsComplex(rec)
%return SLibGetDtGroundValue(dataTypeID, isComplex, reim, isStrict)
%endfunction
%function FcnCacheGroundInitForStruct(dtIdx) void
%assign dt = ::CompiledModel.DataTypes.DataType[dtIdx]
%assert (LibIsStructDataType(dtIdx) && ISFIELD(dt, "NeedGroundInit") && dt.NeedGroundInit)
%assign numElements = dt.NumElements
%assign padded = 0
%assign gndHasFloats = 0
%openfile gndValue
{
%foreach eIdx = numElements
%assign padding = LibDataTypeElementPadding(dtIdx, eIdx)
%if eIdx < (numElements - 1) || padding > 0
%assign comma = ","
%else
%assign comma = ""
%endif
%assign eDtId = LibDataTypeElementDataTypeId(dtIdx, eIdx)
%assign eName = LibDataTypeElementName(dtIdx, eIdx)
%assign eIsComplex = LibDataTypeElementIsComplex(dtIdx, eIdx)
%assign groundInit = ::CompiledModel.DataTypes.DataType[eDtId].GroundInit
%assign eDtRec = ::CompiledModel.DataTypes.DataType[eDtId]
%if ISEMPTY(groundInit) && (LibIsStructDataType(eDtId) && ...
ISFIELD(eDtRec, "NeedGroundInit") && eDtRec.NeedGroundInit)
%<FcnCacheGroundInitForStruct(eDtId)>
%assign groundInit = ::CompiledModel.DataTypes.DataType[eDtId].GroundInit
%endif
%if !ISEMPTY(groundInit)
%assign eGround = groundInit
%else
%assign eGround = SLibGetIRorTLCGround(eDtId, 1, TLC_TRUE)
%endif
%if eIsComplex
%assign eGround = "{%<eGround>, %<eGround>}"
%endif
%assign eWidth = LibDataTypeElementWidth(dtIdx, eIdx)
%assign isStdContainer = LibDataTypeElementIsStdContainer(dtIdx, eIdx)
%if eWidth == 1 && !(LibIsDataTypeCGClassType(eDtId) && LibIsStringDataType(eDtId))
%<eGround>/
%else
%if LibIsStringDataType(eDtId)
""/
%else
%if isStdContainer
{ {
%else
{
%endif
%foreach elem = eWidth
%if elem > 0
, /
%endif
%<eGround>/
%endforeach
%if isStdContainer
} }
%else
}
%endif
%endif
%endif
%<comma> /* %<eName> */
%if padding > 0
%if eIdx < (numElements - 1)
%assign comma = ", "
%else
%assign comma = ""
%endif
%if padding == 1
0U%<comma> /* sl_padding%<padded> */
%else
{
%foreach j = padding
%if j < (padding - 1)
%assign padcomma = ", "
%else
%assign padcomma = ""
%endif
0U%<padcomma>/
%endforeach
}%<comma> /* sl_padding%<padded> */
%endif
%assign padded = padded + 1
%endif
%endforeach
} /
%closefile gndValue
%assign dt.GroundInit = gndValue
%assign dt.NeedGroundInit = 0
%endfunction
%function LibGetGroundInitFromId(dTypeId) void
%assign dtRec = ::CompiledModel.DataTypes.DataType[dTypeId]
%assign groundInit = dtRec.GroundInit
%if ISEMPTY(groundInit) && ...
(LibIsStructDataType(dTypeId) && ISFIELD(dtRec, "NeedGroundInit") && dtRec.NeedGroundInit)
%<FcnCacheGroundInitForStruct(dTypeId)>
%assign groundInit = ::CompiledModel.DataTypes.DataType[dTypeId].GroundInit
%endif
%if ISEMPTY(groundInit)
%assign groundInit = LibGetGroundValueFromId(dTypeId)
%endif
%return groundInit
%endfunction
%function LibGetGroundValueFromId(dTypeId) void
%assign value = SLibGetGroundValueFromIdStrictOpt(dTypeId,1)
%return value
%endfunction
%function SLibGetGroundValueFromIdStrictOpt(dTypeId,isStrict) void
%return SLibGetIRorTLCGround(dTypeId, isStrict, TLC_FALSE)
%endfunction
%function SLibGetIRorTLCGround(dTypeId, isStrict, onlyGetTLCGround) void
%assign dtRec = ::CompiledModel.DataTypes.DataType[dTypeId]
%assign useIRGroundName = ...
!onlyGetTLCGround && LibIsStructDataType(dTypeId) && ISFIELD(dtRec, "GroundVariableName")
%if (useIRGroundName)
%assign value = dtRec.GroundVariableName
%return value
%else
%assign value = dtRec.GroundValue
%if LibIsStructDataType(dTypeId) || LibDoesDataTypeNeedConstructor(dTypeId)
%<SLibSetDataTypeGroundReqInMemory(dTypeId)>
%endif
%if ISEQUAL(value, "")
%if isStrict
%assign errTxt = "The value for ground has been requested " ...
"without being set by SLibSetDataTypeGroundValue()"
%<LibReportFatalError(errTxt)>
%else
%assign value = 0
%endif
%endif
%endif
%return value
%endfunction
%function SLibIsSignedFromId(id) void
%switch LibGetDataTypeIdAliasedThruToFromId(id)
%case tSS_UINT8
%case tSS_UINT16
%case tSS_UINT32
%case tSS_BOOLEAN
%return 0
%case tSS_INT8
%case tSS_INT16
%case tSS_INT32
%case tSS_DOUBLE
%case tSS_SINGLE
%return 1
%default
%if LibIsHalfDataType(LibGetDataTypeIdAliasedThruToFromId(id))
%return 1
%endif
%assign errTxt = "Invalid data type %<dtypeName>."
%<LibBlockReportFatalError([], errTxt)>
%break
%endswitch
%endfunction
%function SLibIsUnsignedFromId(id) void
%return !SLibIsSignedFromId(id)
%endfunction
%function SLibGetMLidentFcnFromId(id) void
%switch LibGetDataTypeIdAliasedThruToFromId(id)
%case tSS_DOUBLE
%return "mxIsDouble"
%case tSS_SINGLE
%return "mxIsSingle"
%case tSS_UINT8
%return "mxIsUint8"
%case tSS_UINT16
%return "mxIsUint16"
%case tSS_UINT32
%return "mxIsUint32"
%case tSS_BOOLEAN
%return "mxIsLogical"
%case tSS_INT8
%return "mxIsInt8"
%case tSS_INT16
%return "mxIsInt16"
%case tSS_INT32
%return "mxIsInt32"
%default
%return "mxIsNumeric"
%endswitch
%endfunction
%function SLibGetANSICDataTypeFromId(id) void
%switch LibGetDataTypeIdAliasedThruToFromId(id)
%case tSS_DOUBLE
%return ::AnsiDataTypeName.tSS_DOUBLE
%case tSS_SINGLE
%return ::AnsiDataTypeName.tSS_SINGLE
%case tSS_UINT8
%return ::AnsiDataTypeName.tSS_UINT8
%case tSS_UINT16
%return ::AnsiDataTypeName.tSS_UINT16
%case tSS_UINT32
%return ::AnsiDataTypeName.tSS_UINT32
%case tSS_BOOLEAN
%return ::AnsiDataTypeName.tSS_BOOLEAN
%case tSS_INT8
%return ::AnsiDataTypeName.tSS_INT8
%case tSS_INT16
%return ::AnsiDataTypeName.tSS_INT16
%case tSS_INT32
%return ::AnsiDataTypeName.tSS_INT32
%default
%return "numeric"
%endswitch
%endfunction
%function SLibGetMLDataTypeFromId(id) void
%switch LibGetDataTypeIdAliasedThruToFromId(id)
%case tSS_DOUBLE
%return "double"
%case tSS_SINGLE
%return "single"
%case tSS_UINT8
%return "uint8"
%case tSS_UINT16
%return "uint16"
%case tSS_UINT32
%return "uint32"
%case tSS_BOOLEAN
%return "boolean"
%case tSS_INT8
%return "int8"
%case tSS_INT16
%return "int16"
%case tSS_INT32
%return "int32"
%default
%return "numeric"
%endswitch
%endfunction
%function SLibGetIdFromMLDataType(dtName)
%switch dtName
%case "double"
%return tSS_DOUBLE
%case "single"
%return tSS_SINGLE
%case "int32"
%return tSS_INT32
%case "int16"
%return tSS_INT16
%case "int8"
%return tSS_INT8
%case "uint32"
%return tSS_UINT32
%case "uint16"
%return tSS_UINT16
%case "uint8"
%return tSS_UINT8
%case "boolean"
%case "logical"
%return tSS_BOOLEAN
%case "half"
%return tSS_HALF
%default
%assign errTxt = "Unknown data type for: %<dtName>"
%<LibReportFatalError(errTxt)>
%endswitch
%endfunction
%function SLibIsUnsignedBuiltinFromId(id) void
%if LibIsBuiltInDataType(id)
%return SLibIsUnsignedFromId(id)
%else
%return 0
%endif
%endfunction
%function SLibIsIntegerFromId(id) void
%switch LibGetDataTypeIdAliasedThruToFromId(id)
%case tSS_UINT8
%case tSS_UINT16
%case tSS_UINT32
%case tSS_BOOLEAN
%case tSS_INT8
%case tSS_INT16
%case tSS_INT32
%case tSS_TIMER_UINT32_PAIR
%return 1
%case tSS_DOUBLE
%case tSS_SINGLE
%return 0
%default
%if LibIsHalfDataType(LibGetDataTypeIdAliasedThruToFromId(id))
%return 0
%endif
%assign errTxt = "Invalid data type %<dtypeName>."
%<LibBlockReportFatalError([], errTxt)>
%break
%endswitch
%endfunction
%function LibGetNumDataTypesInModel()
%return ::CompiledModel.DataTypes.NumDataTypes
%endfunction
%function LibStrictBooleanCheckEnabled()
%return ::CompiledModel.DataTypes.StrictBooleanCheckEnabled
%endfunction
%function SLibGetCGTypeFromSLTypeId(aSLTypeIdx)
%assign loopLimit = ::CompiledModel.CGTypes.NumCGTypes - aSLTypeIdx
%foreach idx = loopLimit
%assign cgTypeIdx = aSLTypeIdx + idx
%if ::CompiledModel.CGTypes.CGType[cgTypeIdx].SLTypeIdx == aSLTypeIdx
%return cgTypeIdx
%endif
%endforeach
%return -1
%endfunction
%function fcnSetDataTypeName(dataTypeRec, name, aSetCGTypeName) void
%assert ISFIELD(dataTypeRec, "Name")
%if ISEQUAL(dataTypeRec.Name,"") || ISEQUAL(dataTypeRec.Name,dataTypeRec.DTName)
%assign dataTypeRec.Name = name
%if aSetCGTypeName
%assign cgTypeIdx = SLibGetCGTypeFromSLTypeId(dataTypeRec.Id)
%if 0 <= cgTypeIdx
%assert dataTypeRec.Id <= cgTypeIdx
%assign cgTypeRec = ::CompiledModel.CGTypes.CGType[cgTypeIdx]
%assert cgTypeRec.SLTypeIdx == dataTypeRec.Id
%if ISFIELD(cgTypeRec, "Name")
%assign cgTypeRec.Name = name
%endif
%endif
%endif
%elseif !ISEQUAL(dataTypeRec.Name, name)
%assign errTxt = "Invalid data type name change from " ...
"'%<dataTypeRec.Name>' to '%<name>'"
%<LibReportFatalError(errTxt)>
%endif
%endfunction
%function SLibSetDataTypeName(dataTypeRec, name) void
%<fcnSetDataTypeName(dataTypeRec, name, TLC_TRUE)>
%endfunction
%function SLibSetDataTypeConvertBetweenTLCFcnName(dataTypeRec, name) void
%if !ISFIELD(dataTypeRec, "ConvertBetweenTLCFcnName")
%assign errTxt = "Unable to find 'ConvertBetweenTLCFcnName' field in the data type record " ...
"for %<dataTypeRec.DTName>"
%<LibReportFatalError(errTxt)>
%endif
%if ISEQUAL(dataTypeRec.ConvertBetweenTLCFcnName,"")
%assign dataTypeRec.ConvertBetweenTLCFcnName = name
%elseif !ISEQUAL(dataTypeRec.ConvertBetweenTLCFcnName, name)
%assign errTxt = "Invalid data type ConvertBetween TLC function name " ...
"from '%<dataTypeRec.ConvertBetweenTLCFcnName>' to '%<name>'"
%<LibReportFatalError(errTxt)>
%endif
%endfunction
%function SLibSetDataTypeConvertBetweenTLCFcnFile(dataTypeRec, file) void
%if !ISFIELD(dataTypeRec, "ConvertBetweenTLCFcnFile")
%assign errTxt = "Unable to find 'ConvertBetweenTLCFcnFile' field in the data type record " ...
"for %<dataTypeRec.Name>"
%<LibReportFatalError(errTxt)>
%endif
%if ISEQUAL(dataTypeRec.ConvertBetweenTLCFcnFile,"")
%assign dataTypeRec.ConvertBetweenTLCFcnFile = file
%elseif !ISEQUAL(dataTypeRec.ConvertBetweenTLCFcnFile, file)
%assign errTxt = "Invalid data type ConvertBetween TLC function file " ...
"from '%<dataTypeRec.ConvertBetweenTLCFcnFile>' to '%<file>'"
%<LibReportFatalError(errTxt)>
%endif
%endfunction
%function SLibSetDataTypeIsPositiveTLCFcnName(dataTypeRec, name) void
%if !ISFIELD(dataTypeRec, "IsPositiveTLCFcnName")
%assign errTxt = "Unable to find 'IsPositiveTLCFcnName' field in the data type record " ...
"for %<dataTypeRec.DTName>"
%<LibReportFatalError(errTxt)>
%endif
%if ISEQUAL(dataTypeRec.IsPositiveTLCFcnName,"")
%assign dataTypeRec.IsPositiveTLCFcnName = name
%elseif !ISEQUAL(dataTypeRec.IsPositiveTLCFcnName, name)
%assign errTxt = "Invalid data type IsPositive TLC function name " ...
"from '%<dataTypeRec.IsPositiveTLCFcnName>' to '%<name>'"
%<LibReportFatalError(errTxt)>
%endif
%endfunction
%function SLibSetDataTypeIsPositiveTLCFcnFile(dataTypeRec, file) void
%if !ISFIELD(dataTypeRec, "IsPositiveTLCFcnFile")
%assign errTxt = "Unable to find 'IsPositiveTLCFcnFile' field in the data type record " ...
"for %<dataTypeRec.Name>"
%<LibReportFatalError(errTxt)>
%endif
%if ISEQUAL(dataTypeRec.IsPositiveTLCFcnFile,"")
%assign dataTypeRec.IsPositiveTLCFcnFile = file
%elseif !ISEQUAL(dataTypeRec.IsPositiveTLCFcnFile, file)
%assign errTxt = "Invalid data type IsPositive TLC function file " ...
"from '%<dataTypeRec.IsPositiveTLCFcnFile>' to '%<file>'"
%<LibReportFatalError(errTxt)>
%endif
%endfunction
%function SLibSetDataTypeSignTLCFcnName(dataTypeRec, name) void
%if !ISFIELD(dataTypeRec, "SignTLCFcnName")
%assign errTxt = "Unable to find 'SignTLCFcnName' field in the data type record " ...
"for %<dataTypeRec.DTName>"
%<LibReportFatalError(errTxt)>
%endif
%if ISEQUAL(dataTypeRec.SignTLCFcnName,"")
%assign dataTypeRec.SignTLCFcnName = name
%elseif !ISEQUAL(dataTypeRec.SignTLCFcnName, name)
%assign errTxt = "Invalid data type Sign TLC function name " ...
"from '%<dataTypeRec.SignTLCFcnName>' to '%<name>'"
%<LibReportFatalError(errTxt)>
%endif
%endfunction
%function SLibSetDataTypeSignTLCFcnFile(dataTypeRec, file) void
%if !ISFIELD(dataTypeRec, "SignTLCFcnFile")
%assign errTxt = "Unable to find 'SignTLCFcnFile' field in the data type record " ...
"for %<dataTypeRec.Name>"
%<LibReportFatalError(errTxt)>
%endif
%if ISEQUAL(dataTypeRec.SignTLCFcnFile,"")
%assign dataTypeRec.SignTLCFcnFile = file
%elseif !ISEQUAL(dataTypeRec.SignTLCFcnFile, file)
%assign errTxt = "Invalid data type Sign TLC function file " ...
"from '%<dataTypeRec.SignTLCFcnFile>' to '%<file>'"
%<LibReportFatalError(errTxt)>
%endif
%endfunction
%function SLibSetDataTypeEnum(dataTypeRec, enum) void
%if !ISFIELD(dataTypeRec, "Enum")
%assign errTxt = "Unable to find 'Enum' field in the data type record " ...
"for %<dataTypeRec.DTName>"
%<LibReportFatalError(errTxt)>
%endif
%if ISEQUAL(dataTypeRec.Enum,"")
%assign dataTypeRec.Enum = enum
%elseif !ISEQUAL(dataTypeRec.Enum, enum)
%assign errTxt = "Invalid data type enum change from " ...
"'%<dataTypeRec.Enum>' to '%<enum>'"
%<LibReportFatalError(errTxt)>
%endif
%endfunction
%function SLibSetDataTypeComplexName(dataTypeRec, name) void
%if ISEQUAL(dataTypeRec.ComplexName, "")
%assign dataTypeRec.ComplexName = name
%elseif !ISEQUAL(dataTypeRec.ComplexName, name)
%assign errTxt = "Invalid complex data type name change from " ...
"'%<dataTypeRec.ComplexName>' to '%<name>'"
%<LibReportFatalError(errTxt)>
%endif
%endfunction
%function SLibSetDataTypeGroundName(dataTypeRec, name) void
%if dataTypeRec.GroundName == ""
%assign dataTypeRec.GroundName = name
%elseif dataTypeRec.GroundName != name
%assign errTxt = "Invalid ground name change from " ...
"'%<dataTypeRec.GroundName>' to '%<name>'"
%<LibReportFatalError(errTxt)>
%endif
%endfunction
%function SLibSetDataTypeComplexGroundName(dataTypeRec, name) void
%if dataTypeRec.ComplexGroundName == ""
%assign dataTypeRec.ComplexGroundName = name
%elseif dataTypeRec.ComplexGroundName != name
%assign errTxt = "Invalid complex ground name change from " ...
"'%<dataTypeRec.ComplexGroundName>' to '%<name>'"
%<LibReportFatalError(errTxt)>
%endif
%endfunction
%function SLibSetDataTypeGroundValue(dataTypeRec, value) void
%if ISEQUAL(dataTypeRec.GroundValue, "")
%assign dataTypeRec.GroundValue = value
%elseif !ISEQUAL(dataTypeRec.GroundValue, value)
%assign errTxt = "Invalid ground value change from " ...
"'%<dataTypeRec.GroundValue>' to '%<value>'"
%<LibReportFatalError(errTxt)>
%endif
%endfunction
%function SLibSetDataTypeGroundHasNonZero(dataTypeRec, gndHasNonZero) void
%assign dataTypeRec.GroundHasNonZero = gndHasNonZero
%endfunction
%function SLibGetDataTypeGroundHasNonZero(dataTypeRec)
%return dataTypeRec.GroundHasNonZero
%endfunction
%function SLibSetDataTypeGroundHasFloats(dataTypeRec, gndHasFloats) void
%assign dataTypeRec.GroundHasFloats = gndHasFloats
%endfunction
%function SLibSetDataTypeGroundInit(dataTypeRec, value) void
%if ISEMPTY(dataTypeRec.GroundInit)
%assign dataTypeRec.GroundInit = value
%elseif !ISEQUAL(dataTypeRec.GroundInit, value)
%assign errTxt = "Invalid ground initialization value change from " ...
"'%<dataTypeRec.GroundInit>' to '%<value>'"
%<LibReportFatalError(errTxt)>
%endif
%endfunction
%function SLibSetDataTypeGroundReqInMemory(dataTypeId) void
%assign dtRec = ::CompiledModel.DataTypes.DataType[dataTypeId]
%assign dtRec.GroundReqInMemory = 1
%endfunction
%function SLibSetDataTypeComplexGroundReqInMemory(dataTypeId) void
%assign dtRec = ::CompiledModel.DataTypes.DataType[dataTypeId]
%assign dtRec.ComplexGroundReqInMemory = 1
%endfunction
%function SLibGetDataTypeGroundReqInMemory(dataTypeId) void
%assign dtRec = ::CompiledModel.DataTypes.DataType[dataTypeId]
%return dtRec.GroundReqInMemory
%endfunction
%function SLibGetDataTypeComplexGroundReqInMemory(dataTypeId) void
%assign dtRec = ::CompiledModel.DataTypes.DataType[dataTypeId]
%return dtRec.ComplexGroundReqInMemory
%endfunction
%function SLibGetRecordDataTypeId(rec) void
%return LibGetRecordDataTypeId(rec)
%endfunction
%function SLibGetRecordIsComplex(rec)
%return LibGetRecordIsComplex(rec)
%endfunction
%function SLibGetRecordDataTypeName(rec, reim)
%return SLibGetRecordOptStdDataTypeName(rec, reim, TLC_FALSE)
%endfunction
%function SLibGetRecordOptStdDataTypeName(rec, reim, useStdContainer)
%return LibGetRecordOptStdDataTypeName(rec, reim, useStdContainer)
%endfunction
%function SLibGetRecordCompositeDataTypeName(rec) void
%return LibGetRecordCompositeDataTypeName(rec)
%endfunction
%function SLibGetGroundName(rec, reim) void
%return LibGetGroundName(rec, reim)
%endfunction
%function SLibGetGroundValue(rec, reim) void
%return LibGetGroundValue(rec, reim)
%endfunction
%function SLibGetGroundValueFromId(dTypeId) void
%return LibGetGroundValueFromId(dTypeId)
%endfunction
%function SLibGetStoredIntegerZeroFromId(dataTypeId) void
%assign storageDataTypeId = ...
LibGetDataTypeStorageIdFromId(...
LibGetDataTypeIdAliasedThruToFromId(dataTypeId))
%if LibIsBuiltInDataType(storageDataTypeId)
%assign value = 0
%else
%assign value = LibGetGroundValueFromId(storageDataTypeId)
%endif
%return value
%endfunction
%function SLibGetStoredIntegerZeroValue(rec,reim) void
%if reim == "" && LibGetRecordIsComplex(rec)
%assign errTxt = "Complex stored integer zero values are undefined."
%<LibReportFatalError(errTxt)>
%else
%assign dataTypeId = LibGetRecordDataTypeId(rec)
%assign value = SLibGetStoredIntegerZeroFromId(dataTypeId)
%endif
%return value
%endfunction
%function SLibGetDefaultInitialValueFromId(dataTypeId) void
%assign value = SLibGetGroundValueFromIdStrictOpt(dataTypeId,0)
%return value
%endfunction
%function SLibGetDefaultInitialValue(rec,reim) void
%assign value = SLibGetGroundValueStrictOpt(rec,reim,0)
%return value
%endfunction
%function SLibGetDefaultInitialValueByCGTypeIdx(typeIdx, reim) void
%createrecord rec { CGTypeIdx typeIdx }
%return SLibGetDefaultInitialValue(rec, reim)
%endfunction
%function SLibGetCastedValue(rec, numericValue)
%return(SLibGetCastedValueFromId(LibGetRecordDataTypeId(rec), numericValue))
%endfunction
%function SLibGetCastedValueFromId(dTypeId, numericValue)
%switch LibGetDataTypeIdAliasedThruToFromId(dTypeId)
%case tSS_DOUBLE
%return CAST("Real", numericValue)
%case tSS_SINGLE
%return CAST("Real32", numericValue)
%case tSS_UINT8
%case tSS_UINT16
%case tSS_UINT32
%case tSS_BOOLEAN
%return CAST("Unsigned", numericValue)
%case tSS_INT8
%case tSS_INT16
%case tSS_INT32
%return CAST("Number", numericValue)
%default
%if LibIsHalfDataType(LibGetDataTypeIdAliasedThruToFromId(dTypeId))
%return CAST("Real16", numericValue)
%endif
%return numericValue
%endswitch
%endfunction
%function LibMinIntValue(dtype) void
%assign dtypeName = LibGetDataTypeNameFromId(LibGetDataTypeIdAliasedThruToFromId(dtype))
%switch LibGetDataTypeIdAliasedThruToFromId(dtype)
%case tSS_UINT8
%case tSS_UINT16
%case tSS_UINT32
%return "((%<dtypeName>)(0U))"
%case tSS_INT8
%case tSS_INT16
%case tSS_INT32
%assign limitId = "MIN_%<dtypeName>"
%return "%"
%default
%assign errTxt = "Invalid data type %<dtypeName>."
%<LibBlockReportFatalError([], errTxt)>
%break
%endswitch
%endfunction
%function LibMaxIntValue(dtype) Output
%assign dtypeName = LibGetDataTypeNameFromId(LibGetDataTypeIdAliasedThruToFromId(dtype))
%switch LibGetDataTypeIdAliasedThruToFromId(dtype)
%case tSS_UINT8
%case tSS_UINT16
%case tSS_UINT32
%case tSS_INT8
%case tSS_INT16
%case tSS_INT32
%assign limitId = "MAX_%<dtypeName>"
%return "%"
%default
%assign errTxt = "Invalid data type %<dtypeName>."
%<LibBlockReportFatalError([], errTxt)>
%break
%endswitch
%endfunction
%function SLibReplaceEnumLiteralValueWithTypeLimitId(id, numericValue)
%assign aliasedThroughDataType = LibGetDataTypeIdAliasedThruToFromId(id)
%assert LibIsEnumDataType(aliasedThroughDataType)
%assign enumStorageTypeId = LibGetEnumTypeStorageType(aliasedThroughDataType)
%if enumStorageTypeId >= 0
%assign aliasedThroughDataType = enumStorageTypeId
%elseif LibIsEnumTypeStoredAsInt(aliasedThroughDataType)
%assign aliasedThroughDataType = tSS_INT32
%else
%assert TLC_FALSE
%endif
%switch aliasedThroughDataType
%case tSS_INT32
%if numericValue == int32MinValue
%return "%<LibMinIntValue(aliasedThroughDataType)>"
%endif
%endswitch
%return numericValue
%endfunction
%function SLibGetFormattedValueFromId(id, numericValue)
%assign dTypeName = LibGetDataTypeNameFromId(LibGetDataTypeIdAliasedThruToFromId(id))
%switch LibGetDataTypeIdAliasedThruToFromId(id)
%case tSS_DOUBLE
%<LibCheckValue(0, numericValue)>
%return "%<CAST("Real", numericValue)>"
%case tSS_SINGLE
%<LibCheckValue(0, numericValue)>
%return "%<CAST("Real32", numericValue)>"
%case tSS_UINT8
%if IntegerSizes.IntNumBits == 8
%return "%<CAST("Unsigned", numericValue)>"
%elseif IntegerSizes.IntNumBits >= 8
%return "((uint8_T)%<CAST("Unsigned", numericValue)>)"
%else
%return "((uint8_T)%<CAST("Unsigned", numericValue)>L)"
%endif
%case tSS_UINT16
%if IntegerSizes.IntNumBits == 16
%return "%<CAST("Unsigned", numericValue)>"
%elseif IntegerSizes.IntNumBits >= 16
%return "((uint16_T)%<CAST("Unsigned", numericValue)>)"
%else
%return "((uint16_T)%<CAST("Unsigned", numericValue)>L)"
%endif
%case tSS_UINT32
%if IntegerSizes.IntNumBits == 32
%return "%<CAST("Unsigned", numericValue)>"
%elseif IntegerSizes.IntNumBits >= 32
%return "((uint32_T)%<CAST("Unsigned", numericValue)>)"
%else
%return "((uint32_T)%<CAST("Unsigned", numericValue)>L)"
%endif
%case tSS_INT8
%if IntegerSizes.IntNumBits <= 8 && numericValue == -128
%return "%<LibMinIntValue(id)>"
%elseif IntegerSizes.IntNumBits >= 8
%return "%<CAST("Number", numericValue)>"
%else
%return "((int8_T)%<CAST("Number", numericValue)>L)"
%endif
%case tSS_INT16
%if IntegerSizes.IntNumBits <= 16 && numericValue == -32768
%return "%<LibMinIntValue(id)>"
%elseif IntegerSizes.IntNumBits >= 16
%return "%<CAST("Number", numericValue)>"
%else
%return "((int16_T)%<CAST("Number", numericValue)>L)"
%endif
%case tSS_INT32
%if numericValue == int32MinValue
%return "%<LibMinIntValue(id)>"
%elseif IntegerSizes.IntNumBits >= 32
%return "%<CAST("Number", numericValue)>"
%else
%return "((int32_T)%<CAST("Number", numericValue)>L)"
%endif
%case tSS_LONG
%case tSS_ULONG
%return "%<numericValue>"
%case tSS_LONG_LONG
%case tSS_ULONG_LONG
%return "%<numericValue>"
%case tSS_BOOLEAN
%return (numericValue != 0) ? "%" : "%"
%default
%if LibIsHalfDataType(LibGetDataTypeIdAliasedThruToFromId(id))
%<LibCheckValue(0, numericValue)>
%return "%<CAST("Real16", numericValue)>"
%endif
%if LibIsDataTypeMultiWordFixpt(id) && TYPE(numericValue)=="Number" && numericValue == 0
%if LibIsStructDataType(id)
%<SLibSetDataTypeGroundReqInMemory(id)>
%endif
%return "%<::CompiledModel.DataTypes.DataType[id].GroundName>"
%endif
%if LibIsEnumDataType(id)
%return "%<SLibGetEnumTypeCodeGenStringFromValue(id, numericValue)>"
%endif
%return "%<numericValue>"
%endswitch
%endfunction
%function SLibGetFormattedValue(rec, numericValue)
%return SLibGetFormattedValueFromId(LibGetRecordDataTypeId(rec), numericValue)
%endfunction
%function LibComplexConvertBetweenForSrcId(dstId, srcId, cmplx, input, ...
options, output) Output
%assign ConvertBetweenFcn = ...
LibConvertBetweenTLCFcnName(srcId)
%if !cmplx
%assign status = %<ConvertBetweenFcn>(dstId,srcId,input,options,output)
%return status
%else
%assign realInput = "%<input>.%<tRealPart>"
%assign imagInput = "%<input>.%<tImagPart>"
%assign realOutput = "%<output>.%<tRealPart>"
%assign imagOutput = "%<output>.%<tImagPart>"
%assign status = %<ConvertBetweenFcn>(dstId,srcId,realInput,options,realOutput)
%if status != 1
%return status
%endif
%assign status = %<ConvertBetweenFcn>(dstId,srcId,imagInput,options,imagOutput)
%return status
%endif
%endfunction
%function SLibDeepCopyData(id, dst, src) Output
%assign DeepCopyFcn = SLibDataTypeDeepCopyFcnName(id)
%assign status = 1
%if !ISEMPTY(DeepCopyFcn)
%assign status = %<DeepCopyFcn>(id, dst, src)
%endif
%return status
%endfunction
%function LibOutputExprCast(srcBlk, idx)
%assign cast = ""
%if !SLibBlockIntegerDowncastRequired(srcBlk)
%return cast
%endif
%assign dtype = LibGetRecordDataTypeId(srcBlk.DataOutputPort[idx])
%assign storageId = ::CompiledModel.DataTypes.DataType[dtype].StorageId
%if LibIsBuiltInDataType(storageId)
%if SLibIsIntegerFromId(storageId)
%if ::CompiledModel.IntegerSizesExists
%switch storageId
%case tSS_UINT8
%case tSS_INT8
%if 8 < IntegerSizes.IntNumBits
%assign cast = "(%<LibGetDataTypeNameFromId(storageId)>)"
%endif
%break
%case tSS_INT16
%case tSS_UINT16
%if 16 < IntegerSizes.IntNumBits
%assign cast = "(%<LibGetDataTypeNameFromId(storageId)>)"
%endif
%break
%default
%break
%endswitch
%else
%switch storageId
%case tSS_UINT8
%case tSS_UINT16
%case tSS_INT8
%case tSS_INT16
%assign cast = "(%<LibGetDataTypeNameFromId(storageId)>)"
%break
%default
%break
%endswitch
%endif
%endif
%elseif !LibIsStructDataType(dtype)
%assign cast = "(%<LibGetDataTypeNameFromId(dtype)>)"
%endif
%return cast
%endfunction
%function SLibConvertBetweenBuiltin(outDType,inDType,inLabel,options,outLabel) Output
%if outDType == tSS_BOOLEAN
%if inDType == tSS_BOOLEAN
%<outLabel> = %<inLabel>;
%else
%assign zero = SLibGetFormattedValueFromId(inDType, 0)
%<outLabel> = %<inLabel> != %<zero>;
%endif
%else
%assign outDTypeName = LibGetDataTypeNameFromId(outDType)
%<outLabel> = (%<outDTypeName>) %<inLabel>;
%endif
%return 1
%endfunction
%function SLibIsPositiveBuiltin(inDType, inLabel, options, outLabel) Output
%if inDType == tSS_BOOLEAN
%<outLabel> = %<inLabel>;
%else
%assign zero = SLibGetFormattedValueFromId(inDType, 0)
%<outLabel> = %<inLabel> > %<zero>;
%endif
%return 1
%endfunction
%function SLibSignBuiltin(inDType, inLabel, options, outLabel) Output
%if inDType == tSS_BOOLEAN
%<outLabel> = %<inLabel>;
%else
%assign zero = SLibGetFormattedValueFromId(inDType, 0)
if (%<inLabel> > %<zero>) {
%<outLabel> = 1;
} else if (%<inLabel> < %<zero>) {
%<outLabel> = -1;
} else {
%<outLabel> = 0;
}
%endif
%return 1
%endfunction
%function SLibSigToLogDataType(sigDataType, usedLogDataType) void
%if LibIsBuiltInDataType(sigDataType)
%return sigDataType
%else
%return usedLogDataType
%endif
%endfunction
%function SLibHandleSaturateOnOverflow(block) void
%if block.ParamSettings.SaturateOnOverflow == "Needed"
%assign doSaturate = 1
%else
%assign doSaturate = 0
%endif
%return doSaturate
%endfunction
%function GetOrderedDataTypeIdx(DtIdxMap) void
%with ::CompiledModel
%createrecord DtIdxAnonymousStructs { }
%foreach dtIdx = ::CompiledModel.DataTypes.NumDataTypes
%if (LibDataTypeIsAnonymousStruct(dtIdx) == TLC_FALSE)
%addtorecord DtIdxMap Dt { idx %<dtIdx> }
%else
%addtorecord DtIdxAnonymousStructs Dt { idx %<dtIdx> }
%endif
%endforeach
%if !ISEMPTY(DtIdxAnonymousStructs)
%foreach idx = SIZE(DtIdxAnonymousStructs.Dt, 1)
%addtorecord DtIdxMap Dt {idx DtIdxAnonymousStructs.Dt[idx].idx}
%endforeach
%endif
%endwith
%endfunction
%function FcnIsDataTypeTargetInt(dTypeId)
%if ((dTypeId < 0) || (dTypeId >= ::CompiledModel.DataTypes.NumDataTypes) ...
|| (LibIsBuiltInDataType(dTypeId)))
%return 0
%else
%assign aliasDT = LibGetDataTypeIdAliasedToFromId(dTypeId)
%if ((aliasDT == ::CompiledModel.tSS_INTEGER) ...
|| (aliasDT == ::CompiledModel.tSS_UINTEGER))
%return 1
%else
%return 0
%endif
%endif
%endfunction
%function FcnMapIfEquivToTargetInt(dTypeId) void
%if (LibIsBuiltInDataType(dTypeId) || LibIsAliasDataType(dTypeId))
%return
%elseif ::CompiledModel.DataTypes.DataType[dTypeId].IsFixedPoint
%assign tgtIntBitStr = "sfix" + "%<IntegerSizes.IntNumBits>"
%assign tgtUIntBitStr = "ufix" + "%<IntegerSizes.IntNumBits>"
%assign dt = ::CompiledModel.DataTypes.DataType[dTypeId]
%if dt.DTName == tgtIntBitStr
%assign dt.IdAliasedTo = ::CompiledModel.tSS_INTEGER
%elseif dt.DTName == tgtUIntBitStr
%assign dt.IdAliasedTo = ::CompiledModel.tSS_UINTEGER
%endif
%endif
%endfunction
%function SLibSetupDatatypeInfo() void
%<LibAddToCompiledModel("tSS_LONG", INT32MIN)>
%<LibAddToCompiledModel("tSS_ULONG", INT32MIN+3)>
%<LibAddToCompiledModel("tSS_LONG_LONG", INT32MIN+4)>
%<LibAddToCompiledModel("tSS_ULONG_LONG", INT32MIN+5)>
%<LibAddToCompiledModel("tSS_VOID", INT32MIN+1)>
%<LibAddToCompiledModel("tSS_SIZET", INT32MIN+2)>
%<LibAddToCompiledModel("tSS_UINTEGER", INT32MIN+6)>
%assign LargestMultiwordBits = %<SLibGetLargestMultiwordDataTypeNeeded()>
%<LibAddToCompiledModel("LargestMultiwordBits", LargestMultiwordBits)>
%<LibAddToCompiledModel("DeclaredFixedPointWordSizeUsage", 0)>
%<DeclareFixedPointWordSizeUsage(::CompiledModel.CGTypes.DeclareUsedMultiWordBits)>
%<LibAddToCompiledModel("DeclaredHalfPrecisionUsage", TLC_FALSE)>
%createrecord dtIdxMap { }
%<GetOrderedDataTypeIdx(dtIdxMap)>
%with ::CompiledModel
%foreach dtIdx0 = ::CompiledModel.DataTypes.NumDataTypes
%assign dtIdx = dtIdxMap.Dt[dtIdx0].idx
%assign dt = ::CompiledModel.DataTypes.DataType[dtIdx]
%<LibAddIdentifier(dt, "Name", "")>
%<LibAddIdentifier(dt, "ConvertBetweenTLCFcnName", "")>
%<LibAddIdentifier(dt, "IsPositiveTLCFcnName", "")>
%<LibAddIdentifier(dt, "SignTLCFcnName", "")>
%<LibAddIdentifier(dt, "ConvertBetweenTLCFcnFile", "")>
%<LibAddIdentifier(dt, "IsPositiveTLCFcnFile", "")>
%<LibAddIdentifier(dt, "SignTLCFcnFile", "")>
%<LibAddIdentifier(dt, "Enum", "")>
%<LibAddIdentifier(dt, "GroundName", "")>
%<LibAddIdentifier(dt, "GroundValue", "")>
%<LibAddIdentifier(dt, "GroundInit", "")>
%<LibAddIdentifier(dt, "GroundReqInMemory", 0)>
%<LibAddIdentifier(dt, "GroundHasFloats", 0)>
%<LibAddIdentifier(dt, "ComplexName", "")>
%<LibAddIdentifier(dt, "ComplexGroundName", "")>
%<LibAddIdentifier(dt, "ComplexGroundReqInMemory", 0)>
%switch dt.DTName
%case "double"
%<fcnSetDataTypeName(dt, "real_T", TLC_FALSE)>
%<SLibSetDataTypeEnum(dt, "SS_DOUBLE")>
%<SLibSetDataTypeConvertBetweenTLCFcnName(dt, ...
"SLibConvertBetweenBuiltin")>
%<SLibSetDataTypeIsPositiveTLCFcnName(dt, "SLibIsPositiveBuiltin")>
%<SLibSetDataTypeSignTLCFcnName(dt, "SLibSignBuiltin")>
%<LibAddToCompiledModel("tSS_DOUBLE", dt.Id)>
%assign gndName = "%<::CompiledModel.Name>_RGND"
%<SLibSetDataTypeGroundName(dt, gndName)>
%<SLibSetDataTypeGroundValue(dt, 0.0)>
%<SLibSetDataTypeGroundHasFloats(dt, 1)>
%<SLibSetDataTypeComplexName(dt, "creal_T")>
%<SLibSetDataTypeComplexGroundName(dt, gndName + "_Complex")>
%break
%case "single"
%<fcnSetDataTypeName(dt, "real32_T", TLC_FALSE)>
%<SLibSetDataTypeEnum(dt, "SS_SINGLE")>
%<SLibSetDataTypeConvertBetweenTLCFcnName(dt, ...
"SLibConvertBetweenBuiltin")>
%<SLibSetDataTypeIsPositiveTLCFcnName(dt, "SLibIsPositiveBuiltin")>
%<SLibSetDataTypeSignTLCFcnName(dt, "SLibSignBuiltin")>
%<LibAddToCompiledModel("tSS_SINGLE", dt.Id)>
%assign gndName = "%<::CompiledModel.Name>_R32GND"
%<SLibSetDataTypeGroundName(dt, gndName)>
%<SLibSetDataTypeGroundValue(dt, "0.0F")>
%<SLibSetDataTypeGroundHasFloats(dt, 1)>
%<SLibSetDataTypeComplexName(dt, "creal32_T")>
%<SLibSetDataTypeComplexGroundName(dt, gndName + "_Complex")>
%break
%case "half"
%<FixPt_RegisterHalfAsBuiltInType(dtIdx)>
%break
%case "boolean"
%<fcnSetDataTypeName(dt, "boolean_T", TLC_FALSE)>
%<SLibSetDataTypeEnum(dt, "SS_BOOLEAN")>
%<SLibSetDataTypeConvertBetweenTLCFcnName(dt, ...
"SLibConvertBetweenBuiltin")>
%<SLibSetDataTypeIsPositiveTLCFcnName(dt, "SLibIsPositiveBuiltin")>
%<SLibSetDataTypeSignTLCFcnName(dt, "SLibSignBuiltin")>
%<LibAddToCompiledModel("tSS_BOOLEAN", dt.Id)>
%assign gndName = "%<::CompiledModel.Name>_BGND"
%<SLibSetDataTypeGroundName(dt, gndName)>
%<SLibSetDataTypeGroundValue(dt, "%")>
%break
%case "int8"
%<fcnSetDataTypeName(dt, "int8_T", TLC_FALSE)>
%<SLibSetDataTypeEnum(dt, "SS_INT8")>
%<SLibSetDataTypeConvertBetweenTLCFcnName(dt, ...
"SLibConvertBetweenBuiltin")>
%<SLibSetDataTypeIsPositiveTLCFcnName(dt, "SLibIsPositiveBuiltin")>
%<SLibSetDataTypeSignTLCFcnName(dt, "SLibSignBuiltin")>
%<LibAddToCompiledModel("tSS_INT8", dt.Id)>
%assign gndName = "%<::CompiledModel.Name>_I8GND"
%<SLibSetDataTypeGroundName(dt, gndName)>
%<SLibSetDataTypeGroundValue(dt, 0)>
%<SLibSetDataTypeComplexName(dt, "cint8_T")>
%<SLibSetDataTypeComplexGroundName(dt, gndName + "_Complex")>
%break
%case "uint8"
%<fcnSetDataTypeName(dt, "uint8_T", TLC_FALSE)>
%<SLibSetDataTypeEnum(dt, "SS_UINT8")>
%<SLibSetDataTypeConvertBetweenTLCFcnName(dt, ...
"SLibConvertBetweenBuiltin")>
%<SLibSetDataTypeIsPositiveTLCFcnName(dt, "SLibIsPositiveBuiltin")>
%<SLibSetDataTypeSignTLCFcnName(dt, "SLibSignBuiltin")>
%<LibAddToCompiledModel("tSS_UINT8", dt.Id)>
%assign gndName = "%<::CompiledModel.Name>_U8GND"
%<SLibSetDataTypeGroundName(dt, gndName)>
%<SLibSetDataTypeGroundValue(dt, 0U)>
%<SLibSetDataTypeComplexName(dt, "cuint8_T")>
%<SLibSetDataTypeComplexGroundName(dt, gndName + "_Complex")>
%break
%case "int16"
%<fcnSetDataTypeName(dt, "int16_T", TLC_FALSE)>
%<SLibSetDataTypeEnum(dt, "SS_INT16")>
%<SLibSetDataTypeConvertBetweenTLCFcnName(dt, ...
"SLibConvertBetweenBuiltin")>
%<SLibSetDataTypeIsPositiveTLCFcnName(dt, "SLibIsPositiveBuiltin")>
%<SLibSetDataTypeSignTLCFcnName(dt, "SLibSignBuiltin")>
%<LibAddToCompiledModel("tSS_INT16", dt.Id)>
%assign gndName = "%<::CompiledModel.Name>_I16GND"
%<SLibSetDataTypeGroundName(dt, gndName)>
%<SLibSetDataTypeGroundValue(dt, 0)>
%<SLibSetDataTypeComplexName(dt, "cint16_T")>
%<SLibSetDataTypeComplexGroundName(dt, gndName + "_Complex")>
%break
%case "uint16"
%<fcnSetDataTypeName(dt, "uint16_T", TLC_FALSE)>
%<SLibSetDataTypeEnum(dt, "SS_UINT16")>
%<SLibSetDataTypeConvertBetweenTLCFcnName(dt, ...
"SLibConvertBetweenBuiltin")>
%<SLibSetDataTypeIsPositiveTLCFcnName(dt, "SLibIsPositiveBuiltin")>
%<SLibSetDataTypeSignTLCFcnName(dt, "SLibSignBuiltin")>
%<LibAddToCompiledModel("tSS_UINT16", dt.Id)>
%assign gndName = "%<::CompiledModel.Name>_U16GND"
%<SLibSetDataTypeGroundName(dt, gndName)>
%<SLibSetDataTypeGroundValue(dt, 0U)>
%<SLibSetDataTypeComplexName(dt, "cuint16_T")>
%<SLibSetDataTypeComplexGroundName(dt, gndName + "_Complex")>
%break
%case "int32"
%<fcnSetDataTypeName(dt, "int32_T", TLC_FALSE)>
%<SLibSetDataTypeEnum(dt, "SS_INT32")>
%<SLibSetDataTypeConvertBetweenTLCFcnName(dt, ...
"SLibConvertBetweenBuiltin")>
%<SLibSetDataTypeIsPositiveTLCFcnName(dt, "SLibIsPositiveBuiltin")>
%<SLibSetDataTypeSignTLCFcnName(dt, "SLibSignBuiltin")>
%<LibAddToCompiledModel("tSS_INT32", dt.Id)>
%assign gndName = "%<::CompiledModel.Name>_I32GND"
%<SLibSetDataTypeGroundName(dt, gndName)>
%<SLibSetDataTypeGroundValue(dt, 0)>
%<SLibSetDataTypeComplexName(dt, "cint32_T")>
%<SLibSetDataTypeComplexGroundName(dt, gndName + "_Complex")>
%break
%case "uint32"
%<fcnSetDataTypeName(dt, "uint32_T", TLC_FALSE)>
%<SLibSetDataTypeEnum(dt, "SS_UINT32")>
%<SLibSetDataTypeConvertBetweenTLCFcnName(dt, ...
"SLibConvertBetweenBuiltin")>
%<SLibSetDataTypeIsPositiveTLCFcnName(dt, "SLibIsPositiveBuiltin")>
%<SLibSetDataTypeSignTLCFcnName(dt, "SLibSignBuiltin")>
%<LibAddToCompiledModel("tSS_UINT32", dt.Id)>
%assign gndName = "%<::CompiledModel.Name>_U32GND"
%<SLibSetDataTypeGroundName(dt, gndName)>
%<SLibSetDataTypeGroundValue(dt, 0U)>
%<SLibSetDataTypeComplexName(dt, "cuint32_T")>
%<SLibSetDataTypeComplexGroundName(dt, gndName + "_Complex")>
%break
%case "fcn_call"
%<fcnSetDataTypeName(dt, "fcn_call_T", TLC_FALSE)>
%<SLibSetDataTypeEnum(dt, "SS_FCN_CALL")>
%<LibAddToCompiledModel("tSS_FCN_CALL", dt.Id)>
%break
%case "pointer"
%<fcnSetDataTypeName(dt, "pointer_T", TLC_FALSE)>
%<SLibSetDataTypeEnum(dt, "SS_POINTER")>
%<SLibSetDataTypeGroundValue(dt, 0)>
%<LibAddToCompiledModel("tSS_POINTER", dt.Id)>
%break
%case "integer"
%<fcnSetDataTypeName(dt, "int_T", TLC_FALSE)>
%<SLibSetDataTypeEnum(dt, "SS_INTEGER")>
%<LibAddToCompiledModel("tSS_INTEGER", dt.Id)>
%break
%case "action"
%<fcnSetDataTypeName(dt, "action_T", TLC_FALSE)>
%break
%case "timer_uint32_pair"
%<fcnSetDataTypeName(dt, "timer_uint32_pair_T", TLC_FALSE)>
%<SLibSetDataTypeEnum(dt, "SS_TIMER_UINT32_PAIR")>
%<LibAddToCompiledModel("tSS_TIMER_UINT32_PAIR", dt.Id)>
%break
%default
%<fcnSetDataTypeName(dt,dt.DTName, TLC_FALSE)>
%assign aIdx = dt.IdAliasedThruTo
%if LibIsEnumDataType(dtIdx)
%<SLibSetDataTypeConvertBetweenTLCFcnName(dt, ...
"SLibConvertBetweenEnumType")>
%assign gndName = "%<::CompiledModel.Name>_%<dt.Name>GND"
%<SLibSetDataTypeGroundName(dt, gndName)>
%<SLibSetDataTypeGroundValue(dt, FcnGetEnumTypeDefaultCodeGenString(dtIdx))>
%elseif LibIsStructDataType(dtIdx)
%assign gndName = "%<::CompiledModel.Name>_rtZ%<dt.Name>"
%<SLibSetDataTypeGroundName(dt, "%<gndName>")>
%<SLibSetDataTypeGroundValue(dt, "%<gndName>")>
%assign gndHasFloats = 0
%foreach eIdx = dt.NumElements
%assign eDtId = LibDataTypeElementDataTypeId(dtIdx, eIdx)
%assign gndHasFloats = gndHasFloats || ...
::CompiledModel.DataTypes.DataType[eDtId].GroundHasFloats
%endforeach
%assign dt.GroundHasFloats = gndHasFloats
%addtorecord dt NeedGroundInit 1
%elseif LibIsStringDataType(dtIdx) && !LibIsDataTypeCGClassType(dtIdx)
%assign gndName = "%<::CompiledModel.Name>_STRING_GND"
%<SLibSetDataTypeGroundName(dt, gndName)>
%<SLibSetDataTypeGroundValue(dt, "0")>
%elseif LibDoesDataTypeNeedConstructor(dtIdx)
%assign gndName = "%<::CompiledModel.Name>_rtZ_%<dt.Name>"
%assign gndName = FEVAL("strrep",gndName,"::","_")
%<SLibSetDataTypeGroundName(dt, gndName)>
%<SLibSetDataTypeGroundValue(dt, "%<gndName>")>
%elseif aIdx != dtIdx
%assign aDt = ::CompiledModel.DataTypes.DataType[aIdx]
%<SLibSetDataTypeEnum(dt, aDt.Enum)>
%<SLibSetDataTypeConvertBetweenTLCFcnName(dt, ...
aDt.ConvertBetweenTLCFcnName)>
%<SLibSetDataTypeIsPositiveTLCFcnName(dt, ...
aDt.IsPositiveTLCFcnName)>
%<SLibSetDataTypeSignTLCFcnName(dt, ...
aDt.SignTLCFcnName)>
%<SLibSetDataTypeConvertBetweenTLCFcnFile(dt, ...
aDt.ConvertBetweenTLCFcnFile)>
%<SLibSetDataTypeIsPositiveTLCFcnFile(dt, ...
aDt.IsPositiveTLCFcnFile)>
%<SLibSetDataTypeSignTLCFcnFile(dt, ...
aDt.SignTLCFcnFile)>
%assign gndName = "%<::CompiledModel.Name>_%<dt.Name>GND"
%<SLibSetDataTypeGroundName(dt, gndName)>
%<SLibSetDataTypeGroundValue(dt, aDt.GroundValue)>
%<SLibSetDataTypeGroundInit(dt, aDt.GroundInit)>
%<SLibSetDataTypeGroundHasNonZero(dt, aDt.GroundHasNonZero)>
%<SLibSetDataTypeGroundHasFloats(dt, aDt.GroundHasFloats)>
%if LibGetDataTypeComplexNameFromId(aIdx) != ""
%assign cName = "c%<dt.Name>"
%<SLibSetDataTypeComplexName(dt, cName)>
%<SLibSetDataTypeComplexGroundName(dt, gndName + "_Complex")>
%endif
%elseif LibPackageForDataType(dt) == "Simulink" && ...
LibClassForDataType(dt) == "OpaqueType"
%<SLibSetDataTypeGroundValue(dt, 0)>
%endif
%<FcnMapIfEquivToTargetInt(dtIdx)>
%break
%endswitch
%<FixPt_DataTypeSetup(dtIdx)>
%endforeach
%<LibAddToCompiledModel("tSS_INVALID_DATA_TYPE_ID", -10)>
%endwith
%endfunction
%function LibDumpFixptOddSizeTypedefs() void
%if ISFIELD(::CompiledModel, "FixptOddSizeTypedefs") && !WHITE_SPACE(CompiledModel.FixptOddSizeTypedefs)
%return "/n%<::CompiledModel.FixptOddSizeTypedefs>"
%else
%return ""
%endif
%endfunction
%function SLibUpdateAlignmentForBusTypeHelper(aTypeIdx, align) void
%foreach idx = LibCGTypeNumMembers(aTypeIdx)
%assign mCGTIdx = LibCGTypeMemberCGTypeIdx(aTypeIdx, idx)
%if SLibCGTypeIsStructStrict(mCGTIdx)
%<SLibUpdateAlignmentForBusTypeHelper(mCGTIdx, align)>
%else
%assign dtIdx = ::CompiledModel.CGTypes.CGType[aTypeIdx].SLTypeIdx
%assign memberDT = ::CompiledModel.DataTypes.DataType[dtIdx]
%if !ISFIELD(memberDT, "Alignment")
%addtorecord ::CompiledModel.DataTypes.DataType[dtIdx] Alignment align
%elseif ::CompiledModel.DataTypes.DataType[dtIdx].Alignment < align
%assign ::CompiledModel.DataTypes.DataType[dtIdx].Alignment = align
%endif
%endif
%endforeach
%endfunction
%function SLibUpdateAlignmentForBusType() void
%foreach idx = ::CompiledModel.CGTypes.NumCGTypes
%assign cgType = ::CompiledModel.CGTypes.CGType[idx]
%if SLibCGTypeIsStructStrict(idx)
%if cgType.SLTypeIdx > 0
%assign dtIdx = cgType.SLTypeIdx
%assign SLdt = ::CompiledModel.DataTypes.DataType[dtIdx]
%assign align = LibCGTypeStructAlignment(idx)
%if (ISFIELD(SLdt,"Object") ...
&& ISFIELD(SLdt.Object,"ObjectProperties") ...
&& ISFIELD(SLdt.Object.ObjectProperties,"Alignment") ...
&& SLdt.Object.ObjectProperties.Alignment > LibCGTypeStructAlignment(idx))
%assign align = SLdt.Object.ObjectProperties.Alignment
%endif
%if align>0
%if !ISFIELD(SLdt, "Alignment")
%addtorecord ::CompiledModel.DataTypes.DataType[dtIdx] Alignment align
%elseif ::CompiledModel.DataTypes.DataType[dtIdx].Alignment < align
%assign ::CompiledModel.DataTypes.DataType[dtIdx].Alignment = align
%endif
%endif
%endif
%foreach mIdx = LibCGTypeNumMembers(idx)
%assign memberAlignment = LibCGTypeMemberAlignment(idx, mIdx)
%assign memberCGTypeIdx = LibCGTypeMemberCGTypeIdx(idx, mIdx)
%if memberAlignment > 0 && ...
SLibCGTypeIsStructStrict(memberCGTypeIdx)
%<SLibUpdateAlignmentForBusTypeHelper(memberCGTypeIdx, memberAlignment)>
%
%endif
%endforeach
%endif
%endforeach
%foreach idx = ::CompiledModel.BlockOutputs.NumLocalBlockOutputs
%assign lbo = ::CompiledModel.BlockOutputs.LocalBlockOutput[idx]
%assign align = lbo.Alignment
%if align > 0
%if SLibCGTypeIsStructStrict(lbo.CGTypeIdx)
%<SLibUpdateAlignmentForBusTypeHelper(lbo.CGTypeIdx, align)>
%assign ::CompiledModel.BlockOutputs.LocalBlockOutput[idx].Alignment = -1
%endif
%endif
%endforeach
%endfunction
%function Substring(s, start, end)
%assign ret = ""
%assign len = end-start
%foreach i = len
%assign ret = ret + s[start+i]
%endforeach
%return ret
%endfunction
%function (headerFiles, headerFile)
%assign numHeaderFiles = SIZE(headerFiles, 1)
%if numHeaderFiles == 0
%return TLC_FALSE
%else
%assign duplicate = TLC_FALSE
%foreach idx = numHeaderFiles
%if headerFiles[idx] == headerFile
%assign duplicate = TLC_TRUE
%break
%endif
%endforeach
%return duplicate
%endif
%endfunction
%function (headerFiles, headerFile)
%assign duplicate = IsDuplicateHeaderFile(headerFiles, headerFile)
%if !duplicate
%assign headerFiles = headerFiles + "%<headerFile>"
%endif
%return headerFiles
%endfunction
%function (headerFiles, headerFile)
%assign newHeaderFiles = []
%assign numHeaderFiles = SIZE(headerFiles, 1)
%foreach idx = numHeaderFiles
%if headerFiles[idx] != headerFile
%assign newHeaderFiles = newHeaderFiles + headerFiles[idx]
%endif
%endforeach
%return newHeaderFiles
%endfunction
%function SLibGetContainerSLTypeComplexName(slDataType) void
%if ISFIELD(slDataType, "ContainerSLTypeIdx") && ...
slDataType.ContainerSLTypeIdx >= 0
%assign containerTypeIdx = slDataType.ContainerSLTypeIdx
%return LibGetDataTypeComplexNameFromId(containerTypeIdx)
%else
%return slDataType.ComplexName
%endif
%endfunction
%function SLibWriteDatatypeTypedefs() void
%assign fileContents = GET_FILE_REP_SCRATCH_BUFFER_CONTENTS("TypedefsToModelTypesOrHeader")
%if !ISEMPTY(fileContents)
%if SLibGenCustomNonSharedHeaderFileForCSC()
%assign modelTypesFile = LibGetMdlTypesHdrBaseName()
%assign typesFile = LibCreateSourceFile("SystemHeader", "Simulink", modelTypesFile)
%<SLibSetModelFileAttribute(typesFile, "Typedefs", fileContents)>
%else
%assign modelHdrFile = LibGetMdlPubHdrBaseName()
%assign hdrFile = LibCreateSourceFile("SystemHeader", "Simulink", modelHdrFile)
%<SLibSetModelFileAttribute(hdrFile, "Typedefs", fileContents)>
%endif
%endif
%assign variantFileContents = GET_FILE_REP_SCRATCH_BUFFER_CONTENTS("VariantTypedefsToModelTypesOrHeader")
%if !ISEMPTY(variantFileContents)
%if SLibGenCustomNonSharedHeaderFileForCSC()
%assign modelTypesFile = LibGetMdlTypesHdrBaseName()
%assign typesFile = LibCreateSourceFile("SystemHeader", "Simulink", modelTypesFile)
%<SLibSetModelFileAttribute(typesFile, "Defines", variantFileContents)>
%else
%assign modelHdrFile = LibGetMdlPubHdrBaseName()
%assign hdrFile = LibCreateSourceFile("SystemHeader", "Simulink", modelHdrFile)
%<SLibSetModelFileAttribute(hdrFile, "ModelTypesDefines", variantFileContents)>
%endif
%endif
%createrecord dtIdxMap { }
%<GetOrderedDataTypeIdx(dtIdxMap)>
%foreach dtIdx0 = ::CompiledModel.DataTypes.NumDataTypes
%assign dtIdx = dtIdxMap.Dt[dtIdx0].idx
%assign dt = ::CompiledModel.DataTypes.DataType[dtIdx]
%assign dtIsUserProvided = dt.IsUserProvided
%if dtIsUserProvided && dt.IsShared
%assign dtHeaderFileQuoted = LibHeaderFileForDataType(dt)
%assign sz = SIZE(dtHeaderFileQuoted)
%assign len = sz[1]
%assign dtHeaderFile = Substring(dtHeaderFileQuoted, 1, len-1)
%<SLibAddGeneratedFileToList(dtHeaderFile,"custom","header","")>
%endif
%endforeach
%if CGMODEL_ACCESS("CGModel.NonSharedTypesInIR") && (::CompiledModel.SharedTypesInIR)
%return
%endif
%assign headerFiles = []
%assign fullHeaderFiles = []
%createrecord objInfoArr { NumInfo 0 }
%createrecord objInfoArrNonShared { NumInfo 0 }
%createrecord fixptStructType{}
%createrecord dtIdxMap { }
%<GetOrderedDataTypeIdx(dtIdxMap)>
%with ::CompiledModel
%if ISFIELD(ConfigSet,"ReplacementTypes")
%assign RTWReplacementTypesON = FEVAL("rtwprivate","rtwattic","AtticData","isReplacementOn")
%else
%assign RTWReplacementTypesON = TLC_FALSE
%endif
%assign genToShared = (::CompiledModel.GenUtilsSrcInSharedLocation == 1)
%foreach dtIdx0 = ::CompiledModel.DataTypes.NumDataTypes
%assign dtIdx = dtIdxMap.Dt[dtIdx0].idx
%assign dt = ::CompiledModel.DataTypes.DataType[dtIdx]
%assign dtIsUserProvided = dt.IsUserProvided
%if dt.Skip
%continue
%endif
%if !ISEMPTY(FEVAL("regexp", dt.Name, "^slMsg//w+"))
%assign headerFiles = AddToHeaderFiles(headerFiles, "/"slMsgSvc.h/"")
%assign unquotedSlMsgSvc = "slMsgSvc.h"
%assign fullHeaderFiles = AddToHeaderFiles(fullHeaderFiles, unquotedSlMsgSvc)
%endif
%if ISEQUAL(TYPE(RTWReplacementTypesON),"Boolean") && RTWReplacementTypesON
%if dt.Name == ConfigSet.ReplacementTypes.double || ...
dt.Name == ConfigSet.ReplacementTypes.single || ...
dt.Name == ConfigSet.ReplacementTypes.int32 || ...
dt.Name == ConfigSet.ReplacementTypes.int16 || ...
dt.Name == ConfigSet.ReplacementTypes.int8 || ...
dt.Name == ConfigSet.ReplacementTypes.uint32 || ...
dt.Name == ConfigSet.ReplacementTypes.uint16 || ...
dt.Name == ConfigSet.ReplacementTypes.uint8 || ...
dt.Name == ConfigSet.ReplacementTypes.boolean || ...
dt.Name == ConfigSet.ReplacementTypes.int || ...
dt.Name == ConfigSet.ReplacementTypes.uint || ...
dt.Name == ConfigSet.ReplacementTypes.char
%continue
%endif
%endif
%openfile tmpBuffer
%assign dtHeaderFileQuoted = LibHeaderFileForDataType(dt)
%assign dtIsShared = dt.IsShared
%assign generateCmplxTypedef = 0
%if (dtIsShared && !dtIsUserProvided) && SLibIsCompactFileFormat() && !genToShared
%<SLibReportErrorWithIdAndArgs("RTW:tlc:SharedTypeInCompactFormat", "%<dt.Name>")>
%endif
%if dtIsShared
%assign sz = SIZE(dtHeaderFileQuoted)
%assign len = sz[1]
%assign dtHeaderFile = Substring(dtHeaderFileQuoted, 1, len-1)
%assign dtHeaderFileBase = Substring(dtHeaderFile, 0, len-4)
%endif
%if dtHeaderFileQuoted != ""
%assign headerFiles = AddToHeaderFiles(headerFiles, dtHeaderFileQuoted)
%assign fullHeaderFiles = AddToHeaderFiles(fullHeaderFiles, dtHeaderFile)
%endif
%assign typedefBuffer = ""
%if !dtIsUserProvided
%assign descStr = SLibGetDescriptionForData(::CompiledModel.DataTypes.DataType[dtIdx])
%assign descStr = ISEMPTY(descStr) ? "" : "/* " + descStr + " */"
%assign needGuard = !dtIsShared
%if LibIsAliasDataType(dtIdx)
%assign aIdx = dt.IdAliasedTo
%if (dt.DefinedInLegacyCode == 0) || LibIsModelReferenceSimTarget()
%assign aDt = DataTypes.DataType[aIdx]
%if !LibIsAliasDataType(aIdx)
%assign complexName = SLibGetContainerSLTypeComplexName(aDt)
%else
%assign complexName = aDt.ComplexName
%endif
%assign generateCmplxTypedef = SupportComplex && complexName != ""
%if needGuard
#ifndef DEFINED_TYPEDEF_FOR_%<dt.Name>_
#define DEFINED_TYPEDEF_FOR_%<dt.Name>_
%endif
%<descStr>
typedef %<aDt.Name> %<dt.Name>;
%if generateCmplxTypedef
typedef %<complexName> %<dt.ComplexName>;
%endif
%if needGuard
#endif
%endif
%endif
%elseif LibIsEnumDataType(dtIdx)
%if needGuard
#ifndef DEFINED_TYPEDEF_FOR_%<dt.Name>_
#define DEFINED_TYPEDEF_FOR_%<dt.Name>_
%endif
%if (LibIsEnumTypeStoredAsInt(dtIdx))
typedef enum {
%assign initAllEnums = TLC_FALSE
%assign firstEnumValue = SLibGetEnumTypeValueFromIndex(dtIdx, 0)
%foreach enumIdx = FcnGetEnumTypeNumEnums(dtIdx)
%if (SLibGetEnumTypeValueFromIndex(dtIdx, enumIdx) != (firstEnumValue+enumIdx))
%assign initAllEnums = TLC_TRUE
%break
%endif
%endforeach
%assign lastIdx = FcnGetEnumTypeNumEnums(dtIdx)-1
%assign eol = ","
%foreach enumIdx = FcnGetEnumTypeNumEnums(dtIdx)
%assign enumString = SLibGetEnumTypeCodeGenStringFromIndex(dtIdx, enumIdx)
%if (initAllEnums || (enumIdx == 0))
%assign enumInitValue = SLibGetEnumTypeValueFromIndex(dtIdx, enumIdx)
%assign valueString = " = %<SLibReplaceEnumLiteralValueWithTypeLimitId(dtIdx, enumInitValue)>"
%else
%assign valueString = ""
%endif
%if enumIdx == FcnGetEnumTypeIndexOfDefaultValue(dtIdx)
%assign defaultComment = " /* Default value */"
%else
%assign defaultComment = ""
%endif
%if (enumIdx == lastIdx)
%assign eol = ""
%endif
%<enumString>%<valueString>%<eol>%<defaultComment>
%endforeach
} %<dt.Name>; %<descStr>
%else
%assign storageTypeId = LibGetEnumTypeStorageType(dtIdx)
%assign storageTypeName = LibGetDataTypeNameFromId(storageTypeId)
typedef %<storageTypeName> %<dt.Name>; %<descStr>
%foreach enumIdx = FcnGetEnumTypeNumEnums(dtIdx)
%assign enumString = SLibGetEnumTypeCodeGenStringFromIndex(dtIdx, enumIdx)
%assign enumValue = SLibGetEnumTypeValueFromIndex(dtIdx, enumIdx)
%assign enumValue = SLibReplaceEnumLiteralValueWithTypeLimitId(dtIdx, enumValue)
%if enumIdx == FcnGetEnumTypeIndexOfDefaultValue(dtIdx)
%assign defaultComment = " /* Default value */"
%else
%assign defaultComment = ""
%endif
#define %<enumString> ((%<dt.Name>)%<enumValue>) %<defaultComment>
%endforeach
%endif
%if needGuard
#endif
%endif
%elseif LibIsStructDataType(dtIdx)
%assign numElements = dt.NumElements
%assign padded = 0
%if LibIsDataTypeMultiWordFixpt(dtIdx)
%closefile tmpBuffer
%continue
%endif
%if needGuard
#ifndef DEFINED_TYPEDEF_FOR_%<dt.Name>_
#define DEFINED_TYPEDEF_FOR_%<dt.Name>_
%endif
%<descStr>
%assign alignWholeStruct = !fieldAlign && structAlign
%assign SAlign = ""
%if ISFIELD(dt, "Alignment") && alignWholeStruct
%assign SAlign = SLibGetAlignmentSyntax(::CompiledModel.Name, dt.Name, "", ...
dt.Alignment, "DATA_ALIGNMENT_WHOLE_STRUCT")
%endif
%if SAlign != ""
%if structDAFlag.position == "DATA_ALIGNMENT_PREDIRECTIVE"
typedef %<SAlign> struct {
%elseif structDAFlag.position == "DATA_ALIGNMENT_PRECEDING_STATEMENT"
%<SAlign>
typedef struct {
%else
typedef struct {
%endif
%else
typedef struct {
%endif
%foreach eIdx = numElements
%assign eName = LibDataTypeElementName(dtIdx, eIdx)
%assign eDtId = LibDataTypeElementDataTypeId(dtIdx, eIdx)
%assign eComment = LibDataTypeElementComment(dtIdx, eIdx)
%assign eDtNm = LibDataTypeElementContainerName(dtIdx, eIdx)
%assign arrayDim = LibDataTypeElementVectorDims(dtIdx, eIdx)
%if dtIsShared && (LibIsStructDataType(eDtId) || LibIsEnumDataType(eDtId) || LibIsAliasDataType(eDtId))
%if SLibDataTypeHasObject(eDtId) && !LibDataTypeIsShared(eDtId)
%assign args = ["%<dt.Name>", "%<eDtNm>", "%<dt.Name>", "%<eDtNm>"]
%<SLibReportErrorWithIdAndArgs("RTW:tlc:ExportTypeDependsOnNonExported", args)>
%endif
%endif
%assign align = ""
%if fieldAlign && !LibIsStructDataType(eDtId) && ...
ISFIELD(dt, "Alignment")
%assign align = SLibGetAlignmentSyntax(::CompiledModel.Name, eName, eDtNm, ...
::CompiledModel.DataTypes.DataType[dtIdx].Alignment, ...
"DATA_ALIGNMENT_STRUCT_FIELD")
%endif
%if !ISEMPTY(eComment)
%<eComment>
%endif
%<align> %<eDtNm> %<eName>%<arrayDim>;
%assign padding = LibDataTypeElementPadding(dtIdx, eIdx)
%if padding == 1
%<LibGetDataTypeNameFromId(tSS_UINT8)> sl_padding%<padded>;
%assign padded = padded + 1
%elseif padding > 0
%<LibGetDataTypeNameFromId(tSS_UINT8)> sl_padding%<padded>[%<padding>];
%assign padded = padded + 1
%endif
%endforeach
%if SAlign != ""
%if structDAFlag.position == "DATA_ALIGNMENT_POSTDIRECTIVE"
} %<dt.Name> %<SAlign>;
%elseif structDAFlag.position == "DATA_ALIGNMENT_FOLLOWING_STATEMENT"
} %<dt.Name>;
%<SAlign>
%else
} %<dt.Name>;
%endif
%else
} %<dt.Name>;
%endif
%if LibIsDataTypeMultiWordFixpt(dtIdx)
typedef struct {
%<dt.Name> re;
%<dt.Name> im;
} c%<dt.Name>;
%endif
%if needGuard
#endif
%endif
%endif
%endif
%closefile tmpBuffer
%if dtIsShared || dt.HasObject
%assign dtChecksum = ::CompiledModel.DataTypes.DataType[dtIdx].Checksum
%assign dtChecksumStr = ...
"%,%,%,%"
%if !dtIsUserProvided
%assign dtDependencies = ::CompiledModel.DataTypes.DataType[dtIdx].Dependencies
%assign numDtDepends = SIZE(dtDependencies, 1)
%assign depVecStr = ""
%assign depBuiltinVec = ""
%assign depComplexVec = ""
%assign depMultiwordVec = ""
%foreach idxDep = numDtDepends
%assign thisIdx = dtDependencies[idxDep]
%assign isBuiltin = "0"
%if LibIsFundamentalBuiltInDataType(thisIdx)
%assign isBuiltin = "1"
%endif
%assign isComplex = "0"
%assign isMultiword = "0"
%if LibIsDataTypeMultiWordFixpt(thisIdx)
%assign isMultiword = "1"
%endif
%if idxDep == 0
%assign depVecStr = ::CompiledModel.DataTypes.DataType[thisIdx].Name
%assign depBuiltinVec = isBuiltin
%assign depComplexVec = isComplex
%assign depMultiwordVec = isMultiword
%else
%assign depVecStr = depVecStr + "," + ::CompiledModel.DataTypes.DataType[thisIdx].Name
%assign depBuiltinVec = depBuiltinVec + "," + isBuiltin
%assign depComplexVec = depComplexVec + "," + isComplex
%assign depMultiwordVec = depMultiwordVec + "," + isMultiword
%endif
%endforeach
%else
%assign definition = ""
%assign depVecStr = ""
%assign depComplexVec = "0"
%assign depMultiwordVec = "0"
%assign depBuiltinVec = "0"
%endif
%if dtIsShared
%assign objInfoArr.NumInfo = objInfoArr.NumInfo + 1
%addtorecord objInfoArr objInfo { name dt.Name; ...
kind "type"; ...
manglename dt.Name; ...
file dtHeaderFile; ...
checksum dtChecksumStr; ...
definition "%<tmpBuffer>"; ...
dependencies depVecStr; ...
isComplex depComplexVec; ...
isMultiword depMultiwordVec; ...
builtin depBuiltinVec; ...
typeUserProvided dtIsUserProvided; ...
genComplexTypedef generateCmplxTypedef}
%if !dtIsUserProvided
%<SLibAddGeneratedFileToList(dtHeaderFile,"utility","header","")>
%else
%<SLibAddGeneratedFileToList(dtHeaderFile,"custom","header","")>
%endif
%else
%assign objInfoArrNonShared.NumInfo = objInfoArrNonShared.NumInfo + 1
%addtorecord objInfoArrNonShared objInfo { name dt.Name; ...
kind "type"; ...
manglename dt.Name; ...
file " "; ...
checksum dtChecksumStr; ...
definition "%<tmpBuffer>"; ...
dependencies depVecStr; ...
isComplex depComplexVec; ...
isMultiword depMultiwordVec; ...
builtin depBuiltinVec; ...
typeUserProvided dtIsUserProvided; ...
genComplexTypedef generateCmplxTypedef}
%endif
%if !genToShared && (dtIsShared && !dtIsUserProvided) && !(::CompiledModel.SharedTypesInIR)
%assign fileName = dtHeaderFileBase
%assign fileH = LibCreateSourceFileAtPath("Header", "Simulink", fileName, dtHeaderFileBase)
%assign dependsOnHeaderFiles = LibDataTypeDependsOnHeaderFiles(dt, dtHeaderFile)
%assign numDependsOnHeaderFiles = SIZE(dependsOnHeaderFiles, 1)
%foreach idx = numDependsOnHeaderFiles
%<SLibSetModelFileAttribute(fileH, "RequiredIncludes", dependsOnHeaderFiles[idx])>
%endforeach
%assign headerFiles = LibRemoveDependsOnHeaderFiles(dt, headerFiles, dtHeaderFileQuoted)
%if !WHITE_SPACE(tmpBuffer)
%<SLibSetModelFileDeferredIncludeCoderTypes(fileH, TLC_TRUE)>
%<SLibSetModelFileAttribute(fileH, "Typedefs", tmpBuffer)>
%endif
%<SLibSetModelFileAttribute(fileH, "Group", "utility")>
%<SLibSetModelFileIndent(fileH, TLC_TRUE)>
%<SLibSetModelFileSharedType(fileH, TLC_TRUE)>
%endif
%endif
%if !dtIsShared
%assign typesFile = SLibGetFileRecForCode("mdl_data_typedef")
%if !WHITE_SPACE(tmpBuffer)
%<SLibSetModelFileDeferredIncludeCoderTypes(typesFile, TLC_TRUE)>
%<SLibSetModelFileAttribute(typesFile, "Typedefs", tmpBuffer)>
%endif
%endif
%endforeach
%if !(::CompiledModel.SharedTypesInIR)
%if genToShared
%assign sharedHdrInfo = FEVAL("rtwprivate", "add2FileMap", ::CompiledModel.Name, ::CompiledModel.RTWInfoMatFile.sharedSourcesDir, objInfoArrNonShared, 4, 1, "traperror")
%if TYPE(sharedHdrInfo)!="Scope" || sharedHdrInfo.status != 1
%assign errmsg = sharedHdrInfo.errorMessage
%<SLibReportErrorWithIdAndArgs("RTW:tlc:ErrWhenGenSharedType", errmsg)>
%endif
%endif
%if objInfoArr.NumInfo > 0
%if genToShared
%assign sharedHdrInfo = FEVAL("rtwprivate", "add2FileMap", ::CompiledModel.Name, CompiledModel.RTWInfoMatFile.sharedSourcesDir, objInfoArr, 1, 1)
%else
%assign sharedHdrInfo = FEVAL("rtwprivate", "add2FileMap", ::CompiledModel.Name, "", objInfoArr, 2, 1)
%endif
%if TYPE(sharedHdrInfo)!="Scope" || sharedHdrInfo.status != 1
%assign errmsg = FEVAL("lasterr")
%<SLibReportErrorWithIdAndArgs("RTW:tlc:ErrWhenGenSharedType", errmsg)>
%else
%<SLibSynchronizeFileRepWithFileRecords()>
%foreach idx = sharedHdrInfo.numNotGeneratedFiles
%assign thisFile = sharedHdrInfo.notGeneratedFileList[idx].Name
%assign thisFileKind = sharedHdrInfo.notGeneratedFileList[idx].Kind
%assign thisUserProvided = sharedHdrInfo.notGeneratedFileList[idx].UserProvidedType
%if thisFileKind == "type" && !thisUserProvided
%assign thisFileName = thisFile
%assign thisMdlFile = SLibAddModelFile("SystemHeader", "TFL callback", thisFileName)
%<SLibSetModelFileSharedType(thisMdlFile, TLC_TRUE)>
%<SLibSetModelFileAttribute(thisMdlFile, "Filter", TLC_TRUE)>
%endif
%endforeach
%endif
%endif
%endif
%openfile tmpBuffer
%assign numHeaderFiles = SIZE(headerFiles, 1)
%if numHeaderFiles > 0
%foreach idx = numHeaderFiles
#include %
%endforeach
%endif
%closefile tmpBuffer
%assign numFullHeaderFiles = SIZE(fullHeaderFiles, 1)
%addtorecord DataTypes numHeaderFiles numFullHeaderFiles
%addtorecord DataTypes headerFiles fullHeaderFiles
%<SLibCacheCodeToFile("data_typedef_incl", tmpBuffer)>
%endwith
%endfunction
%function SLibSfunRegisterAndSetDataType(...
categoryStr, ...
SimstrucLabel, ...
elementIndexLabel, ...
origDataTypeIndex, ...
modeForUnknownStr) Output
if (ssGetSimMode(%<SimstrucLabel>) != SS_SIMMODE_SIZES_CALL_ONLY) {
%switch categoryStr
%case "input"
%assign dataTypeSetFuncStr = "ssSetInputPortDataType"
%break
%case "output"
%assign dataTypeSetFuncStr = "ssSetOutputPortDataType"
%break
%case "dwork"
%assign dataTypeSetFuncStr = "ssSetDWorkDataType"
%break
%default
%<LibReportFatalError("Unknown category, %<category>, for setting sfunction data type.")>
%endswitch
%if LibIsFundamentalBuiltInDataType(origDataTypeIndex)
%assign dtEnum = LibGetDataTypeEnumFromId(origDataTypeIndex)
%<dataTypeSetFuncStr>(%<SimstrucLabel>, %<elementIndexLabel>, %<dtEnum>);
%else
%assign curDT = FixPt_GetDataTypeFromIndex(origDataTypeIndex)
#if defined (MATLAB_MEX_FILE)
%if LibIsHalfDataType(origDataTypeIndex)
DTypeId halfID = ssRegisterDataTypeHalfPrecision(
%<SimstrucLabel>,
0/* 0 means do NOT obey data type override setting for this subsystem */);
%<dataTypeSetFuncStr>(%<SimstrucLabel>, %<elementIndexLabel>, halfID );
%elseif curDT.IsFixedPoint && !LibIsAliasDataType(origDataTypeIndex)
{
DTypeId dataTypeIdReg =
%if FixPt_DataTypeIsFloat(curDT)
ssRegisterDataTypeFxpScaledDouble(
%else
ssRegisterDataTypeFxpFSlopeFixExpBias(
%endif
%<SimstrucLabel>,
%<curDT.IsSigned>,
%<curDT.RequiredBits>,
%<curDT.FracSlope>,
%<curDT.FixedExp>,
%<curDT.Bias>,
0 /* false means do NOT obey data type override setting for this subsystem */ );
%<dataTypeSetFuncStr>(%<SimstrucLabel>, %<elementIndexLabel>, dataTypeIdReg );
}
%else
%assign dtEnum = LibGetDataTypeEnumFromId(origDataTypeIndex)
%if dtEnum == "SS_POINTER" || dtEnum == "SS_INTEGER" || dtEnum == "SS_FCN_CALL"
%<dataTypeSetFuncStr>(%<SimstrucLabel>, %<elementIndexLabel>, %<dtEnum>);
%else
%switch modeForUnknownStr
%case "namedObject"
{
DTypeId dataTypeIdReg;
ssRegisterTypeFromNamedObject(
%<SimstrucLabel>,
"%<LibGetDataTypeNameFromId(origDataTypeIndex)>",
&dataTypeIdReg);
if(dataTypeIdReg == INVALID_DTYPE_ID) return;
%<dataTypeSetFuncStr>(%<SimstrucLabel>, %<elementIndexLabel>, dataTypeIdReg );
}
%break
%case "none"
%break
%default
%openfile dataTypeRegFailMsg
User-defined data type %<LibGetDataTypeNameFromId(origDataTypeIndex)> is required
for %<categoryStr> %<elementIndexLabel>, but the information needed to define
this data type in the generated S-Function is unknown.
%if modeForUnknownStr == "warning"
The generated code that normally specifies the data type of this
%<categoryStr> is being omitted. If additional custom code does not register
this user-define data type and set the data type of this %<categoryStr>,
then the generated code will be incomplete.
%endif
%closefile dataTypeRegFailMsg
%if SLibInBlockScope()
%assign block = SLibGetCurrentBlock()
%if modeForUnknownStr == "warning"
%<LibBlockReportWarning(block,dataTypeRegFailMsg)>
%else
%<LibBlockReportFatalError(block,dataTypeRegFailMsg)>
%endif
%else
%if modeForUnknownStr == "warning"
%<LibReportWarning(dataTypeRegFailMsg)>
%else
%<LibReportFatalError(dataTypeRegFailMsg)>
%endif
%endif
%endswitch
%endif
%endif
#endif
%endif
}
%return
%endfunction
%function SLibGetLargestMultiwordDataTypeNeeded() void
%with ::CompiledModel
%assign largestMultiwordBits = 0
%if SLibIsERTTarget() && (::CompiledModel.ModelReferenceTargetType != "SIM")
%if ConfigSet.MultiwordTypeDef == "System defined"
%assign needsMultiword = TLC_FALSE
%assign prodBitPerLargestInt = ConfigSet.ProdBitPerLong
%assign targetBitPerLargestInt = ConfigSet.TargetBitPerLong
%if (ConfigSet.ProdLongLongMode == 1)
%assign prodBitPerLargestInt = ConfigSet.ProdBitPerLongLong
%endif
%if (ConfigSet.TargetLongLongMode == 1)
%assign targetBitPerLargestInt = ConfigSet.TargetBitPerLongLong
%endif
%if prodBitPerLargestInt > targetBitPerLargestInt
%assign needsMultiword = TLC_TRUE
%endif
%if ConfigSet.ProdHWDeviceType == "ASIC/FPGA->ASIC/FPGA"
%assign needsMultiword = TLC_TRUE
%endif
%foreach dtIdx = ::CompiledModel.DataTypes.NumDataTypes
%assign dt = ::CompiledModel.DataTypes.DataType[dtIdx]
%if dt.IsFixedPoint && dt.RequiredBits > targetBitPerLargestInt
%assign needsMultiword = TLC_TRUE
%break
%endif
%endforeach
%if needsMultiword
%assign largestMultiwordBits = 256
%else
%assign largestMultiwordBits = 0
%endif
%else
%assign largestMultiwordBits = ConfigSet.MultiwordLength
%endif
%else
%assign largestMultiwordBits = ConfigSet.MultiwordLength
%endif
%return largestMultiwordBits
%endwith
%endfunction
%function DeclareFixedPointWordSizeUsage(maxSizeInBits) void
%if maxSizeInBits > ::CompiledModel.DeclaredFixedPointWordSizeUsage
%assign ::CompiledModel.DeclaredFixedPointWordSizeUsage = maxSizeInBits
%endif
%endfunction
%function DeclareHalfPrecisionUsage(needHalfHeader) void
%assign ::CompiledModel.DeclaredHalfPrecisionUsage = needHalfHeader
%endfunction
%function SLibDeclareHalfPrecisionUsage() void
%return ::CompiledModel.DeclaredHalfPrecisionUsage
%endfunction
%function SLibGetTypeForBitfield(BitFieldWidth) void
%if ISFIELD(ConfigSet,"BitfieldContainerType") && ...
BitFieldWidth == 1
%return ConfigSet.BitfieldContainerType
%else
%return "uint_T"
%endif
%endfunction
%function SLibDeclareDataAsPointer(dtID) void
%return (LibIsStructDataType(dtID) && !LibIsDataTypeMultiWordFixpt(dtID)) || ...
!ISEMPTY(SLibDataTypeDeepCopyFcnName(dtID))
%endfunction
%function SLibConvert2DMatrix(col2Row, typeId, width, dims, cMatStr, slMatStr, kind, isCplx, level) Output
%<SLibMarshalNDArray(col2Row, typeId, width, dims, cMatStr, slMatStr, kind, isCplx, level)>
%endfunction
%function SLibMarshalNDArray(col2Row, typeId, width, dims, cMatStr, slMatStr, kind, isCplx, level) Output
%assign typeName = isCplx ? LibGetDataTypeComplexNameFromId(typeId) : LibGetDataTypeNameFromId(typeId)
%if kind==1
%<SLibGenerateNDArrayMarshaling(col2Row, cMatStr, slMatStr, dims, typeName, level)>
%elseif kind==2
%assign numDims = SIZE(dims,1)
%assign isScalar = ISEQUAL(width, 1)
%assign colMatStr = slMatStr
%assign rowMatStr = cMatStr
%if isScalar
%assign colMatStr = slMatStr
%assign rowMatStr = cMatStr
%if level==0
%assign colMatStr = "(*" + colMatStr + ")"
%assign rowMatStr = "(*" + rowMatStr + ")"
%endif
%<SLibMarshalNDArrayForBus(col2Row, typeId, rowMatStr, colMatStr, level)>
%elseif numDims >= 2
{
int_T __idx%<level> = 0;
%assign subs = []
%foreach dimIdx = numDims
%assign loopVar = "__idx%<level>_%"
int_T %<loopVar>;
for (%<loopVar> = 0; %<loopVar> < %; ++%<loopVar>) {
%assign subs = subs + loopVar
%endforeach
%<typeName>* __cMatPtr%<level> = &%<rowMatStr>[__idx%<level>++];
%<typeName>* __slMatPtr%<level> = &%<colMatStr>[%<FcnGenSubscriptsToIndex(subs, dims, TLC_TRUE)>];
%<SLibMarshalNDArrayForBus(col2Row, typeId, "(*__cMatPtr%<level>)", "(*__slMatPtr%<level>)", level+1)>
%foreach dimIdx = numDims
}
%endforeach
}
%else
%assign fakeBlk = BLOCK { Name "" }
%assign rollThresh = 0
%roll iIdx=[0:%], iLcv=rollThresh, fakeBlk, "Roller", ""
%assign iLoc = (iLcv == "") ? iIdx : iLcv
%<SLibMarshalNDArrayForBus(col2Row, typeId, "%<cMatStr>[%<iLoc>]", "%<slMatStr>[%<iLoc>]", level+1)>
%endroll
%endif
%else
%if level!=0
%assign widthStr = width > 1 ? "%<width>*" : ""
%if col2Row==TLC_TRUE
(void) %<LibGenMemFcnCall("memcpy", "%<cMatStr>", "%<slMatStr>", "%<widthStr>sizeof(%<typeName>)")>;
%else
(void) %<LibGenMemFcnCall("memcpy", "%<slMatStr>", "%<cMatStr>", "%<widthStr>sizeof(%<typeName>)")>;
%endif
%endif
%endif
%endfunction
%function SLibMarshalNDArrayForBus(col2Row, typeId, cMatStr, slMatStr, level) Output
%foreach idxE = LibDataTypeNumElements(typeId)
%assign eName = LibDataTypeElementName(typeId, idxE)
%assign eDTypeId = LibGetDataTypeIdAliasedThruToFromId(LibDataTypeElementDataTypeId(typeId, idxE))
%assign eWidth = LibDataTypeElementWidth(typeId, idxE)
%assign eDims = LibDataTypeElementDimensions(typeId, idxE)
%assign eIsCplx = LibDataTypeElementIsComplex(typeId, idxE)
%assign eCMatStr = cMatStr + "." + eName
%assign eSLMatStr = slMatStr + "." + eName
%assign matInfo = FcnGetNDArrayMarshalingInfo(eDTypeId, eDims)
%if matInfo==0
%assign optAddr = eWidth==1 ? "&" : ""
%assign eCMatStr = "%<optAddr>%<eCMatStr>"
%assign eSLMatStr = "%<optAddr>%<eSLMatStr>"
%else
%if (eWidth > 1) && (SIZE(eDims, 1) > 1)
%assign eDTypeName = eIsCplx ? LibGetDataTypeComplexNameFromId(eDTypeId) : LibGetDataTypeNameFromId(eDTypeId)
%assign eCMatStr = "((%<eDTypeName>*)" + eCMatStr + ")"
%assign eSLMatStr = "((%<eDTypeName>*)" + eSLMatStr + ")"
%endif
%endif
%<SLibMarshalNDArray(col2Row, eDTypeId, eWidth, eDims, eCMatStr, eSLMatStr, matInfo, eIsCplx, level+1)>
%endforeach
%endfunction
%function SLibGenerateNDArrayMarshaling(col2Row, cMatStr, slMatStr, dims, typeName, level) Output
{
%if level > 0
%<typeName>* __colMat%<level> = (%<typeName>*)%<slMatStr>;
%<typeName>* __rowMat%<level> = (%<typeName>*)%<cMatStr>;
%assign slMatStr = "__colMat%<level>"
%assign cMatStr = "__rowMat%<level>"
%endif
int_T __idx%<level> = 0;
%assign numDims = SIZE(dims,1)
%assign subs = []
%foreach dimIdx = numDims
%assign loopVar = "__idx%<level>_%"
int_T %<loopVar>;
for (%<loopVar> = 0; %<loopVar> < %; ++%<loopVar>) {
%assign subs = subs + loopVar
%endforeach
%assign cMatAddr = "&%<cMatStr>[__idx%<level>++]"
%assign slMatAddr = "&%<slMatStr>[%<FcnGenSubscriptsToIndex(subs, dims, TLC_TRUE)>]"
%if col2Row==TLC_TRUE
(void)%<LibGenMemFcnCall("memcpy", "%<cMatAddr>", "%<slMatAddr>", "sizeof(%<typeName>)")>;
%else
(void)%<LibGenMemFcnCall("memcpy", "%<slMatAddr>", "%<cMatAddr>", "sizeof(%<typeName>)")>;
%endif
%foreach dimIdx = numDims
}
%endforeach
}
%endfunction
%function FcnGenSubscriptsToIndex(subs, dims, isColMajor)
%assign linIdx = ""
%assign revDimIdx = SIZE(dims,1)-1
%foreach dimIdx = SIZE(dims,1)
%assign idx = isColMajor ? revDimIdx : dimIdx
%assign offset = ""
%if dimIdx > 0
%if dimIdx > 1
%assign linIdx = "(" + linIdx + ")"
%endif
%assign offset = linIdx + "*% + "
%endif
%assign linIdx = offset + "%"
%assign revDimIdx = revDimIdx - 1
%endforeach
%return linIdx
%endfunction
%function FcnGetNDArrayMarshalingInfo(typeId, dims) void
%if LibIsStructDataType(typeId) && FcnBusNeedNDArrayMarshaling(typeId, TLC_FALSE)
%return 2
%elseif (SIZE(dims,1)>=2) && (FcnProdVectorElement(dims)>1)
%return 1
%else
%return 0
%endif
%endfunction
%function FcnBusNeedNDArrayMarshaling(typeId, status) void
%foreach idxE = LibDataTypeNumElements(typeId)
%assign dims = LibDataTypeElementDimensions(typeId, idxE)
%if (SIZE(dims,1)>=2) && (FcnProdVectorElement(dims)>1)
%return TLC_TRUE
%else
%if LibIsStructDataType(typeId)
%assign status = status || ...
FcnBusNeedNDArrayMarshaling(LibDataTypeElementDataTypeId(typeId, idxE), status)
%endif
%endif
%endforeach
%return status
%endfunction
%function FcnProdVectorElement(vec) void
%assign val = 1
%foreach idx = SIZE(vec,1)
%assign val = val * vec[idx]
%endforeach
%return val
%endfunction
%function LibGetUnitExprFromId(id) void
%return ::CompiledModel.Units.Unit[id].UnitExpr
%endfunction
%function LibGetASCIIEscapedUnitExprFromId(id) void
%return ::CompiledModel.Units.Unit[id].ASCIIEscapedUnitExpr
%endfunction
%function LibGetRecordUnitId(rec) void
%assign idx = rec.UnitIdx
%return ::CompiledModel.Units.Unit[idx].Id
%endfunction
%function LibGetRecordUnitExpr(rec)
%return LibGetUnitExprFromId(LibGetRecordUnitId(rec))
%endfunction
%function SLibGetRecordUnitExpr(rec)
%return LibGetRecordUnitExpr(rec)
%endfunction
%function SLibGetRecordASCIIEscapedUnitExpr(rec)
%return LibGetASCIIEscapedUnitExprFromId(LibGetRecordUnitId(rec))
%endfunction
%function SLibGetRecordIsUnitsEnabled()
%return ::CompiledModel.Units.isUnitsEnabled
%endfunction
%function SLibIsUnknownType(aCGTypeIdx) void
%return LibCGTypeIsMatrix(aCGTypeIdx) ? ...
LibCGTypeIsUnknown(LibCGTypeScalarBaseType(aCGTypeIdx)) : ...
LibCGTypeIsUnknown(aCGTypeIdx)
%endfunction
%function LibIsRowMajor()
%assign isRowMajor = %
%return isRowMajor
%endfunction
%function LibGetRecordIsOrContainsStdContainer(rec) void
%if LibGetRecordIsStdContainer(rec)
%return TLC_TRUE
%else
%assign cgTypeIdx = SLibGetRecordContainerCGTypeIdx(rec)
%return LibCGTypeContainsStdContainer(cgTypeIdx)
%endif
%endfunction
%function LibGetRecordIsStdContainer(rec) void
%return (ISFIELD(rec, "CGTypeIdx") && LibCGTypeIsStdContainer(rec.CGTypeIdx)) || ...
(ISFIELD(rec, "ContainerCGTypeIdx") && LibCGTypeIsStdContainer(rec.ContainerCGTypeIdx))
%endfunction
%endif