VOL-639 - Use a more scalable scheme of numbering for the NNI and UNI
          logical port numbering

Change-Id: If94f45dd6af8c1f22d2f58ec361aea1738ef546b
diff --git a/voltha/adapters/asfvolt16_olt/asfvolt16_device_info.py b/voltha/adapters/asfvolt16_olt/asfvolt16_device_info.py
new file mode 100755
index 0000000..719f62e
--- /dev/null
+++ b/voltha/adapters/asfvolt16_olt/asfvolt16_device_info.py
@@ -0,0 +1,90 @@
+#

+# Copyright 2017 the original author or authors.

+#

+# Licensed under the Apache License, Version 2.0 (the "License");

+# you may not use this file except in compliance with the License.

+# You may obtain a copy of the License at

+#

+#      http://www.apache.org/licenses/LICENSE-2.0

+#

+# Unless required by applicable law or agreed to in writing, software

+# distributed under the License is distributed on an "AS IS" BASIS,

+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+# See the License for the specific language governing permissions and

+# limitations under the License.

+#

+

+from twisted.internet.defer import inlineCallbacks

+

+"""

+Asfvolt16 Device specific information handler

+"""

+

+

+class Asfvolt16DeviceTopology(object):

+    def __init__(self, nnis=4, pons=16, mac_devs=8, mac_per_dev=2,

+                 pon_sub_family="BAL_PON_SUB_FAMILY_XGPON"):

+        self.num_of_nni_ports = nnis

+        self.num_of_pon_ports = pons

+        self.num_of_mac_devs = mac_devs

+        self.num_of_pons_per_mac_dev = mac_per_dev

+        self.pon_sub_family = pon_sub_family

+

+

+class Asfvolt16DeviceSoftwareInfo(object):

+    def __init__(self, ver_type="BAL_VERSION_TYPE_RELEASE", maj_ver=2,

+                 min_ver=4, om_ver=1):

+        self.version_type = ver_type

+        self.major_version = maj_ver

+        self.minor_version = min_ver

+        self.om_version = om_ver

+

+

+class Asfvolt16DeviceInfo(object):

+    def __init__(self, bal, log, device_id):

+        self.bal = bal

+        self.log = log

+        self.device_id = device_id

+        self.asfvolt16_device_topology = Asfvolt16DeviceTopology()

+        self.asfvolt16_device_sw_info = Asfvolt16DeviceSoftwareInfo()

+        self.sfp_device_presence_map = dict()

+

+    def update_device_topology(self, access_term_ind):

+        try:

+            self.asfvolt16_device_topology.num_of_nni_ports = \

+                access_term_ind.data.topology.num_of_nni_ports

+            self.asfvolt16_device_topology.num_of_pon_ports = \

+                access_term_ind.data.topology.num_of_pon_ports

+            self.asfvolt16_device_topology.num_of_mac_devs = \

+                access_term_ind.data.topology.num_of_mac_devs

+            self.asfvolt16_device_topology.num_of_pons_per_mac_dev = \

+                access_term_ind.data.topology.num_of_pons_per_mac_dev

+            self.asfvolt16_device_topology.pon_sub_family = \

+                access_term_ind.data.topology.pon_sub_family

+        except Exception as e:

+            self.log.error("error-reading-topology", e=e)

+

+    def update_device_software_info(self, access_term_ind):

+        try:

+            self.asfvolt16_device_sw_info.version_type = \

+                access_term_ind.data.sw_version.version_type

+            self.asfvolt16_device_sw_info.major_rev = \

+                access_term_ind.data.sw_version.major_rev

+            self.asfvolt16_device_sw_info.minor_rev = \

+                access_term_ind.data.sw_version.minor_rev

+            self.asfvolt16_device_sw_info.om_version = \

+                access_term_ind.data.sw_version.om_version

+        except Exception as e:

+            self.log.error("error-reading-software-info", e=e)

+

+    @inlineCallbacks

+    def read_and_build_device_sfp_presence_map(self):

+        try:

+            sfp_presence_bitmap = \

+                yield self.bal.get_asfvolt_sfp_presence_map(self.device_id)

+            for i in range(self.asfvolt16_device_topology.num_of_pon_ports + \

+                           self.asfvolt16_device_topology.num_of_nni_ports):

+                if (1 << i) & int(sfp_presence_bitmap):

+                    self.sfp_device_presence_map[i] = True

+        except Exception as e:

+            self.log.error("read_and_build_device_sfp_presence_map", e=e)