%% Record Coverage in Parallel Simulations by Using Parsim
% This example shows how to record coverage in multiple parallel Simulink(R) simulations 
% corresponding to different test cases by using SimulationInput objects and the 
% |parsim| command. If Parallel Computing Toolbox is installed on your system, 
% the |parsim| command runs simulations in parallel. Otherwise, the simulations 
% are run in serial. 

% Copyright 2011-2019 The MathWorks, Inc.
%% Model Overview
% The |<matlab:open_system('slvnvdemo_powerwindow_parsim') slvnvdemo_powerwindow_parsim>| 
% model contains a power window controller and a low-order plant model. The component  
% |<matlab:open_system('slvnvdemo_powerwindow_parsim/power_window_control_system/control') 
% slvnvdemo_powerwindow_parsim/power_window_control_system/control>| is a Model 
% block that references the model |<matlab:open_system('slvnvdemo_powerwindow_controller') 
% slvnvdemo_powerwindow_controller>|, which implements the controller with a Stateflow(R) 
% chart.

mdl               = 'slvnvdemo_powerwindow_parsim';
isModelOpen       = bdIsLoaded(mdl);
open_system(mdl);
%% Set Up Data for Multiple Simulations
% Determine the number of test cases in the Signal Editor block by using the 
% |NumberOfScenarios| parameter. The number of test cases determines the number 
% of iterations to run.

sigEditBlk = [mdl '/Input'];
numCases   = str2double(get_param(sigEditBlk,'NumberOfScenarios'));
%% 
% Create an array of |<docid:simulink_ref#bvn9b0e Simulink.SimulationInput>| 
% objects to define the set of simulations to run. Each SimulationInput object 
% corresponds to one simulation and is stored in array |simIn|. For each simulation, 
% set these parameters:
% 
% * |ActiveScenario| to indicate which scenario of the Signal Editor block to 
% execute
% * |CovEnable| to turn on coverage analysis
% * |CovSaveSingleToWokspaceVar| to save the coverage results to a workspace 
% variable
% * |CovSaveName| to specify the name of the variable.

for idx = numCases:-1:1
    simIn(idx) = Simulink.SimulationInput(mdl);
    simIn(idx) = setBlockParameter(simIn(idx), sigEditBlk, 'ActiveScenario', idx);
    simIn(idx) = setModelParameter(simIn(idx), 'CovEnable', 'on');
    simIn(idx) = setModelParameter(simIn(idx), 'CovSaveSingleToWorkspaceVar', 'on');
    simIn(idx) = setModelParameter(simIn(idx), 'CovSaveName', 'covdata');
end

%% Run Simulations in Parallel by Using Parsim
% Use the |<docid:simulink_ref#bvnh103 parsim>| function to execute the simulations 
% in parallel. Pass the array of SimulationInput objects, |simIn|, into the |parsim| 
% function as the first argument. Set the |ShowProgress| option to |on| to display 
% the progress of the simulations in the MATLAB Command Window. The output from 
% the |parsim| command is |simOut|, an array of |Simulink.SimulationOutput| objects. 

simOut = parsim(simIn, 'ShowProgress', 'on');
%% 
% Each |<docid:simulink_ref#bvn9b0e Simulink.SimulationInput>| 
% object contains logged coverage results stored as |<docid:slcoverage_ref#brxphcj-1 cvdata> 
% objects|. These coverage results are stored in a field named |covdata|, as previously 
% specified by the |CovSaveName| parameter. Using |parsim|  to run multiple simulations 
% means that errors are captured so that subsequent simulations can continue to 
% run. Any errors are recorded in the |ErrorMessage| property of the SimulationOutput 
% object.
% 
% |covdata| references a file containing the coverage results. The
% coverage data from the referenced file is automatically loaded into
% memory when |covdata| is used by a coverage function.

simOut(1).covdata

%% Compute Cumulative Coverage
% Obtain the coverage data from each element of |simOut| and cumulate the results.

coverageData = simOut(1).covdata;
for i = 2 : numCases
    coverageData = coverageData + simOut(i).covdata; 
end
%% 
% View the cumulative coverage results on the model by using coverage highlighting.

cvmodelview(coverageData);
open_system('slvnvdemo_powerwindow_parsim/power_window_control_system');
%% 
% Generate a cumulative coverage report.

cvhtml('cummulative_cov_report.html', coverageData);
