%if EXISTS("_IMPLICITITERSSUTIL_") == 0
%assign _IMPLICITITERSSUTIL_ = 1
%function SLibGetSubsystemIsForEachSS(sys)
%return ISFIELD(sys, "ForEachSubsystem") && ...
sys.ForEachSubsystem
%endfunction
%function SLibGetIsForEachSSReuseWithDiffNumIters(sys)
%return SLibGetSubsystemIsForEachSS(sys) &&...
ISFIELD(sys, "IISCodeReuseForDiffNumIters") && sys.IISCodeReuseForDiffNumIters
%endfunction
%function SLibSysVarGroupUsedAsMatrix(sys, type, idx)
%assign varGroupIdx = FcnSysVarGroupIndex(sys, type, idx)
%assign retStr = ""
%assign asMatrix = varGroupIdx >= 0
%if asMatrix
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIdx]
%assign asMatrix = LibCGTypeIsMatrix(varGroup.CGTypeIdx)
%endif
%return asMatrix
%endfunction
%function SLibSysVarGroupWidth(sys, type, idx)
%assign varGroupIdx = FcnSysVarGroupIndex(sys, type, idx)
%assign retStr = ""
%assign width = "1"
%if varGroupIdx >= 0
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIdx]
%if LibCGTypeIsMatrix(varGroup.CGTypeIdx)
%assign width = LibCGTypeSymbolicWidth(varGroup.CGTypeIdx)
%endif
%endif
%return width
%endfunction
%function SLibGetBaseTypeForVarGroupUsedAsMatrix(cgTypeIdx) void
%return LibCGTypeBaseIndex(cgTypeIdx)
%endfunction
%function SLibIsMatrixVarGroupForIIS(sysIdx, type)
%assign varGroupIdx = FcnSysVarGroupIndex(System[sysIdx], type, 0)
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIdx]
%return LibCGTypeIsMatrix(varGroup.CGTypeIdx) && ...
ISFIELD(System[sysIdx], "IndexingSigSrc")
%endfunction
%function SLibGetSystemIndexVar(cs, accessSysIdx) void
%assign cross = System[cs[0]].CrossNoArgFcnBound
%assign dwork = DWorks.DWork[IDNUM(System[cs[0]].IndexingSigSrc)[1]]
%if dwork.IsLocalScratchDWork == 1
%if dwork.VarGroupVarIdx > -1
%assign varGroupIdx = ...
::CompiledModel.VarGroups.VarGroupVarIdx[dwork.VarGroupVarIdx]
%return SLibCG_GetVarGroupElementPath(varGroupIdx, ...
SLibGetHStructWithLocalScopeSystemIdx(accessSysIdx), cross)
%else
%return LibGetRecordIdentifier(dwork)
%endif
%else
%assign varGroupIdx = FcnSysVarGroupIndex(System[cs[0]], "DWork", cs[1])
%assign dwPath = SLibCGIRVarGroupPath(varGroupIdx, accessSysIdx, cross)
%return dwPath + LibGetRecordIdentifier(dwork)
%endif
%endfunction
%function SLibGetIndexedArgForForEachSS(varGroupIdx, identiPath, indenti, cs, accessSysIdx, sysIdx)
%assign dwName = SLibGetSystemIndexVar(cs, accessSysIdx)
%if Accelerator
%if System[cs[0]].HasBlockRunInSimulinkForAccel
%assign fullpath = "&%<identiPath>%<indenti>[0]"
%else
%assign fullpath = "&%<identiPath>%<indenti>[%<dwName>+1]"
%endif
%else
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIdx]
%if LibCGTypeIsMatrix(varGroup.CGTypeIdx) && ...
System[cs[0]].RTWSystemCode == 2
%assign fullpath = "&%<identiPath>%<indenti>"
%else
%assign fullpath = "&%<identiPath>%<indenti>[%<dwName>]"
%endif
%endif
%return fullpath
%endfunction
%function SLibGetIndexedCGIRVarGroupPathForISSLoopBoundReuse(aVarGroupIdx, vName, sysIdx)
%assign varGroupIdx = aVarGroupIdx
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIdx]
%assign varGroupCategory = LibGetVarGroupCategory(varGroupIdx)
%if ISEQUAL(varGroupCategory, "DWork") || ...
ISEQUAL(varGroupCategory, "ContStates") || ...
ISEQUAL(varGroupCategory, "Parameter") || ...
ISEQUAL(varGroupCategory, "ContStatesDerivative") || ...
ISEQUAL(varGroupCategory, "ContStatesDisabled") || ...
ISEQUAL(varGroupCategory, "ContStatesAbsoluteTolerance") || ...
ISEQUAL(varGroupCategory, "ContStatesPerturbMin") || ...
ISEQUAL(varGroupCategory, "ContStatesPerturbMax") || ...
ISEQUAL(varGroupCategory, "BlockIO") || ...
ISEQUAL(varGroupCategory, "ZCEvent") || ...
ISEQUAL(varGroupCategory, "ZCSV") || ...
ISEQUAL(varGroupCategory, "HierarchicalCoderData")
%assign vgCGType = CGTypes.CGType[varGroup.CGTypeIdx]
%assert(ISFIELD(System[sysIdx], "IndexingSigSrc"))
%assign dw = DWorks.DWork[IDNUM(System[sysIdx].IndexingSigSrc)[1]]
%assert(dw.IsLocalScratchDWork == 1)
%if dw.VarGroupVarIdx > -1
%assign varGroupIdx = ...
::CompiledModel.VarGroups.VarGroupVarIdx[dw.VarGroupVarIdx]
%assert SLibGetHStructWithLocalScopeSystemIdx(sysIdx) == sysIdx
%assign dwName = SLibCG_GetVarGroupElementPath(varGroupIdx, ...
SLibGetHStructWithLocalScopeSystemIdx(sysIdx), ...
System[sysIdx].CrossNoArgFcnBound)
%else
%assign dwName = LibGetRecordIdentifier(dw)
%endif
%return vName + "[" + dwName + "]"
%endif
%endfunction
%function SLibGetIndexedCGIRVarGroupPathForISSNoLoopBoundReuse(varGroupIdx, vName, sysIdx, accSysIdx, cross)
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIdx]
%assign varGroupCategory = LibGetVarGroupCategory(varGroupIdx)
%if ISEQUAL(varGroupCategory, "DWork") || ...
ISEQUAL(varGroupCategory, "ContStates") || ...
ISEQUAL(varGroupCategory, "Parameter") || ...
ISEQUAL(varGroupCategory, "ContStatesDerivative") || ...
ISEQUAL(varGroupCategory, "ContStatesDisabled") || ...
ISEQUAL(varGroupCategory, "ContStatesAbsoluteTolerance") || ...
ISEQUAL(varGroupCategory, "ContStatesPerturbMin") || ...
ISEQUAL(varGroupCategory, "ContStatesPerturbMax") || ...
ISEQUAL(varGroupCategory, "BlockIO") || ...
ISEQUAL(varGroupCategory, "ZCEvent") || ...
ISEQUAL(varGroupCategory, "ZCSV") || ...
ISEQUAL(varGroupCategory, "HierarchicalCoderData")
%assign vgCGType = CGTypes.CGType[varGroup.CGTypeIdx]
%if ((::BlockFcn == "Registration" ||...
::BlockFcn == "Constructor" || ...
::BlockFcn == "Destructor")) && ...
((EXISTS("NeedForEachLoopInReg") && ...
::NeedForEachLoopInReg) || ...
(EXISTS("UseConstantForVarGroupIdx") && ...
::UseConstantForVarGroupIdx))
%if EXISTS("NeedForEachLoopInReg") && ...
::NeedForEachLoopInReg
%if (EXISTS("NeedLoopUnrolling") && ::NeedLoopUnrolling)
%if Accelerator
%assign varName = "%<::Counter4LoopUnrolling[::ForEachLoopHierarchyLevel - 1] + 1>"
%else
%assign varName = "%<::Counter4LoopUnrolling[::ForEachLoopHierarchyLevel - 1]>"
%endif
%else
%if Accelerator
%assign varName = "i_%<ForEachLoopHierarchyLevel>+1"
%else
%assign varName = "i_%<ForEachLoopHierarchyLevel>"
%endif
%endif
%assign ::ForEachLoopHierarchyLevel = ::ForEachLoopHierarchyLevel + 1
%if ::ForEachLoopHierarchyLevel > ::NumForEachLoopHierarchyLevel
%assign ::ForEachLoopHierarchyLevel = 1
%endif
%else
%if Accelerator
%assign varName = "%<::VarGroupIndexVector[::VarGroupIndexVectorIdx]>+1"
%else
%assign varName = %<::VarGroupIndexVector[::VarGroupIndexVectorIdx]>
%endif
%assign ::VarGroupIndexVectorIdx = ::VarGroupIndexVectorIdx - 1
%if ::VarGroupIndexVectorIdx < 0
%assign ::VarGroupIndexVectorIdx = ::VarGroupIndexVectorSize - 1
%endif
%endif
%return SLibCGIRVarGroupPath(varGroup.ParentVarGroupIdx, accSysIdx,cross) + ...
vName + "[%<varName>]."
%elseif ::BlockFcn == "Registration" || ::BlockFcn == "GlobalMap"
%if Accelerator && ...
!(ISEQUAL(varGroupCategory, "ContStates") || ...
ISEQUAL(varGroupCategory, "Parameter") || ...
ISEQUAL(varGroupCategory, "ContStatesDerivative") || ...
ISEQUAL(varGroupCategory, "ContStatesDisabled") || ...
ISEQUAL(varGroupCategory, "ContStatesAbsoluteTolerance") || ...
ISEQUAL(varGroupCategory, "ZCEvent") || ...
ISEQUAL(varGroupCategory, "ZCSV"))
%return SLibCGIRVarGroupPath(varGroup.ParentVarGroupIdx, accSysIdx,cross) + ...
vName + "[%]."
%else
%if ISEQUAL(varGroupCategory, "Parameter")
%return SLibCGIRVarGroupPath(varGroup.ParentVarGroupIdx, accSysIdx,cross) + ...
vName + "[0]."
%else
%return SLibCGIRVarGroupPath(varGroup.ParentVarGroupIdx, accSysIdx,cross) + ...
vName + "[%]."
%endif
%endif
%else
%assert (::GlobalGeneratingSubFunctions || ...
::BlockFcn == "Output" || ::BlockFcn == "OutputUpdate" || ...
::BlockFcn == "Update" || ::BlockFcn == "RootUpdate" || ...
::BlockFcn == "Initialize" || ::BlockFcn == "Start" || ...
::BlockFcn == "Enable" || ::BlockFcn == "Disable" || ...
::BlockFcn == "Derivative" || ::BlockFcn == "ZeroCrossing" || ...
::BlockFcn == "MassMatrix" || ::BlockFcn == "ForcingFunction" || ...
::BlockFcn == "Projection" || ::BlockFcn == "Terminate" || ...
::BlockFcn == "ModelInitialize" || ::BlockFcn == "SystemInitialize" || ...
::BlockFcn == "SystemReset")
%assign cs = System[sysIdx].CallSites[varGroup.InstanceIdx]
%if ISFIELD(System[cs[0]], "IndexingSigSrc")
%assign dwName = SLibGetSystemIndexVar(cs, accSysIdx)
%if Accelerator && ...
!(ISEQUAL(varGroupCategory, "ContStates") || ...
ISEQUAL(varGroupCategory, "Parameter") || ...
ISEQUAL(varGroupCategory, "ContStatesDerivative") || ...
ISEQUAL(varGroupCategory, "ContStatesDisabled") || ...
ISEQUAL(varGroupCategory, "ContStatesAbsoluteTolerance") || ...
ISEQUAL(varGroupCategory, "ZCEvent") || ...
ISEQUAL(varGroupCategory, "ZCSV"))
%if System[cs[0]].HasBlockRunInSimulinkForAccel
%return SLibCGIRVarGroupPath(varGroup.ParentVarGroupIdx, accSysIdx,cross) + ...
vName + "[0]."
%else
%return SLibCGIRVarGroupPath(varGroup.ParentVarGroupIdx, accSysIdx,cross) + ...
vName + "[%<dwName>+1]."
%endif
%else
%if EXISTS("PartialIndexing") && ...
::PartialIndexing && ...
cs[0] < ::PartialIdxBoundarySysystemIndex
%return SLibCGIRVarGroupPath(varGroup.ParentVarGroupIdx, accSysIdx,cross) + ...
vName + "[0]."
%else
%return SLibCGIRVarGroupPath(varGroup.ParentVarGroupIdx, accSysIdx,cross) + ...
vName + "[%<dwName>]."
%endif
%endif
%else
%if Accelerator && ...
!(ISEQUAL(varGroupCategory, "ContStates") || ...
ISEQUAL(varGroupCategory, "Parameter") || ...
ISEQUAL(varGroupCategory, "ContStatesDerivative") || ...
ISEQUAL(varGroupCategory, "ContStatesDisabled") || ...
ISEQUAL(varGroupCategory, "ContStatesAbsoluteTolerance") || ...
ISEQUAL(varGroupCategory, "ZCEvent") || ...
ISEQUAL(varGroupCategory, "ZCSV")) && ...
!System[cs[0]].HasBlockRunInSimulinkForAccel
%return SLibCGIRVarGroupPath(varGroup.ParentVarGroupIdx, accSysIdx,cross) + ...
vName + "[1]."
%else
%return SLibCGIRVarGroupPath(varGroup.ParentVarGroupIdx, accSysIdx,cross) + ...
vName + "[0]."
%endif
%endif
%endif
%else
%return ...
SLibCGIRVarGroupPath(varGroup.ParentVarGroupIdx, accSysIdx,cross) + ...
vName + "."
%endif
%endfunction
%function SLibDumpSupportsMultipleExecInstancesFlag()
%if ISFIELD(::CompiledModel,"ModelSupportsMultipleExecInstances") && ...
::CompiledModel.ModelSupportsMultipleExecInstances
%return "ssSupportsMultipleExecInstances(S, true);"
%else
%assign errStr = STRING(::CompiledModel.ModelMultipleExecInstancesNoSupportMsg)
%openfile retbuf
ssSupportsMultipleExecInstances(S, false);
ssRegisterMsgForNotSupportingMultiExecInst(S,"%<errStr>");
%closefile retbuf
%return retbuf
%endif
%endfunction
%function SLibDumpHasStateInsideForEachSSFlag()
%if ISFIELD(::CompiledModel,"ModelHasStateInsideForEachSS") && ...
::CompiledModel.ModelHasStateInsideForEachSS
%return "ssHasStateInsideForEachSS(S, true);"
%else
%return "ssHasStateInsideForEachSS(S, false);"
%endif
%endfunction
%function SLibGetIsVarGroupParentedByMatrixVarGroup(varGroup)
%if LibCGTypeIsMatrix(varGroup.CGTypeIdx)
%return TLC_TRUE
%endif
%if varGroup.ParentVarGroupIdx != -1
%assign parentVarGroup = ::CompiledModel.VarGroups.VarGroup[varGroup.ParentVarGroupIdx]
%assign inInMatrixVarGroup = SLibGetIsVarGroupParentedByMatrixVarGroup(parentVarGroup)
%if inInMatrixVarGroup
%return TLC_TRUE
%endif
%endif
%return TLC_FALSE
%endfunction
%function SLibGetISSCanInputIter(sysIdx, ciIdx)
%assign interface = System[sysIdx].Interface
%assign canInputArg = interface.CanonicalInputArgDef[ciIdx]
%return ISFIELD(canInputArg, "LoopReuseIter") && canInputArg.LoopReuseIter == "yes"
%endfunction
%function SLibGetIsParallelInRapidAccelForEachSS(sys)
%return SLibGetSubsystemIsForEachSS(sys) && ...
ISFIELD(sys, "ParallelExecInRapidAccelSim") && ...
sys.ParallelExecInRapidAccelSim
%endfunction
%function SLibNeedHandleParallelForEachSS(sys, sysFcn)
%return SLibGetIsParallelInRapidAccelForEachSS(sys) && ...
(sysFcn == "Output" || sysFcn == "Outputs" || ...
sysFcn == "OutputUpdate" || ...
(sysFcn == "Derivative" && ISFIELD(sys, "ParallelExecInDerivFcn") && sys.ParallelExecInDerivFcn))
%endfunction
%function SLibGenParallelAccelForEachSS(sysIdx, fcnType) void
%openfile retBuf
%assign system = System[sysIdx]
%assign fcnTypeName = SLibCGIRGetFcnTypeName(fcnType)
%assign tmpTid = SLibSystemTidUsedByRateGroup(system,fcnTypeName)
%assign fcnInfo = LibGetFcnInfo(system, fcnTypeName, tmpTid)
%assign psysIdx = system.ParallelSubsystemIndex
parallel_for(%<system.NumImplicitIter>, %<fcnInfo.Name>, %<psysIdx>);
%closefile retBuf
%return retBuf
%endfunction
%endif