%if EXISTS("_MATHLIB_") == 0
%assign _MATHLIB_ = 1
%function FcnGetDataTypeIdFromName(dTypeName)
%switch dTypeName
%case "double"
%case "real_T"
%return tSS_DOUBLE
%case "float"
%case "single"
%case "real32_T"
%return tSS_SINGLE
%case "half"
%case "real16_T"
%return tSS_HALF
%case "int32_T"
%case "int32"
%return tSS_INT32
%case "int16_T"
%case "int16"
%return tSS_INT16
%case "int8_T"
%case "int8"
%return tSS_INT8
%case "uint32_T"
%case "uint32"
%return tSS_UINT32
%case "uint16_T"
%case "uint16"
%return tSS_UINT16
%case "uint8_T"
%case "uint8"
%return tSS_UINT8
%case "boolean_T"
%case "boolean"
%case "logical"
%return tSS_BOOLEAN
%case "pointer"
%return tSS_POINTER
%case "int_T"
%case "integer"
%return tSS_INTEGER
%case "uinteger"
%return tSS_UINTEGER
%case "long"
%return tSS_LONG
%case "ulong"
%return tSS_ULONG
%case "long_long"
%return tSS_LONG_LONG
%case "ulong_long"
%return tSS_ULONG_LONG
%case "double_unint32_T"
%return tSS_TIMER_UINT32_PAIR
%case "void"
%return tSS_VOID
%case "size_t"
%return tSS_SIZET
%default
%exit "MATHLIB: Unsupported datatype %<dTypeName>."
%endswitch
%endfunction
%function FcnGetMathDataTypeNameFromId(dTypeId)
%assign typeName = SLibGetMLDataTypeFromId(dTypeId)
%if ISEQUAL(typeName,"numeric")
%assign typeName = FcnGetNonBuiltInTypeNameFromId(dTypeId,typeName)
%endif
%return typeName
%endfunction
%function FcnGetNonBuiltInTypeNameFromId(dTypeId, typeName)
%switch dTypeId
%case tSS_INTEGER
%return "integer"
%case tSS_POINTER
%return "pointer"
%case tSS_VOID
%return "void"
%case tSS_SIZET
%return "size_t"
%case tSS_INTEGER
%return "integer"
%case tSS_UINTEGER
%return "uinteger"
%case tSS_LONG
%return "long"
%case tSS_ULONG
%return "ulong"
%case tSS_LONG_LONG
%return "long_long"
%case tSS_ULONG_LONG
%return "ulong_long"
%default
%if LibIsHalfDataType(dTypeId)
%assign typeName = "half"
%elseif (FcnIsDataTypeTargetInt(dTypeId) || LibIsDataTypeNewLongestFixpt(dTypeId))
%assign typeName = FcnGetNonBuiltInTypeNameFromId(LibGetDataTypeIdAliasedToFromId(dTypeId), typeName)
%endif
%return typeName
%endswitch
%endfunction
%function LibMathFcnExists(RTWFcnName, RTWFcnTypeId) void
%assign RTWType = FcnGetMathDataTypeNameFromId(RTWFcnTypeId)
%assign FcnInfo = FEVAL("rtwgettargetfcnlib_nothrow", LibGetModelName(), ...
RTWFcnName, RTWType, ...
::IsSimBuild)
%if !ISEMPTY(FcnInfo) && ISFIELD(FcnInfo,"ErrIdentifier")
%<SLibReportErrorWithIdAndArgs(FcnInfo.ErrIdentifier, FcnInfo.ErrArguments)>
%endif
%return !ISEMPTY(FcnInfo)
%endfunction
%function LibCreateHomogMathFcnRec(FcnName, FcnTypeId) void
%assign RTWType = FcnGetMathDataTypeNameFromId(FcnTypeId)
%assign FcnInfo = FEVAL("rtwgettargetfcnlib_nothrow", LibGetModelName(), ...
FcnName, RTWType, ...
::IsSimBuild)
%if ISEMPTY(FcnInfo)
%assign msg = "Database has no function '%<FcnName>' returning '%<RTWType>'"
%<LibReportFatalError(msg)>
%elseif ISFIELD(FcnInfo,"ErrIdentifier")
%<SLibReportErrorWithIdAndArgs(FcnInfo.ErrIdentifier, FcnInfo.ErrArguments)>
%endif
%assign NumInputs = FcnInfo.NumInputs
%createrecord FcnRec { Name FcnName; RetTypeId FcnTypeId; NumArgs NumInputs }
%foreach k = NumInputs
%addtorecord FcnRec ArgList { Expr "u%<k>"; TypeId FcnTypeId; IsPtr 0; IsCplx 0; IsConst 1 }
%endforeach
%return FcnRec
%endfunction
%function LibCreateHomogFcnRec(FcnName, InputTypeId) void
%assign RTWType = FcnGetMathDataTypeNameFromId(InputTypeId)
%assign FcnInfo = FEVAL("rtwgettargetfcnlib_nothrow", LibGetModelName(), ...
FcnName, RTWType, ...
::IsSimBuild)
%if ISEMPTY(FcnInfo)
%assign msg = "Database has no function '%<FcnName>' returning '%<RTWType>'"
%<LibReportFatalError(msg)>
%elseif ISFIELD(FcnInfo,"ErrIdentifier")
%<SLibReportErrorWithIdAndArgs(FcnInfo.ErrIdentifier, FcnInfo.ErrArguments)>
%endif
%assign NumInputs = FcnInfo.NumInputs
%createrecord FcnRec { Name FcnName; RetTypeId FcnGetDataTypeIdFromName(FcnInfo.FcnType); NumArgs NumInputs }
%foreach k = NumInputs
%addtorecord FcnRec ArgList { Expr "u%<k>"; TypeId InputTypeId; IsPtr 0; IsCplx 0; IsConst 1 }
%endforeach
%return FcnRec
%endfunction
%function LibSetMathFcnRecArgExpr(FcnRec, idx, argStr) void
%if idx < SIZE(FcnRec.ArgList,1)
%assign FcnRec.ArgList[idx].Expr = argStr
%else
%exit "Internal error: argument index exceeds function prototype argument count"
%endif
%return FcnRec
%endfunction
%function LibGetMathConstant(ConstName,ioTypeId) void
%assign constInfo = SLibGetMathConstantInfo(ConstName,ioTypeId)
%if !ISEMPTY(constInfo)
%return constInfo.Expr
%else
%return ""
%endif
%endfunction
%function SLibGetMathConstantInfo(ConstName,ioTypeId) void
%assign RTWType = FcnGetMathDataTypeNameFromId(ioTypeId)
%assign FcnInfo = FEVAL("rtwgettargetfcnlib_nothrow", LibGetModelName(), ...
ConstName, RTWType, ...
::IsSimBuild)
%if ISEMPTY(FcnInfo)
%return ""
%elseif ISFIELD(FcnInfo,"ErrIdentifier")
%<SLibReportErrorWithIdAndArgs(FcnInfo.ErrIdentifier, FcnInfo.ErrArguments)>
%else
%assign FcnName = FcnInfo.FcnName
%assign FcnType = FcnInfo.FcnType
%assign HdrFile = FcnInfo.HdrFile
%endif
%assign FcnTypeId = FcnGetDataTypeIdFromName(FcnType)
%if LibGetDataTypeIdAliasedThruToFromId(FcnTypeId) != ...
LibGetDataTypeIdAliasedThruToFromId(ioTypeId)
%assign outputCastBegin = "((%<LibGetDataTypeNameFromId(ioTypeId)>)"
%assign outputCastEnd = ")"
%else
%assign outputCastBegin = ""
%assign outputCastEnd = ""
%endif
%if !ISEMPTY(HdrFile)
%if HdrFile != "" && HdrFile != "math.h"
%<FcnTrackHeaderFileUsage(HdrFile, ...
ISFIELD(FcnInfo, "HasTLCGenCallBack") && FcnInfo.HasTLCGenCallBack, ...
TLC_FALSE)>
%endif
%endif
%assign callExpr = "(" + outputCastBegin + FcnName + outputCastEnd +")"
%if ISEMPTY(HdrFile)
%assign HdrFile = ""
%elseif ISEMPTY(FEVAL("strfind",HdrFile,"<")) && ...
ISEMPTY(FEVAL("strfind",HdrFile,"/""))
%assign HdrFile = "/"" + HdrFile + "/""
%endif
%createrecord ConstInfo { Expr callExpr; HeaderFile HdrFile }
%return ConstInfo
%endfunction
%function SLibGenRTLibFcnCallForDataTypeId(FcnRec, dtypeId) void
%assign RTWType = FcnGetMathDataTypeNameFromId(dtypeId)
%assign FcnInfo = FEVAL("rtwgettargetfcnlib_nothrow", LibGetModelName(), ...
FcnRec.Name, RTWType, ...
::IsSimBuild)
%if ISEMPTY(FcnInfo)
%return ""
%elseif ISFIELD(FcnInfo,"ErrIdentifier")
%<SLibReportErrorWithIdAndArgs(FcnInfo.ErrIdentifier, FcnInfo.ErrArguments)>
%else
%assign FcnName = FcnInfo.FcnName
%assign FcnType = FcnInfo.FcnType
%assign HdrFile = FcnInfo.HdrFile
%assign NumInputs = FcnInfo.NumInputs
%endif
%if NumInputs != FcnRec.NumArgs
%assign msg = "Number of arguments indicated in FcnRec must match"...
"generic operation's number of arguments."
%<LibReportFatalError(msg)>
%endif
%<FcnTrackHeaderFileUsage(HdrFile, ...
ISFIELD(FcnInfo, "HasTLCGenCallBack") && FcnInfo.HasTLCGenCallBack, ...
TLC_FALSE)>
%assign FcnTypeId = FcnGetDataTypeIdFromName(FcnType)
%if LibGetDataTypeIdAliasedThruToFromId(FcnTypeId) != ...
LibGetDataTypeIdAliasedThruToFromId(FcnRec.RetTypeId)
%assign outExpr = "(%<LibGetDataTypeNameFromId(FcnRec.RetTypeId)>)"
%else
%assign outExpr = ""
%endif
%assign outExpr = outExpr + FcnName + "("
%foreach k = NumInputs
%if k > 0
%if !FEVAL("rem",k,2)
%assign comma = ",/n"
%else
%assign comma = ","
%endif
%else
%assign comma = ""
%endif
%assign outExpr = "%<outExpr>%<comma>%"
%endforeach
%return "%<outExpr>)"
%endfunction
%function SLibGenRTLibFcnCall(FcnRec) void
%return SLibGenRTLibFcnCallForDataTypeId(FcnRec, FcnRec.RetTypeId)
%endfunction
%function LibGenMemFcnCall(fcnName, input0Arg, input1Arg, input2Arg) void
%assign fcnInfo = SLibGenMemFcnCallInfo(fcnName, input0Arg, input1Arg, input2Arg)
%if ISEMPTY(fcnInfo)
%return ""
%else
%return fcnInfo.Expr
%endif
%endfunction
%function SLibGenMemFcnCallInfo(fcnName, input0Arg, input1Arg, input2Arg) void
%switch fcnName
%case "memcpy"
%createrecord FcnRec { Name fcnName; RetTypeId FcnGetDataTypeIdFromName("void"); IsPtr 1; IsCplx 0; IsConst 0; NumArgs 3 }
%addtorecord FcnRec ArgList { Expr input0Arg; TypeId FcnGetDataTypeIdFromName("void"); IsPtr 1; IsCplx 0; IsConst 0 }
%addtorecord FcnRec ArgList { Expr input1Arg; TypeId FcnGetDataTypeIdFromName("void"); IsPtr 1; IsCplx 0; IsConst 0 }
%addtorecord FcnRec ArgList { Expr input2Arg; TypeId FcnGetDataTypeIdFromName("size_t"); IsPtr 0; IsCplx 0; IsConst 0 }
%break
%case "memset"
%assign input0Arg = FcnReplaceCCastWithStaticCastForCPP(input0Arg)
%assign input1Arg_tmp = ""
%if TYPE(input1Arg) != "String"
%assign input1Arg_tmp = "%<input1Arg>"
%else
%foreach idx = SIZE(input1Arg,1)
%if input1Arg[idx] != " "
%assign input1Arg_tmp = input1Arg_tmp + "%"
%endif
%endforeach
%endif
%assign memsetZero = TLC_FALSE
%if ISEMPTY(FEVAL("regexp",input1Arg_tmp,"[^0.]"))
%assign memsetZero = TLC_TRUE
%endif
%if (ConfigSet.PortableWordSizes == 1) && !memsetZero
%assign HostSizes = FEVAL("rtwprivate", "rtwhostwordlengths")
%if IntegerSizes.CharNumBits != HostSizes.CharNumBits
%assign args = ["%<IntegerSizes.CharNumBits>", "%<CAST("Number", HostSizes.CharNumBits)>"]
%<SLibReportErrorWithIdAndArgs("RTW:tlc:PWSNonZeroTLCMemset", args)>
%endif
%endif
%if EXISTS(::Memset2Zero) && ::Memset2Zero==1
%if memsetZero
%createrecord FcnRec { Name "memset2zero"; RetTypeId FcnGetDataTypeIdFromName("void"); IsPtr 1; IsCplx 0; IsConst 0; NumArgs 3 }
%addtorecord FcnRec ArgList { Expr input0Arg; TypeId FcnGetDataTypeIdFromName("void"); IsPtr 1; IsCplx 0; IsConst 0 }
%addtorecord FcnRec ArgList { Expr input1Arg; TypeId FcnGetDataTypeIdFromName("integer"); IsPtr 0; IsCplx 0; IsConst 0 }
%addtorecord FcnRec ArgList { Expr input2Arg; TypeId FcnGetDataTypeIdFromName("size_t"); IsPtr 0; IsCplx 0; IsConst 0 }
%assign fcnCall = SLibGenFcnCallInfo(FcnRec)
%if !ISEMPTY(fcnCall)
%return fcnCall
%endif
%endif
%endif
%createrecord FcnRec { Name fcnName; RetTypeId FcnGetDataTypeIdFromName("void"); IsPtr 1; IsCplx 0; IsConst 0; NumArgs 3 }
%addtorecord FcnRec ArgList { Expr input0Arg; TypeId FcnGetDataTypeIdFromName("void"); IsPtr 1; IsCplx 0; IsConst 0 }
%addtorecord FcnRec ArgList { Expr input1Arg; TypeId FcnGetDataTypeIdFromName("integer"); IsPtr 0; IsCplx 0; IsConst 0 }
%addtorecord FcnRec ArgList { Expr input2Arg; TypeId FcnGetDataTypeIdFromName("size_t"); IsPtr 0; IsCplx 0; IsConst 0 }
%break
%case "memcmp"
%createrecord FcnRec { Name fcnName; RetTypeId FcnGetDataTypeIdFromName("integer"); IsPtr 0; IsCplx 0; IsConst 0; NumArgs 3 }
%addtorecord FcnRec ArgList { Expr input0Arg; TypeId FcnGetDataTypeIdFromName("void"); IsPtr 1; IsCplx 0; IsConst 1 }
%addtorecord FcnRec ArgList { Expr input1Arg; TypeId FcnGetDataTypeIdFromName("void"); IsPtr 1; IsCplx 0; IsConst 1 }
%addtorecord FcnRec ArgList { Expr input2Arg; TypeId FcnGetDataTypeIdFromName("size_t"); IsPtr 0; IsCplx 0; IsConst 0 }
%break
%default
%exit "MATHLIB: Unsupported function %<fcnName>."
%endswitch
%return SLibGenFcnCallInfo(FcnRec)
%endfunction
%function LibGenUnusedParamFcnCall(fcnName, input0Arg) void
%assign fcnInfo = SLibGenUnusedParamFcnCall(fcnName, input0Arg)
%if ISEMPTY(fcnInfo)
%return ""
%else
%return fcnInfo.Expr
%endif
%endfunction
%function SLibGenUnusedParamFcnCall(fcnName, input0Arg) void
%switch fcnName
%case "RT_UNUSED_PARAMETER"
%createrecord FcnRec { Name fcnName; RetTypeId FcnGetDataTypeIdFromName("void"); IsPtr 0; IsCplx 0; IsConst 0; NumArgs 1 }
%addtorecord FcnRec ArgList { Expr input0Arg; TypeId FcnGetDataTypeIdFromName("void"); IsPtr 0; IsCplx 0; IsConst 0 }
%break
%default
%exit "MATHLIB: Unsupported function %<fcnName>."
%endswitch
%return SLibGenFcnCallInfo(FcnRec)
%endfunction
%function LibGenStringFcnCall2Args(fcnName, input0Arg, input1Arg) void
%assign fcnRec = LibCreateHomogMathFcnRec(fcnName, tSS_POINTER)
%assign fcnRec = LibSetMathFcnRecArgExpr(fcnRec, 0, input0Arg)
%assign fcnRec = LibSetMathFcnRecArgExpr(fcnRec, 1, input1Arg)
%return SLibGenRTLibFcnCall(fcnRec)
%endfunction
%function LibGenZCFcnCall(dataTypeId, input0Arg, input1Arg, input2Arg) void
%assign fcnRec = LibCreateHomogFcnRec("rt_zcFcn", dataTypeId)
%assign fcnRec = LibSetMathFcnRecArgExpr(fcnRec, 0, input0Arg)
%assign fcnRec = LibSetMathFcnRecArgExpr(fcnRec, 1, input1Arg)
%assign fcnRec = LibSetMathFcnRecArgExpr(fcnRec, 2, input2Arg)
%return SLibGenRTLibFcnCallForDataTypeId(fcnRec, dataTypeId)
%endfunction
%function LibGenMathFcnCall(RTWFcnName, RTWFcnTypeId, input1Arg, input2Arg) void
%if input2Arg != ""
%return LibGenTwoInputFcnCall(RTWFcnName, RTWFcnTypeId, input1Arg, input2Arg)
%else
%return LibGenOneInputFcnCall(RTWFcnName, RTWFcnTypeId, input1Arg)
%endif
%endfunction
%function SLibGenPowFcnCall(RTWFcnName, RTWFcnTypeId, input1Arg, input2Arg) void
%createrecord FcnRec { Name RTWFcnName; RetTypeId RTWFcnTypeId; NumArgs 2 }
%addtorecord FcnRec ArgList { Expr input1Arg; TypeId RTWFcnTypeId; IsPtr 0; IsCplx 0; IsConst 0 }
%addtorecord FcnRec ArgList { Expr input2Arg; TypeId RTWFcnTypeId; IsPtr 0; IsCplx 0; IsConst 0 }
%assign fcnInfo = SLibGenFcnCallInfoWithCheck(FcnRec, TLC_FALSE, TLC_FALSE)
%if ISEMPTY(fcnInfo)
%<FcnTrackMathDotH()>
%if GenCPP
%assign fcnName = "std::pow"
%else
%assign fcnName = "pow"
%endif
%return fcnName + "(" + input1Arg + ", " + input2Arg + ")"
%endif
%return fcnInfo.Expr
%endfunction
%function FcnTrackMathDotH() void
%if GenCPP
%<FcnTrackHeaderFileUsage("", TLC_FALSE, TLC_FALSE)>
%else
%<FcnTrackHeaderFileUsage("math.h", TLC_FALSE, TLC_FALSE)>
%endif
%endfunction
%function LibGenSharedMathFcnCall(RTWFcnName, RTWFcnTypeId, input1Arg, input2Arg) void
%if RTWFcnName == "ldexp"
%return LibGenNonHomogenousTwoInputFcnCall(RTWFcnName, tSS_DOUBLE, ...
tSS_DOUBLE, input1Arg, ...
tSS_INTEGER, input2Arg)
%else
%createrecord FcnRec { Name RTWFcnName; RetTypeId RTWFcnTypeId; NumArgs 1 }
%addtorecord FcnRec ArgList { Expr input1Arg; TypeId RTWFcnTypeId; IsPtr 0; IsCplx 0; IsConst 0 }
%if input2Arg != ""
%assign FcnRec.NumArgs = 2
%addtorecord FcnRec ArgList { Expr input2Arg; TypeId RTWFcnTypeId; IsPtr 0; IsCplx 0; IsConst 0 }
%endif
%return LibGenFcnCall(FcnRec)
%endif
%endfunction
%function SLibCheckComplexSupportRequired(Headers) void
%if !ISEMPTY(Headers)
%assign nHeaders = SIZE(Headers,1)
%foreach idx = nHeaders
%if (Headers[idx] == "blascompat32_crl.h")
%if (SupportComplex == 0)
%assign msg = "Use of blascompat32_crl.h requires complex numbers to be supported. Please enable complex support."
%<LibReportFatalError(msg)>
%endif
%endif
%if (Headers[idx] == "blas.h")
%if (SupportComplex == 0)
%assign msg = "Use of blas.h requires complex numbers to be supported. Please enable complex support."
%<LibReportFatalError(msg)>
%endif
%endif
%endforeach
%endif
%endfunction
%function LibGenOneInputFcnCall(RTWFcnName, RTWFcnTypeId, inputArg) void
%createrecord FcnRec { Name RTWFcnName; RetTypeId RTWFcnTypeId; NumArgs 1 }
%addtorecord FcnRec ArgList { Expr inputArg; TypeId RTWFcnTypeId; IsPtr 0; IsCplx 0; IsConst 0 }
%return LibGenFcnCall(FcnRec)
%endfunction
%function LibGenTwoInputFcnCallInfo(RTWFcnName, RTWFcnTypeId, input1Arg, input2Arg) void
%createrecord FcnRec { Name RTWFcnName; RetTypeId RTWFcnTypeId; NumArgs 2 }
%addtorecord FcnRec ArgList { Expr input1Arg; TypeId RTWFcnTypeId; IsPtr 0; IsCplx 0; IsConst 0 }
%addtorecord FcnRec ArgList { Expr input2Arg; TypeId RTWFcnTypeId; IsPtr 0; IsCplx 0; IsConst 0 }
%return SLibGenFcnCallInfo(FcnRec)
%endfunction
%function LibGenTwoInputFcnCall(RTWFcnName, RTWFcnTypeId, input1Arg, input2Arg) void
%assign fcnInfo = LibGenTwoInputFcnCallInfo(RTWFcnName, RTWFcnTypeId, input1Arg, input2Arg)
%if ISEMPTY(fcnInfo)
%return ""
%endif
%return fcnInfo.Expr
%endfunction
%function LibGenNonHomogenousTwoInputFcnCall(RTWFcnName, RTWFcnTypeIdOut, RTWFcnTypeId1, input1Arg, RTWFcnTypeId2, input2Arg) void
%assign fcnInfo = SLibGenNonHomogenousTwoInputFcnCallInfo(RTWFcnName, RTWFcnTypeIdOut, RTWFcnTypeId1, input1Arg, RTWFcnTypeId2, input2Arg)
%if ISEMPTY(fcnInfo)
%return ""
%endif
%return fcnInfo.Expr
%endfunction
%function SLibGenNonHomogenousTwoInputFcnCallInfo(RTWFcnName, RTWFcnTypeIdOut, RTWFcnTypeId1, input1Arg, RTWFcnTypeId2, input2Arg) void
%createrecord FcnRec { Name RTWFcnName; RetTypeId RTWFcnTypeIdOut; NumArgs 2 }
%addtorecord FcnRec ArgList { Expr input1Arg; TypeId RTWFcnTypeId1; IsPtr 0; IsCplx 0; IsConst 0 }
%addtorecord FcnRec ArgList { Expr input2Arg; TypeId RTWFcnTypeId2; IsPtr 0; IsCplx 0; IsConst 0 }
%return SLibGenFcnCallInfo(FcnRec)
%endfunction
%function LibGenOneInputOneOutputFcnCall(RTWFcnName, RTWFcnTypeIdIn, RTWFcnTypeIdOut, inputArg) void
%assign fcnInfo = SLibGenOneInputOneOutputFcnCallInfo(RTWFcnName, RTWFcnTypeIdIn, RTWFcnTypeIdOut, inputArg)
%if ISEMPTY(fcnInfo)
%return ""
%endif
%return fcnInfo.Expr
%endfunction
%function SLibGenOneInputOneOutputFcnCallInfo(RTWFcnName, RTWFcnTypeIdIn, RTWFcnTypeIdOut, inputArg) void
%createrecord FcnRec { Name RTWFcnName; RetTypeId RTWFcnTypeIdOut; NumArgs 1}
%if (RTWFcnTypeIdIn == tSS_POINTER)
%assign IsPtr = 1
%else
%assign IsPtr = 0
%endif
%addtorecord FcnRec ArgList { Expr inputArg; TypeId RTWFcnTypeIdIn; IsPtr %<IsPtr>; IsCplx 0; IsConst 0 }
%return SLibGenFcnCallInfo(FcnRec)
%endfunction
%function FcnGenerateFcnCallInfo( FcnRec, FcnRecForTfl, FcnInfo, ...
isRetVoid, RetTypeId, RetTypeIsPtr) void
%assign FcnName = FcnInfo.FcnName
%assign FcnType = FcnInfo.FcnType
%assign RetIsPtr = FcnInfo.IsPtr
%assign HdrFile = FcnInfo.HdrFile
%assign NumInputs = FcnInfo.NumInputs
%assign Args = FcnInfo.Args
%assign hasTLCGenCallBack = ISFIELD(FcnInfo, "HasTLCGenCallBack") && ...
FcnInfo.HasTLCGenCallBack
%if FcnInfo.NumDWorkArgs > 1
%assign msg = "TLC cannot handle more than one DWork argument at this time."...
"Please rework the TFL entry for (%<FcnName>.)"
%<LibReportFatalError(msg)>
%endif
%if isRetVoid == TLC_TRUE
%assign FcnTypeId = FcnGetDataTypeIdFromName(FcnType)
%assign outExpr = SLibGenCastExpr(FcnTypeId, RetIsPtr, RetTypeId, RetTypeIsPtr)
%assign outExpr = outExpr + FcnName + "("
%else
%assign outExpr = FcnName + "("
%endif
%if NumInputs == 1
%if Args.Name != "u1" && Args.Name != "d1"
%assign msg = "TLC cannot handle injected constants at this time."...
"Please rework the TFL entry for (%<FcnName>, %<FcnRecForTfl.ArgList.TypeId>)."...
"Hint: arg name %<Args.Name> may be problematic."
%<LibReportFatalError(msg)>
%endif
%assign ArgTypeId = FcnGetDataTypeIdFromName(Args.Type)
%if Args.Name == "u1"
%assign castExpr = SLibGenCastExpr(FcnRec.ArgList.TypeId, FcnRec.ArgList.IsPtr, ArgTypeId, Args.IsPtr)
%assign outExpr = "%<outExpr>%<castExpr>%<FcnRec.ArgList.Expr>"
%elseif Args.Name == "d1"
%assign castExpr = SLibGenCastExprDoublePtr(FcnRec.DWorkArgList.TypeId, ...
FcnRec.DWorkArgList.IsPtr, FcnRec.DWorkArgList.IsDoublePtr, ...
ArgTypeId, Args.IsPtr, Args.IsDoublePtr)
%if Args.IsDoublePtr == 1 && FcnRec.DWorkArgList.IsPtr == 1 && FcnRec.DWorkArgList.IsDoublePtr == 0
%assign dwork = "&%<FcnRec.DWorkArgList.Expr>"
%else
%assign dwork = "%<FcnRec.DWorkArgList.Expr>"
%endif
%assign outExpr = "%<outExpr>%<castExpr>%<dwork>"
%endif
%else
%foreach k = NumInputs
%if "y1" == Args[k].Name
%assign msg = "TLC cannot handle mapping function ouput as input argument at this time."...
"Please rework the TFL entry for (%<FcnName>, %)."...
"Hint: arg name % must be a returned from function %<FcnName>."
%<LibReportFatalError(msg)>
%endif
%endforeach
%foreach k = NumInputs
%if k > 0
%if !FEVAL("rem",k,2)
%assign comma = ",/n"
%else
%assign comma = ", "
%endif
%else
%assign comma = ""
%endif
%assign found = 0
%assign dworkfound = 0
%foreach m = FcnRec.NumArgs
%assign argName = "u%"
%if argName == Args[k].Name
%assign index = m
%assign found = 1
%break
%endif
%endforeach
%if found == 0
%foreach m = FcnRec.NumDWorkArgs
%assign argName = "d%"
%if argName == Args[k].Name
%assign index = m
%assign dworkfound = 1
%break
%endif
%endforeach
%endif
%if found == 1
%if Args[k].IsPtr==1
%assign ArgTypeId = tSS_POINTER
%else
%assign ArgTypePlain = SLibStripQualifiers(Args[k].Type)
%assign ArgTypeId = FcnGetDataTypeIdFromName(ArgTypePlain)
%endif
%if FcnRec.NumArgs == 1
%assign castExpr = SLibGenCastExpr(FcnRec.ArgList.TypeId, FcnRec.ArgList.IsPtr, ArgTypeId, Args[k].IsPtr)
%assign outExpr = "%<outExpr>%<comma>%<castExpr>%<FcnRec.ArgList.Expr>"
%else
%assign castExpr = SLibGenCastExpr(FcnRec.ArgList[index].TypeId, FcnRec.ArgList[index].IsPtr, ArgTypeId, Args[k].IsPtr)
%assign outExpr = "%<outExpr>%<comma>%<castExpr>%"
%endif
%elseif dworkfound == 1
%assign ArgTypeId = FcnGetDataTypeIdFromName(Args[k].Type)
%if FcnRec.NumDWorkArgs == 1
%assign castExpr = SLibGenCastExprDoublePtr(FcnRec.DWorkArgList.TypeId, ...
FcnRec.DWorkArgList.IsPtr, FcnRec.DWorkArgList.IsDoublePtr, ...
ArgTypeId, Args[k].IsPtr, Args[k].IsDoublePtr)
%if Args[k].IsDoublePtr == 1 && FcnRec.DWorkArgList.IsPtr == 1 && FcnRec.DWorkArgList.IsDoublePtr == 0
%assign dwork = "&%<FcnRec.DWorkArgList.Expr>"
%else
%assign dwork = "%<FcnRec.DWorkArgList.Expr>"
%endif
%else
%assign castExpr = SLibGenCastExprDoublePtr(FcnRec.DWorkArgList.TypeId, ...
FcnRec.DWorkArgList[index].IsPtr, FcnRec.DWorkArgList[index].IsDoublePtr, ...
ArgTypeId, Args[k].IsPtr, Args[k].IsDoublePtr)
%if Args[k].IsDoublePtr == 1 && FcnRec.DWorkArgList[index].IsPtr == 1 && FcnRec.DWorkArgList[index].IsDoublePtr == 0
%assign dwork = "&%"
%else
%assign dwork = "%"
%endif
%endif
%assign outExpr = "%<outExpr>%<comma>%<castExpr>%<dwork>"
%else
%assign outExpr = "%<outExpr>%<comma>%"
%endif
%endforeach
%endif
%<FcnTrackHeaderFileUsage(HdrFile, hasTLCGenCallBack, TLC_FALSE)>
%assign callExpr = "%<outExpr>)"
%if ISEMPTY(FEVAL("strfind",HdrFile,"<")) && ...
ISEMPTY(FEVAL("strfind",HdrFile,"/""))
%assign HdrFile = "/"" + HdrFile + "/""
%endif
%createrecord FunctionInfo { Expr callExpr; HeaderFile HdrFile }
%return FunctionInfo
%endfunction
%function FcnGenExprFromIR( FcnRec, FcnInfo) void
%assign RetType = FcnGetMathDataTypeNameFromId(FcnRec.RetTypeId)
%if ISFIELD(FcnRec, "RetExpr")
%assign RetExpr = "%<FcnRec.RetExpr>"
%else
%assign RetExpr = "yout"
%endif
%createrecord RecForTfl {RetTypeId RetType; RetName RetExpr; Key FcnRec.Name; ...
NumArgs FcnRec.NumArgs; InlineFcn FcnInfo.InlineFcn}
%if FcnRec.NumArgs == 1
%assign InputType = FcnGetMathDataTypeNameFromId(FcnRec.ArgList.TypeId)
%addtorecord RecForTfl ArgList { TypeId InputType; Name FcnRec.ArgList.Expr }
%else
%foreach k = FcnRec.NumArgs
%assign InputType = FcnGetMathDataTypeNameFromId(FcnRec.ArgList[k].TypeId)
%addtorecord RecForTfl ArgList { TypeId InputType; Name FcnRec.ArgList[k].Expr }
%endforeach
%endif
%if !SLibIsValidCoderContext()
%error "This math library function is not available if the TLC command is invoked offline"
%endif
%assign rtwCtx = ::CompiledModel.RTWContext
%assign vec = FEVAL("rtwprivate", "rtwcustomtfl", rtwCtx, RecForTfl)
%assign headers = vec[3]
%foreach idx = SIZE(headers, 0)
%<FcnTrackHeaderFileUsage(headers[idx], TLC_FALSE, TLC_FALSE)>
%endforeach
%return vec
%endfunction
%function LibGenFcnCall(FcnRec) void
%assign fcnInfo = SLibGenFcnCallInfo(FcnRec)
%if ISEMPTY(fcnInfo)
%return ""
%endif
%return fcnInfo.Expr
%endfunction
%function SLibGenFcnCallInfo(FcnRec) void
%assign fcnInfo =SLibGenFcnCallInfoWithCheck(FcnRec, TLC_TRUE, TLC_FALSE)
%if ISEMPTY(fcnInfo)
%return ""
%endif
%return fcnInfo
%endfunction
%function SLibGenFcnCallInfoWithCheck(FcnRec, allowCustomization, nameOnly) void
%copyrecord FcnRecForTfl FcnRec
%assign isRetVoid = ISFIELD(FcnRec, "RetTypeId")
%assign RetTypeIsPtr = []
%assign RetTypeId = []
%if isRetVoid == TLC_TRUE
%assign RetTypeId = FcnRec.RetTypeId
%assign RetTypeIsPtr = 0
%if ISFIELD(FcnRec, "IsPtr")
%if FcnRec.IsPtr == 1
%assign RetTypeIsPtr = 1
%endif
%endif
%assign FcnRecForTfl.RetTypeId = FcnGetMathDataTypeNameFromId(RetTypeId)
%endif
%assign ArgIds = []
%if FcnRec.NumArgs == 1
%assign argType = FcnGetMathDataTypeNameFromId(FcnRec.ArgList.TypeId)
%assign FcnRecForTfl.ArgList.TypeId = argType
%else
%foreach k = FcnRec.NumArgs
%assign argType = FcnGetMathDataTypeNameFromId(FcnRec.ArgList[k].TypeId)
%assign FcnRecForTfl.ArgList[k].TypeId = argType
%endforeach
%endif
%assign FcnInfo = FEVAL("rtw_tfl_query_nothrow", LibGetModelName(), FcnRecForTfl, ...
::IsSimBuild)
%if ISEMPTY(FcnInfo)
%return FcnInfo
%elseif ISFIELD(FcnInfo,"ErrIdentifier")
%<SLibReportErrorWithIdAndArgs(FcnInfo.ErrIdentifier, FcnInfo.ErrArguments)>
%else
%assign CustomizationEntry = FcnInfo.CustomizationEntry
%endif
%if CustomizationEntry == 0 && ISEMPTY(FcnInfo.ImplCallback)
%if nameOnly == TLC_FALSE
%assign functionInfo = FcnGenerateFcnCallInfo(FcnRec, FcnRecForTfl, FcnInfo, ...
isRetVoid, RetTypeId, RetTypeIsPtr)
%return functionInfo
%else
%assign HdrFile = FcnInfo.HdrFile
%assign hasTLCGenCallBack = ISFIELD(FcnInfo, "HasTLCGenCallBack") && ...
FcnInfo.HasTLCGenCallBack
%<FcnTrackHeaderFileUsage(HdrFile, hasTLCGenCallBack, TLC_FALSE)>
%return FcnInfo
%endif
%else
%if allowCustomization == TLC_TRUE
%assign FcnInfo.InlineFcn = TLC_FALSE
%assign vec = FcnGenExprFromIR(FcnRec, FcnInfo)
%assign callExpr = "%"
%if nameOnly == TLC_FALSE
%createrecord FunctionInfo { Expr callExpr; HeaderFile " "}
%else
%assign fcn_name = FEVAL("regexprep",callExpr,"/(([^/}]+)/)","")
%createrecord FunctionInfo { FcnName fcn_name}
%endif
%return FunctionInfo
%else
%return []
%endif
%endif
%endfunction
%function LibGenFcnExpr(FcnRec, sharedLib) void
%assign fcnInfo = SLibGenFcnExprInfo(FcnRec)
%if ISEMPTY(fcnInfo)
%return ""
%endif
%return fcnInfo.Expr
%endfunction
%function SLibGenFcnExprInfo(FcnRec) void
%copyrecord FcnRecForTfl FcnRec
%assign isRetVoid = ISFIELD(FcnRec, "RetTypeId")
%assign RetTypeId = []
%assign RetTypeIsPtr = []
%if isRetVoid == TLC_TRUE
%assign RetTypeId = FcnRec.RetTypeId
%assign RetTypeIsPtr = 0
%if ISFIELD(FcnRec, "IsPtr")
%if FcnRec.IsPtr == 1
%assign RetTypeIsPtr = 1
%endif
%endif
%assign FcnRecForTfl.RetTypeId = FcnGetMathDataTypeNameFromId(RetTypeId)
%endif
%assign ArgIds = []
%if FcnRec.NumArgs == 1
%assign argType = FcnGetMathDataTypeNameFromId(FcnRec.ArgList.TypeId)
%assign FcnRecForTfl.ArgList.TypeId = argType
%else
%foreach k = FcnRec.NumArgs
%assign argType = FcnGetMathDataTypeNameFromId(FcnRec.ArgList[k].TypeId)
%assign FcnRecForTfl.ArgList[k].TypeId = argType
%endforeach
%endif
%assign FcnInfo = FEVAL("rtw_tfl_query_nothrow", LibGetModelName(), FcnRecForTfl, ...
::IsSimBuild)
%if ISEMPTY(FcnInfo)
%return FcnInfo
%elseif ISFIELD(FcnInfo,"ErrIdentifier")
%<SLibReportErrorWithIdAndArgs(FcnInfo.ErrIdentifier, FcnInfo.ErrArguments)>
%else
%assign CustomizationEntry = FcnInfo.CustomizationEntry
%endif
%if CustomizationEntry == 0
%assign functionInfo = FcnGenerateFcnCallInfo(FcnRec, FcnRecForTfl, FcnInfo, ...
isRetVoid, RetTypeId, RetTypeIsPtr)
%assign functionInfo.Expr = "%<FcnRec.RetExpr> = %<functionInfo.Expr>;"
%return functionInfo
%else
%assign vec = FcnGenExprFromIR(FcnRec, FcnInfo)
%assign callExpr = "%"
%createrecord FunctionInfo { Expr callExpr; HeaderFile " "}
%return FunctionInfo
%endif
%endfunction
%function SLibStripQualifiers(DataTypeStr) void
%assign plainT = DataTypeStr
%if !ISEMPTY(FEVAL("strfind",plainT,"const"))
%assign plainT = FEVAL("strrep",plainT,"const ","")
%elseif !ISEMPTY(FEVAL("strfind",plainT,"volatile"))
%assign plainT = FEVAL("strrep",plainT,"volatile ","")
%endif
%return plainT
%endfunction
%function SLibGenCastExpr(FromDataType, FromIsPtr, ToDataType, ToIsPtr) void
%return SLibGenCastExprDoublePtr(FromDataType, FromIsPtr, TLC_FALSE, ToDataType, ToIsPtr, TLC_FALSE)
%endfunction
%function SLibGenCastExprDoublePtr(FromDataType, FromIsPtr, FromIsDoublePtr, ToDataType, ToIsPtr, ToIsDoublePtr) void
%if LibGetDataTypeIdAliasedThruToFromId(FromDataType) != ...
LibGetDataTypeIdAliasedThruToFromId(ToDataType) || ...
(FromIsPtr != ToIsPtr && ToIsDoublePtr == TLC_FALSE) || ...
(FromIsDoublePtr != ToIsDoublePtr)
%if (ToDataType == tSS_INTEGER)
%assign FromDataTypeName = FcnGetMathDataTypeNameFromId(FromDataType)
%assign numBitsStr = "int" + "%<IntegerSizes.IntNumBits>"
%if ((FromDataTypeName == numBitsStr) ...
|| (FromDataTypeName == FcnGetNonBuiltInTypeNameFromId(ToDataType,"")))
%return ""
%else
%assign typeName = "int"
%endif
%elseif (ToDataType == tSS_UINTEGER)
%assign FromDataTypeName = FcnGetMathDataTypeNameFromId(FromDataType)
%assign numBitsStr = "uint" + "%<IntegerSizes.IntNumBits>"
%if ((FromDataTypeName == numBitsStr) ...
|| (FromDataTypeName == FcnGetNonBuiltInTypeNameFromId(ToDataType,"")))
%return ""
%else
%assign typeName = "unsigned int"
%endif
%elseif (ToDataType == tSS_SIZET)
%assign FromDataTypeName = FcnGetMathDataTypeNameFromId(FromDataType)
%assign numBitsStr = "uint" + "%<IntegerSizes.IntNumBits>"
%if ((FromDataTypeName == numBitsStr) ...
|| (FromDataTypeName == FcnGetNonBuiltInTypeNameFromId(ToDataType,"")))
%return ""
%else
%assign typeName = "size_t"
%endif
%elseif (ToDataType == tSS_LONG)
%assign FromDataTypeName = FcnGetMathDataTypeNameFromId(FromDataType)
%assign numBitsStr = "int" + "%<IntegerSizes.LongNumBits>"
%if ((FromDataTypeName == numBitsStr) ...
|| (FromDataTypeName == FcnGetNonBuiltInTypeNameFromId(ToDataType,"")))
%return ""
%else
%assign typeName = "long"
%endif
%elseif (ToDataType == tSS_ULONG)
%assign FromDataTypeName = FcnGetMathDataTypeNameFromId(FromDataType)
%assign numBitsStr = "uint" + "%<IntegerSizes.LongNumBits>"
%if ((FromDataTypeName == numBitsStr) ...
|| (FromDataTypeName == FcnGetNonBuiltInTypeNameFromId(ToDataType,"")))
%return ""
%else
%assign typeName = "unsigned long"
%endif
%elseif (ToDataType == tSS_LONG_LONG)
%assign FromDataTypeName = FcnGetMathDataTypeNameFromId(FromDataType)
%assign numBitsStr = "int" + "%<IntegerSizes.LongLongNumBits>"
%if ((FromDataTypeName == numBitsStr) ...
|| (FromDataTypeName == FcnGetNonBuiltInTypeNameFromId(ToDataType,"")))
%return ""
%else
%assign typeName = "long long"
%endif
%elseif (ToDataType == tSS_ULONG_LONG)
%assign FromDataTypeName = FcnGetMathDataTypeNameFromId(FromDataType)
%assign numBitsStr = "uint" + "%<IntegerSizes.LongLongNumBits>"
%if ((FromDataTypeName == numBitsStr) ...
|| (FromDataTypeName == FcnGetNonBuiltInTypeNameFromId(ToDataType,"")))
%return ""
%else
%assign typeName = "unsigned long long"
%endif
%elseif (ToDataType == tSS_VOID)
%if (FromDataType != tSS_VOID)
%assign typeName = "void"
%else
%return ""
%endif
%else
%assign typeName = LibGetDataTypeNameFromId(ToDataType)
%endif
%assign ptrExpr = ""
%if ToIsPtr == 1
%assign ptrExpr = "*"
%elseif ToIsDoublePtr == 1
%if FromIsPtr == 1
%assign ptrExpr = "*"
%else
%assign ptrExpr = "**"
%endif
%endif
%assign castExpr = "(%<typeName>" + ptrExpr + ")"
%if castExpr == "(pointer_T)" || castExpr == "(pointer_T*)"
%assign castExpr = ""
%endif
%else
%assign castExpr = ""
%endif
%return castExpr
%endfunction
%function SLibGetMathFcnNameFromTFL(RTWFcnName, RTWFcnTypeId, Arg1Type, Arg2Type) void
%createrecord FcnRec { Name RTWFcnName; RetTypeId RTWFcnTypeId; NumArgs 1 }
%addtorecord FcnRec ArgList { Expr ""; TypeId Arg1Type; IsPtr 0; IsCplx 0; IsConst 0 }
%if Arg2Type != ""
%assign FcnRec.NumArgs = 2
%addtorecord FcnRec ArgList { Expr ""; TypeId Arg2Type; IsPtr 0; IsCplx 0; IsConst 0 }
%endif
%assign FcnInfo = SLibGenFcnCallInfoWithCheck(FcnRec, TLC_TRUE, TLC_TRUE)
%if ISEMPTY(FcnInfo)
%return ""
%endif
%return FcnInfo.FcnName
%endfunction
%function SLibRunTFLCallbacks() void
%assign numcbs = FEVAL("rtwprivate","rtw_get_tfl_cb_info", LibGetModelName(), -1)
%foreach j = 5
%if numcbs == 0
%break
%endif
%foreach i = numcbs
%assign fctInfo = FEVAL("rtwprivate","rtw_get_tfl_cb_info", ...
LibGetModelName(), i+1)
%if ISEMPTY(FEVAL("strfind", ::CalledTflTlcCallbacks, fctInfo.FileName+","))
%assign ::CalledTflTlcCallbacks = ::CalledTflTlcCallbacks + fctInfo.FileName + ","
%assign fullPath = FEVAL("fullfile",GenUtilsPath,fctInfo.FileName)
%assign headerExists = FEVAL("exist","%<fullPath>.h")
%assign sourceExists = FEVAL("exist","%<fullPath>.%<LangFileExt>")
%if !(headerExists || sourceExists)
%assign fileH = SLibGetFileRecForUtilCode("util_hdr", fctInfo.FileName)
%<LibSetSourceFileOutputDirectory(fileH,GenUtilsPath)>
%assign fileC = SLibGetFileRecForUtilCode("util_src", fctInfo.FileName)
%<LibSetSourceFileOutputDirectory(fileC,GenUtilsPath)>
%if FILE_EXISTS(fctInfo.genCallback)
%assign type = FEVAL("regexprep","%<fctInfo.genCallback>",".tlc","","ignorecase")
%generatefile "%<type>" "%<fctInfo.genCallback>"
%if GENERATE_TYPE_FUNCTION_EXISTS(fctInfo, fctInfo.genCallbackFcn, type)
%assign result = GENERATE_TYPE(fctInfo, fctInfo.genCallbackFcn, type, fileH, fileC)
%else
%assign args = ["%<fctInfo.genCallbackFcn>", "%<fctInfo.genCallback>"]
%<SLibReportErrorWithIdAndArgs("RTW:tlc:FcnNotFoundinTFL", args)>
%endif
%else
%<SLibReportErrorWithIdAndArgs("RTW:tlc:FileNotFoundinTFL", "%<fctInfo.genCallback>")>
%endif
%else
%if headerExists
%<SLibAddGeneratedFileToList(fctInfo.FileName + ".h", "utility", "header","")>
%endif
%if sourceExists
%<SLibAddGeneratedFileToList(fctInfo.FileName + "." + LangFileExt, "utility", "source","")>
%endif
%<SLibRefreshTflHitCache(fctInfo)>
%endif
%endif
%endforeach
%assign numcbs = FEVAL("rtwprivate","rtw_get_tfl_cb_info",LibGetModelName(),-2)
%endforeach
%endfunction
%function SLibRefreshTflHitCache(fctInfo) void
%if !ISEMPTY(fctInfo.genCallback) && fctInfo.genCallback == "genrtnonfinite.tlc" && !EXISTS(CustomNonFinites)
%assign type = FEVAL("regexprep","%<fctInfo.genCallback>",".tlc","","ignorecase")
%generatefile "%<type>" "%<fctInfo.genCallback>"
%if FILE_EXISTS(fctInfo.genCallback) && GENERATE_TYPE_FUNCTION_EXISTS(fctInfo, fctInfo.genCallbackFcn, type)
%assign fileH = SLibGetFileRecForUtilCode("util_hdr", fctInfo.FileName)
%assign fileC = SLibGetFileRecForUtilCode("util_src", fctInfo.FileName)
%assign result = GENERATE_TYPE(fctInfo, fctInfo.genCallbackFcn, type, fileH, fileC)
%<SLibSetModelFileAttribute(fileH, "Filter", 1)>
%<SLibSetModelFileAttribute(fileC, "Filter", 1)>
%else
%<SLibReportErrorWithIdAndArgs("RTW:tlc:FcnNotFoundinTFL", ...
["%<fctInfo.genCallbackFcn>", "%<fctInfo.genCallback>"])>
%endif
%endif
%endfunction
%function (module, headerFile, moduleFileTypeIdx) void
%assign system = System[module.CGSystemIdx]
%<FcnAppendSystemFcnHeaders(system, headerFile, moduleFileTypeIdx)>
%endfunction
%function (system, headerFile, moduleFileTypeIdx) void
%<SLibCheckComplexSupportRequired(headerFile)>
%assign ownerSystem = System[system.FileNameOwnerIdx]
%if ISEQUAL(moduleFileTypeIdx, ::CompiledModel.MdlHeaderFileIdx)
%<SLibCacheSystemCodeToFile("sys_hdr_util_incl", system, headerFile)>
%elseif ISEQUAL(moduleFileTypeIdx, ::CompiledModel.MdlSrcFileIdx)
%<SLibCacheSystemCodeToFile("sys_src_util_incl", system, headerFile)>
%else
%error "Unknown moduleFileTypeIdx for ModuleFileType"
%endif
%endfunction
%function FcnAppendUtilsIncludes(utilsIncludeIdx, headerFile) void
%<SLibCheckComplexSupportRequired(headerFile)>
%<SLibCacheCodeToFile(utilsIncludeIdx, headerFile)>
%endfunction
%function GetCurrentUtilsIncludesIdx() void
%return ::CurrentUtilsIncludesIdx
%endfunction
%function SetCurrentUtilsIncludesIdx(val) void
%assign ::CurrentUtilsIncludesIdx = val
%endfunction
%function (HdrFile, hasTLCGenCallBack, isGeneratedUtility) void
%if !ISEMPTY(HdrFile)
%assign compact = SLibIsCompactFileFormat()
%assign sharedUtilFile = ...
(::CompiledModel.GenUtilsSrcInSharedLocation == 1) || !compact
%if sharedUtilFile && ...
(SIZE(::GlobalSharedUtilsIncludes,1) > 0)
%<LibAddtoSharedUtilsIncludes(HdrFile)>
%else
%assign genToShared = (::CompiledModel.GenUtilsSrcInSharedLocation == 1)
%if !genToShared && compact && hasTLCGenCallBack
%return
%endif
%assign utilsIncludesIdx = GetCurrentUtilsIncludesIdx()
%if ISEMPTY(utilsIncludesIdx)
%assign moduleIdx = ::CurrentModuleIdx >= 0 ? ::CurrentModuleIdx : GetBaseModuleIdx()
%assign rtwModule = RTWCGModules.RTWCGModule[moduleIdx]
%if isGeneratedUtility && genToShared
%assign moduleFileTypeIdx = ::CompiledModel.MdlSrcFileIdx
%else
%assign moduleFileTypeIdx = ::CompiledModel.MdlHeaderFileIdx
%endif
%<FcnAppendModuleFcnHeaders(rtwModule, HdrFile, moduleFileTypeIdx)>
%else
%<FcnAppendUtilsIncludes(utilsIncludesIdx, HdrFile)>
%endif
%endif
%endif
%endfunction
%function (HdrFile, hasTLCGenCallBack) void
%if ::CompiledModel.GenUtilsSrcInSharedLocation == 1
%<FcnTrackHeaderFileUsage(HdrFile, hasTLCGenCallBack, TLC_TRUE)>
%endif
%endfunction
%function SLibAddTFLTypeIncludes() void
%assign hdrIncludes = ""
%foreach modIdx = RTWCGModules.NumRTWCGModules
%assign module = RTWCGModules.RTWCGModule[modIdx]
%if module.HasPublicTypes
%assign hdrIncludes = FEVAL("rtwprivate","rtw_get_tfl_dwork_headers",LibGetModelName())
%break
%endif
%endforeach
%if ISEMPTY(hdrIncludes)
%return
%endif
%<SetCurrentUtilsIncludesIdx("mdl_types_util_incl")>
%foreach h = SIZE(hdrIncludes,1)
// CRL headers are not Simulink generated utilities, set isGeneratedUtility=false
%<FcnTrackHeaderFileUsage(hdrIncludes[h], TLC_FALSE, TLC_FALSE)>
%endforeach
%<SetCurrentUtilsIncludesIdx("")>
%endfunction
%endif