module openconfig-terminal-device {

  yang-version "1";

  // namespace
  namespace "http://openconfig.net/yang/terminal-device";

  prefix "oc-opt-term";

  import openconfig-types { prefix oc-types; }
  import openconfig-transport-types { prefix oc-opt-types; }
  import openconfig-if-ethernet { prefix oc-eth; }
  import openconfig-platform { prefix oc-platform; }
  import openconfig-platform-transceiver { prefix oc-transceiver; }
  import openconfig-extensions { prefix oc-ext; }
  import ietf-yang-types { prefix yang; }


  // meta
  organization "OpenConfig working group";

  contact
    "OpenConfig working group
    www.openconfig.net";

  description
    "This module describes a terminal optics device model for
    managing the terminal systems (client and line side) in a
    DWDM transport network.

    Elements of the model:

    physical port: corresponds to a physical, pluggable client
    port on the terminal device. Examples includes 10G, 40G, 100G
    (e.g., 10x10G, 4x25G or 1x100G) and 400G/1T in the future.
    Physical client ports will have associated operational state or
    PMs.

    physical channel: a physical lane or channel in the
    physical client port.  Each physical client port has 1 or more
    channels. An example is 100GBASE-LR4 client physical port having
    4x25G channels. Channels have their own optical PMs and can be
    monitored independently within a client physical port (e.g.,
    channel power).  Physical client channels are defined in the
    model as part of a physical client port, and are modeled
    primarily for reading their PMs.

    logical channel: a logical grouping of logical grooming elements
    that may be assigned to subsequent grooming stages for
    multiplexing / de-multiplexing, or to an optical channel for
    line side transmission.  The logical channels can represent, for
    example, an ODU/OTU logical packing of the client
    data onto the line side.  Tributaries are similarly logical
    groupings of demand that can be represented in this structure and
    assigned to an optical channel.  Note that different types of
    logical channels may be present, each with their corresponding
    PMs.

    optical channel:  corresponds to an optical carrier and is
    assigned a wavelength/frequency.  Optical channels have PMs
    such as power, BER, and operational mode.

    Directionality:

    To maintain simplicity in the model, the configuration is
    described from client-to-line direction.  The assumption is that
    equivalent reverse configuration is implicit, resulting in
    the same line-to-client configuration.

    Physical layout:

    The model does not assume a particular physical layout of client
    and line ports on the terminal device (e.g., such as number of
    ports per linecard, separate linecards for client and line ports,
    etc.).";

  oc-ext:openconfig-version "1.0.0";

  revision "2017-07-08" {
    description
      "Adds test-signal";
    reference "1.0.0";
  }

  revision "2016-12-22" {
    description
      "Fixes and additions to terminal optics model";
    reference "0.4.0";
  }


  grouping terminal-input-optical-power {
    description
      "Reusable leaves related to input optical power";

    leaf input-power {
      type decimal64 {
        fraction-digits 2;
      }
      units dBm;
      description
        "The input optical power of this port in units of 0.01dBm.
        If the port is an aggregate of multiple physical channels,
        this attribute is the total power or sum of all channels.";
    }
  }

  grouping terminal-ethernet-protocol-config {
    description
      "Configuration data for logical channels with Ethernet
      framing";

    //TODO:currently a empty container
  }

  grouping terminal-ethernet-protocol-state {
    description
      "Ethernet-specific counters when logical channel
      is using Ethernet protocol framing, e.g., 10GE, 100GE";

      uses oc-eth:ethernet-interface-state-counters;
  }

  grouping terminal-ethernet-protocol-top {
    description
      "Top-level grouping for data related to Ethernet protocol
      framing on logical channels";

    container ethernet {
      description
        "Top level container for data related to Ethernet framing
        for the logical channel";

      container config {
        description
          "Configuration data for Ethernet protocol framing on
          logical channels";

        uses terminal-ethernet-protocol-config;
      }

      container state {
        config false;
        description
          "Operational state data for Ethernet protocol framing
          on logical channels";

        uses terminal-ethernet-protocol-state;
      }
    }
  }

