www.gusucode.com > private工具箱matlab源码程序 > private/compute_target_info.m

    function compute_target_info

%   Copyright 1995-2016 The MathWorks, Inc.

global gTargetInfo gMachineInfo

gTargetInfo.codingLibrary = sf('get',sf('get',gTargetInfo.target,'target.machine'),'machine.isLibrary');

targetName = sf('get',gMachineInfo.parentTarget,'target.name');
gTargetInfo.codingMakeDebug = coder_options('debugBuilds');
gTargetInfo.codingSFunction = strcmp(targetName,'sfun');
gTargetInfo.codingRTW = strcmp(targetName,'rtw');
gTargetInfo.codingIRConstructionForRTW = false;
gTargetInfo.codingHDL = strcmp(targetName,'slhdlc');
gTargetInfo.codingMEX = 0;
gTargetInfo.codingOpenMP = 0;
gTargetInfo.codingCustom = ~gTargetInfo.codingSFunction && ...
                           ~gTargetInfo.codingRTW && ...
                           ~gTargetInfo.codingHDL && ...
                           ~gTargetInfo.codingMEX;


mainMachineName = sf('get', gMachineInfo.mainMachineId, '.name');

gTargetInfo.codingDeveloper = sf('Feature','Developer');

gTargetInfo.codingExportChartNames = 0;
gTargetInfo.codingPreserveNames = 0;
gTargetInfo.codingPreserveNamesWithParent=0;

relevantMachineName = sf('get',get_relevant_machine,'machine.name');

gTargetInfo.mdlrefInfo = get_model_reference_info(relevantMachineName);
gTargetInfo.isErtMultiInstanced = is_ert_multi_instance(relevantMachineName) || gTargetInfo.mdlrefInfo.isMultiInst;
gTargetInfo.ertMultiInstanceErrCode = get_ert_multi_instance_errcode(relevantMachineName);

gTargetInfo.gencpp = sfprivate('compute_target_cpp_flag', relevantMachineName, gMachineInfo.target, gMachineInfo.parentTarget);

allFlags = all_flags(gMachineInfo.parentTarget);
gTargetInfo.codingDebug = ~sfc('coder_options', 'forceDebugOff');
gTargetInfo.codingOverflow = flag_value(allFlags,'overflow');
gTargetInfo.codingNoEcho = ~flag_value(allFlags,'echo');
gTargetInfo.codingBLAS = true;
gTargetInfo.codingIntelIPP = false;
gTargetInfo.codingPreserveConstantNames = 0;
gTargetInfo.codingFasterRun = CGXE.Utils.isSimOptimizationsOn(mainMachineName);

gTargetInfo.codingMultiInstance     = flag_value(allFlags,'multiinstanced');
gTargetInfo.codingNoInitializer = ~flag_value(allFlags,'initializer');

gTargetInfo.codingStateBitsets = flag_value(allFlags,'statebitsets');
gTargetInfo.codingDataBitsets = flag_value(allFlags,'databitsets');
gTargetInfo.codingComments = flag_value(allFlags,'comments');
gTargetInfo.codingAutoComments = flag_value(allFlags,'autocomments');
gTargetInfo.codingEmitObjectDescriptions = flag_value(allFlags,'emitdescriptions');
gTargetInfo.codingEmitTestSequenceDescriptions = flag_value(allFlags,'emitdescriptions');
gTargetInfo.codingLogicalOps = flag_value(allFlags,'emitlogicalops');
gTargetInfo.codingElseIfDetection = flag_value(allFlags,'elseifdetection');
gTargetInfo.codingConstantFolding = flag_value(allFlags,'constantfolding');
gTargetInfo.codingRedundantElim = flag_value(allFlags,'redundantloadelimination');
gTargetInfo.codingEmitObjectRequirements = 0;
gTargetInfo.codingIntegerCodeOnly = 0;
gTargetInfo.codingRealCodeOnly = 0;
gTargetInfo.codingExtMode = 0;
gTargetInfo.xpcExtModeAnimation = 0;
gTargetInfo.maximumIdentifierLength = 64;
gTargetInfo.parenthesesLevel = 1;
gTargetInfo.codingBlockComments = 0;
gTargetInfo.codingMATLABSourceComments = 0;
gTargetInfo.codingMATLABFcnDesc = 0;
gTargetInfo.ignoreTestpoints = 0;

