diff --git a/tools/test/tofino-port-auto-setup-tool/37-port-config.txt b/tools/test/tofino-port-auto-setup-tool/37-port-config.txt
new file mode 100644
index 0000000..694fcde
--- /dev/null
+++ b/tools/test/tofino-port-auto-setup-tool/37-port-config.txt
@@ -0,0 +1,3 @@
+1/0 BF_SPEED_100G BF_FEC_TYP_NONE
+2/0 BF_SPEED_100G BF_FEC_TYP_NONE
+3/0 BF_SPEED_40G BF_FEC_TYP_NONE
diff --git a/tools/test/tofino-port-auto-setup-tool/38-port-config.txt b/tools/test/tofino-port-auto-setup-tool/38-port-config.txt
new file mode 100644
index 0000000..694fcde
--- /dev/null
+++ b/tools/test/tofino-port-auto-setup-tool/38-port-config.txt
@@ -0,0 +1,3 @@
+1/0 BF_SPEED_100G BF_FEC_TYP_NONE
+2/0 BF_SPEED_100G BF_FEC_TYP_NONE
+3/0 BF_SPEED_40G BF_FEC_TYP_NONE
diff --git a/tools/test/tofino-port-auto-setup-tool/39-port-config.txt b/tools/test/tofino-port-auto-setup-tool/39-port-config.txt
new file mode 100644
index 0000000..d1df068
--- /dev/null
+++ b/tools/test/tofino-port-auto-setup-tool/39-port-config.txt
@@ -0,0 +1,2 @@
+1/0 BF_SPEED_100G BF_FEC_TYP_NONE
+2/0 BF_SPEED_100G BF_FEC_TYP_NONE
diff --git a/tools/test/tofino-port-auto-setup-tool/40-port-config.txt b/tools/test/tofino-port-auto-setup-tool/40-port-config.txt
new file mode 100644
index 0000000..d1df068
--- /dev/null
+++ b/tools/test/tofino-port-auto-setup-tool/40-port-config.txt
@@ -0,0 +1,2 @@
+1/0 BF_SPEED_100G BF_FEC_TYP_NONE
+2/0 BF_SPEED_100G BF_FEC_TYP_NONE
diff --git a/tools/test/tofino-port-auto-setup-tool/README.md b/tools/test/tofino-port-auto-setup-tool/README.md
new file mode 100644
index 0000000..5c75b42
--- /dev/null
+++ b/tools/test/tofino-port-auto-setup-tool/README.md
@@ -0,0 +1,65 @@
+Tofino auto setup script
+====
+
+## Infra
+```
+.
+├── 37-port-config.txt  # port configs
+├── 38-port-config.txt
+├── 39-port-config.txt
+├── 40-port-config.txt
+├── README              # this file
+├── pm.py               # port manager main program
+├── ports-32x.txt       # ports information dump from switches
+├── ports-65x.txt
+├── ports.json          # ports/channels to device port mapping file
+├── push-all-port-configs.sh  # demo script
+└── thrift              # thrift folder
+    ├── gen-py          # generated from pltfm_pm_rpc.thrift wtih thrift compiler
+    │   ├── __init__.py
+    │   └── pltfm_pm_rpc
+    │       ├── __init__.py
+    │       ├── constants.py
+    │       ├── pltfm_pm_rpc-remote
+    │       ├── pltfm_pm_rpc.py
+    │       ├── ttypes.py
+    └── pltfm_pm_rpc.thrift  # thrift definition for port manager RPC
+```
+
+## Usage
+```
+pm.py [-h] [--port PORT] [--ports-file PORTS_FILE] ip port_config
+
+Tofino port manager tool
+
+positional arguments:
+  ip                    IP of BF-Platfrom
+  port_config           Port configuration
+
+optional arguments:
+  -h, --help            show this help message and exit
+  --port PORT           Port of BF-Platfrom
+  --ports-file PORTS_FILE
+                        A json file which defines ports
+```
+
+## Port config file example
+```
+1/0 BF_SPEED_100G BF_FEC_TYP_NONE
+2/0 BF_SPEED_100G BF_FEC_TYP_NONE
+3/0 BF_SPEED_40G BF_FEC_TYP_NONE
+```
+
+## ports.json
+```
+{
+	"board_type": [
+		[],
+		[PORT1_CHNL0_DP, PORT1_CHNL1_DP, PORT1_CHNL2_DP, PORT1_CHNL3_DP],
+		[PORT2_CHNL0_DP, PORT2_CHNL1_DP, PORT2_CHNL2_DP, PORT2_CHNL3_DP],
+		.........
+	],
+	......
+}
+
+```
diff --git a/tools/test/tofino-port-auto-setup-tool/pm.py b/tools/test/tofino-port-auto-setup-tool/pm.py
new file mode 100755
index 0000000..d93166d
--- /dev/null
+++ b/tools/test/tofino-port-auto-setup-tool/pm.py
@@ -0,0 +1,133 @@
+#!/usr/bin/env python
+
+import sys
+import glob
+import json
+import argparse
+
+sys.path.append('thrift/gen-py')
+
+from pltfm_pm_rpc.pltfm_pm_rpc import Client
+from pltfm_pm_rpc.ttypes import InvalidPltfmPmOperation
+from pltfm_pm_rpc.ttypes import pltfm_pm_port_speed_t, pltfm_pm_fec_type_t
+from pltfm_pm_rpc.ttypes import pltfm_pm_board_type_t
+from thrift import Thrift
+from thrift.transport import TSocket
+from thrift.transport import TTransport
+from thrift.protocol import TBinaryProtocol
+from thrift.protocol import TMultiplexedProtocol
+
+
+class PortMgr:
+    """ Port Manager """
+
+    def __init__(self, serverIp, serverPort=9095, portsDef={}):
+        self.serverIp = serverIp
+        self.serverPort = serverPort
+        self.portsDef = portsDef
+        self.broadType = None
+        self.transport = TSocket.TSocket(serverIp, serverPort)
+        self.transport = TTransport.TBufferedTransport(self.transport)
+        self.protocol = TBinaryProtocol.TBinaryProtocol(self.transport)
+        self.protocol = TMultiplexedProtocol.TMultiplexedProtocol(self.protocol, "pltfm_pm_rpc")
+        self.client = Client(self.protocol)
+
+    def __enter__(self):
+        self.transport.open()
+        bd_id = self.getBroadType()
+        self.broadType = pltfm_pm_board_type_t._VALUES_TO_NAMES[bd_id]
+        self.log("Connected, broad type: %s" % (self.broadType))
+        return self
+
+    def __exit__(self, type, value, traceback):
+        self.transport.close()
+        self.log("Disconnected")
+
+    def log(self, msg):
+        print "[%s] %s" % (self.serverIp, msg)
+
+    def portCleanup(self, deviceId=0):
+        self.log("Cleaning up all ports")
+        # clean up is not working.....
+        # return self.client.pltfm_pm_switchd_port_cleanup(deviceId)
+        # try disable all ports and delete all ports
+        for portDef in self.portsDef[self.broadType]:
+            for dp in portDef:
+                try:
+                    if self._getPortStatus(dp, deviceId) != -1:
+                        self.client.pltfm_pm_port_dis(deviceId, dp)
+                        self.client.pltfm_pm_port_del(deviceId, dp)
+                except Exception as e:
+                    raise e
+
+    def getPortStatus(self, portNum, channelNum=0, deviceId=0):
+        dp = self.portsDef[self.broadType][portNum][channelNum]
+        return self._getPortStatus(dp, deviceId)
+
+    def _getPortStatus(self, dp, deviceId=0):
+        try:
+            result = self.client.pltfm_pm_port_oper_status_get(deviceId, dp)
+            return result
+        except InvalidPltfmPmOperation as e:
+            return -1
+
+    def addPort(self, portNum, channelNum=0, deviceId=0,
+                speed=pltfm_pm_port_speed_t.BF_SPEED_100G,
+                fecType=pltfm_pm_fec_type_t.BF_FEC_TYP_NONE):
+        self.log("Adding port %d/%d with speed %s fec %s"
+                 % (portNum, channelNum, speed, fecType))
+        dp = self.portsDef[self.broadType][portNum][channelNum]
+        try:
+            result = self.client.pltfm_pm_port_add(deviceId, dp, speed, fecType)
+            self.log("Port %d/%d added" % (portNum, channelNum))
+            return result
+        except InvalidPltfmPmOperation as e:
+            self.log("Can't add port %d/%d, code: %d" % (portNum, channelNum, e.code))
+
+    def enablePort(self, portNum, channelNum=0, deviceId=0):
+        self.log("Enabling port %d/%d" % (portNum, channelNum))
+        dp = self.portsDef[self.broadType][portNum][channelNum]
+        try:
+            result = self.client.pltfm_pm_port_enable(deviceId, dp)
+            self.log("Port %d/%d enabled" % (portNum, channelNum))
+            return result
+        except Exception as e:
+            self.log("Can't enable port %d/%d, code: %d" % (portNum, channelNum, e.code))
+
+    def getBroadType(self):
+        return self.client.pltfm_pm_board_type_get();
+
+
+def main(args):
+    with open(args.ports_file) as portsFile:
+        portsDef = json.load(portsFile)
+    with PortMgr(args.ip, args.port, portsDef) as portMgr:
+        if args.do_cleanup:
+            portMgr.portCleanup()
+        with open(args.port_config) as portConfig:
+            for line in portConfig:
+                if len(line) == 0:
+                    continue
+                line = line.strip()
+                info = line.split(' ')
+                portChannel = info[0]
+                speed = pltfm_pm_port_speed_t._NAMES_TO_VALUES[info[1]]
+                fecType = pltfm_pm_fec_type_t._NAMES_TO_VALUES[info[2]]
+                portNum = int(portChannel.split('/')[0])
+                channelNum = int(portChannel.split('/')[1])
+                portMgr.addPort(portNum, channelNum, speed=speed, fecType=fecType)
+                portMgr.enablePort(portNum, channelNum)
+
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser(description='Tofino port manager tool')
+    parser.add_argument('ip', help='IP of BF-Platfrom')
+    parser.add_argument('port_config', help='Port configuration')
+    parser.add_argument('--port', type=int, help='Port of BF-Platfrom', default=9095)
+    parser.add_argument('--ports-file', help='A json file which defines ports',
+                        default='ports.json')
+    parser.add_argument('--do-cleanup', help='Performs port cleanup',
+                        type=bool, default=False)
+
+    args = parser.parse_args()
+    main(args)
diff --git a/tools/test/tofino-port-auto-setup-tool/ports-32x.txt b/tools/test/tofino-port-auto-setup-tool/ports-32x.txt
new file mode 100644
index 0000000..ffac3fc
--- /dev/null
+++ b/tools/test/tofino-port-auto-setup-tool/ports-32x.txt
@@ -0,0 +1,135 @@
+----+----+---+----+------+----+----+---+---+----------------+----------------+-
+PORT|MAC |D_P|P/PT|SPEED |FEC |QSFP|ADM|OPR|FRAMES RX       |FRAMES TX       |E
+----+----+---+----+------+----+----+---+---+----------------+----------------+-
+ 1/0|47/0|128|3/ 0| 10G  |NONE|YES |DIS|DWN|               0|               0|
+ 1/1|47/1|129|3/ 1| 10G  |NONE|YES |DIS|DWN|               0|               0|
+ 1/2|47/2|130|3/ 2| 10G  |NONE|YES |DIS|DWN|               0|               0|
+ 1/3|47/3|131|3/ 3| 10G  |NONE|YES |DIS|DWN|               0|               0|
+ 2/0|45/0|136|3/ 8| 10G  |NONE|YES |DIS|DWN|               0|               0|
+ 2/1|45/1|137|3/ 9| 10G  |NONE|YES |DIS|DWN|               0|               0|
+ 2/2|45/2|138|3/10| 10G  |NONE|YES |DIS|DWN|               0|               0|
+ 2/3|45/3|139|3/11| 10G  |NONE|YES |DIS|DWN|               0|               0|
+ 3/0|43/0|144|3/16| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 3/1|43/1|145|3/17| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 3/2|43/2|146|3/18| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 3/3|43/3|147|3/19| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 4/0|41/0|152|3/24| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 4/1|41/1|153|3/25| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 4/2|41/2|154|3/26| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 4/3|41/3|155|3/27| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 5/0|39/0|160|3/32| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 5/1|39/1|161|3/33| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 5/2|39/2|162|3/34| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 5/3|39/3|163|3/35| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 6/0|37/0|168|3/40| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 6/1|37/1|169|3/41| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 6/2|37/2|170|3/42| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 6/3|37/3|171|3/43| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 7/0|35/0|176|3/48| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 7/1|35/1|177|3/49| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 7/2|35/2|178|3/50| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 7/3|35/3|179|3/51| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 8/0|33/0|184|3/56| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 8/1|33/1|185|3/57| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 8/2|33/2|186|3/58| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 8/3|33/3|187|3/59| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 9/0|31/0| 60|1/60| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 9/1|31/1| 61|1/61| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 9/2|31/2| 62|1/62| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 9/3|31/3| 63|1/63| 10G  |NONE| NO |DIS|DWN|               0|               0|
+10/0|29/0| 52|1/52| 10G  |NONE| NO |DIS|DWN|               0|               0|
+10/1|29/1| 53|1/53| 10G  |NONE| NO |DIS|DWN|               0|               0|
+10/2|29/2| 54|1/54| 10G  |NONE| NO |DIS|DWN|               0|               0|
+10/3|29/3| 55|1/55| 10G  |NONE| NO |DIS|DWN|               0|               0|
+11/0|27/0| 44|1/44| 10G  |NONE| NO |DIS|DWN|               0|               0|
+11/1|27/1| 45|1/45| 10G  |NONE| NO |DIS|DWN|               0|               0|
+11/2|27/2| 46|1/46| 10G  |NONE| NO |DIS|DWN|               0|               0|
+11/3|27/3| 47|1/47| 10G  |NONE| NO |DIS|DWN|               0|               0|
+12/0|25/0| 36|1/36| 10G  |NONE| NO |DIS|DWN|               0|               0|
+12/1|25/1| 37|1/37| 10G  |NONE| NO |DIS|DWN|               0|               0|
+12/2|25/2| 38|1/38| 10G  |NONE| NO |DIS|DWN|               0|               0|
+12/3|25/3| 39|1/39| 10G  |NONE| NO |DIS|DWN|               0|               0|
+13/0|23/0| 28|1/28| 10G  |NONE| NO |DIS|DWN|               0|               0|
+13/1|23/1| 29|1/29| 10G  |NONE| NO |DIS|DWN|               0|               0|
+13/2|23/2| 30|1/30| 10G  |NONE| NO |DIS|DWN|               0|               0|
+13/3|23/3| 31|1/31| 10G  |NONE| NO |DIS|DWN|               0|               0|
+14/0|21/0| 20|1/20| 10G  |NONE| NO |DIS|DWN|               0|               0|
+14/1|21/1| 21|1/21| 10G  |NONE| NO |DIS|DWN|               0|               0|
+14/2|21/2| 22|1/22| 10G  |NONE| NO |DIS|DWN|               0|               0|
+14/3|21/3| 23|1/23| 10G  |NONE| NO |DIS|DWN|               0|               0|
+15/0|19/0| 12|1/12| 10G  |NONE| NO |DIS|DWN|               0|               0|
+15/1|19/1| 13|1/13| 10G  |NONE| NO |DIS|DWN|               0|               0|
+15/2|19/2| 14|1/14| 10G  |NONE| NO |DIS|DWN|               0|               0|
+15/3|19/3| 15|1/15| 10G  |NONE| NO |DIS|DWN|               0|               0|
+16/0|17/0|  4|1/ 4| 10G  |NONE| NO |DIS|DWN|               0|               0|
+16/1|17/1|  5|1/ 5| 10G  |NONE| NO |DIS|DWN|               0|               0|
+16/2|17/2|  6|1/ 6| 10G  |NONE| NO |DIS|DWN|               0|               0|
+16/3|17/3|  7|1/ 7| 10G  |NONE| NO |DIS|DWN|               0|               0|
+17/0|15/0|  0|1/ 0| 10G  |NONE| NO |DIS|DWN|               0|               0|
+17/1|15/1|  1|1/ 1| 10G  |NONE| NO |DIS|DWN|               0|               0|
+17/2|15/2|  2|1/ 2| 10G  |NONE| NO |DIS|DWN|               0|               0|
+17/3|15/3|  3|1/ 3| 10G  |NONE| NO |DIS|DWN|               0|               0|
+18/0|13/0|  8|1/ 8| 10G  |NONE| NO |DIS|DWN|               0|               0|
+18/1|13/1|  9|1/ 9| 10G  |NONE| NO |DIS|DWN|               0|               0|
+18/2|13/2| 10|1/10| 10G  |NONE| NO |DIS|DWN|               0|               0|
+18/3|13/3| 11|1/11| 10G  |NONE| NO |DIS|DWN|               0|               0|
+19/0|11/0| 16|1/16| 10G  |NONE| NO |DIS|DWN|               0|               0|
+19/1|11/1| 17|1/17| 10G  |NONE| NO |DIS|DWN|               0|               0|
+19/2|11/2| 18|1/18| 10G  |NONE| NO |DIS|DWN|               0|               0|
+19/3|11/3| 19|1/19| 10G  |NONE| NO |DIS|DWN|               0|               0|
+20/0| 9/0| 24|1/24| 10G  |NONE| NO |DIS|DWN|               0|               0|
+20/1| 9/1| 25|1/25| 10G  |NONE| NO |DIS|DWN|               0|               0|
+20/2| 9/2| 26|1/26| 10G  |NONE| NO |DIS|DWN|               0|               0|
+20/3| 9/3| 27|1/27| 10G  |NONE| NO |DIS|DWN|               0|               0|
+21/0| 7/0| 32|1/32| 10G  |NONE| NO |DIS|DWN|               0|               0|
+21/1| 7/1| 33|1/33| 10G  |NONE| NO |DIS|DWN|               0|               0|
+21/2| 7/2| 34|1/34| 10G  |NONE| NO |DIS|DWN|               0|               0|
+21/3| 7/3| 35|1/35| 10G  |NONE| NO |DIS|DWN|               0|               0|
+22/0| 5/0| 40|1/40| 10G  |NONE| NO |DIS|DWN|               0|               0|
+22/1| 5/1| 41|1/41| 10G  |NONE| NO |DIS|DWN|               0|               0|
+22/2| 5/2| 42|1/42| 10G  |NONE| NO |DIS|DWN|               0|               0|
+22/3| 5/3| 43|1/43| 10G  |NONE| NO |DIS|DWN|               0|               0|
+23/0| 3/0| 48|1/48| 10G  |NONE| NO |DIS|DWN|               0|               0|
+23/1| 3/1| 49|1/49| 10G  |NONE| NO |DIS|DWN|               0|               0|
+23/2| 3/2| 50|1/50| 10G  |NONE| NO |DIS|DWN|               0|               0|
+23/3| 3/3| 51|1/51| 10G  |NONE| NO |DIS|DWN|               0|               0|
+24/0| 1/0| 56|1/56| 10G  |NONE| NO |DIS|DWN|               0|               0|
+24/1| 1/1| 57|1/57| 10G  |NONE| NO |DIS|DWN|               0|               0|
+24/2| 1/2| 58|1/58| 10G  |NONE| NO |DIS|DWN|               0|               0|
+24/3| 1/3| 59|1/59| 10G  |NONE| NO |DIS|DWN|               0|               0|
+25/0|63/0|188|3/60| 10G  |NONE| NO |DIS|DWN|               0|               0|
+25/1|63/1|189|3/61| 10G  |NONE| NO |DIS|DWN|               0|               0|
+25/2|63/2|190|3/62| 10G  |NONE| NO |DIS|DWN|               0|               0|
+25/3|63/3|191|3/63| 10G  |NONE| NO |DIS|DWN|               0|               0|
+26/0|61/0|180|3/52| 10G  |NONE| NO |DIS|DWN|               0|               0|
+26/1|61/1|181|3/53| 10G  |NONE| NO |DIS|DWN|               0|               0|
+26/2|61/2|182|3/54| 10G  |NONE| NO |DIS|DWN|               0|               0|
+26/3|61/3|183|3/55| 10G  |NONE| NO |DIS|DWN|               0|               0|
+27/0|59/0|172|3/44| 10G  |NONE| NO |DIS|DWN|               0|               0|
+27/1|59/1|173|3/45| 10G  |NONE| NO |DIS|DWN|               0|               0|
+27/2|59/2|174|3/46| 10G  |NONE| NO |DIS|DWN|               0|               0|
+27/3|59/3|175|3/47| 10G  |NONE| NO |DIS|DWN|               0|               0|
+28/0|57/0|164|3/36| 10G  |NONE| NO |DIS|DWN|               0|               0|
+28/1|57/1|165|3/37| 10G  |NONE| NO |DIS|DWN|               0|               0|
+28/2|57/2|166|3/38| 10G  |NONE| NO |DIS|DWN|               0|               0|
+28/3|57/3|167|3/39| 10G  |NONE| NO |DIS|DWN|               0|               0|
+29/0|53/0|148|3/20| 10G  |NONE| NO |DIS|DWN|               0|               0|
+29/1|53/1|149|3/21| 10G  |NONE| NO |DIS|DWN|               0|               0|
+29/2|53/2|150|3/22| 10G  |NONE| NO |DIS|DWN|               0|               0|
+29/3|53/3|151|3/23| 10G  |NONE| NO |DIS|DWN|               0|               0|
+30/0|55/0|156|3/28| 10G  |NONE| NO |DIS|DWN|               0|               0|
+30/1|55/1|157|3/29| 10G  |NONE| NO |DIS|DWN|               0|               0|
+30/2|55/2|158|3/30| 10G  |NONE| NO |DIS|DWN|               0|               0|
+30/3|55/3|159|3/31| 10G  |NONE| NO |DIS|DWN|               0|               0|
+31/0|49/0|132|3/ 4| 10G  |NONE| NO |DIS|DWN|               0|               0|
+31/1|49/1|133|3/ 5| 10G  |NONE| NO |DIS|DWN|               0|               0|
+31/2|49/2|134|3/ 6| 10G  |NONE| NO |DIS|DWN|               0|               0|
+31/3|49/3|135|3/ 7| 10G  |NONE| NO |DIS|DWN|               0|               0|
+32/0|51/0|140|3/12| 10G  |NONE| NO |DIS|DWN|               0|               0|
+32/1|51/1|141|3/13| 10G  |NONE| NO |DIS|DWN|               0|               0|
+32/2|51/2|142|3/14| 10G  |NONE| NO |DIS|DWN|               0|               0|
+32/3|51/3|143|3/15| 10G  |NONE| NO |DIS|DWN|               0|               0|
+33/0|64/0| 64|1/64| 10G  |NONE| NO |DIS|DWN|               0|               0|
+33/1|64/1| 65|1/65| 10G  |NONE| NO |DIS|DWN|               0|               0|
+33/2|64/2| 66|1/66| 10G  |NONE| NO |DIS|DWN|               0|               0|
+33/3|64/3| 67|1/67| 10G  |NONE| NO |DIS|DWN|               0|               0|
diff --git a/tools/test/tofino-port-auto-setup-tool/ports-65x.txt b/tools/test/tofino-port-auto-setup-tool/ports-65x.txt
new file mode 100644
index 0000000..3e94748
--- /dev/null
+++ b/tools/test/tofino-port-auto-setup-tool/ports-65x.txt
@@ -0,0 +1,271 @@
+----+----+---+----+------+----+----+---+---+----------------+----------------+-
+PORT|MAC |D_P|P/PT|SPEED |FEC |QSFP|ADM|OPR|FRAMES RX       |FRAMES TX       |E
+----+----+---+----+------+----+----+---+---+----------------+----------------+-
+ 1/0|31/0|188|1/60| 10G  |NONE|YES |DIS|DWN|               0|               0|
+ 1/1|31/1|189|1/61| 10G  |NONE|YES |DIS|DWN|               0|               0|
+ 1/2|31/2|190|1/62| 10G  |NONE|YES |DIS|DWN|               0|               0|
+ 1/3|31/3|191|1/63| 10G  |NONE|YES |DIS|DWN|               0|               0|
+ 2/0|30/0|184|1/56| 10G  |NONE|YES |DIS|DWN|               0|               0|
+ 2/1|30/1|185|1/57| 10G  |NONE|YES |DIS|DWN|               0|               0|
+ 2/2|30/2|186|1/58| 10G  |NONE|YES |DIS|DWN|               0|               0|
+ 2/3|30/3|187|1/59| 10G  |NONE|YES |DIS|DWN|               0|               0|
+ 3/0|29/0|180|1/52| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 3/1|29/1|181|1/53| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 3/2|29/2|182|1/54| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 3/3|29/3|183|1/55| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 4/0|28/0|176|1/48| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 4/1|28/1|177|1/49| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 4/2|28/2|178|1/50| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 4/3|28/3|179|1/51| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 5/0|27/0|172|1/44| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 5/1|27/1|173|1/45| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 5/2|27/2|174|1/46| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 5/3|27/3|175|1/47| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 6/0|26/0|168|1/40| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 6/1|26/1|169|1/41| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 6/2|26/2|170|1/42| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 6/3|26/3|171|1/43| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 7/0|25/0|164|1/36| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 7/1|25/1|165|1/37| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 7/2|25/2|166|1/38| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 7/3|25/3|167|1/39| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 8/0|24/0|160|1/32| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 8/1|24/1|161|1/33| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 8/2|24/2|162|1/34| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 8/3|24/3|163|1/35| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 9/0|23/0|156|1/28| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 9/1|23/1|157|1/29| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 9/2|23/2|158|1/30| 10G  |NONE| NO |DIS|DWN|               0|               0|
+ 9/3|23/3|159|1/31| 10G  |NONE| NO |DIS|DWN|               0|               0|
+10/0|22/0|152|1/24| 10G  |NONE| NO |DIS|DWN|               0|               0|
+10/1|22/1|153|1/25| 10G  |NONE| NO |DIS|DWN|               0|               0|
+10/2|22/2|154|1/26| 10G  |NONE| NO |DIS|DWN|               0|               0|
+10/3|22/3|155|1/27| 10G  |NONE| NO |DIS|DWN|               0|               0|
+11/0|21/0|148|1/20| 10G  |NONE| NO |DIS|DWN|               0|               0|
+11/1|21/1|149|1/21| 10G  |NONE| NO |DIS|DWN|               0|               0|
+11/2|21/2|150|1/22| 10G  |NONE| NO |DIS|DWN|               0|               0|
+11/3|21/3|151|1/23| 10G  |NONE| NO |DIS|DWN|               0|               0|
+12/0|20/0|144|1/16| 10G  |NONE| NO |DIS|DWN|               0|               0|
+12/1|20/1|145|1/17| 10G  |NONE| NO |DIS|DWN|               0|               0|
+12/2|20/2|146|1/18| 10G  |NONE| NO |DIS|DWN|               0|               0|
+12/3|20/3|147|1/19| 10G  |NONE| NO |DIS|DWN|               0|               0|
+13/0|19/0|140|1/12| 10G  |NONE| NO |DIS|DWN|               0|               0|
+13/1|19/1|141|1/13| 10G  |NONE| NO |DIS|DWN|               0|               0|
+13/2|19/2|142|1/14| 10G  |NONE| NO |DIS|DWN|               0|               0|
+13/3|19/3|143|1/15| 10G  |NONE| NO |DIS|DWN|               0|               0|
+PORT|MAC |D_P|P/PT|SPEED |FEC |QSFP|ADM|OPR|FRAMES RX       |FRAMES TX       |E
+----+----+---+----+------+----+----+---+---+----------------+----------------+-
+14/0|18/0|136|1/ 8| 10G  |NONE| NO |DIS|DWN|               0|               0|
+14/1|18/1|137|1/ 9| 10G  |NONE| NO |DIS|DWN|               0|               0|
+14/2|18/2|138|1/10| 10G  |NONE| NO |DIS|DWN|               0|               0|
+14/3|18/3|139|1/11| 10G  |NONE| NO |DIS|DWN|               0|               0|
+15/0|17/0|132|1/ 4| 10G  |NONE| NO |DIS|DWN|               0|               0|
+15/1|17/1|133|1/ 5| 10G  |NONE| NO |DIS|DWN|               0|               0|
+15/2|17/2|134|1/ 6| 10G  |NONE| NO |DIS|DWN|               0|               0|
+15/3|17/3|135|1/ 7| 10G  |NONE| NO |DIS|DWN|               0|               0|
+16/0|16/0|128|1/ 0| 10G  |NONE| NO |DIS|DWN|               0|               0|
+16/1|16/1|129|1/ 1| 10G  |NONE| NO |DIS|DWN|               0|               0|
+16/2|16/2|130|1/ 2| 10G  |NONE| NO |DIS|DWN|               0|               0|
+16/3|16/3|131|1/ 3| 10G  |NONE| NO |DIS|DWN|               0|               0|
+17/0|15/0|  0|0/ 0| 10G  |NONE| NO |DIS|DWN|               0|               0|
+17/1|15/1|  1|0/ 1| 10G  |NONE| NO |DIS|DWN|               0|               0|
+17/2|15/2|  2|0/ 2| 10G  |NONE| NO |DIS|DWN|               0|               0|
+17/3|15/3|  3|0/ 3| 10G  |NONE| NO |DIS|DWN|               0|               0|
+18/0|14/0|  4|0/ 4| 10G  |NONE| NO |DIS|DWN|               0|               0|
+18/1|14/1|  5|0/ 5| 10G  |NONE| NO |DIS|DWN|               0|               0|
+18/2|14/2|  6|0/ 6| 10G  |NONE| NO |DIS|DWN|               0|               0|
+18/3|14/3|  7|0/ 7| 10G  |NONE| NO |DIS|DWN|               0|               0|
+19/0|13/0|  8|0/ 8| 10G  |NONE| NO |DIS|DWN|               0|               0|
+19/1|13/1|  9|0/ 9| 10G  |NONE| NO |DIS|DWN|               0|               0|
+19/2|13/2| 10|0/10| 10G  |NONE| NO |DIS|DWN|               0|               0|
+19/3|13/3| 11|0/11| 10G  |NONE| NO |DIS|DWN|               0|               0|
+20/0|12/0| 12|0/12| 10G  |NONE| NO |DIS|DWN|               0|               0|
+20/1|12/1| 13|0/13| 10G  |NONE| NO |DIS|DWN|               0|               0|
+20/2|12/2| 14|0/14| 10G  |NONE| NO |DIS|DWN|               0|               0|
+20/3|12/3| 15|0/15| 10G  |NONE| NO |DIS|DWN|               0|               0|
+21/0|11/0| 16|0/16| 10G  |NONE| NO |DIS|DWN|               0|               0|
+21/1|11/1| 17|0/17| 10G  |NONE| NO |DIS|DWN|               0|               0|
+21/2|11/2| 18|0/18| 10G  |NONE| NO |DIS|DWN|               0|               0|
+21/3|11/3| 19|0/19| 10G  |NONE| NO |DIS|DWN|               0|               0|
+22/0|10/0| 20|0/20| 10G  |NONE| NO |DIS|DWN|               0|               0|
+22/1|10/1| 21|0/21| 10G  |NONE| NO |DIS|DWN|               0|               0|
+22/2|10/2| 22|0/22| 10G  |NONE| NO |DIS|DWN|               0|               0|
+22/3|10/3| 23|0/23| 10G  |NONE| NO |DIS|DWN|               0|               0|
+23/0| 9/0| 24|0/24| 10G  |NONE| NO |DIS|DWN|               0|               0|
+23/1| 9/1| 25|0/25| 10G  |NONE| NO |DIS|DWN|               0|               0|
+23/2| 9/2| 26|0/26| 10G  |NONE| NO |DIS|DWN|               0|               0|
+23/3| 9/3| 27|0/27| 10G  |NONE| NO |DIS|DWN|               0|               0|
+24/0| 8/0| 28|0/28| 10G  |NONE| NO |DIS|DWN|               0|               0|
+24/1| 8/1| 29|0/29| 10G  |NONE| NO |DIS|DWN|               0|               0|
+24/2| 8/2| 30|0/30| 10G  |NONE| NO |DIS|DWN|               0|               0|
+24/3| 8/3| 31|0/31| 10G  |NONE| NO |DIS|DWN|               0|               0|
+25/0| 7/0| 32|0/32| 10G  |NONE| NO |DIS|DWN|               0|               0|
+25/1| 7/1| 33|0/33| 10G  |NONE| NO |DIS|DWN|               0|               0|
+25/2| 7/2| 34|0/34| 10G  |NONE| NO |DIS|DWN|               0|               0|
+25/3| 7/3| 35|0/35| 10G  |NONE| NO |DIS|DWN|               0|               0|
+26/0| 6/0| 36|0/36| 10G  |NONE| NO |DIS|DWN|               0|               0|
+26/1| 6/1| 37|0/37| 10G  |NONE| NO |DIS|DWN|               0|               0|
+26/2| 6/2| 38|0/38| 10G  |NONE| NO |DIS|DWN|               0|               0|
+26/3| 6/3| 39|0/39| 10G  |NONE| NO |DIS|DWN|               0|               0|
+PORT|MAC |D_P|P/PT|SPEED |FEC |QSFP|ADM|OPR|FRAMES RX       |FRAMES TX       |E
+----+----+---+----+------+----+----+---+---+----------------+----------------+-
+27/0| 5/0| 40|0/40| 10G  |NONE| NO |DIS|DWN|               0|               0|
+27/1| 5/1| 41|0/41| 10G  |NONE| NO |DIS|DWN|               0|               0|
+27/2| 5/2| 42|0/42| 10G  |NONE| NO |DIS|DWN|               0|               0|
+27/3| 5/3| 43|0/43| 10G  |NONE| NO |DIS|DWN|               0|               0|
+28/0| 4/0| 44|0/44| 10G  |NONE| NO |DIS|DWN|               0|               0|
+28/1| 4/1| 45|0/45| 10G  |NONE| NO |DIS|DWN|               0|               0|
+28/2| 4/2| 46|0/46| 10G  |NONE| NO |DIS|DWN|               0|               0|
+28/3| 4/3| 47|0/47| 10G  |NONE| NO |DIS|DWN|               0|               0|
+29/0| 3/0| 48|0/48| 10G  |NONE| NO |DIS|DWN|               0|               0|
+29/1| 3/1| 49|0/49| 10G  |NONE| NO |DIS|DWN|               0|               0|
+29/2| 3/2| 50|0/50| 10G  |NONE| NO |DIS|DWN|               0|               0|
+29/3| 3/3| 51|0/51| 10G  |NONE| NO |DIS|DWN|               0|               0|
+30/0| 2/0| 52|0/52| 10G  |NONE| NO |DIS|DWN|               0|               0|
+30/1| 2/1| 53|0/53| 10G  |NONE| NO |DIS|DWN|               0|               0|
+30/2| 2/2| 54|0/54| 10G  |NONE| NO |DIS|DWN|               0|               0|
+30/3| 2/3| 55|0/55| 10G  |NONE| NO |DIS|DWN|               0|               0|
+31/0| 1/0| 56|0/56| 10G  |NONE| NO |DIS|DWN|               0|               0|
+31/1| 1/1| 57|0/57| 10G  |NONE| NO |DIS|DWN|               0|               0|
+31/2| 1/2| 58|0/58| 10G  |NONE| NO |DIS|DWN|               0|               0|
+31/3| 1/3| 59|0/59| 10G  |NONE| NO |DIS|DWN|               0|               0|
+32/0| 0/0| 60|0/60| 10G  |NONE| NO |DIS|DWN|               0|               0|
+32/1| 0/1| 61|0/61| 10G  |NONE| NO |DIS|DWN|               0|               0|
+32/2| 0/2| 62|0/62| 10G  |NONE| NO |DIS|DWN|               0|               0|
+32/3| 0/3| 63|0/63| 10G  |NONE| NO |DIS|DWN|               0|               0|
+33/0|40/0|284|2/28| 10G  |NONE| NO |DIS|DWN|               0|               0|
+33/1|40/1|285|2/29| 10G  |NONE| NO |DIS|DWN|               0|               0|
+33/2|40/2|286|2/30| 10G  |NONE| NO |DIS|DWN|               0|               0|
+33/3|40/3|287|2/31| 10G  |NONE| NO |DIS|DWN|               0|               0|
+34/0|41/0|280|2/24| 10G  |NONE| NO |DIS|DWN|               0|               0|
+34/1|41/1|281|2/25| 10G  |NONE| NO |DIS|DWN|               0|               0|
+34/2|41/2|282|2/26| 10G  |NONE| NO |DIS|DWN|               0|               0|
+34/3|41/3|283|2/27| 10G  |NONE| NO |DIS|DWN|               0|               0|
+35/0|42/0|276|2/20| 10G  |NONE| NO |DIS|DWN|               0|               0|
+35/1|42/1|277|2/21| 10G  |NONE| NO |DIS|DWN|               0|               0|
+35/2|42/2|278|2/22| 10G  |NONE| NO |DIS|DWN|               0|               0|
+35/3|42/3|279|2/23| 10G  |NONE| NO |DIS|DWN|               0|               0|
+36/0|43/0|272|2/16| 10G  |NONE| NO |DIS|DWN|               0|               0|
+36/1|43/1|273|2/17| 10G  |NONE| NO |DIS|DWN|               0|               0|
+36/2|43/2|274|2/18| 10G  |NONE| NO |DIS|DWN|               0|               0|
+36/3|43/3|275|2/19| 10G  |NONE| NO |DIS|DWN|               0|               0|
+37/0|44/0|268|2/12| 10G  |NONE| NO |DIS|DWN|               0|               0|
+37/1|44/1|269|2/13| 10G  |NONE| NO |DIS|DWN|               0|               0|
+37/2|44/2|270|2/14| 10G  |NONE| NO |DIS|DWN|               0|               0|
+37/3|44/3|271|2/15| 10G  |NONE| NO |DIS|DWN|               0|               0|
+38/0|45/0|264|2/ 8| 10G  |NONE| NO |DIS|DWN|               0|               0|
+38/1|45/1|265|2/ 9| 10G  |NONE| NO |DIS|DWN|               0|               0|
+38/2|45/2|266|2/10| 10G  |NONE| NO |DIS|DWN|               0|               0|
+38/3|45/3|267|2/11| 10G  |NONE| NO |DIS|DWN|               0|               0|
+39/0|46/0|260|2/ 4| 10G  |NONE| NO |DIS|DWN|               0|               0|
+39/1|46/1|261|2/ 5| 10G  |NONE| NO |DIS|DWN|               0|               0|
+39/2|46/2|262|2/ 6| 10G  |NONE| NO |DIS|DWN|               0|               0|
+39/3|46/3|263|2/ 7| 10G  |NONE| NO |DIS|DWN|               0|               0|
+PORT|MAC |D_P|P/PT|SPEED |FEC |QSFP|ADM|OPR|FRAMES RX       |FRAMES TX       |E
+----+----+---+----+------+----+----+---+---+----------------+----------------+-
+40/0|47/0|256|2/ 0| 10G  |NONE| NO |DIS|DWN|               0|               0|
+40/1|47/1|257|2/ 1| 10G  |NONE| NO |DIS|DWN|               0|               0|
+40/2|47/2|258|2/ 2| 10G  |NONE| NO |DIS|DWN|               0|               0|
+40/3|47/3|259|2/ 3| 10G  |NONE| NO |DIS|DWN|               0|               0|
+41/0|32/0|316|2/60| 10G  |NONE| NO |DIS|DWN|               0|               0|
+41/1|32/1|317|2/61| 10G  |NONE| NO |DIS|DWN|               0|               0|
+41/2|32/2|318|2/62| 10G  |NONE| NO |DIS|DWN|               0|               0|
+41/3|32/3|319|2/63| 10G  |NONE| NO |DIS|DWN|               0|               0|
+42/0|33/0|312|2/56| 10G  |NONE| NO |DIS|DWN|               0|               0|
+42/1|33/1|313|2/57| 10G  |NONE| NO |DIS|DWN|               0|               0|
+42/2|33/2|314|2/58| 10G  |NONE| NO |DIS|DWN|               0|               0|
+42/3|33/3|315|2/59| 10G  |NONE| NO |DIS|DWN|               0|               0|
+43/0|34/0|308|2/52| 10G  |NONE| NO |DIS|DWN|               0|               0|
+43/1|34/1|309|2/53| 10G  |NONE| NO |DIS|DWN|               0|               0|
+43/2|34/2|310|2/54| 10G  |NONE| NO |DIS|DWN|               0|               0|
+43/3|34/3|311|2/55| 10G  |NONE| NO |DIS|DWN|               0|               0|
+44/0|35/0|304|2/48| 10G  |NONE| NO |DIS|DWN|               0|               0|
+44/1|35/1|305|2/49| 10G  |NONE| NO |DIS|DWN|               0|               0|
+44/2|35/2|306|2/50| 10G  |NONE| NO |DIS|DWN|               0|               0|
+44/3|35/3|307|2/51| 10G  |NONE| NO |DIS|DWN|               0|               0|
+45/0|36/0|300|2/44| 10G  |NONE| NO |DIS|DWN|               0|               0|
+45/1|36/1|301|2/45| 10G  |NONE| NO |DIS|DWN|               0|               0|
+45/2|36/2|302|2/46| 10G  |NONE| NO |DIS|DWN|               0|               0|
+45/3|36/3|303|2/47| 10G  |NONE| NO |DIS|DWN|               0|               0|
+46/0|37/0|296|2/40| 10G  |NONE| NO |DIS|DWN|               0|               0|
+46/1|37/1|297|2/41| 10G  |NONE| NO |DIS|DWN|               0|               0|
+46/2|37/2|298|2/42| 10G  |NONE| NO |DIS|DWN|               0|               0|
+46/3|37/3|299|2/43| 10G  |NONE| NO |DIS|DWN|               0|               0|
+47/0|38/0|292|2/36| 10G  |NONE| NO |DIS|DWN|               0|               0|
+47/1|38/1|293|2/37| 10G  |NONE| NO |DIS|DWN|               0|               0|
+47/2|38/2|294|2/38| 10G  |NONE| NO |DIS|DWN|               0|               0|
+47/3|38/3|295|2/39| 10G  |NONE| NO |DIS|DWN|               0|               0|
+48/0|39/0|288|2/32| 10G  |NONE| NO |DIS|DWN|               0|               0|
+48/1|39/1|289|2/33| 10G  |NONE| NO |DIS|DWN|               0|               0|
+48/2|39/2|290|2/34| 10G  |NONE| NO |DIS|DWN|               0|               0|
+48/3|39/3|291|2/35| 10G  |NONE| NO |DIS|DWN|               0|               0|
+49/0|56/0|416|3/32| 10G  |NONE| NO |DIS|DWN|               0|               0|
+49/1|56/1|417|3/33| 10G  |NONE| NO |DIS|DWN|               0|               0|
+49/2|56/2|418|3/34| 10G  |NONE| NO |DIS|DWN|               0|               0|
+49/3|56/3|419|3/35| 10G  |NONE| NO |DIS|DWN|               0|               0|
+50/0|57/0|420|3/36| 10G  |NONE| NO |DIS|DWN|               0|               0|
+50/1|57/1|421|3/37| 10G  |NONE| NO |DIS|DWN|               0|               0|
+50/2|57/2|422|3/38| 10G  |NONE| NO |DIS|DWN|               0|               0|
+50/3|57/3|423|3/39| 10G  |NONE| NO |DIS|DWN|               0|               0|
+51/0|58/0|424|3/40| 10G  |NONE| NO |DIS|DWN|               0|               0|
+51/1|58/1|425|3/41| 10G  |NONE| NO |DIS|DWN|               0|               0|
+51/2|58/2|426|3/42| 10G  |NONE| NO |DIS|DWN|               0|               0|
+51/3|58/3|427|3/43| 10G  |NONE| NO |DIS|DWN|               0|               0|
+52/0|59/0|428|3/44| 10G  |NONE| NO |DIS|DWN|               0|               0|
+52/1|59/1|429|3/45| 10G  |NONE| NO |DIS|DWN|               0|               0|
+52/2|59/2|430|3/46| 10G  |NONE| NO |DIS|DWN|               0|               0|
+52/3|59/3|431|3/47| 10G  |NONE| NO |DIS|DWN|               0|               0|
+PORT|MAC |D_P|P/PT|SPEED |FEC |QSFP|ADM|OPR|FRAMES RX       |FRAMES TX       |E
+----+----+---+----+------+----+----+---+---+----------------+----------------+-
+53/0|60/0|432|3/48| 10G  |NONE| NO |DIS|DWN|               0|               0|
+53/1|60/1|433|3/49| 10G  |NONE| NO |DIS|DWN|               0|               0|
+53/2|60/2|434|3/50| 10G  |NONE| NO |DIS|DWN|               0|               0|
+53/3|60/3|435|3/51| 10G  |NONE| NO |DIS|DWN|               0|               0|
+54/0|61/0|436|3/52| 10G  |NONE| NO |DIS|DWN|               0|               0|
+54/1|61/1|437|3/53| 10G  |NONE| NO |DIS|DWN|               0|               0|
+54/2|61/2|438|3/54| 10G  |NONE| NO |DIS|DWN|               0|               0|
+54/3|61/3|439|3/55| 10G  |NONE| NO |DIS|DWN|               0|               0|
+55/0|62/0|440|3/56| 10G  |NONE| NO |DIS|DWN|               0|               0|
+55/1|62/1|441|3/57| 10G  |NONE| NO |DIS|DWN|               0|               0|
+55/2|62/2|442|3/58| 10G  |NONE| NO |DIS|DWN|               0|               0|
+55/3|62/3|443|3/59| 10G  |NONE| NO |DIS|DWN|               0|               0|
+56/0|63/0|444|3/60| 10G  |NONE| NO |DIS|DWN|               0|               0|
+56/1|63/1|445|3/61| 10G  |NONE| NO |DIS|DWN|               0|               0|
+56/2|63/2|446|3/62| 10G  |NONE| NO |DIS|DWN|               0|               0|
+56/3|63/3|447|3/63| 10G  |NONE| NO |DIS|DWN|               0|               0|
+57/0|48/0|384|3/ 0| 10G  |NONE| NO |DIS|DWN|               0|               0|
+57/1|48/1|385|3/ 1| 10G  |NONE| NO |DIS|DWN|               0|               0|
+57/2|48/2|386|3/ 2| 10G  |NONE| NO |DIS|DWN|               0|               0|
+57/3|48/3|387|3/ 3| 10G  |NONE| NO |DIS|DWN|               0|               0|
+58/0|49/0|388|3/ 4| 10G  |NONE| NO |DIS|DWN|               0|               0|
+58/1|49/1|389|3/ 5| 10G  |NONE| NO |DIS|DWN|               0|               0|
+58/2|49/2|390|3/ 6| 10G  |NONE| NO |DIS|DWN|               0|               0|
+58/3|49/3|391|3/ 7| 10G  |NONE| NO |DIS|DWN|               0|               0|
+59/0|50/0|392|3/ 8| 10G  |NONE| NO |DIS|DWN|               0|               0|
+59/1|50/1|393|3/ 9| 10G  |NONE| NO |DIS|DWN|               0|               0|
+59/2|50/2|394|3/10| 10G  |NONE| NO |DIS|DWN|               0|               0|
+59/3|50/3|395|3/11| 10G  |NONE| NO |DIS|DWN|               0|               0|
+60/0|51/0|396|3/12| 10G  |NONE| NO |DIS|DWN|               0|               0|
+60/1|51/1|397|3/13| 10G  |NONE| NO |DIS|DWN|               0|               0|
+60/2|51/2|398|3/14| 10G  |NONE| NO |DIS|DWN|               0|               0|
+60/3|51/3|399|3/15| 10G  |NONE| NO |DIS|DWN|               0|               0|
+61/0|52/0|400|3/16| 10G  |NONE| NO |DIS|DWN|               0|               0|
+61/1|52/1|401|3/17| 10G  |NONE| NO |DIS|DWN|               0|               0|
+61/2|52/2|402|3/18| 10G  |NONE| NO |DIS|DWN|               0|               0|
+61/3|52/3|403|3/19| 10G  |NONE| NO |DIS|DWN|               0|               0|
+62/0|53/0|404|3/20| 10G  |NONE| NO |DIS|DWN|               0|               0|
+62/1|53/1|405|3/21| 10G  |NONE| NO |DIS|DWN|               0|               0|
+62/2|53/2|406|3/22| 10G  |NONE| NO |DIS|DWN|               0|               0|
+62/3|53/3|407|3/23| 10G  |NONE| NO |DIS|DWN|               0|               0|
+63/0|54/0|408|3/24| 10G  |NONE| NO |DIS|DWN|               0|               0|
+63/1|54/1|409|3/25| 10G  |NONE| NO |DIS|DWN|               0|               0|
+63/2|54/2|410|3/26| 10G  |NONE| NO |DIS|DWN|               0|               0|
+63/3|54/3|411|3/27| 10G  |NONE| NO |DIS|DWN|               0|               0|
+64/0|55/0|412|3/28| 10G  |NONE| NO |DIS|DWN|               0|               0|
+64/1|55/1|413|3/29| 10G  |NONE| NO |DIS|DWN|               0|               0|
+64/2|55/2|414|3/30| 10G  |NONE| NO |DIS|DWN|               0|               0|
+64/3|55/3|415|3/31| 10G  |NONE| NO |DIS|DWN|               0|               0|
+65/0|64/0| 64|0/64| 10G  |NONE| NO |DIS|DWN|               0|               0|
+65/1|64/1| 65|0/65| 10G  |NONE| NO |DIS|DWN|               0|               0|
+65/2|64/2| 66|0/66| 10G  |NONE| NO |DIS|DWN|               0|               0|
+65/3|64/3| 67|0/67| 10G  |NONE| NO |DIS|DWN|               0|               0|
diff --git a/tools/test/tofino-port-auto-setup-tool/ports.json b/tools/test/tofino-port-auto-setup-tool/ports.json
new file mode 100644
index 0000000..55dfa52
--- /dev/null
+++ b/tools/test/tofino-port-auto-setup-tool/ports.json
@@ -0,0 +1,110 @@
+{
+  "misc": [
+    "Use json[MODEL_NAME][PORT_NUMBER][CHANNEL_NUMBER] directly.",
+    "json[MODEL_NAME][0] will be empty because there is no port 0."
+  ],
+  "BF_PLTFM_BD_ID_MONTARA_P0B": [
+    [],
+    [128, 129, 130, 131],
+    [136, 137, 138, 139],
+    [144, 145, 146, 147],
+    [152, 153, 154, 155],
+    [160, 161, 162, 163],
+    [168, 169, 170, 171],
+    [176, 177, 178, 179],
+    [184, 185, 186, 187],
+    [60, 61, 62, 63],
+    [52, 53, 54, 55],
+    [44, 45, 46, 47],
+    [36, 37, 38, 39],
+    [28, 29, 30, 31],
+    [20, 21, 22, 23],
+    [12, 13, 14, 15],
+    [4, 5, 6, 7],
+    [0, 1, 2, 3],
+    [8, 9, 10, 11],
+    [16, 17, 18, 19],
+    [24, 25, 26, 27],
+    [32, 33, 34, 35],
+    [40, 41, 42, 43],
+    [48, 49, 50, 51],
+    [56, 57, 58, 59],
+    [188, 189, 190, 191],
+    [180, 181, 182, 183],
+    [172, 173, 174, 175],
+    [164, 165, 166, 167],
+    [148, 149, 150, 151],
+    [156, 157, 158, 159],
+    [132, 133, 134, 135],
+    [140, 141, 142, 143],
+    [64, 65, 66, 67]
+  ],
+  "BF_PLTFM_BD_ID_MAVERICKS_P0B": [
+    [],
+    [188, 189, 190, 191],
+    [184, 185, 186, 187],
+    [180, 181, 182, 183],
+    [176, 177, 178, 179],
+    [172, 173, 174, 175],
+    [168, 169, 170, 171],
+    [164, 165, 166, 167],
+    [160, 161, 162, 163],
+    [156, 157, 158, 159],
+    [152, 153, 154, 155],
+    [148, 149, 150, 151],
+    [144, 145, 146, 147],
+    [140, 141, 142, 143],
+    [136, 137, 138, 139],
+    [132, 133, 134, 135],
+    [128, 129, 130, 131],
+    [0, 1, 2, 3],
+    [4, 5, 6, 7],
+    [8, 9, 10, 11],
+    [12, 13, 14, 15],
+    [16, 17, 18, 19],
+    [20, 21, 22, 23],
+    [24, 25, 26, 27],
+    [28, 29, 30, 31],
+    [32, 33, 34, 35],
+    [36, 37, 38, 39],
+    [40, 41, 42, 43],
+    [44, 45, 46, 47],
+    [48, 49, 50, 51],
+    [52, 53, 54, 55],
+    [56, 57, 58, 59],
+    [60, 61, 62, 63],
+    [284, 285, 286, 287],
+    [280, 281, 282, 283],
+    [276, 277, 278, 279],
+    [272, 273, 274, 275],
+    [268, 269, 270, 271],
+    [264, 265, 266, 267],
+    [260, 261, 262, 263],
+    [256, 257, 258, 259],
+    [316, 317, 318, 319],
+    [312, 313, 314, 315],
+    [308, 309, 310, 311],
+    [304, 305, 306, 307],
+    [300, 301, 302, 303],
+    [296, 297, 298, 299],
+    [292, 293, 294, 295],
+    [288, 289, 290, 291],
+    [416, 417, 418, 419],
+    [420, 421, 422, 423],
+    [424, 425, 426, 427],
+    [428, 429, 430, 431],
+    [432, 433, 434, 435],
+    [436, 437, 438, 439],
+    [440, 441, 442, 443],
+    [444, 445, 446, 447],
+    [384, 385, 386, 387],
+    [388, 389, 390, 391],
+    [392, 393, 394, 395],
+    [396, 397, 398, 399],
+    [400, 401, 402, 403],
+    [404, 405, 406, 407],
+    [408, 409, 410, 411],
+    [412, 413, 414, 415],
+    [64, 65, 66, 67]
+  ]
+}
diff --git a/tools/test/tofino-port-auto-setup-tool/push-all-port-configs.sh b/tools/test/tofino-port-auto-setup-tool/push-all-port-configs.sh
new file mode 100755
index 0000000..782b885
--- /dev/null
+++ b/tools/test/tofino-port-auto-setup-tool/push-all-port-configs.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+./pm.py 10.254.1.37 37-port-config.txt &
+./pm.py 10.254.1.38 38-port-config.txt &
+./pm.py 10.254.1.39 39-port-config.txt &
+./pm.py 10.254.1.40 40-port-config.txt &
diff --git a/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/__init__.py b/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/__init__.py
diff --git a/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/pltfm_pm_rpc/__init__.py b/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/pltfm_pm_rpc/__init__.py
new file mode 100644
index 0000000..a72f5ea
--- /dev/null
+++ b/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/pltfm_pm_rpc/__init__.py
@@ -0,0 +1 @@
+__all__ = ['ttypes', 'constants', 'pltfm_pm_rpc']
diff --git a/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/pltfm_pm_rpc/constants.py b/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/pltfm_pm_rpc/constants.py
new file mode 100644
index 0000000..eb0d35a
--- /dev/null
+++ b/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/pltfm_pm_rpc/constants.py
@@ -0,0 +1,12 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+from .ttypes import *
diff --git a/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/pltfm_pm_rpc/pltfm_pm_rpc-remote b/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/pltfm_pm_rpc/pltfm_pm_rpc-remote
new file mode 100755
index 0000000..15bf28a
--- /dev/null
+++ b/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/pltfm_pm_rpc/pltfm_pm_rpc-remote
@@ -0,0 +1,180 @@
+#!/usr/bin/env python
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+import sys
+import pprint
+if sys.version_info[0] > 2:
+    from urllib.parse import urlparse
+else:
+    from urlparse import urlparse
+from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient
+from thrift.protocol.TBinaryProtocol import TBinaryProtocol
+
+from pltfm_pm_rpc import pltfm_pm_rpc
+from pltfm_pm_rpc.ttypes import *
+
+if len(sys.argv) <= 1 or sys.argv[1] == '--help':
+    print('')
+    print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]')
+    print('')
+    print('Functions:')
+    print('  pltfm_pm_status_t pltfm_pm_port_add(pltfm_pm_device_t device, pltfm_pm_dev_port_t dev_port, pltfm_pm_port_speed_t ps, pltfm_pm_fec_type_t fec)')
+    print('  pltfm_pm_status_t pltfm_pm_port_del(pltfm_pm_device_t device, pltfm_pm_dev_port_t dev_port)')
+    print('  pltfm_pm_status_t pltfm_pm_port_enable(pltfm_pm_device_t device, pltfm_pm_dev_port_t dev_port)')
+    print('  pltfm_pm_status_t pltfm_pm_port_dis(pltfm_pm_device_t device, pltfm_pm_dev_port_t dev_port)')
+    print('  pltfm_pm_status_t pltfm_pm_switchd_port_cleanup(pltfm_pm_device_t device)')
+    print('  pltfm_pm_oper_status_t pltfm_pm_port_oper_status_get(pltfm_pm_device_t device, pltfm_pm_dev_port_t dev_port)')
+    print('  pltfm_pm_board_type_t pltfm_pm_board_type_get()')
+    print('  pltfm_pm_status_t pltfm_pm_port_an_set(pltfm_pm_device_t device, pltfm_pm_dev_port_t dev_port, i32 an_flag)')
+    print('  pltfm_pm_status_t pltfm_pm_serdes_lane_map_set(pltfm_pm_device_t device)')
+    print('  pltfm_pm_status_t pltfm_pm_serdes_init(pltfm_pm_device_t device)')
+    print('')
+    sys.exit(0)
+
+pp = pprint.PrettyPrinter(indent=2)
+host = 'localhost'
+port = 9090
+uri = ''
+framed = False
+ssl = False
+validate = True
+ca_certs = None
+keyfile = None
+certfile = None
+http = False
+argi = 1
+
+if sys.argv[argi] == '-h':
+    parts = sys.argv[argi + 1].split(':')
+    host = parts[0]
+    if len(parts) > 1:
+        port = int(parts[1])
+    argi += 2
+
+if sys.argv[argi] == '-u':
+    url = urlparse(sys.argv[argi + 1])
+    parts = url[1].split(':')
+    host = parts[0]
+    if len(parts) > 1:
+        port = int(parts[1])
+    else:
+        port = 80
+    uri = url[2]
+    if url[4]:
+        uri += '?%s' % url[4]
+    http = True
+    argi += 2
+
+if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':
+    framed = True
+    argi += 1
+
+if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl':
+    ssl = True
+    argi += 1
+
+if sys.argv[argi] == '-novalidate':
+    validate = False
+    argi += 1
+
+if sys.argv[argi] == '-ca_certs':
+    ca_certs = sys.argv[argi+1]
+    argi += 2
+
+if sys.argv[argi] == '-keyfile':
+    keyfile = sys.argv[argi+1]
+    argi += 2
+
+if sys.argv[argi] == '-certfile':
+    certfile = sys.argv[argi+1]
+    argi += 2
+
+cmd = sys.argv[argi]
+args = sys.argv[argi + 1:]
+
+if http:
+    transport = THttpClient.THttpClient(host, port, uri)
+else:
+    if ssl:
+        socket = TSSLSocket.TSSLSocket(host, port, validate=validate, ca_certs=ca_certs, keyfile=keyfile, certfile=certfile)
+    else:
+        socket = TSocket.TSocket(host, port)
+    if framed:
+        transport = TTransport.TFramedTransport(socket)
+    else:
+        transport = TTransport.TBufferedTransport(socket)
+protocol = TBinaryProtocol(transport)
+client = pltfm_pm_rpc.Client(protocol)
+transport.open()
+
+if cmd == 'pltfm_pm_port_add':
+    if len(args) != 4:
+        print('pltfm_pm_port_add requires 4 args')
+        sys.exit(1)
+    pp.pprint(client.pltfm_pm_port_add(eval(args[0]), eval(args[1]), eval(args[2]), eval(args[3]),))
+
+elif cmd == 'pltfm_pm_port_del':
+    if len(args) != 2:
+        print('pltfm_pm_port_del requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.pltfm_pm_port_del(eval(args[0]), eval(args[1]),))
+
+elif cmd == 'pltfm_pm_port_enable':
+    if len(args) != 2:
+        print('pltfm_pm_port_enable requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.pltfm_pm_port_enable(eval(args[0]), eval(args[1]),))
+
+elif cmd == 'pltfm_pm_port_dis':
+    if len(args) != 2:
+        print('pltfm_pm_port_dis requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.pltfm_pm_port_dis(eval(args[0]), eval(args[1]),))
+
+elif cmd == 'pltfm_pm_switchd_port_cleanup':
+    if len(args) != 1:
+        print('pltfm_pm_switchd_port_cleanup requires 1 args')
+        sys.exit(1)
+    pp.pprint(client.pltfm_pm_switchd_port_cleanup(eval(args[0]),))
+
+elif cmd == 'pltfm_pm_port_oper_status_get':
+    if len(args) != 2:
+        print('pltfm_pm_port_oper_status_get requires 2 args')
+        sys.exit(1)
+    pp.pprint(client.pltfm_pm_port_oper_status_get(eval(args[0]), eval(args[1]),))
+
+elif cmd == 'pltfm_pm_board_type_get':
+    if len(args) != 0:
+        print('pltfm_pm_board_type_get requires 0 args')
+        sys.exit(1)
+    pp.pprint(client.pltfm_pm_board_type_get())
+
+elif cmd == 'pltfm_pm_port_an_set':
+    if len(args) != 3:
+        print('pltfm_pm_port_an_set requires 3 args')
+        sys.exit(1)
+    pp.pprint(client.pltfm_pm_port_an_set(eval(args[0]), eval(args[1]), eval(args[2]),))
+
+elif cmd == 'pltfm_pm_serdes_lane_map_set':
+    if len(args) != 1:
+        print('pltfm_pm_serdes_lane_map_set requires 1 args')
+        sys.exit(1)
+    pp.pprint(client.pltfm_pm_serdes_lane_map_set(eval(args[0]),))
+
+elif cmd == 'pltfm_pm_serdes_init':
+    if len(args) != 1:
+        print('pltfm_pm_serdes_init requires 1 args')
+        sys.exit(1)
+    pp.pprint(client.pltfm_pm_serdes_init(eval(args[0]),))
+
+else:
+    print('Unrecognized method %s' % cmd)
+    sys.exit(1)
+
+transport.close()
diff --git a/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/pltfm_pm_rpc/pltfm_pm_rpc.py b/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/pltfm_pm_rpc/pltfm_pm_rpc.py
new file mode 100644
index 0000000..0d9432b
--- /dev/null
+++ b/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/pltfm_pm_rpc/pltfm_pm_rpc.py
@@ -0,0 +1,2106 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+import logging
+from .ttypes import *
+from thrift.Thrift import TProcessor
+from thrift.transport import TTransport
+
+
+class Iface(object):
+    def pltfm_pm_port_add(self, device, dev_port, ps, fec):
+        """
+        Parameters:
+         - device
+         - dev_port
+         - ps
+         - fec
+        """
+        pass
+
+    def pltfm_pm_port_del(self, device, dev_port):
+        """
+        Parameters:
+         - device
+         - dev_port
+        """
+        pass
+
+    def pltfm_pm_port_enable(self, device, dev_port):
+        """
+        Parameters:
+         - device
+         - dev_port
+        """
+        pass
+
+    def pltfm_pm_port_dis(self, device, dev_port):
+        """
+        Parameters:
+         - device
+         - dev_port
+        """
+        pass
+
+    def pltfm_pm_switchd_port_cleanup(self, device):
+        """
+        Parameters:
+         - device
+        """
+        pass
+
+    def pltfm_pm_port_oper_status_get(self, device, dev_port):
+        """
+        Parameters:
+         - device
+         - dev_port
+        """
+        pass
+
+    def pltfm_pm_board_type_get(self):
+        pass
+
+    def pltfm_pm_port_an_set(self, device, dev_port, an_flag):
+        """
+        Parameters:
+         - device
+         - dev_port
+         - an_flag
+        """
+        pass
+
+    def pltfm_pm_serdes_lane_map_set(self, device):
+        """
+        Parameters:
+         - device
+        """
+        pass
+
+    def pltfm_pm_serdes_init(self, device):
+        """
+        Parameters:
+         - device
+        """
+        pass
+
+
+class Client(Iface):
+    def __init__(self, iprot, oprot=None):
+        self._iprot = self._oprot = iprot
+        if oprot is not None:
+            self._oprot = oprot
+        self._seqid = 0
+
+    def pltfm_pm_port_add(self, device, dev_port, ps, fec):
+        """
+        Parameters:
+         - device
+         - dev_port
+         - ps
+         - fec
+        """
+        self.send_pltfm_pm_port_add(device, dev_port, ps, fec)
+        return self.recv_pltfm_pm_port_add()
+
+    def send_pltfm_pm_port_add(self, device, dev_port, ps, fec):
+        self._oprot.writeMessageBegin('pltfm_pm_port_add', TMessageType.CALL, self._seqid)
+        args = pltfm_pm_port_add_args()
+        args.device = device
+        args.dev_port = dev_port
+        args.ps = ps
+        args.fec = fec
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_pltfm_pm_port_add(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = pltfm_pm_port_add_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.ouch is not None:
+            raise result.ouch
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_pm_port_add failed: unknown result")
+
+    def pltfm_pm_port_del(self, device, dev_port):
+        """
+        Parameters:
+         - device
+         - dev_port
+        """
+        self.send_pltfm_pm_port_del(device, dev_port)
+        return self.recv_pltfm_pm_port_del()
+
+    def send_pltfm_pm_port_del(self, device, dev_port):
+        self._oprot.writeMessageBegin('pltfm_pm_port_del', TMessageType.CALL, self._seqid)
+        args = pltfm_pm_port_del_args()
+        args.device = device
+        args.dev_port = dev_port
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_pltfm_pm_port_del(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = pltfm_pm_port_del_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.ouch is not None:
+            raise result.ouch
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_pm_port_del failed: unknown result")
+
+    def pltfm_pm_port_enable(self, device, dev_port):
+        """
+        Parameters:
+         - device
+         - dev_port
+        """
+        self.send_pltfm_pm_port_enable(device, dev_port)
+        return self.recv_pltfm_pm_port_enable()
+
+    def send_pltfm_pm_port_enable(self, device, dev_port):
+        self._oprot.writeMessageBegin('pltfm_pm_port_enable', TMessageType.CALL, self._seqid)
+        args = pltfm_pm_port_enable_args()
+        args.device = device
+        args.dev_port = dev_port
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_pltfm_pm_port_enable(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = pltfm_pm_port_enable_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.ouch is not None:
+            raise result.ouch
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_pm_port_enable failed: unknown result")
+
+    def pltfm_pm_port_dis(self, device, dev_port):
+        """
+        Parameters:
+         - device
+         - dev_port
+        """
+        self.send_pltfm_pm_port_dis(device, dev_port)
+        return self.recv_pltfm_pm_port_dis()
+
+    def send_pltfm_pm_port_dis(self, device, dev_port):
+        self._oprot.writeMessageBegin('pltfm_pm_port_dis', TMessageType.CALL, self._seqid)
+        args = pltfm_pm_port_dis_args()
+        args.device = device
+        args.dev_port = dev_port
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_pltfm_pm_port_dis(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = pltfm_pm_port_dis_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.ouch is not None:
+            raise result.ouch
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_pm_port_dis failed: unknown result")
+
+    def pltfm_pm_switchd_port_cleanup(self, device):
+        """
+        Parameters:
+         - device
+        """
+        self.send_pltfm_pm_switchd_port_cleanup(device)
+        return self.recv_pltfm_pm_switchd_port_cleanup()
+
+    def send_pltfm_pm_switchd_port_cleanup(self, device):
+        self._oprot.writeMessageBegin('pltfm_pm_switchd_port_cleanup', TMessageType.CALL, self._seqid)
+        args = pltfm_pm_switchd_port_cleanup_args()
+        args.device = device
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_pltfm_pm_switchd_port_cleanup(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = pltfm_pm_switchd_port_cleanup_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.ouch is not None:
+            raise result.ouch
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_pm_switchd_port_cleanup failed: unknown result")
+
+    def pltfm_pm_port_oper_status_get(self, device, dev_port):
+        """
+        Parameters:
+         - device
+         - dev_port
+        """
+        self.send_pltfm_pm_port_oper_status_get(device, dev_port)
+        return self.recv_pltfm_pm_port_oper_status_get()
+
+    def send_pltfm_pm_port_oper_status_get(self, device, dev_port):
+        self._oprot.writeMessageBegin('pltfm_pm_port_oper_status_get', TMessageType.CALL, self._seqid)
+        args = pltfm_pm_port_oper_status_get_args()
+        args.device = device
+        args.dev_port = dev_port
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_pltfm_pm_port_oper_status_get(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = pltfm_pm_port_oper_status_get_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.ouch is not None:
+            raise result.ouch
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_pm_port_oper_status_get failed: unknown result")
+
+    def pltfm_pm_board_type_get(self):
+        self.send_pltfm_pm_board_type_get()
+        return self.recv_pltfm_pm_board_type_get()
+
+    def send_pltfm_pm_board_type_get(self):
+        self._oprot.writeMessageBegin('pltfm_pm_board_type_get', TMessageType.CALL, self._seqid)
+        args = pltfm_pm_board_type_get_args()
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_pltfm_pm_board_type_get(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = pltfm_pm_board_type_get_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.ouch is not None:
+            raise result.ouch
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_pm_board_type_get failed: unknown result")
+
+    def pltfm_pm_port_an_set(self, device, dev_port, an_flag):
+        """
+        Parameters:
+         - device
+         - dev_port
+         - an_flag
+        """
+        self.send_pltfm_pm_port_an_set(device, dev_port, an_flag)
+        return self.recv_pltfm_pm_port_an_set()
+
+    def send_pltfm_pm_port_an_set(self, device, dev_port, an_flag):
+        self._oprot.writeMessageBegin('pltfm_pm_port_an_set', TMessageType.CALL, self._seqid)
+        args = pltfm_pm_port_an_set_args()
+        args.device = device
+        args.dev_port = dev_port
+        args.an_flag = an_flag
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_pltfm_pm_port_an_set(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = pltfm_pm_port_an_set_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.ouch is not None:
+            raise result.ouch
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_pm_port_an_set failed: unknown result")
+
+    def pltfm_pm_serdes_lane_map_set(self, device):
+        """
+        Parameters:
+         - device
+        """
+        self.send_pltfm_pm_serdes_lane_map_set(device)
+        return self.recv_pltfm_pm_serdes_lane_map_set()
+
+    def send_pltfm_pm_serdes_lane_map_set(self, device):
+        self._oprot.writeMessageBegin('pltfm_pm_serdes_lane_map_set', TMessageType.CALL, self._seqid)
+        args = pltfm_pm_serdes_lane_map_set_args()
+        args.device = device
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_pltfm_pm_serdes_lane_map_set(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = pltfm_pm_serdes_lane_map_set_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.ouch is not None:
+            raise result.ouch
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_pm_serdes_lane_map_set failed: unknown result")
+
+    def pltfm_pm_serdes_init(self, device):
+        """
+        Parameters:
+         - device
+        """
+        self.send_pltfm_pm_serdes_init(device)
+        return self.recv_pltfm_pm_serdes_init()
+
+    def send_pltfm_pm_serdes_init(self, device):
+        self._oprot.writeMessageBegin('pltfm_pm_serdes_init', TMessageType.CALL, self._seqid)
+        args = pltfm_pm_serdes_init_args()
+        args.device = device
+        args.write(self._oprot)
+        self._oprot.writeMessageEnd()
+        self._oprot.trans.flush()
+
+    def recv_pltfm_pm_serdes_init(self):
+        iprot = self._iprot
+        (fname, mtype, rseqid) = iprot.readMessageBegin()
+        if mtype == TMessageType.EXCEPTION:
+            x = TApplicationException()
+            x.read(iprot)
+            iprot.readMessageEnd()
+            raise x
+        result = pltfm_pm_serdes_init_result()
+        result.read(iprot)
+        iprot.readMessageEnd()
+        if result.success is not None:
+            return result.success
+        if result.ouch is not None:
+            raise result.ouch
+        raise TApplicationException(TApplicationException.MISSING_RESULT, "pltfm_pm_serdes_init failed: unknown result")
+
+
+class Processor(Iface, TProcessor):
+    def __init__(self, handler):
+        self._handler = handler
+        self._processMap = {}
+        self._processMap["pltfm_pm_port_add"] = Processor.process_pltfm_pm_port_add
+        self._processMap["pltfm_pm_port_del"] = Processor.process_pltfm_pm_port_del
+        self._processMap["pltfm_pm_port_enable"] = Processor.process_pltfm_pm_port_enable
+        self._processMap["pltfm_pm_port_dis"] = Processor.process_pltfm_pm_port_dis
+        self._processMap["pltfm_pm_switchd_port_cleanup"] = Processor.process_pltfm_pm_switchd_port_cleanup
+        self._processMap["pltfm_pm_port_oper_status_get"] = Processor.process_pltfm_pm_port_oper_status_get
+        self._processMap["pltfm_pm_board_type_get"] = Processor.process_pltfm_pm_board_type_get
+        self._processMap["pltfm_pm_port_an_set"] = Processor.process_pltfm_pm_port_an_set
+        self._processMap["pltfm_pm_serdes_lane_map_set"] = Processor.process_pltfm_pm_serdes_lane_map_set
+        self._processMap["pltfm_pm_serdes_init"] = Processor.process_pltfm_pm_serdes_init
+
+    def process(self, iprot, oprot):
+        (name, type, seqid) = iprot.readMessageBegin()
+        if name not in self._processMap:
+            iprot.skip(TType.STRUCT)
+            iprot.readMessageEnd()
+            x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name))
+            oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)
+            x.write(oprot)
+            oprot.writeMessageEnd()
+            oprot.trans.flush()
+            return
+        else:
+            self._processMap[name](self, seqid, iprot, oprot)
+        return True
+
+    def process_pltfm_pm_port_add(self, seqid, iprot, oprot):
+        args = pltfm_pm_port_add_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = pltfm_pm_port_add_result()
+        try:
+            result.success = self._handler.pltfm_pm_port_add(args.device, args.dev_port, args.ps, args.fec)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except InvalidPltfmPmOperation as ouch:
+            msg_type = TMessageType.REPLY
+            result.ouch = ouch
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("pltfm_pm_port_add", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_pltfm_pm_port_del(self, seqid, iprot, oprot):
+        args = pltfm_pm_port_del_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = pltfm_pm_port_del_result()
+        try:
+            result.success = self._handler.pltfm_pm_port_del(args.device, args.dev_port)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except InvalidPltfmPmOperation as ouch:
+            msg_type = TMessageType.REPLY
+            result.ouch = ouch
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("pltfm_pm_port_del", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_pltfm_pm_port_enable(self, seqid, iprot, oprot):
+        args = pltfm_pm_port_enable_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = pltfm_pm_port_enable_result()
+        try:
+            result.success = self._handler.pltfm_pm_port_enable(args.device, args.dev_port)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except InvalidPltfmPmOperation as ouch:
+            msg_type = TMessageType.REPLY
+            result.ouch = ouch
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("pltfm_pm_port_enable", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_pltfm_pm_port_dis(self, seqid, iprot, oprot):
+        args = pltfm_pm_port_dis_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = pltfm_pm_port_dis_result()
+        try:
+            result.success = self._handler.pltfm_pm_port_dis(args.device, args.dev_port)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except InvalidPltfmPmOperation as ouch:
+            msg_type = TMessageType.REPLY
+            result.ouch = ouch
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("pltfm_pm_port_dis", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_pltfm_pm_switchd_port_cleanup(self, seqid, iprot, oprot):
+        args = pltfm_pm_switchd_port_cleanup_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = pltfm_pm_switchd_port_cleanup_result()
+        try:
+            result.success = self._handler.pltfm_pm_switchd_port_cleanup(args.device)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except InvalidPltfmPmOperation as ouch:
+            msg_type = TMessageType.REPLY
+            result.ouch = ouch
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("pltfm_pm_switchd_port_cleanup", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_pltfm_pm_port_oper_status_get(self, seqid, iprot, oprot):
+        args = pltfm_pm_port_oper_status_get_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = pltfm_pm_port_oper_status_get_result()
+        try:
+            result.success = self._handler.pltfm_pm_port_oper_status_get(args.device, args.dev_port)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except InvalidPltfmPmOperation as ouch:
+            msg_type = TMessageType.REPLY
+            result.ouch = ouch
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("pltfm_pm_port_oper_status_get", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_pltfm_pm_board_type_get(self, seqid, iprot, oprot):
+        args = pltfm_pm_board_type_get_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = pltfm_pm_board_type_get_result()
+        try:
+            result.success = self._handler.pltfm_pm_board_type_get()
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except InvalidPltfmPmOperation as ouch:
+            msg_type = TMessageType.REPLY
+            result.ouch = ouch
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("pltfm_pm_board_type_get", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_pltfm_pm_port_an_set(self, seqid, iprot, oprot):
+        args = pltfm_pm_port_an_set_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = pltfm_pm_port_an_set_result()
+        try:
+            result.success = self._handler.pltfm_pm_port_an_set(args.device, args.dev_port, args.an_flag)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except InvalidPltfmPmOperation as ouch:
+            msg_type = TMessageType.REPLY
+            result.ouch = ouch
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("pltfm_pm_port_an_set", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_pltfm_pm_serdes_lane_map_set(self, seqid, iprot, oprot):
+        args = pltfm_pm_serdes_lane_map_set_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = pltfm_pm_serdes_lane_map_set_result()
+        try:
+            result.success = self._handler.pltfm_pm_serdes_lane_map_set(args.device)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except InvalidPltfmPmOperation as ouch:
+            msg_type = TMessageType.REPLY
+            result.ouch = ouch
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("pltfm_pm_serdes_lane_map_set", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+    def process_pltfm_pm_serdes_init(self, seqid, iprot, oprot):
+        args = pltfm_pm_serdes_init_args()
+        args.read(iprot)
+        iprot.readMessageEnd()
+        result = pltfm_pm_serdes_init_result()
+        try:
+            result.success = self._handler.pltfm_pm_serdes_init(args.device)
+            msg_type = TMessageType.REPLY
+        except (TTransport.TTransportException, KeyboardInterrupt, SystemExit):
+            raise
+        except InvalidPltfmPmOperation as ouch:
+            msg_type = TMessageType.REPLY
+            result.ouch = ouch
+        except Exception as ex:
+            msg_type = TMessageType.EXCEPTION
+            logging.exception(ex)
+            result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
+        oprot.writeMessageBegin("pltfm_pm_serdes_init", msg_type, seqid)
+        result.write(oprot)
+        oprot.writeMessageEnd()
+        oprot.trans.flush()
+
+# HELPER FUNCTIONS AND STRUCTURES
+
+
+class pltfm_pm_port_add_args(object):
+    """
+    Attributes:
+     - device
+     - dev_port
+     - ps
+     - fec
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.BYTE, 'device', None, None, ),  # 1
+        (2, TType.I32, 'dev_port', None, None, ),  # 2
+        (3, TType.I32, 'ps', None, None, ),  # 3
+        (4, TType.I32, 'fec', None, None, ),  # 4
+    )
+
+    def __init__(self, device=None, dev_port=None, ps=None, fec=None,):
+        self.device = device
+        self.dev_port = dev_port
+        self.ps = ps
+        self.fec = fec
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.BYTE:
+                    self.device = iprot.readByte()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.I32:
+                    self.dev_port = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.I32:
+                    self.ps = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 4:
+                if ftype == TType.I32:
+                    self.fec = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_port_add_args')
+        if self.device is not None:
+            oprot.writeFieldBegin('device', TType.BYTE, 1)
+            oprot.writeByte(self.device)
+            oprot.writeFieldEnd()
+        if self.dev_port is not None:
+            oprot.writeFieldBegin('dev_port', TType.I32, 2)
+            oprot.writeI32(self.dev_port)
+            oprot.writeFieldEnd()
+        if self.ps is not None:
+            oprot.writeFieldBegin('ps', TType.I32, 3)
+            oprot.writeI32(self.ps)
+            oprot.writeFieldEnd()
+        if self.fec is not None:
+            oprot.writeFieldBegin('fec', TType.I32, 4)
+            oprot.writeI32(self.fec)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_port_add_result(object):
+    """
+    Attributes:
+     - success
+     - ouch
+    """
+
+    thrift_spec = (
+        (0, TType.I32, 'success', None, None, ),  # 0
+        (1, TType.STRUCT, 'ouch', (InvalidPltfmPmOperation, InvalidPltfmPmOperation.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, ouch=None,):
+        self.success = success
+        self.ouch = ouch
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.I32:
+                    self.success = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ouch = InvalidPltfmPmOperation()
+                    self.ouch.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_port_add_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.I32, 0)
+            oprot.writeI32(self.success)
+            oprot.writeFieldEnd()
+        if self.ouch is not None:
+            oprot.writeFieldBegin('ouch', TType.STRUCT, 1)
+            self.ouch.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_port_del_args(object):
+    """
+    Attributes:
+     - device
+     - dev_port
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.BYTE, 'device', None, None, ),  # 1
+        (2, TType.I32, 'dev_port', None, None, ),  # 2
+    )
+
+    def __init__(self, device=None, dev_port=None,):
+        self.device = device
+        self.dev_port = dev_port
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.BYTE:
+                    self.device = iprot.readByte()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.I32:
+                    self.dev_port = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_port_del_args')
+        if self.device is not None:
+            oprot.writeFieldBegin('device', TType.BYTE, 1)
+            oprot.writeByte(self.device)
+            oprot.writeFieldEnd()
+        if self.dev_port is not None:
+            oprot.writeFieldBegin('dev_port', TType.I32, 2)
+            oprot.writeI32(self.dev_port)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_port_del_result(object):
+    """
+    Attributes:
+     - success
+     - ouch
+    """
+
+    thrift_spec = (
+        (0, TType.I32, 'success', None, None, ),  # 0
+        (1, TType.STRUCT, 'ouch', (InvalidPltfmPmOperation, InvalidPltfmPmOperation.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, ouch=None,):
+        self.success = success
+        self.ouch = ouch
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.I32:
+                    self.success = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ouch = InvalidPltfmPmOperation()
+                    self.ouch.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_port_del_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.I32, 0)
+            oprot.writeI32(self.success)
+            oprot.writeFieldEnd()
+        if self.ouch is not None:
+            oprot.writeFieldBegin('ouch', TType.STRUCT, 1)
+            self.ouch.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_port_enable_args(object):
+    """
+    Attributes:
+     - device
+     - dev_port
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.BYTE, 'device', None, None, ),  # 1
+        (2, TType.I32, 'dev_port', None, None, ),  # 2
+    )
+
+    def __init__(self, device=None, dev_port=None,):
+        self.device = device
+        self.dev_port = dev_port
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.BYTE:
+                    self.device = iprot.readByte()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.I32:
+                    self.dev_port = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_port_enable_args')
+        if self.device is not None:
+            oprot.writeFieldBegin('device', TType.BYTE, 1)
+            oprot.writeByte(self.device)
+            oprot.writeFieldEnd()
+        if self.dev_port is not None:
+            oprot.writeFieldBegin('dev_port', TType.I32, 2)
+            oprot.writeI32(self.dev_port)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_port_enable_result(object):
+    """
+    Attributes:
+     - success
+     - ouch
+    """
+
+    thrift_spec = (
+        (0, TType.I32, 'success', None, None, ),  # 0
+        (1, TType.STRUCT, 'ouch', (InvalidPltfmPmOperation, InvalidPltfmPmOperation.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, ouch=None,):
+        self.success = success
+        self.ouch = ouch
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.I32:
+                    self.success = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ouch = InvalidPltfmPmOperation()
+                    self.ouch.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_port_enable_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.I32, 0)
+            oprot.writeI32(self.success)
+            oprot.writeFieldEnd()
+        if self.ouch is not None:
+            oprot.writeFieldBegin('ouch', TType.STRUCT, 1)
+            self.ouch.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_port_dis_args(object):
+    """
+    Attributes:
+     - device
+     - dev_port
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.BYTE, 'device', None, None, ),  # 1
+        (2, TType.I32, 'dev_port', None, None, ),  # 2
+    )
+
+    def __init__(self, device=None, dev_port=None,):
+        self.device = device
+        self.dev_port = dev_port
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.BYTE:
+                    self.device = iprot.readByte()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.I32:
+                    self.dev_port = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_port_dis_args')
+        if self.device is not None:
+            oprot.writeFieldBegin('device', TType.BYTE, 1)
+            oprot.writeByte(self.device)
+            oprot.writeFieldEnd()
+        if self.dev_port is not None:
+            oprot.writeFieldBegin('dev_port', TType.I32, 2)
+            oprot.writeI32(self.dev_port)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_port_dis_result(object):
+    """
+    Attributes:
+     - success
+     - ouch
+    """
+
+    thrift_spec = (
+        (0, TType.I32, 'success', None, None, ),  # 0
+        (1, TType.STRUCT, 'ouch', (InvalidPltfmPmOperation, InvalidPltfmPmOperation.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, ouch=None,):
+        self.success = success
+        self.ouch = ouch
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.I32:
+                    self.success = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ouch = InvalidPltfmPmOperation()
+                    self.ouch.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_port_dis_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.I32, 0)
+            oprot.writeI32(self.success)
+            oprot.writeFieldEnd()
+        if self.ouch is not None:
+            oprot.writeFieldBegin('ouch', TType.STRUCT, 1)
+            self.ouch.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_switchd_port_cleanup_args(object):
+    """
+    Attributes:
+     - device
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.BYTE, 'device', None, None, ),  # 1
+    )
+
+    def __init__(self, device=None,):
+        self.device = device
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.BYTE:
+                    self.device = iprot.readByte()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_switchd_port_cleanup_args')
+        if self.device is not None:
+            oprot.writeFieldBegin('device', TType.BYTE, 1)
+            oprot.writeByte(self.device)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_switchd_port_cleanup_result(object):
+    """
+    Attributes:
+     - success
+     - ouch
+    """
+
+    thrift_spec = (
+        (0, TType.I32, 'success', None, None, ),  # 0
+        (1, TType.STRUCT, 'ouch', (InvalidPltfmPmOperation, InvalidPltfmPmOperation.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, ouch=None,):
+        self.success = success
+        self.ouch = ouch
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.I32:
+                    self.success = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ouch = InvalidPltfmPmOperation()
+                    self.ouch.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_switchd_port_cleanup_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.I32, 0)
+            oprot.writeI32(self.success)
+            oprot.writeFieldEnd()
+        if self.ouch is not None:
+            oprot.writeFieldBegin('ouch', TType.STRUCT, 1)
+            self.ouch.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_port_oper_status_get_args(object):
+    """
+    Attributes:
+     - device
+     - dev_port
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.BYTE, 'device', None, None, ),  # 1
+        (2, TType.I32, 'dev_port', None, None, ),  # 2
+    )
+
+    def __init__(self, device=None, dev_port=None,):
+        self.device = device
+        self.dev_port = dev_port
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.BYTE:
+                    self.device = iprot.readByte()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.I32:
+                    self.dev_port = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_port_oper_status_get_args')
+        if self.device is not None:
+            oprot.writeFieldBegin('device', TType.BYTE, 1)
+            oprot.writeByte(self.device)
+            oprot.writeFieldEnd()
+        if self.dev_port is not None:
+            oprot.writeFieldBegin('dev_port', TType.I32, 2)
+            oprot.writeI32(self.dev_port)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_port_oper_status_get_result(object):
+    """
+    Attributes:
+     - success
+     - ouch
+    """
+
+    thrift_spec = (
+        (0, TType.I32, 'success', None, None, ),  # 0
+        (1, TType.STRUCT, 'ouch', (InvalidPltfmPmOperation, InvalidPltfmPmOperation.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, ouch=None,):
+        self.success = success
+        self.ouch = ouch
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.I32:
+                    self.success = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ouch = InvalidPltfmPmOperation()
+                    self.ouch.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_port_oper_status_get_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.I32, 0)
+            oprot.writeI32(self.success)
+            oprot.writeFieldEnd()
+        if self.ouch is not None:
+            oprot.writeFieldBegin('ouch', TType.STRUCT, 1)
+            self.ouch.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_board_type_get_args(object):
+
+    thrift_spec = (
+    )
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_board_type_get_args')
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_board_type_get_result(object):
+    """
+    Attributes:
+     - success
+     - ouch
+    """
+
+    thrift_spec = (
+        (0, TType.I32, 'success', None, None, ),  # 0
+        (1, TType.STRUCT, 'ouch', (InvalidPltfmPmOperation, InvalidPltfmPmOperation.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, ouch=None,):
+        self.success = success
+        self.ouch = ouch
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.I32:
+                    self.success = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ouch = InvalidPltfmPmOperation()
+                    self.ouch.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_board_type_get_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.I32, 0)
+            oprot.writeI32(self.success)
+            oprot.writeFieldEnd()
+        if self.ouch is not None:
+            oprot.writeFieldBegin('ouch', TType.STRUCT, 1)
+            self.ouch.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_port_an_set_args(object):
+    """
+    Attributes:
+     - device
+     - dev_port
+     - an_flag
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.BYTE, 'device', None, None, ),  # 1
+        (2, TType.I32, 'dev_port', None, None, ),  # 2
+        (3, TType.I32, 'an_flag', None, None, ),  # 3
+    )
+
+    def __init__(self, device=None, dev_port=None, an_flag=None,):
+        self.device = device
+        self.dev_port = dev_port
+        self.an_flag = an_flag
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.BYTE:
+                    self.device = iprot.readByte()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 2:
+                if ftype == TType.I32:
+                    self.dev_port = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 3:
+                if ftype == TType.I32:
+                    self.an_flag = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_port_an_set_args')
+        if self.device is not None:
+            oprot.writeFieldBegin('device', TType.BYTE, 1)
+            oprot.writeByte(self.device)
+            oprot.writeFieldEnd()
+        if self.dev_port is not None:
+            oprot.writeFieldBegin('dev_port', TType.I32, 2)
+            oprot.writeI32(self.dev_port)
+            oprot.writeFieldEnd()
+        if self.an_flag is not None:
+            oprot.writeFieldBegin('an_flag', TType.I32, 3)
+            oprot.writeI32(self.an_flag)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_port_an_set_result(object):
+    """
+    Attributes:
+     - success
+     - ouch
+    """
+
+    thrift_spec = (
+        (0, TType.I32, 'success', None, None, ),  # 0
+        (1, TType.STRUCT, 'ouch', (InvalidPltfmPmOperation, InvalidPltfmPmOperation.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, ouch=None,):
+        self.success = success
+        self.ouch = ouch
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.I32:
+                    self.success = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ouch = InvalidPltfmPmOperation()
+                    self.ouch.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_port_an_set_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.I32, 0)
+            oprot.writeI32(self.success)
+            oprot.writeFieldEnd()
+        if self.ouch is not None:
+            oprot.writeFieldBegin('ouch', TType.STRUCT, 1)
+            self.ouch.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_serdes_lane_map_set_args(object):
+    """
+    Attributes:
+     - device
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.BYTE, 'device', None, None, ),  # 1
+    )
+
+    def __init__(self, device=None,):
+        self.device = device
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.BYTE:
+                    self.device = iprot.readByte()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_serdes_lane_map_set_args')
+        if self.device is not None:
+            oprot.writeFieldBegin('device', TType.BYTE, 1)
+            oprot.writeByte(self.device)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_serdes_lane_map_set_result(object):
+    """
+    Attributes:
+     - success
+     - ouch
+    """
+
+    thrift_spec = (
+        (0, TType.I32, 'success', None, None, ),  # 0
+        (1, TType.STRUCT, 'ouch', (InvalidPltfmPmOperation, InvalidPltfmPmOperation.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, ouch=None,):
+        self.success = success
+        self.ouch = ouch
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.I32:
+                    self.success = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ouch = InvalidPltfmPmOperation()
+                    self.ouch.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_serdes_lane_map_set_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.I32, 0)
+            oprot.writeI32(self.success)
+            oprot.writeFieldEnd()
+        if self.ouch is not None:
+            oprot.writeFieldBegin('ouch', TType.STRUCT, 1)
+            self.ouch.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_serdes_init_args(object):
+    """
+    Attributes:
+     - device
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.BYTE, 'device', None, None, ),  # 1
+    )
+
+    def __init__(self, device=None,):
+        self.device = device
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.BYTE:
+                    self.device = iprot.readByte()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_serdes_init_args')
+        if self.device is not None:
+            oprot.writeFieldBegin('device', TType.BYTE, 1)
+            oprot.writeByte(self.device)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
+
+
+class pltfm_pm_serdes_init_result(object):
+    """
+    Attributes:
+     - success
+     - ouch
+    """
+
+    thrift_spec = (
+        (0, TType.I32, 'success', None, None, ),  # 0
+        (1, TType.STRUCT, 'ouch', (InvalidPltfmPmOperation, InvalidPltfmPmOperation.thrift_spec), None, ),  # 1
+    )
+
+    def __init__(self, success=None, ouch=None,):
+        self.success = success
+        self.ouch = ouch
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 0:
+                if ftype == TType.I32:
+                    self.success = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            elif fid == 1:
+                if ftype == TType.STRUCT:
+                    self.ouch = InvalidPltfmPmOperation()
+                    self.ouch.read(iprot)
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('pltfm_pm_serdes_init_result')
+        if self.success is not None:
+            oprot.writeFieldBegin('success', TType.I32, 0)
+            oprot.writeI32(self.success)
+            oprot.writeFieldEnd()
+        if self.ouch is not None:
+            oprot.writeFieldBegin('ouch', TType.STRUCT, 1)
+            self.ouch.write(oprot)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
diff --git a/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/pltfm_pm_rpc/ttypes.py b/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/pltfm_pm_rpc/ttypes.py
new file mode 100644
index 0000000..3e0404c
--- /dev/null
+++ b/tools/test/tofino-port-auto-setup-tool/thrift/gen-py/pltfm_pm_rpc/ttypes.py
@@ -0,0 +1,175 @@
+#
+# Autogenerated by Thrift Compiler (0.10.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
+from thrift.protocol.TProtocol import TProtocolException
+import sys
+
+from thrift.transport import TTransport
+
+
+class pltfm_pm_port_speed_t(object):
+    BF_SPEED_NONE = 0
+    BF_SPEED_1G = 1
+    BF_SPEED_10G = 2
+    BF_SPEED_25G = 3
+    BF_SPEED_40G = 4
+    BF_SPEED_40G_NB = 5
+    BF_SPEED_50G = 6
+    BF_SPEED_100G = 7
+    BF_SPEED_40G_NON_BREAKABLE = 8
+
+    _VALUES_TO_NAMES = {
+        0: "BF_SPEED_NONE",
+        1: "BF_SPEED_1G",
+        2: "BF_SPEED_10G",
+        3: "BF_SPEED_25G",
+        4: "BF_SPEED_40G",
+        5: "BF_SPEED_40G_NB",
+        6: "BF_SPEED_50G",
+        7: "BF_SPEED_100G",
+        8: "BF_SPEED_40G_NON_BREAKABLE",
+    }
+
+    _NAMES_TO_VALUES = {
+        "BF_SPEED_NONE": 0,
+        "BF_SPEED_1G": 1,
+        "BF_SPEED_10G": 2,
+        "BF_SPEED_25G": 3,
+        "BF_SPEED_40G": 4,
+        "BF_SPEED_40G_NB": 5,
+        "BF_SPEED_50G": 6,
+        "BF_SPEED_100G": 7,
+        "BF_SPEED_40G_NON_BREAKABLE": 8,
+    }
+
+
+class pltfm_pm_fec_type_t(object):
+    BF_FEC_TYP_NONE = 0
+    BF_FEC_TYP_FIRECODE = 1
+    BF_FEC_TYP_REED_SOLOMON = 2
+
+    _VALUES_TO_NAMES = {
+        0: "BF_FEC_TYP_NONE",
+        1: "BF_FEC_TYP_FIRECODE",
+        2: "BF_FEC_TYP_REED_SOLOMON",
+    }
+
+    _NAMES_TO_VALUES = {
+        "BF_FEC_TYP_NONE": 0,
+        "BF_FEC_TYP_FIRECODE": 1,
+        "BF_FEC_TYP_REED_SOLOMON": 2,
+    }
+
+
+class pltfm_pm_oper_status_t(object):
+    DOWN = 0
+    UP = 1
+
+    _VALUES_TO_NAMES = {
+        0: "DOWN",
+        1: "UP",
+    }
+
+    _NAMES_TO_VALUES = {
+        "DOWN": 0,
+        "UP": 1,
+    }
+
+
+class pltfm_pm_board_type_t(object):
+    BF_PLTFM_BD_ID_MAVERICKS_P0A = 564
+    BF_PLTFM_BD_ID_MAVERICKS_P0B = 4660
+    BF_PLTFM_BD_ID_MONTARA_P0A = 8756
+    BF_PLTFM_BD_ID_MONTARA_P0B = 12852
+    BF_PLTFM_BD_ID_MAVERICKS_P0B_EMU = 16948
+    BF_PLTFM_BD_ID_UNKNOWN = 0
+    XFFFF = 1
+
+    _VALUES_TO_NAMES = {
+        564: "BF_PLTFM_BD_ID_MAVERICKS_P0A",
+        4660: "BF_PLTFM_BD_ID_MAVERICKS_P0B",
+        8756: "BF_PLTFM_BD_ID_MONTARA_P0A",
+        12852: "BF_PLTFM_BD_ID_MONTARA_P0B",
+        16948: "BF_PLTFM_BD_ID_MAVERICKS_P0B_EMU",
+        0: "BF_PLTFM_BD_ID_UNKNOWN",
+        1: "XFFFF",
+    }
+
+    _NAMES_TO_VALUES = {
+        "BF_PLTFM_BD_ID_MAVERICKS_P0A": 564,
+        "BF_PLTFM_BD_ID_MAVERICKS_P0B": 4660,
+        "BF_PLTFM_BD_ID_MONTARA_P0A": 8756,
+        "BF_PLTFM_BD_ID_MONTARA_P0B": 12852,
+        "BF_PLTFM_BD_ID_MAVERICKS_P0B_EMU": 16948,
+        "BF_PLTFM_BD_ID_UNKNOWN": 0,
+        "XFFFF": 1,
+    }
+
+
+class InvalidPltfmPmOperation(TException):
+    """
+    Attributes:
+     - code
+    """
+
+    thrift_spec = (
+        None,  # 0
+        (1, TType.I32, 'code', None, None, ),  # 1
+    )
+
+    def __init__(self, code=None,):
+        self.code = code
+
+    def read(self, iprot):
+        if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
+            iprot._fast_decode(self, iprot, (self.__class__, self.thrift_spec))
+            return
+        iprot.readStructBegin()
+        while True:
+            (fname, ftype, fid) = iprot.readFieldBegin()
+            if ftype == TType.STOP:
+                break
+            if fid == 1:
+                if ftype == TType.I32:
+                    self.code = iprot.readI32()
+                else:
+                    iprot.skip(ftype)
+            else:
+                iprot.skip(ftype)
+            iprot.readFieldEnd()
+        iprot.readStructEnd()
+
+    def write(self, oprot):
+        if oprot._fast_encode is not None and self.thrift_spec is not None:
+            oprot.trans.write(oprot._fast_encode(self, (self.__class__, self.thrift_spec)))
+            return
+        oprot.writeStructBegin('InvalidPltfmPmOperation')
+        if self.code is not None:
+            oprot.writeFieldBegin('code', TType.I32, 1)
+            oprot.writeI32(self.code)
+            oprot.writeFieldEnd()
+        oprot.writeFieldStop()
+        oprot.writeStructEnd()
+
+    def validate(self):
+        return
+
+    def __str__(self):
+        return repr(self)
+
+    def __repr__(self):
+        L = ['%s=%r' % (key, value)
+             for key, value in self.__dict__.items()]
+        return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+    def __ne__(self, other):
+        return not (self == other)
diff --git a/tools/test/tofino-port-auto-setup-tool/thrift/pltfm_pm_rpc.thrift b/tools/test/tofino-port-auto-setup-tool/thrift/pltfm_pm_rpc.thrift
new file mode 100644
index 0000000..b556518
--- /dev/null
+++ b/tools/test/tofino-port-auto-setup-tool/thrift/pltfm_pm_rpc.thrift
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * BAREFOOT NETWORKS CONFIDENTIAL & PROPRIETARY
+ *
+ * Copyright (c) 2015-2016 Barefoot Networks, Inc.
+
+ * All Rights Reserved.
+ *
+ * NOTICE: All information contained herein is, and remains the property of
+ * Barefoot Networks, Inc. and its suppliers, if any. The intellectual and
+ * technical concepts contained herein are proprietary to Barefoot Networks,
+ * Inc.
+ * and its suppliers and may be covered by U.S. and Foreign Patents, patents in
+ * process, and are protected by trade secret or copyright law.
+ * Dissemination of this information or reproduction of this material is
+ * strictly forbidden unless prior written permission is obtained from
+ * Barefoot Networks, Inc.
+ *
+ * No warranty, explicit or implicit is provided, unless granted under a
+ * written agreement with Barefoot Networks, Inc.
+ *
+ * $Id: $
+ *
+ ******************************************************************************/
+/*
+        pltfm_pm thrift file
+*/
+
+namespace py pltfm_pm_rpc
+namespace cpp pltfm_pm_rpc
+
+typedef i32 pltfm_pm_status_t
+typedef i32 pltfm_pm_dev_port_t
+typedef byte pltfm_pm_device_t
+
+exception InvalidPltfmPmOperation {
+  1:i32 code
+}
+
+enum pltfm_pm_port_speed_t {
+  BF_SPEED_NONE = 0,
+  BF_SPEED_1G = 1,
+  BF_SPEED_10G = 2,
+  BF_SPEED_25G = 3,
+  BF_SPEED_40G = 4,
+  BF_SPEED_40G_NB = 5,
+  BF_SPEED_50G = 6,
+  BF_SPEED_100G = 7,
+  BF_SPEED_40G_NON_BREAKABLE = 8
+}
+
+enum pltfm_pm_fec_type_t {
+  BF_FEC_TYP_NONE = 0,
+  BF_FEC_TYP_FIRECODE = 1,
+  BF_FEC_TYP_REED_SOLOMON = 2
+}
+
+enum pltfm_pm_oper_status_t {
+  DOWN = 0,
+  UP = 1
+}
+
+enum pltfm_pm_board_type_t {
+  BF_PLTFM_BD_ID_MAVERICKS_P0A = 0x0234,
+  BF_PLTFM_BD_ID_MAVERICKS_P0B = 0x1234,
+  BF_PLTFM_BD_ID_MONTARA_P0A = 0x2234,
+  BF_PLTFM_BD_ID_MONTARA_P0B = 0x3234,
+  BF_PLTFM_BD_ID_MAVERICKS_P0B_EMU = 0x4234,
+  BF_PLTFM_BD_ID_UNKNOWN = 0XFFFF
+}
+
+service pltfm_pm_rpc {
+    /* init */
+    pltfm_pm_status_t pltfm_pm_port_add(1:pltfm_pm_device_t device, 2:pltfm_pm_dev_port_t dev_port, 3:pltfm_pm_port_speed_t ps, 4:pltfm_pm_fec_type_t fec) throws (1:InvalidPltfmPmOperation ouch);
+    pltfm_pm_status_t pltfm_pm_port_del(1:pltfm_pm_device_t device, 2:pltfm_pm_dev_port_t dev_port) throws (1:InvalidPltfmPmOperation ouch);
+    pltfm_pm_status_t pltfm_pm_port_enable(1:pltfm_pm_device_t device, 2:pltfm_pm_dev_port_t dev_port) throws (1:InvalidPltfmPmOperation ouch);
+    pltfm_pm_status_t pltfm_pm_port_dis(1:pltfm_pm_device_t device, 2:pltfm_pm_dev_port_t dev_port) throws (1:InvalidPltfmPmOperation ouch);
+    pltfm_pm_status_t pltfm_pm_switchd_port_cleanup(1:pltfm_pm_device_t device) throws (1:InvalidPltfmPmOperation ouch);
+    pltfm_pm_oper_status_t pltfm_pm_port_oper_status_get(1:pltfm_pm_device_t device, 2:pltfm_pm_dev_port_t dev_port) throws (1:InvalidPltfmPmOperation ouch);
+    pltfm_pm_board_type_t pltfm_pm_board_type_get() throws (1:InvalidPltfmPmOperation ouch);
+    pltfm_pm_status_t pltfm_pm_port_an_set(1:pltfm_pm_device_t device, 2:pltfm_pm_dev_port_t dev_port, 3:i32 an_flag) throws (1:InvalidPltfmPmOperation ouch);
+    pltfm_pm_status_t pltfm_pm_serdes_lane_map_set(1:pltfm_pm_device_t device) throws (1:InvalidPltfmPmOperation ouch);
+    pltfm_pm_status_t pltfm_pm_serdes_init(1:pltfm_pm_device_t device) throws (1:InvalidPltfmPmOperation ouch);
+}
