%selectfile NULL_FILE
%function SLibGetNumPeriodicTasks()
%assign numTasks = 0
%if LibIsDeploymentDiagram()
%assign numTasks = SLibDeploymentGetNumPeriodicTasks()
%else
%assign numTasks = LibGetNumSyncPeriodicTasks()
%endif
%return numTasks
%endfunction
%function SLibGetNumPeriodicTriggers()
%assign numTriggers = 0
%if LibIsDeploymentDiagram()
%foreach ehIdx = LibGetNumTriggers()
%assign evType = LibGetTriggerType(ehIdx)
%if ISEQUAL(evType, "PeriodicTrigger")
%assign numTriggers = numTriggers+1
%endif
%endforeach
%else
%if LibGetNumSyncPeriodicTasks() > 0
%assign numTriggers = 1
%endif
%endif
%return numTriggers
%endfunction
%function SLibGetNumAperiodicTasks()
%assign retVal = 0
%if LibIsDeploymentDiagram()
%assign retVal = SLibDeploymentGetNumAperiodicTasks()
%endif
%return retVal
%endfunction
%function SLibGetNumPeriodicMappedEntities()
%if LibIsDeploymentDiagram()
%return SLibDeploymentGetNumPeriodicMappedEntities()
%else
%return SLibGetNumPeriodicTasks()
%endif
%endfunction
%function SLibIsTaskProfilingOn() void
%return ISFIELD(::CompiledModel, "ConcurrentExecutionProfileGenCode") && ...
ISEQUAL(::CompiledModel.ConcurrentExecutionProfileGenCode, 1)
%endfunction
%function SLibIsRateMonotonicScheduling() void
%assign isRMSTask = TLC_FALSE
%if LibIsDeploymentDiagram()
%foreach ehIdx = LibGetNumTriggers()
%foreach taskIdx = LibGetNumTriggerTasks(ehIdx)
%if ISEQUAL(SLibDeploymentGetTaskSchedulingConstraint(ehIdx, taskIdx), ...
"RateMonotonic")
%assign isRMSTask = TLC_TRUE
%break
%endif
%endforeach
%if isRMSTask
%break
%endif
%endforeach
%endif
%return isRMSTask || ...
(!SLibConcurrentTasks() && (LibGetNumSyncPeriodicTasks() > 1))
%endfunction
%function SLibIsTaskRateMonotonic(ehIdx, taskIdx) void
%assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
%assign isRMSTask = TLC_FALSE
%if LibIsDeploymentDiagram()
%if ISEQUAL(SLibDeploymentGetTaskSchedulingConstraint(ehIdx, taskIdx), ...
"RateMonotonic")
%assign isRMSTask = TLC_TRUE
%endif
%else
%assert ISEQUAL(ehIdx, 0)
%endif
%return isRMSTask
%endfunction
%function SLibGetNumClockTicksForTrigger(ehIdx)
%assign nClockTicks = LibGetTriggerBaseRate(ehIdx)/FundamentalStepSize + 0.5
%assign nClockTicks = CAST("Number",FEVAL("floor", nClockTicks))
%return nClockTicks
%endfunction
%function SLibGetMaxNumberOfCoresPerTask()
%assign maxNumberOfCoresPerTask = -1
%foreach ehIdx = LibGetNumTriggers()
%assign evType = LibGetTriggerType(ehIdx)
%if ISEQUAL(evType, "AperiodicTrigger")
%continue
%endif
%foreach taskIdx = LibGetNumTriggerTasks(ehIdx)
%assign affinity = LibGetTaskCoreAffinity(ehIdx, taskIdx)
%assign affinitySize = SIZE(affinity, 1)
%if affinitySize > maxNumberOfCoresPerTask
%assign maxNumberOfCoresPerTask = affinitySize
%endif
%endforeach
%endforeach
%return maxNumberOfCoresPerTask
%endfunction
%function LibCallRateScheduler()
%assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
%assign buf = ""
%if LibIsDeploymentDiagram()
%assign buf = LibDeploymentCallAdvanceTaskCounters()
%elseif !SLibSingleTasking()
%if IsMultiInstanceERTOrModelReference()
%assign buf = "%<FcnGetMulirateSchedulerName()>(%<::tSimStruct>);"
%else
%assign buf = "%<FcnGetMulirateSchedulerName()>();"
%endif
%endif
%return buf
%endfunction
%function LibGetNumTriggers()
%assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
%assign numEH = 1
%if LibIsDeploymentDiagram()
%assign numEH = LibDeploymentGetNumTaskGroups()
%endif
%return numEH
%endfunction
%function LibGetTriggerType(ehId)
%assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
%assign evType = ""
%if LibIsDeploymentDiagram()
%assign evType = SLibDeploymentGetEventType(ehId)
%else
%assert ISEQUAL(ehId, 0)
%assign evType = "PeriodicTrigger"
%endif
%return evType
%endfunction
%function LibGetTriggerName(ehId)
%assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
%assign retVal = ""
%if LibIsDeploymentDiagram()
%assign retVal = SLibDeploymentGetEventHandlerName(ehId)
%else
%assert ISEQUAL(ehId, 0)
%assign retVal = "baseRate"
%endif
%return retVal
%endfunction
%function LibGetTaskName(ehId, taskId)
%assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
%assign retVal = ""
%if LibIsDeploymentDiagram()
%assign retVal = SLibDeploymentGetTaskName(ehId, taskId)
%else
%assert ISEQUAL(ehId, 0)
%assign retVal = "task%<taskId>"
%endif
%return retVal
%endfunction
%function LibGetTriggerTargetObject(ehId)
%assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
%assign retVal = ""
%assign evType = LibGetTriggerType(ehId)
%if ISEQUAL(evType, "PeriodicTrigger")
%assign errTxt = "Target object for periodic event handler is not supported"
%<LibReportError(errTxt)>
%else
%assert LibIsDeploymentDiagram()
%assign retVal = SLibDeploymentGetEventHandlerTargetObject(ehId)
%endif
%return retVal
%endfunction
%function LibGetTriggerBaseRate(ehId)
%assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
%assign retVal = ""
%assign evType = LibGetTriggerType(ehId)
%if ISEQUAL(evType, "AperiodicTrigger")
%assign errTxt = "Base rate for aperiodic trigger is not supported"
%<LibReportError(errTxt)>
%else
%if LibIsDeploymentDiagram()
%assign retVal = ::CompiledModel.EventHandler[ehId].Periodicity.BasePeriod
%else
%assign retVal = LibGetSampleTimePeriodAndOffset(LibGetTID01EQ(), 0)
%endif
%endif
%return retVal
%endfunction
%function LibGetTriggerHandlerType(ehId)
%assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
%assign retVal = ""
%if LibIsDeploymentDiagram()
%assign retVal = SLibDeploymentGetEventHandlerType(ehId)
%else
%assert ISEQUAL(ehId, 0)
%assign retVal = "task"
%endif
%return retVal
%endfunction
%function LibCallTriggerTask(ehId, taskId)
%assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
%assign retVal = ""
%assign evType = LibGetTriggerType(ehId)
%if ISEQUAL(evType, "PeriodicTrigger")
%assign errTxt = "LibCallTriggerTask for periodic event handler is not supported"
%<LibReportError(errTxt)>
%else
%assert LibIsDeploymentDiagram()
%assign retVal = SLibDeploymentEmitCallToEventHandlerTask(ehId, taskId)
%endif
%return retVal
%endfunction
%function LibCallTriggerISR(ehId)
%assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
%assign retVal = ""
%assign evType = LibGetTriggerType(ehId)
%if ISEQUAL(evType, "PeriodicTrigger") && !LibIsDeploymentDiagram()
%assign errTxt = "LibCallTriggerISR for periodic event handler is not supported"
%<LibReportError(errTxt)>
%else
%assert LibIsDeploymentDiagram()
%assign retVal = SLibDeploymentEmitCallToEventHandler(ehId)
%endif
%return retVal
%endfunction
%function LibGetNumTriggerTasks(ehId) void
%assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
%assign numTasks = 0
%if LibIsDeploymentDiagram()
%assign numTasks = SLibDeploymentGetNumEventHandlerTasks(ehId)
%else
%assert ISEQUAL(ehId, 0)
%assign numTasks = LibGetNumSyncPeriodicTasks()
%endif
%return numTasks
%endfunction
%function LibGetTriggerTaskSampleTimeIndex(ehId, taskId)
%assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
%assign stId = -1
%assign retVal = ""
%assign evType = LibGetTriggerType(ehId)
%if ISEQUAL(evType, "AperiodicTrigger")
%assign errTxt = "Target object for aperiodic event handler is not supported"
%<LibReportError(errTxt)>
%else
%if LibIsDeploymentDiagram()
%assign stId = SLibDeploymentGetTaskSampleTimeIndex(ehId, taskId)
%else
%assert ISEQUAL(ehId, 0)
%assign tid01Eq = ISEQUAL(SolverType, "FixedStep") && FixedStepOpts.TID01EQ
%assert (taskId < NumRuntimeExportedRates+tid01Eq)
%assign stId = taskId + tid01Eq
%endif
%endif
%return stId
%endfunction
%function LibIsCoreAffinityRequired()
%assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
%assign retVal = TLC_FALSE
%if LibIsDeploymentDiagram()
%foreach ehIdx = LibGetNumTriggers()
%assign evType = LibGetTriggerType(ehIdx)
%if ISEQUAL(evType, "PeriodicTrigger")
%foreach taskIdx = LibGetNumTriggerTasks(ehIdx)
%assign affinity = LibGetTaskCoreAffinity(ehIdx, taskIdx)
%if !ISEQUAL(affinity[0], -1)
%assign retVal = TLC_TRUE
%break
%endif
%endforeach
%endif
%if retVal
%break
%endif
%endforeach
%endif
%return retVal
%endfunction
%function LibGetTaskCoreAffinity(ehId, taskId)
%assert (SLibConcurrentTasks() || LibIsDeploymentDiagram())
%assign evType = LibGetTriggerType(ehId)
%if ISEQUAL(evType, "AperiodicTrigger")
%assign errTxt = "Core affinity for aperiodic trigger is not supported"
%<LibReportError(errTxt)>
%else
%if LibIsDeploymentDiagram()
%assign affinity = SLibDeploymentGetTaskCoreAffinity(ehId, taskId)
%else
%assert ISEQUAL(ehId, 0)
%assign affinity = 0
%endif
%endif
%return affinity
%endfunction