gTargetInfo.leavingIntegrityChecks = flag_value(allFlags,'integrity');
gTargetInfo.leavingExtrinsicCalls = flag_value(allFlags,'extrinsic');
gTargetInfo.leavingCtrlCChecks = flag_value(allFlags,'ctrlc');
gTargetInfo.genImportedTypeDefs = 0;

gTargetInfo.codingSupportVariableSizeSignals = true;

ioformat = flag_value(allFlags,'ioformat');
switch(ioformat)
    case 0
        gTargetInfo.codingGlobalIO = 1;
        gTargetInfo.codingPackedIO = 0;
    case 1
        gTargetInfo.codingGlobalIO = 0;
        gTargetInfo.codingPackedIO = 1;
    case 2
        gTargetInfo.codingGlobalIO = 0;
        gTargetInfo.codingPackedIO = 0;
    otherwise
        gTargetInfo.codingGlobalIO = 1;
        gTargetInfo.codingPackedIO = 0;
end

gTargetInfo.modelReferenceSimTarget = 0;
gTargetInfo.modelReferenceRTWTarget = 0;

gTargetInfo.codingMemcpy = 0;
gTargetInfo.codingMemcpyThreshold = 0;
gTargetInfo.codingMemsetDouble = 0;
gTargetInfo.codingGenerateSFunction = 0;
gTargetInfo.codingConvertIfToSwitch = 0;
gTargetInfo.codingSupressUnreachableDefaultCases = 0;
gTargetInfo.codingUseSpecifiedMinMax = false;

if gTargetInfo.codingRTW
    targetProps = rtw_target_props(relevantMachineName);
    gTargetInfo.codingDebug = 0;
    gTargetInfo.codingOverflow = 0;
    gTargetInfo.codingNoEcho = 1;
    gTargetInfo.codingBLAS = 0;
    gTargetInfo.codingOpenMP = 0;
    gTargetInfo.codingPreserveConstantNames = true;

    gTargetInfo.codingMultiInstance = 0;
    gTargetInfo.codingNoInitializer = 0;

    gTargetInfo.codingStateBitsets = targetProps.codingStateBitsets;
    gTargetInfo.codingDataBitsets = targetProps.codingDataBitsets;
    gTargetInfo.codingComments = targetProps.codingComments;
    gTargetInfo.codingAutoComments = targetProps.codingAutoComments;

    gTargetInfo.codingEmitObjectDescriptions = targetProps.codingEmitObjectDescriptions;
    gTargetInfo.codingEmitTestSequenceDescriptions = targetProps.codingEmitTestSequenceDescriptions;
    gTargetInfo.codingRedundantElim = targetProps.codingRedundantElim;
    gTargetInfo.codingLogicalOps = 1;
    gTargetInfo.codingElseIfDetection = 1;
    gTargetInfo.codingConstantFolding = 1;
    
    gTargetInfo.codingEmitObjectRequirements = targetProps.codingEmitObjectRequirements;
    gTargetInfo.codingExtMode = targetProps.codingExtMode;
    gTargetInfo.xpcExtModeAnimation = targetProps.xpcExtModeAnimation;
    gTargetInfo.codingConvertIfToSwitch = targetProps.codingConvertIfToSwitch;
    gTargetInfo.codingSupressUnreachableDefaultCases = targetProps.codingSupressUnreachableDefaultCases;    

    % Bitsets have to be disabled for extmode, which requires all dwork data to be addressable
    if gTargetInfo.codingExtMode && (gTargetInfo.codingStateBitsets || gTargetInfo.codingDataBitsets)
        gTargetInfo.codingStateBitsets = 0;
        gTargetInfo.codingDataBitsets = 0;
        DAStudio.warning('Stateflow:cdr:ExternalModeBitSet');
    end
    
    gTargetInfo.rtwProps = targetProps;
    gTargetInfo.modelReferenceSimTarget = model_reference_sim_target(relevantMachineName);
    gTargetInfo.modelReferenceRTWTarget = model_reference_rtw_target(relevantMachineName);
    gTargetInfo.codingIntegerCodeOnly = targetProps.codingIntegerCodeOnly;
    gTargetInfo.codingRealCodeOnly = targetProps.codingRealCodeOnly;
    gTargetInfo.maximumIdentifierLength = targetProps.maximumIdentifierLength;
    gTargetInfo.parenthesesLevel = targetProps.parenthesesLevel;
    gTargetInfo.codingBlockComments = targetProps.codingBlockComments;
    gTargetInfo.codingMATLABSourceComments = targetProps.codingMATLABSourceComments;
    gTargetInfo.codingMATLABFcnDesc = targetProps.codingMATLABFcnDesc;
    gTargetInfo.codingMemcpy = targetProps.codingMemcpy;
    gTargetInfo.codingMemcpyThreshold = targetProps.codingMemcpyThreshold;
    gTargetInfo.codingMemsetDouble = targetProps.codingMemsetDouble;
    gTargetInfo.ignoreTestpoints = targetProps.ignoreTestpoints && ...
                                   ~gTargetInfo.modelReferenceSimTarget && ...
                                   ~gTargetInfo.codingExtMode && ...
                                   strcmpi(get_param(relevantMachineName, 'RapidAcceleratorSimStatus'), 'inactive');

    gTargetInfo.codingUseSpecifiedMinMax = targetProps.codingUseSpecifiedMinMax;
    modelH = get_param(relevantMachineName, 'Handle');
    hModelCodegenMgr = coder.internal.ModelCodegenMgr.getInstance(modelH);
    if ~isempty(hModelCodegenMgr) && ~isempty(hModelCodegenMgr.BuildOpts)
        if(strcmp(hModelCodegenMgr.BuildOpts.codeFormat,'S-Function'))
            gTargetInfo.codingGenerateSFunction = 1;
        end
    end
    
    if ~gTargetInfo.modelReferenceSimTarget
        gTargetInfo.codingSupportVariableSizeSignals = targetProps.codingSupportVariableSizeSignals;
    end

