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-platform-port { prefix oc-port; }
  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 openconfig-yang-types { prefix oc-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.5.0";

  revision "2018-05-15" {
    description
      "Remove internal-temp state leaf, since we prefer
      the generic /components/component/state/temperature
      container for temperature information.";
    reference "0.5.0";
  }

  revision "2018-01-22" {
    description
      "Fixed physical-channel path reference";
    reference "0.4.1";
  }

  revision "2017-09-18" {
    description
      "Use openconfig-yang-types module";
    reference "0.4.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 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 oc-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-port: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

}
