import os
import sys

appcust_path = os.path.abspath(os.path.join('..', 'src'))
sys.path.append(appcust_path)
template_path = "templates"
sys.path.append(template_path)

import register_class
import function_class
import helper_functions

class cPDOCurrentField(register_class.cScalingDMTerminator) :
    def __init__(self, register, iDict):
        register_class.cScalingDMTerminator.__init__(self, register, iDict)
        # map all strings representing units to scale factor
        self.dictScaleUnits = {'' : 0.01, 'A' : 0.01, 'mA' : 10.0}
        self.defaultUnit = 'A'

class c20mACurrentField(register_class.cScalingDMTerminator) :
    def __init__(self, register, iDict):
        register_class.cScalingDMTerminator.__init__(self, register, iDict)
        # map all strings representing units to scale factor
        self.dictScaleUnits = {'' : 0.02, 'A' : 0.02, 'mA' : 20.0}
        self.defaultUnit = 'A'

class c1mACurrentField(register_class.cScalingDMTerminator) :
    def __init__(self, register, iDict):
        register_class.cScalingDMTerminator.__init__(self, register, iDict)
        # map all strings representing units to scale factor
        self.dictScaleUnits = {'' : 0.001, 'A' : 0.001, 'mA' : 1.0}
        self.defaultUnit = 'A'


class cPDOVoltageField(register_class.cScalingDMTerminator) :
    def __init__(self, register, iDict):
        register_class.cScalingDMTerminator.__init__(self, register, iDict)
        # map all strings representing units to scale factor
        self.dictScaleUnits = {'' : 0.05, 'V' : 0.05, 'mV' : 50.0}
        self.defaultUnit = 'V'


class cUVPTrip5V(register_class.cScalingDMTerminator) :
    def __init__(self, register, iDict):
        register_class.cScalingDMTerminator.__init__(self, register, iDict)
        # map all strings representing units to scale factor
        self.dictScaleUnits = {'' : 0.25, 'V' : 0.25, 'mV' : 250.0}
        self.defaultUnit = 'V'
        self.scalingOffset = 10

class cOVPTrip(register_class.cScalingDMTerminator) :
    def __init__(self, register, iDict):
        register_class.cScalingDMTerminator.__init__(self, register, iDict)
        # map all strings representing units to scale factor
        self.dictScaleUnits = {'' : 0.3269, 'V' : 0.3269, 'mV' : 326.9}
        self.defaultUnit = 'V'
        self.scalingOffset = 13


class cPDOPowerField(register_class.cScalingDMTerminator) :
    def __init__(self, register, iDict):
        register_class.cScalingDMTerminator.__init__(self, register, iDict)
        # map all strings representing units to scale factor
        self.dictScaleUnits = {'' : 0.25, 'W' : 0.25, 'mW' : 250.0}
        self.defaultUnit = 'W'

class cAutonegPowerField(register_class.cScalingDMTerminator) :
    def __init__(self, register, iDict):
        register_class.cScalingDMTerminator.__init__(self, register, iDict)
        # map all strings representing units to scale factor
        self.dictScaleUnits = {'' : 0.025, 'W' : 0.025, 'mW' : 25.0}
        self.defaultUnit = 'W'


class cSRCPolCurrentField(register_class.cScalingDMTerminator) :
    def __init__(self, register, iDict):
        register_class.cScalingDMTerminator.__init__(self, register, iDict)
        # map all strings representing units to scale factor
        self.dictScaleUnits = {'' : 0.025, 'A' : 0.025, 'mA' : 25.0}
        self.defaultUnit = 'A'

class cSRCPolPowField(register_class.cScalingDMTerminator) :
    def __init__(self, register, iDict):
        register_class.cScalingDMTerminator.__init__(self, register, iDict)
        # map all strings representing units to scale factor
        self.dictScaleUnits = {'' : 0.01, 'W' : 0.01, 'mW' : 10.0}
        self.defaultUnit = 'W'


class cDMFixedSourcePdoArray(register_class.cDataModelArray) :
    def __init__(self, register, tier, iDict):
        register_class.cDataModelArray.__init__(self, register, tier, iDict)
        #
        self.addChild(cPDOCurrentField( self.register,  { 'name' : 'Maximum Current',
                                                                'offset' : 0,
                                                                'bit length' : 10}))

        self.addChild(cPDOVoltageField( self.register,  { 'name' : 'Voltage',
                                                                'offset' : 10,
                                                                'bit length' : 10}))

        PeakCurrent = register_class.cListDMTerminator( self.register,  { 'name' : 'Peak Current',
                                                                'offset' : 20,
                                                                'bit length' : 2})
        PeakCurrent.setReportList(['100%', '130%', '150%', '200%'])

        self.addChild(PeakCurrent)

        supplyType = register_class.cListDMTerminator( self.register,  { 'name' : 'Supply Type',
                                                                'offset' : 30,
                                                                'bit length' : 2})
        supplyType.setReportList(['Fixed Source', 'Battery Source', 'Variable Source'])
        supplyType.addUpdateRegisterByName("self")
        supplyType.setMaxValue(2)

        self.addChild(supplyType)

class cDMFixedSinkPdoArray(register_class.cDataModelArray) :
    def __init__(self, register, tier, iDict):
        register_class.cDataModelArray.__init__(self, register, tier, iDict)
        #
        self.addChild(cPDOCurrentField( self.register,  { 'name' : 'Operating Current',
                                                                'offset' : 0,
                                                                'bit length' : 10}))

        self.addChild(cPDOVoltageField( self.register,  { 'name' : 'Voltage',
                                                                'offset' : 10,
                                                                'bit length' : 10}))

        PeakCurrent = register_class.cListDMTerminator( self.register,  { 'name' : 'Peak Current',
                                                                'offset' : 20,
                                                                'bit length' : 2})
        PeakCurrent.setReportList(['100%', '130%', '150%', '200%'])

        self.addChild(PeakCurrent)

        supplyType = register_class.cListDMTerminator( self.register,  { 'name' : 'Supply Type',
                                                                'offset' : 30,
                                                                'bit length' : 2})
        supplyType.setReportList(['Fixed Sink', 'Battery Sink', 'Variable Sink'])
        supplyType.addUpdateRegisterByName("self")
        supplyType.setMaxValue(2)

        self.addChild(supplyType)


class cDMSourcePdo1Array(register_class.cDataModelArray) :
    def __init__(self, register, tier, iDict):
        register_class.cDataModelArray.__init__(self, register, tier, iDict)

        self.addChild(cPDOCurrentField( self.register,  { 'name' : 'Maximum Current',
                                                                'offset' : 0,
                                                                'bit length' : 10}))

        fixedVoltage = register_class.cForceSetDMTerminator( self.register,  { 'name' : 'Voltage',
                                                                'offset' : 10,
                                                                'bit length' : 10,
                                                                'force value' : int(100),
                                                                'force display' : '5 V'})

        self.addChild(fixedVoltage)
        fixedVoltage.setFromInt(100)

        PeakCurrent = register_class.cListDMTerminator( self.register,  { 'name' : 'Peak Current',
                                                                'offset' : 20,
                                                                'bit length' : 2})
        PeakCurrent.setReportList(['100%', '130%', '150%', '200%'])

        self.addChild(PeakCurrent)


        # Dual Role and Externally Powered are overwritten by firmware, so avoid confusion by not listing in GUI

#        self.addChild(register_class.cBooleanDMTerminator( self.register,  { 'name' : 'Dual Role Data',
#                                                                'offset' : 25,
#                                                                'bit length' : 1}))

        self.addChild(register_class.cBooleanDMTerminator( self.register,  { 'name' : 'USB Capable',
                                                                'offset' : 26,
                                                                'bit length' : 1}))

#        self.addChild(register_class.cBooleanDMTerminator( self.register,  { 'name' : 'Externally Powered',
#                                                                'offset' : 27,
#                                                                'bit length' : 1}))

        self.addChild(register_class.cBooleanDMTerminator( self.register,  { 'name' : 'USB Suspend Supported',
                                                                'offset' : 28,
                                                                'bit length' : 1}))

#        self.addChild(register_class.cBooleanDMTerminator( self.register,  { 'name' : 'Dual Role Power',
#                                                                'offset' : 29,
#                                                                'bit length' : 1}))


        fixedSupplyType = register_class.cForceSetDMTerminator( self.register,  { 'name' : 'Supply Type',
                                                                'offset' : 30,
                                                                'bit length' : 2,
                                                                'force value' : int(0),
                                                                'force display' : 'Fixed Source'})


        self.addChild(fixedSupplyType)


class cDMSinkPdo1Array(register_class.cDataModelArray) :
    def __init__(self, register, tier, iDict):
        register_class.cDataModelArray.__init__(self, register, tier, iDict)

        self.addChild(cPDOCurrentField( self.register,  { 'name' : 'Operating Current',
                                                                'offset' : 0,
                                                                'bit length' : 10}))

        fixedVoltage = register_class.cForceSetDMTerminator( self.register,  { 'name' : 'Voltage',
                                                                'offset' : 10,
                                                                'bit length' : 10,
                                                                'force value' : int(100),
                                                                'force display' : '5 V'})

        self.addChild(fixedVoltage)

        PeakCurrent = register_class.cListDMTerminator( self.register,  { 'name' : 'Peak Current',
                                                                'offset' : 20,
                                                                'bit length' : 2})
        PeakCurrent.setReportList(['100%', '130%', '150%', '200%'])

        self.addChild(PeakCurrent)
        # Dual Role and Externally Powered are overwritten by firmware, so avoid confusion by not listing in GUI

#        self.addChild(register_class.cBooleanDMTerminator( self.register,  { 'name' : 'Dual Role Data',
#                                                                'offset' : 25,
#                                                                'bit length' : 1}))

        self.addChild(register_class.cBooleanDMTerminator( self.register,  { 'name' : 'USB Capable',
                                                                'offset' : 26,
                                                                'bit length' : 1}))

#        self.addChild(register_class.cBooleanDMTerminator( self.register,  { 'name' : 'Externally Powered',
#                                                                'offset' : 27,
#                                                                'bit length' : 1}))

        self.addChild(register_class.cBooleanDMTerminator( self.register,  { 'name' : 'Higher Capability',
                                                                'offset' : 28,
                                                                'bit length' : 1}))

#        self.addChild(register_class.cBooleanDMTerminator( self.register,  { 'name' : 'Dual Role Power',
#                                                                'offset' : 29,
#                                                                'bit length' : 1}))


        fixedSupplyType = register_class.cForceSetDMTerminator( self.register,  { 'name' : 'Supply Type',
                                                                'offset' : 30,
                                                                'bit length' : 2,
                                                                'force value' : int(0),
                                                                'force display' : 'Fixed Sink'})


        self.addChild(fixedSupplyType)


class cDMVariableSourcePdoArray(register_class.cDataModelArray) :
    def __init__(self, register, tier, iDict):
        register_class.cDataModelArray.__init__(self, register, tier, iDict)
        #
        self.addChild(cPDOCurrentField( self.register,  { 'name' : 'Maximum Current',
                                                                'offset' : 0,
                                                                'bit length' : 10}))

        self.addChild(cPDOVoltageField( self.register,  { 'name' : 'Minimum Voltage',
                                                                'offset' : 10,
                                                                'bit length' : 10}))

        self.addChild(cPDOVoltageField( self.register,  { 'name' : 'Maximum Voltage',
                                                                'offset' : 20,
                                                                'bit length' : 10}))

        supplyType = register_class.cListDMTerminator( self.register,  { 'name' : 'Supply Type',
                                                                'offset' : 30,
                                                                'bit length' : 2})
        supplyType.setReportList(['Fixed Source', 'Battery Source', 'Variable Source'])
        supplyType.addUpdateRegisterByName("self")
        supplyType.setMaxValue(2)

        self.addChild(supplyType)


class cDMVariableSinkPdoArray(register_class.cDataModelArray) :
    def __init__(self, register, tier, iDict):
        register_class.cDataModelArray.__init__(self, register, tier, iDict)
        #
        self.addChild(cPDOCurrentField( self.register,  { 'name' : 'Operating Current',
                                                                'offset' : 0,
                                                                'bit length' : 10}))

        self.addChild(cPDOVoltageField( self.register,  { 'name' : 'Minimum Voltage',
                                                                'offset' : 10,
                                                                'bit length' : 10}))

        self.addChild(cPDOVoltageField( self.register,  { 'name' : 'Maximum Voltage',
                                                                'offset' : 20,
                                                                'bit length' : 10}))

        supplyType = register_class.cListDMTerminator( self.register,  { 'name' : 'Supply Type',
                                                                'offset' : 30,
                                                                'bit length' : 2})
        supplyType.setReportList(['Fixed Sink', 'Battery Sink', 'Variable Sink'])
        supplyType.addUpdateRegisterByName("self")
        supplyType.setMaxValue(2)

        self.addChild(supplyType)


class cDMBatterySourcePdoArray(register_class.cDataModelArray) :
    def __init__(self, register, tier, iDict):
        register_class.cDataModelArray.__init__(self, register, tier, iDict)
        #
        self.addChild(cPDOPowerField( self.register,  { 'name' : 'Maximum Power',
                                                                'offset' : 0,
                                                                'bit length' : 10}))

        self.addChild(cPDOVoltageField( self.register,  { 'name' : 'Minimum Voltage',
                                                                'offset' : 10,
                                                                'bit length' : 10}))

        self.addChild(cPDOVoltageField( self.register,  { 'name' : 'Maximum Voltage',
                                                                'offset' : 20,
                                                                'bit length' : 10}))

        supplyType = register_class.cListDMTerminator( self.register,  { 'name' : 'Supply Type',
                                                                'offset' : 30,
                                                                'bit length' : 2})
        supplyType.setReportList(['Fixed Source', 'Battery Source', 'Variable Source'])
        supplyType.addUpdateRegisterByName("self")
        supplyType.setMaxValue(2)

        self.addChild(supplyType)


class cDMBatterySinkPdoArray(register_class.cDataModelArray) :
    def __init__(self, register, tier, iDict):
        register_class.cDataModelArray.__init__(self, register, tier, iDict)
        #
        self.addChild(cPDOPowerField( self.register,  { 'name' : 'Operating Power',
                                                                'offset' : 0,
                                                                'bit length' : 10}))

        self.addChild(cPDOVoltageField( self.register,  { 'name' : 'Minimum Voltage',
                                                                'offset' : 10,
                                                                'bit length' : 10}))

        self.addChild(cPDOVoltageField( self.register,  { 'name' : 'Maximum Voltage',
                                                                'offset' : 20,
                                                                'bit length' : 10}))

        supplyType = register_class.cListDMTerminator( self.register,  { 'name' : 'Supply Type',
                                                                'offset' : 30,
                                                                'bit length' : 2})
        supplyType.setReportList(['Fixed Sink', 'Battery Sink', 'Variable Sink'])
        supplyType.addUpdateRegisterByName("self")
        supplyType.setMaxValue(2)

        self.addChild(supplyType)


# TODO : This is a common need. Build an extender class that takes an arbitrary data model in init and adds the
#        prepend and append capability.
class cDMAnySourcePdoArray(register_class.cDataModelArray) :
    def __init__(self, register, tier, iDict):
        register_class.cDataModelArray.__init__(self, register, tier, iDict)

        self.prependChildrenArray = []
        self.appendChildrenArray = []

        self.fixedOverlay = cDMFixedSourcePdoArray(register, self.tier, iDict)
        self.variableOverlay = cDMVariableSourcePdoArray(register, self.tier, iDict)
        self.batteryOverlay = cDMBatterySourcePdoArray(register, self.tier, iDict)

        # self.dataModelChildrenArray must contain the children in all three of the overlays
        self.dataModelChildrenArray = []
        self.dataModelChildrenArray.extend(self.fixedOverlay.dataModelChildrenArray)
        self.dataModelChildrenArray.extend(self.variableOverlay.dataModelChildrenArray)
        self.dataModelChildrenArray.extend(self.batteryOverlay.dataModelChildrenArray)

        self.dataModelGenerator = self.AnyPdoArrayDMGenerator

    def prependChild(self, child):
        self.prependChildrenArray[:0] = [child,]
        # it is okay to append to the dataModelChildrenArray because it is not directly used in the
        #    data model generator.
        self.dataModelChildrenArray.append(child)

    def addChild(self, child):
        child.parent = self
        self.appendChildrenArray.append(child)
        self.dataModelChildrenArray.append(child)

    # return the first child with a matching name or none if no match
    def getChildByName(self, name):
        for child in self.prependChildrenArray :
            if child.name == name :
                return child

        for child in self.appendChildrenArray :
            if child.name == name :
                return child

        type = self.fixedOverlay.getChildByName('Supply Type').valueToInt()
        if type == 0 :
            for child in self.fixedOverlay :
                if child.name == name :
                    return child
        elif type == 1 :
            for child in self.variableOverlay :
                if child.name == name :
                    return child
        elif type == 2:
            for child in self.batteryOverlay :
                if child.name == name :
                    return child

        return None

    def AnyPdoArrayDMGenerator(self):
        # todo: should make a set parent call instead of allowing to be set directly
        #       then the objects can correctly set sub-object parent relationships
        self.fixedOverlay.parent = self.parent
        self.variableOverlay.parent = self.parent
        self.batteryOverlay.parent = self.parent

        type = self.fixedOverlay.getChildByName('Supply Type').valueToInt()
        retDict = {'name': self.name, 'grouping tier': self.tier, 'show' : self.show, 'data model list': []}
        if type == 0 :
            for child in self.prependChildrenArray :
                if isinstance(child, dict) :
                    retDict['data model list'].extend(child.dataModelGenerator()['data model list'])
                else :
                    retDict['data model list'].append(child.dataModelGenerator())
            retDict['data model list'].extend(self.fixedOverlay.dataModelGenerator()['data model list'])
            for child in self.appendChildrenArray :
                if isinstance(child, list) :
                    retDict['data model list'].extend(child.dataModelGenerator()['data model list'])
                else :
                    retDict['data model list'].append(child.dataModelGenerator())
        elif type == 1:
            for child in self.prependChildrenArray :
                if isinstance(child, list) :
                    retDict['data model list'].extend(child.dataModelGenerator()['data model list'])
                else :
                    retDict['data model list'].append(child.dataModelGenerator())
            retDict['data model list'].extend(self.batteryOverlay.dataModelGenerator()['data model list'])
            for child in self.appendChildrenArray :
                if isinstance(child, list) :
                    retDict['data model list'].extend(child.dataModelGenerator()['data model list'])
                else :
                    retDict['data model list'].append(child.dataModelGenerator())
        elif type == 2 :
            for child in self.prependChildrenArray :
                if isinstance(child, list) :
                    retDict['data model list'].extend(child.dataModelGenerator()['data model list'])
                else :
                    retDict['data model list'].append(child.dataModelGenerator())
            retDict['data model list'].extend(self.variableOverlay.dataModelGenerator()['data model list'])
            for child in self.appendChildrenArray :
                if isinstance(child, list) :
                    retDict['data model list'].extend(child.dataModelGenerator()['data model list'])
                else :
                    retDict['data model list'].append(child.dataModelGenerator())
        else :
            # invalid setting
            # TODO: improve error handling
            retDict['data model list'] = []

        return retDict


