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;
    }
    container osnr {
          description
            "Optical 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 modulation {
          type oc-opt-types:modulation-format;
          description
            "Modulation of the optical channel, expressed in dB";
     }

    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 {
    }
  }

}