  grouping terminal-otn-protocol-config {
    description
      "OTU configuration when logical channel
      framing is using an OTU protocol, e.g., OTU1, OTU3, etc.";

    leaf tti-msg-transmit {
      type string;
      description
        "Trail trace identifier (TTI) message transmitted";
    }

    leaf tti-msg-expected {
      type string;
      description
        "Trail trace identifier (TTI) message expected";
    }

    leaf tti-msg-auto {
      type boolean;
      description
        "Trail trace identifier (TTI) transmit message automatically
        created.  If true, then setting a custom transmit message
        would be invalid.";
    }
  }

  grouping terminal-otn-protocol-counter-stats {
    description
      "Counter based statistics containers for logical channels
      using OTN framing";

    leaf errored-seconds {
      type yang:counter64;
      description
        "The number of seconds that at least one errored blocks
        occurs, at least one code violation occurs, loss of sync is
        detected or loss of signal is detected";
    }

    leaf severely-errored-seconds {
      type yang:counter64;
      description
        "The number of seconds that loss of frame is detected OR
        the number of errored blocks, code violations, loss of sync
        or loss of signal is detected exceeds a predefined
        threshold";
    }

    leaf unavailable-seconds {
      type yang:counter64;
      description
        "The number of seconds during which the link is unavailable";
    }

    leaf code-violations {
      type yang:counter64;
      description
        "For ethernet or fiberchannel links, the number of 8b/10b
        coding violations. For SONET/SDH, the number of BIP (bit
        interleaved parity) errors";
    }

    leaf fec-uncorrectable-words {
      type yang:counter64;
      description
        "The number words that were uncorrectable by the FEC";
    }

    leaf fec-corrected-bytes {
      type yang:counter64;
      description
        "The number of bytes that were corrected by the FEC";
    }

    leaf fec-corrected-bits {
      type yang:counter64;
      description
        "The number of bits that were corrected by the FEC";
    }

    leaf background-block-errors {
      type yang:counter64;
      description
        "The number of background block errors";
    }
  }

  grouping terminal-otn-protocol-multi-stats {
    description
      "Multi-value statistics containers for logical channels using
      OTN framing (e.g., max, min, avg, instant)";

    container pre-fec-ber {
      description
        "Bit error rate before forward error correction -- computed
        value with 18 decimal precision. Note that decimal64
        supports values as small as i x 10^-18 where i is an
        integer. Values smaller than this should be reported as 0
        to inidicate error free or near error free performance.
        Values include the instantaneous, average, minimum, and
        maximum statistics. If avg/min/max statistics are not
        supported, the target is expected to just supply the
        instant value";

      uses oc-opt-types:avg-min-max-instant-stats-precision18-ber;
    }

    container post-fec-ber {
      description
        "Bit error rate after forward error correction -- computed
        value with 18 decimal precision. Note that decimal64
        supports values as small as i x 10^-18 where i is an
        integer. Values smaller than this should be reported as 0
        to inidicate error free or near error free performance.
        Values include the instantaneous, average, minimum, and
        maximum statistics. If avg/min/max statistics are not
        supported, the target is expected to just supply the
        instant value";

      uses oc-opt-types:avg-min-max-instant-stats-precision18-ber;
    }

    container q-value {
      description
        "Quality value (factor) in dB of a channel with two
        decimal precision. Values include the instantaneous,
        average, minimum, and maximum statistics. If avg/min/max
        statistics are not supported, the target is expected
        to just supply the instant value";

      uses oc-types:avg-min-max-instant-stats-precision2-dB;
    }

    container esnr {
      description
        "Electrical signal to noise ratio. Baud rate
        normalized signal to noise ratio based on
        error vector magnitude in dB with two decimal
        precision. Values include the instantaneous, average,
        minimum, and maximum statistics. If avg/min/max
        statistics are not supported, the target is expected
        to just supply the instant value";

      uses oc-types:avg-min-max-instant-stats-precision2-dB;
    }
  }

