Main Content

Get Code Description of Generated Code

You can use the code descriptor API to obtain metadata about the generated code. For each model build, the code generator, by default, creates a codedescriptor.dmr file in the build folder. When simulating the model in Accelerator and Rapid Accelerator modes, the codedescriptor.dmr is not generated.

You can use the code descriptor API once the code is generated. Use the code descriptor API to describe these items in the generated code:

  • Data Interfaces: inports, outports, parameters, data stores, and internal data.

  • Function Interfaces: initialize, output, update, and terminate.

  • Run-time information of the data and function interfaces, such as timing requirements of each interface entity.

  • Model hierarchy information and code description of referenced models.

Get Data Interface Information

The coder.descriptor.DataInterface object describes various properties for a specified data interface in the generated code. In the model CustomCodeComments, there are four inports, one outport, and a tunable external parameter. For more information about the data interfaces in your model, use the coder.codedescriptor.CodeDescriptor object and its methods.

1. Open and build the model.

open_system('CustomCodeComments');
evalc('slbuild(''CustomCodeComments'')');

2. Create a coder.codedescriptor.CodeDescriptor object for the required model by using the getCodeDescriptor function.

codeDescriptor = coder.getCodeDescriptor('CustomCodeComments');

3. To obtain a list of all the data interface types in the generated code, use the getDataInterfaceTypes method.

dataInterfaceTypes = codeDescriptor.getDataInterfaceTypes()
dataInterfaceTypes =

  5x1 cell array

    {'Inports'                 }
    {'Outports'                }
    {'Parameters'              }
    {'ExternalParameterObjects'}
    {'InternalData'            }

To obtain a list of all the supported data interfaces, use the getAllDataInterfaceTypes method.

4. To obtain more information about a particular data interface type, use the getDataInterfaces method.

dataInterface = codeDescriptor.getDataInterfaces('Inports');

This method returns properties of the Inport blocks in the generated code.

5. Because this model has four inports, dataInterface is an array of coder.descriptor.DataInterface objects. Obtain the details of the first Inport of the model by accessing the first location in the array.

dataInterface(1)
ans = 

  DataInterface with properties:
              Type: [1x1 coder.descriptor.types.Type]
               SID: 'CustomCodeComments:99'
     GraphicalName: 'In1'
       VariantInfo: [1x0 coder.descriptor.VariantInfo]
    Implementation: [1x1 coder.descriptor.DataImplementation]
            Timing: [1x1 coder.descriptor.TimingInterface]
              Unit: ''
             Range: [1x0 coder.descriptor.Range]

Get Function Interface Information

The function interfaces are the entry-point functions in the generated code. In the model RollAxisAutopilot, the entry-point functions are model_initialize, model_step, and model_terminate. For more information about the function interfaces in your model, use the coder.descriptor.FunctionInterface object.

1. To avoid a build error, remove the slprj directory from the previous build. Open and build the RollAxisAutopilot model.

rmdir ('slprj','s')
open_system('RollAxisAutopilot')
slbuild('RollAxisAutopilot')
### Starting build procedure for: RollAxisAutopilot
### Successful completion of build procedure for: RollAxisAutopilot

Build Summary

Top model targets built:

Model              Action                        Rebuild Reason                                    
===================================================================================================
RollAxisAutopilot  Code generated and compiled.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 12.724s

2. Create a coder.codedescriptor.CodeDescriptor object for the required model by using the getCodeDescriptor function.

codeDescriptor = coder.getCodeDescriptor('RollAxisAutopilot');

3. To obtain a list of all the function interface types in the generated code, use the getFunctionInterfaceTypes method.

functionInterfaceTypes = codeDescriptor.getFunctionInterfaceTypes()
functionInterfaceTypes =

  2x1 cell array

    {'Initialize'}
    {'Output'    }

To obtain a list of all the supported function interfaces, use the getAllFunctionInterfaceTypes method.

4. To obtain more information about a particular function interface type, use the getFunctionInterfaces method.

functionInterface = codeDescriptor.getFunctionInterfaces('Initialize')
functionInterface = 

  FunctionInterface with properties:
        Prototype: [1x1 coder.descriptor.types.Prototype]
     ActualReturn: [1x0 coder.descriptor.DataInterface]
      VariantInfo: [1x0 coder.descriptor.VariantInfo]
    FunctionOwner: [1x0 coder.descriptor.TypedRegion]
           Timing: [1x1 coder.descriptor.TimingInterface]
       ActualArgs: [1x0 coder.descriptor.DataInterface Sequence]

5. You can further expand on the properties to obtain detailed information. To get the function return value, name, and arguments:

functionInterface.Prototype
% 6.
ans = 

  Prototype with properties:
          Name: 'RollAxisAutopilot_initialize'
        Return: [1x0 coder.descriptor.types.Argument]
    HeaderFile: 'RollAxisAutopilot.h'
    SourceFile: 'RollAxisAutopilot.c'
     Arguments: [1x0 coder.descriptor.types.Argument Sequence]

Get Model Hierarchy Information

Use the coder.codedescriptor.CodeDescriptor object to get the entire model hierarchy information. The model AsynchronousEventsTop has model AsynchronousEventsRef as the referenced model.

1. Open and build the model.

open_system('AsynchronousEventsTop');
evalc('slbuild(''AsynchronousEventsTop'')');

2. Create a coder.codedescriptor.CodeDescriptor object for the required model by using the getCodeDescriptor function.

codeDescriptor = coder.getCodeDescriptor('AsynchronousEventsTop');

3. Get a list of all the referenced models by using the getReferencedModelNames method.

refModels = codeDescriptor.getReferencedModelNames()
refModels =

  1x1 cell array

    {'AsynchronousEventsRef'}

4. To obtain the coder.codedescriptor.CodeDescriptor object for the referenced model, use the getReferencedModelCodeDescriptor method.

refCodeDescriptor = codeDescriptor.getReferencedModelCodeDescriptor('AsynchronousEventsRef');

You can now use the refCodeDescriptor object to obtain more information about the referenced model by using all the available methods in the Code Descriptor API.

Related Topics