class cDMAnySinkPdoArray(register_class.cDataModelArray) :
    def __init__(self, register, tier, iDict):
        register_class.cDataModelArray.__init__(self, register, tier, iDict)

        self.prependChildrenArray = []
        self.appendChildrenArray = []

        self.fixedOverlay = cDMFixedSinkPdoArray(register, self.tier, iDict)
        self.variableOverlay = cDMVariableSinkPdoArray(register, self.tier, iDict)
        self.batteryOverlay = cDMBatterySinkPdoArray(register, self.tier, iDict)

        # self.dataModelChildrenArray must contain the children in all three of the overlays
        self.dataModelChildrenArray = []
        self.dataModelChildrenArray.extend(self.fixedOverlay.dataModelChildrenArray)
        self.dataModelChildrenArray.extend(self.variableOverlay.dataModelChildrenArray)
        self.dataModelChildrenArray.extend(self.batteryOverlay.dataModelChildrenArray)

        self.dataModelGenerator = self.AnyPdoArrayDMGenerator

    def prependChild(self, child):
        self.prependChildrenArray[:0] = [child,]
        # it is okay to append to the dataModelChildrenArray because it is not directly used in the
        #    data model generator.
        self.dataModelChildrenArray.append(child)

    def addChild(self, child):
        child.parent = self
        self.appendChildrenArray.append(child)
        self.dataModelChildrenArray.append(child)

    # return the first child with a matching name or none if no match
    def getChildByName(self, name):
        for child in self.prependChildrenArray :
            if child.name == name :
                return child

        for child in self.appendChildrenArray :
            if child.name == name :
                return child

        type = self.fixedOverlay.getChildByName('Supply Type').valueToInt()
        if type == 0 :
            for child in self.fixedOverlay :
                if child.name == name :
                    return child
        elif type == 1 :
            for child in self.variableOverlay :
                if child.name == name :
                    return child
        elif type == 2:
            for child in self.batteryOverlay :
                if child.name == name :
                    return child

        return None

    def AnyPdoArrayDMGenerator(self):
        # todo: should make a set parent call instead of allowing to be set directly
        #       then the objects can correctly set sub-object parent relationships
        self.fixedOverlay.parent = self.parent
        self.variableOverlay.parent = self.parent
        self.batteryOverlay.parent = self.parent

        type = self.fixedOverlay.getChildByName('Supply Type').valueToInt()
        retDict = {'name': self.name, 'grouping tier': self.tier, 'show' : self.show, 'data model list': []}
        if type == 0 :
            for child in self.prependChildrenArray :
                if isinstance(child, dict) :
                    retDict['data model list'].extend(child.dataModelGenerator()['data model list'])
                else :
                    retDict['data model list'].append(child.dataModelGenerator())
            retDict['data model list'].extend(self.fixedOverlay.dataModelGenerator()['data model list'])
            for child in self.appendChildrenArray :
                if isinstance(child, list) :
                    retDict['data model list'].extend(child.dataModelGenerator()['data model list'])
                else :
                    retDict['data model list'].append(child.dataModelGenerator())
        elif type == 1:
            for child in self.prependChildrenArray :
                if isinstance(child, list) :
                    retDict['data model list'].extend(child.dataModelGenerator()['data model list'])
                else :
                    retDict['data model list'].append(child.dataModelGenerator())
            retDict['data model list'].extend(self.batteryOverlay.dataModelGenerator()['data model list'])
            for child in self.appendChildrenArray :
                if isinstance(child, list) :
                    retDict['data model list'].extend(child.dataModelGenerator()['data model list'])
                else :
                    retDict['data model list'].append(child.dataModelGenerator())
        elif type == 2 :
            for child in self.prependChildrenArray :
                if isinstance(child, list) :
                    retDict['data model list'].extend(child.dataModelGenerator()['data model list'])
                else :
                    retDict['data model list'].append(child.dataModelGenerator())
            retDict['data model list'].extend(self.variableOverlay.dataModelGenerator()['data model list'])
            for child in self.appendChildrenArray :
                if isinstance(child, list) :
                    retDict['data model list'].extend(child.dataModelGenerator()['data model list'])
                else :
                    retDict['data model list'].append(child.dataModelGenerator())
        else :
            # invalid setting
            # TODO: improve error handling
            retDict['data model list'] = []

        return retDict


class cUFPIDHeaderVDO(register_class.cDataModelArray) :
    def __init__(self, register, tier, iDict):
        register_class.cDataModelArray.__init__(self, register, tier, iDict)
        #
        self.addChild(register_class.cHexDMTerminator( self.register,  { 'name' : 'USB Vendor ID',
                                                                'offset' : 0,
                                                                'bit length' : 16}))

        self.addChild(register_class.cBooleanDMTerminator( self.register,  { 'name' : 'Modal Operation Supported',
                                                                'offset' : 26,
                                                                'bit length' : 1}))

        productType = register_class.cListDMTerminator( self.register,  { 'name' : 'Product Type',
                                                                'offset' : 27,
                                                                'bit length' : 3})
        productType.setReportList(['Undefined', 'Hub', 'Peripheral', 'Passive Cable', 'Active Cable', 'Alternate Mode Adapter', 'Power Brick'])
        productType.setMaxValue(6)

        self.addChild(productType)

        self.addChild(register_class.cBooleanDMTerminator( self.register,  { 'name' : 'Data Capable as USB Device',
                                                                'offset' : 30,
                                                                'bit length' : 1}))

        self.addChild(register_class.cBooleanDMTerminator( self.register,  { 'name' : 'Data Capable as USB Host',
                                                                'offset' : 31,
                                                                'bit length' : 1}))


class cUFPProductVDO(register_class.cDataModelArray) :
    def __init__(self, register, tier, iDict):
        register_class.cDataModelArray.__init__(self, register, tier, iDict)
        #
        #self.addChild(register_class.cHexDMTerminator( self.register,  { 'name' : 'BCD Device',
        #                                                        'offset' : 0,
        #                                                        'bit length' : 16}))

        self.addChild(register_class.cHexDMTerminator( self.register,  { 'name' : 'USB Product ID',
                                                                'offset' : 16,
                                                                'bit length' : 16}))


class cCableVDO(register_class.cDataModelArray) :
    def __init__(self, register, tier, iDict):
        register_class.cDataModelArray.__init__(self, register, tier, iDict)
        #
        usbSSSignal = register_class.cListDMTerminator( self.register,  { 'name' : 'USB SS Signalling',
                                                                'offset' : 0,
                                                                'bit length' : 3})
        usbSSSignal.setMaxValue(2)
        usbSSSignal.setReportList(['USB 2.0 Only', 'USB 3.1 Gen 1', 'USB 3.1 Gen 1 and 2'])

        self.addChild(usbSSSignal)

        self.addChild(register_class.cBooleanDMTerminator( self.register,  { 'name' : 'SOP" Controller Present',
                                                                'offset' : 3,
                                                                'bit length' : 1}))

        self.addChild(register_class.cBooleanDMTerminator( self.register,  { 'name' : 'VBus Through Cable',
                                                                'offset' : 4,
                                                                'bit length' : 1}))

        currentCap = register_class.cListDMTerminator( self.register,  { 'name' : 'VBus Current Capability',
                                                                'offset' : 5,
                                                                'bit length' : 2})
        currentCap.setMaxValue(3)
        currentCap.setReportList(['1.5 A', '3.0 A', '5 A'])

        self.addChild(currentCap)

        ssrx2dir = register_class.cListDMTerminator( self.register,  { 'name' : 'SSRx 2 Directionality',
                                                                'offset' : 7,
                                                                'bit length' : 1})
        ssrx2dir.setReportList(['Fixed', 'Configurable'])

        self.addChild(ssrx2dir)

        ssrx1dir = register_class.cListDMTerminator( self.register,  { 'name' : 'SSRx 1 Directionality',
                                                                'offset' : 8,
                                                                'bit length' : 1})
        ssrx1dir.setReportList(['Fixed', 'Configurable'])

        self.addChild(ssrx1dir)

        sstx2dir = register_class.cListDMTerminator( self.register,  { 'name' : 'SSTx 2 Directionality',
                                                                'offset' : 9,
                                                                'bit length' : 1})
        sstx2dir.setReportList(['Fixed', 'Configurable'])

        self.addChild(sstx2dir)

        sstx1dir = register_class.cListDMTerminator( self.register,  { 'name' : 'SSTx 1 Directionality',
                                                                'offset' : 10,
                                                                'bit length' : 1})
        sstx1dir.setReportList(['Fixed', 'Configurable'])

        self.addChild(sstx1dir)

        cableTerm = register_class.cListDMTerminator( self.register,  { 'name' : 'Cable Termination Type',
                                                                'offset' : 11,
                                                                'bit length' : 2})
        cableTerm.setReportList(['Both Ends Passive, VConn Not Required', 'Both Ends Passive, VConn Is Required', 'One End Active, One End Passive, VConn Is Required', 'Both Ends Active, VConn Is Required'])

        self.addChild(cableTerm)

        cableLat = register_class.cListDMTerminator( self.register,  { 'name' : 'Cable Latency',
                                                                'offset' : 13,
                                                                'bit length' : 4})

        cableLat.setMaxValue(10)
        cableLat.setReportList(['reserved (0000b)', '< 10nS (~1m)', '10-20nS (~2m)', '20-30nS (~3m)', '30-40nS (~4m)', '40-50nS (~5m)', '50-60nS (~6m)', '60-70nS (~7m)', '1000nS (~100m)', '2000nS (~200m)', '3000nS (~300m)'])

        self.addChild(cableLat)

        plugRec = register_class.cListDMTerminator( self.register,  { 'name' : 'Type-C Plug/Receptacle',
                                                                'offset' : 17,
                                                                'bit length' : 1})

        plugRec.setMaxValue(10)
        plugRec.setReportList(['Plug', 'Receptacle'])

        self.addChild(plugRec)

        typeCto = register_class.cListDMTerminator( self.register,  { 'name' : 'Type-C to Type-A/B/C',
                                                                'offset' : 18,
                                                                'bit length' : 2})

        typeCto.setMaxValue(2)
        typeCto.setReportList(['Type-A', 'Type-B', 'Type-C'])

        self.addChild(typeCto)

        self.addChild(register_class.cHexDMTerminator( self.register,  { 'name' : 'Cable Firmware Version',
                                                                'offset' : 24,
                                                                'bit length' : 4}))

        self.addChild(register_class.cHexDMTerminator( self.register,  { 'name' : 'Cable Hardware Version',
                                                                'offset' : 28,
                                                                'bit length' : 4}))


class cAMAVDO(register_class.cDataModelArray) :
    def __init__(self, register, tier, iDict):
        register_class.cDataModelArray.__init__(self, register, tier, iDict)
        #
        usbSSSignal = register_class.cListDMTerminator( self.register,  { 'name' : 'USB SS Signalling',
                                                                'offset' : 0,
                                                                'bit length' : 3})
        usbSSSignal.setMaxValue(3)
        usbSSSignal.setReportList(['USB 2.0 Only', 'USB 3.1 Gen 1', 'USB 3.1 Gen 1 and 2', 'USB 2.0 Billboard Only'])

        self.addChild(usbSSSignal)

        self.addChild(register_class.cBooleanDMTerminator( self.register,  { 'name' : 'VBus Required',
                                                                'offset' : 3,
                                                                'bit length' : 1}))

        self.addChild(register_class.cBooleanDMTerminator( self.register,  { 'name' : 'VConn Required',
                                                                'offset' : 4,
                                                                'bit length' : 1}))

        vConnPower = register_class.cListDMTerminator( self.register,  { 'name' : 'VConn Power',
                                                                'offset' : 5,
                                                                'bit length' : 3})
        vConnPower.setMaxValue(6)
        vConnPower.setReportList(['1 W', '1.5 W', '2 W', '3 W', '4 W', '5 W', '6 W'])

        self.addChild(vConnPower)

        ssrx2dir = register_class.cListDMTerminator( self.register,  { 'name' : 'SSRx 2 Directionality',
                                                                'offset' : 8,
                                                                'bit length' : 1})
        ssrx2dir.setReportList(['Fixed', 'Configurable'])

        self.addChild(ssrx2dir)

        ssrx1dir = register_class.cListDMTerminator( self.register,  { 'name' : 'SSRx 1 Directionality',
                                                                'offset' : 9,
                                                                'bit length' : 1})
        ssrx1dir.setReportList(['Fixed', 'Configurable'])

        self.addChild(ssrx1dir)

        sstx2dir = register_class.cListDMTerminator( self.register,  { 'name' : 'SSTx 2 Directionality',
                                                                'offset' : 10,
                                                                'bit length' : 1})
        sstx2dir.setReportList(['Fixed', 'Configurable'])

        self.addChild(sstx2dir)

        sstx1dir = register_class.cListDMTerminator( self.register,  { 'name' : 'SSTx 1 Directionality',
                                                                'offset' : 11,
                                                                'bit length' : 1})
        sstx1dir.setReportList(['Fixed', 'Configurable'])

        self.addChild(sstx1dir)

        self.addChild(register_class.cHexDMTerminator( self.register,  { 'name' : 'AMA Firmware Version',
                                                                'offset' : 24,
                                                                'bit length' : 4}))

        self.addChild(register_class.cHexDMTerminator( self.register,  { 'name' : 'AMA Hardware Version',
                                                                'offset' : 28,
                                                                'bit length' : 4}))


#==========================================================================
# main registers
#==========================================================================

class cGeneralPolicyArray(register_class.cDataModelArray) :
    def __init__(self, register, tier, iDict):
        register_class.cDataModelArray.__init__(self, register, tier, iDict)


        typeCSM = register_class.cListDMTerminator(self.register,
                                                                    {'name' : 'Type-C State Machine',
                                                                     'offset' : 0,
                                                                     'bit length' : 2 })


        typeCSM.setReportList(['Sink', 'Source', 'DRP', 'Disabled'])

        self.addChild(typeCSM)

        typeCCurr = register_class.cListDMTerminator(self.register,
                                                                    {'name' : 'Type-C Current',
                                                                     'offset' : 2,
                                                                     'bit length' : 2 })


        typeCCurr.setReportList(['Default Current', '1.5 A', '3.0 A', 'As Per First Source Capabilities PDO'])

        self.addChild(typeCCurr)

        typeCOpt = register_class.cListDMTerminator(self.register,
                                                                    {'name' : 'Type-C Options',
                                                                     'offset' : 4,
                                                                     'bit length' : 2 })


        typeCOpt.setReportList(['No Optional States', 'Try.SRC is supported as DRP',
                                 'Try.SNK is supported as DRP', 'Powered Accessory when Sink'])

        self.addChild(typeCOpt)

        self.addChild(register_class.cBooleanDMTerminator(self.register,
                                                                    {'name' : 'Support Audio Accessory',
                                                                     'offset' : 6,
                                                                     'bit length' : 1 }))

        self.addChild(register_class.cBooleanDMTerminator(self.register,
                                                                    {'name' : 'Support Debug Accessory',
                                                                     'offset' : 7,
                                                                     'bit length' : 1 }))


        powRole = register_class.cListDMTerminator(self.register,
                                                                    {'name' : 'Preferred Power Role',
                                                                     'offset' : 8,
                                                                     'bit length' : 2 })


        powRole.setReportList(['No Preference, PR_Swaps blocked', 'No Preference, PR_Swaps Accepted',
                                 'Sink Power Role Preferred', 'Source Power Role Preferred'])

        self.addChild(powRole)

        datRole = register_class.cListDMTerminator(self.register,
                                                                    {'name' : 'Preferred Data Role',
                                                                     'offset' : 10,
                                                                     'bit length' : 2 })


        datRole.setReportList(['No Preference, DR_Swaps blocked', 'No Preference, DR_Swaps Accepted',
                                 'UFP Data Role Preferred', 'DFP Data Role Preferred'])

        self.addChild(datRole)

        vconnRole = register_class.cListDMTerminator(self.register,
                                                                    {'name' : 'VCONN Swap Accept',
                                                                     'offset' : 12,
                                                                     'bit length' : 2 })


        vconnRole.setReportList(['VCONN Not Supported', 'VCONN Supported as DFP, UFP if Ext Powered',
                                 'VCONN Supported as DFP Only', 'VCONN Supported as DFP, UFP'])

        self.addChild(vconnRole)