  grouping terminal-otn-protocol-state {
    description
      "OTU operational state when logical channel
      framing is using an OTU protocol, e.g., OTU1, OTU3, etc.";


      leaf tti-msg-recv {
        type string;
        description
          "Trail trace identifier (TTI) message received";
      }

      leaf rdi-msg {
        type string;
        description
          "Remote defect indication (RDI) message received";
      }
      uses terminal-otn-protocol-counter-stats;
      uses terminal-otn-protocol-multi-stats;
  }

  grouping terminal-otn-protocol-top {
    description
      "Top-level grouping for data related to OTN protocol framing";

    container otn {
      description
        "Top level container for OTU configuration when logical
        channel framing is using an OTU protocol, e.g., OTU1, OTU3,
        etc.";

      container config {
        description
          "Configuration data for OTN protocol framing";

        uses terminal-otn-protocol-config;
      }

      container state {

        config false;

        description
          "Operational state data for OTN protocol PMs, statistics,
          etc.";

        uses terminal-otn-protocol-config;
        uses terminal-otn-protocol-state;
      }
    }
  }

  grouping terminal-client-port-assignment-config {
    description
      "Configuration data for assigning physical client ports to
      logical channels";

    leaf index {
      type uint32;
      description
        "Index of the client port assignment";
    }

    leaf description {
      type string;
      description
        "Descriptive name for the client port-to-logical channel
        mapping";
    }

    leaf logical-channel {
      type leafref {
        path "/oc-opt-term:terminal-device/oc-opt-term:logical-channels" +
          "/oc-opt-term:channel/oc-opt-term:index";
      }
      description
        "Reference to the logical channel for this
        assignment";
    }

    leaf allocation {
      type decimal64 {
        fraction-digits 3;
      }
      units Gbps;
      description
        "Allocation of the client physical port to the assigned
        logical channel expressed in Gbps.  In most cases,
        the full client physical port rate is assigned to a single
        logical channel.";
    }

  }

  grouping terminal-client-port-assignment-state {
    description
      "Operational state data for assigning physical client ports
      to logical channels";
  }

  grouping terminal-client-port-assignment-top {
    description
      "Top-level grouping for the assigment of client physical ports
      to logical channels";
    //TODO: this grouping could be removed, instead reusing a common
    //grouping for logical client assignment pointers

    container logical-channel-assignments {
      description
        "Enclosing container for client port to logical client
        mappings";

      list assignment {
        key "index";
        description
          "List of assignments to logical clients";

        leaf index {
          type leafref {
            path "../config/index";
          }
          description
            "Reference to the index of this logical client
            assignment";
        }

        container config {
          description
            "Configuration data for the logical client assignment";

          uses terminal-client-port-assignment-config;
        }

        container state {

          config false;

          description
            "Operational state data for the logical client
            assignment";

          uses terminal-client-port-assignment-config;
          uses terminal-client-port-assignment-state;
        }
      }
    }
  }


