%selectfile NULL_FILE
%if EXISTS("_DATA_CUSTOMDATA_") == 0
%assign _DATA_CUSTOMDATA_ = 1
%include "data_cacheutils.tlc"
%function SLibIsCSCObjectBased(cscRec) void
%assert ISFIELD(cscRec, "Name") && ISFIELD(cscRec, "Package")
%return ISFIELD(cscRec,"IsObjectBased") && ...
cscRec.IsObjectBased == "yes"
%endfunction
%function SLibIsCSCObjectBasedByName(package,name) void
%foreach idx = ::CompiledModel.CustomStorageClasses.NumCustomStorageClasses
%assign sc = ::CompiledModel.CustomStorageClasses.CustomStorageClass[idx]
%if sc.Package == package && ...
sc.Name == name
%return SLibIsCSCObjectBased(sc)
%endif
%endforeach
%return TLC_FALSE
%endfunction
%with ::CompiledModel
%if (CustomStorageClasses.NumCustomStorageClasses > 0) && ...
HasCscMcosCodeEmitObject == "yes"
%include "%<Name>_CustomStorageClassObjectsOutputs.tlc"
%endif
%endwith
%function SLibCacheCustomDataBuffers() void
%<SLibCreateCustomDataBuffers()>
%<FcnCacheCustomDataBuffers()>
%endfunction
%function SLibCreateCustomDataBuffers() void
%with ::CompiledModel
%addtorecord ::CompiledModel CustomDataBuffers { /
NumFiles 0; /
FileRec []; /
FileRecMap {} /
}
%endwith
%endfunction
%function SLibIsSignalType(record)
%switch record.RecordType
%case "BlockOutput"
%case "DWork"
%case "ChartData"
%case "ExternalInput"
%case "ExternalOutput"
%case "ZcSignalInfo"
%return TLC_TRUE
%case "ModelParameter"
%return TLC_FALSE
%case "ContState"
%case "MachineData"
%<LibReportFatalError("unexpected record type: %<record.RecordType>")>
%default
%<LibReportFatalError("unknown record type: %<record.RecordType>")>
%endswitch
%endfunction
%function SLibIsParameterType(record)
%switch record.RecordType
%case "ModelParameter"
%return TLC_TRUE
%case "BlockOutput"
%case "DWork"
%case "ChartData"
%case "ExternalInput"
%case "ExternalOutput"
%case "ZcSignalInfo"
%return TLC_FALSE
%case "ContState"
%case "MachineData"
%<LibReportFatalError("unexpected record type: %<record.RecordType>")>
%default
%<LibReportFatalError("unknown record type: %<record.RecordType>")>
%endswitch
%endfunction
%function FcnCacheCustomDataBuffers() void
%if ISFIELD(::CompiledModel.DataObjectUsage, "UsageCheckError")
%assign checkError = ::CompiledModel.DataObjectUsage.UsageCheckError
%if ISFIELD(checkError, "Message") && !ISEMPTY(checkError.Message)
%assign errArgs = ["%<LibGetModelName()>", "%<checkError.Message>"]
%<SLibReportErrorWithIdAndArgs("RTW:tlc:ErrWhenCheckingDataObjectUsage", errArgs)>
%endif
%endif
%with CustomStorageClasses
%assign csc_defDefine_fileName = SLibGetFileNameForCode("csc_defDefine")
%assign defDefineFile = FcnGetFileIdx(csc_defDefine_fileName, "source", "no")
%assign csc_defExport_fileName = SLibGetFileNameForCode("csc_defExport")
%assign defExportFile = FcnGetFileIdx(csc_defExport_fileName, "header", "no")
%assign csc_defImport_fileName = SLibGetFileNameForCode("csc_defImport")
%assign defImportFile = FcnGetFileIdx(csc_defImport_fileName, "header", "no")
%assign csc_defTypes = SLibGetFileNameForCode("csc_defTypes")
%assign defTypesFile = FcnGetFileIdx(csc_defTypes, "header", "no")
%assign defDefineSymbol = FcnGetSymbolIdx("Definitions")
%assign defDeclareSymbol = FcnGetSymbolIdx("Declarations")
%assign defMacroSymbol = FcnGetSymbolIdx("Defines")
%assign defTypesSymbol = FcnGetSymbolIdx("Typedefs")
%assign isMdlRefTarget = IsModelReferenceTarget()
%assign hasModelBlocks = HasModelReferenceBlocks()
%createrecord objInfoArr { NumInfo 0 }
%createrecord objCSCMSPackage { PackageName ""; ...
MemSecName ""; ...
MemSecComment ""; ...
MemSecAddPragma TLC_FALSE; ...
MemSecPrepragma ""; ...
MemSecPostpragma ""; ...
CSCName ""; ...
CSCComment ""}
%createrecord objInfoArrForNonSharedData { NumInfo 0 }
%createrecord ImportedObjInfo { NumInfo 0 }
%foreach cscIdx = NumCustomStorageClasses
%assign csc = CustomStorageClass[cscIdx]
%assign cscName = csc.Name
%assign cscPackage = csc.Package
%assign isObjectBased = SLibIsCSCObjectBased(csc)
%assign class = LibGetCustomStorageInMap(cscPackage, cscName)
%if ISEMPTY(class)
%continue
%endif
%assign classDefn = SLibGetCSCDefForCSC(class)
%if ISEMPTY(classDefn)
%<LibReportFatalError("CSC Definition not provided")>
%endif
%assign memSecDef = SLibGetMemorySectionDefForCSC(class)
%if ISEMPTY(memSecDef)
%<LibReportFatalError("MS Definition not provided")>
%endif
%assign isClassGrouped = classDefn.IsGrouped
%assign classHdr = classDefn.HeaderFile
%assign isClassHdrEmpty = WHITE_SPACE(classHdr)
%assign classScope = classDefn.DataScope
%assign classInitViaMacro = (classDefn.DataInit == "Macro")
%assign classInit = classDefn.DataInit
%if WHITE_SPACE(classDefn.DefinitionFile)
%assign classDefineFile = defDefineFile
%else
%assign classDefineFile = FEVAL("strtok", classDefn.DefinitionFile, ".")
%assign classDefineFile = FcnGetFileIdx(classDefineFile, "source", "yes")
%endif
%<FcnAddFilePackagingByRTW(class, "FilePackagingDefaults", classScope,/
isClassHdrEmpty, classInitViaMacro, /
classDefineFile, defExportFile, defImportFile, /
classHdr, defDefineSymbol, defDeclareSymbol, /
defMacroSymbol)>
%if isClassGrouped
%if ((classScope != "Imported") && isMdlRefTarget)
%assign errTxt = ...
"Invalid DataScope '%<classScope>' for custom storage class: %<cscName>/n" ...
"Grouped custom storage classes must be Imported when used with " ...
"referenced models."
%<LibReportError(errTxt)>
%endif
%switch classScope
%case "Auto"
%assign classScope = "Exported"
%break
%case "File"
%assign errTxt = ...
"Invalid DataScope 'File' for custom storage class: %<cscName>/n" ...
"File scope is not supported for grouped custom storage classes."
%<LibReportError(errTxt)>
%break
%endswitch
%assert((classScope == "Exported") || (classScope == "Imported"))
%addtorecord class FilePackaging { }
%if isObjectBased
%assign types = SLibObjectCustomStorageClassTypes(cscPackage,cscName)
%assign varDecls = SLibObjectCustomStorageClassVarDecls(cscPackage,cscName,"")
%assign varDefns = SLibObjectCustomStorageClassVarDefns(cscPackage,cscName,"")
%assign typeDeclDefn = ["%<types>", "%<varDecls>", "%<varDefns>"]
%else
%assign typeDeclDefn = LibCustomClass(class, "groupTypeDeclDefn")
%endif
%assign rootSystem = ::CompiledModel.System[NumSystems-1]
%assign reqInsts = LibGetSystemField(rootSystem,"ReqRootPrmHdrDataInsts")
%if ((reqInsts.GroupedCustomDataInst) && (classScope == "Exported"))
%if isClassHdrEmpty
%assign typedefHdrFileName = "%<csc_defExport_fileName>.h"
%assign typedefHdrFileIdx = defExportFile
%else
%assign typedefHdrFileName = classDefn.HeaderFile
%assign typedefHdrFileShort = FEVAL("strtok", typedefHdrFileName, ".")
%assign typedefHdrFileIdx = FcnGetFileIdx(typedefHdrFileShort, "header", "yes")
%endif
%if typedefHdrFileIdx < 0
%<LibReportError("HeaderFile not specified.")>
%else
%openfile typeBuf
%
%closefile typeBuf
%<SLibAddToCSCBuffers(typedefHdrFileIdx, defTypesSymbol, "Types", /
cscPackage, memSecDef, classDefn, typeBuf)>
%endif
%assign defFile = class.FilePackaging.DefineFile
%if defFile < 0
%<LibReportError("DefinitionFile not specified.")>
%else
%<FcnCacheHeaderInImportsFile(class.Name, typedefHdrFileName, defFile,TLC_FALSE)>
%assign prepragma = ""
%assign postpragma = ""
%assign msDefn = csc.CSCDefaults.MSDefn
%if(ISFIELD(msDefn, "PragmaPerVar") && msDefn.PragmaPerVar)
%assign prepragma = msDefn.PrePragma
%assign postpragma = msDefn.PostPragma
%endif
%openfile defnBuf
%if(!WHITE_SPACE(prepragma))
%<prepragma>
%endif
%if !WHITE_SPACE(typeDeclDefn[2])
%
%endif
%if(!WHITE_SPACE(postpragma))
%<postpragma>
%endif
%closefile defnBuf
%<SLibAddToCSCBuffers(defFile, /
class.FilePackaging.DefineSymbol, /
"Definitions", cscPackage, memSecDef, /
classDefn, defnBuf)>
%endif
%endif
%assign externFiles = class.FilePackaging.FilesWithDeclare
%assign numExternFiles = SIZE(externFiles)[1]
%if numExternFiles > 0
%assert (numExternFiles == 1)
%assign prepragma = ""
%assign postpragma = ""
%assign msDefn = csc.CSCDefaults.MSDefn
%if(ISFIELD(msDefn, "PragmaPerVar") && msDefn.PragmaPerVar)
%assign prepragma = msDefn.PrePragma
%assign postpragma = msDefn.PostPragma
%endif
%openfile declBuf
%if(!WHITE_SPACE(prepragma))
%<prepragma>
%endif
%if !WHITE_SPACE(typeDeclDefn[1])
%
%endif
%if(!WHITE_SPACE(postpragma))
%<postpragma>
%endif
%closefile declBuf
%endif
%foreach exIdx = numExternFiles
%assign externFile = externFiles[exIdx]
%if externFile < 0
%assign errTxt = "ExternFile[%<exIdx>] undefined for %<class.Name>"
%<LibReportFatalError(errTxt)>
%endif
%<SLibAddToCSCBuffers(externFile, class.FilePackaging.DeclareSymbol,/
"Declarations", cscPackage, memSecDef, /
classDefn, declBuf)>
%endforeach
%assign importFiles = class.FilePackaging.FilesWithInclude
%assign headerFile = class.FilePackaging.HeaderFile
%assign numImportFiles = SIZE(importFiles)[1]
%foreach hdrIdx = numImportFiles
%assign importFile = importFiles[hdrIdx]
%if (importFile < 0)
%assign errTxt ="ImportFile[%<hdrIdx>] undefined for %<class.Name>"
%<LibReportFatalError(errTxt)>
%endif
%<FcnCacheHeaderInImportsFile(class.Name, headerFile, importFile,TLC_FALSE)>
%endforeach
%<REMOVEFIELD(class, "FilePackaging")>
%else
%assign cscDataNames = FIELDNAMES(csc.Data)
%assign numData = SIZE(cscDataNames)[1]
%foreach dataIdx = numData
%assign areMutuallyExclusiveSignals = TLC_FALSE
%assign dataName = cscDataNames[dataIdx]
%assign dataRec = GETFIELD(csc.Data, dataName)
%if ISFIELD(dataRec,"Inactive")
%continue
%endif
%if ISFIELD(dataRec,"isMutuallyExclusiveSignal")
%assign areMutuallyExclusiveSignals = (dataRec.isMutuallyExclusiveSignal == "yes")
%endif
%if ISFIELD(dataRec,"isFcnScoped")
%continue
%endif
%assign dataScope = classScope
%assign dataInit = classInit
%assign dataInitViaMacro = classInitViaMacro
%assign dataHdr = classHdr
%assign isDataHdrEmpty = isClassHdrEmpty
%assign isDataHdrInstSpecific = TLC_FALSE
%assign hasInstSpecific = TLC_FALSE
%assign verScope = FcnVerifyDataScope(dataRec, dataScope)
%assign dataScope = verScope[0]
%assign isFileScope = verScope[2]
%assign dataDefineFile = (isFileScope ? verScope[1] : defDefineFile)
%if isFileScope > 0
%<SETFIELD(dataRec,"isFileScoped",1)>
%endif
%assign modifiedByMPT = TLC_FALSE
%assign dataObject = []
%with class
%assign props = LibGetCustomStorageAttributes(dataRec)
%if !ISEMPTY(props)
%assign scopeInst = ...
LibGetInstanceSpecificProp(classDefn, props, "DataScope")
%if (scopeInst != classScope) && (scopeInst != "Auto")
%assign dataScope = scopeInst
%assign hasInstSpecific = TLC_TRUE
%endif
%assign initInst = ...
LibGetInstanceSpecificProp(classDefn, props, "DataInit")
%if (initInst != dataInit)
%assign dataInit = initInst
%assign hasInstSpecific = TLC_TRUE
%assign dataInitViaMacro = (dataInit == "Macro")
%endif
%assign hdrInst = ...
LibGetInstanceSpecificProp(classDefn, props, "HeaderFile")
%if LibIsPropInstanceSpecific(classDefn, props, "HeaderFile")
%assign isDataHdrInstSpecific = TLC_TRUE
%if dataHdr != hdrInst
%assign dataHdr = hdrInst
%assign hasInstSpecific = TLC_TRUE
%endif
%assign isDataHdrEmpty = WHITE_SPACE(dataHdr)
%endif
%endif
%assign dataAccess = LibGetInstanceSpecificProp(classDefn, props, "DataAccess")
%assign dataOwner = ""
%assign headerFileOfExportedData = ""
%with ::CompiledModel.DataObjectUsage
%assign id = FcnGetRecordIdForDataObjUsage(dataRec)
%if !SLibParamIsVariantControlParam(dataRec) && ...
ISFIELD(DataObjectSymbols, id)
%assign dataObjectIdx = GETFIELD(DataObjectSymbols, id)
%assign dataObject = DataObject[dataObjectIdx[0]]
%if dataObject.HasMPTAttributes[0]
%assign modifiedByMPT = TLC_TRUE
%<FcnAddFilePackagingByMPT(dataRec, dataObject)>
%if ISFIELD(dataObject, "Scope") && /
(dataObject.Scope != dataScope)
%assign dataScope = dataObject.Scope
%if ISFIELD(dataObject, "Init")
%assign dataInit = dataObject.Init
%endif
%endif
%if dataScope == "Exported"
%assert(ISFIELD(classDefn, "Owner"))
%assign dataOwner = LibGetInstanceSpecificProp(classDefn, props, "Owner")
%if !FcnIsGenCustomDataDefinition(dataOwner, TLC_TRUE)
%if dataInit == "Macro"
%assign errTxt = "Exported macro (%<dataName>) is not allowed to specify an owner."
%<LibReportError(errTxt)>
%endif
%assign dataInit = "None"
%endif
%if ISFIELD(classDefn, "HeaderFile")
%assign headerFileOfExportedData = LibGetInstanceSpecificProp(classDefn, props, "HeaderFile")
%endif
%endif
%endif
%endif
%endwith
%if !(modifiedByMPT)
%if SLibParamIsVariantControlParam(dataRec)
%assign exportFile = defTypesFile
%assign importFile = defTypesFile
%<FcnAddFilePackagingByRTW(dataRec, "FilePackaging", /
dataScope, isDataHdrEmpty, /
dataInitViaMacro, dataDefineFile, /
exportFile, importFile, /
dataHdr, defDefineSymbol,/
defDeclareSymbol, defMacroSymbol)>
%elseif hasInstSpecific || isFileScope
%<FcnAddFilePackagingByRTW(dataRec, "FilePackaging", /
dataScope, isDataHdrEmpty, /
dataInitViaMacro, dataDefineFile, /
defExportFile, defImportFile, /
dataHdr, defDefineSymbol,/
defDeclareSymbol, defMacroSymbol)>
%else
%addtorecord dataRec FilePackaging {}
%endif
%endif
%if (dataScope == "Imported")
%if (dataInit == "Macro")
%if isDataHdrEmpty && isDataHdrInstSpecific
%assign errTxt = "Imported macros with instance-specific header file " ...
"must have a header file specified (%<dataName>)."
%<LibReportError(errTxt)>
%endif
%elseif (dataInit == "Static")
%assign errTxt = "Imported data cannot be statically initialized (%<dataName>)."
%<LibReportError(errTxt)>
%endif
%elseif (dataAccess == "Pointer")
%assign errTxt = "Non-Imported data cannot be accessed via pointer (%<dataName>)."
%<LibReportError(errTxt)>
%endif
%if (SLibIsSignalType(dataRec) && !classDefn.DataUsage.IsSignal)
%assign errTxt = "Signal or state '%<dataName>' cannot use custom storage class " ...
"'%<class.Name>' because the CSC does not support signals."
%<LibReportError(errTxt)>
%endif
%if (SLibIsParameterType(dataRec) && !classDefn.DataUsage.IsParameter)
%assign errTxt = "Parameter '%<dataName>' cannot use custom storage class " ...
"'%<class.Name>' because the CSC does not support parameters."
%<LibReportError(errTxt)>
%endif
%if ((dataInit == "Macro") && (dataAccess != "Direct"))
%assign errTxt = "Data with macro initialization cannot be accessed via pointer (%<dataName>)."
%<LibReportError(errTxt)>
%endif
%if ((dataInit == "Macro") && SLibIsSignalType(dataRec))
%assign errTxt = "CSC enabled for signal cannot have macro initialization (%<dataName>)./n" ...
"Select a different option for data initialization."
%<LibReportError(errTxt)>
%endif
%if ((dataInit == "Dynamic") && SLibIsParameterType(dataRec))
%assign errTxt = "Parameter data cannot have Dynamic initialization (%<dataName>)."
%<LibReportError(errTxt)>
%endif
%if !ISEMPTY(props)
%if ((!ISEMPTY(dataRec.FilePackaging.HeaderFile)) && ...
(dataScope != "Imported"))
%assert(dataScope == "Exported")
%assign errTxt = FEVAL("slprivate", "check_generated_filename", ...
dataRec.FilePackaging.HeaderFile, ".h")
%if !ISEMPTY(errTxt)
%assign errTxt = "Invalid header file for exported data (%<dataName>): %<errTxt>"
%<LibReportError(errTxt)>
%endif
%endif
%if (!FcnIsDeclAndMacroGeneratedToSharedHeaderFile(headerFileOfExportedData) && ...
SLibIsCompactFileFormat() && !ISEMPTY(headerFileOfExportedData))
%<SLibReportWarningWithId("RTW:tlc:GeneratingHeaderFileForCompactFormatOutsideSharedArea")>
%endif
%endif
%assign memSecDef = SLibGetMemorySectionDefForData(dataRec)
%if ISEMPTY(memSecDef)
%<LibReportFatalError("MS Definition not provided")>
%endif
%if (SLibIsSignalType(dataRec) && (memSecDef.IsConst == 1))
%assign errTxt = "Signal '%<dataName>' cannot be assigned to memory section '%<memSecDef.Name>' " ...
"because it specifies the const qualifier./n" ...
"Select a different storage class or memory section."
%<LibReportError(errTxt)>
%endif
%if (SLibIsSignalType(dataRec) && (memSecDef.DataUsage.IsSignal == 0))
%assign errTxt = "Signal '%<dataName>' cannot be assigned to memory section '%<memSecDef.Name>'./n" ...
"Select a different storage class or memory section."
%<LibReportError(errTxt)>
%endif
%if (SLibIsParameterType(dataRec) && (memSecDef.DataUsage.IsParameter == 0))
%assign errTxt = "Parameter '%<dataName>' cannot be assigned to memory section '%<memSecDef.Name>'./n" ...
"Select a different storage class or memory section."
%<LibReportError(errTxt)>
%endif
%assign prepragma = ""
%assign postpragma = ""
%assign msDefn = dataRec.MSDefn
%if (msDefn.PragmaPerVar)
%assign dataId = LibGetRecordIdentifier(dataRec)
%assign prepragma = SLibPragmaIdentifierRegexp(...
msDefn.PrePragma, dataId)
%assign postpragma = SLibPragmaIdentifierRegexp(...
msDefn.PostPragma, dataId)
%endif
%if FcnWriteOutCustomDataDefinition(dataRec, dataScope, dataInit, dataOwner)
%assign defFile = dataRec.FilePackaging.DefineFile
%if (defFile < 0)
%assign errTxt="DefinitionFile undefined for %<LibGetRecordIdentifier(dataRec)>"
%<LibReportError(errTxt)>
%endif
%assign staticKey = ""
%if (dataScope == "File" && !dataInitViaMacro)
%assign staticKey = "static"
%endif
%if isObjectBased
%assign defnsRecord = SLibObjectCustomStorageClassVarDefns(cscPackage,cscName,dataRec.Identifier)
%else
%assign defnsRecord = LibCustomData(dataRec,"define","","")
%endif
%if TYPE(defnsRecord) != "Scope"
%assert (TYPE(defnsRecord) == "String")
%assign defns = defnsRecord
%assign defnFromCustomTLC = TLC_FALSE
%else
%assert (ISFIELD(defnsRecord, "CustomDefine"))
%assign defns = defnsRecord.CustomDefine
%assign defnFromCustomTLC = TLC_TRUE
%endif
%assign comment = LibCustomData(dataRec,"defnComment","","")
%if ((TYPE(comment) != "Vector") || (SIZE(comment)[1] != 3))
%assign errTxt = "Insufficient comments provided for /
%<LibGetRecordIdentifier(dataRec)>./n /
The comment should be a 3 element Vector of /
Strings:/n[/"Top Comment/", /"Side Comment /" /
/"Bottom Comment/"]/n /
Modify Data Access method/n"
%<LibReportError(errTxt)>
%endif
%assign toSharedHeaderFile = (!defnFromCustomTLC && ...
FcnIsDeclAndMacroGeneratedToSharedHeaderFile(headerFileOfExportedData)) || ...
(SLibParamIsVariantControlParam(dataRec) && ::CompiledModel.GenUtilsSrcInSharedLocation)
%openfile defnBuf
%if !WHITE_SPACE(defns)
%assign doUsage = ::CompiledModel.DataObjectUsage.File[defFile]
%assign defDoesNotNeedGuard = doUsage.Type == "header" && doUsage.IsCustom == "yes" && FcnIsDeclAndMacroGeneratedToSharedHeaderFile(headerFileOfExportedData)
%assign vcRecord = defDoesNotNeedGuard ? SLibVariantConditionRecord() : SLibGetDataInlineVariantNetConditions(dataRec)
%assign ifCond = vcRecord.ifCond
%assign ifEndCond = vcRecord.endIfCond
%if CGMODEL_ACCESS("CGModel.getCustomDataTraceIsEnabled")
%assign defns = SLibAddTraceToCustomDataBuff(dataRec, defns, csc, toSharedHeaderFile)
%endif
%assign usedInVariantExpr = ISFIELD(dataRec, "IsVariantControlPrmInCondExpr") && dataRec.IsVariantControlPrmInCondExpr
%if !dataInitViaMacro || (dataInitViaMacro && !usedInVariantExpr)
%<ifCond>
%endif
%if !(WHITE_SPACE(comment[0]))
%
%endif
%if(!WHITE_SPACE(prepragma) && dataInit != "Macro")
%<prepragma>
%endif
%<staticKey> %<defns> %
%if(!WHITE_SPACE(postpragma) && dataInit != "Macro")
%<postpragma>
%endif
%if !(WHITE_SPACE(comment[2]))
%
%endif
%if !dataInitViaMacro || (dataInitViaMacro && !usedInVariantExpr)
%<ifEndCond>
%endif
%endif
%closefile defnBuf
%if !dataInitViaMacro
%<SLibAddToCSCBuffers( ...
defFile,dataRec.FilePackaging.DefineSymbol, ...
"Definitions", cscPackage, memSecDef, ...
classDefn, defnBuf)>
%elseif WHITE_SPACE(defns) || !toSharedHeaderFile
%<SLibAddToCSCBuffers(defFile,dataRec.FilePackaging.DefineSymbol,/
"Defines", cscPackage, memSecDef, /
classDefn, defnBuf)>
%assign objCSCMSPackage.PackageName = cscPackage
%assign objCSCMSPackage.MemSecName = memSecDef.Name
%assign objCSCMSPackage.MemSecComment = memSecDef.Comment
%assign objCSCMSPackage.MemSecAddPragma = TLC_FALSE
%assign objCSCMSPackage.MemSecPrepragma = ""
%assign objCSCMSPackage.MemSecPostpragma = ""
%assign objCSCMSPackage.CSCName = classDefn.Name
%assign objCSCMSPackage.CSCComment = classDefn.DefineComment
%<FcnAddDeclAndMacroToSharedHeaderFile(objInfoArrForNonSharedData, -1, defnBuf, dataRec, TLC_TRUE, objCSCMSPackage,areMutuallyExclusiveSignals)>
%else
%assign objCSCMSPackage.PackageName = cscPackage
%assign objCSCMSPackage.MemSecName = memSecDef.Name
%assign objCSCMSPackage.MemSecComment = memSecDef.Comment
%assign objCSCMSPackage.MemSecAddPragma = TLC_FALSE
%assign objCSCMSPackage.MemSecPrepragma = ""
%assign objCSCMSPackage.MemSecPostpragma = ""
%assign objCSCMSPackage.CSCName = classDefn.Name
%assign objCSCMSPackage.CSCComment = classDefn.DefineComment
%<FcnAddDeclAndMacroToSharedHeaderFile(objInfoArr, defFile, defnBuf, dataRec, TLC_TRUE, objCSCMSPackage,areMutuallyExclusiveSignals)>
%endif
%if dataScope == "File"
%continue
%endif
%endif
%assign externFiles = dataRec.FilePackaging.FilesWithDeclare
%assign numExternFiles = SIZE(externFiles)[1]
%if isObjectBased
%assign declsRecord = SLibObjectCustomStorageClassVarDecls( ...
cscPackage,cscName,dataRec.Identifier)
%else
%assign declsRecord = LibCustomData(dataRec,"declare","","")
%endif
%assign comment = LibCustomData(dataRec,"declComment","","")
%if TYPE(declsRecord) != "Scope"
%assert (TYPE(declsRecord) == "String")
%assign decls = declsRecord
%assign declFromCustomTLC = TLC_FALSE
%else
%assert (ISFIELD(declsRecord, "CustomDeclare"))
%assign decls = declsRecord.CustomDeclare
%assign declFromCustomTLC = TLC_TRUE
%endif
%if WHITE_SPACE(decls) || declFromCustomTLC
%if ((dataScope == "Exported") && (!isDataHdrEmpty)) ...
&& (isMdlRefTarget || hasModelBlocks)
%assign errTxt = "Invalid HeaderFile '%<dataHdr>' for data " ...
"object '%<LibGetRecordIdentifier(dataRec)>'. " ...
"Data objects used either with a referenced model or with "...
"a model that contains Model blocks cannot be exported " ...
"via a header file. /n" ...
"Consider setting the object's HeaderFile to an empty " ...
"string or changing the object's DataScope to 'Imported'"
%<LibReportError(errTxt)>
%endif
%endif
%if ((TYPE(comment) != "Vector") || (SIZE(comment)[1] != 3))
%assign errTxt = "Insufficient comments provided for /
%<LibGetRecordIdentifier(dataRec)>./n /
The comment should be a 3 element Vector of /
Strings:/n[/"Top Comment/", /"Side Comment /" /
/"Bottom Comment/"]/n /
Modify Data Access method/n"
%<LibReportError(errTxt)>
%endif
%assign toSharedHeaderFile = (!WHITE_SPACE(decls) && !declFromCustomTLC && ...
FcnIsDeclAndMacroGeneratedToSharedHeaderFile(headerFileOfExportedData))
%openfile declBuf
%if !WHITE_SPACE(decls)
%assign vcRecord = SLibGetDataInlineVariantNetConditions(dataRec)
%assign ifCond = vcRecord.ifCond
%assign ifEndCond = vcRecord.endIfCond
%if FcnIsDeclAndMacroGeneratedToSharedHeaderFile(headerFileOfExportedData)
%assign ifCond = ""
%assign ifEndCond = ""
%endif
%<ifCond>
%if !(WHITE_SPACE(comment[0]))
%
%endif
%if CGMODEL_ACCESS("CGModel.getCustomDataTraceIsEnabled")
%assign decls = SLibAddTraceToCustomDataBuff(dataRec, decls, csc, toSharedHeaderFile)
%else
%assign elemNameTraceMarker = ""
%if ISFIELD(dataRec, "VarGroupIdx")
%assert(SLibIsLegacyStorageClassForDataRecord(dataRec))
%assign idx = dataRec.VarGroupIdx
%assign varGroupElem = ::CompiledModel.VarGroups.VarGroup[idx[0]].VarGroupElements[idx[1]]
%assign modelElem = SLibGetModelElemCategory(varGroupElem)
%else
%assign modelElem = SLibGetModelElemCategoryForIndividualMapping(dataRec)
%assign elemNameTraceMarker = SLibAddTrace2("StorageClassSource", "Individual", "ModelDataSource", "%<LibGetRecordIdentifier(dataRec)>")
%<SLibTraceBegin(elemNameTraceMarker)>
%endif
%assign traceMarker = SLibAddTrace2("ModelElemCategory", "%<modelElem>", "StorageClass", "%<csc.Name>")
%<SLibTraceBegin(traceMarker)>
%assign blockTraceMarker = ""
%if ISFIELD(dataRec, "BlockName")
%assign blockTraceMarker = SLibAddBlockTrace(dataRec.BlockName)
%<SLibTraceBegin(blockTraceMarker)>
%endif
%endif
%if SLibIsPragmaOnDecls() && dataInit != "Macro"
%if(!WHITE_SPACE(prepragma))
%<prepragma>
%endif
%<decls> %
%if(!WHITE_SPACE(postpragma))
%<postpragma>
%endif
%else
%<decls> %
%endif
%if !CGMODEL_ACCESS("CGModel.getCustomDataTraceIsEnabled")
%<SLibTraceEnd(blockTraceMarker)>
%<SLibTraceEnd(traceMarker)>
%<SLibTraceEnd(elemNameTraceMarker)>
%endif
%if !(WHITE_SPACE(comment[2]))
%
%endif
%<ifEndCond>
%endif
%closefile declBuf
%if WHITE_SPACE(decls)
%assert ((dataInitViaMacro && isDataHdrEmpty) || ...
(classDefn.CSCType == "AccessFunction") || ...
(classDefn.CSCType == "Other"))
%endif
%if !toSharedHeaderFile
%if dataInitViaMacro == TLC_TRUE
%assert (numExternFiles == 0)
%endif
%foreach exIdx = numExternFiles
%assign externFile = externFiles[exIdx]
%if externFile < 0
%assign errTxt = "ExternFile[%<exIdx>] undefined /
for %<LibGetRecordIdentifier(dataRec)>"
%<LibReportFatalError(errTxt)>
%endif
%assign hfileBaseName = ::CompiledModel.DataObjectUsage.File[externFile].Name
%assign hfileName = hfileBaseName + ".h"
%if (::CompiledModel.DataObjectUsage.File[externFile].Type == "header")
%assign mf = SLibDoesModelFileExist("SystemHeader", hfileBaseName)
%if TYPE(mf) == "Scope" && SLibDirectAccessGetFileAttribute(mf, "Group") == "utility"
%assign errArgs = ["%<hfileName>", "%<LibGetRecordIdentifier(dataRec)>", "utility file"]
%<SLibReportErrorWithIdAndArgs("RTW:tlc:ErrWhenGenDataConflictHeaderFile", errArgs)>
%endif
%endif
%<SLibAddToCSCBuffers(externFile, /
dataRec.FilePackaging.DeclareSymbol, /
"Declarations", cscPackage, memSecDef, /
classDefn, declBuf)>
%endforeach
%if numExternFiles > 0 && !WHITE_SPACE(decls)
%assign objCSCMSPackage.PackageName = cscPackage
%assign objCSCMSPackage.MemSecName = memSecDef.Name
%assign objCSCMSPackage.MemSecComment = memSecDef.Comment
%assign objCSCMSPackage.MemSecAddPragma = SLibIsPragmaOnDecls() && !memSecDef.PragmaPerVar
%if objCSCMSPackage.MemSecAddPragma
%assign objCSCMSPackage.MemSecPrepragma = memSecDef.PrePragma
%assign objCSCMSPackage.MemSecPostpragma = memSecDef.PostPragma
%else
%assign objCSCMSPackage.MemSecPrepragma = ""
%assign objCSCMSPackage.MemSecPostpragma = ""
%endif
%assign objCSCMSPackage.CSCName = classDefn.Name
%assign objCSCMSPackage.CSCComment = classDefn.DeclareComment
%assign fileIdx = externFiles[0]
%assign externFile = -1
%if fileIdx >= 0
%assign hfileBaseName = ::CompiledModel.DataObjectUsage.File[fileIdx].Name
%assign mf = SLibDoesModelFileExist("SystemHeader", hfileBaseName)
%if !ISEMPTY(mf) && SLibDirectAccessGetFileAttribute(mf, "SharedType")
%assign externFile = fileIdx
%endif
%endif
%<FcnAddDeclAndMacroToSharedHeaderFile(objInfoArrForNonSharedData, externFile, declBuf, dataRec, TLC_FALSE, objCSCMSPackage,areMutuallyExclusiveSignals)>
%endif
%else
%if numExternFiles > 0
%assert (numExternFiles == 1)
%assign externFile = externFiles[0]
%assign objCSCMSPackage.PackageName = cscPackage
%assign objCSCMSPackage.MemSecName = memSecDef.Name
%assign objCSCMSPackage.MemSecComment = memSecDef.Comment
%assign objCSCMSPackage.MemSecAddPragma = SLibIsPragmaOnDecls() && !memSecDef.PragmaPerVar
%if objCSCMSPackage.MemSecAddPragma
%assign objCSCMSPackage.MemSecPrepragma = memSecDef.PrePragma
%assign objCSCMSPackage.MemSecPostpragma = memSecDef.PostPragma
%else
%assign objCSCMSPackage.MemSecPrepragma = ""
%assign objCSCMSPackage.MemSecPostpragma = ""
%endif
%assign objCSCMSPackage.CSCName = classDefn.Name
%assign objCSCMSPackage.CSCComment = classDefn.DeclareComment
%<FcnAddDeclAndMacroToSharedHeaderFile(objInfoArr, externFile, declBuf, dataRec, TLC_FALSE, objCSCMSPackage,areMutuallyExclusiveSignals)>
%endif
%endif
%if dataScope == "Imported"
%assign objCSCMSPackage.PackageName = cscPackage
%assign objCSCMSPackage.MemSecName = memSecDef.Name
%assign objCSCMSPackage.MemSecComment = memSecDef.Comment
%assign objCSCMSPackage.MemSecAddPragma = SLibIsPragmaOnDecls() && !memSecDef.PragmaPerVar
%if objCSCMSPackage.MemSecAddPragma
%assign objCSCMSPackage.MemSecPrepragma = memSecDef.PrePragma
%assign objCSCMSPackage.MemSecPostpragma = memSecDef.PostPragma
%else
%assign objCSCMSPackage.MemSecPrepragma = ""
%assign objCSCMSPackage.MemSecPostpragma = ""
%endif
%assign objCSCMSPackage.CSCName = classDefn.Name
%assign objCSCMSPackage.CSCComment = classDefn.DeclareComment
%<FcnAddDeclAndMacroToSharedHeaderFile(ImportedObjInfo, -1, declBuf, dataRec, TLC_FALSE, objCSCMSPackage,areMutuallyExclusiveSignals)>
%addtorecord ImportedObjInfo.objInfo[ImportedObjInfo.NumInfo-1] ...
dataScope "Imported"
%endif
%assign importFiles = dataRec.FilePackaging.FilesWithInclude
%assign headerFile = dataRec.FilePackaging.HeaderFile
%assign numImportFiles = SIZE(importFiles)[1]
%foreach hdrIdx = numImportFiles
%assign importFile = importFiles[hdrIdx]
%assign id = LibGetRecordIdentifier(dataRec)
%if importFile < 0
%assign errTxt = "ImportFile[%<hdrIdx>] undefined for %<id>"
%<LibReportFatalError(errTxt)>
%endif
%assign usedInVarExpr = ISFIELD(dataRec, "IsVariantControlPrmInCondExpr") && dataRec.IsVariantControlPrmInCondExpr
%assign usedInVarExpr = usedInVarExpr && !SLibGenModelTypesFile()
%<FcnCacheHeaderInImportsFile(id, headerFile, importFile,usedInVarExpr)>
%endforeach
%if GenerateErtSFunction == 1
%assign csc_ertSFcn_fileName = SLibGetFileNameForCode("csc_ertSFcn")
%assign csc_ertSFcn_fileIdx = FcnGetFileIdx(csc_ertSFcn_fileName, "header", "no")
%if ISEMPTY(headerFile)
%<SLibAddToCSCBuffers(csc_ertSFcn_fileIdx, /
dataRec.FilePackaging.DeclareSymbol, /
"Declarations", cscPackage, memSecDef, /
classDefn, declBuf)>
%else
%<FcnCacheHeaderInImportsFile(LibGetRecordIdentifier(dataRec), headerFile, csc_ertSFcn_fileIdx,TLC_FALSE)>
%endif
%endif
%if RTWCAPI == 1
%assign capi_fileName = SLibGetFileNameForCode("mdl_capi_src")
%assign capi_fileIdx = FcnGetFileIdx(capi_fileName, "source", "no")
%if ISEMPTY(headerFile)
%<SLibAddToCSCBuffers(capi_fileIdx, /
dataRec.FilePackaging.DeclareSymbol, /
"Declarations", cscPackage, memSecDef, /
classDefn, declBuf)>
%else
%<FcnCacheHeaderInImportsFile(LibGetRecordIdentifier(dataRec), headerFile, capi_fileIdx,TLC_FALSE)>
%endif
%endif
%if SLibIsExportFcnDiagram() && GenerateSampleERTMain
%assign main_fileName = SLibGetFileNameForCode("main_src")
%assign main_fileIdx = FcnGetFileIdx(main_fileName, "source", "no")
%if ISEMPTY(headerFile)
%<SLibAddToCSCBuffers(main_fileIdx, /
dataRec.FilePackaging.DeclareSymbol, /
"Declarations", cscPackage, memSecDef, /
classDefn, declBuf)>
%else
%<FcnCacheHeaderInImportsFile(LibGetRecordIdentifier(dataRec), headerFile, main_fileIdx,TLC_FALSE)>
%endif
%endif
%endwith
%endforeach
%endif
%<REMOVEFIELD(class, "FilePackagingDefaults")>
%endforeach
%if ::CompiledModel.GenUtilsSrcInSharedLocation == 1
%assign sharedFileLocal = ::CompiledModel.LocalSharedCodeManagerFile
%assign sharedFileMaster = ::CompiledModel.MasterSharedCodeManagerFile
%assign sharedFile = ""
%if sharedFileLocal == sharedFileMaster
%assign sharedFile = sharedFileLocal
%else
%assign sharedFile = sharedFileMaster
%endif
%if ::CompiledModel.SharedTypesInIR
%assign sharedHdrInfo = FEVAL("rtwprivate", "add2FileMapSharedDataAndConstants", ::CompiledModel.Name, ::CompiledModel.RTWInfoMatFile.sharedSourcesDir, objInfoArrForNonSharedData, 3, 1, sharedFile, "traperror")
%else
%assign sharedHdrInfo = FEVAL("rtwprivate", "add2FileMap", ::CompiledModel.Name, ::CompiledModel.RTWInfoMatFile.sharedSourcesDir, objInfoArrForNonSharedData, 3, 1, "traperror")
%endif
%if TYPE(sharedHdrInfo)!="Scope" || sharedHdrInfo.status != 1
%assign errmsg = sharedHdrInfo.errorMessage
%<SLibReportErrorWithIdAndArgs("RTW:tlc:ErrWhenGenNonSharedDataMacroDecl", errmsg)>
%endif
%if ::CompiledModel.SharedTypesInIR
%assign sharedHdrInfo = FEVAL("rtwprivate", "add2FileMapSharedDataAndConstants", ::CompiledModel.Name, ::CompiledModel.RTWInfoMatFile.sharedSourcesDir, objInfoArr, 1, 1, sharedFile, "traperror")
%else
%assign sharedHdrInfo = FEVAL("rtwprivate", "add2FileMap", ::CompiledModel.Name, ::CompiledModel.RTWInfoMatFile.sharedSourcesDir, objInfoArr, 1, 1, "traperror")
%endif
%if TYPE(sharedHdrInfo)!="Scope" || sharedHdrInfo.status != 1
%assign errmsg = sharedHdrInfo.errorMessage
%<SLibReportErrorWithIdAndArgs("RTW:tlc:ErrWhenGenSharedDataMacroDecl", errmsg)>
%else
%if objInfoArr.NumInfo > 0
%<SLibSynchronizeFileRepWithFileRecords()>
%endif
%<FcnCheckNameCollisionWithNonSharedHeaderFile(sharedHdrInfo)>
%endif
%if (ImportedObjInfo.NumInfo > 0)
%assign sharedHdrInfo = FEVAL("rtwprivate", "add2FileMapSharedDataAndConstants", ::CompiledModel.Name, ::CompiledModel.RTWInfoMatFile.sharedSourcesDir, ImportedObjInfo, 3, 1, sharedFile,"traperror")
%if TYPE(sharedHdrInfo)!="Scope" || sharedHdrInfo.status != 1
%assign errmsg = sharedHdrInfo.errorMessage
%<SLibReportErrorWithIdAndArgs("RTW:tlc:ErrWhenGenSharedDataMacroDecl", errmsg)>
%endif
%endif
%endif
%endwith
%endfunction
%function SLibAddTraceToCustomDataBuff(dataRec, dataBuf, csc, toSharedHeaderFile) void
%openfile dataBufWithTrace
%assign elemNameTraceMarker = ""
%if ISFIELD(dataRec, "VarGroupIdx")
%assert(SLibIsLegacyStorageClassForDataRecord(dataRec))
%assign idx = dataRec.VarGroupIdx
%assign varGroupElem = ::CompiledModel.VarGroups.VarGroup[idx[0]].VarGroupElements[idx[1]]
%assign modelElem = SLibGetModelElemCategory(varGroupElem)
%else
%assign modelElem = SLibGetModelElemCategoryForIndividualMapping(dataRec)
%assign elemNameTraceMarker = SLibAddTrace2("StorageClassSource", "Individual", "ModelDataSource", "%<LibGetRecordIdentifier(dataRec)>")
%<SLibTraceBegin(elemNameTraceMarker)> /
%endif
%assign traceMarker = SLibAddTrace2("ModelElemCategory", "%<modelElem>", "StorageClass", "%<csc.Name>")
%<SLibTraceBegin(traceMarker)> /
%assign tmpBuf = dataBuf
%if !toSharedHeaderFile
%assign tmpBuf = SLibAddBlockTraceForDeclarationFromDataRec(dataRec, tmpBuf)
%endif
%<tmpBuf>
%<SLibTraceEnd(traceMarker)>
%<SLibTraceEnd(elemNameTraceMarker)>
%closefile dataBufWithTrace
%return dataBufWithTrace
%endfunction
%function FcnWriteOutCustomDataDefinition(dataRec, dataScope, dataInit, dataOwner) void
%assign retVal = TLC_FALSE
%if (dataScope == "File" || dataScope == "Exported")
%assign gmmDataRec = SLibGetGlobalMemoryDataRecord(dataRec.MemoryMapIdx)
%assign rootSystem = ::CompiledModel.System[NumSystems-1]
%assign reqInsts = LibGetSystemField(rootSystem,"ReqRootPrmHdrDataInsts")
%switch gmmDataRec.Type
%case "parameter"
%assign writeDefnDefault = ((reqInsts.ExpGlobalPrmsInst) || (dataRec.IsGlobal == TLC_FALSE) || dataInit == "Macro")
%assign retVal = FcnIsGenCustomDataDefinition(dataOwner, writeDefnDefault)
%break
%case "signal"
%assign retVal = FcnIsGenCustomDataDefinition(dataOwner, ((reqInsts.ExpGlobalSigsInst) && ...
(SLibWriteOutInstForSignalRec(gmmDataRec.RTWRecord))))
%break
%case "state"
%assign retVal = FcnIsGenCustomDataDefinition(dataOwner, reqInsts.ExpGlobalDworkInst)
%break
%case "unknown"
%assign retVal = FcnIsGenCustomDataDefinition(dataOwner, ((reqInsts.ExpGlobalDworkInst) && ...
(SLibWriteOutInstForSignalRec(gmmDataRec.RTWRecord))))
%break
%default
%assign errTxt = "Unexpected Type of data for custom storage class: " ...
"%<gmmDataRec.Type>"
%<LibReportFatalError(errTxt)>
%endswitch
%endif
%return retVal
%endfunction
%function FcnGetCSCFileRec(fileIdx) void
%with ::CompiledModel
%assign record = ::CompiledModel.CustomDataBuffers
%if !ISFIELD(record.FileRecMap, "FileMap%<fileIdx>")
%if (fileIdx < 0)
%<LibReportFatalError("File Errror : File = -1")>
%endif
%assign newFileRec = FileRec { ...
Index fileIdx; ...
NumSymbols 0 ; ...
Symbol [] ; ...
SymbolMap {} ; ...
IncludesMap {} ...
}
%assign idx = record.NumFiles
%assign record.FileRec = record.FileRec + newFileRec
%addtorecord record.FileRecMap FileMap%<fileIdx> record.FileRec[idx]
%assign record.NumFiles = idx+1
%endif
%return record.FileRecMap.FileMap%<fileIdx>
%endwith
%endfunction
%function FcnGetCSCDataBuffer(fileName, symbol, symbolType, package, /
memSectionDef, cscDef) void
%with ::CompiledModel
%assign record = ::CompiledModel.CustomDataBuffers
%assign record = FcnGetCSCFileRec(fileName)
%if !ISFIELD(record.SymbolMap, "SymbolMap%<symbol>")
%if (symbol < 0)
%<LibReportFatalError("Symbol Errror : Symbol = -1")>
%endif
%assign newSymbol = Symbol { ...
Index symbol; ...
Type symbolType; ...
NumPackages 0; ...
Package []; ...
PackageMap {} ...
}
%assign idx = record.NumSymbols
%assign record.Symbol = record.Symbol + newSymbol
%addtorecord record.SymbolMap SymbolMap%<symbol> record.Symbol[idx]
%assign record.NumSymbols = idx+1
%endif
%assert (record.SymbolMap.SymbolMap%<symbol>.Type == symbolType)
%assign record = record.SymbolMap.SymbolMap%<symbol>
%if !ISFIELD(record.PackageMap, package)
%assign newPackage = Package { ...
Name package; ...
NumMemSections 0; ...
MemSection []; ...
MemSectionMap {} ...
}
%assign idx = record.NumPackages
%assign record.Package = record.Package + newPackage
%addtorecord record.PackageMap %<package> record.Package[idx]
%assign record.NumPackages = idx+1
%endif
%assign record = record.PackageMap.%<package>
%if !ISFIELD(record.MemSectionMap, memSectionDef.Name)
%assign newMemSection = MemSection { ...
Definition memSectionDef; ...
NumClasses 0; ...
Class []; ...
ClassMap {} ...
}
%assign idx = record.NumMemSections
%assign record.MemSection = record.MemSection + newMemSection
%addtorecord record.MemSectionMap /
%<memSectionDef.Name> record.MemSection[idx]
%assign record.NumMemSections = idx+1
%endif
%assign record = record.MemSectionMap.%<memSectionDef.Name>
%if ISFIELD(record.ClassMap, cscDef.Name)
%return record.ClassMap.%<cscDef.Name>
%endif
%assign newClass = Class { ...
Definition cscDef; ...
Code "" ...
}
%assign idx = record.NumClasses
%assign record.Class = record.Class + newClass
%addtorecord record.ClassMap %<cscDef.Name> record.Class[idx]
%assign record.NumClasses = idx+1
%endwith
%return record.Class[record.NumClasses - 1]
%endfunction
%function SLibAddToCSCBuffers(fileName, symbol, symbolType, package, /
memSectionDef, cscDef, fBuf) void
%if !WHITE_SPACE(fBuf)
%assign cscBuffer = FcnGetCSCDataBuffer(fileName, symbol, symbolType, /
package, memSectionDef, cscDef)
%assign cscBuffer.Code = cscBuffer.Code + fBuf
%endif
%endfunction
%function SLibDumpCustomClassData() void
%with ::CompiledModel.CustomDataBuffers
%foreach fileIdx = NumFiles
%assign fileRecord = FileRec[fileIdx]
%assign fileIndex = fileRecord.Index
%assign opFile = FcnGetModelFile(fileIndex)
%createrecord defaultCustomDataCommentsAdded { Defines TLC_FALSE; ...
Declarations TLC_FALSE; ...
Definitions TLC_FALSE}
%foreach symbolIdx = fileRecord.NumSymbols
%assign symbolRecord = fileRecord.Symbol[symbolIdx]
%assign symIdx = symbolRecord.Index
%assign symbolName = /
::CompiledModel.DataObjectUsage.TemplateSymbol[symIdx].Name
%assign symbolType = symbolRecord.Type
%assign tmpSymBuffer = "/n"
%assign packages = FIELDNAMES(symbolRecord.PackageMap)
%foreach packIdx = symbolRecord.NumPackages
%assign packRecord = symbolRecord.PackageMap.%
%assign packName = packRecord.Name
%assign memSections = FIELDNAMES(packRecord.MemSectionMap)
%foreach memIdx = packRecord.NumMemSections
%assign memSecRecord = /
packRecord.MemSectionMap.%
%openfile tmpMemBuffer
%if !WHITE_SPACE(memSecRecord.Definition.Comment)
%<memSecRecord.Definition.Comment>
%endif
%if !WHITE_SPACE(memSecRecord.Definition.PrePragma) && ...
!memSecRecord.Definition.PragmaPerVar && ...
(symbolType == "Definitions" || ...
(symbolType == "Declarations" && SLibIsPragmaOnDecls()))
%<memSecRecord.Definition.PrePragma>
%endif
%assign classes = FIELDNAMES(memSecRecord.ClassMap)
%foreach cscIdx = memSecRecord.NumClasses
%assign csc = memSecRecord.ClassMap.%
%if !WHITE_SPACE(csc.Code)
%switch(symbolType)
%case "Definitions"
%assign cscComment = csc.Definition.DefineComment
%break
%case "Defines"
%assign cscComment = csc.Definition.DefineComment
%break
%case "Declarations"
%assign cscComment = csc.Definition.DeclareComment
%break
%case "Types"
%assign cscComment = csc.Definition.TypeComment
%break
%default
%assign cscComment = ""
%break
%endswitch
%if !ISEMPTY(cscComment) && !WHITE_SPACE(cscComment)
%<cscComment>
%endif
%<csc.Code>
%endif
%endforeach
%if !WHITE_SPACE(memSecRecord.Definition.PostPragma) && ...
!memSecRecord.Definition.PragmaPerVar && ...
(symbolType == "Definitions" || ...
(symbolType == "Declarations" && SLibIsPragmaOnDecls()))
%<memSecRecord.Definition.PostPragma>
%endif
%closefile tmpMemBuffer
%assign tmpSymBuffer = tmpSymBuffer + tmpMemBuffer
%endforeach
%endforeach
%if !WHITE_SPACE(tmpSymBuffer) && (symbolType == "Defines" || ...
symbolType == "Declarations" || symbolType == "Definitions")
%if !defaultCustomDataCommentsAdded.%<symbolType>
%if symbolType == "Definitions"
%assign tmpSymBuffer = "/* Exported data definition */" + "/n" + tmpSymBuffer
%elseif symbolType == "Declarations"
%assign tmpSymBuffer = "/* Exported data declaration */" + "/n" + tmpSymBuffer
%else
%assign tmpSymBuffer = "/* Exported data define */" + "/n" + tmpSymBuffer
%endif
%assign defaultCustomDataCommentsAdded.%<symbolType> = TLC_TRUE
%endif
%endif
%if SLibSectionIsInFileContents(opFile, symbolName)
%if (symbolName == "Typedefs")
%<LibSetSourceFileSection(opFile, symbolName, tmpSymBuffer)>
%else
%assert (symbolName == symbolType)
%<LibSetSourceFileSection(opFile, symbolName, tmpSymBuffer)>
%endif
%else
%<LibAddSourceFileCustomSection(opFile, symbolType, symbolName)>
%<LibSetSourceFileCustomSection(opFile, symbolName, tmpSymBuffer)>
%endif
%endforeach
%<FcnAddIncludesToCustomDataFiles(opFile, fileIndex)>
%endforeach
%endwith
%endfunction
%function FcnAddIncludesToCustomDataFiles(opFile, fileIdx) void
%with ::CompiledModel.DataObjectUsage
%assign fileRec = ::CompiledModel.DataObjectUsage.File[fileIdx]
%if fileRec.IsCustom == "yes"
%assign mdl_types_filename = SLibGetFileNameForCode("mdl_types_hdr")
%assign mdl_hdr_filename = SLibGetFileNameForCode("mdl_hdr")
%openfile includesBuf
%if fileRec.Type == "source" && SLibIsCompactFileFormat()
#include "%<mdl_hdr_filename>.h"
%else
%<SLibIncludeUsedCoderTypesFilenames()>
%if !WHITE_SPACE(mdl_types_filename)
#include "%<mdl_types_filename>.h"
%endif
%endif
%closefile includesBuf
%<SLibSetModelFileAttribute(opFile, "Includes", includesBuf)>
%endif
%endwith
%endfunction
%function (objName, header, importsFile, usedAsVarControlExpr) void
%if WHITE_SPACE(header)
%assign errTxt = "HeaderFile not specified for data object '%<objName>'."
%<LibReportError(errTxt)>
%return
%endif
%assign headerFileName = header
%assign header = SLibAddHeaderFileDelimeter(header)
%assign modelHeaderFileName = LibGetMdlPubHdrBaseName() + ".h"
%assign modelSourceFileName = LibGetMdlSrcBaseName() + ".c"
%assign opFile = FcnGetModelFile(importsFile)
%assign opFileName = LibGetModelFileAttribute(opFile.Index, "Name")
%if headerFileName == modelHeaderFileName && ((opFileName == modelSourceFileName) ||...
SLibDirectAccessGetFileAttribute(opFile, "Shared"))
%assign headerIncluded = TLC_TRUE
%else
%assign headerIncluded = CGMODEL_ACCESS("FileRepository.getIsFileAlreadyIncluded", headerFileName, opFileName)
%endif
%if !headerIncluded
%assign hdrmarker = LibConvertNameToIdentifier(header)
%assign tmpBuffer = "#include %<header>/n"
%assign fileVarCond = CGMODEL_ACCESS("FileRepository.getFileVariantCondition",headerFileName)
%if !ISEMPTY(fileVarCond)
%assign tmpBuffer = SLibWrapBody(SLibIfVariantConditionForm(fileVarCond),tmpBuffer,SLibEndIfVariantConditionForm(fileVarCond))
%endif
%if LibIsSourceFileCustomSection(opFile, "RTWCSCIncludes")
%if usedAsVarControlExpr
%<LibSetSourceFileVariantCustomSection(opFile, "RTWCSCIncludes", tmpBuffer)>
%else
%<LibSetSourceFileCustomSection(opFile, "RTWCSCIncludes", tmpBuffer)>
%endif
%else
%<LibAddSourceFileCustomSection(opFile, "Includes", "RTWCSCIncludes")>
%assign inclComment = "/* Includes for objects with custom storage classes. *//n"
%assign tmpBuffer = inclComment + tmpBuffer
%<LibSetSourceFileCustomSection(opFile, "RTWCSCIncludes", tmpBuffer)>
%endif
%endif
%endfunction
%function FcnAddFilePackagingByRTW(record, packagingType, scope, /
isHeaderEmpty, isMacro, /
defDefineFile, defExportFile, /
defImportFile, hdrFile, /
defDefineSymbol, defDeclareSymbol, /
defMacroSymbol) void
%switch(scope)
%case "Imported"
%if isHeaderEmpty
%if !isMacro
%addtorecord record /
%<packagingType>{ /
DefineFile -1; /
DefineSymbol -1; /
FilesWithDeclare [%<defImportFile>]; /
DeclareSymbol defDeclareSymbol; /
FilesWithInclude []; /
HeaderFile "" /
}
%else
%addtorecord record /
%<packagingType>{ /
DefineFile -1; /
DefineSymbol -1; /
FilesWithDeclare []; /
DeclareSymbol -1; /
FilesWithInclude []; /
HeaderFile "" /
}
%endif
%else
%addtorecord record /
%<packagingType>{ /
DefineFile -1; /
DefineSymbol -1; /
FilesWithDeclare []; /
DeclareSymbol -1; /
FilesWithInclude [%<defImportFile>]; /
HeaderFile hdrFile /
}
%endif
%break
%case "Exported"
%case "Auto"
%if isHeaderEmpty
%if !isMacro
%addtorecord record /
%<packagingType>{ /
DefineFile defDefineFile; /
DefineSymbol defDefineSymbol; /
FilesWithDeclare [%<defExportFile>]; /
DeclareSymbol defDeclareSymbol; /
FilesWithInclude []; /
HeaderFile "" /
}
%else
%addtorecord record /
%<packagingType>{ /
DefineFile defExportFile; /
DefineSymbol defMacroSymbol; /
FilesWithDeclare []; /
DeclareSymbol -1; /
FilesWithInclude []; /
HeaderFile "" /
}
%endif
%else
%if !isMacro
%assign hdrIdentifier = FEVAL("strtok", hdrFile, ".")
%assign hdrIndex = FcnGetFileIdx(hdrIdentifier, "header", "yes")
%addtorecord record /
%<packagingType>{ /
DefineFile defDefineFile; /
DefineSymbol defDefineSymbol; /
FilesWithDeclare [%<hdrIndex>]; /
DeclareSymbol defDeclareSymbol; /
FilesWithInclude [%<defExportFile>]; /
HeaderFile hdrFile /
}
%else
%assign hdrIdentifier = FEVAL("strtok", hdrFile, ".")
%assign hdrIndex = FcnGetFileIdx(hdrIdentifier, "header", "yes")
%addtorecord record /
%<packagingType>{ /
DefineFile %<hdrIndex>; /
DefineSymbol defMacroSymbol; /
FilesWithDeclare []; /
DeclareSymbol -1; /
FilesWithInclude [%<defExportFile>]; /
HeaderFile hdrFile /
}
%endif
%endif
%break
%case "File"
%if !isMacro
%addtorecord record /
%<packagingType>{ /
DefineFile defDefineFile; /
DefineSymbol defDefineSymbol; /
FilesWithDeclare []; /
DeclareSymbol -1; /
FilesWithInclude []; /
HeaderFile "" /
}
%else
%addtorecord record /
%<packagingType>{ /
DefineFile defDefineFile; /
DefineSymbol defMacroSymbol; /
FilesWithDeclare []; /
DeclareSymbol -1; /
FilesWithInclude []; /
HeaderFile "" /
}
%endif
%break
%default
%addtorecord record /
%<packagingType>{ /
DefineFile -1; /
DefineSymbol -1; /
FilesWithDeclare []; /
DeclareSymbol -1; /
FilesWithInclude []; /
HeaderFile "" /
}
%break
%endswitch
%endfunction
%function FcnAddFilePackagingByMPT(record, dataObject) void
%if (!ISFIELD(dataObject.FilePackaging, "DefineFile") || /
!ISFIELD(dataObject.FilePackaging, "DefineSymbol") || /
!ISFIELD(dataObject.FilePackaging, "FilesWithDecl") || /
!ISFIELD(dataObject.FilePackaging, "DeclareSymbol") || /
!ISFIELD(dataObject.FilePackaging, "FilesWithIncl") || /
!ISFIELD(dataObject.FilePackaging, "HeaderFile"))
%assign errTxt = "MPT-Engine Interface has not set all the FilePackaging /
fields for data object '%<dataObject.Name>'."
%<LibReportFatalError(errTxt)>
%endif
%with dataObject.FilePackaging
%if !ISEMPTY(DefineFile)
%assign defineFile = DefineFile[0]
%else
%assign defineFile = -1
%endif
%if !ISEMPTY(FilesWithDecl)
%assign declFiles = FilesWithDecl
%else
%assign declFiles = []
%endif
%if !ISEMPTY(FilesWithIncl)
%assign inclFiles = FilesWithIncl
%else
%assign inclFiles = []
%endif
%if !ISEMPTY(HeaderFile)
%assign hdrFile = HeaderFile
%else
%assign hdrFile = ""
%endif
%if !ISEMPTY(DefineSymbol)
%assign defineSymbol = DefineSymbol[0]
%else
%assign defineSymbol = -1
%endif
%if !ISEMPTY(DeclareSymbol)
%assign declSymbol = DeclareSymbol[0]
%else
%assign declSymbol = -1
%endif
%endwith
%addtorecord record /
FilePackaging{ /
DefineFile defineFile; /
DefineSymbol defineSymbol; /
FilesWithDeclare declFiles; /
DeclareSymbol declSymbol; /
FilesWithInclude inclFiles; /
HeaderFile hdrFile /
}
%endfunction
%function FcnGetSymbolIdx(symbolName) void
%if !ISFIELD(::CompiledModel.DataObjectUsage, "NumTemplateSymbols")
%addtorecord ::CompiledModel.DataObjectUsage NumTemplateSymbols [0]
%endif
%assign symbolIdx = -1
%with ::CompiledModel.DataObjectUsage
%foreach tSymIdx = ::CompiledModel.DataObjectUsage.NumTemplateSymbols[0]
%if (TemplateSymbol[tSymIdx].Name == symbolName)
%assign symbolIdx = tSymIdx
%break
%endif
%endforeach
%if (symbolIdx == -1)
%addtorecord ::CompiledModel.DataObjectUsage /
TemplateSymbol { /
Name symbolName /
}
%assign symbolIdx = /
::CompiledModel.DataObjectUsage.NumTemplateSymbols[0]
%assign ::CompiledModel.DataObjectUsage.NumTemplateSymbols[0] = /
::CompiledModel.DataObjectUsage.NumTemplateSymbols[0] + 1
%endif
%endwith
%return symbolIdx
%endfunction
%function FcnGetFileIdx(fileName, fileType, isCustom) void
%assign fileIdx = -1
%with ::CompiledModel.DataObjectUsage
%foreach fIdx = NumFiles[0]
%if (File[fIdx].Name == fileName) && (File[fIdx].Type == fileType)
%assert (File[fIdx].IsCustom == isCustom)
%assign fileIdx = fIdx
%break
%endif
%endforeach
%if (fileIdx == -1)
%addtorecord ::CompiledModel.DataObjectUsage /
File { /
Name fileName; /
Type fileType; /
IsCustom isCustom /
}
%assign fileIdx = ::CompiledModel.DataObjectUsage.NumFiles[0]
%assign NumFiles[0] = NumFiles[0] + 1
%endif
%endwith
%return fileIdx
%endfunction
%function FcnGetModelFile(dataObjFileIdx) void
%with ::CompiledModel.DataObjectUsage
%assign fileName = File[dataObjFileIdx].Name
%assign fileType = File[dataObjFileIdx].Type
%assign fileIsCust = (File[dataObjFileIdx].IsCustom == "no" ? 0 : 1)
%assign creator = "Simulink"
%switch (fileType)
%case "source"
%assign main_fileName = SLibGetFileNameForCode("main_src")
%if fileName == main_fileName
%assert(!fileIsCust)
%assign opFile = SLibGetFileRecForCode("main_src")
%else
%assign opFile = LibCreateSourceFile("Source", creator, fileName)
%endif
%if fileIsCust
%<LibSetSourceFileCodeTemplate(opFile, ERTDataSrcFileTemplate)>
%endif
%break
%case "header"
%assign csc_ertSFcn_fileName = SLibGetFileNameForCode("csc_ertSFcn")
%if fileName == csc_ertSFcn_fileName
%assert(!fileIsCust)
%assign opFile = SLibGetFileRecForCode("csc_ertSFcn")
%else
%assign opFile = LibCreateSourceFile("Header", creator, fileName)
%endif
%if fileIsCust
%<LibSetSourceFileCodeTemplate(opFile, ERTDataHdrFileTemplate)>
%endif
%break
%default
%<LibReportFatalError("File cannot be created")>
%endswitch
%if fileIsCust
%<SLibSetModelFileAttribute(opFile, "Group", "data")>
%endif
%endwith
%return opFile
%endfunction
%function FcnGetRecordIdForDataObjUsage(dataRec) void
%if SLibIsLegacyStorageClassForDataRecord(dataRec)
%assign vgIdx = SLibGetRecordVarGroupIdx(dataRec)
%assign id = "__LegacyCSC_%<SLibVarGroupElementSource(vgIdx[0], vgIdx[1])>"
%else
%assign id = LibGetRecordIdentifier(dataRec)
%endif
%return id
%endfunction
%function FcnVerifyDataScope(dataRec, dataScope) void
%assign instProps = LibGetCustomStorageAttributes(dataRec)
%if (!ISEMPTY(instProps) && ISFIELD(instProps, "DataScope"))
%assign dataScope = instProps.DataScope
%endif
%assign returnScope = dataScope
%assign returnDefFile = -1
%assign isFileScope = TLC_FALSE
%if (dataScope == "File" || dataScope == "Auto")
%with ::CompiledModel.DataObjectUsage
%assign id = FcnGetRecordIdForDataObjUsage(dataRec)
%assign dataObjIdxInCGModel = CGMODEL_ACCESS("CGModel.DataObjUsage.getDataObjectUsageIdExists", id)
%if ISFIELD(DataObjectSymbols, id)
%assign dataObjectIdx = GETFIELD(DataObjectSymbols, id)
%assign dataObject = DataObject[dataObjectIdx[0]]
%elseif dataObjIdxInCGModel != -1
%assign numReaders = CGMODEL_ACCESS("CGModel.DataObjUsage.getNumReaders", dataObjIdxInCGModel)
%assign numWriters = CGMODEL_ACCESS("CGModel.DataObjUsage.getNumWriters", dataObjIdxInCGModel)
%assign readers = []
%assign writers = []
%foreach idx = numReaders
%assign newReader = CGMODEL_ACCESS("CGModel.DataObjUsage.getReader", dataObjIdxInCGModel, idx)
%assign readers = readers + newReader
%endforeach
%foreach idx = numWriters
%assign newWriter = CGMODEL_ACCESS("CGModel.DataObjUsage.getWriter", dataObjIdxInCGModel, idx)
%assign writers = writers + newWriter
%endforeach
%createrecord dataObject { id id; ...
RecordType "BlockOutput"; ...
RootIOSignal TLC_FALSE; ...
ReadFromFile %<readers>; ...
WrittenInFile %<writers>}
%else
%assign errTxt = "Custom Data Error: Empty DataObject record"
%<LibReportFatalError(errTxt)>
%endif
%endwith
%if (dataObject.RootIOSignal[0])
%assign returnScope = "Exported"
%elseif (dataRec.RecordType=="ModelParameter" && IsModelReferenceTarget() && (dataRec.IsGlobal == TLC_TRUE))
%assign returnScope = "Exported"
%elseif ISFIELD(dataObject, "FromModelRefIO") && dataObject.FromModelRefIO[0]
%assign returnScope = "Exported"
%else
%if ISFIELD(dataObject, "ReadFromFile")
%assign dataReaders = dataObject.ReadFromFile
%else
%assign dataReaders = []
%endif
%if ISFIELD(dataObject,"WrittenInFile")
%assign dataWriters = dataObject.WrittenInFile
%else
%assign dataWriters = []
%endif
%assign numReaders = SIZE(dataReaders)[1]
%assign numWriters = SIZE(dataWriters)[1]
%if (numReaders == 0) && (numWriters == 0)
%assign returnScope = "Exported"
%elseif (numReaders > 1) || (numWriters > 1)
%assign returnScope = "Exported"
%elseif (numReaders == 1) && (numWriters == 1)
%if (dataReaders[0] == dataWriters[0])
%assign returnScope = "File"
%assign returnDefFile = dataWriters[0]
%assign isFileScope = TLC_TRUE
%else
%assign returnScope = "Exported"
%endif
%else
%assert (numReaders + numWriters == 1)
%assign returnScope = "File"
%assign isFileScope = TLC_TRUE
%if (numReaders == 1)
%assign returnDefFile = dataReaders[0]
%else
%assign returnDefFile = dataWriters[0]
%endif
%endif
%endif
%if dataScope == "File" && (dataScope != returnScope)
%assign args = ["%<LibGetModelName()>","%<LibGetRecordIdentifier(dataRec)>"]
%<SLibReportErrorWithIdAndArgs("RTW:tlc:InvalidFileScopeForSharedData", args)>
%endif
%endif
%return ["%<returnScope>", %<returnDefFile>, %<isFileScope>]
%endfunction
%function SLibCustomDataBufferIsEmpty(symbolType) void
%if !ISFIELD(::CompiledModel, "CustomDataBuffers") || /
(::CompiledModel.CustomDataBuffers.NumFiles == 0)
%return TLC_TRUE
%endif
%with ::CompiledModel.CustomDataBuffers
%foreach fIdx = NumFiles
%assign fRecord = FileRec[fIdx]
%foreach symIdx = fRecord.NumSymbols
%assign symRecord = fRecord.Symbol[symIdx]
%if symRecord.Type == symbolType
%return TLC_FALSE
%endif
%endforeach
%endforeach
%endwith
%return TLC_TRUE
%endfunction
%function FcnCustomDataBuffersIsEmpty(fileName, fileType, symbolType) void
%if !ISFIELD(::CompiledModel, "CustomDataBuffers") || /
(::CompiledModel.CustomDataBuffers.NumFiles == 0)
%return TLC_TRUE
%endif
%assign record = ::CompiledModel.CustomDataBuffers.FileRecMap
%assign fileIdx = -1
%with ::CompiledModel.DataObjectUsage
%foreach fIdx = NumFiles[0]
%if (File[fIdx].Name == fileName) && (File[fIdx].Type == fileType)
%assign fileIdx = fIdx
%break
%endif
%endforeach
%endwith
%if (fileIdx == -1)
%return TLC_TRUE
%endif
%if !ISFIELD(record,"FileMap%<fileIdx>")
%return TLC_TRUE
%endif
%assign fRecord = record.FileMap%<fileIdx>
%if fRecord.NumSymbols == 0
%return TLC_TRUE
%elseif symbolType == ""
%return TLC_FALSE
%endif
%foreach symIdx = fRecord.NumSymbols
%assign symRecord = fRecord.Symbol[symIdx]
%if symRecord.Type == symbolType
%return TLC_FALSE
%endif
%endforeach
%return TLC_TRUE
%endfunction
%function ()
%with ::CompiledModel.DataObjectUsage
%foreach idx = NumFiles[0]
%if File[idx].IsCustom == "yes" && File[idx].Type == "header" && ...
!FcnIsDeclAndMacroGeneratedToSharedHeaderFile(File[idx].Name)
%return TLC_TRUE
%endif
%endforeach
%endwith
%return TLC_FALSE
%endfunction
%function FcnIsGenCustomDataDefinition(dataOwner, defaultSetting)
%if ISFIELD(::CompiledModel.ConfigSet, "EnableDataOwnership") && ...
::CompiledModel.ConfigSet.EnableDataOwnership == TLC_FALSE
%return defaultSetting
%endif
%if ISEMPTY(dataOwner)
%return defaultSetting
%endif
%if ::CompiledModel.RightClickBuild == 0
%if dataOwner == LibGetModelName()
%return TLC_TRUE
%else
%return TLC_FALSE
%endif
%else
%assign modelName = FEVAL("strtok", ::CompiledModel.SubsystemPathForRightClickBuild, "/")
%if dataOwner == modelName
%return TLC_TRUE
%else
%return TLC_FALSE
%endif
%endif
%endfunction
%function FcnIsDeclAndMacroGeneratedToSharedHeaderFile(headerFileOfExportedData)
%assign toShared = (::CompiledModel.GenUtilsSrcInSharedLocation == 1)
%if !toShared
%return TLC_FALSE
%endif
%if !ISEMPTY(headerFileOfExportedData)
%return TLC_TRUE
%endif
%if ISFIELD(::CompiledModel.ConfigSet, "GlobalDataReference") && ...
::CompiledModel.ConfigSet.GlobalDataReference == "InSeparateHeaderFile"
%return TLC_TRUE
%else
%return TLC_FALSE
%endif
%endfunction
%function FcnAddDeclAndMacroToSharedHeaderFile(objInfoArr, externFile, buffer, dataRec, isMacro, objCSCMSPackage,areMutuallyExclusiveSignals) void
%assert (!ISEMPTY(externFile))
%assign dataRecIdentifier = LibGetRecordIdentifier(dataRec)
%if externFile >= 0
%assign hfileBaseName = ::CompiledModel.DataObjectUsage.File[externFile].Name
%assign hfileName = hfileBaseName + ".h"
%assert (::CompiledModel.DataObjectUsage.File[externFile].Type == "header")
%assign mf = SLibDoesModelFileExist("SystemHeader", hfileBaseName)
%if TYPE(mf) == "Scope"
%if SLibDirectAccessGetFileAttribute(mf, "Creator") == "TFL callback" && ...
SLibDirectAccessGetFileAttribute(mf, "SharedType")
%assign errArgs = ["%<hfileName>", "%<dataRecIdentifier>"]
%<SLibReportErrorWithIdAndArgs("RTW:tlc:ErrWhenGenSharedDataConflictHeaderFile", errArgs)>
%else
%assign errArgs = ["%<hfileName>", "%<dataRecIdentifier>", "%<SLibDirectAccessGetFileAttribute(mf, "Creator")>"]
%<SLibReportErrorWithIdAndArgs("RTW:tlc:ErrWhenGenSharedDataConflictHeaderFileBy", errArgs)>
%endif
%endif
%<SLibAddGeneratedFileToList(hfileName,"utility","header","")>
%else
%assign hfileName = ""
%endif
%assign dtIdx = LibGetRecordDataTypeId(dataRec)
%assign isBuiltinDataType = "0"
%if LibIsFundamentalBuiltInDataType(dtIdx)
%assign isBuiltinDataType = "1"
%elseif LibIsDataTypeFixpt(dtIdx) && !LibIsAliasDataType(dtIdx)
%assign isBuiltinDataType = "1"
%endif
%assign isMultiword = LibIsDataTypeMultiWordFixpt(dtIdx)
%assign isComplex = LibGetRecordIsComplex(dataRec)
%if !isMacro
%assign dataKind = "datadecl"
%else
%assign dataKind = "datamacro"
%endif
%assign objInfoArr.NumInfo = objInfoArr.NumInfo + 1
%assign dataTypeOfData = DataTypes.DataType[dtIdx]
%if externFile >= 0 && ::CompiledModel.GenUtilsSrcInSharedLocation == 1
%if LibIsStructDataType(dtIdx) && !SLibDataTypeHasObject(dtIdx)
%<SLibReportErrorWithIdAndArgs("RTW:tlc:SharedDataTypeAnonymousStruct", dataRecIdentifier)>
%endif
%endif
%if isBuiltinDataType == "0" && ...
dataTypeOfData.IdAliasedThruTo >= 0 && dataTypeOfData.IdAliasedThruTo != dtIdx
%assign aliasedThruToType = DataTypes.DataType[dataTypeOfData.IdAliasedThruTo].Name
%else
%assign aliasedThruToType = ""
%endif
%addtorecord objInfoArr objInfo { name dataRecIdentifier; ...
kind dataKind; ...
manglename dataRecIdentifier; ...
file hfileName; ...
checksum ""; ...
definition "%<buffer>"; ...
dependencies dataTypeOfData.Name; ...
builtin isBuiltinDataType; ...
isComplex "%<isComplex>"; ...
isExclusive areMutuallyExclusiveSignals; ...
isMultiword "%<isMultiword>"; ...
aliasedType aliasedThruToType}
%addtorecord objInfoArr.objInfo[objInfoArr.NumInfo-1] cscmemsec { ...
PackageName objCSCMSPackage.PackageName; ...
MemSecName objCSCMSPackage.MemSecName; ...
MemSecComment objCSCMSPackage.MemSecComment; ...
MemSecAddPragma objCSCMSPackage.MemSecAddPragma; ...
MemSecPrepragma objCSCMSPackage.MemSecPrepragma; ...
MemSecPostpragma objCSCMSPackage.MemSecPostpragma; ...
CSCName objCSCMSPackage.CSCName; ...
CSCComment objCSCMSPackage.CSCComment}
%endfunction
%function SLibWriteSharedFile(sharedHdrInfo, isSourceFile) void
%assign codeGenUtilsPath = ::CompiledModel.GenUtilsPath
%if isSourceFile
%assign fileExt = "." + ::LangFileExt
%assign utilPrefix = "util_src"
%else
%assign fileExt = ".h"
%assign utilPrefix = "util_hdr"
%endif
%foreach idx = sharedHdrInfo.numGeneratedFiles
%assign thisFile = sharedHdrInfo.generatedFileList[idx]
%assign thisFileName = thisFile + fileExt
%if ISEMPTY(codeGenUtilsPath)
%assign outputFileName = thisFileName
%else
%assign outputFileName = FEVAL("fullfile",codeGenUtilsPath,thisFileName)
%endif
%assign bFileExist = TLC_FALSE
%if FILE_EXISTS(outputFileName)
%assign bFileExist = TLC_TRUE
%endif
%if bFileExist
%openfile fileContent
%include outputFileName
%closefile fileContent
%assign aFileRec = SLibGetFileRecForUtilCode("%<utilPrefix>", thisFile)
%<SLibCacheUtilCodeToFile("%<utilPrefix>_defines", aFileRec, fileContent)>
%<LibSetSourceFileOutputDirectory(aFileRec, codeGenUtilsPath)>
%openfile fileBanner_buffer
/*
* %<thisFileName>
*
%<SLibCommonUtilHeaderInfo()>/
*/
%closefile fileBanner_buffer
%<SLibCacheUtilCodeToFile("%<utilPrefix>_banner", aFileRec, fileBanner_buffer)>
%else
%<SLibReportErrorWithIdAndArgs("RTW:tlc:FileNotFoundWhenGenSharedDataMacroDecl", outputFileName)>
%endif
%endforeach
%endfunction
%function (sharedHdrInfo) void
%assign fnameList = ""
%foreach idx = sharedHdrInfo.numNotGeneratedFiles
%assign sharedFileName = sharedHdrInfo.notGeneratedFileList[idx].Name
%assign sharedFileKind = sharedHdrInfo.notGeneratedFileList[idx].Kind
%if sharedFileKind == "datadecl" || sharedFileKind == "datamacro"
%assign mf = SLibDoesModelFileExist("SystemHeader", sharedFileName)
%if TYPE(mf) == "Scope"
%if ISEMPTY(fnameList)
%assign fnameList = sharedFileName
%else
%assign fnameList = "%<fnameList>" + ", " + sharedFileName
%endif
%endif
%endif
%endforeach
%if !ISEMPTY(fnameList)
%assign errArgs = ["%<fnameList>", "%<LibGetModelName()>"]
%<SLibReportErrorWithIdAndArgs("RTW:tlc:ErrWhenCheckingExistingSharedHeaderFileName", errArgs)>
%endif
%endfunction
%endif