class cSysConfig_0x28_register(register_class.cRegister) :
    def __init__(self):
        register_class.cRegister.__init__(self, {'register name' : 'System Configuration',
                                                 'address' : 0x28,
                                                 'byte length' : 48,
                                                 'permission' : 'RO'})

        self.dataModel = register_class.cDataModelArray(self, 2,
                                                        {'name' : 'System Configuration',
                                                         'offset' : 0,
                                                         'bit length' : 384 })

        b1 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'TI Mode Enables',
                                             'offset' : 0,
                                             'bit length' : 8 })
        self.dataModel.addChild(b1)

        b1.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Enable TI VID',
                                                                     'offset' : 0,
                                                                     'bit length' : 1 }))

        b1.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'ACE HI Over PD Mode',
                                                                     'offset' : 1,
                                                                     'bit length' : 1 }))

        b2 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'Sleep Controls',
                                             'offset' : 8,
                                             'bit length' : 8 })
        self.dataModel.addChild(b2)


        SDDict =  { 0x0 : 'Sleep Mode Disabled',
                    0x2 : '100 mSec',
                    0x4 : '1000 mSec',
                    }

        sleepDelay = register_class.cDictDMTerminator(self,
                                                                    {'name' : 'Sleep Delay',
                                                                     'offset' : 0,
                                                                     'bit length' : 3 })

        sleepDelay.setReportDict(SDDict)


        b2.addChild(sleepDelay)

        b2.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Vout3V3 Prevent Sleep',
                                                                     'offset' : 3,
                                                                     'bit length' : 1 }))

        ICDict =  { 0x0 : '12 MHz (00b)',
#                    0x1 : '12 MHz (01b)',
#                    0x2 : '12 MHz (01b)',
                    0x3 : '8 MHz',
                    0x4 : '6 MHz',
                    0x5 : '4 MHz',
                    0x6 : '3 MHz',
                    0x7 : '1.5 MHz',
                    }

        ICReplaceDict =  { 0x1 : 0x0,
                           0x2 : 0x0,
                           }


        idleClock = register_class.cDictDMTerminator(self,
                                                                    {'name' : 'Idle Clock Rate',
                                                                     'offset' : 4,
                                                                     'bit length' : 3 })

        idleClock.setReportDict(SDDict)
        idleClock.setReplaceDict(ICReplaceDict)


        b2.addChild(idleClock)


        b2.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Allow Sleep in non-PD Connection',
                                                                     'offset' : 7,
                                                                     'bit length' : 1 }))

        b3 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'SPS Power Management',
                                             'offset' : 16,
                                             'bit length' : 8 })
        self.dataModel.addChild(b3)


        b3.addChild(register_class.cDataModelTerminator(self,
                                                                    {'name' : 'I2C Response Threshold',
                                                                     'offset' : 0,
                                                                     'bit length' : 3 }))

        b3.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Disable I2C Response Threshold',
                                                                     'offset' : 3,
                                                                     'bit length' : 1 }))


        b3.addChild(register_class.cDataModelTerminator(self,
                                                                    {'name' : 'Continuous ADC Threshold',
                                                                     'offset' : 4,
                                                                     'bit length' : 3 }))

        b4 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'WakeZ Control',
                                             'offset' : 24,
                                             'bit length' : 8 })
        self.dataModel.addChild(b4)


        b4.addChild(register_class.cDataModelTerminator(self,
                                                                    {'name' : 'WakeZ Threshold',
                                                                     'offset' : 0,
                                                                     'bit length' : 3 }))

        wakeZDur = register_class.cListDMTerminator(self,
                                                                    {'name' : 'WakeZ Duration',
                                                                     'offset' : 3,
                                                                     'bit length' : 2 })

        wakeZDur.setReportList(['10 mSec', \
                                '20 mSec', \
                                '50 mSec', \
                                '100 mSec', \
                                ])

        b4.addChild(wakeZDur)


        b5 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'Policy Modes',
                                             'offset' : 32,
                                             'bit length' : 8 })
        self.dataModel.addChild(b5)


        srcPM = register_class.cListDMTerminator(self,
                                                                    {'name' : 'Source Policy Mode',
                                                                     'offset' : 0,
                                                                     'bit length' : 2 })

        srcPM.setMaxValue(0x2)

        srcPM.setReportList(['Source Automatic Mode', \
                                'Source Policy Master Mode', \
                                'Source Policy Slave Mode', \
                                ])

        b5.addChild(srcPM)


        snkPM = register_class.cListDMTerminator(self,
                                                                    {'name' : 'Sink Policy Mode',
                                                                     'offset' : 2,
                                                                     'bit length' : 1 })

        snkPM.setReportList(['Sink Automatic Mode', \
                                'Sink Intrusive Mode', \
                                ])

        b5.addChild(snkPM)


        AmPM = register_class.cListDMTerminator(self,
                                                                    {'name' : 'AM Policy Mode',
                                                                     'offset' : 3,
                                                                     'bit length' : 2 })

        AmPM.setReportList(['AM Policy Auto DFP Auto UFP', \
                                'AM Policy Auto DFP Intrusive UFP', \
                                'AM Policy Intrusive DFP Auto UFP', \
                                'AM Policy Intrusive DFP Intrusive UFP', \
                                ])

        b5.addChild(AmPM)


        b5.addChild(register_class.cBooleanDMTerminator(self,
                                                      {'name' : 'SRDY Clear Dead Battery',
                                                        'offset' : 5,
                                                        'bit length' : 1 }))

        PPM = register_class.cListDMTerminator(self,
                                                                    {'name' : 'Power Policy Manager Settings',
                                                                     'offset' : 6,
                                                                     'bit length' : 2 })

        PPM.setMaxValue(0x2)

        PPM.setReportList(['Power Policy No External Manager', \
                                'Power Policy SRDO No Wait', \
                                'Power Policy SRDO Wait', \
                                ])

        b5.addChild(PPM)


        b6 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'USB/PD Features',
                                             'offset' : 40,
                                             'bit length' : 8 })
        self.dataModel.addChild(b6)



        b6.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Disable PD',
                                                                     'offset' : 0,
                                                                     'bit length' : 1 }))

        b6.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Rp Diode Disable',
                                                                     'offset' : 1,
                                                                     'bit length' : 1 }))

        b6.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'No Automatic Cable ID Request',
                                                                     'offset' : 2,
                                                                     'bit length' : 1 }))

        b6.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Automatic Capabilities Request',
                                                                     'offset' : 3,
                                                                     'bit length' : 1 }))

        b6.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Attempt VCONN Swap From Provider',
                                                                     'offset' : 4,
                                                                     'bit length' : 1 }))

        b6.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Attempt VCONN Swap To Privder',
                                                                     'offset' : 5,
                                                                     'bit length' : 1 }))

        b6.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Auto VCONN Disable',
                                                                     'offset' : 6,
                                                                     'bit length' : 1 }))

        b7_8 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'USB Configuration',
                                             'offset' : 48,
                                             'bit length' : 16 })
        self.dataModel.addChild(b7_8)


        USB2ufp = register_class.cListDMTerminator(self,
                                                                    {'name' : 'USB2 UFP Policy',
                                                                     'offset' : 0,
                                                                     'bit length' : 2 })

        USB2ufp.setReportList(['USB2 UFP Disabled', \
                                'USB2 UFP Billboard Normal', \
                                'USB2 UFP EP', \
                                'USB2 UFP RP', \
                                ])

        b7_8.addChild(USB2ufp)


        USB3ufp = register_class.cListDMTerminator(self,
                                                                    {'name' : 'USB3 UFP Policy',
                                                                     'offset' : 2,
                                                                     'bit length' : 2 })

        USB3ufp.setMaxValue(0x2)

        USB3ufp.setReportList(['USB3 UFP Disabled', \
                                'USB3 UFP Follow USB RP', \
                                'USB3 UFP Always Enabled', \
                                ])

        b7_8.addChild(USB3ufp)


        USB3gen = register_class.cListDMTerminator(self,
                                                                    {'name' : 'USB3 Gen Support',
                                                                     'offset' : 4,
                                                                     'bit length' : 2 })

        USB3gen.setReportList(['USB3 Generation Normal', \
                                'USB3 Force Generation 1', \
                                'USB3 Discover, Assume Generation 2', \
                                'USB3 Discover, Assume Generation 1', \
                                ])

        b7_8.addChild(USB3gen)


        b7_8.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'BC1.2 Disable',
                                                                     'offset' : 6,
                                                                     'bit length' : 1 }))

        b7_8.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Self Powered',
                                                                     'offset' : 7,
                                                                     'bit length' : 1 }))

        b7_8.addChild(cSRCPolPowField(self,
                                                      {'name' : 'Max Power',
                                                        'offset' : 8,
                                                        'bit length' : 8 }))

        b9_11 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'Current Settings',
                                             'offset' : 64,
                                             'bit length' : 24 })
        self.dataModel.addChild(b9_11)


        b9_11.addChild(c20mACurrentField(self,
                                                      {'name' : 'Non-PD Output Current',
                                                        'offset' : 0,
                                                        'bit length' : 8 }))

        b9_11.addChild(register_class.cDataModelTerminator(self,
                                                      {'name' : 'Internal Current Limit',
                                                        'offset' : 8,
                                                        'bit length' : 4 }))

        b9_11.addChild(register_class.cDataModelTerminator(self,
                                                      {'name' : 'External Current Limit',
                                                        'offset' : 12,
                                                        'bit length' : 4 }))

        b9_11.addChild(register_class.cDataModelTerminator(self,
                                                      {'name' : 'Fixed Current Limit 5V',
                                                        'offset' : 16,
                                                        'bit length' : 4 }))

        b9_11.addChild(register_class.cDataModelTerminator(self,
                                                      {'name' : 'Fixed Current Limit HV',
                                                        'offset' : 20,
                                                        'bit length' : 4 }))

        b12 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'Source/Sink Capabilities Configuration',
                                             'offset' : 88,
                                             'bit length' : 8 })
        self.dataModel.addChild(b12)


        usbSusDict = { 0x0 : 'Do not set No USB Suspend bit',
                       0x2 : 'Set No USB Suspend bit, SRC contract always valid',
                        0x3 : 'Set No USB Suspend bit, USB Suspend cleared by host' }

        usbSusSink = register_class.cDictDMTerminator(self,
                                                      {'name' : 'USB Suspend Sink Policy',
                                                        'offset' : 0,
                                                        'bit length' : 2 })

        usbSusSink.setReportDict(usbSusDict)
        b12.addChild(usbSusSink)

        usbSusSrcDict = { 0x0 : 'Do not set USB Suspend Supported bit',
                       0x2 : 'Set USB Suspend Supported bit, No Action if Sink Disagrees',
                        0x3 : 'Set USB Suspend Supported bit, Resend if Sink Disagrees' }

        usbSusSrc = register_class.cDictDMTerminator(self,
                                                      {'name' : 'USB Suspend Source Policy',
                                                        'offset' : 2,
                                                        'bit length' : 2 })

        usbSusSrc.setReportDict(usbSusSrcDict)
        b12.addChild(usbSusSrc)


        b12.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Data Role Swap Capable',
                                                                     'offset' : 4,
                                                                     'bit length' : 1 }))

        b12.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Dual Role Power Capable',
                                                                     'offset' : 5,
                                                                     'bit length' : 1 }))

        b12.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Externally Powered',
                                                                     'offset' : 6,
                                                                     'bit length' : 1 }))

        # B13-16: Minimum input current requirement
        b13_16 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'Minimum Input Current Requirement',
                                             'offset' : 96,
                                             'bit length' : 32 })
        self.dataModel.addChild(b13_16)


        b13_16.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Enable MICR',
                                                                     'offset' : 0,
                                                                     'bit length' : 1 }))

        b13_16.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'MICR Type-C 1.5 A Okay',
                                                                     'offset' : 1,
                                                                     'bit length' : 1 }))

        b13_16.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'MICR Type-C 3 A Okay',
                                                                     'offset' : 2,
                                                                     'bit length' : 1 }))

        b13_16.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'MICR USB EP Okay',
                                                                     'offset' : 3,
                                                                     'bit length' : 1 }))

        b13_16.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'MICR BC1.2 DCP Okay',
                                                                     'offset' : 4,
                                                                     'bit length' : 1 }))

        b13_16.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'MICR BC1.2 CDP Okay',
                                                                     'offset' : 5,
                                                                     'bit length' : 1 }))


        b17 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'General String Pointers',
                                             'offset' : 128,
                                             'bit length' : 8 })
        self.dataModel.addChild(b17)


        b17.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Serial String Present',
                                                                     'offset' : 0,
                                                                     'bit length' : 1 }))

        b17.addChild(register_class.cDecimalDMTerminator(self,
                                                      {'name' : 'Product String Index',
                                                        'offset' : 1,
                                                        'bit length' : 2 }))

        b17.addChild(register_class.cDecimalDMTerminator(self,
                                                      {'name' : 'Manufacturer String Index',
                                                        'offset' : 3,
                                                        'bit length' : 2 }))

        b17.addChild(register_class.cDecimalDMTerminator(self,
                                                      {'name' : 'Billboard String Index',
                                                        'offset' : 5,
                                                        'bit length' : 3 }))

        b18_19 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'Sink VBUS UVP/OVP Configuration',
                                             'offset' : 136,
                                             'bit length' : 16 })
        self.dataModel.addChild(b18_19)


        b18_19.addChild(cUVPTrip5V(self,
                                                      {'name' : 'UVP Trip Point 5V',
                                                        'offset' : 0,
                                                        'bit length' : 3 }))

        b18_19.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'UVP Trip Point 5V is HV',
                                                                     'offset' : 3,
                                                                     'bit length' : 1 }))

        UVPUsageHV = register_class.cListDMTerminator(self,
                                                      {'name' : 'UVP Usage HV',
                                                        'offset' : 5,
                                                        'bit length' : 3 })

        UVPPerList = ['Nominal - 5%', 'Nominal - 10%', 'Nominal - 15%', 'Nominal - 20%', 'Nominal - 25%',
                      'Nominal - 30%', 'Nominal - 40%', 'Nominal - 50%']

        UVPUsageHV.setReportList(UVPPerList)
        b18_19.addChild(UVPUsageHV)

    # B19: Sink VBUS OVP Config


        b18_19.addChild(cOVPTrip(self,
                                                      {'name' : 'OVP Trip Point',
                                                        'offset' : 8,
                                                        'bit length' : 6 }))


        OVPUsage = register_class.cListDMTerminator(self,
                                                      {'name' : 'OVP Usage',
                                                        'offset' : 14,
                                                        'bit length' : 2 })

        OVPUsage.setReportList(['OVP Trip Point', 'Max Voltage + 5%', 'Max Voltage + 10%', 'Max Voltage + 15%'])


        b18_19.addChild(OVPUsage)

    # B20: Miscellaneous configuration

        b20 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'Miscellaneous Configuration',
                                             'offset' : 152,
                                             'bit length' : 8 })
        self.dataModel.addChild(b20)

        hVoltWarnList = ['Nominal + 10%', 'Nominal + 20%']

        lVoltWarnList = ['Nominal - 10%', 'Nominal - 20%']

        hVWL = register_class.cListDMTerminator(self,
                                                                    {'name' : 'High Voltage Warning Level',
                                                                     'offset' : 0,
                                                                     'bit length' : 1 })
        hVWL.setReportList(hVoltWarnList)

        b20.addChild(hVWL)

        lVWL = register_class.cListDMTerminator(self,
                                                                    {'name' : 'Low Voltage Warning Level',
                                                                     'offset' : 1,
                                                                     'bit length' : 1 })
        lVWL.setReportList(lVoltWarnList)

        b20.addChild(lVWL)


        b20.addChild(register_class.cDataModelTerminator(self,
                                                                    {'name' : 'Input Disable Urgent Events',
                                                                     'offset' : 3,
                                                                     'bit length' : 1 }))

        b20.addChild(register_class.cDataModelTerminator(self,
                                                                    {'name' : 'Input Disable Voltage Transition',
                                                                     'offset' : 4,
                                                                     'bit length' : 2 }))

        b20.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'SWD Disable',
                                                                     'offset' : 7,
                                                                     'bit length' : 1 }))
        b21_23 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'Lock Control',
                                             'offset' : 160,
                                             'bit length' : 24 })
        self.dataModel.addChild(b21_23)

    # B21-23: Lock control bytes
        for i in range(23) :
            b21_23.addChild(register_class.cBooleanDMTerminator(self,
                                                                        {'name' : 'Lock SysConfig Byte %d' %(i+1),
                                                                         'offset' : i,
                                                                         'bit length' : 1 }))

        b21_23.addChild(register_class.cDataModelTerminator(self,
                                                                    {'name' : 'Lock SysConfig Bytes 31-48',
                                                                     'offset' : 23,
                                                                     'bit length' : 1 }))

    # B24-25: Miscellaneous hardware configuration (always LOCKed)
        b24_25 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'Miscellaneous Hardware Configuration',
                                             'offset' : 184,
                                             'bit length' : 16 })
        self.dataModel.addChild(b24_25)

        pcList = ['Standard USB2 Only Type-C Receptacle',
                  'Standard Full Type-C Receptacle',
                  'Tethered USB2 Only Type-C Plug',
                  'Tethered Full Type-C Plug']

        portConn = register_class.cListDMTerminator(self,
                                                                    {'name' : 'Port Connection',
                                                                     'offset' : 0,
                                                                     'bit length' : 2 })
        portConn.setReportList(pcList)

        b24_25.addChild(portConn)


        b24_25.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'USB Comms Capable',
                                                                     'offset' : 2,
                                                                     'bit length' : 1 }))

        bbMode = register_class.cListDMTerminator(self,
                                                                    {'name' : 'Billboard Mode',
                                                                     'offset' : 3,
                                                                     'bit length' : 1 })

        bbMode.setReportList(['USB EP Path for Billboard', 'USB RP Path for Billboard'])
        b24_25.addChild(bbMode)

        pcList = ['100%', '150%', '200% (10b)', '200% (11b)' ]

        peakCurr = register_class.cListDMTerminator(self,
                                                                    {'name' : 'Peak Current Usage',
                                                                     'offset' : 6,
                                                                     'bit length' : 2 })

        peakCurr.setReportList(pcList)

        b24_25.addChild(peakCurr)

        vout3V3list = ['VOUT 3V3 Always Off', 'VOUT 3V3 Always On', 'VOUT 3V3 On Demand, IPD off', 'VOUT 3V3 On Demand, IPD on' ]

        vout3V3 = register_class.cListDMTerminator(self,
                                                                    {'name' : 'Vout 3V3 Config',
                                                                     'offset' : 8,
                                                                     'bit length' : 2 })

        vout3V3.setReportList(vout3V3list)

        b24_25.addChild(vout3V3)

        b24_25.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Vout 3V3 enabled when USB RP active',
                                                                     'offset' : 10,
                                                                     'bit length' : 1 }))

        b24_25.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Vout 3V3 enabled when USB3Connection Bit set',
                                                                     'offset' : 11,
                                                                     'bit length' : 1 }))

        b24_25.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'SPI Read Only',
                                                                     'offset' : 15,
                                                                     'bit length' : 1 }))

    # B26: I2C2 address override configuration (always LOCKed)
        b26 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'I2C Address Override Configuration',
                                             'offset' : 200,
                                             'bit length' : 8 })
        self.dataModel.addChild(b26)


        b26.addChild(register_class.cDataModelTerminator(self,
                                                                    {'name' : 'I2C2 Address Override Ace_ID',
                                                                     'offset' : 0,
                                                                     'bit length' : 3 }))

        b26.addChild(register_class.cDataModelTerminator(self,
                                                                    {'name' : 'I2C2 Address Override Debug Ctl1',
                                                                     'offset' : 3,
                                                                     'bit length' : 1 }))

        b26.addChild(register_class.cDataModelTerminator(self,
                                                                    {'name' : 'I2C2 Address Override Debug Ctl2',
                                                                     'offset' : 4,
                                                                     'bit length' : 1 }))

        b26.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'I2C2 All-ace Override',
                                                                     'offset' : 6,
                                                                     'bit length' : 1 }))

        b26.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'I2C2 One-Ace Override',
                                                                     'offset' : 7,
                                                                     'bit length' : 1 }))

    # B27: Reserved hardware configuration (always LOCKed)
        b27 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'SysConfig RFU',
                                             'offset' : 208,
                                             'bit length' : 8 })
        self.dataModel.addChild(b27)

        b27.addChild(register_class.cDataModelTerminator(self,
                                                                    {'name' : 'SysConfig RFU',
                                                                     'offset' : 0,
                                                                     'bit length' : 8 }))

    # B28: Reverse current protection configuration (always LOCKed)
    # B29: Power switch direction (always LOCKed)
        b28_29 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'Power Switch Configuration',
                                             'offset' : 216,
                                             'bit length' : 16 })
        self.dataModel.addChild(b28_29)

        ppRcpList = ['RCP Disabled', 'RCP Enabled, Load None', 'RCP Enabled, Load 1x', 'RCP Enabled, Load 2x' ]

        pp5vRcp = register_class.cListDMTerminator(self,
                                                                    {'name' : 'PP 5V RCP',
                                                                     'offset' : 0,
                                                                     'bit length' : 2 })

        pp5vRcp.setReportList(ppRcpList)

        b28_29.addChild(pp5vRcp)

        ppHvRcp = register_class.cListDMTerminator(self,
                                                                    {'name' : 'PP HV RCP',
                                                                     'offset' : 4,
                                                                     'bit length' : 2 })

        ppHvRcp.setReportList(ppRcpList)

        b28_29.addChild(ppHvRcp)

        ppExtRcp = register_class.cListDMTerminator(self,
                                                                    {'name' : 'PP HV EXT RCP',
                                                                     'offset' : 6,
                                                                     'bit length' : 2 })

        ppExtRcp.setReportList(ppRcpList)

        b28_29.addChild(ppExtRcp)

        outSwitchList = ['Disabled', 'Output']

        pp5Vconf = register_class.cListDMTerminator(self,
                                                                    {'name' : 'PP 5V Config',
                                                                     'offset' : 8,
                                                                     'bit length' : 1 })
        pp5Vconf.setReportList(outSwitchList)
        b28_29.addChild(pp5Vconf)


        cableSwitchList = ['Disabled', 'Output, 4.75-5.5V guaranteed', 'Output, 4.75-5.5V not guaranteed']

        ppCableconf = register_class.cListDMTerminator(self,
                                                                    {'name' : 'PP Cable Config',
                                                                     'offset' : 10,
                                                                     'bit length' : 2 })
        ppCableconf.setMaxValue(0x2)
        ppCableconf.setReportList(cableSwitchList)
        b28_29.addChild(ppCableconf)

        HVSwitchList = ['Disabled', 'Output', 'Input', 'Input after SRDY']

        ppHVconf = register_class.cListDMTerminator(self,
                                                                    {'name' : 'PP HV Config',
                                                                     'offset' : 12,
                                                                     'bit length' : 2 })
        ppHVconf.setReportList(HVSwitchList)
        b28_29.addChild(ppHVconf)

        ppEXTconf = register_class.cListDMTerminator(self,
                                                                    {'name' : 'PP HV EXT Config',
                                                                     'offset' : 14,
                                                                     'bit length' : 2 })
        ppEXTconf.setReportList(HVSwitchList)
        b28_29.addChild(ppEXTconf)


    #B30: PP_EXT Configuration (always LOCKed)
        b30 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'Power Switch Configuration',
                                             'offset' : 232,
                                             'bit length' : 8 })
        self.dataModel.addChild(b30)


        rsense = register_class.cListDMTerminator(self,
                                                                    {'name' : 'RSENSE Config',
                                                                     'offset' : 0,
                                                                     'bit length' : 1 })

        rsense.setReportList(['5 mOhm', '10 mOhm'])
        b30.addChild(rsense)

        extFetDict = {0x0 : '10-31 uSec', 0x1 : '20-41 uSec', 0x2 : '80-181 uSec', 0x3 : '160-261 uSec',
                      0x4 : '640-1301 uSec', 0x5 : '1280-1941 uSec', 0x6 : '5.12-10.26 mSec', 0x7 : '10.24-15.38 uSec',
                      0x8 : '40.96-81.94 uSec', 0x9 : '81.92-122.0 mSec'}

        extFetTimer = register_class.cDictDMTerminator(self,
                                                                    {'name' : 'External FET Timer',
                                                                     'offset' : 2,
                                                                     'bit length' : 4 })

        extFetTimer.setReportDict(extFetDict)
        b30.addChild(extFetTimer)

        extFetTimer = register_class.cListDMTerminator(self,
                                                                    {'name' : 'External FET Recover',
                                                                     'offset' : 6,
                                                                     'bit length' : 2 })


        extFetTimer.setReportList(['USB type-C requirements only', '16x External FET Timer setting',
                                   '64x External FET Timer setting', '256x External FET Timer setting'])

        b30.addChild(extFetTimer)

    # B31-32: General Policy Config (Active)
        b31_32 = register_class.cDataModelArray(self, 1,
                                            {'name' : 'General Policy Config',
                                             'offset' : 240,
                                             'bit length' : 16 })
        self.dataModel.addChild(b31_32)


        typeCSM = register_class.cListDMTerminator(self,
                                                                    {'name' : 'Type-C State Machine',
                                                                     'offset' : 0,
                                                                     'bit length' : 2 })


        typeCSM.setReportList(['Sink', 'Source', 'DRP', 'Disabled'])

        b31_32.addChild(typeCSM)

        typeCCurr = register_class.cListDMTerminator(self,
                                                                    {'name' : 'Type-C Current',
                                                                     'offset' : 2,
                                                                     'bit length' : 2 })


        typeCCurr.setReportList(['Default Current', '1.5 A', '3.0 A', 'As Per First Source Capabilities PDO'])

        b31_32.addChild(typeCCurr)

        typeCOpt = register_class.cListDMTerminator(self,
                                                                    {'name' : 'Type-C Options',
                                                                     'offset' : 4,
                                                                     'bit length' : 2 })


        typeCOpt.setReportList(['No Optional States', 'Try.SRC is supported as DRP',
                                 'Try.SNK is supported as DRP', 'Powered Accessory when Sink'])

        b31_32.addChild(typeCOpt)

        b31_32.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Support Audio Accessory',
                                                                     'offset' : 6,
                                                                     'bit length' : 1 }))

        b31_32.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Support Debug Accessory',
                                                                     'offset' : 7,
                                                                     'bit length' : 1 }))


        powRole = register_class.cListDMTerminator(self,
                                                                    {'name' : 'Preferred Power Role',
                                                                     'offset' : 8,
                                                                     'bit length' : 2 })


        powRole.setReportList(['No Preference, PR_Swaps blocked', 'No Preference, PR_Swaps Accepted',
                                 'Sink Power Role Preferred', 'Source Power Role Preferred'])

        b31_32.addChild(powRole)

        datRole = register_class.cListDMTerminator(self,
                                                                    {'name' : 'Preferred Data Role',
                                                                     'offset' : 10,
                                                                     'bit length' : 2 })


        datRole.setReportList(['No Preference, DR_Swaps blocked', 'No Preference, DR_Swaps Accepted',
                                 'UFP Data Role Preferred', 'DFP Data Role Preferred'])

        b31_32.addChild(datRole)

        vconnRole = register_class.cListDMTerminator(self,
                                                                    {'name' : 'VCONN Swap Accept',
                                                                     'offset' : 12,
                                                                     'bit length' : 2 })


        vconnRole.setReportList(['VCONN Not Supported', 'VCONN Supported as DFP, UFP if Ext Powered',
                                 'VCONN Supported as DFP Only', 'VCONN Supported as DFP, UFP'])

        b31_32.addChild(vconnRole)


        for i in range(8) :
            self.dataModel.addChild(cGeneralPolicyArray(self, 1,
                                                        {'name' : 'General Policy Config for SPS 0x%x' %i,
                                                         'offset' : 256 + (i * 16),
                                                         'bit length' : 16 }))


