module openconfig-platform-transceiver {

  yang-version "1";

  // namespace
  namespace "http://openconfig.net/yang/platform/transceiver";

  prefix "oc-transceiver";

  // import some basic types
  import openconfig-platform { prefix oc-platform; }
  import openconfig-interfaces { prefix oc-if; }
  import openconfig-transport-types { prefix oc-opt-types; }
  import openconfig-types { prefix oc-types; }
  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 defines configuration and operational state data
    for transceivers (i.e., pluggable optics).  The module should be
    used in conjunction with the platform model where other
    physical entity data are represented.

    In the platform model, a component of type=TRANSCEIVER is
    expected to be a subcomponent of a PORT component.  This
    module defines a concrete schema for the associated data for
    components with type=TRANSCEIVER.";

  oc-ext:openconfig-version "0.3.0";

  revision "2017-07-08" {
    description
      "Adds clarification on aggregate power measurement data";
    reference "0.3.0";
  }

  revision "2016-12-22" {
    description
      "Adds preconfiguration data and clarified units";
    reference "0.2.0";
  }

  // identity statements

  // typedef statements

  // grouping statements

  grouping optical-power-state {
    description
      "Reusable leaves related to optical power state -- these
      are read-only state values. If avg/min/max statistics are
      not supported, the target is expected to just supply the
      instant value";

    container output-power {
      description
        "The output optical power of a physical channel in units
        of 0.01dBm, which may be associated with individual
        physical channels, or an aggregate of multiple physical
        channels (i.e., for the overall transceiver). For an
        aggregate, this may be a measurement from a photodetector
        or a a calculation performed on the device by summing up
        all of the related individual physical channels.
        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-dBm;
    }

    container input-power {
      description
        "The input optical power of a physical channel in units
        of 0.01dBm, which may be associated with individual
        physical channels, or an aggregate of multiple physical
        channels (i.e., for the overall transceiver). For an
        aggregate, this may be a measurement from a photodetector
        or a a calculation performed on the device by summing up
        all of the related individual physical channels.
        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-dBm;
    }

    container laser-bias-current {
      description
        "The current applied by the system to the transmit laser to
        achieve the output power. The current is expressed in mA
        with up to 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-mA;
    }
  }

  grouping output-optical-frequency {
    description
      "Reusable leaves related to optical output power -- this is
      typically configurable on line side and read-only on the
      client-side";

    leaf output-frequency {
      type oc-opt-types:frequency-type;
      description
        "The frequency in MHz of the individual physical channel
        (e.g. ITU C50 - 195.0THz and would be reported as
        195,000,000 MHz in this model). This attribute is not
        configurable on most client ports.";
    }
  }


