Component declaration

## Contents

- Your rights

- Introduction

- Component model

- Component description file

  - Preprocessing

  - Elements of a description file

  - Data type and constant definitions

  - Module declaration

  - Component declaration

  - Interface declaration

  - IDS declaration

  - Port declaration

  - Task declaration

  - Service declaration

  - Codel declaration

  - Identifiers and reserved keywords

  - Pragmas

  - Grammar reference

- GenoM IDL mappings

- Running GenoM

- Tutorials

- Templates

## Component declaration

A component declaration describes a instance of the `genom` component model. It is defined by a unique name (an identifier) that also defines an IDL scope for any embedded types.

(5) `component ::=` | `"component"` `component-name` `component-body` `";"`
(6) `component-name ::=` | `identifier`
(7) `component-body ::=` | `[` `"{"` `exports` `"}"` `]`

Components export objects from the `genom` component model, namely: IDS, tasks, ports, attributes or services.

Components may also define new types via IDL statements. Any such types are defined within the component scope.

(8) `exports ::=` | `{` `export` `}`
(9) `export ::=` | `idl-statement` `|` `property` `|` `ids` `|` `task` `|` `port` `|` `attribute` `|` `service`

A number of properties can be attached to a component:

(10) `component-property ::=` | `(` `"doc"` `string-literals` `|` `"version"` `string-literals` `|` `"lang"` `string-literals` `|` `"email"` `string-literals` `|` `"requires"` `string-list` `|` `"codels-require"` `opt-private` `string-list` `|` `"clock-rate"` `const-expr` `time-unit` `|` `"provides"` `interface-list` `|` `"uses"` `interface-list` `)` `";"`
(11) `opt-private ::=` | `[` `"private"` `]`

doc

  A string that describes the functionality of the component.

version

  The component version number, as a string.

lang

  The programming language of the codels interface. At the moment, only "c" is supported.

email

  A string containing the contact e-mail address to reach support for the component.

requires

  A list of dependencies of the component (see #pragma requires). Each string should contain a package name in `pkg-config` format.

codels-requires

  A list of dependencies of the codels. Each string should contain a package name in `pkg-config` format. The `private` keyword mark the following dependencies as not being inherited when defined in an an interface. For a component, this has no effect.

clock-rate

  The period of the internal component clock. It is usually not necessary to define it explicitly. If the component defines periodic task, the component clock period will be automatically computed as the greatest common divisor of the period of all periodic tasks.

provides

  A list of interfaces (see Interface declaration) that the component implements. All objects from the interface are imported as-is into the component description. Ports and services may be further refined once imported, typically by defining codels (see Codel declaration) that implement the services.

uses

  A list of interfaces (see Interface declaration) that the component uses. Ports are imported in the opposite direction (e.g. a `port out` is imported as a `port in`). Services are imported as `remote` objects that can be accessed via codel parameters (see Codel declaration). Other objects are imported as-is.

### Example

This would define an empty component with no service and no functionality:

    component foo {
      version     "1.0";
      email       "me@example.com";
      lang        "c";
      require     "genom3 >= 2.99.20";
    };