%% Auto-Generated Memory Map with Single Address Option
%
% This example highlights the use of the auto-generated memory map with single
% address option when you generate a SystemC(TM)/TLM component
% from a Simulink(R) model using the tlmgenerator target for either Simulink Coder or Embedded Coder(TM).
%
% In Simulink, each component input or output is bound
% point-to-point to another component. In SystemC/TLM, each component
% communicates through a TLM socket. This socket handles all the incoming
% and outgoing communication formatted inside TLM transactions. Because
% each system handles communication differently, we must define a
% communication interface for the SystemC/TLM component when it is
% generated from a Simulink model. Depending on the intended use of this
% SystemC/TLM component, this communication interface could require
% building a memory map (or address) for each input/output in the
% component. This memory map may be simple or detailed.
%
% The auto-generated memory map with single address option generates a
% TLM component with only one read and one write register with one address each.
% The Simulink model inputs are bound to the write register and the outputs
% are bound to the read register. When created with this option, the
% generated TLM component could be used in a virtual platform (VP) as a
% standalone component in a test bench or it could be attached to a
% communication channel.
%
% For this example we use a Simulink model of a FIR filter as the
% basis of the SystemC/TLM generation.
%
% Requirements to run this example:
%
% * SystemC 2.3.1 (includes the TLM library)
% 
%
% Note: The example includes a code generation build procedure.
% Simulink does not permit you to build programs in the MATLAB installation
% area. If necessary, change to a working directory that is not in the
% MATLAB installation area prior to starting any build.

% Copyright 2005-2014 The MathWorks, Inc.

%% 1. Open the Preconfigured Model
% To open the *FIR Filter model with auto-generated memory map with single
% address*, click the *Open Model* button.
%
% The following model opens in Simulink.

%%
open_system('tlmgdemo_asmem');

%% 2. Set the Option to Auto-Generated Memory Map with Single Address
% In the *Configuration Parameters* dialog box, select the *TLM
% Generator* view in the left-hand pane. In the *TLM Mapping* tab, under
% *Socket Mapping* option select *One combined TLM socket for input data, 
% output data and control*. Under *Combined TLM Socket*, select 
% *Auto-generated memory map* and *Single input and output address
% offsets*, as shown in the following image.
%
% <<../MemoryMap_asmem_conf.png>>

%% 3. Set the Other Options
% Set the remaining *TLM Generation* options according to your preferences
% (or leave the default values as they are) and click *OK* to apply these
% settings and exit the *Configuration Parameters* dialog box.


%% 4. Build the Model
% In the model window, right-click on the DualFilter block and select
% *C/C++ Code > Generate Code for this Subsystem* in the context menu to start the
% <matlab:rtwbuild('tlmgdemo_asmem/DualFilter') TLM component generation>. Or you can
% execute the following command in the MATLAB command window:
%
%    >> rtwbuild('tlmgdemo_asmem/DualFilter');
%
% The generation is completed when the following message appears in the
% MATLAB command window:

%%
rtwbuild('tlmgdemo_asmem/DualFilter');

%% 5. Open the Generated Files
% Open the following files in the MATLAB Editor:
%
% * <matlab:open(fullfile('DualFilter_VP','DualFilter_asmem_tlm','include','DualFilter_asmem_tlm_def.h')) DualFilter_VP/DualFilter_asmem_tlm/include/DualFilter_asmem_tlm_def.h>

%% 6. Observe the Generated Code
% Find the following lines of code. These lines represent the input and
% output definitions of the FIR Filter when generated as a TLM component with
% single address memory map.
%
% <<../MemoryMap_asmem_inputdef.png>>
%
% To provide a set of input to the generated TLM component, an TLM initiator should
% send a write TLM transaction with a payload containing a data of type
% *DualFilter_combined_IN_BANK_T* at the address *DualFilter_combined_IN_BANK_ADDR*.
%
% <<../MemoryMap_asmem_outputdef.png>>
%
% To obtain a set of output from the generated TLM component, an TLM initiator should
% send a read TLM transaction with a payload containing a data of type
% *DualFilter_combined_OUT_BANK_T* at the address *DualFilter_combined_OUT_BANK_ADDR*.

%%
