%if EXISTS("_DATAGROUPLIB_") == 0
%assign _DATAGROUPLIB_ = 1
%function SLibIsCoderGroupUseAccessFcnForDataRecord(record) void
%if SLibDataRecordIsInCoderGroup(record) && ...
ISFIELD(record,"UseAccessFunctions") && record.UseAccessFunctions == 1
%return TLC_TRUE
%endif
%return TLC_FALSE
%endfunction
%function SLibVargroupElementAutoDataInitConversion(recType) void
%if recType == "P"
%return "Static"
%else
%return "Dynamic"
%endif
%endfunction
%function SLibCoderDataGroupAutoDataInitConversion(group) void
%assert(group.DataInit == "Auto")
%assign autoDataInit = "Auto"
%if group.GroupContains == "ParameterElementOnly" || group.GroupContains == "ParameterAndSignalElement"
%assign autoDataInit = "Static"
%elseif group.GroupContains == "SignalElementOnly"
%assign autoDataInit = "Dynamic"
%endif
%return autoDataInit
%endfunction
%function LibCoderDataGroupStructIsEmpty(group) void
%assign baseSysIdx = GetBaseSystemIdx()
%assign fieldName = "HasCoderDataGroup" + group.Name + "Arg"
%if SLibIsSynthesizedRTM(group)
%return !IsModelRefScalableBuild() ? ::CompiledModel.EmptyRealTimeObject : TLC_TRUE
%elseif group.AsStructure == "None"
%return TLC_TRUE
%endif
%assert (ISFIELD(::CompiledModel.System[baseSysIdx], fieldName))
%return (::CompiledModel.System[baseSysIdx].%<fieldName> == 0)
%endfunction
%function FcnGetCoderGroupForVarGroup(varGroup) void
%assert varGroup.Category == "HierarchicalCoderData"
%return ::CompiledModel.CoderDataGroup[varGroup.CoderDataGroupIndex]
%endfunction
%function SLibHaveRootDataGroupVarGroup(group) void
%assign rootSystemIndex = GetBaseSystemIdx()
%foreach varGroupIndex = ::CompiledModel.VarGroups.NumVarGroups
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIndex]
%if varGroup.NumVarGroupElements <= 0
%continue
%endif
%if (varGroup.SysIdx == rootSystemIndex) && ...
(LibGetVarGroupCategory(varGroupIndex) == "HierarchicalCoderData")
%assign coderGroupIndex = varGroup.CoderDataGroupIndex
%assign coderGroup = ::CompiledModel.CoderDataGroup[coderGroupIndex]
%if coderGroup.Name == group.Name
%return TLC_TRUE
%endif
%endif
%endforeach
%return TLC_FALSE
%endfunction
%function LibCoderDataGroupStructsAreEmpty() void
%foreach idx = ::CompiledModel.NumCoderDataGroups
%if !LibCoderDataGroupStructIsEmpty(::CompiledModel.CoderDataGroup[idx])
%return TLC_FALSE
%endif
%endforeach
%return TLC_TRUE
%endfunction
%function SLibCoderDataGroupIndex(groupName) void
%foreach idx = ::CompiledModel.NumCoderDataGroups
%assign group = ::CompiledModel.CoderDataGroup[idx]
%if group.Name == groupName
%return group.GroupIndex
%endif
%endforeach
%return -1
%endfunction
%function SLibPolymorphicRootCoderDataGroupIndex(groupName) void
%foreach idx = ::CompiledModel.NumCoderDataGroups
%assign group = ::CompiledModel.CoderDataGroup[idx]
%if group.Name == groupName
%assign isModelSingleInstance = !SLibMultiInstance()
%if isModelSingleInstance && ...
group.IsPolymorphic && ...
group.ImplementationType == "MultiInstance"
%return SLibGetSingleInstanceGroupIdx(group)
%else
%return group.GroupIndex
%endif
%endif
%endforeach
%return -1
%endfunction
%function RTMModelPtrsToCoderDataGroupIsReqFcn(groupIndex) void
%assign group = ::CompiledModel.CoderDataGroup[groupIndex]
%if LibCoderDataGroupStructIsEmpty(group) || SLibGetUseRTMcgType()
%return TLC_FALSE
%endif
%if SLibMultiInstance() && ...
!GenerateClassInterface && ...
!SLibUseBackwardCompatibleReusableInterface()
%return TLC_TRUE
%endif
%return RTMModelPtrsToInstanceDataIsReqFcn()
%endfunction
%function FcnGetChildDataGroup(group, sid) void
%foreach idx = SIZE(::CompiledModel.CoderDataGroups.CoderDataGroup, 1)
%assign coderDataGroup = ::CompiledModel.CoderDataGroups.CoderDataGroup[idx]
%if (coderDataGroup.UserProvidedName == group.UserProvidedName) && ...
coderDataGroup.Depth == 1 && ...
ISFIELD(coderDataGroup, "CompiledModelBlockIndex") && ...
(coderDataGroup.CompiledModelBlockIndex == sid)
%return coderDataGroup
%endif
%endforeach
%assert group.IsSelf
%foreach idx = SIZE(::CompiledModel.CoderDataGroups.CoderDataGroup, 1)
%if coderDataGroup.IsSelf && ...
coderDataGroup.Depth == 1 && ...
ISFIELD(coderDataGroup, "CompiledModelBlockIndex") && ...
(coderDataGroup.CompiledModelBlockIndex == sid)
%return coderDataGroup
%endif
%endforeach
%<LibReportFatalError("Should not get here")>
%endfunction
%function SLibIsSelfVarGroup(aVarGroup) void
%return ISFIELD(aVarGroup, "IsModelSelfCoderGroupVarGroup") && ...
aVarGroup.IsModelSelfCoderGroupVarGroup
%endfunction
%function SLibIsSelfCoderGroupVarGroup(varGroupIdx) void
%assign aVarGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIdx]
%if !ISFIELD(aVarGroup, "CoderDataGroupIndex")
%return TLC_FALSE
%else
%assign groupIdx = aVarGroup.CoderDataGroupIndex
%return (groupIdx > -1) && (groupIdx == SLibGetSelfCoderDataGroupIndex())
%endif
%endfunction
%function SLibIsSelfCoderGroup(sysIdx, coderGroupIdx) void
%return GetBaseSystemIdx() == sysIdx && ...
SLibGetDoesSelfHasCoderDataGroup() && ...
SLibGetSelfCoderDataGroupIndex() == coderGroupIdx
%endfunction
%function SLibIsAutosarPIMCoderGroup(coderGroup) void
%return ISFIELD(coderGroup, "SynthesizedNamePrefix") && ...
!ISEMPTY(coderGroup.SynthesizedNamePrefix) && ...
(coderGroup.SynthesizedNamePrefix == "_PIM")
%endfunction
%function SLibIsAutosarStaticMemoryCoderGroup(coderGroup) void
%return ISFIELD(coderGroup, "SynthesizedNamePrefix") && ...
!ISEMPTY(coderGroup.SynthesizedNamePrefix) && ...
(coderGroup.SynthesizedNamePrefix == "_VAR")
%endfunction
%function SLibIsAutosarInstPCoderGroup(coderGroup) void
%return ISFIELD(coderGroup, "SynthesizedNamePrefix") && ...
!ISEMPTY(coderGroup.SynthesizedNamePrefix) && ...
(coderGroup.SynthesizedNamePrefix == "_ARPIP")
%endfunction
%function SLibGetVarGroupIdxForCoderGroup(sysIdx, coderDataGroupIdx) void
%assign group = ::CompiledModel.CoderDataGroup[coderDataGroupIdx]
%assign groupName = group.Name
%assign groupToken = "CoderDataGroup" + groupName
%return FcnSysVarGroupIndex(System[sysIdx], groupToken, 0)
%endfunction
%function SLibGetRTMPointerVariableNameInsideSelfStructure() void
%if SLibIsSelfUserDefinedAndStructured()
%return (::CompiledModel.Name + "_" + "rtm" + "_" + "ref")
%endif
%return ""
%endfunction
%function SLibCanInlineRTMIntoSelf() void
%return SLibGetDoesSelfHasCoderDataGroup() && SLibIsSelfStructured() && ...
!SLibHasSelfWithConstantMemorySection() && !GenerateClassInterface
%endfunction
%function FcnGetVargroupInitializer(varGroupIndex, path, dynamicInit, symbolic) void
%createrecord initializer {}
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIndex]
%assign cgTypeIdx = varGroup.CGTypeIdx
%foreach elemIdx = varGroup.NumVarGroupElements
%assign element = varGroup.VarGroupElements[elemIdx]
%assign idnum = IDNUM(element)
%assign recType = idnum[0]
%assign recIdx = idnum[1]
%switch recType
%case "LDW"
%case "W"
%case "U"
%case "Y"
%case "B"
%case "ZE"
%case "L"
%assign dataRec = SLibGetDataRecForVarGroupMember(recType, recIdx)
%assign cgTypeIdx = LibGetRecordCGTypeIdx(dataRec)
%if SLibEmitRecordInCoderDataGroupStruct(cgTypeIdx)
%assign value = FcnGetDynamicDataInitFromCGType(cgTypeIdx)
%addtorecord initializer Elements { Element value }
%endif
%break
%case "P"
%assign prm = ::CompiledModel.ModelParameters.Parameter[recIdx]
%if SLibIsParamUnstructured(prm)
%assert 0
%continue
%endif
%if (SLibGetWidthOfValueFromParamRec(prm) > 0) && !SLibOmitRecord(prm)
%if symbolic && (prm.TestpointIndex >= 0)
%addtorecord initializer Elements { Element "TP%<prm.TestpointIndex>" }
%assign group = FcnGetCoderGroupForVarGroup(::CompiledModel.VarGroups.VarGroup[varGroupIndex])
%if SLibAccessViaPointerInSelf(group)
%assign separator = "->"
%else
%assign separator = "."
%endif
%assign dynamicPath = path + separator + LibGetRecordIdentifier(prm)
%addtorecord dynamicInit TP%<prm.TestpointIndex> dynamicPath
%else
%openfile value
%<SLibGetFormattedPrmValue(prm, "")>
%closefile value
%addtorecord initializer Elements { Element value }
%endif
%endif
%break
%case "PD"
%addtorecord initializer Elements { Element element }
%break
%case "VG"
%assign fieldName = LibCGTypeMemberName(cgTypeIdx, elemIdx)
%assign deeperpath = path + "." + fieldName
%addtorecord initializer Elements { Element FcnGetVargroupInitializer(recIdx, deeperpath, dynamicInit, symbolic) }
%break
%case "RTM"
%assign elemCGTypeIdx = LibCGTypeMemberCGTypeIdx(cgTypeIdx, recIdx)
%assign value = FcnGetDynamicDataInitFromCGType(elemCGTypeIdx)
%addtorecord initializer Elements { Element value }
%break
%case "PCDG"
%assign group = FcnGetCoderGroupForVarGroup(varGroup)
%assign childDataGroup = FcnGetChildDataGroup(group, recIdx)
%assert childDataGroup.AsStructure == "InParent"
%addtorecord initializer Elements { Element childDataGroup.Initializer }
%break
%case "RCDG"
%if symbolic
%addtorecord initializer Elements { Element element }
%else
%assign group = ::CompiledModel.CoderDataGroup[recIdx]
%openfile value
&(%<SLibCoderDataGroupInstance(group)>)
%closefile value
%addtorecord initializer Elements { Element value }
%endif
%break
%case "RVG"
%openfile value
%<SLibGetNullDefinitionFromTfl()>
%closefile value
%addtorecord initializer Elements { Element value }
%break
%default
%<LibReportFatalError("Unhandled vargroup initialization")>
%break
%endswitch
%endforeach
%return initializer
%endfunction
%function FcnGetDataGroupInitializer(group, path, dynamicInit) void
%if SLibDataGroupStaticInit(group) || group.ContainsInstanceSpecificParameter
%assign baseSystem = ::CompiledModel.System[GetBaseSystemIdx()]
%assign varGroupIndex = FcnSysVarGroupIndex(baseSystem, "CoderDataGroup" + group.Name, 0)
%if varGroupIndex != -1
%return FcnGetVargroupInitializer(varGroupIndex, path, dynamicInit, ...
(group.IsInstanceSpecific || group.ContainsInstanceSpecificParameter) && ...
IsModelReferenceTarget())
%else
%return ""
%endif
%else
%return ""
%endif
%endfunction
%function SLibHasSelfWithConstantMemorySection() void
%assign selfCoderGroupIndex = SLibGetSelfCoderDataGroupIndex()
%if selfCoderGroupIndex == -1
%return TLC_FALSE
%else
%assign selfCoderGroup = ::CompiledModel.CoderDataGroup[selfCoderGroupIndex]
%return SLibDataGroupMemorySectionConst(selfCoderGroup)
%endif
%endfunction
%function SLibHasSelfWithStaticInit() void
%assign selfCoderGroupIndex = SLibGetSelfCoderDataGroupIndex()
%if selfCoderGroupIndex == -1
%return TLC_FALSE
%else
%assign selfCoderGroup = ::CompiledModel.CoderDataGroup[selfCoderGroupIndex]
%return SLibDataGroupStaticInit(selfCoderGroup)
%endif
%endfunction
%function SLibRootCoderGroupVarGroupIdx(group) void
%assign rootSystemIndex = GetBaseSystemIdx()
%foreach varGroupIndex = ::CompiledModel.VarGroups.NumVarGroups
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIndex]
%if (varGroup.SysIdx == rootSystemIndex) && ...
(LibGetVarGroupCategory(varGroupIndex) == "HierarchicalCoderData")
%assign coderGroupIndex = varGroup.CoderDataGroupIndex
%assign coderGroup = ::CompiledModel.CoderDataGroup[coderGroupIndex]
%if coderGroup.Name == group.Name
%return varGroupIndex
%endif
%endif
%endforeach
%return -1
%endfunction
%function SLibGetRootVarGroupIdxForCoderGroup(aGroup) void
%assign baseSystem = ::CompiledModel.System[GetBaseSystemIdx()]
%assign varGroupIdx = ...
FcnSysVarGroupIndex(baseSystem, "CoderDataGroup" + aGroup.Name, 0)
%assert SLibRootCoderGroupVarGroupIdx(aGroup) == varGroupIdx
%return varGroupIdx
%endfunction
%function SLibVarGroupForCoderGroup(aGroup) void
%assign varGroupIdx = SLibGetRootVarGroupIdxForCoderGroup(aGroup)
%if 0 > varGroupIdx
%return []
%endif
%return ::CompiledModel.VarGroups.VarGroup[varGroupIdx]
%endfunction
%function SLibCoderGroupPackageAsStruct(aGroup) void
%assign rootVarGroupIdx = SLibGetRootVarGroupIdxForCoderGroup(aGroup)
%if -1 < rootVarGroupIdx
%return SLibVarGroupIsStruct(rootVarGroupIdx)
%endif
%return TLC_TRUE
%endfunction
%function SLibCoderDataGroupNumElements(aGroup) void
%assign rootVarGroupIdx = SLibGetRootVarGroupIdxForCoderGroup(aGroup)
%if -1 < rootVarGroupIdx
%if !SLibVarGroupIsStruct(rootVarGroupIdx)
%return SLibVarGroupNumElements(rootVarGroupIdx)
%elseif SLibVarGroupNumElements(rootVarGroupIdx) > 0 ...
&& !LibCoderDataGroupStructIsEmpty(aGroup)
%return 1
%endif
%endif
%return 0
%endfunction
%function SLibCrossSystemIdxElement(aGroup, idx) void
%assign rootVarGroupIdx = SLibGetRootVarGroupIdxForCoderGroup(aGroup)
%assign retVal = -1
%if -1 < rootVarGroupIdx
%assign rootVarGroup = ::CompiledModel.VarGroups.VarGroup[rootVarGroupIdx]
%assign member = rootVarGroup.VarGroupElements[idx]
%assign idnum = IDNUM(member)
%switch idnum[0]
%case "VG"
%assign childVG = ::CompiledModel.VarGroups.VarGroup[idnum[1]]
%assign retVal = childVG.SysIdx
%break
%endswitch
%endif
%return retVal
%endfunction
%function SLibCrossCoderDataGroupElement(aGroup, idx) void
%assign rootVarGroupIdx = SLibGetRootVarGroupIdxForCoderGroup(aGroup)
%assign retVal = []
%if -1 < rootVarGroupIdx
%assign rootVarGroup = ::CompiledModel.VarGroups.VarGroup[rootVarGroupIdx]
%assign member = rootVarGroup.VarGroupElements[idx]
%assign idnum = IDNUM(member)
%switch idnum[0]
%case "VG"
%assign childVG = ::CompiledModel.VarGroups.VarGroup[idnum[1]]
%assign childCDGIdx = ISFIELD(childVG, "CoderDataGroupIndex") ? childVG.CoderDataGroupIndex : -1
%assign retVal = childCDGIdx > -1 ? ::CompiledModel.CoderDataGroup[childCDGIdx] : []
%break
%case "PCDG"
%assign retVal = FcnGetChildDataGroup(aGroup, idnum[1])
%break
%case "RCDG"
%assign retVal = ::CompiledModel.CoderDataGroup[idnum[1]]
%break
%endswitch
%endif
%return retVal
%endfunction
%function SLibCoderDataGroupElementInstance(aGroup, idx) void
%assign rootVarGroupIdx = SLibGetRootVarGroupIdxForCoderGroup(aGroup)
%if -1 < rootVarGroupIdx
%if !SLibVarGroupIsStruct(rootVarGroupIdx)
%assign instance = SLibVarGroupElementName(rootVarGroupIdx, idx)
%assign cgTypeIdx = SLibVarGroupElementType(rootVarGroupIdx, idx)
%return instance + LibCGTypeSymbolicVectorDims(cgTypeIdx)
%endif
%endif
%if IsModelRefScalableBuild() && !GenerateClassInterface
%assign baseSystem = ::CompiledModel.System[GetBaseSystemIdx()]
%return FcnSysVarGroupNonreusedName(baseSystem, "CoderDataGroup" + aGroup.Name)
%else
%return SLibCoderDataGroupInstance(aGroup)
%endif
%endfunction
%function SLibCoderDataGroupElementBaseType(aGroup, idx) void
%assign rootVarGroupIdx = SLibGetRootVarGroupIdxForCoderGroup(aGroup)
%if -1 < rootVarGroupIdx
%if !SLibVarGroupIsStruct(rootVarGroupIdx)
%assign cgTypeIdx = SLibVarGroupElementType(rootVarGroupIdx, idx)
%assign baseType = SLibGetTypeNameFromCGType(cgTypeIdx)
%if SLibVarGroupElementIsVolatile(rootVarGroupIdx, idx)
%assign baseType = "volatile " + baseType
%endif
%return baseType
%endif
%endif
%return SLibCoderDataGroupType(aGroup)
%endfunction
%function SLibCoderDataGroupElementInit(aGroup, instanceInit, idx) void
%assign rootVarGroupIdx = SLibGetRootVarGroupIdxForCoderGroup(aGroup)
%if TYPE(instanceInit) == "Vector"
%return instanceInit[idx]
%endif
%openfile init
{
%<instanceInit>
}/
%closefile init
%return init
%endfunction
%function SLibCoderDataGroupElementDataRecord(aGroup, aElementIdx) void
%assign rootVarGroupIdx = SLibGetRootVarGroupIdxForCoderGroup(aGroup)
%if -1 < rootVarGroupIdx
%assert aElementIdx >= 0 && aElementIdx < SLibVarGroupNumElements(rootVarGroupIdx)
%assign source = SLibVarGroupElementSource(rootVarGroupIdx,aElementIdx)
%assign idnum = IDNUM(source)
%assign recType = idnum[0]
%assign recIdx = idnum[1]
%assign dataRec = SLibGetDataRecForVarGroupMember(recType, recIdx)
%return dataRec
%endif
%endfunction
%function SLibCoderDataGroupType(group) void
%if group.IsSelf && SLibCanInlineRTMIntoSelf()
%return tSimStructType
%elseif IsModelReferenceTarget()
%assign baseSystem = ::CompiledModel.System[GetBaseSystemIdx()]
%assign groupToken = "CoderDataGroup" + group.Name
%return FcnSysVarGroupType(baseSystem, groupToken)
%else
%assign token = "::tCoderDataGroup" + group.Name + "Type"
%return %<token>
%endif
%endfunction
%function FcnApplyMemSecToDataDefnForGroup(definition, group, identifier, system, isModelData, isDecl, isFirstElement, isLastElement) void
%if IsModelReferenceSimTarget() && group.AsStructure == "None"
%return ""
%endif
%if (group.AsStructure == "InParent") && ISFIELD(group, "Depth")
%assign group = ::CompiledModel.CoderDataGroup[SLibCoderDataGroupIndex(group.Name)]
%endif
%assign msName = group.MemorySection
%assign applyMemSec = FcnApplyMemSec()
%openfile buffer
%if !isModelData
%<SLibIfSystemVariantCondition(system)>/
%endif
%if applyMemSec
%assign pragmaPerVar = 1
%assign prePragma = ""
%assign postPragma = ""
%assign comment = ""
%assign msInfo = []
%if !ISEMPTY(msName)
%if group.MemorySectionIsLegacy
%assign msDefn = SLibGetInternalLegacyMemorySectionDefForCoderGroup(group)
%assign pragmaPerVar = ISFIELD(msDefn, "PragmaPerVar") && msDefn.PragmaPerVar
%assign prePragma = msDefn.PrePragma
%assign postPragma = msDefn.PostPragma
%assign comment = msDefn.Comment
%else
%assign pragmaPerVar = CGMODEL_ACCESS("MemorySection.PragmaPerVar", msName)
%assign prePragma = FcnHandleNewLineForMemSec(CGMODEL_ACCESS("MemorySection.PrePragma", msName))
%assign postPragma = FcnHandleNewLineForMemSec(CGMODEL_ACCESS("MemorySection.PostPragma", msName))
%assign comment = FcnHandleNewLineForMemSec(CGMODEL_ACCESS("MemorySection.Comment", msName))
%endif
%endif
%createrecord qualifierInfo { /
IsConst group.IsMemorySectionConst /
IsVolatile group.IsMemorySectionVolatile /
Qualifier group.MemorySectionQualifier /
}
%if ISEMPTY(msInfo)
%createrecord msInfo { /
PragmaPerVar pragmaPerVar /
PrePragma prePragma /
PostPragma postPragma /
Comment comment /
}
%endif
%<SLibCreateDefinitionStatement(definition, msInfo, qualifierInfo, ...
identifier, TLC_TRUE, isDecl, isFirstElement, isLastElement)>
%elseif isDecl
extern %<definition>
%else
%<definition>
%endif
%if !isModelData
%<SLibEndIfSystemVariantCondition(system)>/
%endif
%closefile buffer
%return buffer
%endfunction
%function SLibApplyMemSecToDataDefnForGroup(definition, group, identifier, system, isModelData) void
%return FcnApplyMemSecToDataDefnForGroup(definition, group, identifier, system, isModelData, TLC_FALSE, TLC_TRUE, TLC_TRUE)
%endfunction
%function SLibApplyMemSecToDataDeclForGroup(definition, group, identifier, system, isModelData) void
%return FcnApplyMemSecToDataDefnForGroup(definition, group, identifier, system, isModelData, TLC_TRUE, TLC_TRUE, TLC_TRUE)
%endfunction
%function SLibTypeQualifierForGroup(group) void
%assign applyMemSec = FcnApplyMemSec()
%if applyMemSec
%return SLibGetQualifierString(group.MemorySectionQualifier, ...
group.IsMemorySectionConst, group.IsMemorySectionVolatile)
%endif
%endfunction
%function SLibCoderDataGroupIsImported(group) void
%return group.DataScope == "Imported"
%endfunction
%function SLibStructTypeDefScopeIsImported(group) void
%return group.StructTypeDefScope == "Imported"
%endfunction
%function SLibCoderDataGroupIsOpaque(group) void
%return group.IsOpaque
%endfunction
%function SLibCoderDataGroupIsImportedFromFile(group) void
%if group.IsLegacyStorageClass
%return TLC_TRUE
%endif
%if !SLibCoderDataGroupIsImported(group)
%return TLC_FALSE
%endif
%assign baseSystem = ::CompiledModel.System[GetBaseSystemIdx()]
%assign varGroupIndex = FcnSysVarGroupIndex(baseSystem, "CoderDataGroup" + group.Name, 0)
%assign modelNameHeader = ::CompiledModel.Name+".h"
%assert varGroupIndex != -1
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIndex]
%assign headerFile = varGroup.CoderDataGroupHeaderFile
%if headerFile == modelNameHeader
%return TLC_FALSE
%else
%return TLC_TRUE
%endif
%endfunction
%function SLibCoderDataGroupInstance(group) void
%assign baseSystem = ::CompiledModel.System[GetBaseSystemIdx()]
%assign varGroupIndex = FcnSysVarGroupIndex(baseSystem, "CoderDataGroup" + group.Name, 0)
%if varGroupIndex != -1 && group.IsSelf != 1
%return ::CompiledModel.VarGroups.VarGroup[varGroupIndex].StructureInstanceName
%else
%assign token = "::tCoderDataGroup" + group.Name
%return %<token>
%endif
%endfunction
%function SLibCoderDataGroupReference(group) void
%assign baseSystem = ::CompiledModel.System[GetBaseSystemIdx()]
%assign varGroupIndex = FcnSysVarGroupIndex(baseSystem, "CoderDataGroup" + group.Name, 0)
%if varGroupIndex != -1 && group.IsSelf != 1
%return ::CompiledModel.VarGroups.VarGroup[varGroupIndex].StructureReferenceName
%else
%assign token = "::tCoderDataGroup" + group.Name
%return %<token>
%endif
%endfunction
%function SLibCoderDataGroupRTMFieldName(group) void
%if ::CompiledModel.SuppressSelf
%return ""
%endif
%if SLibGetDoesSelfHasCoderDataGroup()
%if SLibAccessViaPointerInSelf(group)
%assign eleNameOrIndex = "RCDG" + STRING(group.GroupIndex)
%elseif group.AsStructure == "InSelf"
%assign eleNameOrIndex = "VG" + STRING(SLibRootCoderGroupVarGroupIdx(group))
%else
%return ""
%endif
%assign selfVarGroupIdx = SLibGetSelfVarGroupIndex()
%assign elIdx = SLibGetElementIdxFromVarGroup(selfVarGroupIdx, eleNameOrIndex)
%if -1 == elIdx
%return "CoderGroup" + group.Name
%else
%return SLibVarGroupElementName(selfVarGroupIdx, elIdx)
%endif
%else
%assign rootVarGroupIndex = SLibGetRootVarGroupIdxForCoderGroup(group)
%if rootVarGroupIndex > -1
%assign rootVarGroup = ::CompiledModel.VarGroups.VarGroup[rootVarGroupIndex]
%assert ISFIELD(rootVarGroup, "StructureReferenceName")
%return rootVarGroup.StructureReferenceName
%else
%return "CoderGroup" + group.Name
%endif
%endif
%endfunction
%function SLibDataRecordIsInCoderGroup(dataRec) void
%assign coderGroupId = SLibGetCoderGroupIdForDataRecord(dataRec)
%return coderGroupId != -1 ? TLC_TRUE : TLC_FALSE
%endfunction
%function SLibIsCoderGroupVarGroup(varGroup) void
%return ISFIELD(varGroup, "Category") && varGroup.Category == "HierarchicalCoderData"
%endfunction
%function SLibGetCoderGroupIdForDataRecord(dataRec) void
%if( ISFIELD(dataRec,"VarGroupIdx") )
%assign varGroupIdx = dataRec.VarGroupIdx[0]
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIdx]
%if LibGetVarGroupCategory(varGroupIdx) == "HierarchicalCoderData"
%assert ISFIELD(varGroup, "CoderDataGroupIndex")
%return varGroup.CoderDataGroupIndex
%endif
%endif
%return -1
%endfunction
%function SLibIsLegacyStorageClassForDataRecord(dataRec) void
%if( ISFIELD(dataRec,"VarGroupIdx") )
%assign varGroupIdx = dataRec.VarGroupIdx[0]
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIdx]
%if varGroup.Category == "HierarchicalCoderData"
%assign group = FcnGetCoderGroupForVarGroup(varGroup)
%return group.IsLegacyStorageClass
%endif
%endif
%return TLC_FALSE
%endfunction
%function SLibGetCoderDataGroupStructForRecord(dataRec) void
%assert SLibDataRecordIsInCoderGroup(dataRec) == TLC_TRUE
%assign structName = ""
%if( ISFIELD(dataRec,"VarGroupIdx") )
%assign varGroupIdx = dataRec.VarGroupIdx[0]
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIdx]
%if (LibGetVarGroupCategory(varGroupIdx) == "HierarchicalCoderData" && (varGroup.PackageAsStruct != 0))
%assign structName = varGroup.Name
%endif
%endif
%return structName
%endfunction
%function SLibEmitRecordInCoderDataGroupStruct(CGTypeIdx) void
%assign emitRec = TLC_TRUE
%assign cgType = ::CompiledModel.CGTypes.CGType[CGTypeIdx]
%if(ISFIELD(cgType,"Name"))
%if cgType.Name == "fcn_call"
%assign emitRec = TLC_FALSE
%endif
%endif
%return emitRec
%endfunction
%function SLibAllocatesCoderDataGroup(group) void
%if group.ContainsInstanceSpecificParameter && IsModelReferenceTarget()
%return TLC_FALSE
%elseif (group.AsStructure == "InParent") && (group.IsInstanceSpecific == TLC_TRUE)
%return !SLibMultiInstance()
%elseif (group.AsStructure == "Standalone") && (group.IsInstanceSpecific == TLC_TRUE)
%return !SLibMultiInstance()
%else
%return TLC_TRUE
%endif
%endfunction
%function SLibAllocatesCoderDataGroups() void
%if IsModelReferenceTarget()
%return !::CompiledModel.OkToMultiInstanceModelref
%else
%return !MultiInstanceERTCode
%endif
%endfunction
%function FcnIsSingleInstanceAccessFunction(group) void
%return group.HasAccessMethod && !group.IsDataTransferGroup
%endfunction
%function SLibAccessGroupThroughSelf(group) void
%if FcnIsSingleInstanceAccessFunction(group)
%return TLC_FALSE
%endif
%return (SLibAccessViaPointerInSelf(group) || (group.AsStructure == "InSelf"))
%endfunction
%function SLibDataGroupDynamicInit(group) void
%assert !ISEMPTY(group)
%if group.DataInit == "Auto"
%return (SLibCoderDataGroupAutoDataInitConversion(group) == "Dynamic")
%else
%return (group.DataInit == "Dynamic")
%endif
%endfunction
%function SLibDataGroupStaticInit(group) void
%assert !ISEMPTY(group)
%if group.DataInit == "Auto"
%return (SLibCoderDataGroupAutoDataInitConversion(group) == "Static")
%else
%return (group.DataInit == "Static")
%endif
%endfunction
%function SLibDataGroupMemorySectionConst(group) void
%return group.IsMemorySectionConst
%endfunction
%function SLibSuppressRTMDeclaration() void
%assign varGroupIdx = SLibGetSelfCoderDataGroupVarGroupIndex()
%if -1 < varGroupIdx && !SLibSynthesizedRTM()
%return !SLibVarGroupIsStruct(varGroupIdx)
%endif
%return TLC_FALSE
%endfunction
%function SLibNeedGroupTypesForTesting()
%assign hasImportedGroups = TLC_FALSE
%foreach idx = ::CompiledModel.NumCoderDataGroups
%assign group = ::CompiledModel.CoderDataGroup[idx]
%if SLibCoderDataGroupIsImported(group)
%assign hasImportedGroups = TLC_TRUE
%break
%endif
%endforeach
%return hasImportedGroups && ::CompiledModel.GenerateImportedDataGroupsTypes
%endfunction
%function IsFieldAndTrue_loc(record,field) void
%return ISFIELD(record,field) && record.%<field> == TLC_TRUE
%endfunction
%function isDynamicDeclarationRequired_loc(prefix,instanceData) void
%if (instanceData.group.AsStructure == "None" && instanceData.elementDataInit == "Static") || ...
(instanceData.group.AsStructure != "None" && SLibDataGroupStaticInit(instanceData.group))
%return TLC_FALSE
%else
%assign isAllocatedInCppClass = instanceData.group.AsStructure == "InSelf" && GenerateClassInterface
%assign AllocateGroup = SLibAllocatesCoderDataGroup(instanceData.group) || isAllocatedInCppClass
%return AllocateGroup || (prefix == "static")
%endif
%endfunction
%function isStaticDeclarationRequired_loc(prefix,instanceData) void
%if (instanceData.group.AsStructure == "None" && instanceData.elementDataInit != "Static") || ...
(instanceData.group.AsStructure != "None" && !SLibDataGroupStaticInit(instanceData.group))
%return TLC_FALSE
%elseif (prefix == "extern") && instanceData.group.ContainsInstanceSpecificParameter
%return TLC_TRUE
%else
%assign isAllocatedInCppClass = instanceData.group.AsStructure == "InSelf" && GenerateClassInterface
%assign AllocateGroup = SLibAllocatesCoderDataGroup(instanceData.group) || isAllocatedInCppClass
%return AllocateGroup || (prefix == "static")
%endif
%endfunction
%function isImportExportGroupEmitted_loc(group,instanceFilter) void
%if SLibCoderDataGroupIsImportedFromFile(group)
%return IsFieldAndTrue_loc(instanceFilter,"Imported")
%else
%return IsFieldAndTrue_loc(instanceFilter,"Exported")
%endif
%endfunction
%function isStandaloneOrNoneAccessThroughSelfGroupEmitted(group,instanceFilter) void
%if SLibStandAloneSingleInstance(group) || group.AsStructure == "None"
%return IsFieldAndTrue_loc(instanceFilter,"AccessStandalone")
%else
%return IsFieldAndTrue_loc(instanceFilter,"AccessThroughSelf")
%endif
%endfunction
%function (instanceData) void
%assign rootVarGroupIdx = SLibGetRootVarGroupIdxForCoderGroup(instanceData.group)
%if (-1 < rootVarGroupIdx) && !SLibVarGroupIsStruct(rootVarGroupIdx)
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[rootVarGroupIdx]
%assign idnum = IDNUM(varGroup.VarGroupElements[instanceData.emittedVarIdx])
%assign recType = idnum[0]
%assign recIdx = idnum[1]
%return SLibGetCommentForVarGroupMember(recType, recIdx)
%endif
%endfunction
%function SLibEmitStaticInitCoderDataGroup(system,classQualifier,prefix,parentGroup,instanceData) void
%assign declaration = ""
%if isStaticDeclarationRequired_loc(prefix,instanceData)
%if prefix == "extern"
%assign prefix = ""
%assign init = ""
%else
%assign instanceInit = instanceData.group.AsStructure == "InSelf" ? instanceData.group.Initializer : parentGroup.Initializer
%if ISEMPTY(instanceInit)
%assign init = ""
%else
%assign init = " = " + SLibCoderDataGroupElementInit(instanceData.group, instanceInit, instanceData.emittedVarIdx)
%endif
%endif
%openfile declaration
%assign comment = ""
%assign comment = FcnCommentCoderGroupElement(instanceData)
%if !ISEMPTY(init)
%assign ptrDataInit = SLibGetBusPointerDataInitBuf()
%if !WHITE_SPACE(ptrDataInit)
%<ptrDataInit>
%endif
%endif
%if SLibAutosarCompilerAbstractionRequired()
%<prefix> %<SLibAutosarCompilerAbstractionForDataDecl(TLC_FALSE, instanceData.baseType, TLC_FALSE, TLC_FALSE, instanceData.identifier, "DataGlobal")>%<init>; %<comment>
%else
%assert !WHITE_SPACE(instanceData.baseType) && !WHITE_SPACE(instanceData.identifier)
%if CGMODEL_ACCESS("CGModel.getCustomDataTraceIsEnabled")
%<prefix> %<instanceData.baseType> %<classQualifier>%<instanceData.identifier>%<init>; %<comment> /
%else
%<prefix> %<instanceData.baseType> %<classQualifier>%<instanceData.identifier>%<init>; %<comment>
%endif
%endif
%closefile declaration
%endif
%return declaration
%endfunction
%function SLibEmitDynamicInitCoderDataGroup(system,classQualifier,prefix,parentGroup,instanceData) void
%assign declaration = ""
%if prefix == "extern"
%assign prefix = ""
%endif
%if isDynamicDeclarationRequired_loc(prefix,instanceData)
%openfile declaration
%if SLibAutosarCompilerAbstractionRequired()
%<prefix> %<SLibAutosarCompilerAbstractionForDataDecl(TLC_FALSE, instanceData.baseType, TLC_FALSE, TLC_FALSE, instanceData.identifier, "DataGlobal")>;
%else
%assert (!WHITE_SPACE(instanceData.baseType) && !WHITE_SPACE(instanceData.identifier))
%if CGMODEL_ACCESS("CGModel.getCustomDataTraceIsEnabled")
%<prefix> %<instanceData.baseType> %<classQualifier>%<instanceData.identifier>; /
%else
%<prefix> %<instanceData.baseType> %<classQualifier>%<instanceData.identifier>;
%endif
%endif
%closefile declaration
%endif
%return declaration
%endfunction
%function FcnSkipDeclareCoderDataGroupInstance_loc(system, groupIdx, varIdx) void
%assign group = ::CompiledModel.CoderDataGroup[groupIdx]
%assign baseType = SLibCoderDataGroupElementBaseType(group, varIdx)
%assign crossgroup = SLibCrossCoderDataGroupElement(group,varIdx)
%assert !ISEMPTY(group)
%if (baseType == "fcn_call") || ...
(ISFIELD(group, "IsSelf") && group.IsSelf ? ...
!ISEMPTY(crossgroup) && SLibCoderDataGroupNumElements(crossgroup) == 0 : ...
SLibCoderDataGroupNumElements(group) == 0)
%return TLC_TRUE
%endif
%if group.AsStructure == "None"
%assign varGroupIdx = SLibGetVarGroupIdxForCoderGroup(system.SystemIdx, groupIdx)
%assign varGroupElement = SLibVarGroupElementSource(varGroupIdx, varIdx)
%assign idnum = IDNUM(varGroupElement)
%assign recType = idnum[0]
%if recType != "VG"
%assign needDef = SLibNeedGenDataDefFromVarGroup(varGroupElement, system.SystemIdx)
%return TLC_FALSE == needDef[0] && WHITE_SPACE(needDef[2])
%endif
%endif
%return TLC_FALSE
%endfunction
%function (varGroup, system) void
%assign varGroupHeaderFile = SLibGetFileNameWithoutExtension(varGroup.CoderDataGroupHeaderFile)
%assign useDefaultFile = TLC_FALSE
%if ISEMPTY(varGroupHeaderFile)
%assign useDefaultFile = TLC_TRUE
%elseif (varGroupHeaderFile == system.SystemHeaderFileName) && ...
(!SLibIsCoderGroupVarGroup(varGroup) || ...
FcnGetCoderGroupForVarGroup(varGroup).IsSynthesized)
%assign useDefaultFile = TLC_TRUE
%endif
%if useDefaultFile
%assign varGroupHeaderFile = ""
%endif
%return varGroupHeaderFile
%endfunction
%function FcnVarGroupDefinitionFile(varGroup, system) void
%assign varGroupDefinitionFile = SLibGetFileNameWithoutExtension(varGroup.CoderDataGroupDefinitionFile)
%assign useDefaultFile = TLC_FALSE
%if ISEMPTY(varGroupDefinitionFile)
%assign useDefaultFile = TLC_TRUE
%elseif (varGroupDefinitionFile == system.SystemSourceFileName) && ...
(!SLibIsCoderGroupVarGroup(varGroup) || ...
FcnGetCoderGroupForVarGroup(varGroup).IsSynthesized)
%assign useDefaultFile = TLC_TRUE
%endif
%if useDefaultFile
%assign varGroupDefinitionFile = ""
%endif
%return varGroupDefinitionFile
%endfunction
%function FcnGetVariantConditonFromCoderDataGroupFromVarGroup(varGroup, varIdx)
%if varGroup.Category == "HierarchicalCoderData"
%if !EXISTS(varGroup.VarGroupElementIds)
%return ""
%endif
%assign varGroupElementIds = varGroup.VarGroupElementIds
%assign id = varGroup.VarGroupElementIds[varIdx]
%if EXISTS(::CompiledModel.CoderDataGroups) && ...
!ISEMPTY(::CompiledModel.CoderDataGroups)
%foreach idx = SIZE(::CompiledModel.CoderDataGroups.CoderDataGroup, 1)
%assign group = ::CompiledModel.CoderDataGroups.CoderDataGroup[idx]
%if group.GroupPath == id
%if EXISTS(group.NetVariantCondition)
%return group.NetVariantCondition
%endif
%endif
%endforeach
%endif
%endif
%return ""
%endfunction
%function SLibDeclareCoderDataGroupInstances_loc(system,prefix,emitFunctions,instanceFilter) void
%assign returnBuffer = ""
%assign externDecl = (prefix == "extern")
%foreach groupIdx = ::CompiledModel.NumCoderDataGroups
%assign group = ::CompiledModel.CoderDataGroup[groupIdx]
%assign numVars = SLibCoderDataGroupNumElements(group)
%if numVars == 0 || ...
(GenerateClassInterface && group.IsInstanceSpecific && WHITE_SPACE(prefix)) || ...
(GenerateClassInterface && !group.IsInstanceSpecific && externDecl) || ...
group.IsOpaque || ...
!isStandaloneOrNoneAccessThroughSelfGroupEmitted(group,instanceFilter) || ...
!isImportExportGroupEmitted_loc(group,instanceFilter) || ...
(SLibIsGroupSelfCoderGroup(group) && IsFieldAndTrue_loc(instanceFilter,"ModelData")) || ...
(group.AsStructure == "InSelf" && ...
(SLibIsSelfStructured() || !SLibGetUseRTMcgType() && !ISEMPTY(SLibCoderDataGroupRTMFieldName(group)) && !GenerateClassInterface ))
%continue
%endif
%assign varGroupIdx = SLibGetVarGroupIdxForCoderGroup(system.SystemIdx, groupIdx)
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIdx]
%assign isDefinition = prefix != "extern"
%assign varGroupHeaderFile = FcnVarGroupHeaderFile(varGroup, system)
%assign varGroupDefinitionFile = FcnVarGroupDefinitionFile(varGroup, system)
%assign emitComment = TLC_TRUE
%assign isFirstElement = TLC_TRUE
%assign lastElementIndex = 0
%foreach varIdx = numVars
%if !FcnSkipDeclareCoderDataGroupInstance_loc(system, groupIdx, varIdx)
%assign lastElementIndex = varIdx
%endif
%endforeach
%assign classQualifier = ""
%if GenerateClassInterface && !group.IsInstanceSpecific
%if !WHITE_SPACE(::NamespaceName)
%assign classQualifier = ::NamespaceName + "::"
%else
%assign classQualifier = ""
%endif
%assign classQualifier = classQualifier + ::CPPClassName + "::"
%endif
%assign emittedVarIdx = 0
%foreach varIdx = numVars
%assign declaration = ""
%assign declarationWithMemSection = ""
%assign crossgroup = SLibCrossCoderDataGroupElement(group,varIdx)
%if !ISEMPTY(crossgroup) && crossgroup.AsStructure == "InSelf" && ...
group.IsSelf && SLibGetDoesSelfHasCoderDataGroup()
%assert !SLibIsSelfStructured()
%continue
%endif
%assign elementDataInit = group.DataInit
%if elementDataInit == "Auto"
%assign memberElement = varGroup.VarGroupElements[varIdx]
%assign idnum = IDNUM(memberElement)
%assign recType = idnum[0]
%assign elementDataInit = SLibVargroupElementAutoDataInitConversion(recType)
%endif
%createrecord instanceData { /
emittedVarIdx emittedVarIdx /
identifier SLibCoderDataGroupElementInstance(group, varIdx) /
baseType SLibCoderDataGroupElementBaseType(group, varIdx) /
sysIdx SLibCrossSystemIdxElement(group, varIdx) /
group ISEMPTY(crossgroup)?group:crossgroup /
elementDataInit elementDataInit /
}
%addtorecord instanceData groupToken "CoderDataGroup"+instanceData.group.Name
%if FcnSkipDeclareCoderDataGroupInstance_loc(system, groupIdx, varIdx)
%continue
%endif
%assign dataRec = SLibCoderDataGroupElementDataRecord(group, varIdx)
%foreach fcnIdx = SIZE(emitFunctions,1)
%assign tmpBuf = %(system,classQualifier,prefix,group,instanceData)
%if !WHITE_SPACE(tmpBuf)
%if !ISEMPTY(dataRec) && CGMODEL_ACCESS("CGModel.getCustomDataTraceIsEnabled")
%assign tmpBuf = SLibAddBlockTraceForDeclarationFromDataRec(dataRec, tmpBuf)
%endif
%assign declaration = declaration + tmpBuf + "/n"
%endif
%endforeach
%if !WHITE_SPACE(declaration)
%openfile declarationWithMemSection
%<GetHideChildDefineSymbol("ifndef")>/
%assign treatAsModelData = !(SLibIsGroupSelfCoderGroup(group) && group.AsStructure == "None" && instanceData.sysIdx != GetBaseSystemIdx())
%assign varSys = instanceData.sysIdx > -1 ? ::CompiledModel.System[instanceData.sysIdx] : system
%<SLibAddPreStructDeclarePragma(instanceData.identifier)>/
%if IsModelReferenceSimTarget()
%<prefix> %<declaration>/
%else
%<FcnApplyMemSecToDataDefnForGroup(declaration,instanceData.group,instanceData.identifier, varSys, ...
treatAsModelData, externDecl,isFirstElement,(varIdx==lastElementIndex))>/
%endif
%<SLibAddPostStructDeclarePragma(instanceData.identifier)>/
%<GetHideChildDefineSymbol("endif")>/
%closefile declarationWithMemSection
%endif
%assign headerFile = varGroupHeaderFile
%assign definitionFile = varGroupDefinitionFile
%if group.AsStructure == "None"
%assign member = varGroup.VarGroupElements[varIdx]
%assign idnum = IDNUM(member)
%if idnum[0] == "VG"
%assign childVG = ::CompiledModel.VarGroups.VarGroup[idnum[1]]
%if SLibIsCoderGroupVarGroup(childVG)
%assign headerFile = FcnVarGroupHeaderFile(childVG, system)
%assign definitionFile = FcnVarGroupDefinitionFile(childVG, system)
%endif
%endif
%endif
%if MultiInstanceERTCode && !IsModelReferenceTarget() && SLibAccessGroupThroughSelf(group)
%assign headerFile = ""
%assign definitionFile = ""
%endif
%if !WHITE_SPACE(declarationWithMemSection)
%assign comment = (emitComment || !ISEMPTY(crossgroup)) ? "/* "+instanceData.group.Identification+" *//n" : ""
%assign emitComment = !ISEMPTY(crossgroup)
%assign emitToTestBuffer = IsFieldAndTrue_loc(instanceFilter,"EmitToTestBuffer")
%assign varElementVariantCond = FcnGetVariantConditonFromCoderDataGroupFromVarGroup(varGroup, varIdx)
%assign ppIf = SLibIfVariantConditionForm(varElementVariantCond)
%assign ppEndif = SLibEndIfVariantConditionForm(varElementVariantCond)
%if isDefinition && !ISEMPTY(definitionFile) && !emitToTestBuffer
%assign defFile = SLibAddModelFile("SystemBody", "Simulink", definitionFile)
%<SLibSetModelFileAttribute(defFile, "Definitions", comment + declarationWithMemSection)>
%<SLibSetModelFileAttribute(defFile, "Group", "data")>
%assign modelHeader = SLibGetFileNameForCode("mdl_hdr") + ".h"
%<FcnAddDependentHeaderForCoderGroup(defFile,modelHeader)>
%elseif !isDefinition && !ISEMPTY(headerFile) && group.DataScope != "Imported" && !emitToTestBuffer
%assign memberElement = varGroup.VarGroupElements[varIdx]
%assign traceMarker = SLibAddTrace2("ModelElemCategory", SLibGetModelElemCategory(memberElement), "StorageClass", instanceData.group.UserProvidedName)
%assign declarationWithMemSection = SLibTraceBegin(traceMarker) + declarationWithMemSection + SLibTraceEnd(traceMarker)
%assign declFile = SLibAddModelFile("SystemHeader", "Simulink", headerFile)
%<SLibSetModelFileAttribute(declFile, "Declarations", comment + declarationWithMemSection)>
%<SLibSetModelFileAttribute(declFile, "Group", "data")>
%else
%assign returnBuffer = returnBuffer + ppIf + "/n" + comment + declarationWithMemSection + "/n" + ppEndif
%endif
%endif
%assign isFirstElement = TLC_FALSE
%assign emittedVarIdx = emittedVarIdx + 1
%endforeach /% numVars %/
%endforeach /% ::CompiledModel.NumCoderDataGroups %/
%return returnBuffer
%endfunction /% SLibDeclareCoderDataGroupInstances_loc %/
%function SLibDeclareCoderDataGroupInstances(system,prefix,InstanceFilter) void
%assign idx = 0
%assign emitFunctions = ""
%assign comma = ""
%if IsFieldAndTrue_loc(InstanceFilter,"Static")
%assign emitFunctions = emitFunctions+comma+"/"SLibEmitStaticInitCoderDataGroup/""
%assign comma = ","
%endif
%if IsFieldAndTrue_loc(InstanceFilter,"Dynamic")
%assign emitFunctions = emitFunctions+comma+"/"SLibEmitDynamicInitCoderDataGroup/""
%assign comma = ","
%endif
%return SLibDeclareCoderDataGroupInstances_loc(system,prefix,[%<emitFunctions>],InstanceFilter)
%endfunction
%function SLibStandAloneMultiInstance(group) void
%return (group.AsStructure == "Standalone") && ...
group.IsInstanceSpecific && SLibMultiInstance()
%endfunction
%function SLibStandAloneSingleInstance(group) void
%return (group.AsStructure == "Standalone") && ...
(!group.IsInstanceSpecific || !SLibMultiInstance())
%endfunction
%function SLibAccessViaPointerInSelf(group) void
%return (group.AsStructure == "InParent") || SLibStandAloneMultiInstance(group)
%endfunction
%function SLibGetSingleInstanceGroupIdx(aGroup)
%if aGroup.ImplementationType == "SingleInstance"
%return aGroup.GroupIndex
%endif
%if aGroup.IsPolymorphic
%foreach idx = ::CompiledModel.NumCoderDataGroups
%assign group = ::CompiledModel.CoderDataGroup[idx]
%if group.UserProvidedName == aGroup.UserProvidedName && ...
group.ImplementationType == "SingleInstance"
%return idx
%endif
%endforeach
%endif
%return -1
%endfunction
%function FcnSetServiceDataGroupElements(groupToken, baseIdx, groupIdx) void
%assign varGroupIdx = FcnSysVarGroupIndex(::CompiledModel.System[baseIdx], groupToken, 0)
%assign aVarGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIdx]
%assign numElements = aVarGroup.NumVarGroupElements
%assign elemIdx = 0
%foreach eIdx = numElements
%assign varGroupElement = aVarGroup.VarGroupElements[eIdx]
%assign idnum = IDNUM(varGroupElement)
%assign recType = idnum[0]
%assign recIdx = idnum[1]
%if recType == "W"
%assign dataRec = SLibGetDataRecForVarGroupMember(recType, recIdx)
%if dataRec.Name == "CompMsgService" && dataRec.SigSrc[0] >= 0 && dataRec.SigSrc[2] >= 0
%assign ownerBlk = ...
::CompiledModel.System[dataRec.SigSrc[0]].Block[dataRec.SigSrc[2]]
%assign aSID = ownerBlk.SID
%assign blkName = ownerBlk.Name
%assign numDworks = ownerBlk.NumDWork
%foreach dIdx = numDworks
%assign thisDwork = ownerBlk.DWork[dIdx]
%if thisDwork.Name == "CompMsgService"
%assign name = thisDwork.Name
%assign dworkIdx = thisDwork.FirstRootIdx
%addtorecord ::CompiledModel.CoderDataGroups.CoderDataGroup[groupIdx] GroupElement { /
BlockName blkName; /
BlockSID aSID; /
DWorkName name; /
DWorkIdx dworkIdx /
}
%endif
%endforeach
%endif
%endif
%endforeach
%endfunction
%function SLibNonEmptyParamCoderGroupExists() void
%if ::CompiledModel.NumCoderDataGroups <= 0
%return TLC_FALSE
%endif
%foreach varGroupIndex = ::CompiledModel.VarGroups.NumVarGroups
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIndex]
%if varGroup.NumVarGroupElements <= 0
%continue
%endif
%if SLibIsCoderGroupVarGroup(varGroup)
%assign coderGroupIndex = varGroup.CoderDataGroupIndex
%assign coderGroup = ::CompiledModel.CoderDataGroup[coderGroupIndex]
%if SLibDataGroupStaticInit(coderGroup)
%return TLC_TRUE
%endif
%endif
%endforeach
%return TLC_FALSE
%endfunction
%function SLibInitializeUnstructuredGroup(aGroupIdx) void
%assign group = ::CompiledModel.CoderDataGroup[aGroupIdx]
%assign rootVarGroupIdx = SLibGetRootVarGroupIdxForCoderGroup(group)
%if rootVarGroupIdx < 0
%return ""
%endif
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[rootVarGroupIdx]
%assert !varGroup.PackageAsStruct
%assign skipGroup = ...
group.AsStructure != "None" || ...
group.DataInit == "Static" || ...
group.DataInit == "None" || ...
group.DataScope == "Imported"
%if skipGroup
%return ""
%endif
%openfile buff
%assert varGroup.NumVarGroupElements == SIZE(varGroup.VarGroupElements, 1)
%assert varGroup.NumVarGroupElements == SIZE(varGroup.VarGroupElementIds, 1)
%assert varGroup.NumVarGroupElements == SIZE(varGroup.VarGroupElementCGTypes, 1)
%foreach elIdx = varGroup.NumVarGroupElements
%assign element = SLibVarGroupElementSource(rootVarGroupIdx, elIdx)
%assign idnum = IDNUM(element)
%assign recType = idnum[0]
%assign recIdx = idnum[1]
%if recType == "PCDG" || recType == "RCDG" || recType == "VG" || SLibIsLocalVariableRecordType(rootVarGroupIdx, elIdx)
%continue
%endif
%if group.DataInit == "Auto" && SLibVargroupElementAutoDataInitConversion(recType) == "Static"
%continue
%endif
%assign dataRec = SLibGetDataRecForVarGroupMember(recType, recIdx)
%with dataRec
%if recType == "ZE" && !dataRec.NeedsEvent && !Accelerator
%continue
%endif
%if recType == "B" && FcnShouldSkipDataInitializationForConstant(dataRec, "Custom")
%continue
%endif
%if recType == "Y"
%assign sysIdx = dataRec.Block[0]
%assign blkIdx = dataRec.Block[1]
%assign outportBlock = System[sysIdx].Block[blkIdx]
%with outportBlock
%if SLibRemoveZeroInitForDataDefault(dataRec)
%continue
%endif
%endwith
%elseif SLibRemoveZeroInitForDataDefault(dataRec)
%continue
%endif
%assign cgTypeIdx = LibGetRecordCGTypeIdx(dataRec)
%if LibCGTypeIsUnknown(cgTypeIdx)
%continue
%endif
%assign slTypeIdx = LibGetDataTypeIdAliasedThruToFromId(LibGetRecordDataTypeId(dataRec))
%assign id = varGroup.VarGroupElementIds[elIdx]
%assign isComplex = LibGetRecordIsComplex(dataRec)
%assign width = LibGetRecordSymbolicWidth(dataRec)
%assign hasSymbolicWidth = LibRecordHasSymbolicWidth(dataRec)
%assign isScalar = (width == "1")
%assign isMultiWord = LibIsDataTypeMultiWordFixpt(slTypeIdx)
%assign sep = "."
%if (!isScalar || isMultiWord) && FcnMemsetToZeroInitSuffice(slTypeIdx)
%assign dtName = SLibGetRecordContainerBaseTypeName(dataRec)
%assign srcLoc = id
%if !isScalar
%assign srcLoc = id + "[0]"
%endif
%if hasSymbolicWidth
%assign memsetWidth = "%<width>"
%else
%assign memsetWidth = "%<width>U"
%endif
%if isScalar && !isComplex
%assign memsetWidthStr = "sizeof(%<dtName>)"
%elseif isScalar && isComplex
%assign memsetWidthStr = "2*sizeof(%<dtName>)"
%elseif !isScalar && !isComplex
%assign memsetWidthStr = "%<memsetWidth>*sizeof(%<dtName>)"
%else
%assign memsetWidthStr = "2*%<memsetWidth>*sizeof(%<dtName>)"
%endif
(void) %<LibGenMemFcnCall("memset", "&%<srcLoc>", "0", memsetWidthStr)>;
%else
%if LibCGTypeIsChar(cgTypeIdx)
%assign initVal = "'a'"
%assign isComplex = TLC_FALSE
%elseif isMultiWord
%assign initVal = SLibGetDtGroundName(slTypeIdx, isComplex, tRealPart)
%else
%assign initVal = SLibGetDefaultInitialValue(dataRec, tRealPart)
%endif
%assign dataRecNumDims = LibGetRecordNumDimsFromContainerCgTypeIdx(dataRec)
%assign idLhsAccess = LibGetAddressOfFirstElement(id, dataRecNumDims)
%if isScalar
%if isComplex
%<id>%<sep>%<tRealPart> = %<initVal>;
%<id>%<sep>%<tImagPart> = %<initVal>;
%else
% = %<initVal>;
%endif
%elseif %<width> >= RollThreshold
%assign loopCode = SLibEmitForLoopCounterCode(width, "i")
{
%
% {
%if isComplex
%<idLhsAccess>[i]%<sep>%<tRealPart> = %<initVal>;
%<idLhsAccess>[i]%<sep>%<tImagPart> = %<initVal>;
%else
%<idLhsAccess>[i] = %<initVal>;
%endif
}
}
%else
%foreach initIdx = %<width>
%if isComplex
%<idLhsAccess>[%<initIdx>]%<sep>%<tRealPart> = %<initVal>;
%<idLhsAccess>[%<initIdx>]%<sep>%<tImagPart> = %<initVal>;
%else
%<idLhsAccess>[%<initIdx>] = %<initVal>;
%endif
%endforeach
%endif
%endif
%endwith
%endforeach
%closefile buff
%if !ISEMPTY(buff) && !WHITE_SPACE(buff)
%openfile buffWithVariant
%assign comment = "/* Unstructured storage class initialization */"
%assign vcRecord = SLibGetDataInlineVariantNetConditions(dataRec)
%assign ifCond = vcRecord.ifCond
%assign ifEndCond = vcRecord.endIfCond
%<ifCond>
%<comment>
%<buff>
%<ifEndCond>
%closefile buffWithVariant
%assign buff = buffWithVariant
%endif
%return buff
%endfunction
%function SLibIsCoderGroupInVolatileMemory(aGroupIdx) void
%if (aGroupIdx >= 0)
%return ::CompiledModel.CoderDataGroup[aGroupIdx].IsMemorySectionVolatile
%endif
%return TLC_FALSE
%endfunction
%function SLibGetVarGroupStorageClass(varGroup) void
%assign groupIdx = ISFIELD(varGroup,"CoderDataGroupIndex") ? ...
varGroup.CoderDataGroupIndex : -1
%if groupIdx >= 0
%assign groupName = CoderDataGroup[groupIdx].UserProvidedName
%if CoderDataGroup[groupIdx].IsSynthesized == 1 && groupName == "_SharedDSM"
%assign groupName = "Default"
%endif
%return groupName
%else
%return "Default"
%endif
%endfunction
%endif