def GPIODMGenerator(self) :
    eventListNum = self.getChildByName('Mapped Event').valueToInt()
    if eventListNum < len(self.GPIOEventDictList) and (eventListNum >= 0) :
        inout = self.GPIOEventDictList[eventListNum]['inout']
    else :
        inout = 'neither'

    if inout == 'output' :
        self.getChildByName('Output Enable').hide()
        self.getChildByName('Interrupt Enable').hide()
        self.getChildByName('Initial Value').unhide()
        self.getChildByName('Open Drain Output Enable').unhide()
        self.getChildByName('GPIO Output Level').unhide()
        self.getChildByName('Internal Pull Down Enable').unhide()
        self.getChildByName('Internal Pull Up Enable').unhide()
        self.getChildByName('Map Pin to GPIO or ADC').hide()
    elif inout == 'input' :
        self.getChildByName('Output Enable').hide()
        self.getChildByName('Interrupt Enable').hide()
        self.getChildByName('Initial Value').hide()
        self.getChildByName('Open Drain Output Enable').hide()
        self.getChildByName('GPIO Output Level').hide()
        self.getChildByName('Internal Pull Down Enable').unhide()
        self.getChildByName('Internal Pull Up Enable').unhide()
        self.getChildByName('Map Pin to GPIO or ADC').hide()
    else :
        self.getChildByName('Output Enable').hide()
        self.getChildByName('Interrupt Enable').hide()
        self.getChildByName('Initial Value').hide()
        self.getChildByName('Open Drain Output Enable').hide()
        self.getChildByName('GPIO Output Level').hide()
        self.getChildByName('Internal Pull Down Enable').hide()
        self.getChildByName('Internal Pull Up Enable').hide()
        self.getChildByName('Map Pin to GPIO or ADC').hide()

    return self.childrenAsListDMGenerator()




def GPIOEventSetFromInt(self, listNum):
    if listNum >= len(self.parent.GPIOEventDictList) :
        listNum = -2

    if listNum == -1 :
        self.parent.getChildByName('Output Enable').setFromInt(1)
        self.parent.getChildByName('Interrupt Enable').setFromInt(0)
        self.parent.getChildByName('Map Pin to GPIO or ADC').setFromInt(0)
        listNum = 0
        self.privateSetFromInt(listNum)
        return
    if listNum == -2 :
        self.parent.getChildByName('Output Enable').setFromInt(0)
        self.parent.getChildByName('Interrupt Enable').setFromInt(0)
        self.parent.getChildByName('Map Pin to GPIO or ADC').setFromInt(1)
        listNum = 0
        self.privateSetFromInt(listNum)
        return


    if self.parent.GPIOEventDictList[listNum]['inout'] == 'output' :
        self.parent.getChildByName('Output Enable').setFromInt(1)
        self.parent.getChildByName('Interrupt Enable').setFromInt(0)
        self.parent.getChildByName('Map Pin to GPIO or ADC').setFromInt(0)
    elif self.parent.GPIOEventDictList[listNum]['inout'] == 'input' :
        self.parent.getChildByName('Output Enable').setFromInt(0)
        self.parent.getChildByName('Interrupt Enable').setFromInt(1)
        self.parent.getChildByName('Map Pin to GPIO or ADC').setFromInt(0)
    else :
        # neither
        self.parent.getChildByName('Output Enable').setFromInt(0)
        self.parent.getChildByName('Interrupt Enable').setFromInt(0)
        self.parent.getChildByName('Map Pin to GPIO or ADC').setFromInt(1)

    self.privateSetFromInt(listNum)


def GPIOEventValueToInt(self) :
    # find the match to our GPIO
    # if there is no match and GPIO is enabled, this is -1 mapped without event
    #    if there is no match and GPIO is disabled, this is -2
    # So initialize as such and then search for match

    eventFromSearch = self.privateValueToInt()

    if eventFromSearch == 0 :
        if self.parent.getChildByName('Output Enable').valueToInt() == 1 :
            eventNum = -1
        else :
            eventNum = -2
    else :
        eventNum = eventFromSearch

    return eventNum


#  This covers the flag offsets
#  Have to append event record since it uses different offset structure
class cGPIOFlagOffsets(register_class.cDataModelArray):
    def __init__(self, register, tier, iDict):
        register_class.cDataModelArray.__init__(self, register, tier, iDict)

        enable = register_class.cBooleanDMTerminator(self.register,
                                                     {'name': 'Output Enable',
                                                      'offset': 0,
                                                      'bit length': 1})

        self.addChild(enable)

        maxVal = -2
        for event in iDict['GPIOEventDictList'][2:] :
            if 'number' in event :
                if event['number'] > maxVal :
                    maxVal = event['number']

        self.GPIOEventDictList = [ None for i in range(maxVal+1)] 
        

        for event in iDict['GPIOEventDictList'][2:] :
            if event['name'] != 'reserved' :
                self.GPIOEventDictList[event['number']] = event

        self.eventReportDict = {}
        self.eventReplaceDict = {}

        for eventDict in iDict['GPIOEventDictList'] :
            if (eventDict is not None) and (eventDict['name'] != 'reserved') :
                self.eventReportDict[eventDict['number']] = eventDict['name']


        intEnable = register_class.cBooleanDMTerminator(self.register,
                                                        {'name': 'Interrupt Enable',
                                                         'offset': 32,
                                                         'bit length': 1})

        self.addChild(intEnable)

        initData = register_class.cDataModelTerminator(self.register,
                                                       {'name': 'Initial Value',
                                                        'offset': 64,
                                                        'bit length': 1})

        self.addChild(initData)

        openDrain = register_class.cBooleanDMTerminator(self.register,
                                                        {'name': 'Open Drain Output Enable',
                                                         'offset': 96,
                                                         'bit length': 1})

        self.addChild(openDrain)

        ldo3P3 = register_class.cListDMTerminator(self.register,
                                                  {'name': 'GPIO Output Level',
                                                   'offset': 128,
                                                   'bit length': 1})

        ldo3P3.setReportList(['VDDIO', 'LDO3V3'])

        self.addChild(ldo3P3)

        intPullDown = register_class.cBooleanDMTerminator(self.register,
                                                          {'name': 'Internal Pull Down Enable',
                                                           'offset': 160,
                                                           'bit length': 1})

        self.addChild(intPullDown)

        intPullUp = register_class.cBooleanDMTerminator(self.register,
                                                        {'name': 'Internal Pull Up Enable',
                                                         'offset': 192,
                                                         'bit length': 1})

        self.addChild(intPullUp)

        hiZ = register_class.cListDMTerminator(self.register,
                                               {'name': 'Map Pin to GPIO or ADC',
                                                'offset': 224,
                                                'bit length': 1})

        hiZ.setReportList(['GPIO', 'ADC (Hi-Z)'])

        self.addChild(hiZ)

        # we don't have a real offset, but use as index to find correct mapping
        event = register_class.cDictDMTerminator(self.register,
                                                 {'name': 'Mapped Event',
                                                  'offset': 0,
                                                  'bit length': 6})

        event.setFixedOffset(256 + (self.offset * 8))

        event.setReportDict(self.eventReportDict)
        event.setReplaceDict(self.eventReplaceDict)

        # add hook to set ouput enable or interrupt enable as necessary
        event.setMethodSetFromInt(GPIOEventSetFromInt)
        event.setMethodValueToInt(GPIOEventValueToInt)

        event.addUpdateRegisterByName("self")

        self.addChild(event)

        self.setDataModelGenerator(GPIODMGenerator)