  grouping terminal-logical-chan-assignment-config {
    description
      "Configuration data for assigning client logical channels
      to line-side tributaries";

    leaf index {
      type uint32;
      description
        "Index of the current logical client channel to tributary
        mapping";
    }

    leaf description {
      type string;
      description
        "Name assigned to the logical client channel";
    }

    leaf assignment-type {
      type enumeration {
        enum LOGICAL_CHANNEL {
          description
            "Subsequent channel is a logical channel";
        }
        enum OPTICAL_CHANNEL {
          description
            "Subsequent channel is a optical channel / carrier";
        }
      }
      description
        "Each logical channel element may be assigned to subsequent
        stages of logical elements to implement further grooming, or
        can be assigned to a line-side optical channel for
        transmission.  Each assignment also has an associated
        bandwidth allocation.";
    }

    leaf logical-channel {
      type leafref {
        path "/oc-opt-term:terminal-device/" +
          "oc-opt-term:logical-channels/oc-opt-term:channel/" +
          "oc-opt-term:index";
      }
      must "../assignment-type = 'LOGICAL_CHANNEL'" {
        description
          "The assignment-type must be set to LOGICAL_CHANNEL for
          this leaf to be valid";
      }
      description
         "Reference to another stage of logical channel elements.";
    }

    leaf optical-channel {
      type leafref {
        path "/oc-platform:components/oc-platform:component/" +
          "oc-platform:name";
      }
      must "../assignment-type = 'OPTICAL_CHANNEL'" {
        description
          "The assignment-type must be set to OPTICAL_CHANNEL for
          this leaf to be valid";
      }
      description
        "Reference to the line-side optical channel that should
        carry the current logical channel element.  Use this
        reference to exit the logical element stage.";
    }

    leaf allocation {
      type decimal64 {
        fraction-digits 3;
      }
      units Gbps;
      description
        "Allocation of the logical client channel to the tributary
        or sub-channel, expressed in Gbps";
    }

  }

  grouping terminal-logical-chan-assignment-state {
    description
      "Operational state data for the assignment of logical client
      channel to line-side tributary";
  }

  grouping terminal-logical-chan-assignment-top {
    description
      "Top-level grouping for the list of logical client channel-to-
      tributary assignments";

    container logical-channel-assignments {
      //TODO: we need a commonly understood name for this logical
      //channel structure
      description
        "Enclosing container for tributary assignments";

      list assignment {
        key "index";
        description
          "Logical channel elements may be assigned directly to
          optical channels for line-side transmission, or can be
          further groomed into additional stages of logical channel
          elements.  The grooming can multiplex (i.e., split the
          current element into multiple elements in the subsequent
          stage) or de-multiplex (i.e., combine the current element
          with other elements into the same element in the subsequent
          stage) logical elements in each stage.

          Note that to support the ability to groom the logical
          elements, the list of logical channel elements should be
          populated with an entry for the logical elements at
          each stage, starting with the initial assignment from the
          respective client physical port.

          Each logical element assignment consists of a pointer to
          an element in the next stage, or to an optical channel,
          along with a bandwidth allocation for the corresponding
          assignment (e.g., to split or combine signal).";

        leaf index {
          type leafref {
            path "../config/index";
          }
          description
            "Reference to the index for the current tributary
            assignment";
        }

        container config {
          description
            "Configuration data for tributary assignments";

          uses terminal-logical-chan-assignment-config;
        }

        container state {

          config false;

          description
            "Operational state data for tributary assignments";

          uses terminal-logical-chan-assignment-config;
          uses terminal-logical-chan-assignment-state;
        }
      }
    }
  }

  grouping terminal-logical-channel-ingress-config {
    description
      "Configuration data for ingress signal to logical channel";

    leaf transceiver {
      type leafref {
        path "/oc-platform:components/oc-platform:component/" +
        "oc-platform:name";
      }
      description
        "Reference to the transceiver carrying the input signal
        for the logical channel.  If specific physical channels
        are mapped to the logical channel (as opposed to all
        physical channels carried by the transceiver), they can be
        specified in the list of physical channel references.";
    }

    leaf-list physical-channel {
      type leafref {
        path "/oc-platform:components/oc-platform:component/" +
          "oc-transceiver:transceiver/" +
          "oc-transceiver:physical-channels/" +
          "oc-transceiver:channel/oc-transceiver:index";
      }
      description
        "This list should be populated with references
        to the client physical channels that feed this logical
        channel from the transceiver specified in the 'transceiver'
        leaf, which must be specified.  If this leaf-list is empty,
        all physical channels in the transceiver are assumed to be
        mapped to the logical channel.";
    }
  }

