%selectfile NULL_FILE
%if EXISTS("_GLOBALMAPLIB_") == 0
%assign _GLOBALMAPLIB_ = 1
%<LibAddToCompiledModel("CustomInterfaceAPIGenerated", 0)>
%<LibAddToCompiledModel("InterfaceAPIGenerated", 0)>
%<LibAddToCompiledModel("BlockOutputsMapped", 0)>
%<LibAddToCompiledModel("ExternalInputsMapped", 0)>
%<LibAddToCompiledModel("ParametersMapped", 0)>
%<LibAddToCompiledModel("StateflowDataMapped", 0)>
%if !EXISTS("MapBlockOutputs")
%assign MapBlockOutputs = 1
%endif
%if !EXISTS("MapExternalInputs")
%assign MapExternalInputs = 1
%endif
%if (SLibIsERTTarget() && ...
((!SLibIsDeploymentDiagramType() && ConfigSet.GenerateTestInterfaces) || ...
SLibFcnProtoCtrlActive()))
%assign MapExternalOutputs = 1
%elseif !EXISTS("MapExternalOutputs")
%assign MapExternalOutputs = 0
%endif
%if !EXISTS("MapCustomExternalOutputs")
%assign MapCustomExternalOutputs = 1
%endif
%if !EXISTS("MapParameters")
%assign MapParameters = 1
%endif
%if !EXISTS("MapStateflow")
%assign MapStateflow = 1
%endif
%if !EXISTS("MapDWork")
%assign MapDWork = 1
%endif
%if !EXISTS("MapZeroCrossings")
%assign MapZeroCrossings = 1
%endif
%if !EXISTS("MapContStates")
%assign MapContStates = 1
%endif
%if !EXISTS("MapDerivatives")
%assign MapDerivatives = 1
%endif
%if !EXISTS("GMMConflictChecking")
%assign GMMConflictChecking = 1
%endif
%if !EXISTS("MapBlockHierarchy")
%assign MapBlockHierarchy = 1
%endif
%<LibAddToCompiledModel("MapBlockOutputs", MapBlockOutputs)>
%<LibAddToCompiledModel("MapExternalInputs", MapExternalInputs)>
%<LibAddToCompiledModel("MapExternalOutputs", MapExternalOutputs)>
%<LibAddToCompiledModel("MapCustomExternalOutputs", MapCustomExternalOutputs)>
%<LibAddToCompiledModel("MapParameters", MapParameters)>
%<LibAddToCompiledModel("MapStateflow", MapStateflow)>
%<LibAddToCompiledModel("MapDWork", MapDWork)>
%<LibAddToCompiledModel("MapZeroCrossings", MapZeroCrossings)>
%<LibAddToCompiledModel("MapContStates", MapContStates)>
%<LibAddToCompiledModel("MapDerivatives", MapDerivatives)>
%<LibAddToCompiledModel("GMMConflictChecking", GMMConflictChecking)>
%<LibAddToCompiledModel("MapBlockHierarchy", MapBlockHierarchy)>
%function SLibGetGlobalMemoryDataRecord(memoryMapIdx) void
%assign structIdx = memoryMapIdx[0]
%assign secIdx = memoryMapIdx[1]
%assign dataIdx = memoryMapIdx[2]
%assign retVal = []
%with ::CompiledModel.GlobalMemoryMap
%if dataIdx == -1
%assign retVal = []
%elseif secIdx == -1
%assign retVal = UnstructuredData.Data[dataIdx]
%elseif structIdx == -1
%assign retVal = CustomData[secIdx].Data[dataIdx]
%else
%assign section = StructuredData[structIdx].Section[secIdx]
%assign retVal = section.Data[dataIdx]
%endif
%endwith
%return retVal
%endfunction
%function SLibMapData() void
%if GenerateClassInterface
%if !ISFIELD(::CompiledModel, "InGeneratingGMM")
%<LibAddToCompiledModel("InGeneratingGMM", TLC_TRUE)>
%endif
%endif
%if InterfaceAPIGenerated == 1
%if GenerateClassInterface
%assign ::CompiledModel.InGeneratingGMM = TLC_FALSE
%endif
%return ""
%endif
%assign ::CompiledModel.InterfaceAPIGenerated = 1
%if RTWVerbose
%selectfile STDOUT
### Generating TLC interface API.
%selectfile NULL_FILE
%endif
%assign ::CompiledModel.BlockOutputsMapped = 0
%assign ::CompiledModel.ExternalInputsMapped = 0
%assign ::CompiledModel.ParametersMapped = 0
%assign ::CompiledModel.StateflowDataMapped = 0
%assign lastBlockFcn = ::BlockFcn
%if ::BlockFcn == "Unknown"
%assign ::BlockFcn = "GlobalMap"
%endif
%if MapBlockOutputs
%<FcnMapBlockIO()>
%endif
%if MapExternalInputs
%<FcnMapExternalInputs()>
%endif
%if MapParameters
%<FcnMapParameters()>
%endif
%if MapStateflow
%<FcnMapStateflowData()>
%endif
%if MapDWork
%<FcnMapDWork()>
%endif
%if MapDWork || MapParameters || MapBlockOutputs || MapExternalInputs || MapExternalOutputs
%<FcnMapDataGroups()>
%endif
%if MapContStates
%<FcnMapContStates()>
%endif
%if MapDerivatives
%<FcnMapContStateDerivatives()>
%endif
%if MapExternalOutputs
%<FcnMapExternalOutputs()>
%endif
%if MapBlockHierarchy
%<FcnMapBlockHierarchy()>
%endif
%if EXISTS("InterfaceAPITestFile2")
%assign stdText = "### Writing custom code from %<InterfaceAPITestFile2>"
%<LibWriteToStandardOutput(stdText)>
%include "%<InterfaceAPITestFile2>"
%endif
%assign ::BlockFcn = lastBlockFcn
%if GenerateClassInterface
%assign ::CompiledModel.InGeneratingGMM = TLC_FALSE
%endif
%endfunction
%function SLibMapCustomData() void
%assign ::CompiledModel.CustomInterfaceAPIGenerated = 1
%if RTWVerbose
%selectfile STDOUT
### Generating TLC interface API for custom data
%selectfile NULL_FILE
%endif
%assign ::CompiledModel.BlockOutputsMapped = 0
%assign ::CompiledModel.ExternalInputsMapped = 0
%assign ::CompiledModel.ParametersMapped = 0
%<PrepareForMappingBlockIO()>
%if MapCustomExternalOutputs
%<FcnMapCustomExternalOutputs()>
%endif
%if MapBlockOutputs
%<FcnMapCustomBlockIO()>
%endif
%if MapExternalInputs
%<FcnMapCustomExternalInputs()>
%endif
%if MapParameters
%<FcnMapCustomParameters()>
%endif
%if MapDWork
%<FcnMapCustomDWork()>
%endif
%if MapZeroCrossings
%<FcnMapCustomZeroCrossings()>
%endif
%endfunction
%function SLibPostMapData() void
%<FcnPostMapCleanup()>
%if EXISTS("InterfaceAPIAsMatlabVar")
%assign mlVar = InterfaceAPIAsMatlabVar
%if FEVAL("tlc2m",mlVar, GlobalMemoryMap)
%warning Created GlobalMemoryMap as MATLAB variable: %<mlVar>
%else
%warning Unable to create GlobalMemoryMap as MATLAB variable: %<mlVar>
%endif
%endif
%if EXISTS("InterfaceAPITestFile")
%include "%<InterfaceAPITestFile>"
%endif
%endfunction
%function FcnCreateGlobalMemoryMap() void
%assign isDefined = ...
ISEQUAL(::CompiledModel.ModelReferenceTargetType,"NONE") ? ...
TLC_TRUE : TLC_FALSE
%addtorecord ::CompiledModel /
GlobalMemoryMap { /
NumStructuredData 0 /
NumUnstructuredData 1 /
NumCustomData 0 /
CustomDataIndexHash { /
} /
ModelParameters { /
NumModelParameters 0 /
InstanceCache { /
NumCachedVariables 0 /
} /
SignalInstanceCache { /
NumCachedSignals 0 /
} /
} /
NonVirtualStructures { /
NumNonVirtualBuses 0 /
BusStructureHash { /
} /
} /
FixedPointMaps { /
NumFixPtTypes 0 /
FixPtTypeHash { /
} /
} /
UnstructuredData { /
Name "RTW unstructured data" /
NumTotalElements 0 /
NumData 0 /
DataDefaults { /
Access "direct" /
Class "scalar" /
DataTypeIdx 0 /
HasObject TLC_FALSE /
IsComplex TLC_FALSE /
IsFixedPoint TLC_FALSE /
IsStruct TLC_FALSE /
NumCols 1 /
NumDimensions 2 /
NumRows 1 /
Permission "rw" /
PPIf "" /
PPEndIf "" /
Type "parameter" /
IsDefined isDefined /
} /
} /
}
%endfunction
%<FcnCreateGlobalMemoryMap()>
%function FcnAddNonUniformElement(fpInfo, dtIdx) void
%assign dtDefine = DataTypes.DataType[dtIdx]
%addtorecord fpInfo /
ElementScaling { /
FixedExp dtDefine.FixedExp; /
FracSlope dtDefine.FracSlope; /
Bias dtDefine.Bias /
}
%endfunction
%function FcnGetUniformFixPtTypeInGMM(dataTypeRec) void
%assert (dataTypeRec.IsFixedPoint == 1)
%assign hashKey = "DataTypeId%<dataTypeRec.Id>"
%with GlobalMemoryMap.FixedPointMaps
%if ISFIELD(FixPtTypeHash, hashKey)
%assign fxpIdx = GETFIELD(FixPtTypeHash, hashKey)
%else
%assign fxpIdx = NumFixPtTypes
%addtorecord GlobalMemoryMap.FixedPointMaps /
FixPtRecord { /
Scaling "uniform"; /
NumBits dataTypeRec.ActualBits; /
NumRequiredBits dataTypeRec.RequiredBits; /
IsSigned dataTypeRec.IsSigned; /
FixedExp dataTypeRec.FixedExp; /
FracSlope dataTypeRec.FracSlope; /
Bias dataTypeRec.Bias /
}
%addtorecord FixPtTypeHash %<hashKey> fxpIdx
%assign GlobalMemoryMap.FixedPointMaps.NumFixPtTypes = NumFixPtTypes + 1
%endif
%endwith
%return fxpIdx
%endfunction
%function FcnAddFixedPointInfo(data, record) void
%switch record.RecordType
%case "BlockOutput"
%case "ExternalInput"
%case "ModelParameter"
%case "DWork"
%case "ExternalOutput"
%assign dtDefine = DataTypes.DataType[LibGetRecordDataTypeId(record)]
%assign scaling = "uniform"
%break
%default
%<LibReportFatalError("unknown record type: %<record.RecordType>.")>
%endswitch
%if scaling == "uniform"
%assign fxpIdx = FcnGetUniformFixPtTypeInGMM(dtDefine)
%endif
%addtorecord data /
FixedPointInfo GlobalMemoryMap.FixedPointMaps.FixPtRecord[fxpIdx]
%endfunction
%function FcnAddObjectProperties(data, record) void
%if record.HasObject
%assign data.HasObject = TLC_TRUE
%addtorecord data Object record.Object
%endif
%endfunction
%function StripDollarCharFromLUTType(lutType)
%assign p = CGMODEL_ACCESS("String.find", lutType, "$")
%if p >= 0
%assign length = CGMODEL_ACCESS("String.length", lutType)
%return CGMODEL_ACCESS("String.substr", lutType, 0, p) + CGMODEL_ACCESS("String.substr", lutType, p+1, length-p-1)
%else
%return lutType
%endif
%endfunction
%function FcnAddBusStructure(data, dataTypeIdx) void
%if LibIsStructDataType(dataTypeIdx)
%assign data.IsStruct = TLC_TRUE
%assign busDataTypeIdx = dataTypeIdx
%assign busName = LibGetDataTypeNameFromId(busDataTypeIdx)
%assign busHashKey = busName
%with GlobalMemoryMap.NonVirtualStructures
%if ISFIELD(BusStructureHash, busHashKey)
%assign busIdx = GETFIELD(BusStructureHash, busHashKey)
%else
%assign busIdx = NumNonVirtualBuses
%assign numElements = LibDataTypeNumElements(busDataTypeIdx)
%addtorecord GlobalMemoryMap.NonVirtualStructures /
Bus { /
Name busName; /
Description LibDescriptionForDataTypeIdx(busDataTypeIdx); /
Header LibHeaderForDataTypeIdx(busDataTypeIdx) /
DataTypeIdx busDataTypeIdx; /
NumElements numElements /
BusElementDefaults { /
Class "scalar"; /
DataTypeIdx 0; /
IsComplex TLC_FALSE; /
IsFixedPoint TLC_FALSE; /
IsStruct TLC_FALSE; /
NumDimensions 2; /
NumRows 1; /
NumCols 1; /
Description ""; /
DocUnits ""; /
Max rtInf; /
Min rtMinusInf /
} /
}
%assign busHashKey = StripDollarCharFromLUTType(busHashKey)
%addtorecord BusStructureHash %<busHashKey> busIdx
%assign GlobalMemoryMap.NonVirtualStructures.NumNonVirtualBuses = ...
NumNonVirtualBuses + 1
%foreach elemIdx = numElements
%<FcnAddBusElement(Bus[busIdx], elemIdx)>
%endforeach
%endif
%addtorecord data StructInfo Bus[busIdx]
%endwith
%endif
%endfunction
%function FcnAddBusElement(gmmBusStructure, elemIdx) void
%with GlobalMemoryMap.NonVirtualStructures
%assign busDTIdx = gmmBusStructure.DataTypeIdx
%assign matND = "col-mat-nd"
%assign mat2D = "col-mat"
%if LibIsRowMajorLayout()
%assign matND = "row-mat-nd"
%assign mat2D = "row-mat"
%endif
%assign elemDataTypeIdx = LibDataTypeElementDataTypeId(busDTIdx, elemIdx)
%assign elemIsFixPt = LibDataTypeElementIsFixPt(busDTIdx, elemIdx)
%assign numDims = LibDataTypeElementNumDimensions(busDTIdx, elemIdx)
%assign dims = LibDataTypeElementDimensions(busDTIdx, elemIdx)
%assign width = LibDataTypeElementWidth(busDTIdx, elemIdx)
%if numDims == 1
%assign numDims = 2
%assign numRows = CAST("Number", dims[0])
%assign numCols = 1
%if width == 1
%assign elemClass = "scalar"
%else
%assign elemClass = "vector"
%endif
%elseif numDims == 2
%assign numRows = CAST("Number", dims[0])
%assign numCols = CAST("Number", dims[1])
%assign elemClass = "%<mat2D>"
%else
%assign numRows = -1
%assign numCols = -1
%assign elemClass = "%<matND>"
%endif
%addtorecord gmmBusStructure /
BusElement { /
Name LibDataTypeElementName(busDTIdx, elemIdx) /
}
%if elemClass != "scalar"
%assign gmmBusStructure.BusElement[elemIdx].Class = elemClass
%endif
%if elemDataTypeIdx > 0
%assign gmmBusStructure.BusElement[elemIdx].DataTypeIdx = elemDataTypeIdx
%endif
%if LibDataTypeElementIsComplex(busDTIdx, elemIdx)
%assign gmmBusStructure.BusElement[elemIdx].IsComplex = TLC_TRUE
%endif
%if elemIsFixPt
%assign gmmBusStructure.BusElement[elemIdx].IsFixedPoint = TLC_TRUE
%assign fxpDataTypeRec = DataTypes.DataType[elemDataTypeIdx]
%assign fxpIdx = FcnGetUniformFixPtTypeInGMM(fxpDataTypeRec)
%addtorecord gmmBusStructure.BusElement[elemIdx] ...
FixedPointInfo GlobalMemoryMap.FixedPointMaps.FixPtRecord[fxpIdx]
%endif
%if numDims > 2
%addtorecord gmmBusStructure.BusElement[elemIdx] Dimensions dims
%assign gmmBusStructure.BusElement[elemIdx].NumDimensions = numDims
%else
%if numRows > 1
%assign gmmBusStructure.BusElement[elemIdx].NumRows = numRows
%endif
%if numCols > 1
%assign gmmBusStructure.BusElement[elemIdx].NumCols = numCols
%endif
%endif
%if LibDataTypeIsBus(busDTIdx)
%assign gmmBusStructure.BusElement[elemIdx].Description = ...
LibDataTypeElementDescription(busDTIdx, elemIdx)
%assign gmmBusStructure.BusElement[elemIdx].DocUnits = ...
LibDataTypeElementDocUnits(busDTIdx, elemIdx)
%assign elemMax = LibDataTypeElementMax(busDTIdx, elemIdx)
%if elemMax != rtInf
%assign gmmBusStructure.BusElement[elemIdx].Max = elemMax
%endif
%assign elemMin = LibDataTypeElementMin(busDTIdx, elemIdx)
%if elemMin != rtMinusInf
%assign gmmBusStructure.BusElement[elemIdx].Min = elemMin
%endif
%endif
%<FcnAddBusStructure(gmmBusStructure.BusElement[elemIdx], elemDataTypeIdx)>
%endwith
%endfunction
%function LibRTWRecord(record)
%if ISFIELD(record,"RTWRecord")
%return record.RTWRecord
%else
%return []
%endif
%endfunction
%function LibGetDataWidth(record) void
%switch record.RecordType
%case "ZcSignalInfo"
%return LibGetRecordWidth(record)
%case "BlockOutput"
%return LibGetRecordWidth(record)
%case "ModelParameter"
%return LibGetRecordWidth(record)
%case "DWork"
%return FcnGetDWorkWidth(record)
%case "ChartData"
%return record.With
%case "ContState"
%return record.Width
%case "ExternalInput"
%return LibGetRecordWidth(record)
%case "ExternalOutput"
%return LibGetRecordWidth(record)
%case "MachineData"
%assign sfSize = CAST("Number", record.Size)
%return sfSize == 0 ? 1 : sfSize
%default
%<LibReportFatalError("unknown record type: %<record.RecordType>")>
%endswitch
%endfunction
%function LibGetDataSymbolicWidth(record) void
%if SLibIsNdIndexingFeatureOn()
%return LibGetDataSymbolicDims(record)
%else
%if SLibIsRecordSupportedForSymbolicDimensions(record)
%return LibGetRecordSymbolicWidth(record)
%else
%return "%<LibGetDataWidth(record)>"
%endif
%endif
%endfunction
%function LibGetDataSymbolicDims(record) void
%if SLibIsRecordSupportedForSymbolicDimensions(record)
%return LibGetRecordSymbolicDims(record)
%else
%return "%<LibGetDataWidth(record)>"
%endif
%endfunction
%function SLibIsRecordSupportedForSymbolicDimensions(record) void
%assign isSupported = TLC_FALSE
%if (record.RecordType == "BlockOutput" || ...
record.RecordType == "ModelParameter" || ...
record.RecordType == "DWork" || ...
record.RecordType == "ExternalInput" || ...
record.RecordType == "ExternalOutput")
%assign isSupported = TLC_TRUE
%endif
%return isSupported
%endfunction
%function SLibIsGlobalDataRecWithNoExternalLinkage(record) void
%assign data = SLibGetGlobalMemoryDataRecord(record.MemoryMapIdx)
%if TYPE(data) == "Scope"
%return SLibIsGlobalMapDataWithNoExternalLinkage(data)
%else
%return TLC_FALSE
%endif
%endfunction
%function SLibIsGlobalMapDataWithNoExternalLinkage(data) void
%if (data.Class == "other")
%return TLC_TRUE
%endif
%if ISFIELD(data, "Access") && (data.Access == "unknown")
%return TLC_TRUE
%endif
%if ISFIELD(data, "Scope") && (data.Scope == "File")
%return TLC_TRUE
%endif
%assign rtwRecord = LibRTWRecord(data)
%if !ISEMPTY(rtwRecord) && ISFIELD(rtwRecord,"isFcnScoped") && (rtwRecord.isFcnScoped != 0)
%return TLC_TRUE
%endif
%return TLC_FALSE
%endfunction
%function LibGetDataLayout(record) void
%assign matND = "col-mat-nd"
%assign mat2D = "col-mat"
%if LibIsRowMajorLayout()
%assign matND = "row-mat-nd"
%assign mat2D = "row-mat"
%endif
%assign width = LibGetDataWidth(record)
%switch record.RecordType
%case "BlockOutput"
%assign dims = LibGetRecordDimensions(record)
%assign nDims = SIZE(dims, 1)
%if nDims > 2
%return ["%<matND>", %<nDims>, %<dims>, "[0]"]
%elseif nDims == 2 && dims[0] != -1 && width > 1
%assign nRows = dims[0]
%assign nCols = dims[1]
%return ["%<mat2D>", 2, [%<nRows>,%<nCols>], "[0]"]
%elseif width > 1
%return ["vector", 2, [%<width>,1], "[0]"]
%else
%return ["scalar", 2, [1,1], ""]
%endif
%break
%case "ModelParameter"
%assign mdlParam = record
%assign dims = LibBlockParameterDimensions(mdlParam)
%assign nDims = SIZE(dims, 1)
%assign width = LibBlockParameterWidth(mdlParam)
%assign nRows = dims[0]
%assign nCols = width/nRows
%if nDims > 2
%return ["%<matND>", %<nDims>, %<dims>, "[0]"]
%elseif nRows > 1 && nCols > 1
%return ["%<mat2D>", 2, [%<nRows>,%<nCols>], "[0]"]
%elseif width > 1
%return ["vector", 2, [%<nRows>,%<nCols>], "[0]"]
%else
%return ["scalar", 2, [1,1], ""]
%endif
%break
%case "DWork"
%assign dims = LibGetRecordDimensions(record)
%assign nDims = SIZE(dims, 1)
%switch nDims
%case 0
%return ["scalar", 2, [1,1], ""]
%case 1
%if width == 1
%return ["scalar", 2, [1,1], ""]
%else
%return ["vector", 2, [%,1], "[0]"]
%endif
%case 2
%assign nRows = dims[0]
%assign nCols = dims[1]
%if nRows > 1 && nCols > 1
%return ["%<mat2D>", 2, %<dims>, "[0]"]
%else
%return ["vector", 2, %<dims>, "[0]"]
%endif
%default
%return ["%<matND>", %<nDims>, %<dims>, "[0]"]
%endswitch
%break
%case "ContState"
%if ISFIELD(record, "Dimensions")
%assign dims = record.Dimensions
%assign nDims = SIZE(dims, 1)
%switch nDims
%case 0
%return ["scalar", 2, [1,1], ""]
%case 1
%return ["vector", 2, [%,1], "[0]"]
%case 2
%return ["%<mat2D>", 2, %<dims>, "[0]"]
%default
%return ["%<matND>", %<nDims>, %<dims>, "[0]"]
%endswitch
%else
%if width == 1
%return ["scalar", 2, [1,1], ""]
%else
%return ["vector", 2, [%<width>,1], "[0]"]
%endif
%endif
%break
%case "ChartData"
%assign dims = record.Dimensions
%assign nDims = SIZE(dims, 1)
%switch nDims
%case 0
%return ["scalar", 2, [1,1], ""]
%case 1
%return ["vector", 2, [%,1], "[0]"]
%case 2
%return ["%<mat2D>", 2, %<dims>, "[0]"]
%default
%return ["%<matND>", %<nDims>, %<dims>, "[0]"]
%endswitch
%break
%case "ExternalInput"
%assign ei = record
%assign dims = LibGetRecordDimensions(ei)
%assign nDims = SIZE(dims, 1)
%if nDims > 2
%return ["%<matND>", %<nDims>, %<dims>, "[0]"]
%elseif nDims == 2 && width > 1
%assign nRows = dims[0]
%assign nCols = dims[1]
%return ["%<mat2D>", 2, [%<nRows>,%<nCols>], "[0]"]
%elseif width > 1
%return ["vector", 2, [%<width>,1], "[0]"]
%else
%if (ei.StorageClass == "Auto") && ...
(IsModelReferenceTarget() || (PassExtInpByRef(ei) && !SLibHasGlobalExternalInputsWithFPC()))
%return ["scalar", 2, [1,1], "[0]"]
%else
%return ["scalar", 2, [1,1], ""]
%endif
%endif
%break
%case "ExternalOutput"
%assign eo = record
%assign sysIdx = eo.Block[0]
%assign blkIdx = eo.Block[1]
%assign oblock = System[sysIdx].Block[blkIdx]
%assign ip = oblock.DataInputPort
%assign dims = LibGetRecordDimensions(ip)
%assign nDims = SIZE(dims,1)
%if nDims > 2
%return ["%<matND>", %<nDims>, %<dims>, "[0]"]
%elseif nDims == 2 && width > 1
%assign nRows = dims[0]
%assign nCols = dims[1]
%return ["%<mat2D>", 2, [%<nRows>,%<nCols>], "[0]"]
%elseif LibGetRecordWidth(ip) > 1
%return ["vector", 2, [%<LibGetRecordWidth(ip)>,1], "[0]"]
%else
%return ["scalar", 2, [1,1], ""]
%endif
%break
%case "MachineData"
%assign sfInfo = record
%assign sfSize = CAST("Number", sfInfo.Size)
%if width > 1
%return ["vector", 2, [%<width>,1], "[0]"]
%else
%return ["scalar", 2, [1,1], ""]
%endif
%case "ZcSignalInfo"
%if width > 1
%return ["vector", 2, [%<width>,1], "[0]"]
%else
%return ["scalar", 2, [1,1], ""]
%endif
%default
%<LibReportFatalError("unknown record type: %<record.RecordType>")>
%endswitch
%endfunction
%function SLibGetDataLayout(record) void
%return LibGetDataLayout(record)
%endfunction
%function SLibIsBusVolatileCPP(record,msDefn)
%return LibDataTypeIsBus(SLibGetRecordDataTypeId(record)) &&...
msDefn.IsVolatile && ...
::GenCPP
%endfunction
%function FcnIsCurrentRecordPreemptPrevRecord(currRecord, prevRecord) void
%if (ISFIELD(currRecord, "IsAtRootInputOrOutput") && ...
currRecord.IsAtRootInputOrOutput == TLC_TRUE)
%if LibGetRecordWidth">LibGetRecordWidth(prevRecord) <= LibGetRecordWidth">LibGetRecordWidth(currRecord) || ...
!ISFIELD(prevRecord, "IsAtRootInputOrOutput")
%return TLC_TRUE
%endif
%elseif ((LibGetRecordWidth">LibGetRecordWidth(prevRecord) <= LibGetRecordWidth">LibGetRecordWidth(currRecord) || ...
ISFIELD(prevRecord, "ReuseBufferName")) && ...
!ISFIELD(currRecord, "ReuseBufferName") && ...
!ISFIELD(prevRecord, "IsAtRootInputOrOutput"))
%return TLC_TRUE
%endif
%return TLC_FALSE
%endfunction
%function FcnAddCustomData(record) void
%assign gmm = GlobalMemoryMap
%assign packageName = LibGetRTWInfoObjectPackage(record)
%assign className = LibGetCustomStorageClassName(record)
%assign classIdx = SLibGetCustomStorageIdxInMap(packageName, className)
%if classIdx == -1
%assign cscDefn = SLibGetCSCDefForName(packageName, className)
%assign memSecName = cscDefn.MemorySection
%assign msDefn = SLibGetMemorySectionDefForName(cscDefn.MSPackage, memSecName)
%assign genType = SLibGetGenerateTypeForName(packageName, className)
%foreach idx = NumCustomStorageClasses
%if (CustomStorageClass[idx].Package == packageName && ...
CustomStorageClass[idx].Name == className)
%addtorecord CustomStorageClass[idx] /
CSCDefaults { /
CSCDefn cscDefn /
MSDefn msDefn /
GenType genType /
}
%assign rtwRecord = CustomStorageClass[idx]
%break
%endif
%endforeach
%addtorecord gmm /
CustomData { /
Name className; /
Package packageName; /
NumData 0 ; /
Version 1; /
RTWRecord rtwRecord; /
FullName "%<packageName>::%<className>"; /
RecordType "CustomStorageClassInMap" /
DataDefaults { /
Access "direct" /
Scope "global" /
Class "scalar" /
DataTypeIdx 0 /
HasObject TLC_TRUE /
IsComplex TLC_FALSE /
IsFixedPoint TLC_FALSE /
IsStruct TLC_FALSE /
Permission "rw" /
PPIf "" /
PPEndIf "" /
Type "parameter" /
} /
}
%assign classIdx = gmm.NumCustomData
%assign gmm.NumCustomData = gmm.NumCustomData + 1
%if !ISFIELD(gmm.CustomDataIndexHash, packageName)
%addtorecord gmm.CustomDataIndexHash %<packageName> {}
%endif
%addtorecord gmm.CustomDataIndexHash.%<packageName> %<className> classIdx
%assign csc = gmm.CustomData[classIdx]
%assign dummyScope = csc
%if GENERATE_TYPE_FUNCTION_EXISTS(dummyScope, "Version", genType)
%assign csc.Version = GENERATE_TYPE(rtwRecord, "Version", genType)
%endif
%else
%assign csc = gmm.CustomData[classIdx]
%endif
%assign cscDefn = csc.RTWRecord.CSCDefaults.CSCDefn
%addtorecord record CSCDefn cscDefn
%assign msDefn = csc.RTWRecord.CSCDefaults.MSDefn
%assign customAttrProps = LibGetCustomStorageAttributes(record)
%assign msName = /
LibGetInstanceSpecificProp(cscDefn, customAttrProps, "MemorySection")
%if (msDefn.Name != msName)
%assign msDefn = SLibGetMemorySectionDefForName(cscDefn.MSPackage, msName)
%endif
%addtorecord record MSDefn msDefn
%addtorecord record GenerateType csc.RTWRecord.CSCDefaults.GenType
%assign cscDataNames = FIELDNAMES(csc.RTWRecord.Data)
%assign numData = SIZE(cscDataNames)[1]
%assign currRecordName = LibGetRecordIdentifier(record)
%if numData > 0 && !SLibGetIsReusable(record)
%foreach dataIdx = numData
%assign dataName = cscDataNames[dataIdx]
%if (dataName == currRecordName)
%assign currRecordName = currRecordName + "_"
%endif
%endforeach
%endif
%addtorecord csc.RTWRecord.Data %<currRecordName> record
%assign prevRecord = csc.RTWRecord.Data.%<currRecordName>
%if FcnIsCurrentRecordPreemptPrevRecord(record, prevRecord)
%assign csc.RTWRecord.Data.%<currRecordName> = record
%endif
%assign record.CustomStorageClassVersion = csc.Version
%if record.CustomStorageClassVersion == -1
%addtorecord record InstanceSpecificVersion TLC_TRUE
%assign record.CustomStorageClassVersion = LibCustomData(record, "version", "", "")
%endif
%assign name = LibGetRecordIdentifier(record)
%assign dataTypeIdx = LibGetRecordDataTypeId(record)
%assign isFixedPoint = DataTypes.DataType[dataTypeIdx].IsFixedPoint
%assign isComplex = LibGetRecordIsComplex(record)
%assign reim = isComplex ? ".%<tRealPart>" : ""
%assign baseIndex = LibGetRecordWidth(record) == 1 ? "" : "[0]"
%assign dataLayout = LibCustomData(record, "layout", "", "")
%assign dataScope = SLibGetDataScope(record.CSCDefn, record)
%assign dataAccess = SLibGetDataAccess(record.CSCDefn, record)
%if (dataAccess == "Pointer")
%assign baseAddr = "&(%<name>)"
%else
%assign baseAddr = LibCustomData(record, "address", baseIndex, reim)
%endif
%switch record.RecordType
%case "BlockOutput"
%assign type = "signal"
%assign permission = record.Invariant == "no" ? "rw" : "ro"
%addtorecord gmm.ModelParameters.SignalInstanceCache %<name> record
%break
%case "ExternalInput"
%case "ExternalOutput"
%assign type = "signal"
%assign permission = "rw"
%addtorecord gmm.ModelParameters.SignalInstanceCache %<name> record
%break
%case "DWork"
%assign type = record.UsedAs == "DSTATE" ? "state" : "unknown"
%assign permission = "ro"
%addtorecord gmm.ModelParameters.SignalInstanceCache %<name> record
%break
%case "ModelParameter"
%assign type = "parameter"
%assign permission = "rw"
%break
%case "ZcSignalInfo"
%assign type = "signal"
%assign permission = "rw"
%break
%case "MachineData"
%<LibReportFatalError("custom storage class not supported for /
stateflow machine data")>
%default
%<LibReportFatalError("unknown record type: %<record.RecordType>")>
%endswitch
%if (msDefn.Name == "unknown")
%assign tq = LibCustomData(record, "qualifier", "", "")
%else
%if SLibIsBusVolatileCPP(record,msDefn)
%assign errTxt = "Signal '%<record.SigLabel>' is a bus signal with " + ...
"'volatile' custom storage class. This is not " + ...
"supported when the target language " + ...
"is 'C++'. Consider removing the 'volatile' custom " + ...
"storage class, or changing the target language to " + ...
"'C', or avoiding using the bus."
%<LibReportFatalError(errTxt)>
%elseif (isComplex && msDefn.IsVolatile && GenCPP)
%assign errTxt = "'%<name>' is complex with a 'volatile' " + ...
"custom storage class. This is not supported " + ...
"when the target language is 'C++'. " + ...
"Consider removing the 'volatile' custom storage " + ...
"class, or changing the target language to 'C', " + ...
"or avoiding using '%<name>'."
%<LibReportFatalError(errTxt)>
%endif
%assign tq = SLibGetQualifier(msDefn)
%endif
%if !WHITE_SPACE(tq)
%switch record.RecordType
%case "BlockOutput"
%case "ExternalInput"
%case "ExternalOutput"
%case "DWork"
%case "ZcSignalInfo"
%assign tqName = "StorageTypeQualifier"
%break
%case "ModelParameter"
%assign tqName = "TypeQualifier"
%break
%case "MachineData"
%<LibReportFatalError("custom storage class not supported for /
stateflow machine data")>
%default
%<LibReportFatalError("unknown record type: %<record.RecordType>")>
%endswitch
%<SETFIELD(record, tqName, tq)>
%endif
%assign class = dataLayout[0]
%if class == "other"
%assign nDims = -1
%assign dims = []
%else
%assign nDims = dataLayout[1]
%assign dims = dataLayout[2]
%endif
%addtorecord csc /
Data { /
Name name; /
BaseAddr baseAddr; /
NumDimensions nDims /
}
%if SLibIsRecordSupportedForSymbolicDimensions(record) && ...
LibRecordHasSymbolicWidth(record)
%addtorecord csc.Data[csc.NumData] HasSymbolicDim TLC_TRUE
%endif
%if dataAccess == "Pointer"
%assign csc.Data[csc.NumData].Access = "indirect"
%elseif (dataAccess == "unknown")
%assign csc.Data[csc.NumData].Access = "unknown"
%endif
%assign resolvedScope = FcnVerifyDataScope(record, dataScope)
%assign csc.Data[csc.NumData].Scope = resolvedScope[0]
%if class != "scalar"
%assign csc.Data[csc.NumData].Class = class
%endif
%if dataTypeIdx > 0
%assign csc.Data[csc.NumData].DataTypeIdx = dataTypeIdx
%endif
%if isComplex
%assign csc.Data[csc.NumData].IsComplex = isComplex
%endif
%if isFixedPoint
%assign csc.Data[csc.NumData].IsFixedPoint = isFixedPoint
%<FcnAddFixedPointInfo(csc.Data[csc.NumData], record)>
%endif
%if permission != "rw"
%assign csc.Data[csc.NumData].Permission = permission
%endif
%if type != "parameter"
%assign csc.Data[csc.NumData].Type = type
%endif
%if nDims > 2
%addtorecord csc.Data[csc.NumData] Dimensions dims
%elseif nDims > 0
%addtorecord csc.Data[csc.NumData] NumRows CAST("Number", dims[0])
%addtorecord csc.Data[csc.NumData] NumCols CAST("Number", dims[1])
%endif
%assign vcRecord = SLibGetDataInlineVariantNetConditions(record)
%if !WHITE_SPACE(vcRecord.ifCond)
%addtorecord csc.Data[csc.NumData] PPIf vcRecord.ifCond
%addtorecord csc.Data[csc.NumData] PPEndIf vcRecord.endIfCond
%endif
%if ISFIELD(record,"isActiveDuringCodegen")
%addtorecord csc.Data[csc.NumData] isActiveDuringCodegen record.isActiveDuringCodegen
%endif
%if ISFIELD(record, "HasStructCSCElement")
%addtorecord csc.Data[csc.NumData] HasStructCSCElement record.HasStructCSCElement
%endif
%if record.RecordType == "ModelParameter"
%assign idNum = IDNUM(record.LogicalSrc)
%addtorecord csc.Data[csc.NumData] Value SLibGetValueFromParamRec(record, TLC_FALSE)
%addtorecord csc.Data[csc.NumData] IsTransformed 0
%addtorecord csc.Data[csc.NumData] SL_LogicalSrc idNum[1]
%addtorecord csc.Data[csc.NumData] SL_ExtModeType "parameter"
%endif
%if record.RecordType == "BlockOutput"
%assign idNum = IDNUM(record.LogicalSrc)
%addtorecord csc.Data[csc.NumData] SL_LogicalSrc idNum[1]
%addtorecord csc.Data[csc.NumData] SL_ExtModeType "signal"
%endif
%if record.RecordType == "DWork"
%assign idNum = IDNUM(record.LogicalSrc)
%addtorecord csc.Data[csc.NumData] SL_LogicalSrc idNum[1]
%addtorecord csc.Data[csc.NumData] SL_ExtModeType "dwork"
%endif
%if record.RecordType == "ExternalInput"
%addtorecord csc.Data[csc.NumData] SL_ExtModeType "signal"
%endif
%if record.RecordType == "ExternalOutput"
%addtorecord csc.Data[csc.NumData] SL_ExtModeType "signal"
%endif
%if record.HasObject
%addtorecord csc.Data[csc.NumData] Object record.Object
%else
%assign csc.Data[csc.NumData].HasObject = TLC_FALSE
%endif
%<FcnAddBusStructure(csc.Data[csc.NumData], dataTypeIdx)>
%addtorecord csc.Data[csc.NumData] RTWRecord record
%assign csc.NumData = csc.NumData + 1
%return csc.NumData-1
%endfunction
%function FcnAddUnstructuredData(record) void
%assign gmm = GlobalMemoryMap
%assign usd = gmm.UnstructuredData
%assign isDefinedDefault = usd.DataDefaults.IsDefined
%assign isDefined = isDefinedDefault
%if SLibIsCoderGroupUseAccessFcnForDataRecord(record) && record.RecordType == "ModelParameter"
%return usd.NumData
%endif
%switch record.RecordType
%case "BlockOutput"
%assign bo = record
%assign dataTypeIdx = LibGetRecordDataTypeId(bo)
%assign isComplex = LibGetRecordIsComplex(bo)
%assign isFixedPoint = DataTypes.DataType[dataTypeIdx].IsFixedPoint
%assign dataLayout = SLibGetDataLayout(bo)
%assign reim = isComplex ? ".%<tRealPart>" : ""
%assign name = LibGetRecordIdentifier(bo)
%assign isPointer = bo.StorageClass == "ImportedExternPointer" ? ...
TLC_TRUE : TLC_FALSE
%if (isPointer)
%assign baseAddr = "&(%<name>)"
%else
%assign baseAddr = "&%<name>%%<reim>"
%endif
%assign isDefined = ISEQUAL(bo.StorageClass, "ExportedGlobal") && ...
ISEQUAL(bo.DrivesModelRefRootOutport, "no")
%assign vardimsBaseAddr = SLibGetNullDefinitionFromTfl()
%if SLibGetArgIsVarDims(bo)
%if SLibGetArgUseCanDimSizeDW(bo)
%assign baseSysIdx = GetBaseSystemIdx()
%assign cdwIdx = SLibGetCanDimSizeDWIdxForArg(bo)
%assign canDWork = System[baseSysIdx].Interface.CanonicalDWorkArgDef[cdwIdx]
%assign vardimsBaseAddr = "&%<LibGetRecordIdentifier(canDWork)>[0]"
%assign vardimsKey = "CANDW%<cdwIdx>"
%else
%assign vardimsBaseAddr = "%<SLibGetDimSizeDWorkFullPath(bo.DimSizeDWork)>"
%assign vardimsKey = "DIMDW%<bo.DimSizeDWork>"
%endif
%endif
%assign type = "signal"
%assign permission = bo.Invariant == "no" ? "rw" : "ro"
%addtorecord gmm.ModelParameters.SignalInstanceCache %<name> bo
%break
%case "ExternalInput"
%assign ei = record
%assign dataTypeIdx = LibGetRecordDataTypeId(ei)
%assign isComplex = LibGetRecordIsComplex(ei)
%assign isFixedPoint = DataTypes.DataType[dataTypeIdx].IsFixedPoint
%assign dataLayout = SLibGetDataLayout(ei)
%assign reim = isComplex ? ".%<tRealPart>" : ""
%assign name = LibGetRecordIdentifier(ei)
%if (MultiInstanceERTCode && (ei.StorageClass == "Auto"))
%assign name = "%<LibGetExternalInputStruct()>%<UQualifier>%<name>"
%assign isDefined = TLC_FALSE
%endif
%assign isPointer = ei.StorageClass == "ImportedExternPointer" ? ...
TLC_TRUE : TLC_FALSE
%if (isPointer)
%assign baseAddr = "&(%<name>)"
%else
%assign baseAddr = "&%<name>%%<reim>"
%endif
%assign isDefined = isDefined && ISEQUAL(ei.StorageClass, "ExportedGlobal")
%assign vardimsBaseAddr = SLibGetNullDefinitionFromTfl()
%if SLibGetExternalIOIsVarDims(ei)
%assign baseSysIdx = GetBaseSystemIdx()
%assign cdwIdx = SLibGetCanDimSizeDWIdxForArg(ei)
%assign canDWork = System[baseSysIdx].Interface.CanonicalDWorkArgDef[cdwIdx]
%assign vardimsBaseAddr = "&%<LibGetRecordIdentifier(canDWork)>[0]"
%assign vardimsKey = "CANDW%<cdwIdx>"
%endif
%assign type = "signal"
%assign permission = "rw"
%addtorecord gmm.ModelParameters.SignalInstanceCache %<LibGetRecordIdentifier(ei)> ei
%break
%case "ExternalOutput"
%assign eo = record
%assign dataTypeIdx = LibGetRecordDataTypeId(eo)
%assign isComplex = LibGetRecordIsComplex(eo)
%assign isFixedPoint = DataTypes.DataType[dataTypeIdx].IsFixedPoint
%assign dataLayout = SLibGetDataLayout(eo)
%assign reim = isComplex ? ".%<tRealPart>" : ""
%assign name = LibGetRecordIdentifier(eo)
%assign isPointer = eo.StorageClass == "ImportedExternPointer" ? ...
TLC_TRUE : TLC_FALSE
%if (isPointer)
%assign baseAddr = "&(%<name>)"
%else
%assign baseAddr = "&%<name>%%<reim>"
%endif
%assign isDefined = isDefined && ISEQUAL(eo.StorageClass, "ExportedGlobal")
%assign vardimsBaseAddr = SLibGetNullDefinitionFromTfl()
%assign type = "signal"
%assign permission = "rw"
%addtorecord gmm.ModelParameters.SignalInstanceCache %<LibGetRecordIdentifier(eo)> eo
%break
%case "DWork"
%assign dwRec = record
%assign dataTypeIdx = SLibDWorkDataTypeId(dwRec)
%assign isComplex = SLibDWorkIsComplex(dwRec)
%assign isFixedPoint = DataTypes.DataType[dataTypeIdx].IsFixedPoint
%assign dataLayout = SLibGetDataLayout(dwRec)
%assign reim = isComplex ? ".%<tRealPart>" : ""
%assign name = LibGetRecordIdentifier(dwRec)
%assign isPointer = dwRec.StorageClass == "ImportedExternPointer" ? ...
TLC_TRUE : TLC_FALSE
%if (isPointer)
%assign baseAddr = "&(%<name>)"
%else
%assign baseAddr = "&%<name>%%<reim>"
%endif
%assign isDefined = (ISEQUAL(dwRec.StorageClass, "ExportedGlobal") && ...
( (isDefined && ISEQUAL(dwRec.UsedAs, "DWORK")) || ...
ISEQUAL(dwRec.UsedAs, "DSTATE") ) )
%assign vardimsBaseAddr = SLibGetNullDefinitionFromTfl()
%assign type = dwRec.UsedAs == "DSTATE" ? "state" : "unknown"
%assign permission = "ro"
%addtorecord gmm.ModelParameters.SignalInstanceCache %<name> dwRec
%break
%case "ModelParameter"
%assign mdlParam = record
%assign dataTypeIdx = LibGetRecordDataTypeId(mdlParam)
%assign isComplex = LibGetRecordIsComplex(mdlParam)
%assign isFixedPoint = DataTypes.DataType[dataTypeIdx].IsFixedPoint
%assign name = LibGetRecordIdentifier(mdlParam)
%assign reim = isComplex ? ".%<tRealPart>" : ""
%assign dataLayout = SLibGetDataLayout(mdlParam)
%assign isPointer = mdlParam.StorageClass == "ImportedExternPointer" ? ...
TLC_TRUE : TLC_FALSE
%assign isDefined = isDefined && ...
ISEQUAL(mdlParam.StorageClass, "ExportedGlobal")
%if (isPointer)
%assign baseAddr = "&(%<name>)"
%else
%assign baseAddr = LibModelParameterAddr(mdlParam,"","",0)
%endif
%assign vardimsBaseAddr = SLibGetNullDefinitionFromTfl()
%assign type = "parameter"
%assign permission = "rw"
%break
%case "MachineData"
%assign sfInfo = record
%assign dataTypeIdx = SLibGetIdFromMLDataType(sfInfo.DataType)
%assign isFixedPoint = 0
%assign name = sfInfo.Name
%assign isComplex = 0
%assign reim = ""
%assign dataLayout = SLibGetDataLayout(sfInfo)
%assign baseAddr = "&%<name>%%<reim>"
%assign vardimsBaseAddr = SLibGetNullDefinitionFromTfl()
%assign type = "data"
%assign isPointer = TLC_FALSE
%assign access = "direct"
%assign permission = "rw"
%assign isDefined = ISEQUAL(sfInfo.Scope, "Exported")
%break
%default
%<LibReportFatalError("unknown record type: %<record.RecordType>")>
%endswitch
%assign class = dataLayout[0]
%assign nDims = dataLayout[1]
%assign dims = dataLayout[2]
%addtorecord usd /
Data { /
Name name /
BaseAddr baseAddr /
}
%if (isPointer)
%assign usd.Data[usd.NumData].Access = "indirect"
%endif
%if class != "scalar"
%assign usd.Data[usd.NumData].Class = class
%endif
%if dataTypeIdx > 0
%assign usd.Data[usd.NumData].DataTypeIdx = dataTypeIdx
%endif
%if isComplex
%assign usd.Data[usd.NumData].IsComplex = isComplex
%endif
%if isFixedPoint
%assign usd.Data[usd.NumData].IsFixedPoint = isFixedPoint
%<FcnAddFixedPointInfo(usd.Data[usd.NumData], record)>
%endif
%if (isDefinedDefault != isDefined)
%assign usd.Data[usd.NumData].IsDefined = isDefined
%endif
%if vardimsBaseAddr != SLibGetNullDefinitionFromTfl()
%addtorecord usd.Data[usd.NumData] IsVarDims TLC_TRUE
%addtorecord usd.Data[usd.NumData] VarDimsBaseAddr vardimsBaseAddr
%addtorecord usd.Data[usd.NumData] VarDimsKey vardimsKey
%else
%addtorecord usd.Data[usd.NumData] IsVarDims TLC_FALSE
%endif
%if SLibIsRecordSupportedForSymbolicDimensions(record) && ...
LibRecordHasSymbolicWidth(record)
%addtorecord usd.Data[usd.NumData] HasSymbolicDim TLC_TRUE
%endif
%if nDims > 2
%addtorecord usd.Data[usd.NumData] Dimensions dims
%assign usd.Data[usd.NumData].NumDimensions = nDims
%else
%if dims[0] > 1
%assign usd.Data[usd.NumData].NumRows = CAST("Number", dims[0])
%endif
%if dims[1] > 1
%assign usd.Data[usd.NumData].NumCols = CAST("Number", dims[1])
%endif
%endif
%if permission != "rw"
%assign usd.Data[usd.NumData].Permission = permission
%endif
%if type != "parameter"
%assign usd.Data[usd.NumData].Type = type
%endif
%assign vcRecord = SLibGetDataInlineVariantNetConditions(record)
%if !WHITE_SPACE(vcRecord.ifCond)
%addtorecord usd.Data[usd.NumData] PPIf vcRecord.ifCond
%addtorecord usd.Data[usd.NumData] PPEndIf vcRecord.endIfCond
%endif
%if record.RecordType == "ModelParameter"
%assign idNum = IDNUM(mdlParam.LogicalSrc)
%addtorecord usd.Data[usd.NumData] Value SLibGetValueFromParamRec(mdlParam, TLC_FALSE)
%addtorecord usd.Data[usd.NumData] IsTransformed 0
%addtorecord usd.Data[usd.NumData] SL_LogicalSrc idNum[1]
%addtorecord usd.Data[usd.NumData] SL_ExtModeType "parameter"
%endif
%if record.RecordType == "BlockOutput"
%assign idNum = IDNUM(bo.LogicalSrc)
%addtorecord usd.Data[usd.NumData] SL_LogicalSrc idNum[1]
%addtorecord usd.Data[usd.NumData] SL_ExtModeType "signal"
%endif
%if record.RecordType == "DWork"
%assign idNum = IDNUM(dwRec.LogicalSrc)
%addtorecord usd.Data[usd.NumData] SL_LogicalSrc idNum[1]
%addtorecord usd.Data[usd.NumData] SL_ExtModeType "dwork"
%endif
%if record.RecordType == "ExternalInput"
%addtorecord usd.Data[usd.NumData] SL_ExtModeType "signal"
%endif
%if record.RecordType == "ExternalOutput"
%addtorecord usd.Data[usd.NumData] SL_ExtModeType "signal"
%endif
%if record.RecordType == "MachineData"
%addtorecord usd.Data[usd.NumData] SL_ExtModeType "machineData"
%endif
%<FcnAddObjectProperties(usd.Data[usd.NumData], record)>
%<FcnAddBusStructure(usd.Data[usd.NumData], dataTypeIdx)>
%assign size = FcnComputeSizeFromDims(dims,isComplex)
%assign usd.NumData = usd.NumData + 1
%assign usd.NumTotalElements = usd.NumTotalElements + size
%return usd.NumData-1
%endfunction
%function FcnAddStructuredData(structure, section, record) void
%switch record.RecordType
%case "BlockOutput"
%assign bo = record
%assign dataTypeIdx = LibGetRecordDataTypeId(bo)
%assign isComplex = LibGetRecordIsComplex(bo)
%assign isFixedPoint = DataTypes.DataType[dataTypeIdx].IsFixedPoint
%assign dataLayout = SLibGetDataLayout(bo)
%assign isInvariant = bo.Invariant == "yes"
%assign baseSysIdx = GetBaseSystemIdx()
%assign name = ...
SLibGetBlockOutputIdentifierFromRecord(bo, baseSysIdx)
%assign type = "signal"
%assign permission = isInvariant ? "ro" : "rw"
%assign vardimsBaseAddr = SLibGetNullDefinitionFromTfl()
%if SLibGetArgIsVarDims(bo)
%if SLibGetArgUseCanDimSizeDW(bo)
%assign cdwIdx = SLibGetCanDimSizeDWIdxForArg(bo)
%assign canDWork = System[bo.SysNum-1].Interface.CanonicalDWorkArgDef[cdwIdx]
%assign vardimsBaseAddr = "&%<LibGetRecordIdentifier(canDWork)>[0]"
%assign vardimsKey = "CANDW%<cdwIdx>"
%else
%assign vardimsName = "%<SLibGetBlockOutputVarDimsIdentifierFromRecord(bo.DimSizeDWork, baseSysIdx)>"
%assign dworkRec = ::CompiledModel.DWorks.DWork[bo.DimSizeDWork]
%assign vardimsLayout = SLibGetDataLayout(dworkRec)
%assign vardimsBaseAddr = "&%<vardimsName>%"
%assign vardimsKey = "DIMDW%<bo.DimSizeDWork>"
%endif
%endif
%break
%case "ExternalInput"
%assign ei = record
%assign dataTypeIdx = LibGetRecordDataTypeId(ei)
%assign isComplex = LibGetRecordIsComplex(ei)
%assign isFixedPoint = DataTypes.DataType[dataTypeIdx].IsFixedPoint
%assign dataLayout = SLibGetDataLayout(ei)
%assign name = FcnGetVarGroupElementPathFromRecord(ei)
%assign type = "signal"
%assign permission = "rw"
%assign vardimsBaseAddr = SLibGetNullDefinitionFromTfl()
%if SLibGetExternalIOIsVarDims(ei)
%assign baseSysIdx = GetBaseSystemIdx()
%assign cdwIdx = SLibGetCanDimSizeDWIdxForArg(arg)
%assign canDWork = System[baseSysIdx].Interface.CanonicalDWorkArgDef[cdwIdx]
%assign vardimsBaseAddr = "&%<LibGetRecordIdentifier(canDWork)>[0]"
%assign vardimsKey = "CANDW%<cdwIdx>"
%endif
%break
%case "ExternalOutput"
%assign eo = record
%assign sysIdx = eo.Block[0]
%assign blkIdx = eo.Block[1]
%assign oblock = System[sysIdx].Block[blkIdx]
%assign ip = oblock.DataInputPort
%assign dataTypeIdx = LibGetRecordDataTypeId(ip)
%assign isComplex = LibGetRecordIsComplex(ip)
%assign isFixedPoint = 0
%assign dataLayout = SLibGetDataLayout(eo)
%assign name = FcnGetVarGroupElementPathFromRecord(eo)
%assign type = "signal"
%assign permission = "ro"
%assign vardimsBaseAddr = SLibGetNullDefinitionFromTfl()
%if ISFIELD(eo, "HasVarDims") && (eo.HasVarDims == 1) && ISFIELD(eo, "SizeVarGroupIdx")
%assign varGroupMemberType = SLibVarGroupElementType(eo.SizeVarGroupIdx[0], eo.SizeVarGroupIdx[1])
%assign varGroupMemberTypeName = LibCGTypeName(varGroupMemberType)
%if varGroupMemberTypeName != "int32_T"
%assign errTxt = "Unhandled condition for C API Root IO: ExternalOutput is a bus object that contains variable dimension elements"
%<LibReportError(errTxt)>
%endif
%assign baseSysIdx = GetBaseSystemIdx()
%assign vardimsName = "%<SLibGetExternalOutputVarDimsIdentifierFromRecord(eo.SizeVarGroupIdx, baseSysIdx)>"
%assign vardimsBaseAddr = "&%<vardimsName>"
%assign vardimsKey = "VG%"
%endif
%break
%case "ModelParameter"
%assign mdlParam = record
%assign idNum = IDNUM(mdlParam.LogicalSrc)
%assign mdlParamIdx = idNum[1]
%assign dataTypeIdx = LibGetRecordDataTypeId(mdlParam)
%assign isComplex = LibGetRecordIsComplex(mdlParam)
%assign isFixedPoint = DataTypes.DataType[dataTypeIdx].IsFixedPoint
%assign dataLayout = SLibGetDataLayout(mdlParam)
%if ISFIELD(mdlParam, "InstanceSpecific") && mdlParam.InstanceSpecific && !ISFIELD(mdlParam, "VarGroupIdx")
%assign name = SLibGetGroupedParamQualifiedIdentifier(mdlParam)
%else
%assign name = FcnGetAutoParamIdentifier(mdlParam)
%endif
%assign type = "parameter"
%if mdlParam.IsSfcnSizePrm || ...
mdlParamIdx >= NumInrtP
%assign permission = "ro"
%else
%assign permission = "rw"
%endif
%assign vardimsBaseAddr = SLibGetNullDefinitionFromTfl()
%assign vcRecord = SLibGetDataInlineVariantNetConditions(record)
%break
%case "DWork"
%assign dwRec = record
%assign dataTypeIdx = SLibDWorkDataTypeId(dwRec)
%assign isComplex = SLibDWorkIsComplex(dwRec)
%assign isFixedPoint = DataTypes.DataType[dataTypeIdx].IsFixedPoint
%assign dataLayout = SLibGetDataLayout(dwRec)
%assign baseSysIdx = GetBaseSystemIdx()
%assign name = FcnGetDWorkIdentifier(dwRec, baseSysIdx)
%assign type = dwRec.UsedAs == "DSTATE" ? "state" : "unknown"
%assign permission = "ro"
%assign vardimsBaseAddr = SLibGetNullDefinitionFromTfl()
%break
%case "ChartData"
%assign chartData = record
%assign dataTypeIdx = chartData.DataTypeIdx
%assign isComplex = chartData.IsComplex
%assign isFixedPoint = 0
%assign dataLayout = SLibGetDataLayout(chartData)
%assign baseSysIdx = GetBaseSystemIdx()
%assign dwRec = chartData.DWork
%assign dwid = FcnGetDWorkIdentifier(dwRec, baseSysIdx)
%assign name = dwid + "." + chartData.Name
%assign type = "unknown"
%assign permission = "ro"
%assign vardimsBaseAddr = SLibGetNullDefinitionFromTfl()
%break
%case "ContState"
%assign cStateRec = record
%assign dataTypeIdx = 0
%assign isComplex = 0
%assign isFixedPoint = 0
%assign dataLayout = SLibGetDataLayout(cStateRec)
%assign baseSysIdx = GetBaseSystemIdx()
%assign name = FcnGetCStateIdentifier(cStateRec, baseSysIdx)
%assign type = "state"
%assign permission = "ro"
%assign vardimsBaseAddr = SLibGetNullDefinitionFromTfl()
%break
%default
%<LibReportFatalError("unknown section type.")>
%endswitch
%assign class = dataLayout[0]
%assign nDims = dataLayout[1]
%assign dims = dataLayout[2]
%assign reim = isComplex ? ".%<tRealPart>" : ""
%if SLibIsContainerCGTypeND(record)
%assign recNumDims = LibCGTypeNumDimensions(SLibGetRecordContainerCGTypeIdx(record))
%assign id = LibGetAddressOfFirstElement(name, recNumDims)
%assign baseAddr = "&%<id>%%<reim>"
%else
%assign baseAddr = "&%<name>%%<reim>"
%endif
%if (structure.Name == "StateDerivatives")
%assign name = "%<RTMGet("dX")>[%<section.OffsetCounter>]"
%assign baseAddr = "&(%<name>)"
%assign type = "stateDerivative"
%endif
%with structure
%addtorecord section /
Data { /
Name name; /
BaseAddr baseAddr; /
OffsetFromBaseAddr section.OffsetCounter /
}
%if class != "scalar"
%assign section.Data[section.NumData].Class = class
%endif
%if isFixedPoint
%assign section.Data[section.NumData].IsFixedPoint = TLC_TRUE
%<FcnAddFixedPointInfo(section.Data[section.NumData], record)>
%endif
%if vardimsBaseAddr != SLibGetNullDefinitionFromTfl()
%addtorecord section.Data[section.NumData] IsVarDims TLC_TRUE
%addtorecord section.Data[section.NumData] VarDimsBaseAddr vardimsBaseAddr
%addtorecord section.Data[section.NumData] VarDimsKey vardimsKey
%else
%addtorecord section.Data[section.NumData] IsVarDims TLC_FALSE
%endif
%if SLibIsRecordSupportedForSymbolicDimensions(record) && ...
LibRecordHasSymbolicWidth(record)
%addtorecord section.Data[section.NumData] HasSymbolicDim TLC_TRUE
%endif
%if nDims > 2
%addtorecord section.Data[section.NumData] Dimensions dims
%assign section.Data[section.NumData].NumDimensions = nDims
%else
%if dims[0] > 1
%assign section.Data[section.NumData].NumRows = CAST("Number", dims[0])
%endif
%if dims[1] > 1
%assign section.Data[section.NumData].NumCols = CAST("Number", dims[1])
%endif
%endif
%if permission != "rw"
%assign section.Data[section.NumData].Permission = permission
%endif
%if type != structure.DataDefaults.Type
%assign section.Data[section.NumData].Type = type
%endif
%if record.RecordType == "ModelParameter"
%if !WHITE_SPACE(vcRecord.ifCond)
%addtorecord section.Data[section.NumData] PPIf vcRecord.ifCond
%addtorecord section.Data[section.NumData] PPEndIf vcRecord.endIfCond
%endif
%else
%assign vcRecord = SLibGetDataInlineVariantNetConditions(record)
%if !WHITE_SPACE(vcRecord.ifCond)
%addtorecord section.Data[section.NumData] PPIf vcRecord.ifCond
%addtorecord section.Data[section.NumData] PPEndIf vcRecord.endIfCond
%endif
%endif
%if record.RecordType == "ModelParameter"
%assign idNum = IDNUM(mdlParam.LogicalSrc)
%addtorecord section.Data[section.NumData] Value SLibGetValueFromParamRec(mdlParam, TLC_FALSE)
%addtorecord section.Data[section.NumData] IsTransformed mdlParam.Transformed
%addtorecord section.Data[section.NumData] SL_LogicalSrc idNum[1]
%addtorecord section.Data[section.NumData] SL_ExtModeType "parameter"
%endif
%if record.RecordType == "BlockOutput"
%assign idNum = IDNUM(bo.LogicalSrc)
%addtorecord section.Data[section.NumData] SL_LogicalSrc idNum[1]
%addtorecord section.Data[section.NumData] SL_ExtModeType "signal"
%endif
%if record.RecordType == "DWork"
%assign idNum = IDNUM(dwRec.LogicalSrc)
%addtorecord section.Data[section.NumData] SL_LogicalSrc idNum[1]
%addtorecord section.Data[section.NumData] SL_ExtModeType "dwork"
%endif
%if record.RecordType == "ExternalInput"
%addtorecord section.Data[section.NumData] SL_ExtModeType "signal"
%endif
%<FcnAddObjectProperties(section.Data[section.NumData], record)>
%<FcnAddBusStructure(section.Data[section.NumData], section.DataTypeIdx)>
%assign size = FcnComputeSizeFromDims(dims,isComplex)
%assign section.NumData = section.NumData + 1
%assign section.NumElements = section.NumElements + size
%assign structure.NumTotalElements = structure.NumTotalElements + size
%if LibIsStringDataType(dataTypeIdx)
%assign section.OffsetCounter = section.OffsetCounter + 1
%else
%assign section.OffsetCounter = section.OffsetCounter + size
%endif
%endwith
%return section.NumData-1
%endfunction
%function FcnGetVarGroupElementPathFromRecord(record) void
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[record.VarGroupIdx[0]]
%assign elementpath = SLibCG_GetVarGroupElementPath(record.VarGroupIdx, varGroup.SysIdx, System[varGroup.SysIdx].CrossNoArgFcnBound)
%return elementpath
%endfunction
%function FcnAddSection(structure, record) void
%switch record.RecordType
%case "BlockOutput"
%assign bo = record
%assign dataTypeIdx = LibGetRecordDataTypeId(bo)
%assign isComplex = LibGetRecordIsComplex(bo)
%assign reim = isComplex ? ".%<tRealPart>" : ""
%assign dataLayout = SLibGetDataLayout(bo)
%assign isInvariant = bo.Invariant == "yes"
%assign baseSysIdx = GetBaseSystemIdx()
%assign name = ...
SLibGetBlockOutputIdentifierFromRecord(bo, baseSysIdx)
%if SLibIsContainerCGTypeND(bo)
%assign recNumDims = LibCGTypeNumDimensions(SLibGetRecordContainerCGTypeIdx(bo))
%assign id = LibGetAddressOfFirstElement(name, recNumDims)
%assign baseAddr = "&%<id>%%<reim>"
%else
%assign baseAddr = "&%<name>%%<reim>"
%endif
%break
%case "ExternalInput"
%assign ei = record
%assign dataTypeIdx = LibGetRecordDataTypeId(ei)
%assign isComplex = LibGetRecordIsComplex(ei)
%assign reim = isComplex ? ".%<tRealPart>" : ""
%assign dataLayout = SLibGetDataLayout(ei)
%assign name = FcnGetVarGroupElementPathFromRecord(ei)
%assign baseAddr = "&%<name>%%<reim>"
%break
%case "ExternalOutput"
%assign eo = record
%assign sysIdx = eo.Block[0]
%assign blkIdx = eo.Block[1]
%assign oblock = System[sysIdx].Block[blkIdx]
%assign ip = oblock.DataInputPort
%assign dataTypeIdx = LibGetRecordDataTypeId(ip)
%assign isComplex = LibGetRecordIsComplex(ip)
%assign reim = isComplex ? ".%<tRealPart>" : ""
%assign dataLayout = SLibGetDataLayout(eo)
%assign name = FcnGetVarGroupElementPathFromRecord(eo)
%assign baseAddr = "&%<name>%%<reim>"
%break
%case "ModelParameter"
%assign mdlParam = record
%assign dataTypeIdx = LibGetRecordDataTypeId(mdlParam)
%assign isComplex = LibGetRecordIsComplex(mdlParam)
%assign reim = isComplex ? ".%<tRealPart>" : ""
%assign dataLayout = SLibGetDataLayout(mdlParam)
%if ISFIELD(mdlParam, "InstanceSpecific") && mdlParam.InstanceSpecific && !ISFIELD(mdlParam, "VarGroupIdx")
%assign id = SLibGetGroupedParamQualifiedIdentifier(mdlParam)
%else
%assign id = FcnGetAutoParamIdentifier(mdlParam)
%endif
%assign baseAddr = "&%<id>%%<reim>"
%break
%case "DWork"
%assign dwRec = record
%assign dataTypeIdx = SLibDWorkDataTypeId(dwRec)
%assign isComplex = SLibDWorkIsComplex(dwRec)
%assign reim = isComplex ? ".%<tRealPart>" : ""
%assign dataLayout = SLibGetDataLayout(dwRec)
%assign baseSysIdx = GetBaseSystemIdx()
%assign id = FcnGetDWorkIdentifier(dwRec, baseSysIdx)
%assign baseAddr = "&%<id>%%<reim>"
%break
%case "ChartData"
%assign chartData = record
%assign dataTypeIdx = chartData.DataTypeIdx
%assign isComplex = chartData.IsComplex
%assign reim = isComplex ? ".%<tRealPart>" : ""
%assign dataLayout = SLibGetDataLayout(chartData)
%assign baseSysIdx = GetBaseSystemIdx()
%assign dwRec = chartData.DWork
%assign id = FcnGetDWorkIdentifier(dwRec, baseSysIdx)
%assign baseAddr = "&%<id>.%<chartData.Name>%%<reim>"
%break
%case "ContState"
%assign cStateRec = record
%assign dataTypeIdx = 0
%assign isComplex = 0
%assign reim = ""
%assign dataLayout = SLibGetDataLayout(cStateRec)
%assign baseSysIdx = GetBaseSystemIdx()
%assign id = FcnGetCStateIdentifier(cStateRec, baseSysIdx)
%assign baseAddr = "&%<id>%%<reim>"
%if (structure.Name == "StateDerivatives")
%assign baseAddr = "&(%<RTMGet("dX")>[0])"
%endif
%break
%default
%<LibReportFatalError("unknown section type.")>
%endswitch
%addtorecord structure /
Section { /
DataTypeIdx dataTypeIdx; /
IsComplex isComplex; /
BaseAddr baseAddr; /
NumElements 0; /
NumData 0; /
OffsetCounter 0 /
}
%assign structure.NumSections = structure.NumSections + 1
%return structure.NumSections-1
%endfunction
%function FcnAddStructure(name) void
%switch(name)
%case "%<LibGetBlockIOStruct()>"
%case ::tConstBlockIOStruct
%case ::tInput
%case "%<LibGetExternalOutputStruct()>"
%assign defaultType = "signal"
%break
%case "%<LibGetParametersStruct()>"
%assign defaultType = "parameter"
%break
%case "%<LibGetDWorkStruct()>"
%case "%<LibGetContinuousStateStruct()>"
%assign defaultType = "state"
%break
%case "StateDerivatives"
%assign defaultType = "stateDerivative"
%break
%default
%assign defaultType = "unknown"
%endswitch
%assign gmm = GlobalMemoryMap
%addtorecord gmm /
StructuredData { /
Name name; /
NumTotalElements 0; /
NumSections 0 /
DataDefaults { /
Class "scalar" /
HasObject TLC_FALSE /
IsFixedPoint TLC_FALSE /
IsStruct TLC_FALSE /
NumDimensions 2 /
NumCols 1 /
NumRows 1 /
Permission "rw" /
PPIf "" /
PPEndIf "" /
Type defaultType /
} /
}
%assign gmm.NumStructuredData = gmm.NumStructuredData + 1
%return gmm.NumStructuredData-1
%endfunction
%function FcnAddToModelParameters(record) void
%assign cmModelParams = ::CompiledModel.ModelParameters
%assign gmmModelParams = GlobalMemoryMap.ModelParameters
%assign instanceCache = gmmModelParams.InstanceCache
%assign signalInstanceCache = gmmModelParams.SignalInstanceCache
%assign groupIdx = -1
%switch record.RecordType
%case "ModelParameter"
%assign mdlParam = record
%assign source = "SL"
%if ISFIELD(record, "VarGroupIdx") && ...
LibGetVarGroupCategory(record.VarGroupIdx[0]) == "HierarchicalCoderData"
%assign groupIdx = ::CompiledModel.VarGroups.VarGroup[record.VarGroupIdx[0]].CoderDataGroupIndex
%endif
%if InlineParameters != 0 || mdlParam.ReferencedBy[0][0] == -1
%assign paramName = LibGetRecordIdentifier(mdlParam)
%else
%assign sysIdx = mdlParam.ReferencedBy[0][0]
%assign blkIdx = mdlParam.ReferencedBy[0][2]
%assign block = System[sysIdx].Block[blkIdx]
%assign prmIdx = mdlParam.ReferencedBy[0][3]
%assign paramName = block.Parameter[prmIdx].String
%endif
%assign paramKey = "Key_" + paramName
%assign numBlocks = SIZE(mdlParam.GraphicalRef,0)
%if numBlocks == 0
%assign parent = "Dummy"
%else
%if numBlocks == 1
%assign parent = SLibGrBlockPath(mdlParam.GraphicalRef[0])
%else
%if numBlocks > 1
%assign parent = "multiple"
%endif
%endif
%endif
%assign memoryMapIdx = mdlParam.MemoryMapIdx
%if mdlParam.StorageClass != "Auto"
%addtorecord cmModelParams %<paramKey> mdlParam
%endif
%break
%case "MachineData"
%assign sfInfo = record
%assign paramName = sfInfo.Name
%assign paramKey = "Key_" + paramName
%if GMMConflictChecking && ISFIELD(signalInstanceCache, paramName)
%assign errTxt = "Cannot declare machine parented " ...
"Stateflow data the same as a Simulink signal: %<paramName>"
%<LibReportFatalError(errTxt)>
%endif
%assign isExternSimulinkParam = 0
%if ISFIELD(cmModelParams, paramKey)
%assign slParam = ::CompiledModel.ModelParameters.%<paramKey>
%assign isExternSimulinkParam = slParam.StorageClass != "Auto" ? 1 : 0
%endif
%if isExternSimulinkParam
%assign slScope = slParam.StorageClass
%if (slScope == "ImportedExternPointer") || ...
(slScope == "ExportedGlobal" && sfInfo.Scope == "Exported")
%assign errTxt = "/n/n"...
"Data definition conflict between " ...
"Simulink and Stateflow for variable '%<paramName>'. " ...
"The Simulink storage class is " ...
"'%<slParam.StorageClass>' and the Stateflow scope is " ...
"'%<sfInfo.Scope>'. The recommended Stateflow scope " ...
"is 'Exported' with Simulink storage class 'ImportedExtern'."
%<LibReportFatalError(errTxt)>
%else
%assign idx = instanceCache.%<paramKey>
%assign parameter = gmmModelParams.ModelParameter[idx]
%assign parameter.Instance.Source = "multiple"
%assign parameter.Instance.Parent = "multiple"
%assign dataIdx = parameter.Instance.MemoryMapIdx[2]
%assign usd = GlobalMemoryMap.UnstructuredData.Data[dataIdx]
%assign usd.Type = "multiple"
%return ""
%endif
%else
%assign source = "SF"
%assign parent = "Machine"
%assign dataIdx = FcnAddUnstructuredData(sfInfo)
%assign memoryMapIdx = [-1, -1, %<dataIdx>]
%endif
%break
%default
%<LibReportFatalError("unknown source: %<source>")>
%endswitch
%if ISFIELD(record, "GraphicalRef")
%assign blkGrRef = record.GraphicalRef
%else
%assign blkGrRef = [-1 -1]
%endif
%createrecord /
Instance { /
Source source; /
Parent parent; /
MemoryMapIdx memoryMapIdx /
BlkGrRef blkGrRef /
}
%if ISFIELD(instanceCache, paramKey) == TLC_FALSE
%createrecord /
ModelParameter { /
Name paramName; /
NumInstances 0 /
}
%if groupIdx >= 0
%addtorecord ModelParameter CoderDataGroupIdx groupIdx
%endif
%assign gmmModelParams = gmmModelParams + ModelParameter
%addtorecord instanceCache %<paramKey> gmmModelParams.NumModelParameters
%assign instanceCache.NumCachedVariables = instanceCache.NumCachedVariables + 1
%assign gmmModelParams.NumModelParameters = gmmModelParams.NumModelParameters + 1
%endif
%assign idx = instanceCache.%<paramKey>
%assign parameter = gmmModelParams.ModelParameter[idx]
%assign parameter.NumInstances = parameter.NumInstances + 1
%assign parameter = parameter + Instance
%endfunction
%function localGetHStructInstanceIdx(hStructInstanceIdx)
%if hStructInstanceIdx < 0
%return 0
%else
%return hStructInstanceIdx
%endif
%endfunction
%function FcnMapParameters() void
%if !::CompiledModel.BlockOutputsMapped || !::CompiledModel.ExternalInputsMapped
%assign errTxt = "Block output and external signals must be mapped " ...
"prior to parameters."
%<LibReportFatalError(errTxt)>
%endif
%with ModelParameters
%if (!SLibModelParametersStructIsEmpty() || SLibNonEmptyParamCoderGroupExists()) && !IsModelReferenceSimTarget()
%assign structIdx = FcnAddStructure("%<LibGetParametersStruct()>")
%assign struct = GlobalMemoryMap.StructuredData[structIdx]
%assign prevComplex = -1
%assign prevDataTypeIdx = -1
%assign prevHStructSystemIdx = -1
%assign prevHStructInstanceIdx = -1
%assign paddingRequired = TLC_FALSE
%foreach mdlParamIdx = NumInrtP
%assign mdlParam = Parameter[mdlParamIdx]
%if SLibIsParamUnstructured(mdlParam)
%continue
%endif
%if !mdlParam.InstanceSpecific && SLibOmitRecord(mdlParam)
%continue
%endif
%if SLibIsLegacyStorageClassForDataRecord(mdlParam)
%continue
%endif
%if (mdlParam.UseAUTOSARFunctions == 1)
%continue
%endif
%if mdlParam.SuppressInRTW
%continue
%endif
%if SLibGetWidthOfValueFromParamRec(mdlParam) == 0
%continue
%endif
%if ISFIELD(mdlParam, "VarGroupIdx") && mdlParam.VarGroupIdx[0] >= 0
%assign mdlParamVGIdx = mdlParam.VarGroupIdx[0]
%assign mdlParamVG = ::CompiledModel.VarGroups.VarGroup[mdlParamVGIdx]
%if SLibIsCoderGroupVarGroup(mdlParamVG) && !mdlParamVG.PackageAsStruct
%continue
%endif
%endif
%assign HStructSystemIdx = mdlParam.OwnerSysIdx[0]
%assign HStructInstanceIdx = ...
localGetHStructInstanceIdx(mdlParam.OwnerSysIdx[1])
%assign dataTypeIdx = LibGetRecordStorageDataTypeId(mdlParam)
%if ISFIELD(mdlParam, "OriginalDataTypeIdx") && LibIsStringDataType(mdlParam.OriginalDataTypeIdx)
%assign dataTypeIdx = mdlParam.OriginalDataTypeIdx
%endif
%assign paramHasStructDataTypeAndIsNotFixedPoint = ...
LibIsStructDataType(dataTypeIdx) && !LibIsDataTypeFixpt(dataTypeIdx)
%if (LibGetRecordIsComplex(mdlParam) != prevComplex) || ...
(dataTypeIdx != prevDataTypeIdx) || ...
(HStructSystemIdx != prevHStructSystemIdx) || ...
(HStructInstanceIdx != prevHStructInstanceIdx) || ...
paddingRequired || paramHasStructDataTypeAndIsNotFixedPoint
%assign secIdx = FcnAddSection(struct, mdlParam)
%assign section = struct.Section[secIdx]
%assign prevComplex = LibGetRecordIsComplex(mdlParam)
%assign prevDataTypeIdx = dataTypeIdx
%assign prevHStructSystemIdx = HStructSystemIdx
%assign prevHStructInstanceIdx = HStructInstanceIdx
%endif
%assign paddingRequired = (mdlParam.Padding>0) ? TLC_TRUE : TLC_FALSE
%assign dataIdx = FcnAddStructuredData(struct, section, mdlParam)
%assign mdlParam.MemoryMapIdx = [%<structIdx>,%<secIdx>,%<dataIdx>]
%if InlineParameters != 0
%if mdlParam.Tunable == "yes" && mdlParam.StorageClass == "Auto" && !ISEMPTY(mdlParam.WorkspaceVarName)
%<FcnAddToModelParameters(mdlParam)>
%endif
%elseif mdlParam.ReferencedBy[0][0] != -1
%assign sysIdx = mdlParam.ReferencedBy[0][0]
%assign blkIdx = mdlParam.ReferencedBy[0][2]
%assign prmIdx = mdlParam.ReferencedBy[0][3]
%assign block = System[sysIdx].Block[blkIdx]
%assign blkParam = block.Parameter[prmIdx]
%if blkParam.StringType == "Variable" && block.InMask != "yes"
%<FcnAddToModelParameters(mdlParam)>
%endif
%endif
%<FcnUpdateBlockParameterMemoryMapIdx(mdlParam)>
%endforeach
%endif
%if InlineParameters != 0
%foreach mdlParamIdx = NumInrtP
%assign mdlParam = Parameter[mdlParamIdx]
%if SLibIsParamUnstructured(mdlParam)
%assign dataIdx = FcnAddUnstructuredData(mdlParam)
%assign mdlParam.MemoryMapIdx = [-1, -1, %<dataIdx>]
%<FcnAddToModelParameters(mdlParam)>
%<FcnUpdateBlockParameterMemoryMapIdx(mdlParam)>
%endif
%endforeach
%assign pOffset = NumInrtP + NumConstPrmsWithInit + NumConstPrms
%assign numExterns = NumExportedGlobal + NumImportedExtern + NumImportedExternPointer
%foreach idx = numExterns
%assign mdlParamIdx = pOffset + idx
%assign mdlParam = Parameter[mdlParamIdx]
%assign dataIdx = FcnAddUnstructuredData(mdlParam)
%assign mdlParam.MemoryMapIdx = [-1, -1, %<dataIdx>]
%<FcnAddToModelParameters(mdlParam)>
%<FcnUpdateBlockParameterMemoryMapIdx(mdlParam)>
%endforeach
%else
%assign pOffset = NumInrtP + NumConstPrmsWithInit + NumConstPrms + ...
NumExportedGlobal + NumImportedExtern + NumImportedExternPointer
%foreach idx = NumInMdlRefGlobal
%assign mdlParamIdx = pOffset + idx
%assign mdlParam = Parameter[mdlParamIdx]
%assign dataIdx = FcnAddUnstructuredData(mdlParam)
%assign mdlParam.MemoryMapIdx = [-1, -1, %<dataIdx>]
%<FcnAddToModelParameters(mdlParam)>
%<FcnUpdateBlockParameterMemoryMapIdx(mdlParam)>
%endforeach
%endif
%endwith
%assign ::CompiledModel.ParametersMapped = 1
%endfunction
%function FcnMapCustomParameters() void
%if !::CompiledModel.BlockOutputsMapped || !::CompiledModel.ExternalInputsMapped
%assign errTxt = "Block output and external signals must be mapped " ...
"prior to parameters."
%<LibReportFatalError(errTxt)>
%endif
%with ModelParameters
%if InlineParameters != 0
%assign numExterns = NumExportedGlobal + NumImportedExtern + NumImportedExternPointer
%assign pOffset = NumInrtP + NumConstPrmsWithInit + ...
NumConstPrms + numExterns
%foreach idx = NumCustomStorageClass
%assign mdlParamIdx = pOffset + idx
%assign mdlParam = Parameter[mdlParamIdx]
%<FcnMapCustomParameterHelper(mdlParam)>
%endforeach
%foreach idx = NumParameters
%assign mdlParam = Parameter[idx]
%if SLibIsLegacyStorageClassForDataRecord(mdlParam)
%<FcnMapCustomParameterHelper(mdlParam)>
%endif
%endforeach
%endif
%endwith
%assign ::CompiledModel.ParametersMapped = 1
%endfunction
%function FcnMapCustomParameterHelper(mdlParam) void
%assign dataIdx = FcnAddCustomData(mdlParam)
%assign package = LibGetRTWInfoObjectPackage(mdlParam)
%assign class = LibGetCustomStorageClassName(mdlParam)
%assign classIdx = SLibGetCustomStorageIdxInMap(package, class)
%assign mdlParam.MemoryMapIdx = [-1, %<classIdx>, %<dataIdx>]
%<FcnAddToModelParameters(mdlParam)>
%<FcnUpdateBlockParameterMemoryMapIdx(mdlParam)>
%endfunction
%function FcnUpdateBlockParameterMemoryMapIdx(mdlParam) void
%if mdlParam.MemoryMapIdx[2] != -1
%foreach refIdx = SIZE(mdlParam.ReferencedBy,0)
%assign sysIdx = mdlParam.ReferencedBy[refIdx][0]
%if sysIdx != -1
%assign blkIdx = mdlParam.ReferencedBy[refIdx][2]
%assign block = System[sysIdx].Block[blkIdx]
%if block.Type != "SubSystem"
%assign prmIdx = mdlParam.ReferencedBy[refIdx][3]
%if prmIdx != -1
%assign blkParam = block.Parameter[prmIdx]
%if ISFIELD(blkParam, "ASTNode")
%if blkParam.ASTNode.IsNonTerminal == 0
%assign blkParam.MemoryMapIdx = mdlParam.MemoryMapIdx
%endif
%elseif blkParam.MdlPrmIdx >= 0
%assign blkParam.MemoryMapIdx = mdlParam.MemoryMapIdx
%endif
%endif
%endif
%endif
%endforeach
%endif
%endfunction
%function FcnSubsystemsHaveBlockIO() void
%assign sysBlkIO = TLC_FALSE
%foreach sysIdx = ::CompiledModel.NumSystems-1
%assign ssHasBlkIO = (System[sysIdx].StandaloneSubsystem) && ...
(System[sysIdx].HasBlockIOArg == 1)
%assign sysBlkIO = sysBlkIO || ssHasBlkIO
%endforeach
%return sysBlkIO
%endfunction
%function FcnSubsystemsHaveDWork() void
%assign sysDWork = TLC_FALSE
%foreach sysIdx = ::CompiledModel.NumSystems-1
%assign ssHasDWork = (System[sysIdx].StandaloneSubsystem) && ...
(System[sysIdx].HasDWorkArg == 1)
%assign sysDWork = sysDWork || ssHasDWork
%endforeach
%return sysDWork
%endfunction
%function FcnSubsystemsHaveConstBlockIO() void
%assign sysCBlockIO = TLC_FALSE
%foreach sysIdx = ::CompiledModel.NumSystems-1
%assign ssHasConstBlockIO = (System[sysIdx].StandaloneSubsystem) && ...
(System[sysIdx].HasConstBlockIOArg == 1)
%assign sysCBlockIO = sysCBlockIO || ssHasConstBlockIO
%endforeach
%return sysCBlockIO
%endfunction
%function FcnSubsystemsHaveCStates() void
%assign sysCStates = TLC_FALSE
%foreach sysIdx = ::CompiledModel.NumSystems-1
%assign ssHasCStates = (System[sysIdx].StandaloneSubsystem) && ...
(System[sysIdx].HasCStatesArg == 1)
%assign sysCStates = sysCStates || ssHasCStates
%endforeach
%return sysCStates
%endfunction
%function FcnSubsystemsHaveParams() void
%assign sysParams = TLC_FALSE
%foreach sysIdx = ::CompiledModel.NumSystems-1
%assign ssHasParams = (System[sysIdx].StandaloneSubsystem) && ...
(System[sysIdx].HasParametersArg == 1)
%assign sysParams = sysParams || ssHasParams
%endforeach
%return sysParams
%endfunction
%function FcnSubsystemsHaveCDeriv() void
%assign sysCDeriv = TLC_FALSE
%foreach sysIdx = ::CompiledModel.NumSystems-1
%assign ssHasCDeriv = (System[sysIdx].StandaloneSubsystem) && ...
(System[sysIdx].HasCStatesDerivArg == 1)
%assign sysCDeriv = sysCDeriv || ssHasCDeriv
%endforeach
%return sysCDeriv
%endfunction
%function prepareDWorkRecord(dwRec) void
%assign srcBlk = System[dwRec.SigSrc[0]].Block[dwRec.SigSrc[2]]
%assign blkIsStateflow = BlockIsStateflowSFunction(srcBlk)
%if blkIsStateflow
%assign synthesized = ...
System[dwRec.SigSrc[0]].Synthesized
%if !synthesized
%assign grBlk = ...
BlockHierarchyMap.Subsystem[dwRec.GrSrc[0]].Block[dwRec.GrSrc[1]]
%if !ISFIELD(grBlk, "ChartData")
%generatefile "chartSource" "%<srcBlk.SFInfo.ChartTLCFile>.tlc"
%assign chartDataMap = ...
GENERATE_TYPE(srcBlk, "ChartDataMap", "chartSource", ...
System[dwRec.SigSrc[0]])
%addtorecord grBlk ChartData chartDataMap
%else
%assign chartDataMap = grBlk.ChartData
%endif
%assign localDwIdx = dwRec.SigSrc[3]
%if localDwIdx < chartDataMap.NumChartData && ...
LibCGTypeIsMatrix(LibGetRecordCGTypeIdx(dwRec))
%addtorecord dwRec Dimensions chartDataMap.ChartData[localDwIdx].Dimensions
%endif
%endif
%endif
%endfunction
%function getVGElementRequiredRec(aRecType, aRecIdx) void
%switch aRecType
%case "W"
%assign dwRec = DWorks.DWork[aRecIdx]
%if dwRec.IsLocalScratchDWork == 1
%return []
%endif
%assert dwRec.StorageClass == "Auto"
%if !SLibOmitRecord(dwRec) && dwRec.BitFieldWidth == 0
&& !SLibGetDWorkIsCanDimSizeDWorkInBaseSys(aRecIdx) ...
&& !FcnIsDWorkFromMdlBlockInCppClassGenMode(dwRec)
%<prepareDWorkRecord(dwRec)>
%return dwRec
%endif
%break
%case "B"
%assign boRec = BlockOutputs.GlobalBlockOutput[aRecIdx]
%if boRec.BitFieldWidth == 0 ...
&& boRec.RequiredInBlockIO[0] == 1 && boRec.RequiredInBlockIO[1] == 0 ...
&& boRec.NumReusedBlockOutputs == 0
%return boRec
%endif
%break
%case "C"
%assign boRec = BlockOutputs.ConstBlockOutput[aRecIdx]
%if boRec.RequiredInConstBlockIO && boRec.NumReusedBlockOutputs == 0
%return boRec
%endif
%break
%case "U"
%assign extURec = ExternalInputs.ExternalInput[aRecIdx]
%return extURec
%case "Y"
%assign extYRec = ExternalOutputs.ExternalOutput[aRecIdx]
%return extYRec
%default
%break
%endswitch
%return []
%endfunction
%function FcnAssignExternalOutputIdxToBlock(eoRec, recIdx) void
%assign sysIdx = eoRec.Block[0]
%assign blkIdx = eoRec.Block[1]
%assign oblock = System[sysIdx].Block[blkIdx]
%if SLibGraphicalBlockExist(oblock)
%assign grBlockIndex = SLibGetGraphicalBlockIdx(oblock)
%assign grSubSys = ::CompiledModel.BlockHierarchyMap.Subsystem[grBlockIndex[0]]
%assign grBlock = grSubSys.Block[grBlockIndex[1]]
%addtorecord grBlock ExternalOutputIdx recIdx
%endif
%endfunction
%function MapVarGroup(aVarGroupIdx, aStructIdx) void
%if aVarGroupIdx < 0
%return
%endif
%assign struct = GlobalMemoryMap.StructuredData[aStructIdx]
%assign varGroup = VarGroups.VarGroup[aVarGroupIdx]
%assign isCoderGroupVarGroup = SLibIsCoderGroupVarGroup(varGroup)
%if 0 == varGroup.PackageAsStruct
%if varGroup.IsModelSelfCoderGroupVarGroup
%foreach elementIdx = varGroup.NumVarGroupElements
%assign idnum = IDNUM(varGroup.VarGroupElements[elementIdx])
%if("VG" == idnum[0])
%<MapVarGroup(idnum[1], aStructIdx)>
%endif
%endforeach
%endif
%return
%endif
%assign cgType = CGTypes.CGType[varGroup.CGTypeIdx]
%assign prevDataTypeIdx = -1
%assign prevComplex = "unknown"
%assign prevRecType = "unknown"
%assign paddingRequired = TLC_FALSE
%assign cgTypeIdx = varGroup.CGTypeIdx
%if LibCGTypeIsMatrix(varGroup.CGTypeIdx)
%assign cgTypeIdx = LibCGTypeBaseIndex(varGroup.CGTypeIdx)
%assign cgType = ::CompiledModel.CGTypes.CGType[cgTypeIdx]
%endif
%assert LibCGTypeIsStruct(cgTypeIdx)
%assert LibCGTypeNumMembers(cgTypeIdx) == varGroup.NumVarGroupElements
%assign needNewSection = TLC_FALSE
%foreach mIdx = LibCGTypeNumMembers(cgTypeIdx)
%assign idnum = IDNUM(varGroup.VarGroupElements[mIdx])
%assign recType = idnum[0]
%assign recIdx = idnum[1]
%if recType == "VG"
%<MapVarGroup(recIdx, aStructIdx)>
%else
%assign dataRec = getVGElementRequiredRec(recType, recIdx)
%if !ISEMPTY(dataRec)
%if needNewSection || paddingRequired || ...
(!isCoderGroupVarGroup && recType != prevRecType) || ...
(LibGetRecordStorageDataTypeId(dataRec) != prevDataTypeIdx) || ...
(LibGetRecordIsComplex(dataRec) != prevComplex) || ...
LibIsStringDataType(prevDataTypeIdx)
%assign secIdx = FcnAddSection(struct, dataRec)
%assign section = struct.Section[secIdx]
%assign prevDataTypeIdx = LibGetRecordStorageDataTypeId(dataRec)
%assign prevComplex = LibGetRecordIsComplex(dataRec)
%endif
%assign paddingRequired = ...
(dataRec.Padding > 0) ? TLC_TRUE : TLC_FALSE
%assign dataIdx = FcnAddStructuredData(struct, section, dataRec)
%assign dataRec.MemoryMapIdx = [%<aStructIdx>, %<secIdx>, %<dataIdx>]
%assign needNewSection = TLC_FALSE
%if (LibGetVarGroupCategory(aVarGroupIdx) == "HierarchicalCoderData" && recType == "Y")
%<FcnAssignExternalOutputIdxToBlock(dataRec, recIdx)>
%endif
%else
%assign needNewSection = TLC_TRUE
%endif
%endif
%assign prevRecType = recType
%endforeach
%endfunction
%function FcnMapBlockIO() void
%with BlockOutputs
%if !SLibModelBlockIOStructIsEmpty()
%assign structIdx = FcnAddStructure(LibGetBlockIOStruct())
%assign varGroupIdx = ...
FcnSysVarGroupIndex(System[GetBaseSystemIdx()], "BlockIO", 0)
%<MapVarGroup(varGroupIdx, structIdx)>
%endif
%if !SLibModelConstBlockIOStructIsEmpty()
%assign structIdx = FcnAddStructure(::tConstBlockIOStruct)
%assign varGroupIdx = ...
FcnSysVarGroupIndex(System[GetBaseSystemIdx()], "ConstBlockIO", 0)
%<MapVarGroup(varGroupIdx, structIdx)>
%endif
%if ::CompiledModel.StandaloneSSSupported == 1
%assign baseSysIdx = GetBaseSystemIdx()
%foreach varIdx = VarGroups.NumVarGroups
%assign vGrp = VarGroups.VarGroup[varIdx]
%if ( (vGrp.Category == "BlockIO") && ...
(vGrp.ParentVarGroupIdx == -1) && ...
(vGrp.SysIdx < baseSysIdx) )
%assign structIdx = FcnAddStructure(LibGetBlockIOStruct())
%assign varGroupIdx = ...
FcnSysVarGroupIndex(System[vGrp.SysIdx], "BlockIO", 0)
%<MapVarGroup(varGroupIdx, structIdx)>
%endif
%endforeach
%endif
%if !SLibExportedGlobalSignalsIsEmpty() || ...
!SLibImportedExternSignalsIsEmpty() || ...
!SLibImportedExternPointerSignalsIsEmpty()
%foreach boIdx = NumExternalBlockOutputs
%assign bo = ExternalBlockOutput[boIdx]
%if !SLibOmitRecord(bo) && bo.StorageClass != "Custom"
%assign dataIdx = FcnAddUnstructuredData(bo)
%assign bo.MemoryMapIdx = [-1, -1, %<dataIdx>]
%endif
%endforeach
%endif
%endwith
%assign ::CompiledModel.BlockOutputsMapped = 1
%endfunction
%function PrepareForMappingBlockIO() void
%with BlockOutputs
%if NumCustomStorageClasses > 0
%foreach boIdx = NumExternalBlockOutputs
%assign bo = ExternalBlockOutput[boIdx]
%if ISFIELD(bo, "DrivesRootOutport") && bo.DrivesRootOutport == "yes"
%<LibAddIdentifier(bo, "IsAtRootInputOrOutput", TLC_TRUE)>
%endif
%endforeach
%endif
%endwith
%with ExternalInputs
%foreach eiIdx = NumExternalInputs
%assign ei = ExternalInput[eiIdx]
%<LibAddIdentifier(ei, "IsAtRootInputOrOutput", TLC_TRUE)>
%endforeach
%endwith
%endfunction
%function SLibIsLegacyStorageClassRecord(record) void
%if record.StorageClass == "Custom"
%return TLC_TRUE
%elseif SLibIsLegacyStorageClassForDataRecord(record)
%return TLC_TRUE
%endif
%return TLC_FALSE
%endfunction
%function FcnMapCustomBlockIO() void
%with BlockOutputs
%if NumCustomStorageClasses > 0
%foreach vgIdx = VarGroups.NumVarGroups
%assign varGroup = VarGroups.VarGroup[vgIdx]
%if SLibIsCoderGroupVarGroup(varGroup)
%assign coderGroupIndex = varGroup.CoderDataGroupIndex
%assign coderGroup = ::CompiledModel.CoderDataGroup[coderGroupIndex]
%if (coderGroup.IsLegacyStorageClass)
%foreach vgElementIdx = varGroup.NumVarGroupElements
%assign vgElement = SLibVarGroupElementSource(vgIdx, vgElementIdx)
%assign idNumElement = IDNUM(vgElement)
%assign recType = idNumElement[0]
%assign recIdx = idNumElement[1]
%if (recType == "L" || recType == "LDW" || recType == "S")
%assign rec = SLibGetDataRecForVarGroupMember(recType, recIdx)
%if (!ISEMPTY(rec) && !ISFIELD(rec, "VarGroupIdx"))
%assign fieldName = "VarGroupIdx"
%addtorecord rec %<fieldName> [%<vgIdx>, %<vgElementIdx>]
%endif
%endif
%endforeach
%endif
%endif
%endforeach
%foreach boIdx = NumExternalBlockOutputs
%assign bo = ExternalBlockOutput[boIdx]
%if !SLibOmitRecord(bo) && bo.StorageClass == "Custom"
%assign dataIdx = FcnAddCustomData(bo)
%assign package = LibGetRTWInfoObjectPackage(bo)
%assign class = LibGetCustomStorageClassName(bo)
%assign classIdx = SLibGetCustomStorageIdxInMap(package, class)
%assign bo.MemoryMapIdx = [-1, %<classIdx>, %<dataIdx>]
%endif
%endforeach
%foreach boIdx = NumLocalBlockOutputs
%assign bo = LocalBlockOutput[boIdx]
%if !SLibOmitRecord(bo) && SLibIsLegacyStorageClassRecord(bo)
%assign dataIdx = FcnAddCustomData(bo)
%assign package = LibGetRTWInfoObjectPackage(bo)
%assign class = LibGetCustomStorageClassName(bo)
%assign classIdx = SLibGetCustomStorageIdxInMap(package, class)
%assign bo.MemoryMapIdx = [-1, %<classIdx>, %<dataIdx>]
%endif
%endforeach
%foreach gboIdx = NumGlobalBlockOutputs
%assign gbo = GlobalBlockOutput[gboIdx]
%if !SLibOmitRecord(gbo) && SLibIsLegacyStorageClassRecord(gbo)
%if IsModelReferenceTarget()
%assign varGroupIdx = gbo.VarGroupIdx[0]
%assign sysIdx = SLibVarGroupSystemIdx(varGroupIdx)
%if LibSystemIsRoot(System[sysIdx])
%continue
%endif
%endif
%assign dataIdx = FcnAddCustomData(gbo)
%assign package = LibGetRTWInfoObjectPackage(gbo)
%assign class = LibGetCustomStorageClassName(gbo)
%assign classIdx = SLibGetCustomStorageIdxInMap(package, class)
%assign gbo.MemoryMapIdx = [-1, %<classIdx>, %<dataIdx>]
%endif
%endforeach
%endif
%endwith
%assign ::CompiledModel.BlockOutputsMapped = 1
%endfunction
%function FcnMapStateflowData() void
%if !::CompiledModel.ParametersMapped
%assign errTxt = "Parameters must be mapped prior to Stateflow data."
%<LibReportFatalError(errTxt)>
%endif
%assign sfInfo = FEVAL("rtwmaputil", ::CompiledModel.Name)
%assign numData = (SIZE(sfInfo,1)-2)/4
%foreach idx = numData
%assign offset = (idx*4)+2
%assign dataTypeName = sfInfo[offset+2]
%if (dataTypeName != "fixpt") && (dataTypeName != "structure") && ...
(dataTypeName != "enumerated")
%assign topSysIdx = NumSystems-1
%assign topSysCsIdx = [ %<topSysIdx>, -1]
%createrecord /
infoRec { /
RecordType "MachineData"; /
HasObject 0; /
Name sfInfo[offset]; /
Scope sfInfo[offset+1]; /
DataType sfInfo[offset+2]; /
Size sfInfo[offset+3]; /
SysCsIdx topSysCsIdx /
}
%<FcnAddToModelParameters(infoRec)>
%endif
%endforeach
%assign ::CompiledModel.StateflowDataMapped = 1
%endfunction
%function FcnMapDWork() void
%if !SLibModelDWorkStructIsEmpty()
%assign structIdx = FcnAddStructure(LibGetDWorkStruct())
%assign varGroupIdx = ...
FcnSysVarGroupIndex(System[GetBaseSystemIdx()], "DWork", 0)
%<MapVarGroup(varGroupIdx, structIdx)>
%endif
%if ::CompiledModel.StandaloneSSSupported == 1
%assign baseSysIdx = GetBaseSystemIdx()
%foreach varIdx = VarGroups.NumVarGroups
%assign vGrp = VarGroups.VarGroup[varIdx]
%if ( (vGrp.Category == "DWork") && ...
(vGrp.ParentVarGroupIdx == -1) && ...
(vGrp.SysIdx < baseSysIdx) )
%assign structIdx = FcnAddStructure(LibGetDWorkStruct())
%assign varGroupIdx = ...
FcnSysVarGroupIndex(System[vGrp.SysIdx], "DWork", 0)
%<MapVarGroup(varGroupIdx, structIdx)>
%endif
%endforeach
%endif
%foreach dwIdx = DWorks.NumDWorks
%assign dwRec = DWorks.DWork[dwIdx]
%if !SLibOmitRecord(dwRec) && ...
dwRec.StorageClass != "Auto" && dwRec.StorageClass != "Custom" && ...
!(ISFIELD(dwRec, "DWorkForDimSize") && dwRec.DWorkForDimSize == 1)
%assign dataIdx = FcnAddUnstructuredData(dwRec)
%assign dwRec.MemoryMapIdx = [-1, -1, %<dataIdx>]
%endif
%endforeach
%endfunction
%function FcnMapContStates() void
%if !LibContStatesStructIsEmpty() || FcnSubsystemsHaveCStates()
%assign structIdx = FcnAddStructure("%<LibGetContinuousStateStruct()>")
%assign struct = GlobalMemoryMap.StructuredData[structIdx]
%assign prevHStructSystemIdx = -1
%assign prevHStructInstanceIdx = -1
%foreach cStateIdx = ContStates.NumContStates
%assign cStateRec = ContStates.ContState[cStateIdx]
%assign varGroupIdx = cStateRec.VarGroupIdx[0]
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIdx]
%assign HStructSystemIdx = varGroup.SysIdx
%assign HStructInstanceIdx = localGetHStructInstanceIdx(varGroup.InstanceIdx)
%assert cStateRec.StorageClass == "Auto"
%if (prevHStructSystemIdx != HStructSystemIdx) || ...
(prevHStructInstanceIdx != HStructInstanceIdx)
%assign secIdx = FcnAddSection(struct, cStateRec)
%assign section = struct.Section[secIdx]
%assign prevHStructSystemIdx = HStructSystemIdx
%assign prevHStructInstanceIdx = HStructInstanceIdx
%endif
%assign dataIdx = FcnAddStructuredData(struct, section, cStateRec)
%assign cStateRec.MemoryMapIdx = [%<structIdx>, %<secIdx>, %<dataIdx>]
%endforeach
%endif
%endfunction
%function FcnMapContStateDerivatives() void
%if !(LibCStatesDerivStructIsEmpty()) || FcnSubsystemsHaveCDeriv()
%assign structIdx = FcnAddStructure("StateDerivatives")
%assign struct = GlobalMemoryMap.StructuredData[structIdx]
%assign prevHStructSystemIdx = -1
%assign prevHStructInstanceIdx = -1
%foreach cStateIdx = ContStates.NumContStates
%assign cStateRec = ContStates.ContState[cStateIdx]
%assign varGroupIdx = cStateRec.VarGroupIdx[0]
%assign varGroup = ::CompiledModel.VarGroups.VarGroup[varGroupIdx]
%assign HStructSystemIdx = varGroup.SysIdx
%assign HStructInstanceIdx = localGetHStructInstanceIdx(varGroup.InstanceIdx)
%assert cStateRec.StorageClass == "Auto"
%if (prevHStructSystemIdx != HStructSystemIdx) || ...
(prevHStructInstanceIdx != HStructInstanceIdx)
%assign secIdx = FcnAddSection(struct, cStateRec)
%assign section = struct.Section[secIdx]
%assign prevHStructSystemIdx = HStructSystemIdx
%assign prevHStructInstanceIdx = HStructInstanceIdx
%endif
%assign dataIdx = FcnAddStructuredData(struct, section, cStateRec)
%assign cStateRec.DerivativeMemoryMapIdx = ...
[%<structIdx>, %<secIdx>, %<dataIdx>]
%endforeach
%endif
%endfunction
%function FcnMapCustomDWork() void
%foreach dwIdx = DWorks.NumDWorks
%assign dwRec = DWorks.DWork[dwIdx]
%if !SLibOmitRecord(dwRec) && SLibIsLegacyStorageClassRecord(dwRec)
%assign dataIdx = FcnAddCustomData(dwRec)
%assign package = LibGetRTWInfoObjectPackage(dwRec)
%assign class = LibGetCustomStorageClassName(dwRec)
%assign classIdx = SLibGetCustomStorageIdxInMap(package, class)
%assign dwRec.MemoryMapIdx = [-1, %<classIdx>, %<dataIdx>]
%endif
%endforeach
%endfunction
%function FcnMapCustomZeroCrossings() void
%foreach idx = ::CompiledModel.ZcRec.NumBlkZcRecs
%assign blkZcRec = ::CompiledModel.ZcRec.BlkZcRec[idx]
%foreach jdx = blkZcRec.NumZcSignalInfos
%assign zcSignalInfo = blkZcRec.ZcSignalInfo[jdx]
%if SLibIsLegacyStorageClassForDataRecord(zcSignalInfo)
%assign dataIdx = FcnAddCustomData(zcSignalInfo)
%assign package = LibGetRTWInfoObjectPackage(zcSignalInfo)
%assign class = LibGetCustomStorageClassName(zcSignalInfo)
%assign classIdx = SLibGetCustomStorageIdxInMap(package, class)
%assign zcSignalInfo.MemoryMapIdx = [-1, %<classIdx>, %<dataIdx>]
%endif
%endforeach
%endforeach
%endfunction
%function FcnMapExternalInputs() void
%if !LibExternalInputsStructIsEmpty()
%assign structIdx = FcnAddStructure(::tInput)
%assign struct = GlobalMemoryMap.StructuredData[structIdx]
%endif
%assign prevComplex = -1
%assign prevDataTypeIdx = -1
%assign paddingRequired = TLC_FALSE
%with ExternalInputs
%foreach eiIdx = NumExternalInputs
%assign ei = ExternalInput[eiIdx]
%if ISFIELD(ei, "Inactive")
%continue
%endif
%if(SLibDataRecordIsInCoderGroup(ei))
%continue
%endif
%assign slBaseTypeIdx = LibCGTypeSLBaseType(ei.CGTypeIdx)
%assign slBaseTypeSize = LibGetDataTypeSLSizeFromId(slBaseTypeIdx)
%if slBaseTypeSize == 0
%continue
%elseif ei.StorageClass == "Auto"
%if IsModelReferenceTarget()
%continue
%elseif SLibAutosarActive()
%continue
%elseif (SLibFcnProtoCtrlActive() || GenerateClassInterface) && ...
ei.RequiresGlobalAccess == "no"
%continue
%elseif MultiInstanceERTCode && !RootIOStructures
%assign dataIdx = FcnAddUnstructuredData(ei)
%assign ei.MemoryMapIdx = [-1, -1, %<dataIdx>]
%elseif EXISTS(struct) && !ISEMPTY(struct)
%if (LibGetRecordIsComplex(ei) != prevComplex) || ...
(LibGetRecordDataTypeId(ei) != prevDataTypeIdx) || ...
LibIsStringDataType(prevDataTypeIdx) || ...
paddingRequired
%assign secIdx = FcnAddSection(struct, ei)
%assign section = struct.Section[secIdx]
%assign prevComplex = LibGetRecordIsComplex(ei)
%assign prevDataTypeIdx = LibGetRecordDataTypeId(ei)
%endif
%assign paddingRequired = (ei.Padding > 0) ? TLC_TRUE : TLC_FALSE
%assign dataIdx = FcnAddStructuredData(struct, section, ei)
%assign ei.MemoryMapIdx = [%<structIdx>, %<secIdx>, %<dataIdx>]
%endif
%elseif ei.StorageClass != "Custom"
%assign dataIdx = FcnAddUnstructuredData(ei)
%assign ei.MemoryMapIdx = [-1, -1, %<dataIdx>]
%endif
%endforeach
%endwith
%if IsModelReferenceTarget()
%assign baseSysIdx = GetBaseSystemIdx()
%with System[baseSysIdx].Interface
%foreach ciIdx = NumCanonicalInputArgDefs
%assign ci = CanonicalInputArgDef[ciIdx]
%assign inputPortInfo = ci.SignalSrc
%assign u_str_idx = IDNUM(inputPortInfo[0])
%if (u_str_idx[0] != "U" && u_str_idx[0] != "M")
%<LibReportFatalError("CI Error")>
%endif
%assign u_idx = u_str_idx[1]
%assign ei = ::CompiledModel.ExternalInputs.ExternalInput[u_idx]
%if (ei.StorageClass != "Auto")
%<LibReportFatalError("CI Auto Error")>
%endif
%if (ei.TestPoint != "yes")
%continue
%endif
%assign isPtr = (LibGetRecordWidth(ci)>1 || ci.DeclareAsPointer == "yes")
%if IsModelReferenceRTWTarget() && !isPtr
%assert LibGetRecordWidth(ci) == 1
%continue
%endif
%if GenerateClassInterface || SLibFcnProtoCtrlActive()
%if ei.RequiresGlobalAccess == "yes"
%assign errTxt = "External Input Record must not require " + ...
"global access when generating a C++ class interface or Function " + ...
"Prototype Control code"
%<LibReportFatalError(errTxt)>
%endif
%continue
%endif
%assign mappingTestPoint = (IsModelReferenceSimTarget() && ei.TestPoint == "yes" && SLibGetCanIOIsVarDims(ci))
%if (mappingTestPoint)
%continue
%endif
%assign currIdentifier = LibGetRecordIdentifier(ei)
%<LibSetRecordIdentifier(ei, LibGetRecordIdentifier(ci))>
%assign dataIdx = FcnAddUnstructuredData(ei)
%assign ei.MemoryMapIdx = [-1, -1, %<dataIdx>]
%<LibSetRecordIdentifier(ei, currIdentifier)>
%if SLibGetCanIOIsVarDims(ci)
%assign cdwIdx = SLibGetCanDimSizeDWIdxForArg(ci)
%<SLibAccessArgHelper(CanonicalDWorkArgDef[cdwIdx],"","")>
%endif
%endforeach
%endwith
%endif
%assign ::CompiledModel.ExternalInputsMapped = 1
%endfunction
%function FcnMapCustomExternalInputs() void
%with ExternalInputs
%foreach eiIdx = NumExternalInputs
%assign ei = ExternalInput[eiIdx]
%if SLibIsLegacyStorageClassRecord(ei)
%assign dataIdx = FcnAddCustomData(ei)
%assign package = LibGetRTWInfoObjectPackage(ei)
%assign class = LibGetCustomStorageClassName(ei)
%assign classIdx = SLibGetCustomStorageIdxInMap(package, class)
%assign ei.MemoryMapIdx = [-1, %<classIdx>, %<dataIdx>]
%endif
%endforeach
%endwith
%assign ::CompiledModel.ExternalInputsMapped = 1
%endfunction
%function FcnMapCustomExternalOutputs() void
%with ExternalOutputs
%foreach eoIdx = NumExternalOutputs
%assign eo = ExternalOutput[eoIdx]
%if SLibIsLegacyStorageClassRecord(eo)
%assign dataIdx = FcnAddCustomData(eo)
%assign package = LibGetRTWInfoObjectPackage(eo)
%assign class = LibGetCustomStorageClassName(eo)
%assign classIdx = SLibGetCustomStorageIdxInMap(package, class)
%assign eo.MemoryMapIdx = [-1, %<classIdx>, %<dataIdx>]
%endif
%endforeach
%endwith
%endfunction
%function FcnMapExternalOutputs() void
%if !LibExternalOutputsStructIsEmpty()
%assign structIdx = FcnAddStructure("%<LibGetExternalOutputStruct()>")
%assign struct = GlobalMemoryMap.StructuredData[structIdx]
%endif
%assign prevComplex = -1
%assign prevDataTypeIdx = -1
%assign paddingRequired = TLC_FALSE
%with ExternalOutputs
%foreach eoIdx = NumExternalOutputs
%assign eo = ExternalOutput[eoIdx]
%if (ISFIELD(eo, "Inactive"))
%continue
%endif
%assign sysIdx = eo.Block[0]
%assign blkIdx = eo.Block[1]
%assign oblock = System[sysIdx].Block[blkIdx]
%assign ip = oblock.DataInputPort
%if(SLibDataRecordIsInCoderGroup(eo))
%continue
%endif
%if eo.StorageClass == "Auto"
%if SLibExternalOutputIsVirtual(oblock)
%continue
%elseif SLibAutosarActive()
%continue
%elseif (SLibFcnProtoCtrlActive() || GenerateClassInterface) && ...
eo.RequiresGlobalAccess == "no"
%continue
%endif
%if (LibGetRecordIsComplex(ip) != prevComplex) || ...
(LibGetRecordDataTypeId(ip) != prevDataTypeIdx) || ...
LibIsStringDataType(prevDataTypeIdx) || ...
paddingRequired
%assign secIdx = FcnAddSection(struct, eo)
%assign section = struct.Section[secIdx]
%assign prevComplex = LibGetRecordIsComplex(ip)
%assign prevDataTypeIdx = LibGetRecordDataTypeId(ip)
%endif
%assign paddingRequired = (eo.Padding > 0) ? TLC_TRUE : TLC_FALSE
%assign dataIdx = FcnAddStructuredData(struct, section, eo)
%assign eo.MemoryMapIdx = [%<structIdx>, %<secIdx>, %<dataIdx>]
%elseif eo.StorageClass != "Custom"
%assign dataIdx = FcnAddUnstructuredData(eo)
%assign eo.MemoryMapIdx = [-1, -1, %<dataIdx>]
%endif
%<FcnAssignExternalOutputIdxToBlock(eo, eoIdx)>
%endforeach
%endwith
%endfunction
%function SLibGetCustomStorageIdxInMap(package, name)
%assign gmm = ::CompiledModel.GlobalMemoryMap
%if ISFIELD(gmm.CustomDataIndexHash, package)
%if ISFIELD(gmm.CustomDataIndexHash.%<package>, name)
%return gmm.CustomDataIndexHash.%<package>.%<name>
%else
%return -1
%endif
%else
%return -1
%endif
%endfunction
%function LibGetCustomStorageInMap(package, name)
%assign gmm = ::CompiledModel.GlobalMemoryMap
%if ISFIELD(gmm.CustomDataIndexHash, package)
%if ISFIELD(gmm.CustomDataIndexHash.%<package>, name)
%return gmm.CustomData[gmm.CustomDataIndexHash.%<package>.%<name>]
%else
%return []
%endif
%else
%return []
%endif
%endfunction
%function FcnPostMapCleanup() void
%with GlobalMemoryMap
%foreach structureIdx = NumStructuredData
%assign structure = StructuredData[structureIdx]
%with structure
%foreach sectionIdx = NumSections
%<REMOVEFIELD(Section[sectionIdx], "OffsetCounter")>
%assign section = structure.Section[sectionIdx]
%with section
%foreach dataIdx = NumData
%<REMOVEFIELD(Data[dataIdx], "SL_LogicalSrc")>
%<REMOVEFIELD(Data[dataIdx], "SL_ExtModeType")>
%endforeach
%endwith
%endforeach
%endwith
%endforeach
%<REMOVEFIELD(ModelParameters, "InstanceCache")>
%<REMOVEFIELD(ModelParameters, "SignalInstanceCache")>
%if UnstructuredData.NumData == 0
%<REMOVEFIELD(GlobalMemoryMap, "UnstructuredData")>
%<SETFIELD(GlobalMemoryMap, "NumUnstructuredData", 0)>
%else
%if ISFIELD(GlobalMemoryMap,"UnstructuredData")
%with UnstructuredData
%foreach dataIdx = NumData
%<REMOVEFIELD(Data[dataIdx], "SL_LogicalSrc")>
%<REMOVEFIELD(Data[dataIdx], "SL_ExtModeType")>
%endforeach
%endwith
%endif
%endif
%if ISFIELD(GlobalMemoryMap,"CustomData")
%foreach customDataIdx = NumCustomData
%with CustomData[customDataIdx]
%foreach dataIdx = NumData
%<REMOVEFIELD(Data[dataIdx], "SL_LogicalSrc")>
%<REMOVEFIELD(Data[dataIdx], "SL_ExtModeType")>
%endforeach
%endwith
%endforeach
%endif
%endwith
%endfunction
%function FcnGetDWorkIdentifier(dwRec, accessSysIdx) void
%assign cross = System[accessSysIdx].CrossNoArgFcnBound
%assign id = SLibCG_GetVarGroupElementPath(dwRec.VarGroupIdx, ...
accessSysIdx, cross)
%assign optName = ""
%if dwRec.SigSrc[0] >= 0 && dwRec.SigSrc[0] >= 0
%assign block = System[dwRec.SigSrc[0]].Block[dwRec.SigSrc[2]]
%with block
%if (dwRec.Origin == "RWORK") && (NumRWorkDefines > 0)
%assign optName = ".%"
%elseif (dwRec.Origin == "IWORK") && (NumIWorkDefines > 0)
%assign optName = ".%"
%elseif (dwRec.Origin == "PWORK") && (NumPWorkDefines > 0)
%assign optName = ".%"
%endif
%endwith
%endif
%return id + optName
%endfunction
%function FcnGetDWorkWidth(dwRec) void
%if dwRec.SigSrc[0] == -1 || dwRec.SigSrc[2] == -1
%return SLibDWorkWidth(dwRec)
%else
%assign block = System[dwRec.SigSrc[0]].Block[dwRec.SigSrc[2]]
%with block
%if (dwRec.Origin == "RWORK") && (NumRWorkDefines > 0)
%return RWorkDefine[0].Width
%elseif (dwRec.Origin == "IWORK") && (NumIWorkDefines > 0)
%return IWorkDefine[0].Width
%elseif (dwRec.Origin == "PWORK") && (NumPWorkDefines > 0)
%return PWorkDefine[0].Width
%else
%return SLibDWorkWidth(dwRec)
%endif
%endwith
%endif
%endfunction
%function FcnGetCStateIdentifier(cStateRec, accessSysIdx) void
%assign varGroupIdx = cStateRec.VarGroupIdx[0]
%assign cStatePath = SLibCGIRVarGroupPath(varGroupIdx,accessSysIdx,TLC_FALSE)
%assign id = "%<cStatePath>%<cStateRec.Identifier>"
%return id
%endfunction
%function FcnComputeSizeFromDims(dims,isComplex) void
%assign nDims = SIZE(dims,1)
%if nDims > 2
%assign size = 1
%foreach dimIdx = nDims
%assign size = size * dims[dimIdx]
%endforeach
%assign size = size * (isComplex ? 2 : 1)
%else
%assign nRows = dims[0]
%assign nCols = dims[1]
%assign size = nRows*nCols * (isComplex ? 2 : 1)
%endif
%return CAST("Number", size)
%endfunction
%function SLibGetMapStructData(type) void
%with GlobalMemoryMap
%switch(type)
%case "parameter"
%assign name = "%<LibGetParametersStruct()>"
%break
%case "signal"
%assign name = "%<LibGetBlockIOStruct()>"
%break
%case "dwork"
%assign name = "%<LibGetDWorkStruct()>"
%break
%default
%assert TLC_FALSE
%break
%endswitch
%foreach structureIdx = NumStructuredData
%assign structure = StructuredData[structureIdx]
%if structure.Name == name
%return structure
%endif
%endforeach
%endwith
%return
%endfunction
%function SLibGetParameterMapNumDataSections() void
%return %<SLibGetMapNumDataSections("parameter")>
%endfunction
%function SLibGetBlockIOMapNumDataSections() void
%return SLibGetMapNumDataSections("signal") + ...
SLibGetMapNumDataSections("dwork") + ...
SLibGetMapNumDataSections("coderGroup")
%endfunction
%function SLibGetMapNumDataSections(type) void
%assign isCoderGroupType = (type == "coderGroup")
%assign nStructured = 0
%with GlobalMemoryMap
%if !isCoderGroupType
%assign structuredData = SLibGetMapStructData(type)
%if EXISTS(structuredData.NumSections)
%assign nStructured = nStructured + structuredData.NumSections
%endif
%else
%foreach groupIdx = ::CompiledModel.NumCoderDataGroups
%assign group = ::CompiledModel.CoderDataGroup[groupIdx]
%if SLibCoderGroupPackageAsStruct(group) && SLibGetRootVarGroupIdxForCoderGroup(group) >= 0
%assign varGroup = SLibVarGroupForCoderGroup(group)
%foreach structureIdx = NumStructuredData
%assign structure = StructuredData[structureIdx]
%if structure.Name == varGroup.Name && EXISTS(structure.NumSections)
%assign nStructured = nStructured + structure.NumSections
%endif
%endforeach
%endif
%endforeach
%endif
%assign nNonAuto = 0
%if ISFIELD(GlobalMemoryMap,"UnstructuredData")
%assign nData = UnstructuredData.NumData
%foreach dataIdx = nData
%assign data = UnstructuredData.Data[dataIdx]
%if data.SL_ExtModeType == type
%if ISFIELD(data,"SL_LogicalSrc")
%assign nNonAuto = nNonAuto + 1
%endif
%endif
%endforeach
%endif
%assign nCustom = 0
%if ISFIELD(GlobalMemoryMap,"CustomData")
%assign nDataRecs = NumCustomData
%foreach dataRecIdx = nDataRecs
%assign customDataRec = CustomData[dataRecIdx]
%assign nData = customDataRec.NumData
%foreach dataIdx = nData
%if nData == 1
%assign data = customDataRec.Data
%else
%assign data = customDataRec.Data[dataIdx]
%endif
%if data.SL_ExtModeType == type && data.NumDimensions != -1
%if ISFIELD(data,"SL_LogicalSrc")
%assign nCustom = nCustom + 1
%endif
%endif
%endforeach
%endforeach
%endif
%endwith
%return nStructured + nNonAuto + nCustom
%endfunction
%function FcnGetGlobalMemoryMapData(record)
%with record
%if !ISFIELD(record,"MemoryMapIdx")
%assign globalMemoryMapData = "No_MemoryMapIdx"
%elseif MemoryMapIdx[2] == -1/
%assign globalMemoryMapData = "MemoryReused"
%elseif MemoryMapIdx[1] == -1/
%assign dataIdx = MemoryMapIdx[2]
%assign globalMemoryMapData = ...
GlobalMemoryMap.UnstructuredData.Data[dataIdx]
%elseif MemoryMapIdx[0] == -1/
%assign classIdx = MemoryMapIdx[1]
%assign dataIdx = MemoryMapIdx[2]
%assign globalMemoryMapData = ...
GlobalMemoryMap.CustomData[classIdx].Data[dataIdx]
%else /
%assign structIdx = MemoryMapIdx[0]
%assign sectionIdx = MemoryMapIdx[1]
%assign dataIdx = MemoryMapIdx[2]
%assign globalMemoryMapData = ...
GlobalMemoryMap.StructuredData[structIdx].Section[sectionIdx].Data[dataIdx]
%endif
%endwith
%return globalMemoryMapData
%endfunction
%function LibGetGlobalMemoryMapData(record)
%return FcnGetGlobalMemoryMapData(record)
%endfunction
%function FcnGetGlobalMemoryMapSection(record)
%with record
%if !ISFIELD(record,"MemoryMapIdx")
%assign globalMemoryMapSection = "No_MemoryMapIdx"
%elseif MemoryMapIdx[2] == -1/
%assign globalMemoryMapSection = "MemoryReused"
%elseif MemoryMapIdx[1] == -1/
%assign globalMemoryMapSection = "Unstructured"
%elseif MemoryMapIdx[0] == -1/
%assign globalMemoryMapSection = "Custom"
%else /
%assign structIdx = MemoryMapIdx[0]
%assign sectionIdx = MemoryMapIdx[1]
%assign globalMemoryMapSection = ...
GlobalMemoryMap.StructuredData[structIdx].Section[sectionIdx]
%endif
%endwith
%return globalMemoryMapSection
%endfunction
%function BlockIsStateflowSFunction(block) void
%assign blkIsStateflow = TLC_FALSE
%if block.Type == "S-Function"
%if block.ParamSettings.FunctionName == "stateflow"
%assign blkIsStateflow = TLC_TRUE
%endif
%endif
%return blkIsStateflow
%endfunction
%function FcnMapDataGroups() void
%foreach idx = ::CompiledModel.NumCoderDataGroups
%assign group = ::CompiledModel.CoderDataGroup[idx]
%if group.IsLegacyStorageClass || SLibIsAutosarPIMCoderGroup(group)
%continue
%endif
%if SLibDataGroupStaticInit(group) && !MapParameters
%continue
%endif
%if !SLibDataGroupStaticInit(group) && ...
!(MapDWork || MapBlockOutputs || MapExternalInputs || MapExternalOutputs)
%continue
%endif
%assign groupName = group.Name
%if SLibCoderGroupPackageAsStruct(group)
%assign groupToken = "CoderDataGroup" + groupName
%assign structIdx = FcnAddStructure(LibGetCoderDataGroupStruct(group))
%assign varGroupIdx = ...
FcnSysVarGroupIndex(System[GetBaseSystemIdx()], groupToken, 0)
%<MapVarGroup(varGroupIdx, structIdx)>
%else
%assign varGroupIdx = SLibGetRootVarGroupIdxForCoderGroup(group)
%foreach elemIdx = SLibVarGroupNumElements(varGroupIdx)
%assign element = SLibVarGroupElementSource(varGroupIdx, elemIdx)
%assign idnum = IDNUM(element)
%if idnum[0] == "VG" && SLibVarGroupIsStruct(idnum[1])
%assign structName = ::CompiledModel.VarGroups.VarGroup[idnum[1]].Name
%assign structIdx = FcnAddStructure(structName)
%<MapVarGroup(idnum[1], structIdx)>
%elseif idnum[0] != "PCDG" && idnum[0] != "ZE"
%assign dataRec = SLibGetDataRecForVarGroupMember(idnum[0], idnum[1])
%assign dataIdx = FcnAddUnstructuredData(dataRec)
%assign dataRec.MemoryMapIdx = [-1, -1, %<dataIdx>]
%if idnum[0] == "Y"
%<FcnAssignExternalOutputIdxToBlock(dataRec, idnum[1])>
%endif
%endif
%endforeach
%endif
%endforeach
%endfunction
%endif