GPIOEventDictList = [
    {'name' : 'Disabled', 'inout' : 'neither', 'number': -2 },
    {'name' : 'Output Enabled Without Event', 'inout' : 'output', 'number': -1 },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name': 'Force On Vout3P3', 'inout': 'input', 'number': 1},
    {'name': 'WakeZ Event', 'inout': 'output', 'number': 2},
    {'name': 'FaultZ Event', 'inout': 'output', 'number': 3},
    {'name': 'Enable PP5V PPCable Event', 'inout': 'output', 'number': 4},
    {'name': 'Sink MICR Autonegotiate OK', 'inout': 'output', 'number': 5},
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name': 'Input Switch Enabled', 'inout': 'output', 'number': 9},
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name': 'Policy Master IRQ', 'inout': 'input', 'number': 16},
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'TBT Mode Entered', 'inout' : 'output', 'number': 19 },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name': 'Cable Polarity Upside Down', 'inout': 'output', 'number': 33},
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name': 'DisplayPort Mode Selected', 'inout': 'output', 'number': 51},
    {'name': 'USB3 Event', 'inout': 'output', 'number': 52},
    {'name': 'Plug Event', 'inout': 'output', 'number': 53},
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'reserved', 'inout' : 'neither' },
    {'name' : 'Ace Type-C State', 'inout' : 'input', 'number' : 56 },
    {'name': 'Source PDO1 Negotiated', 'inout': 'output', 'number': 57},
    {'name': 'Source PDO2 Negotiated', 'inout': 'output', 'number': 58},
    {'name': 'Source PDO3 Negotiated', 'inout': 'output', 'number': 59},
    {'name': 'Source PDO4 Negotiated', 'inout': 'output', 'number': 60},
    {'name': 'Source PDO Truth Table 0', 'inout': 'output', 'number': 61},
]

GPIOSpecialEventDictList = [
    [], # gpio 0
    [], # gpio 1
    [], # gpio 2
    [], # gpio 3
    [], # gpio 4
    [], # gpio 5
    [], # gpio 6
    [], # gpio 7
    [], # gpio 8
    [{'name': 'reserved', 'inout': 'neither', 'number': 62},
    {'name': 'RESETZ', 'inout': 'output', 'number': 63}], # gpio 9    
    [], # gpio 10
    [{'name': 'MRESET Active High', 'inout': 'input', 'number': 62},
    {'name': 'MRESET Active Low', 'inout': 'input', 'number': 63}], # gpio 11    
]

class cIOConfig_0x29_register(register_class.cRegister):
    def __init__(self):
        register_class.cRegister.__init__(self, {'register name': 'I/O Config',
                                                 'address': 0x29,
                                                 'byte length': 56,
                                                 'permission': 'RW'})

        self.NumMappableGPIO = 22

        self.dataModel = register_class.cDataModelArray(self, 2,
                                                        {'name': 'GPIO Event Map',
                                                         'offset': 0,
                                                         'bit length': 256})

        for i in range(self.NumMappableGPIO):
            thisGPIOEventDictList = GPIOEventDictList
            if i < len(GPIOSpecialEventDictList) :
                thisGPIOEventDictList.extend(GPIOSpecialEventDictList[i])
        
            gpioFlags = cGPIOFlagOffsets(self, 1,
                                         {'name': 'GPIO #%d' % (i),
                                          'offset': i,
                                          'bit length': 8 * (28 + self.NumMappableGPIO),
                                          'GPIOEventDictList': thisGPIOEventDictList })
            self.dataModel.addChild(gpioFlags)

        miscConfig = register_class.cDataModelArray(self, 1,
                                                    {'name': 'Miscellaneous I/O Configuration',
                                                     'offset': 432,
                                                     'bit length': 8})

        self.dataModel.addChild(miscConfig)

        i2c1rail = register_class.cListDMTerminator(self,
                                                    {'name': 'I2C1 RAIL Configuration',
                                                     'offset': 0,
                                                     'bit length': 1})

        i2c1rail.setReportList(['VDDIO', 'LDO_3V3'])

        miscConfig.addChild(i2c1rail)

        i2c2rail = register_class.cListDMTerminator(self,
                                                    {'name': 'I2C2 RAIL Configuration',
                                                     'offset': 1,
                                                     'bit length': 1})

        i2c2rail.setReportList(['VDDIO', 'LDO_3V3'])

        miscConfig.addChild(i2c2rail)

        uart1rail = register_class.cListDMTerminator(self,
                                                     {'name': 'UART1 RAIL Configuration',
                                                      'offset': 2,
                                                      'bit length': 1})

        uart1rail.setReportList(['VDDIO', 'LDO_3V3'])

        miscConfig.addChild(uart1rail)

        uart2rail = register_class.cListDMTerminator(self,
                                                     {'name': 'UART2 RAIL Configuration',
                                                      'offset': 3,
                                                      'bit length': 1})

        uart2rail.setReportList(['VDDIO', 'LDO_3V3'])

        miscConfig.addChild(uart2rail)

        hpd = register_class.cListDMTerminator(self,
                                               {'name': 'DP HPD Configuration',
                                                'offset': 4,
                                                'bit length': 2})

        hpd.setReportList(['GPIO4 = HPD Tx, GPIO5 = Normal GPIO',
                           'GPIO4 = HPD Rx, GPIO5 = Normal GPIO',
                           'GPIO4 = HPD Tx, GPIO5 = HPD Rx',
                           'GPIO4 = HPD Tx and Rx, GPIO5 = Normal GPIO',
                           ])

        miscConfig.addChild(hpd)

        i2cMasterConfig = register_class.cDataModelArray(self, 1,
                                                         {'name': 'I2C Master Configuration',
                                                          'offset': 440,
                                                          'bit length': 8})

        self.dataModel.addChild(i2cMasterConfig)

        i2cDM = register_class.cListDMTerminator(self,
                                                 {'name': 'I2C Data Mux',
                                                  'offset': 0,
                                                  'bit length': 3})

        i2cDM.setMaxValue(0x3)
        i2cDM.setReportList(['No I2C-controlled Data Mux',
                             'Type 1 Thunderbolt Controller Data Mux',
                             'Type 1 USB3/DP Data Mux',
                             'Type 2 Thunderbolt Controller Data Mux',
                             ])

        i2cMasterConfig.addChild(i2cDM)

        i2cDebM = register_class.cListDMTerminator(self,
                                                   {'name': 'I2C Debug Mux',
                                                    'offset': 4,
                                                    'bit length': 2})

        i2cDebM.setMaxValue(0x1)
        i2cDebM.setReportList(['No I2C-controlled Debug Mux',
                               'Type 1 Debug Mux Present',
                               ])

        i2cMasterConfig.addChild(i2cDebM)

        i2cDebM = register_class.cListDMTerminator(self,
                                                   {'name': 'I2C Audio Mux',
                                                    'offset': 6,
                                                    'bit length': 2})

        i2cDebM.setMaxValue(0x1)
        i2cDebM.setReportList(['No I2C-controlled Audio Mux',
                               'Type 1 Audio Mux Present',
                               ])

        i2cMasterConfig.addChild(i2cDebM)


# display pdos based on numPdo
# not a method, but should be grouped with txSrcCap class
def TxSrcCap_TopLevelDMGenerator(self) :
    HIDE_MANUAL = True

    numSrcPdoB0 = self.getChildByName('Bank 0 (manual) settings').getChildByName('Tx Source Bank 0 Config').getChildByName('Number of Source PDOs').valueToInt()
    numSrcPdoB1 = self.getChildByName('Bank 1 (automatic) settings').getChildByName('Tx Source Bank 1 Config').getChildByName('Number of Source PDOs').valueToInt()

    if HIDE_MANUAL :
        self.getChildByName('Bank 0 (manual) settings').getChildByName('Tx Source Bank 0 Config').getChildByName('Number of Source PDOs').hide()
        self.getChildByName('Bank 0 (manual) settings').hide()

    for i in range(7) :
        if i < numSrcPdoB0 :
            self.getChildByName('Bank 0 (manual) settings').getChildByName('Source PDO %d' %(i+1)).unhide()
        else :
            self.getChildByName('Bank 0 (manual) settings').getChildByName('Source PDO %d' %(i+1)).hide()

        if i < numSrcPdoB1 :
            self.getChildByName('Bank 1 (automatic) settings').getChildByName('Source PDO %d' %(i+1)).unhide()
        else :
            self.getChildByName('Bank 1 (automatic) settings').getChildByName('Source PDO %d' %(i+1)).hide()

    return self.childrenAsListDMGenerator()


def TxSinkCap_TopLevelDMGenerator(self):
    numSinkPdo = self.getChildByName('Sink PDO Count').getChildByName('Number of Sink PDOs').valueToInt()

    for i in range(6) :
        if i < numSinkPdo :
            self.getChildByName('Sink PDO %d' %(i+1)).unhide()
        else :
            self.getChildByName('Sink PDO %d' %(i+1)).hide()

    return self.childrenAsListDMGenerator()




class cTxSrcCap_0x32_register(register_class.cRegister) :
    def __init__(self):
        register_class.cRegister.__init__(self, {'register name' : 'Transmit Source Capabilities',
                                                 'address' : 0x32,
                                                 'byte length' : 61,
                                                 'permission' : 'RW'})

        self.dataModel = register_class.cDataModelArray(self, 2,
                                                        {'name' : 'Transmit Source Capabilities',
                                                        'offset' : 0,
                                                        'bit length' : 488 })

        Bank0Config = register_class.cDataModelArray(self, 2,
                                                      {'name' : 'Bank 0 (manual) settings',
                                                        'offset' : 0,
                                                        'bit length' : 248 })

        self.dataModel.addChild(Bank0Config)

        SrcPdoConfig0 = register_class.cDataModelArray(self, 1,
                                                      {'name' : 'Tx Source Bank 0 Config',
                                                        'offset' : 0,
                                                        'bit length' : 24 })

        Bank0Config.addChild(SrcPdoConfig0)


        SrcPdoConfig0.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Active PDO Bank',
                                                                     'offset' : 0,
                                                                     'bit length' : 1 }))

        SrcPdoConfig0.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Active PDO Bank Follows EP',
                                                                     'offset' : 1,
                                                                     'bit length' : 1 }))

        SrcPdoConfig0.addChild(register_class.cDataModelTerminator(self,
                                                                    {'name' : 'Update PDO Bank Contents',
                                                                     'offset' : 5,
                                                                     'bit length' : 2 }))

        numSrcBnk0 = register_class.cDecimalDMTerminator(self,
                                                                  {'name' : 'Number of Source PDOs',
                                                                   'offset' : 8,
                                                                   'bit length' : 3 })
        numSrcBnk0.addUpdateRegisterByName("self")

        SrcPdoConfig0.addChild(numSrcBnk0)

        SrcPDO10SwitchSource = register_class.cListDMTerminator( self,
                                                                {'name' : 'Switch Source',
                                                                 'offset' : 0,
                                                                 'bit length' : 2})

        SrcPDO10SwitchSource.setReportList(['Internal 5 volt Power Path (PP_5V)(00b)', 'Internal High Voltage Power Path (PP_HV)', 'Internal 5 volt Power Path (PP_5V)(10b)', 'External High Voltage Power Path (PP_HVE)'])
        SrcPDO10SwitchSource.setFixedOffset(16)


        sPdo10 = cDMSourcePdo1Array(self, 1, {'name' : 'Source PDO 1',
                                                    'offset' : 24,
                                                    'bit length' : 32 })

        sPdo10.prependChild(SrcPDO10SwitchSource)

        Bank0Config.addChild(sPdo10)
        # need to figure out a more consistent approach, but can't initialize the value until it is placed in register
        sPdo10.getChildByName('Voltage').setFromInt(100)
        sPdo10.getChildByName('Supply Type').setFromInt(0)

        for i in range(2,8) :
            SrcPDOX0 = cDMAnySourcePdoArray(self, 1,
                                           {'name' : 'Source PDO %d' %i,
                                            'offset' : 24 + ( (i-1) * 32 ),
                                            'bit length' : 32 })

            SrcPDOXSwitchSource0 = register_class.cListDMTerminator( self,
                                                                    {'name' : 'Switch Source',
                                                                     'offset' : 0,
                                                                     'bit length' : 1})

            SrcPDOXSwitchSource0.setReportList(['Internal High Voltage Power Path (PP_HV)', 'External High Voltage Power Path (PP_HVE)'])
            SrcPDOXSwitchSource0.setFixedOffset(16 + i)

            SrcPDOX0.prependChild(SrcPDOXSwitchSource0)

            Bank0Config.addChild(SrcPDOX0)


        Bank1Config = register_class.cDataModelArray(self, 2,
                                                      {'name' : 'Bank 1 (automatic) settings',
                                                        'offset' : 248,
                                                        'bit length' : 240 })

        self.dataModel.addChild(Bank1Config)

        SrcPdoConfig1 = register_class.cDataModelArray(self, 1,
                                                      {'name' : 'Tx Source Bank 1 Config',
                                                        'offset' : 0,
                                                        'bit length' : 16 })

        Bank1Config.addChild(SrcPdoConfig1)


        numSrcBnk1 = register_class.cDecimalDMTerminator(self,
                                                                  {'name' : 'Number of Source PDOs',
                                                                   'offset' : 0,
                                                                   'bit length' : 3 })
        numSrcBnk1.updateRegisters.append(self)

        SrcPdoConfig1.addChild(numSrcBnk1)

        SrcPDO11SwitchSource = register_class.cListDMTerminator( self,
                                                                {'name' : 'Switch Source',
                                                                 'offset' : 0,
                                                                 'bit length' : 2})

        SrcPDO11SwitchSource.setReportList(['Internal 5 volt Power Path (PP_5V)(00b)', 'Internal High Voltage Power Path (PP_HV)', 'Internal 5 volt Power Path (PP_5V)(10b)', 'External High Voltage Power Path (PP_HVE)'])
        SrcPDO11SwitchSource.setFixedOffset(256)


        sPdo11 = cDMSourcePdo1Array(self, 1, {'name' : 'Source PDO 1',
                                                    'offset' : 16,
                                                    'bit length' : 32 })

        sPdo11.prependChild(SrcPDO11SwitchSource)

        Bank1Config.addChild(sPdo11)

        # need to figure out a more consistent approach, but can't initialize the value until it is placed in register
        sPdo11.getChildByName('Voltage').setFromInt(100)
        sPdo11.getChildByName('Supply Type').setFromInt(0)

        for i in range(2,8) :
            SrcPDOX1 = cDMAnySourcePdoArray(self, 1,
                                           {'name' : 'Source PDO %d' %i,
                                            'offset' : 16 + ( (i-1) * 32 ),
                                            'bit length' : 32 })

            SrcPDOXSwitchSource1 = register_class.cListDMTerminator( self,
                                                                    {'name' : 'Switch Source',
                                                                     'offset' : 0,
                                                                     'bit length' : 1})

            SrcPDOXSwitchSource1.setReportList(['Internal High Voltage Power Path (PP_HV)', 'External High Voltage Power Path (PP_HVE)'])
            SrcPDOXSwitchSource1.setFixedOffset(256 + i)

            SrcPDOX1.prependChild(SrcPDOXSwitchSource1)

            Bank1Config.addChild(SrcPDOX1)

        self.dataModel.setDataModelGenerator(TxSrcCap_TopLevelDMGenerator)



class cTxSinkCap_0x33_register(register_class.cRegister) :
    def __init__(self):
        register_class.cRegister.__init__(self, {'register name' : 'Transmit Sink Capabilities',
                                                 'address' : 0x33,
                                                 'byte length' : 29,
                                                 'permission' : 'RW'})

        self.dataModel = register_class.cDataModelArray(self, 2,
                                                        {'name' : 'Transmit Sink Capabilities',
                                                        'offset' : 0,
                                                        'bit length' : 232 })

        SrcPdoConfig = register_class.cDataModelArray(self, 1,
                                                      {'name' : 'Sink PDO Count',
                                                        'offset' : 0,
                                                        'bit length' : 8 })

        self.dataModel.addChild(SrcPdoConfig)

        numSinkTerm = register_class.cDecimalDMTerminator(self,
                                                          {'name' : 'Number of Sink PDOs',
                                                           'offset' : 0,
                                                           'bit length' : 3 })
        numSinkTerm.addUpdateRegisterByName("self")

        # TODO: set max allowable value to 6 (instead of 0-7 from 3 bits)
        SrcPdoConfig.addChild(numSinkTerm)

        sPdo1 = cDMSinkPdo1Array(self, 1, {'name' : 'Sink PDO 1',
                                        'offset' : 8,
                                        'bit length' : 32 })

        self.dataModel.addChild(sPdo1)
        # need to figure out a more consistent approach, but can't initialize the value until it is placed in register
        sPdo1.getChildByName('Voltage').setFromInt(100)
        sPdo1.getChildByName('Supply Type').setFromInt(0)

        for i in range(2,7) :
            SnkPDOX = cDMAnySinkPdoArray(self, 1,
                                           {'name' : 'Sink PDO %d' %i,
                                            'offset' : 8 + ( (i-1) * 32 ),
                                            'bit length' : 32 })

            self.dataModel.addChild(SnkPDOX)

        self.dataModel.setDataModelGenerator(TxSinkCap_TopLevelDMGenerator)


