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;
    revision-date "2016-06-06";
  }
  import openconfig-interfaces {
    prefix oc-if;
    revision-date "2016-05-26";
  }
  import openconfig-transport-types {
    prefix oc-opt-types;
    revision-date "2016-12-22";
  }
  import openconfig-types {
    prefix oc-types;
    revision-date "2017-01-13";
  }
  import openconfig-extensions {
    prefix oc-ext;
    revision-date "2015-10-09";
  }
  import ietf-yang-types {
    prefix yang;
  }


    // import tailf-common {prefix "tailf";}
    // tailf:export netconf;
    // tailf:export rest;

  // 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.2.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 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.
        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 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.
        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";
    }

  }

  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

}
