% Copyright 2024 Volvo Car Corporation % Licensed under Apache 2.0. function DID = parseDIDs(model_in) % parseDIDs find all DID blocks in model % returns a cell array with structs with DID information % % See also parseModelInfo DIDs_h = find_system(model_in, 'FindAll', 'on', 'LookUnderMasks', 'all', 'MaskType', 'DID'); DID = struct(); if ~isempty(DIDs_h) model = getTLModelName(model_in); outp_h = find_system(model_in, 'findall', 'on', 'lookundermasks', 'on', 'MaskType', 'TL_Outport'); for i=1:length(DIDs_h) ports = get(DIDs_h(i), 'PortHandles'); configs = getCodeSwitches(DIDs_h(i)); l_h = get(ports.Inport, 'line'); %Check if the signal is a propagated name %and find the original signal if it is tmp_sig_name = get(l_h, 'name'); if isempty(tmp_sig_name) sp_h = get(l_h, 'SrcPortHandle'); tmp_sig_name = get(sp_h, 'PropagatedSignals'); if isempty(tmp_sig_name) disp(['No signal name for block ' Get_Path(DIDs_h(i)) '']) continue end ln_h_tmp = find_system(model_in, 'findall', 'on', 'lookundermasks', 'on', ... 'type','line','name', tmp_sig_name); %Get one of the lines, as all have the same source block if length(ln_h_tmp) > 1 ln_h = ln_h_tmp(1); else ln_h = ln_h_tmp; end else ln_h = l_h; end %find if there is a TL-outport with the signal name and it is % not a deafult port - if so use that port as the definition for the DID. found_outp_h = 0; for j=1:length(outp_h) oph = get(outp_h(j), 'PortHandles'); opl_h = get(oph.Inport, 'line'); sig_outp_name = get(opl_h, 'name'); if isempty(sig_outp_name) opp_h = get(opl_h, 'SrcPortHandle'); sig_outp_name = get(opp_h, 'PropagatedSignals'); end if strcmp(tmp_sig_name,sig_outp_name) found_outp_h = outp_h(j); break else found_outp_h = 0; end end if found_outp_h ~= 0 sig_name = sig_outp_name; blk_name = [get(found_outp_h,'Parent') '/' get(found_outp_h,'Name')]; sig_disc = tl_get(found_outp_h, 'output.description'); data_type = tl_get(found_outp_h, 'output.type'); unit = tl_get(found_outp_h, 'output.unit'); offset = tl_get(found_outp_h, 'output.offset'); lsb = tl_get(found_outp_h, 'output.lsb'); min_v = tl_get(found_outp_h, 'output.min'); max_v = tl_get(found_outp_h, 'output.max'); tlclass = tl_get(found_outp_h, 'output.class'); else %find TL-output name and expand the macro to a signal name src_blk_h = get(ln_h,'SrcBlockHandle'); if strcmp(get_param(src_blk_h, 'MaskType'), 'TL_DataStoreRead') parent = get(src_blk_h, 'Parent'); ds_name = tl_get(src_blk_h, 'Datastorename'); data_str = sprintf('.*?''name'',''%s''', ds_name); src_blk_h = find_system(parent, 'findall', 'on', 'lookundermasks', 'on', ... 'RegExp', 'on', 'MaskType', 'TL_DataStoreMemory', ... 'data', data_str); end tl_outp_name = tl_get(src_blk_h, 'output.name'); if isempty(tl_outp_name) % the upstream block has no tl.outputs (e.g. ports replaced by constants by scripts) continue end % ToDo: add a check that no $B or $S is in the TL-name! % Remove _Tmp suffix from the model name [tok mat] = regexp(model ,'(.+?)_Tmp$', 'tokens'); if mat > 0 model_tmp = tok{1}; else model_tmp = model; end tmp_name = regexprep(tl_outp_name, '\$N', model_tmp); sig_name = regexprep(tmp_name, '\$L', get(ln_h,'name')); %Store DID info in a struct blk_name = [get(src_blk_h,'Parent') '/' get(src_blk_h,'Name')]; data_type = tl_get(src_blk_h, 'output.type'); sig_disc = tl_get(src_blk_h, 'output.description'); unit = tl_get(src_blk_h, 'output.unit'); offset = tl_get(src_blk_h, 'output.offset'); lsb = tl_get(src_blk_h, 'output.lsb'); min_v = tl_get(src_blk_h, 'output.min'); max_v = tl_get(src_blk_h, 'output.max'); tlclass = tl_get(src_blk_h, 'output.class'); end if strcmp('default', tlclass) disp(['Block creating signal has default class ' Get_Path(DIDs_h(i)) '']) else tmpDID = struct(); tmpDID.handle = blk_name; tmpDID.name = sig_name; tmpDID.configs = configs; tmpDID.description = sig_disc; tmpDID.type = data_type; tmpDID.unit = unit; tmpDID.offset = offset; tmpDID.lsb = lsb; tmpDID.min = chkNan(min_v); tmpDID.max = chkNan(max_v); tmpDID.class = tlclass; DID.(tmpDID.name) = tmpDID; end end end end function res = chkNan(value) % Function which replaces NaN or empty fields with '-' if ~ischar(value) if isnan(value) res = '-'; elseif isempty(value) res = '-'; else res = num2str(value); end else res = value; end end