  grouping physical-channel-config {
    description
      "Configuration data for physical client channels";

    leaf index {
      type uint16 {
        range 0..max;
      }
      description
        "Index of the physical channnel or lane within a physical
        client port";
    }

    leaf description {
      type string;
      description
        "Text description for the client physical channel";
    }

    leaf tx-laser {
      type boolean;
      description
        "Enable (true) or disable (false) the transmit label for the
        channel";
    }

    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)";
    }
  }

  grouping physical-channel-state {
    description
      "Operational state data for client channels.";

    uses output-optical-frequency;
    uses optical-power-state;
  }

  grouping physical-channel-top {
    description
      "Top-level grouping for physical client channels";

    container physical-channels {
      description
        "Enclosing container for client channels";

      list channel {
        key "index";
        description
          "List of client channels, keyed by index within a physical
          client port.  A physical port with a single channel would
          have a single zero-indexed element";

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

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

          uses physical-channel-config;
        }

        container state {

          config false;

          description
            "Operational state data for channels";

          uses physical-channel-config;
          uses physical-channel-state;
        }
      }
    }
  }


  grouping port-transceiver-config {
    description
      "Configuration data for client port transceivers";

    leaf enabled {
      type boolean;
      description
        "Turns power on / off to the transceiver -- provides a means
        to power on/off the transceiver (in the case of SFP, SFP+,
        QSFP,...) or enable high-power mode (in the case of CFP,
        CFP2, CFP4) and is optionally supported (device can choose to
        always enable).  True = power on / high power, False =
        powered off";
    }

    leaf form-factor-preconf {
      type identityref {
        base oc-opt-types:TRANSCEIVER_FORM_FACTOR_TYPE;
      }
      description
        "Indicates the type of optical transceiver used on this
        port.  If the client port is built into the device and not
        pluggable, then non-pluggable is the corresponding state. If
        a device port supports multiple form factors (e.g. QSFP28
        and QSFP+, then the value of the transceiver installed shall
        be reported. If no transceiver is present, then the value of
        the highest rate form factor shall be reported
        (QSFP28, for example).

        The form factor is included in configuration data to allow
        pre-configuring a device with the expected type of
        transceiver ahead of deployment.  The corresponding state
        leaf should reflect the actual transceiver type plugged into
        the system.";
    }

    leaf ethernet-pmd-preconf {
      type identityref {
        base oc-opt-types:ETHERNET_PMD_TYPE;
      }
      description
        "The Ethernet PMD is a property of the optical transceiver
        used on the port, indicating the type of physical connection.
        It is included in configuration data to allow pre-configuring
        a port/transceiver with the expected PMD.  The actual PMD is
        indicated by the ethernet-pmd state leaf.";
    }
  }

  grouping port-transceiver-state {
    description
      "Operational state data for client port transceivers";

    leaf present {
      type enumeration {
        enum PRESENT {
          description
            "Transceiver is present on the port";
        }
        enum NOT_PRESENT {
          description
            "Transceiver is not present on the port";
        }
      }
      description
        "Indicates whether a transceiver is present in
        the specified client port.";
    }

    leaf form-factor {
      type identityref {
        base oc-opt-types:TRANSCEIVER_FORM_FACTOR_TYPE;
      }
      description
        "Indicates the type of optical transceiver used on this
        port.  If the client port is built into the device and not
        pluggable, then non-pluggable is the corresponding state. If
        a device port supports multiple form factors (e.g. QSFP28
        and QSFP+, then the value of the transceiver installed shall
        be reported. If no transceiver is present, then the value of
        the highest rate form factor shall be reported
        (QSFP28, for example).";
    }

    leaf connector-type {
      type identityref {
        base oc-opt-types:FIBER_CONNECTOR_TYPE;
      }
      description
        "Connector type used on this port";
    }

    leaf internal-temp {
    // TODO: this should probably be removed if we add temperature
    // as a top-level component property, i.e., transceiver temp
    // should be reported there.
      type int16 {
        range -40..125;
      }
      description
        "Internally measured temperature in degrees Celsius. MSA
        valid range is between -40 and +125C. Accuracy shall be
        better than +/- 3 degC over the whole temperature range.";
    }

    leaf vendor {
      type string {
        length 1..16;
      }
      description
        "Full name of transceiver vendor. 16-octet field that
        contains ASCII characters, left-aligned and padded on the
        right with ASCII spaces (20h)";
    }

    leaf vendor-part {
      type string {
        length 1..16;
      }
      description
        "Transceiver vendor's part number. 16-octet field that
        contains ASCII characters, left-aligned and padded on the
        right with ASCII spaces (20h). If part number is undefined,
        all 16 octets = 0h";
    }

    leaf vendor-rev {
      type string {
        length 1..2;
      }
      description
        "Transceiver vendor's revision number. 2-octet field that
        contains ASCII characters, left-aligned and padded on the
        right with ASCII spaces (20h)";
    }

    //TODO: these compliance code leaves should be active based on
    //the type of port
    leaf ethernet-pmd {
      type identityref {
        base oc-opt-types:ETHERNET_PMD_TYPE;
      }
      description
        "Ethernet PMD (physical medium dependent sublayer) that the
        transceiver supports. The SFF/QSFP MSAs have registers for
        this and CFP MSA has similar.";
    }

    leaf sonet-sdh-compliance-code {
      type identityref {
        base oc-opt-types:SONET_APPLICATION_CODE;
      }
      description
        "SONET/SDH application code supported by the port";
    }

    leaf otn-compliance-code {
      type identityref {
        base oc-opt-types:OTN_APPLICATION_CODE;
      }
      description
        "OTN application code supported by the port";
    }

    leaf serial-no {
      type string {
        length 1..16;
      }
      description
        "Transceiver serial number. 16-octet field that contains
        ASCII characters, left-aligned and padded on the right with
        ASCII spaces (20h). If part serial number is undefined, all
        16 octets = 0h";
    }

    leaf date-code {
      type yang:date-and-time;
      description
        "Representation of the transceiver date code, typically
        stored as YYMMDD.  The time portion of the value is
        undefined and not intended to be read.";
    }

    leaf fault-condition {
      type boolean;
      description
        "Indicates if a fault condition exists in the transceiver";
    }

    uses optical-power-state;

  }

  grouping port-transceiver-top {
    description
      "Top-level grouping for client port transceiver data";

    container transceiver {
      description
        "Top-level container for client port transceiver data";

      container config {
        description
          "Configuration data for client port transceivers";

        uses port-transceiver-config;
      }

      container state {

        config false;

        description
          "Operational state data for client port transceivers";

        uses port-transceiver-config;
        uses port-transceiver-state;
      }
      // physical channels are associated with a transceiver
      // component
      uses physical-channel-top;
    }
  }

  // data definition statements

  // augment statements

  augment "/oc-platform:components/oc-platform:component" {
    description
      "Adding transceiver data to physical inventory";

    uses port-transceiver-top {
      when "current()/oc-platform:state/" +
        "oc-platform:type = 'TRANSCEIVER'" {
        description
          "Augment is active when component is of type TRANSCEIVER";
      }
    }
  }

  augment "/oc-if:interfaces/oc-if:interface/oc-if:state" {
    //TODO: add 'when' or other condition to make sure this
    //leafref points to a component of type TRANSCEIVER.
    description
      "Adds a reference from the base interface to its corresponding
      physical channels.";

    leaf-list physical-channel {
      type leafref {
        path "/oc-platform:components/" +
          "oc-platform:component[oc-platform:name=current()/../oc-platform:hardware-port]/" +
          "oc-transceiver:transceiver/" +
          "oc-transceiver:physical-channels/oc-transceiver:channel/" +
          "oc-transceiver:index";
      }
      description
        "For a channelized interface, list of references to the
        physical channels (lanes) corresponding to the interface.";
    }
  }

  // rpc statements

  // notification statements

}