class cANRangeArray(register_class.cDataModelArray) :
    def __init__(self, register, tier, iDict):
        register_class.cDataModelArray.__init__(self, register, tier, iDict)

        self.addChild(cPDOVoltageField( self.register,  { 'name' : 'Minimum Voltage',
                                                                'offset' : 0,
                                                                'bit length' : 10}))

        self.addChild(cPDOVoltageField( self.register,  { 'name' : 'Maximum Voltage',
                                                                'offset' : 10,
                                                                'bit length' : 10}))

        self.addChild(cPDOCurrentField( self.register,  { 'name' : 'Maximum Current',
                                                                'offset' : 20,
                                                                'bit length' : 10}))

        anPolicy = register_class.cListDMTerminator( self.register,  { 'name' : 'AutoNegotiate Policy',
                                                                'offset' : 30,
                                                                'bit length' : 1})
        anPolicy.setReportList(['Policy 0', 'Policy 1'])

        self.addChild(anPolicy)

        anPath = register_class.cListDMTerminator( self.register,  { 'name' : 'AutoNegotiate Path',
                                                                'offset' : 31,
                                                                'bit length' : 1})
        anPath.setReportList(['Internal High-Voltage Path (PP_HV)', 'External High-Voltage Path (PP_EXT)'])

        self.addChild(anPath)


def AutonegSink_TopLevelDMGenerator(self):
    numAutoneg = self.getChildByName('AutoNegotiate Sink Configuration').getChildByName(
        'AutoNegotiate Dual Range').valueToInt() + 1

    if numAutoneg == 1 :
        self.getChildByName('AutoNegotiate Range 1').hide()
    else :
        self.getChildByName('AutoNegotiate Range 1').unhide()

    return self.childrenAsListDMGenerator()


class cAutoNegotiateSink_0x37_register(register_class.cRegister) :
    def __init__(self):
        register_class.cRegister.__init__(self, {'register name' : 'AutoNegotiate Sink Control',
                                                 'address' : 0x37,
                                                 'byte length' : 12,
                                                 'permission' : 'RW'})

        self.dataModel = register_class.cDataModelArray(self, 2,
                                                        {'name' : 'AutoNegotiate Sink Control',
                                                        'offset' : 0,
                                                        'bit length' : 96 })

        anSinkConfig = register_class.cDataModelArray(self, 1,
                                                      {'name' : 'AutoNegotiate Sink Configuration',
                                                        'offset' : 0,
                                                        'bit length' : 32 })

        self.dataModel.addChild(anSinkConfig)

        anRDOPolicy = register_class.cListDMTerminator(self,
                                                        {'name' : 'AutoNegotiate RDO Policy',
                                                         'offset' : 0,
                                                         'bit length' : 2 })

        anRDOPolicy.setReportList(['GiveBack flag not set, Max and Operating set to Max Calc', \
                                   'GiveBack flag not set, Max set to Max Calc, Operating set to Min Calc', \
                                   'GiveBack flag set, Operating set to Max Calc, Min set to Min Calc', \
                                   'GiveBack flag set, Max and Operating set to Min Calc'])

        anSinkConfig.addChild(anRDOPolicy)

        anMaxPowMismatch = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'AN Max Power for Mismatch',
                                                         'offset' : 2,
                                                         'bit length' : 1 })

        anSinkConfig.addChild(anMaxPowMismatch)

        anEnSwitch = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'AN Enable Switch Only',
                                                         'offset' : 3,
                                                         'bit length' : 1 })

        anSinkConfig.addChild(anEnSwitch)


        anRDOPriority = register_class.cListDMTerminator(self,
                                                        {'name' : 'AutoNegotiate RDO Priority',
                                                         'offset' : 4,
                                                         'bit length' : 1 })

        anRDOPriority.setReportList(['Choose highest power, break tie with highest min voltage', \
                                   'Choose highest power, break tie with lowest max voltage'])

        anSinkConfig.addChild(anRDOPriority)

        anDualRange = register_class.cListDMTerminator(self,
                                                        {'name' : 'AutoNegotiate Dual Range',
                                                         'offset' : 7,
                                                         'bit length' : 1 })

        anDualRange.setReportList(['One Autonegotiate Range', 'Two Autonegotiate Ranges'])
        anDualRange.addUpdateRegisterByName("self")
        anSinkConfig.addChild(anDualRange)

        anMinPower = cAutonegPowerField(self,
                                                        {'name' : 'AutoNegotiate Minimum Power',
                                                         'offset' : 8,
                                                         'bit length' : 12 })
        anSinkConfig.addChild(anMinPower)

        anMaxPower = cAutonegPowerField(self,
                                                        {'name' : 'AutoNegotiate Maximum Power',
                                                         'offset' : 20,
                                                         'bit length' : 12 })
        anSinkConfig.addChild(anMaxPower)


        anRange0 = cANRangeArray(self, 1,
                                                      {'name' : 'AutoNegotiate Range 0',
                                                        'offset' : 32,
                                                        'bit length' : 32 })

        self.dataModel.addChild(anRange0)

        anRange1 = cANRangeArray(self, 1,
                                                      {'name' : 'AutoNegotiate Range 1',
                                                        'offset' : 64,
                                                        'bit length' : 32 })

        self.dataModel.addChild(anRange1)

        self.dataModel.setDataModelGenerator(AutonegSink_TopLevelDMGenerator)


class cSrcPolicyMasterAutonegSrc_0x38_register(register_class.cRegister) :
    def __init__(self):
        register_class.cRegister.__init__(self, {'register name' : 'SRC Policy Master Autonegotiate Source',
                                                 'address' : 0x38,
                                                 'byte length' : 14,
                                                 'permission' : 'RW'})

        self.dataModel = register_class.cDataModelArray(self, 2,
                                                        {'name' : 'SRC Policy Master Autonegotiate Source',
                                                        'offset' : 0,
                                                        'bit length' : 112 })

        current5V = register_class.cDataModelArray(self, 1,
                                                      {'name' : '5V VBUS Current',
                                                        'offset' : 0,
                                                        'bit length' : 32 })

        self.dataModel.addChild(current5V)

        v5VMaxCurrent = cSRCPolCurrentField(self,
                                                        {'name' : '5V Max Current',
                                                         'offset' : 0,
                                                         'bit length' : 8 })
        current5V.addChild(v5VMaxCurrent)

        v5VMinCurrent = cSRCPolCurrentField(self,
                                                        {'name' : '5V Min Current',
                                                         'offset' : 8,
                                                         'bit length' : 8 })
        current5V.addChild(v5VMinCurrent)

        v5VExtraCurrent = cSRCPolCurrentField(self,
                                                        {'name' : '5V Extra Current',
                                                         'offset' : 16,
                                                         'bit length' : 16 })
        current5V.addChild(v5VExtraCurrent)

#        currentVCONN = register_class.cDataModelArray(self, 1,
#                                                      {'name' : 'VCONN Current',
#                                                        'offset' : 32,
#                                                        'bit length' : 32 })
#        self.dataModel.addChild(currentVCONN)

#        vConnMaxCurrent = cSRCPolCurrentField(self,
#                                                        {'name' : 'VConn Max Current',
#                                                         'offset' : 0,
#                                                         'bit length' : 8 })
#        currentVCONN.addChild(vConnMaxCurrent)

#        vConnMinCurrent = cSRCPolCurrentField(self,
#                                                        {'name' : 'VConn Min Current',
#                                                         'offset' : 8,
#                                                         'bit length' : 8 })
#        currentVCONN.addChild(vConnMinCurrent)

#        vConnExtraCurrent = cSRCPolCurrentField(self,
#                                                        {'name' : 'VConn Extra Current',
#                                                         'offset' : 16,
#                                                         'bit length' : 16 })
#        currentVCONN.addChild(vConnExtraCurrent)

        currentHV = register_class.cDataModelArray(self, 1,
                                                      {'name' : 'HV Power',
                                                        'offset' : 64,
                                                        'bit length' : 32 })

        self.dataModel.addChild(currentHV)

        HVMaxCurrent = cSRCPolPowField(self,
                                                        {'name' : 'HV Max Power',
                                                         'offset' : 0,
                                                         'bit length' : 16 })
        currentHV.addChild(HVMaxCurrent)

        HVMinCurrent = cSRCPolPowField(self,
                                                        {'name' : 'HV Min Power',
                                                         'offset' : 16,
                                                         'bit length' : 16 })
        currentHV.addChild(HVMinCurrent)

        HVExtraCurrent = cSRCPolPowField(self,
                                                        {'name' : 'HV Extra Power',
                                                         'offset' : 32,
                                                         'bit length' : 16 })
        currentHV.addChild(HVExtraCurrent)


# display pdos based on numPdo
# not a method, but should be grouped with txSrcCap class
def TxIDO_TopLevelDMGenerator(self) :
    retDict = {'name' : self.name, 'grouping tier' : self.tier, 'show' : self.show, 'data model list' : []  }

    numUfpIDO = self.getChildByName('Record Counts').getChildByName('Number of UFP Identity Objects').valueToInt()

    for i in range(6) :
        if i < numUfpIDO :
            self.getChildByName('UFP Discover Identity Response').dataModelChildrenArray[i].unhide()
        else :
            self.getChildByName('UFP Discover Identity Response').dataModelChildrenArray[i].hide()

    if numUfpIDO > 0 :
        self.getChildByName('UFP Discover Identity Response').unhide()
    else :
        self.getChildByName('UFP Discover Identity Response').hide()


    numTPIDO = self.getChildByName('Record Counts').getChildByName("Number of SOP' (Tethered Plug) Identity Objects").valueToInt()

    for i in range(6) :
        if i < numTPIDO :
            self.getChildByName("SOP' (Tethered Plug) Discover Identity Response").dataModelChildrenArray[i].unhide()
        else :
            self.getChildByName("SOP' (Tethered Plug) Discover Identity Response").dataModelChildrenArray[i].hide()

    if numTPIDO > 0 :
        self.getChildByName("SOP' (Tethered Plug) Discover Identity Response").unhide()
    else :
        self.getChildByName("SOP' (Tethered Plug) Discover Identity Response").hide()

    return self.childrenAsListDMGenerator()


class cTxIDO_0x47_register(register_class.cRegister) :
    def __init__(self):
        register_class.cRegister.__init__(self, {'register name' : 'Transmit Identity Data Object',
                                                 'address' : 0x47,
                                                 'byte length' : 49,
                                                 'permission' : 'RW'})

        self.dataModel = register_class.cDataModelArray(self, 2,
                                                        {'name' : 'Transmit Identity Data Object',
                                                        'offset' : 0,
                                                        'bit length' : 392 })

        numIdoConfig = register_class.cDataModelArray(self, 1,
                                                      {'name' : 'Record Counts',
                                                        'offset' : 0,
                                                        'bit length' : 8 })

        self.dataModel.addChild(numIdoConfig)

        numUfpIDO = register_class.cDecimalDMTerminator(self,
                                                        {'name' : 'Number of UFP Identity Objects',
                                                         'offset' : 0,
                                                         'bit length' : 3 })
        numUfpIDO.setMaxValue(6)
        numUfpIDO.updateRegisters.append(self)
        numIdoConfig.addChild(numUfpIDO)
        # for now just allow the predefined IDO fields

        numTPIDO = register_class.cDecimalDMTerminator(self,
                                                       {'name' : "Number of SOP' (Tethered Plug) Identity Objects",
                                                        'offset' : 4,
                                                        'bit length' : 3 })
        numTPIDO.setMaxValue(6)
        numTPIDO.updateRegisters.append(self)
        numIdoConfig.addChild(numTPIDO)

        ufpIDO = register_class.cDataModelArray(self, 2,
                                                {'name' : 'UFP Discover Identity Response',
                                                 'offset' : 8,
                                                 'bit length' : 128 })


        self.dataModel.addChild(ufpIDO)
        ufpIDO.addChild(cUFPIDHeaderVDO(self, 1,
                                        {'name' : 'UFP IDO Header',
                                         'offset' : 0,
                                         'bit length' : 32 }))

        ufpIDO.addChild(register_class.cHexDMTerminator(self,
                                        {'name' : 'Certification Test ID',
                                         'offset' : 32,
                                         'bit length' : 20 }))

        ufpIDO.addChild(cUFPProductVDO(self, 1,
                                        {'name' : 'Product Vendor Defined Object',
                                         'offset' : 64,
                                         'bit length' : 32 }))

        ufpIDO.addChild(cAMAVDO(self, 1,
                                        {'name' : 'Alternate Mode Adapter VDO',
                                         'offset' : 96,
                                         'bit length' : 32 }))

        ufpIDO.addChild(register_class.cHexDMTerminator(self,
                                        {'name' : 'UFP IDO VDO #5',
                                         'offset' : 128,
                                         'bit length' : 32 }))

        ufpIDO.addChild(register_class.cHexDMTerminator(self,
                                        {'name' : 'UFP IDO VDO #6',
                                         'offset' : 160,
                                         'bit length' : 32 }))


        ufpIDO = register_class.cDataModelArray(self, 2,
                                                {'name' : "SOP' (Tethered Plug) Discover Identity Response",
                                                 'offset' : 200,
                                                 'bit length' : 128 })


        self.dataModel.addChild(ufpIDO)
        ufpIDO.addChild(cUFPIDHeaderVDO(self, 1,
                                        {'name' : "SOP' (Tethered Plug) IDO Header",
                                         'offset' : 0,
                                         'bit length' : 32 }))

        ufpIDO.addChild(register_class.cHexDMTerminator(self,
                                        {'name' : 'Certification Test ID',
                                         'offset' : 32,
                                         'bit length' : 20 }))

        ufpIDO.addChild(cUFPProductVDO(self, 1,
                                        {'name' : 'Product Vendor Defined Object',
                                         'offset' : 64,
                                         'bit length' : 32 }))

        ufpIDO.addChild(cCableVDO(self, 1,
                                        {'name' : 'Cable Vendor Defined Object',
                                         'offset' : 96,
                                         'bit length' : 32 }))

        ufpIDO.addChild(register_class.cHexDMTerminator(self,
                                        {'name' : "SOP' (Tethered Plug) IDO VDO #5",
                                         'offset' : 128,
                                         'bit length' : 32 }))

        ufpIDO.addChild(register_class.cHexDMTerminator(self,
                                        {'name' : "SOP' (Tethered Plug) IDO VDO #6",
                                         'offset' : 160,
                                         'bit length' : 32 }))



        self.dataModel.setDataModelGenerator(TxIDO_TopLevelDMGenerator)