  grouping terminal-logical-channel-ingress-state {
    description
      "Operational state data for ingress signal to logical channel";
  }

  grouping terminal-logical-channel-ingress-top {
    description
      "Top-level grouping for ingress signal to logical channel";

    container ingress {
      description
        "Top-level container for specifying references to the
        source of signal for the logical channel, either a
        transceiver or individual physical channels";

      container config {
        description
          "Configuration data for the signal source for the
          logical channel";

        uses terminal-logical-channel-ingress-config;
      }

      container state {

        config false;

        description
          "Operational state data for the signal source for the
          logical channel";

        uses terminal-logical-channel-ingress-config;
        uses terminal-logical-channel-ingress-state;
      }
    }
  }

  grouping terminal-logical-channel-config {
    description
      "Configuration data for logical channels";

    leaf index {
      type uint32;
      description
        "Index of the current logical channel";
    }

    leaf description {
      type string;
      description
        "Description of the logical channel";
    }

    leaf admin-state {
      type oc-opt-types:admin-state-type;
      description
          "Sets the admin state of the logical channel";
    }

    leaf rate-class {
      type identityref {
        base oc-opt-types:TRIBUTARY_RATE_CLASS_TYPE;
      }
      description
        "Rounded bit rate of the tributary signal. Exact bit rate
        will be refined by protocol selection.";
    }

    leaf trib-protocol {
      type identityref {
        base oc-opt-types:TRIBUTARY_PROTOCOL_TYPE;
      }
      description
        "Protocol framing of the tributary signal. If this
        LogicalChannel is directly connected to a Client-Port or
        Optical-Channel, this is the protocol of the associated port.
        If the LogicalChannel is connected to other LogicalChannels,
        the TributaryProtocol of the LogicalChannels will define a
        specific mapping/demapping or multiplexing/demultiplexing
        function.

        Not all protocols are valid, depending on the value
        of trib-rate-class.  The expectation is that the NMS
        will validate that a correct combination of rate class
        and protocol are specfied.  Basic combinations are:

        rate class: 1G
        protocols: 1GE

        rate class: 2.5G
        protocols: OC48, STM16

        rate class: 10G
        protocols:  10GE LAN, 10GE WAN, OC192, STM64, OTU2, OTU2e,
                    OTU1e, ODU2, ODU2e, ODU1e

        rate class: 40G
        protocols:  40GE, OC768, STM256, OTU3, ODU3

        rate class: 100G
        protocols:  100GE, 100G MLG, OTU4, OTUCn, ODU4";
    }

    leaf logical-channel-type {
      type identityref {
        base oc-opt-types:LOGICAL_ELEMENT_PROTOCOL_TYPE;
      }
      description
        "The type / stage of the logical element determines the
        configuration and operational state parameters (PMs)
        available for the logical element";
    }

    leaf loopback-mode {
      type oc-opt-types:loopback-mode-type;
      description
        "Sets the loopback type on the logical channel. Setting the
        mode to something besides NONE activates the loopback in
        the specified mode.";
    }

    leaf test-signal {
      type boolean;
      description
        "When enabled the logical channel's DSP will generate a pseudo
        randmon bit stream (PRBS) which can be used during testing.";
    }
  }


  grouping terminal-logical-channel-state {
    description
      "Operational state data for logical client channels";

    leaf link-state {
      type enumeration {
        enum UP {
          description
            "Logical channel is operationally up";
        }
        enum DOWN {
          description
            "Logical channel is operationally down";
        }
      }
      description
        "Link-state of the Ethernet protocol on the logical channel,
        SONET / SDH framed signal, etc.";
    }

  }