elseif gTargetInfo.codingSFunction
    gTargetInfo.codingNoInitializer = 0;
    gTargetInfo.codingNoComments = 1;
    gTargetInfo.codingEmitObjectDescriptions = 0;
    gTargetInfo.codingEmitTestSequenceDescriptions = 0;
    gTargetInfo.codingRedundantElim = 1;
    gTargetInfo.codingLogicalOps = 1;
    gTargetInfo.codingElseIfDetection = 1;
    gTargetInfo.codingConstantFolding = 1;
    [gTargetInfo.codingExtMode, gTargetInfo.xpcExtModeAnimation] = get_machine_extmode_setting(relevantMachineName);
    gTargetInfo.genImportedTypeDefs = strcmp(get_param(relevantMachineName, 'SimGenImportedTypeDefs'), 'on');

elseif gTargetInfo.codingHDL
    gTargetInfo.codingDebug = 0;
    gTargetInfo.codingNoInitializer = 0;
else
    gTargetInfo.codingDebug = 0;
end


% Set some target specific flags for use with the verify keyword transforms
gTargetInfo.codingRapidAccel = ~strcmpi(get_param(mainMachineName, 'RapidAcceleratorSimStatus'), 'inactive');
gTargetInfo.codingSIL = gTargetInfo.codingRTW && strcmpi(get_param(mainMachineName, 'SimulationMode'), 'software-in-the-loop (sil)');
gTargetInfo.codingPIL = gTargetInfo.codingRTW && strcmpi(get_param(mainMachineName, 'SimulationMode'), 'processor-in-the-loop (pil)');
gTargetInfo.codingSLRT = (gTargetInfo.codingRTW || gTargetInfo.codingExtMode) && (strcmpi(get_param(mainMachineName, 'SystemTargetFile'), 'slrt.tlc') || strcmpi(get_param(mainMachineName, 'SystemTargetFile'), 'slrtert.tlc'));     
gTargetInfo.codingSLCI = (gTargetInfo.codingRTW && sf('Feature', 'SLCIInlineInfo') && ~isempty(regexp(get_param(mainMachineName, 'AdvancedOptControl'), '(\W|^)\-SLCI(\W|$)', 'once')));


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% Option to indicate this is an SLDV code generation
% (replaces old gTargetInfo.codingForTestGen)
if ~gTargetInfo.codingSFunction && (get_param(relevantMachineName, 'RTWExternMdlXlate') == 1)
    gTargetInfo.codingForAutoVerifier = 1;
    
    % If SLDV is being invoked, set the flags regarding analysis options in gTargetInfo. These
    % flags will be copied to ctxInfo in private/construct_context_for_machine.m, which in turn
    % will be used to initialize CdrCtxInfo->ctx.fSldvOptions in cdr/cdr_semantics_vars.cpp. 

    if isfield(targetProps, 'DVoptMinmaxConstr')
        gTargetInfo.DVoptMinmaxConstr = targetProps.DVoptMinmaxConstr;
    end
    if isfield(targetProps, 'DVoptMode')
        gTargetInfo.DVoptMode = targetProps.DVoptMode;
    end    
    if isfield(targetProps, 'DVoptRelBoundary')
        gTargetInfo.DVoptRelBoundary = targetProps.DVoptRelBoundary;
    end
    if isfield(targetProps, 'DVoptCoverageObj')
        gTargetInfo.DVoptCoverageObj = targetProps.DVoptCoverageObj;
    end
    if isfield(targetProps, 'DVoptDeadLogic')
        gTargetInfo.DVoptDeadLogic = targetProps.DVoptDeadLogic;
    end
    if isfield(targetProps, 'DVoptActiveLogic')
        gTargetInfo.DVoptActiveLogic = targetProps.DVoptActiveLogic;
    end
    if isfield(targetProps, 'DVoptDivByZero')
        gTargetInfo.DVoptDivByZero = targetProps.DVoptDivByZero;
    end
    if isfield(targetProps, 'DVoptIntOvf')
        gTargetInfo.DVoptIntOvf = targetProps.DVoptIntOvf;
    end
    if isfield(targetProps, 'DVoptMinmaxCheck')
        gTargetInfo.DVoptMinmaxCheck = targetProps.DVoptMinmaxCheck;
    end
    if isfield(targetProps, 'DVoptOutOfBound')
        gTargetInfo.DVoptOutOfBound = targetProps.DVoptOutOfBound;
    end
    if isfield(targetProps, 'DVoptDetectDSMHazards')
        gTargetInfo.DVoptDetectDSMHazards = targetProps.DVoptDetectDSMHazards;
    end
    if isfield(targetProps, 'DVoptFloatOvf')
        gTargetInfo.DVoptFloatOvf = targetProps.DVoptFloatOvf;
    end

    gTargetInfo.codingForRangeAnalysis = targetProps.codingForRangeAnalysis ;
