%selectfile NULL_FILE
%if EXISTS("_COMMONMAPLIB_") == 0
%assign _COMMONMAPLIB_ = 1
%realformat "CONCISE"
%function SLibGetBaseDataTypeIdForFilteredType(idx) void
%assign aIdx = idx
%assign dt = ::CompiledModel.DataTypes.DataType[idx]
%if (dt.DefinedInLegacyCode == 0) || LibIsModelReferenceSimTarget()
%assign aIdx = dt.IdAliasedThruTo
%endif
%return aIdx
%endfunction
%function SLibDumpDataTypeInfoTable() Output
%with DataTypes
%if NumDataTypes == 0
%<LibReportFatalError("NumDataTypes == 0")>
%else
%foreach idx = NumDataTypes
%if idx == NumDataTypes - 1
{ "%", %, % }
%else
{ "%", %, % },
%endif
%endforeach
%endif
%endwith
%endfunction
%function SLibDumpDataTypeSizeTable() Output
%with DataTypes
%if NumDataTypes == 0
%<LibReportFatalError("NumDataTypes == 0")>
%else
%foreach idx = NumDataTypes
%if LibIsAliasDataType(idx)
%assign idx = SLibGetBaseDataTypeIdForFilteredType(idx)
%endif
%if DataTypes.DataType[idx].Skip
%assign dtSize = "sizeof(int32_T)"
%elseif idx == tSS_TIMER_UINT32_PAIR
%assign dtSize = "2*sizeof(uint32_T)"
%elseif LibIsStringDataType(idx)
%assign rec = DataTypes.DataType[idx]
%if ISFIELD(rec, "ContainerCGTypeIdx")
%assign containerTypeIdx = rec.ContainerCGTypeIdx
%if LibCGTypeIsMatrix(containerTypeIdx)
%assign dtSize = "%<LibCGTypeDimensions(containerTypeIdx)[0]>"
%else
%assert LibCGTypeIsPointer(containerTypeIdx)
%assign dtSize = "sizeof(char_T)"
%endif
%else
%assign dtSize = "%"
%endif
%else
%assign typeName = SLibGetBaseTypeNameIfVariableSizeLUTParam(DataType[idx].Name)
%assign dtSize = "sizeof(%<typeName>)"
%endif
%if UsingMalloc
DataTypeSizes[%<idx>] = %<dtSize>;
%else
%if (idx == NumDataTypes-1)
%<dtSize>
%else
%<dtSize>,
%endif
%endif
%endforeach
%endif
%endwith
%endfunction
%function SLibDumpDataTypeNameTable() Output
%with DataTypes
%if NumDataTypes == 0
%<LibReportFatalError("NumDataTypes == 0")>
%else
%foreach idx = NumDataTypes
%if LibIsAliasDataType(idx)
%assign idx = SLibGetBaseDataTypeIdForFilteredType(idx)
%endif
%if UsingMalloc
DataTypeNames[%<idx>] = "%";
%else
%if (idx == NumDataTypes-1)
"%"
%else
"%",
%endif
%endif
%endforeach
%endif
%endwith
%endfunction
%function SLibDumpDataTypeTransitionTable_helper(type, dataType, idx, prefix) Output
%with ::CompiledModel.GlobalMemoryMap
%assign comma = ""
%assign numSigs = 0
%if !ISEMPTY(dataType)
%foreach sectionIdx = dataType.NumSections
%with dataType.Section[sectionIdx]
%assign numSigs = numSigs + 1
%if UsingMalloc
%<prefix>Transitions[%<idx>].baseAddr = (char_T *)(%<BaseAddr>);
%<prefix>Transitions[%<idx>].dataType = %<DataTypeIdx>;
%<prefix>Transitions[%<idx>].isComplex = %<IsComplex>;
%<prefix>Transitions[%<idx>].nEls = %<NumElements>;
%assign idx = idx + 1
%else
%<comma>{(char_T *)(%<BaseAddr>), %<DataTypeIdx>, %<IsComplex>,/
%<NumElements>}/
%assign comma = ",/n"
%endif
%endwith
%endforeach
%endif
%if ISFIELD(GlobalMemoryMap,"UnstructuredData")
%assign nData = UnstructuredData.NumData
%foreach dataIdx = nData
%with UnstructuredData.Data[dataIdx]
%if type == SL_ExtModeType
%if ISFIELD(UnstructuredData.Data[dataIdx],"SL_LogicalSrc")
%if NumDimensions > 2
%assign nEls = 1
%foreach dimIdx = NumDimensions
%assign nEls = nEls * Dimensions[dimIdx]
%endforeach
%else
%assign nEls = NumCols * NumRows
%endif
%assign numSigs = numSigs + 1
%if UsingMalloc
%<prefix>Transitions[%<idx>].baseAddr = (char_T *)(%<BaseAddr>);
%<prefix>Transitions[%<idx>].dataType = %<DataTypeIdx>;
%<prefix>Transitions[%<idx>].isComplex = %<IsComplex>;
%<prefix>Transitions[%<idx>].nEls = %<nEls>;
%assign idx = idx + 1
%else
%<comma>{(char_T *)(%<BaseAddr>), %<DataTypeIdx>, %<IsComplex>,%<nEls>}/
%assign comma = ",/n"
%endif
%endif
%endif
%endwith
%endforeach
%endif
%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
%with data
%if type == SL_ExtModeType
%if (ISFIELD(data,"SL_LogicalSrc") && data.NumDimensions != -1)
%if NumDimensions > 2
%assign nEls = 1
%foreach dimIdx = NumDimensions
%assign nEls = nEls * Dimensions[dimIdx]
%endforeach
%else
%assign nEls = NumCols * NumRows
%endif
%assign numSigs = numSigs + 1
%if UsingMalloc
%<prefix>Transitions[%<idx>].baseAddr = (char_T *)(%<BaseAddr>);
%<prefix>Transitions[%<idx>].dataType = %<DataTypeIdx>;
%<prefix>Transitions[%<idx>].isComplex = %<IsComplex>;
%<prefix>Transitions[%<idx>].nEls = %<nEls>;
%assign idx = idx + 1
%else
%<comma>{(char_T *)(%<BaseAddr>), %<DataTypeIdx>, %<IsComplex>,%<nEls>}/
%assign comma = ",/n"
%endif
%endif
%endif
%endwith
%endforeach
%endforeach
%endif
%endwith
%endfunction
%function SLibDumpDataTypeTransitionTable(type) Output
%assign isCoderGroupType = (type == "coderGroup")
%with ::CompiledModel.GlobalMemoryMap
%if !isCoderGroupType
%assign dataType = SLibGetMapStructData(type)
%switch(type)
%case "parameter"
%assign idx = 0
%assign prefix = "P"
%break
%case "signal"
%assign idx = 0
%assign prefix = "B"
%break
%case "dwork"
%assign idx = SLibGetMapNumDataSections("signal")
%assign prefix = "B"
%break
%default
%assert TLC_FALSE
%break
%endswitch
%<SLibDumpDataTypeTransitionTable_helper(type, dataType, idx, prefix)>
%else
%assign firstSignalGroup = TLC_TRUE
%assign firstParamGroup = TLC_TRUE
%assign comma = ",/n"
%foreach groupIdx = ::CompiledModel.NumCoderDataGroups
%assign group = ::CompiledModel.CoderDataGroup[groupIdx]
%if SLibCoderGroupPackageAsStruct(group) && SLibGetRootVarGroupIdxForCoderGroup(group) >= 0
%assign varGroup = SLibVarGroupForCoderGroup(group)
%if varGroup.NumVarGroupElements <= 0
%continue
%endif
%foreach structureIdx = NumStructuredData
%assign structure = StructuredData[structureIdx]
%if structure.Name == varGroup.Name
%assign isParamGroup = SLibDataGroupStaticInit(group)
%if !isParamGroup
%assign idx = SLibGetMapNumDataSections">SLibGetMapNumDataSections("signal") + SLibGetMapNumDataSections">SLibGetMapNumDataSections("dwork")
%if !firstSignalGroup
%<comma>
%endif
%assign firstSignalGroup = TLC_FALSE
%assign prefix = "B"
%else
%assign idx = SLibGetMapNumDataSections("parameter")
%if !firstParamGroup
%<comma>
%endif
%assign firstParamGroup = TLC_FALSE
%assign prefix = "P"
%endif
%<SLibDumpDataTypeTransitionTable_helper(type, structure, idx, prefix)>
%endif
%endforeach
%endif
%endforeach
%endif
%endwith
%endfunction
%function SLibDumpMapInfo(type) Output
%switch(type)
%case "parameter"
%assign prefix = "P"
%assign nTrans = SLibGetParameterMapNumDataSections()
%break
%case "signal"
%assign prefix = "B"
%assign nTrans = SLibGetBlockIOMapNumDataSections()
%break
%default
%assert TLC_FALSE
%break
%endswitch
%if UsingMalloc
%<prefix>TransTable->numTransitions = %<nTrans>U;
%<prefix>TransTable->transitions = %<prefix>Transitions;
%else
%<nTrans>U,
rt%<prefix>Transitions
%endif
%endfunction
%function SLibDumpBlockIODataTypeTransitionTable() Output
%assign numSigs = SLibGetNumDataTypeTransitionTableElements("signal")
%assign numDWorks = SLibGetNumDataTypeTransitionTableElements("dwork")
%assign numCoderGroups = SLibGetNumDataTypeTransitionTableElements("coderGroup")
%<SLibDumpDataTypeTransitionTable("signal")>
%if numDWorks && numSigs && !UsingMalloc
,
%endif
%<SLibDumpDataTypeTransitionTable("dwork")>
%if numCoderGroups && (numSigs || numDWorks) && !UsingMalloc
,
%endif
%<SLibDumpDataTypeTransitionTable("coderGroup")>
%if !numDWorks && !numSigs && !numCoderGroups && !UsingMalloc
{(char_T *)NULL, 0, 0, 0}
%endif
%endfunction
%function SLibGetNumDataTypeTransitionTableElements_helper(type, dataType) void
%assign numSigs = 0
%with ::CompiledModel.GlobalMemoryMap
%if !ISEMPTY(dataType)
%foreach sectionIdx = dataType.NumSections
%with dataType.Section[sectionIdx]
%assign numSigs = numSigs + 1
%endwith
%endforeach
%endif
%if ISFIELD(GlobalMemoryMap,"UnstructuredData")
%assign nData = UnstructuredData.NumData
%foreach dataIdx = nData
%with UnstructuredData.Data[dataIdx]
%if type == SL_ExtModeType
%if ISFIELD(UnstructuredData.Data[dataIdx],"SL_LogicalSrc")
%if NumDimensions > 2
%assign nEls = 1
%foreach dimIdx = NumDimensions
%assign nEls = nEls * Dimensions[dimIdx]
%endforeach
%else
%assign nEls = NumCols * NumRows
%endif
%assign numSigs = numSigs + 1
%endif
%endif
%endwith
%endforeach
%endif
%if ISFIELD(GlobalMemoryMap,"CustomData")
%assign nDataRecs = NumCustomData
%foreach dataRecIdx = nDataRecs
%assign customDataRec = CustomData[dataRecIdx]
%assign nData = customDataRec.NumData
%assign cscType = customDataRec.Name
%foreach dataIdx = nData
%if nData == 1
%assign data = customDataRec.Data
%else
%assign data = customDataRec.Data[dataIdx]
%endif
%with data
%if type == SL_ExtModeType
%if SLibIsGlobalMapDataWithNoExternalLinkage(data)
%assign varName = LibGetRecordVarName(data.RTWRecord)
%assign cscDefn = RTWRecord.CSCDefn
%assign attribs = LibGetCustomStorageAttributes(data)
%if LibGetInstanceSpecificProp(cscDefn, attribs, "IsReusable")
%assign command = "%<varName>.CoderInfo.CustomAttributes.DataScope"
%assign args = ["%<varName>", "%<command>"]
%<SLibReportErrorWithIdAndArgs("RTW:tlc:NonExportedDataUnsupportedInExtModeWithRCSC", args)>
%else
%<SLibReportErrorWithIdAndArgs("RTW:tlc:NonExportedDataUnsupportedInExtMode", varName)>
%endif
%endif
%if ISFIELD(data,"SL_LogicalSrc")
%if NumDimensions > 2
%assign nEls = 1
%foreach dimIdx = NumDimensions
%assign nEls = nEls * Dimensions[dimIdx]
%endforeach
%else
%assign nEls = NumCols * NumRows
%endif
%assign numSigs = numSigs + 1
%endif
%endif
%endwith
%endforeach
%endforeach
%endif
%endwith
%return numSigs
%endfunction
%function SLibGetNumDataTypeTransitionTableElements(type) void
%assign isCoderGroupType = (type == "coderGroup")
%assign numSigs = 0
%with ::CompiledModel.GlobalMemoryMap
%if !isCoderGroupType
%assign dataType = SLibGetMapStructData(type)
%assign numSigs = SLibGetNumDataTypeTransitionTableElements_helper(type, dataType)
%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
%assign numSigs = numSigs + SLibGetNumDataTypeTransitionTableElements_helper(type, structure)
%endif
%endforeach
%endif
%endforeach
%endif
%endwith
%return numSigs
%endfunction
%function FcnNumUploadableDWorksIsEmpty() void
%return (::CompiledModel.DWorks.NumDWorks == 0)
%endfunction
%function FcnNumAccessibleSignalsIsEmpty() void
%return (BlockOutputs.NumAccessibleSignals == 0)
%endfunction
%function SLibBlockIODataTypeTransitionTableIsEmpty() void
%return (FcnNumUploadableDWorksIsEmpty() && FcnNumAccessibleSignalsIsEmpty())
%endfunction
%function SLibDumpBlockIOMapInfo() Output
%if !SLibBlockIODataTypeTransitionTableIsEmpty()
%<SLibDumpMapInfo("signal")>
%endif
%endfunction
%function SLibDumpParametersDataTypeTransitionTable() Output
%<SLibDumpDataTypeTransitionTable("parameter")>
%endfunction
%function SLibNumInaccessiblePrms() Output
%assign numInaccessiblePrms = 0
%with ::CompiledModel.ModelParameters
%foreach prmIdx = NumParameters
%assign mParam = Parameter[prmIdx]
%assign isInaccessible = TLC_FALSE
%if ISFIELD(mParam, "UseAccessFunctions") && mParam.UseAccessFunctions == 1
%assign isInaccessible = TLC_TRUE
%else
%assign data = SLibGetGlobalMemoryDataRecord(mParam.MemoryMapIdx)
%if !ISEMPTY(data) && SLibIsGlobalMapDataWithNoExternalLinkage(data)
%assign isInaccessible = TLC_TRUE
%endif
%endif
%if isInaccessible
%assign numInaccessiblePrms = numInaccessiblePrms + 1
%endif
%endforeach
%endwith
%return numInaccessiblePrms
%endfunction
%function SLibParametersDataTypeTransitionTableIsEmpty() void
%with ::CompiledModel.ModelParameters
%return (NumParameters - NumConstPrms - NumConstPrmsWithInit - SLibNumInaccessiblePrms()) == 0.0
%endwith
%endfunction
%function SLibDumpParametersMapInfo() Output
%if !SLibParametersDataTypeTransitionTableIsEmpty()
%<SLibDumpMapInfo("parameter")>
%endif
%endfunction
%function SLibDumpModelMappingInfo() Output
%assign usingStatic = !UsingMalloc
%assign numDataTypes = LibGetNumDataTypesInModel()
%if (CreateTransitionTable == 1) && numDataTypes != -1
/* data type transition information */
{
%if usingStatic
static DataTypeTransInfo dtInfo;
%if ::GenCPP == 0
(void) %<LibGenMemFcnCall("memset", "(char_T *) &dtInfo", "0", ...
"sizeof(dtInfo)")>;
%elseif SLibIsRTMZeroInitCppEnabled()
(void) %<LibGenMemFcnCall("memset", "(void *) &dtInfo", "0", ...
"sizeof(dtInfo)")>;
%endif
%<RTMSet("ModelMappingInfo", "&dtInfo")>;
%if xPC==1
%<RTMuSet("ReservedForXPC", "(void*) &dtInfo")>;
%endif
dtInfo.numDataTypes = %<numDataTypes>;
%if numDataTypes > 0
dtInfo.dataTypeSizes = &rtDataTypeSizes[0];
dtInfo.dataTypeNames = &rtDataTypeNames[0];
%endif
%if !SLibBlockIODataTypeTransitionTableIsEmpty()
/* Block I/O transition table */
dtInfo.BTransTable = &rtBTransTable;
%endif
%if !SLibParametersDataTypeTransitionTableIsEmpty()
/* Parameters transition table */
dtInfo.PTransTable = &rtPTransTable;
%endif
%if ::isRAccel && numDataTypes > 0
dtInfo.dataTypeInfoTable = rtDataTypeInfoTable;
%endif
%else
#include "%<Name>_reg_dt.h"
%endif
}
%endif
%if RTWCAPI
%if ISFIELD(::CompiledModel, "CAPIFunctionArgs")
%assign args = ::CompiledModel.CAPIFunctionArgs
%else
%assert ((CodeFormat == "S-Function") || (xPC == 1))
%createrecord /
CAPI_FunctionArgs { /
uArg ""; /
uDecl ""; /
dArg ""; /
dDecl ""; /
pArg ""; /
pDecl ""; /
bArg ""; /
bDecl ""; /
dwArg ""; /
dwDecl ""; /
xArg ""; /
xDecl ""; /
ssArg ""; /
ssDecl "" /
}
%assign args = CAPI_FunctionArgs
%endif
/* Initialize DataMapInfo substructure containing ModelMap for C API */
%if IsModelReferenceSimTarget()
%assign dwDecl = ""
%if ISFIELD(args,"isDwArgDeclSame") && args.isDwArgDeclSame
%assign dwDecl = args.dwDecl
%endif
%<::CompiledModel.Name>_InitializeDataMapInfo(%<RTMGetModelSS()>...
%<args.uDecl>%<args.bDecl>%<args.pDecl>%<dwDecl>%<args.xDecl>%<args.ssDecl>, sysRanPtr, contextTid);
%else
%if IsModelReferenceInlineOffTarget() && !LibParametersStructIsEmpty() && !GenerateClassInterface
%assign dataType = ::tParametersType
%assign baseSystem = ::CompiledModel.System[GetBaseSystemIdx()]
%assign paramsName = FcnSysVarGroupNonreusedName(baseSystem,"Parameter")
{ /
%if !ISEMPTY(paramsName) && !ISEMPTY(args.pDecl)
%<dataType> *%<::tParameters> = &%<paramsName>;
%endif
%endif
%assign simstructDefn = ""
%if (::isRAccel || isRSim) && !IsModelReferenceTarget()
%else
%if MultiInstanceERTCode || IsModelReferenceTarget()
%assign simstructDefn = "%<RTMGetModelSS()>"
%endif
%endif
%assign dwDecl = ""
%if ISFIELD(args,"isDwArgDeclSame") && args.isDwArgDeclSame
%assign dwDecl = args.dwDecl
%endif
%<::CompiledModel.Name>_InitializeDataMapInfo(%<simstructDefn>...
%<args.uDecl>%<args.bDecl>%<args.pDecl>%<dwDecl>%<args.xDecl>%<args.ssDecl>);
%if IsModelReferenceInlineOffTarget() && !LibParametersStructIsEmpty() && !GenerateClassInterface
}
%endif
%endif
%endif
%endfunction
%endif