  grouping terminal-logical-channel-top {
    description
      "Top-level grouping for logical channels";

    container logical-channels {
      description
        "Enclosing container the list of logical channels";

      list channel {
        key "index";
        description
          "List of logical channels";
        //TODO: naming for this list of logical elements should be
        //revisited.

        leaf index {
          type leafref {
            path "../config/index";
          }
          description
            "Reference to the index of the logical channel";
        }

        container config {
          description
            "Configuration data for logical channels";

          uses terminal-logical-channel-config;

        }

        container state {

          config false;

          description
            "Operational state data for logical channels";

          uses terminal-logical-channel-config;
          uses terminal-logical-channel-state;
        }

        uses terminal-otn-protocol-top {
          when "config/logical-channel-type = 'PROT_OTN'" {
            description
              "Include the OTN protocol data only when the
              channel is using OTN framing.";
          }
        }
        uses terminal-ethernet-protocol-top {
          when "config/logical-channel-type = 'PROT_ETHERNET'" {
            description
              "Include the Ethernet protocol statistics only when the
              protocol used by the link is Ethernet.";
          }
        }
        uses terminal-logical-channel-ingress-top;
        uses terminal-logical-chan-assignment-top;
      }
    }
  }


  grouping terminal-optical-channel-config {
    description
      "Configuration data for describing optical channels";

    leaf frequency {
      type oc-opt-types:frequency-type;
      description
        "Frequency of the optical channel, expressed in MHz";
    }

    leaf target-output-power {
      type decimal64 {
        fraction-digits 2;
      }
      units dBm;
      description
        "Target output optical power level of the optical channel,
        expressed in increments of 0.01 dBm (decibel-milliwats)";
    }

    leaf operational-mode {
      type uint16;
      description
        "Vendor-specific mode identifier -- sets the operational
        mode for the channel.  The specified operational mode must
        exist in the list of supported operational modes supplied
        by the device";
      //
      // Ideally, this leaf should be a leafref to the supported
      // operational modes, but YANG 1.0 does not allow a r/w
      // leaf to be a leafref to a r/o leaf.
    }


    leaf line-port {
      type leafref {
        path "/oc-platform:components/oc-platform:component/" +
          "oc-platform:name";
      }
      description
        "Reference to the line-side physical port that carries
        this optical channel.  The target port should be
        a component in the physical inventory data model.";
    }
  }

  grouping terminal-optical-channel-state {
    description
      "Operational state data for optical channels";

    leaf group-id {
      type uint32;
      description
        "If the device places constraints on which optical
        channels must be managed together (e.g., transmitted on the
        same line port), it can indicate that by setting the group-id
        to the same value across related optical channels.";
    }

    uses oc-transceiver:optical-power-state;

    container chromatic-dispersion {
      description
        "Chromatic Dispersion of an optical channel in
        picoseconds / nanometer (ps/nm) as reported by receiver
        with two decimal precision. Values include the instantaneous,
        average, minimum, and maximum statistics. If avg/min/max
        statistics are not supported, the target is expected to just
        supply the instant value";

      uses oc-opt-types:avg-min-max-instant-stats-precision2-ps-nm;
    }

    container polarization-mode-dispersion {
      description
        "Polarization Mode Dispersion of an optical channel
        in picosends (ps) as reported by receiver with two decimal
        precision. Values include the instantaneous, average,
        minimum, and maximum statistics. If avg/min/max statistics
        are not supported, the target is expected to just supply the
        instant value";

      uses oc-opt-types:avg-min-max-instant-stats-precision2-ps;
    }

    container second-order-polarization-mode-dispersion {
      description
        "Second Order Polarization Mode Dispersion of an optical
        channel in picoseconds squared (ps^2) as reported by
        receiver with two decimal precision. Values include the
        instantaneous, average, minimum, and maximum statistics.
        If avg/min/max statistics are not supported, the target
        is expected to just supply the instant value";

      uses oc-opt-types:avg-min-max-instant-stats-precision2-ps2;
    }

    container polarization-dependent-loss {
      description
        "Polarization Dependent Loss of an optical channel
        in dB as reported by receiver with two decimal precision.
        Values include the instantaneous, average, minimum, and
        maximum statistics. If avg/min/max statistics are not
        supported, the target is expected to just supply the
        instant value";

      uses oc-types:avg-min-max-instant-stats-precision2-dB;
    }
  }