else
    gTargetInfo.codingForAutoVerifier = 0;
    gTargetInfo.codingForRangeAnalysis = 0;
end

if( ~gTargetInfo.codingSFunction && get_param(relevantMachineName,'RTWExternMdlXlate') == 2)
    gTargetInfo.codingPLC = 1;
    plcOptions = plcprivate('plc_options', relevantMachineName);
    gTargetInfo.codingPLCTargetIDE = plcOptions.TargetIDE;
else
    gTargetInfo.codingPLC = 0;
    gTargetInfo.codingPLCTargetIDE = '';
end

if(gTargetInfo.codingPreserveNamesWithParent)
    gTargetInfo.codingPreserveNames = 1;
end


if(gTargetInfo.codingLibrary && (gTargetInfo.codingSFunction || gTargetInfo.codingRTW))
    gTargetInfo.codingMultiInstance  = 1;
end

gTargetInfo.codingTMW = 0;

compute_compiler_info;

compilerInfo = sfprivate('compilerman', 'get_compiler_info', true, gTargetInfo.gencpp);
gTargetInfo.codingIntelIPP = coderprivate.compiler_supports_eml_ipp(compilerInfo.compilerName);

if gTargetInfo.codingBLAS && ...
    ~coderprivate.compiler_supports_eml_blas(compilerInfo.compilerName)
    gTargetInfo.codingBLAS = false; 
    DAStudio.warning('Coder:reportGen:noCompilerBlasSupport',compilerInfo.compilerName);
end

if gTargetInfo.codingOpenMP
    if ~coderprivate.compiler_supports_eml_openmp(compilerInfo.compilerName)
        gTargetInfo.codingOpenMP = false; 
    else
        % xxx: disabling debugging when parallelization is enabled. Bound checks, ctrl-c
        % checks and echo are disabled internally. Parallelization is disabled by default.
        gTargetInfo.codingDebug = false;
        gTargetInfo.codingNoEcho = true;
    end    
end



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function result = all_flags(target)
result = sfprivate('target_methods','codeflags',target);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function result = flag_value(flags,str)
flagNames = {flags.name};
index = find(strcmp(flagNames,str));
if(~isempty(index))
    result = flags(index).value;
else
    result = 0;
end