class cDisplayPortCapabilities_0x51_register(register_class.cRegister) :
    def __init__(self):
        register_class.cRegister.__init__(self, {'register name' : 'Display Port Capabilities',
                                                 'address' : 0x51,
                                                 'byte length' : 7,
                                                 'permission' : 'RW'})

        self.dataModel = register_class.cDataModelArray(self, 1,
                                                        {'name' : 'Display Port Capabilities',
                                                        'offset' : 0,
                                                        'bit length' : 56 })


        enDPSid = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'Enable Display Port SID',
                                                         'offset' : 0,
                                                         'bit length' : 1 })
        self.dataModel.addChild(enDPSid)

        enDPMode = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'Enable Display Port Mode 1',
                                                         'offset' : 1,
                                                         'bit length' : 1 })
        self.dataModel.addChild(enDPMode)

        vout3V3 = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'DisplayPort Vout 3V3 Required',
                                                         'offset' : 8,
                                                         'bit length' : 1 })
        self.dataModel.addChild(vout3V3)

        prefRole = register_class.cListDMTerminator(self,
                                                        {'name' : 'Preferred DP Role',
                                                         'offset' : 9,
                                                         'bit length' : 1 })

        prefRole.setReportList(['Prefers UFP_D', 'Prefers DFP_D'])

        self.dataModel.addChild(prefRole)

        forceConfig = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'Force USB Configuration',
                                                         'offset' : 11,
                                                         'bit length' : 1 })

        self.dataModel.addChild(forceConfig)

        DFUFConn = register_class.cListDMTerminator(self,
                                                        {'name' : 'DFP_D / UFP_D Connected (Status Response)',
                                                         'offset' : 12,
                                                         'bit length' : 2 })

        DFUFConn.setReportList(['Neither', 'DP DFP_D only', 'DP UFP_D only', 'DP UFP_D and DFP_D'])

        self.dataModel.addChild(DFUFConn)

        vcReq = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'DisplayPort VCONN Required',
                                                         'offset' : 14,
                                                         'bit length' : 1 })

        self.dataModel.addChild(vcReq)

        multiFunc = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'DisplayPort Multi-Functrion Preferred',
                                                         'offset' : 15,
                                                         'bit length' : 1 })

        self.dataModel.addChild(multiFunc)


        portCap = register_class.cListDMTerminator(self,
                                                        {'name' : 'Port Capability',
                                                         'offset' : 16,
                                                         'bit length' : 2 })

        portCap.setReportList(['DP Disabled', 'DP UFP_D only', 'DP DFP_D only', 'DP UFP_D and DFP_D'])

        self.dataModel.addChild(portCap)

        signalling = register_class.cListDMTerminator(self,
                                                        {'name' : 'DisplayPort Signalling',
                                                         'offset' : 18,
                                                         'bit length' : 4 })

        signalling.setMaxValue(2)

        signalling.setReportList(['unspecified', 'DP 1.3', 'USB Gen 2.0'])

        self.dataModel.addChild(signalling)

        receptIndic = register_class.cListDMTerminator(self,
                                                        {'name' : 'Receptacle Indication',
                                                         'offset' : 22,
                                                         'bit length' : 1 })

        receptIndic.setReportList(['Plug', 'Receptacle'])


        self.dataModel.addChild(receptIndic)

        usb2SNU = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'USB2.0 Signalling Not Used',
                                                         'offset' : 23,
                                                         'bit length' : 1 })
        self.dataModel.addChild(usb2SNU)


        dfpdpins = register_class.cMultiBooleanDMTerminator(self,
                                                        {'name' : 'DFPD Receptacle or UFPD Plug Pin Assignment',
                                                         'offset' : 24,
                                                         'bit length' : 8 })
        dfpdpins.setFlagNameList(['A', 'B', 'C', 'D', 'E', 'F'])
        dfpdpins.setFlagMask([1, 1, 1, 1, 1, 1, 0, 0])
        dfpdpins.setSpacing(6)
        self.dataModel.addChild(dfpdpins)

        ufpdpins = register_class.cMultiBooleanDMTerminator(self,
                                                        {'name' : 'UFPD Receptacle or DFPD Plug Pin Assignment',
                                                         'offset' : 32,
                                                         'bit length' : 8 })

        ufpdpins.setFlagNameList(['A', 'B', 'C', 'D', 'E', 'F'])
        ufpdpins.setFlagMask([1, 1, 1, 1, 1, 0, 0, 0])
        ufpdpins.setSpacing(6)
        self.dataModel.addChild(ufpdpins)

        dfpdSidBBStr = register_class.cDataModelTerminator(self,
                                                        {'name' : 'DP Sid Billboard String',
                                                         'offset' : 48,
                                                         'bit length' : 4 })
        self.dataModel.addChild(dfpdSidBBStr)


class cIntMask1_0x16_register(register_class.cRegister) :
    def __init__(self):
        register_class.cRegister.__init__(self, {'register name' : 'Interrupt Mask for I2C1',
                                                 'address' : 0x16,
                                                 'byte length' : 9,
                                                 'permission' : 'RW'})

        self.dataModel = register_class.cDataModelArray(self, 1,
                                                        {'name' : 'Interrupt Mask for I2C1',
                                                        'offset' : 0,
                                                        'bit length' : 72 })


        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Application Loaded',
                                                                     'offset' : 0,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Plug Insert or Removal',
                                                                     'offset' : 1,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Overcurrent Status Changed',
                                                                     'offset' : 2,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Supervisor Event',
                                                                     'offset' : 3,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'CMD1 Complete',
                                                                     'offset' : 4,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'CMD2 Complete',
                                                                     'offset' : 5,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Error: PD Source Insufficient',
                                                                     'offset' : 6,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Billboard Enabled or Disabled',
                                                                     'offset' : 7,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Status Update',
                                                                     'offset' : 8,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Power Status Update',
                                                                     'offset' : 9,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Data Status Update',
                                                                     'offset' : 10,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'PD Status Update',
                                                                     'offset' : 11,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'SRC Cap Received as Sink',
                                                                     'offset' : 12,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'UART Chain Update',
                                                                     'offset' : 14,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Wake Event',
                                                                     'offset' : 15,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'New Contract as Sink',
                                                                     'offset' : 16,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'New Contract as Source',
                                                                     'offset' : 17,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'RDO Received from Sink',
                                                                     'offset' : 18,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Hard Reset Event',
                                                                     'offset' : 19,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Role Swaps Complete',
                                                                     'offset' : 20,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'PR Swap Requested',
                                                                     'offset' : 21,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'DR Swap Requested',
                                                                     'offset' : 22,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'VCONN Swap Requested',
                                                                     'offset' : 23,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Low Voltage Warning Event',
                                                                     'offset' : 24,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'High Voltage Warning Event',
                                                                     'offset' : 25,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Power Path Switch Changed',
                                                                     'offset' : 26,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Power Fault Occurred',
                                                                     'offset' : 27,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'VBUS Discharge Failed',
                                                                     'offset' : 28,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Unable to Raise Source',
                                                                     'offset' : 29,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'RCP Fault',
                                                                     'offset' : 30,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Data Clamp Active',
                                                                     'offset' : 31,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Receive Identity SOP',
                                                                     'offset' : 32,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Receive Identity SOP Prime',
                                                                     'offset' : 33,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'AM Negotiation Complete',
                                                                     'offset' : 34,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'VDM Received',
                                                                     'offset' : 35,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Attention Received',
                                                                     'offset' : 36,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'DisplayPort SID Status Update',
                                                                     'offset' : 37,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Intel VID Status Update',
                                                                     'offset' : 38,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'TI VID Status Update',
                                                                     'offset' : 39,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Source Caps Recevied as Source',
                                                                     'offset' : 40,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Sink Caps Recevied',
                                                                     'offset' : 41,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'USB Host Present Changed',
                                                                     'offset' : 42,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Error Recovery Event',
                                                                     'offset' : 43,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'PD Missing Get Cap Response',
                                                                     'offset' : 44,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'PD Transmissions Error',
                                                                     'offset' : 45,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'PD Protocol Error',
                                                                     'offset' : 46,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'PD Message Error',
                                                                     'offset' : 47,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'SOP Soft Reset Event',
                                                                     'offset' : 48,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'SOP Prime Soft Reset Event',
                                                                     'offset' : 49,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'SOP Double Prime Soft Reset Event',
                                                                     'offset' : 50,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Cable Reset Event',
                                                                     'offset' : 51,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'BIST Event',
                                                                     'offset' : 52,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'BIST Message Ignored',
                                                                     'offset' : 53,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'HPD Falling Event',
                                                                     'offset' : 54,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'HPD Rising Event',
                                                                     'offset' : 55,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Custom VID Status (0x5E) Update',
                                                                     'offset' : 56,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Custom UVDM Enumeration (0x4C) Update',
                                                                     'offset' : 57,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Rx Custom Debug VDM (0x4D) Update',
                                                                     'offset' : 58,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Enter DC Received',
                                                                     'offset' : 59,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Received Debug IDentity',
                                                                     'offset' : 60,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Goto Min Recevied',
                                                                     'offset' : 69,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Type-C Current Decrease',
                                                                     'offset' : 70,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Sink Transition Complete',
                                                                     'offset' : 71,
                                                                     'bit length' : 1 }))


class cIntMask2_0x17_register(register_class.cRegister) :
    def __init__(self):
        register_class.cRegister.__init__(self, {'register name' : 'Interrupt Mask for I2C2',
                                                 'address' : 0x17,
                                                 'byte length' : 9,
                                                 'permission' : 'RW'})

        self.dataModel = register_class.cDataModelArray(self, 1,
                                                        {'name' : 'Interrupt Mask for I2C2',
                                                        'offset' : 0,
                                                        'bit length' : 72 })


        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Application Loaded',
                                                                     'offset' : 0,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Plug Insert or Removal',
                                                                     'offset' : 1,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Overcurrent Status Changed',
                                                                     'offset' : 2,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Supervisor Event',
                                                                     'offset' : 3,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'CMD1 Complete',
                                                                     'offset' : 4,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'CMD2 Complete',
                                                                     'offset' : 5,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Error: PD Source Insufficient',
                                                                     'offset' : 6,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Billboard Enabled or Disabled',
                                                                     'offset' : 7,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Status Update',
                                                                     'offset' : 8,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Power Status Update',
                                                                     'offset' : 9,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Data Status Update',
                                                                     'offset' : 10,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'PD Status Update',
                                                                     'offset' : 11,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'SRC Cap Received as Sink',
                                                                     'offset' : 12,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'UART Chain Update',
                                                                     'offset' : 14,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Wake Event',
                                                                     'offset' : 15,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'New Contract as Sink',
                                                                     'offset' : 16,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'New Contract as Source',
                                                                     'offset' : 17,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'RDO Received from Sink',
                                                                     'offset' : 18,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Hard Reset Event',
                                                                     'offset' : 19,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Role Swaps Complete',
                                                                     'offset' : 20,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'PR Swap Requested',
                                                                     'offset' : 21,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'DR Swap Requested',
                                                                     'offset' : 22,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'VCONN Swap Requested',
                                                                     'offset' : 23,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Low Voltage Warning Event',
                                                                     'offset' : 24,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'High Voltage Warning Event',
                                                                     'offset' : 25,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Power Path Switch Changed',
                                                                     'offset' : 26,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Power Fault Occurred',
                                                                     'offset' : 27,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'VBUS Discharge Failed',
                                                                     'offset' : 28,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Unable to Raise Source',
                                                                     'offset' : 29,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'RCP Fault',
                                                                     'offset' : 30,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Data Clamp Active',
                                                                     'offset' : 31,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Receive Identity SOP',
                                                                     'offset' : 32,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Receive Identity SOP Prime',
                                                                     'offset' : 33,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'AM Negotiation Complete',
                                                                     'offset' : 34,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'VDM Received',
                                                                     'offset' : 35,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Attention Received',
                                                                     'offset' : 36,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'DisplayPort SID Status Update',
                                                                     'offset' : 37,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Intel VID Status Update',
                                                                     'offset' : 38,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'TI VID Status Update',
                                                                     'offset' : 39,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Source Caps Recevied as Source',
                                                                     'offset' : 40,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Sink Caps Recevied',
                                                                     'offset' : 41,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'USB Host Present Changed',
                                                                     'offset' : 42,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Error Recovery Event',
                                                                     'offset' : 43,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'PD Missing Get Cap Response',
                                                                     'offset' : 44,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'PD Transmissions Error',
                                                                     'offset' : 45,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'PD Protocol Error',
                                                                     'offset' : 46,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'PD Message Error',
                                                                     'offset' : 47,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'SOP Soft Reset Event',
                                                                     'offset' : 48,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'SOP Prime Soft Reset Event',
                                                                     'offset' : 49,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'SOP Double Prime Soft Reset Event',
                                                                     'offset' : 50,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Cable Reset Event',
                                                                     'offset' : 51,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'BIST Event',
                                                                     'offset' : 52,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'BIST Message Ignored',
                                                                     'offset' : 53,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'HPD Falling Event',
                                                                     'offset' : 54,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'HPD Rising Event',
                                                                     'offset' : 55,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Custom VID Status (0x5E) Update',
                                                                     'offset' : 56,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Custom UVDM Enumeration (0x4C) Update',
                                                                     'offset' : 57,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Rx Custom Debug VDM (0x4D) Update',
                                                                     'offset' : 58,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Enter DC Received',
                                                                     'offset' : 59,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Received Debug IDentity',
                                                                     'offset' : 60,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Goto Min Recevied',
                                                                     'offset' : 69,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Type-C Current Decrease',
                                                                     'offset' : 70,
                                                                     'bit length' : 1 }))

        self.dataModel.addChild(register_class.cBooleanDMTerminator(self,
                                                                    {'name' : 'Sink Transition Complete',
                                                                     'offset' : 71,
                                                                     'bit length' : 1 }))



class cIntVidConf_0x52_register(register_class.cRegister) :
    def __init__(self):
        register_class.cRegister.__init__(self, {'register name' : 'Intel VID Config Register',
                                                 'address' : 0x52,
                                                 'byte length' : 7,
                                                 'permission' : 'RW'})

        self.dataModel = register_class.cDataModelArray(self, 2,
                                                        {'name' : 'Intel VID Config Register',
                                                        'offset' : 0,
                                                        'bit length' : 56 })


        intVidConf = register_class.cDataModelArray(self, 1,
                                                        {'name' : 'Intel VID Basic Configuration',
                                                         'offset' : 0,
                                                         'bit length' : 56 })

        self.dataModel.addChild(intVidConf)

        intVidEnab = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'Intel VID Enable',
                                                         'offset' : 0,
                                                         'bit length' : 1 })

        intVidConf.addChild(intVidEnab)

        tbtModEnab = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'Thunderbolt Mode Enable',
                                                         'offset' : 1,
                                                         'bit length' : 1 })

        intVidConf.addChild(tbtModEnab)

        vout3v3req = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'VOUT_3V3 Required',
                                                         'offset' : 8,
                                                         'bit length' : 1 })

        intVidConf.addChild(vout3v3req)

        tbtEmarkO = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'TBT Emarker Override',
                                                         'offset' : 9,
                                                         'bit length' : 1 })

        intVidConf.addChild(tbtEmarkO)

        AnMinPow = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'AN Minimum Power Required',
                                                         'offset' : 10,
                                                         'bit length' : 1 })

        intVidConf.addChild(AnMinPow)

#  Not implemented in current firmware
#        vPro = register_class.cBooleanDMTerminator(self,
#                                                        {'name' : 'VPRO_capable',
#                                                         'offset' : 11,
#                                                         'bit length' : 1 })
#        intVidConf.addChild(vPro)

        dualRet = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'Data Status HPD',
                                                         'offset' : 14,
                                                         'bit length' : 1 })

        intVidConf.addChild(dualRet)


        msgIndex = register_class.cDecimalDMTerminator(self,
                                                        {'name' : 'Billboard Message Index',
                                                         'offset' : 48,
                                                         'bit length' : 4 })

        intVidConf.addChild(msgIndex)



        intSopResp = register_class.cDataModelArray(self, 1,
                                                        {'name' : 'Intel SOP Data',
                                                         'offset' : 16,
                                                         'bit length' : 16 })

        self.dataModel.addChild(intSopResp)

        legacyAdapt = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'Legacy TBT Adapter',
                                                         'offset' : 0,
                                                         'bit length' : 1 })

        intSopResp.addChild(legacyAdapt)

        usb2tbt = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'USB2 TBT Support',
                                                         'offset' : 1,
                                                         'bit length' : 1 })

        intSopResp.addChild(usb2tbt)

        intSopPrResp = register_class.cDataModelArray(self, 1,
                                                        {'name' : 'Intel SOP Prime Data',
                                                         'offset' : 32,
                                                         'bit length' : 16 })

        self.dataModel.addChild(intSopPrResp)

        cableSpeed = register_class.cListDMTerminator(self,
                                                        {'name' : 'Cable Speed',
                                                         'offset' : 0,
                                                         'bit length' : 3 })

        cableSpeed.setMaxValue(2)
        cableSpeed.setReportList(['USB 2.0', 'USB 3.1 Gen 1', 'USB 3.2 Gen 1 Gen 2'])

        intSopPrResp.addChild(cableSpeed)

        cableGen = register_class.cListDMTerminator(self,
                                                        {'name' : 'Cable Generation',
                                                         'offset' : 3,
                                                         'bit length' : 2 })

        cableGen.setMaxValue(2)
        cableGen.setReportList(['USB 2.0', 'USB 3.1 Gen 1', 'USB 3.2 Gen 1 Gen 2'])
        intSopPrResp.addChild(cableGen)

        cableType = register_class.cListDMTerminator(self,
                                                        {'name' : 'Cable Type',
                                                         'offset' : 5,
                                                         'bit length' : 1 })

        intSopPrResp.addChild(cableType)

        cableAct = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'Active Cable',
                                                         'offset' : 6,
                                                         'bit length' : 1 })

        intSopPrResp.addChild(cableAct)

        cableTrain = register_class.cBooleanDMTerminator(self,
                                                        {'name' : 'Cable Training',
                                                         'offset' : 7,
                                                         'bit length' : 1 })

        intSopPrResp.addChild(cableTrain)



class cTIVidConf_0x54_register(register_class.cRegister) :
    def __init__(self):
        register_class.cRegister.__init__(self, {'register name' : 'Texas Instruments VID Config Register',
                                                 'address' : 0x54,
                                                 'byte length' : 1,
                                                 'permission' : 'RW'})

        self.dataModel = register_class.cDataModelArray(self, 1,
                                                        {'name' : 'Texas Instruments VID Config Register',
                                                        'offset' : 0,
                                                        'bit length' : 8 })


        tiVidConf = register_class.cDataModelTerminator(self,
                                                        {'name' : 'Texas Instruments VID Config Register',
                                                         'offset' : 0,
                                                         'bit length' : 8 })

        self.dataModel.addChild(tiVidConf)


class cCustVers_0x2C_register(register_class.cRegister) :
    def __init__(self):
        register_class.cRegister.__init__(self, {'register name' : 'Customer Version',
                                                 'address' : 0x2C,
                                                 'byte length' : 1,
                                                 'permission' : 'RW'})

        self.dataModel = register_class.cDataModelArray(self, 1,
                                                        {'name' : 'Customer Version',
                                                        'offset' : 0,
                                                        'bit length' : 8 })


        custVers = register_class.cDataModelTerminator(self,
                                                        {'name' : 'Customer Version',
                                                         'offset' : 0,
                                                         'bit length' : 8 })

        self.dataModel.addChild(custVers)