  grouping terminal-optical-channel-top {
    description
      "Top-level grouping for optical channel data";

    container optical-channel {
      description
        "Enclosing container for the list of optical channels";

      container config {
        description
          "Configuration data for optical channels";

        uses terminal-optical-channel-config;
      }

      container state {

        config false;

        description
          "Operational state data for optical channels";

        uses terminal-optical-channel-config;
        uses terminal-optical-channel-state;
      }
    }
  }

  grouping terminal-operational-mode-config {
    description
      "Configuration data for vendor-supported operational modes";
  }

  grouping terminal-operational-mode-state {
    description
      "Operational state data for vendor-supported operational
      modes";

      leaf mode-id {
        type uint16;
        description
          "Two-octet encoding of the vendor-defined operational
          mode";
      }

      leaf description {
        type string;
        description
          "Vendor-supplied textual description of the characteristics
          of this operational mode to enable operators to select the
          appropriate mode for the application.";
      }

      //TODO: examples of the kind of info that would be useful to
      //report in the operational mode:
      //Symbol rate (32G, 40G, 43G, 64G, etc.)
      //Modulation (QPSK, 8-QAM, 16-QAM, etc.)
      //Differential encoding (on, off/pilot symbol, etc)
      //State of polarization tracking mode (default, med.
      //high-speed, etc.)
      //Pulse shaping (RRC, RC, roll-off factor)
      //FEC mode (SD, HD, % OH)

      leaf vendor-id {
        type string;
        description
          "Identifier to represent the vendor / supplier of the
          platform and the associated operational mode information";
      }
  }

  grouping terminal-operational-mode-top {
    description
      "Top-level grouping for vendor-supported operational modes";

    container operational-modes {
      description
        "Enclosing container for list of operational modes";

      list mode {
        key "mode-id";
        config false;
        description
          "List of operational modes supported by the platform.
          The operational mode provides a platform-defined summary
          of information such as symbol rate, modulation, pulse
          shaping, etc.";

        leaf mode-id {
          type leafref {
            path "../state/mode-id";
          }
          description
            "Reference to mode-id";
        }

        container config {
          description
            "Configuration data for operational mode";

          uses terminal-operational-mode-config;
        }

        container state {

          config false;

          description
            "Operational state data for the platform-defined
            operational mode";

          uses terminal-operational-mode-config;
          uses terminal-operational-mode-state;
        }
      }
    }
  }


  grouping terminal-device-config {
    description
      "Configuration data for transport terminal devices at a
      device-wide level";
  }

  grouping terminal-device-state {
    description
      "Operational state data for transport terminal devices at a
      device-wide level";
  }

  grouping terminal-device-top {
    description
      "Top-level grouping for data for terminal devices";

    container terminal-device {
      description
        "Top-level container for the terminal device";

      container config {
        description
          "Configuration data for global terminal-device";

        uses terminal-device-config;
      }

      container state {

        config false;

        description
          "Operational state data for global terminal device";

        uses terminal-device-config;
        uses terminal-device-state;
      }

      uses terminal-logical-channel-top;
      uses terminal-operational-mode-top;

    }
  }

  // data definition statements

  uses terminal-device-top;

  // augment statements

  augment "/oc-platform:components/oc-platform:component" {
    when "/oc-platform:components/oc-platform:component/" +
      "oc-platform:state/oc-platform:type = 'OPTICAL_CHANNEL'" {
      description
        "Augment is active when component is of type
        OPTICAL_CHANNEL";
    }
    description
      "Adding optical channel data to physical inventory";

    uses terminal-optical-channel-top {
    }
  }

}
