/* --COPYRIGHT--,ESD
 *  Copyright (c) 2008-2019 Texas Instruments Incorporated
 *  This program and the accompanying materials are made available under the
 *  terms of the Eclipse Public License v1.0 and Eclipse Distribution License
 *  v. 1.0 which accompanies this distribution. The Eclipse Public License is
 *  available at http://www.eclipse.org/legal/epl-v10.html and the Eclipse
 *  Distribution License is available at
 *  http://www.eclipse.org/org/documents/edl-v10.php.
 *
 *  Contributors:
 *      Texas Instruments - initial implementation
 * --/COPYRIGHT--*/
/*!
 *  ======== xdc.runtime ========
 *  Basic runtime support for RTSC programs
 *
 *  The modules and interfaces in the `xdc.runtime` package form the "core"
 *  RTSC target runtime support library which provides basic system services
 *  required by virtually all applications.
 *
 *  Since this package's services are intended to be available to any C/C++
 *  client, this package does not contain any pre-compiled libraries. Instead,
 *  this package provides complete sources which are built and supplied by a
 *  target-specific package named by the `{@link xdc.bld.ITarget#rts rts}`
 *  parameter of the target used to build the client sources.  This "indirection"
 *  makes it possible for new targets to be added by interested parties whithout
 *  ever having to update this package.
 *
 *  The functionality provided by this package can be roughly partitioned
 *  into four categories:
 *  @p(nlist)
 *      - Diagnostics and Logs
 *      - Memory Management
 *      - Concurrency Support
 *      - Startup and Shutdown
 *  @p
 *  @a(Diagnostics and Logs)
 *  This package provides for diagnostics with a set of modules that operate
 *  together to configure and implement diagnostics.
 *
 *  The modules can be partitioned into three groups: modules that generate
 *  events, a module that allows precise control over when (or if) various
 *  events are generated, and modules that manage the output or display of the
 *  events.
 *
 *  `{@link Assert}`, `{@link Error}`, and `{@link Log}` provide methods that
 *  are added to source code and generate events. The `{@link Diags}` module
 *  provides both configuration and runtime methods to selectively enable or
 *  disable different types of events on a per module basis. Finally,
 *  `{@link LoggerBuf}`, `{@link LoggerSys}` and `{@link LoggerCallback}` are 
 *  simple alternative implementations of the `{@link ILogger}` event "handler"
 *  interface. You can provide more sophisticated or platform-specific
 *  implementations of `ILogger` without making any changes to code that
 *  uses `Assert`, `Log`, `Error`, or `Diags`.
 *
 *  The diagnostics and logger modules include the following:
 *  @p(blist)
 *  - `{@link Assert}`         - Add integrity checks to the code.
 *  - `{@link Diags}`          - Manage a module's diagnostics mask.
 *  - `{@link Error}`          - Raise error events.
 *  - `{@link Log}`            - Generate log events in realtime.
 *  - `{@link LoggerBuf}`      - A logger using a buffer for log events.
 *  - `{@link LoggerCallback}` - A logger using user defined callback function
 *                               for log events.
 *  - `{@link LoggerSys}`      - A logger using printf for log events.
 *  - `{@link Types}`          - Define diagnostics configuration parameters.
 *  - `{@link Timestamp}`      - Simple timestamp service
 *  @p
 *
 *  @a(Memory Management)
 *  The memory management modules include the following:
 *  @p(blist)
 *  - `{@link Memory}`  - module used by clients to allocate and free memory
 *  - `{@link HeapMin}` - Deterministic implementation that minimizes code
 *                        size footprint by not supporting reuse of allocated
 *                        memory.
 *  - `{@link HeapStd}` - Implementation that builds atop ANSI C `malloc()`
 *                        and `free()`
 *  @p
 *
 *  @a(Concurrency Support)
 *  The concurency support modules include the following:
 *  @p(blist)
 *  - `{@link Gate}`     - module used by clients to serialize access to
 *                         shared data structures
 *  - `{@link GateNull}` - "null" implementation for applications that
 *                         don't need serialization; e.g., single threaded
 *                         applications
 *  @p
 *
 *  @a(Startup and Shutdown)
 *  The system startup and shutdown support modules include:
 *  @p(blist)
 *  - `{@link Reset}`       - Manages platform-specific startup initialization
 *                            before `main()` is called
 *  - `{@link Startup}`     - Manages "portable" startup initialization before
 *                            `main()` is called
 *  - `{@link System}`      - In addition to other basic services (such as
 *                            `printf`), this module provides an `atexit`
 *                            capability that allows modules to cleanly exit
 *                            during normal application terminiation.
 *  - `{@link SysCallback}` - Implementation of `{@link ISystemSupport}`
 *                            that calls back user defined functions.
 *  - `{@link SysMin}`      - Minimal implementation of `{@link ISystemSupport}`
 *                            required by the `System` module, suitable for
 *                            deeply embedded applications.
 *  - `{@link SysStd}`      - Implementation of `{@link ISystemSupport}`
 *                            that relies on ANSI C Standard I/O Library
 *                            functions.
 *  @p
 */
package xdc.runtime [2, 1, 0] {
    interface IModule, IInstance;
    interface IHeap, ILogger, IFilterLogger;
    interface ISystemSupport;
    interface IGateProvider;
    interface ITimestampClient, ITimestampProvider;
    module Assert;
    module Core;
    module Defaults;
    module Diags;
    module Error;
    module Gate, GateNull;
    module Log, LoggerBuf, LoggerCallback, LoggerSys;
    module Main;
    module Memory, HeapMin, HeapStd;
    module Registry;
    module Rta;
    module Startup, Reset;
    module System, SysCallback, SysMin, SysStd;
    module Text;
    module Timestamp, TimestampNull, TimestampStd;
    module Types;
}