########################################################################################################################
########################################################################################################################
########################################################################################################################


class cActiveContractPDO_0x34_register(register_class.cRegister) :
    def __init__(self):
        register_class.cRegister.__init__(self, {'register name' : 'Active Contract PDO',
                                                 'address' : 0x34,
                                                 'byte length' : 4,
                                                 'permission' : 'DRO'})

        activePDO = cDMAnySourcePdoArray(self, 1,
                                       {'name' : 'Active Contract PDO',
                                        'offset' : 0 ,
                                        'bit length' : 32 })


        self.dataModel = activePDO


########################################################################################################################
########################################################################################################################
########################################################################################################################

class cActiveContractRDO_0x35_register(register_class.cRegister) :
    def __init__(self):
        register_class.cRegister.__init__(self, {'register name' : 'Active Contract RDO',
                                                 'address' : 0x35,
                                                 'byte length' : 4,
                                                 'permission' : 'DRO'})

        self.dataModel = register_class.cDataModelArray(self, 1,
                                                        {'name' : 'Active Contract RDO',
                                                        'offset' : 0,
                                                        'bit length' : 32 })

        #E.B. Not sure how to populate this register (0x35) Active Contract RDO.

        maxOpCurrent = cPDOCurrentField( self,  { 'name' : 'Max/Min Operating Current',
                                                                'offset' : 0,
                                                                'bit length' : 10})

        self.dataModel.addChild(maxOpCurrent)

        operatingCurrent = cPDOCurrentField( self,  { 'name' : 'Operating Current',
                                                                'offset' : 10,
                                                                'bit length' : 10})

        self.dataModel.addChild(operatingCurrent)

        noUsbSuspend = register_class.cBooleanDMTerminator(self,
                                                          {'name' : 'No USB Suspend',
                                                           'offset' : 24,
                                                           'bit length' : 1 })

        self.dataModel.addChild( noUsbSuspend )

        usbCommCap = register_class.cBooleanDMTerminator(self,
                                                          {'name' : 'USB Communication Capable',
                                                           'offset' : 25,
                                                           'bit length' : 1 })

        self.dataModel.addChild( usbCommCap )

        capMismatch = register_class.cBooleanDMTerminator(self,
                                                          {'name' : 'Capability Mismatch',
                                                           'offset' : 26,
                                                           'bit length' : 1 })

        self.dataModel.addChild( capMismatch )

        giveback = register_class.cBooleanDMTerminator(self,
                                                          {'name' : 'Giveback Flag',
                                                           'offset' : 27,
                                                           'bit length' : 1 })

        self.dataModel.addChild( giveback )

        giveback = register_class.cDecimalDMTerminator(self,
                                                          {'name' : 'Object Position',
                                                           'offset' : 28,
                                                           'bit length' : 3 })

        self.dataModel.addChild( giveback )


########################################################################################################################
########################################################################################################################
########################################################################################################################

class cSinkRequestRDO_0x36_register(register_class.cRegister) :
    def __init__(self):
        register_class.cRegister.__init__(self, {'register name' : 'Sink Request RDO',
                                                 'address' : 0x36,
                                                 'byte length' : 4,
                                                 'permission' : 'DRO'})

        self.dataModel = register_class.cDataModelArray(self, 1,
                                                        {'name' : 'Sink Request RDO',
                                                        'offset' : 0,
                                                        'bit length' : 32 })
        #E.B. Not sure how to populate this register (0x36) Active Contract RDO.

        maxOpCurrent = cPDOCurrentField( self,  { 'name' : 'Max/Min Operating Current',
                                                                'offset' : 0,
                                                                'bit length' : 10})

        self.dataModel.addChild(maxOpCurrent)

        operatingCurrent = cPDOCurrentField( self,  { 'name' : 'Operating Current',
                                                                'offset' : 10,
                                                                'bit length' : 10})

        self.dataModel.addChild(operatingCurrent)

        noUsbSuspend = register_class.cBooleanDMTerminator(self,
                                                          {'name' : 'No USB Suspend',
                                                           'offset' : 24,
                                                           'bit length' : 1 })

        self.dataModel.addChild( noUsbSuspend )

        usbCommCap = register_class.cBooleanDMTerminator(self,
                                                          {'name' : 'USB Communication Capable',
                                                           'offset' : 25,
                                                           'bit length' : 1 })

        self.dataModel.addChild( usbCommCap )

        capMismatch = register_class.cBooleanDMTerminator(self,
                                                          {'name' : 'Capability Mismatch',
                                                           'offset' : 26,
                                                           'bit length' : 1 })

        self.dataModel.addChild( capMismatch )

        giveback = register_class.cBooleanDMTerminator(self,
                                                          {'name' : 'Giveback Flag',
                                                           'offset' : 27,
                                                           'bit length' : 1 })

        self.dataModel.addChild( giveback )

        giveback = register_class.cDecimalDMTerminator(self,
                                                          {'name' : 'Object Position',
                                                           'offset' : 28,
                                                           'bit length' : 3 })

        self.dataModel.addChild( giveback )



templateName = "Bus Powered Device, EXT"
templateDevice = "TPS65983"
templateVersion = "2.14"

# these must exactly match the preexisting names defined in the tool or they will not be shown
acHeaderListOfFields = [ \
        "Customer Version", \
        "XID", \
#        "Unlock Code", \
#        "Protection Flags" \
        ]

hideShareConfigs = True
hideNumDevices = True

# String Table Definitions
stringTableListofDict = [ {'name' : 'iSerialNumber', 'default' : 'SERIAL NOT DEFINED', 'hide' : 'True', 'force' : 'True' }, \
                {'name' : 'iManufacturer', 'default' : 'Texas Instruments', 'hide' : 'False', 'force' : 'False' }, \
                {'name' : 'iProduct', 'default' : 'TPS65983', 'hide' : 'False', 'force' : 'False' }, \
                {'name' : 'iAdditionalInfoURL', 'default' : 'http://thunderbolttechnology.net/products', 'hide' : 'False', 'force' : 'False' }, \
                {'name' : 'TBT string', 'default' : 'Thunderbolt Device. For further assistance see http://thunderbolttechnology.net/tbt-alt-mode/', 'hide' : 'False', 'force' : 'True' }]


zeroOneList = [ '0', '1' ]
i2cAddrList = [ '0 (0 Ohm R_d)', \
                '1 (93.1 KOhm R_d)', \
                '2 (156 KOhm R_d)', \
                '3 (220 KOhm R_d)', \
                '4 (280 KOhm R_d)', \
                '5 (340 KOhm R_d)', \
                '6 (402 KOhm R_d)', \
                '7 (Open)', \
              ]

def dbg1ValueFromAddr(strapping) :
    return (strapping >> 4) & 0x1

def dbg2ValueFromAddr(strapping) :
    return (strapping >> 3) & 0x1

def i2cAddrValueFromAddr(strapping) :
    return (strapping) & 0x7

numBitsDeviceAddress = 5

def tps65983_addr_function_i2c1(portNum, deviceStrappingValuesListOfDict) :
    index = indexOfName('DBG_CTL1', deviceStrappingValuesListOfDict)
    if index == None :
        dbg1Value = 0
    else :
        dbg1Value = deviceStrappingValuesListOfDict[index]['value']

    index = indexOfName('DBG_CTL2', deviceStrappingValuesListOfDict)
    if index == None :
        dbg2Value = 0
    else :
        dbg2Value = deviceStrappingValuesListOfDict[index]['value']

    index = indexOfName('I2C_ADDR', deviceStrappingValuesListOfDict)
    if index == None :
        i2cAddrValue = 0
    else :
        i2cAddrValue = deviceStrappingValuesListOfDict[index]['value']

    addr = 0
    addr |= dbg1Value << 4
    addr |= dbg2Value << 3
    addr |= i2cAddrValue
    addr |= portNum << 2

    addr |= 0x38

    return addr


def tps65983_addr_function_i2c2(portNum, deviceStrappingValuesListOfDict) :
    index = indexOfName('DBG_CTL1', deviceStrappingValuesListOfDict)
    if index == None :
        dbg1Value = 0
    else :
        dbg1Value = deviceStrappingValuesListOfDict[index]['value']

    index = indexOfName('DBG_CTL2', deviceStrappingValuesListOfDict)
    if index == None :
        dbg2Value = 0
    else :
        dbg2Value = deviceStrappingValuesListOfDict[index]['value']

    index = indexOfName('I2C_ADDR', deviceStrappingValuesListOfDict)
    if index == None :
        i2cAddrValue = 0
    else :
        i2cAddrValue = deviceStrappingValuesListOfDict[index]['value']

    addr = 0
    addr |= dbg1Value << 4
    addr |= dbg2Value << 3
    addr |= i2cAddrValue
    addr |= portNum << 2

    addr |= 0x20

    return addr


deviceStrappingListOfDict = [ \
                    {'name' : 'DBG_CTL1', 'type' : 'pulldown', 'option list' : zeroOneList, 'value function' : dbg1ValueFromAddr, 'hide' : True }, \
                    {'name' : 'DBG_CTL2', 'type' : 'pulldown', 'option list' : zeroOneList, 'value function' : dbg2ValueFromAddr, 'hide' : True }, \
                    {'name' : 'I2C_ADDR', 'type' : 'pulldown', 'option list' : i2cAddrList, 'value function' : i2cAddrValueFromAddr, 'hide' : True }, \
                ]

def indexOfName(name, deviceStrappingValuesListOfDict) :
    for (i, record) in enumerate(deviceStrappingValuesListOfDict) :
        if record['name'] == name :
            return i

    return None

# deviceStrappingValuesListOfDict
# list of Dict [{'name' : name, 'value' : value},]
def tps65983_addr_function(portNum, deviceStrappingValuesListOfDict) :
    dbg1Value = deviceStrappingValuesListOfDict[indexOfName('DBG_CTL1', deviceStrappingValuesListOfDict)]['value']
    dbg2Value = deviceStrappingValuesListOfDict[indexOfName('DBG_CTL2', deviceStrappingValuesListOfDict)]['value']
    i2cAddrValue = deviceStrappingValuesListOfDict[indexOfName('I2C_ADDR', deviceStrappingValuesListOfDict)]['value']

    assert portNum == 0

    addr = 0
    addr |= dbg1Value << 4
    addr |= dbg2Value << 3
    addr |= i2cAddrValue

    return addr


devicePortsListOfDict = [ \
                {'name' : 'Port1', 'port value' : 0 , 'addr function' : tps65983_addr_function, 'addr function I2C1' : tps65983_addr_function_i2c1, 'addr function I2C2' : tps65983_addr_function_i2c2 }, \
                ]


virtualStrappingListOfDict = [ \
                    {'name' : 'DBG_CTL1', 'type' : 'pulldown', 'option list' : zeroOneList, 'value function' : dbg1ValueFromAddr, 'hide' : False }, \
                    {'name' : 'DBG_CTL2', 'type' : 'pulldown', 'option list' : zeroOneList, 'value function' : dbg2ValueFromAddr, 'hide' : False }, \
                    {'name' : 'I2C_ADDR', 'type' : 'pulldown', 'option list' : i2cAddrList, 'value function' : i2cAddrValueFromAddr, 'hide' : False }, \
                ]

virtualPortsListOfDict = [ \
                {'name' : 'Port1', 'port value' : 0 , 'addr function' : tps65983_addr_function }, \
                ]

# device definitions
allAceDevice = register_class.cDevice({'I2C address' : 0x38, 'ports' : devicePortsListOfDict, 'strapping' : deviceStrappingListOfDict})
allAceDevice.addRegister(cIntMask1_0x16_register())
allAceDevice.addRegister(cIntMask2_0x17_register())
allAceDevice.addRegister(cSysConfig_0x28_register())
allAceDevice.addRegister(cIOConfig_0x29_register())
allAceDevice.addRegister(cTxSrcCap_0x32_register())
#allAceDevice.addRegister(cTxSinkCap_0x33_register())
#allAceDevice.addRegister(cAutoNegotiateSink_0x37_register())
#allAceDevice.addRegister(cTxIDO_0x47_register())
allAceDevice.addRegister(cDisplayPortCapabilities_0x51_register())
allAceDevice.addRegister(cIntVidConf_0x52_register())
allAceDevice.addRegister(cTIVidConf_0x54_register())
allAceDevice.configureDerivedFields()
allAceDevice.hide()

NUM_PHYSICAL_DEVICES = 1
oneAceDeviceList = []
for i in range(NUM_PHYSICAL_DEVICES) :
    device = register_class.cDevice({'I2C address' : 0x38, 'ports' : devicePortsListOfDict, 'strapping' : deviceStrappingListOfDict})
    device.addRegister(cTxSinkCap_0x33_register())
    device.addRegister(cAutoNegotiateSink_0x37_register())
    device.ports[0]['object'].registerFromName('AutoNegotiate Sink Control').dataModel.getChildByName('AutoNegotiate Range 0').getChildByName('AutoNegotiate Policy').hide()
    device.ports[0]['object'].registerFromName('AutoNegotiate Sink Control').dataModel.getChildByName('AutoNegotiate Range 1').getChildByName('AutoNegotiate Policy').hide()
    device.ports[0]['object'].registerFromName('AutoNegotiate Sink Control').dataModel.getChildByName('AutoNegotiate Range 0').getChildByName('AutoNegotiate Path').hide()
    device.ports[0]['object'].registerFromName('AutoNegotiate Sink Control').dataModel.getChildByName('AutoNegotiate Range 1').getChildByName('AutoNegotiate Path').hide()
    SPM = cSrcPolicyMasterAutonegSrc_0x38_register()
    SPM.hide()
    device.addRegister(SPM)
    device.addRegister(cTxIDO_0x47_register())
    device.configureDerivedFields()
    oneAceDeviceList.append(device)
    device.addRegister(cActiveContractPDO_0x34_register())
    device.addRegister(cActiveContractRDO_0x35_register())
    device.addHIFunction(function_class.cRawRead())
    device.addHIFunction(function_class.cRawWrite())

ACE_register_definition_metadata_json_delimiter{"virtual device list of dict": [], "firmware filename": "", "device list of dict": [{"show": 1, "name": "Device 1", "addr": 24}], "configuration values": "{\"meta\": {\"project\": 1, \"version\": 1}, \"data\": {\"every_ace\": [{\"register\": 22, \"data\": [0, 4, 0, 0, 0, 0, 0, 0, 0]}, {\"register\": 23, \"data\": [3, 4, 0, 0, 0, 0, 0, 0, 0]}, {\"register\": 40, \"data\": [0, 128, 17, 16, 0, 0, 5, 250, 0, 0, 0, 0, 0, 0, 184, 11, 150, 45, 183, 0, 0, 0, 0, 5, 45, 0, 0, 81, 128, 16, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10]}, {\"register\": 41, \"data\": [4, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 253, 63, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0]}, {\"register\": 50, \"data\": [0, 0, 0, 0, 144, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, {\"register\": 81, \"data\": [0, 144, 69, 0, 12, 0, 0]}, {\"register\": 82, \"data\": [3, 4, 0, 0, 0, 0, 5]}, {\"register\": 84, \"data\": [0]}], \"header\": {\"usb_if_xid\": 0, \"unlock_code\": \"CST1\", \"customer_version\": 0, \"protection_flags\": 250}, \"bin_table\": [], \"strings\": [{\"is_ascii\": true, \"is_valid\": true, \"string\": \"SERIAL NOT DEFINED\"}, {\"is_ascii\": true, \"is_valid\": true, \"string\": \"test\"}, {\"is_ascii\": true, \"is_valid\": true, \"string\": \"test\"}, {\"is_ascii\": true, \"is_valid\": true, \"string\": \"\"}, {\"is_ascii\": true, \"is_valid\": true, \"string\": \"Thunderbolt Device. For further assistance see http://thunderbolttechnology.net/tbt-alt-mode/\"}], \"selected_ace\": [{\"rights\": 0, \"register\": 51, \"data\": [1, 44, 145, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], \"offset\": 0, \"address\": [255, 255, 255, 255]}, {\"rights\": 0, \"register\": 55, \"data\": [8, 88, 130, 37, 100, 144, 193, 146, 100, 144, 1, 128], \"offset\": 0, \"address\": [255, 255, 255, 255]}, {\"rights\": 0, \"register\": 56, \"data\": [0, 0, 220, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], \"offset\": 0, \"address\": [255, 255, 255, 255]}, {\"rights\": 0, \"register\": 71, \"data\": [3, 0, 0, 0, 212, 0, 0, 0, 0, 69, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], \"offset\": 0, \"address\": [255, 255, 255, 255]}]}}", "devices use same config": true, "debug settings": {"adapter": "FTDI"}, "template properties": {"Mux Type": "Thunderbolt", "Description": "Intel Bus-Powered Device (External Power Path) for TPS65983\n\nSupports bus powered device reference design with input power on PP_HVE. By default includes one sink PDO of 5V/3A. No source PDOs.\n", "Template Version": "3.17", "Port Type": "UFP", "Category Type": "Reference Design Project", "Device Type": "TPS65983 6.x FW", "Display As": "TPS65983b", "Question List": [{"Answer": "Bus-powered Device", "Question": "Which reference design are you using?"}, {"Answer": "External", "Question": "Does this device sink power on the internal high-voltage power path (3A max) or the external power path (5A max)?"}, {"Answer": "Supports PD3 and PD2", "Question": "Is your system PD3 compliant (Requires TPS65983b) or PD2 compliant (Either TPS65983a or b)?"}]}}