<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<IP xmlns:ns0="http://www.w3.org/2001/XMLSchema-instance"
    ns0:schemaLocation="http://mcd.rou.st.com/modules.php?name=mcu ../../../../../../../doc/V4/Development/Specifications/db/IP_Modes.xsd"
    xmlns="http://mcd.rou.st.com/modules.php?name=mcu"
    DBVersion="V4.0"
    IPType="peripheral"
    Name="UCPD"
    Version="ucpd_v1_0_Cube">

    <About>UCPD: Universal Serial Bus Type-C with Power Delivery</About>

    <!-- Generic RefParameters for USB Type-C with Power Delivery Modes -->
    <RefParameter Name="Instance" DefaultValue="UCPD$Index" Comment="Instance" Type="String"/>

    <!-- Generic RefParameters for USB Type-C with Power Delivery Modes -->
    <RefParameter Name="Version" DefaultValue="1.0" Comment="Version" Type="String"/>

    <!-- RefParameter Name="UCPD_CONTEXT" Comment="UCPD context (debug purpose)" DefaultValue="1" Type="uniqueElementList" Group="CONTEXT">
        <Condition Diagnostic="Secure runtime enabled with TZEN=1" Expression="UCPD1_SECURE &amp; UCPD_Used"/>
        <PossibleValue Comment="TZEN=1, Secure context" Value="1" Semaphore="S_UCPD1_M33S"/>
        <Description>TZEN=1 and secure context</Description>
    </RefParameter>
    <RefParameter Name="UCPD_CONTEXT" Comment="UCPD context (debug purpose)" DefaultValue="2" Type="uniqueElementList" Group="CONTEXT">
        <Condition Diagnostic="Non secure runtime enabled with TZEN=1" Expression="UCPD1_NON_SECURE &amp; UCPD_Used"/>
        <PossibleValue Comment="TZEN=1, Non secure context" Value="2" Semaphore="S_UCPD1_M33NS"/>
        <Description>TZEN=1 and secure context</Description>
    </RefParameter>
    <RefParameter Name="UCPD_CONTEXT" Comment="UCPD context (debug purpose)" DefaultValue="3" Type="uniqueElementList" Group="CONTEXT">
        <Condition Diagnostic="TZEN=0, No context" Expression="UCPD_Used"/>
        <PossibleValue Comment="None" Value="3" Semaphore="S_UCPD1"/>
        <Description>TZEN=0</Description>
    </RefParameter>
     <RefParameter Name="UCPD_CONTEXT" Comment="UCPD context (debug purpose)" DefaultValue="0" Type="uniqueElementList" Group="CONTEXT">
        <PossibleValue Comment="None" Value="0"/>
        <Description>Not in use.</Description>
    </RefParameter-->

    <!-- RefModes for UCPD -->
    <RefMode Name="UCPD_Activate">
        <ConfigForMode>UCPD_Init</ConfigForMode>
        <Parameter Name="Version"/>
        <!-- Parameter Name="UCPD_CONTEXT"/-->
    </RefMode>

    <!-- RefMode for UCPD modes -->
    <RefMode Name="Source_AllSignals" BaseMode="UCPD_Activate"/>
    <RefMode Name="Source_NoCC2" BaseMode="UCPD_Activate"/>
    <!-- RefMode Name="Source_CC1Only" BaseMode="UCPD_Activate"/-->
    <RefMode Name="Sink_AllSignals" BaseMode="UCPD_Activate"/>
    <RefMode Name="Sink_NoCC2" BaseMode="UCPD_Activate"/>
    <!-- RefMode Name="Sink_CC1Only" BaseMode="UCPD_Activate"/-->
    <RefMode Name="Dual_Role_AllSignals" BaseMode="UCPD_Activate"/>
    <RefMode Name="Dual_Role_NoCC2" BaseMode="UCPD_Activate"/>
    <!-- RefMode Name="Dual_Role_CC1Only" BaseMode="UCPD_Activate"/-->

    <ModeLogicOperator Name="OR">
        <Mode Name="Mode" UserName="UCPD Mode">
            <ModeLogicOperator Name="XOR">
                <!-- Source_AllSignals will be used for all MCUs where CC1 and CC2 are present -->
                <Mode UserName="Source" Name="Source_AllSignals">
                    <SignalLogicalOp Name="AND">
                        <Signal Name="CC1"/>
                        <Signal Name="CC2"/>
                    </SignalLogicalOp>
                    <Semaphore>Source$IpInstance</Semaphore>
                    <Semaphore>UCPD_Source</Semaphore>
                    <Semaphore>UCPD_Mode_Selected</Semaphore>
                    <Condition Diagnostic="Board STM32G081B_EVAL only allow Sink on port 2" Expression="!(STM32G081B_EVAL &amp; $Index=2)"/>
                </Mode>
                <!-- Source_NoCC2 will be used for all MCUs where CC1 is present and CC2 is not present -->
                <Mode UserName="Source" Name="Source_NoCC2" RemoveCondition="$modeexist_Source_AllSignals">
                    <SignalLogicalOp Name="AND">
                        <Signal Name="CC1"/>
                    </SignalLogicalOp>
                    <Semaphore>Source$IpInstance</Semaphore>
                    <Semaphore>UCPD_Source</Semaphore>
                    <Semaphore>UCPD_Mode_Selected</Semaphore>
                    <Condition Diagnostic="Board STM32G081B_EVAL only allow Sink on port 2" Expression="!(STM32G081B_EVAL &amp; $Index=2)"/>
                </Mode>
                <!-- Sink_AllSignals will be used for all MCUs where CC1 and CC2 are present -->
                <Mode UserName="Sink" Name="Sink_AllSignals">
                    <SignalLogicalOp Name="AND">
                        <Signal Name="CC1"/>
                        <Signal Name="CC2"/>
                    </SignalLogicalOp>
                    <Semaphore>Sink$IpInstance</Semaphore>
                    <Semaphore>UCPD_Sink</Semaphore>
                    <Semaphore>UCPD_Mode_Selected</Semaphore>
                </Mode>
                <!-- Sink_NoCC2 will be used for all MCUs where CC1 is present and CC2 is not present -->
                <Mode UserName="Sink" Name="Sink_NoCC2" RemoveCondition="$modeexist_Sink_AllSignals">
                    <SignalLogicalOp Name="AND">
                        <Signal Name="CC1"/>
                    </SignalLogicalOp>
                    <Semaphore>Sink$IpInstance</Semaphore>
                    <Semaphore>UCPD_Sink</Semaphore>
                    <Semaphore>UCPD_Mode_Selected</Semaphore>
                </Mode>
                <!-- Dual Role_AllSignals will be used for all MCUs where CC1 and CC2 are present -->
                <Mode UserName="Dual Role" Name="Dual_Role_AllSignals">
                    <SignalLogicalOp Name="AND">
                        <Signal Name="CC1"/>
                        <Signal Name="CC2"/>
                    </SignalLogicalOp>
                    <Semaphore>DualRole$IpInstance</Semaphore>
                    <Semaphore>UCPD_DualRole</Semaphore>
                    <Semaphore>UCPD_Mode_Selected</Semaphore>
                    <Condition Diagnostic="Board STM32G081B_EVAL only allow Sink on port 2" Expression="!(STM32G081B_EVAL &amp; $Index=2)"/>
                </Mode>
                <!-- Dual Role_NoCC2 will be used for all MCUs where CC1 is present and CC2 is not present -->
                <Mode UserName="Dual Role" Name="Dual_Role_NoCC2" RemoveCondition="$modeexist_Dual_Role_AllSignals">
                    <SignalLogicalOp Name="AND">
                        <Signal Name="CC1"/>
                    </SignalLogicalOp>
                    <Semaphore>DualRole$IpInstance</Semaphore>
                    <Semaphore>UCPD_DualRole</Semaphore>
                    <Semaphore>UCPD_Mode_Selected</Semaphore>
                    <Condition Diagnostic="Board STM32G081B_EVAL only allow Sink on port 2" Expression="!(STM32G081B_EVAL &amp; $Index=2)"/>
                </Mode>
            </ModeLogicOperator>
            <Semaphore>S_UCPD_Mode$IpInstance</Semaphore>
        </Mode>
        <Mode Name="UCPD_DeadBatteryMode" UserName="Dead Battery Signals">
            <ModeLogicOperator Name="NONE">
                <!-- DeadBattery will be used for all MCUs where DBCC1 and DBCC2 are present -->
                <Mode UserName="Dead Battery Signals enabled" Name="EnableDeadBattery">
                    <SignalLogicalOp Name="AND">
                        <Signal Name="DBCC1"/>
                        <Signal Name="DBCC2"/>
                    </SignalLogicalOp>
                    <Semaphore>EnabledDeadBattery$IpInstance</Semaphore>
                </Mode>
            </ModeLogicOperator>
            <Condition Diagnostic="Active only when UCPD Mode selected" Expression="(Source$IpInstance | Sink$IpInstance | DualRole$IpInstance)"/>
        </Mode>
        <Mode Name="UCPD_FRSTX" UserName="Fast Role Swap">
            <ModeLogicOperator Name="XOR">
                <!-- CC2 does not exists -->
                <Mode UserName="FRSTX" Name="FRSTX_NoCC2" RemoveCondition="$modeexist_Dual_Role_AllSignals">
                    <SignalLogicalOp Name="AND">
                        <Signal Name="FRSTX1"/>
                    </SignalLogicalOp>
                    <Condition Diagnostic="The instance must be activated in dual-role mode" Expression="DualRole$IpInstance"/>
                </Mode>
                <!-- CC1 & CC2 exists -->
                <Mode UserName="FRSTX" Name="FRSTX_CC2" RemoveCondition="!$modeexist_Dual_Role_AllSignals">
                    <SignalLogicalOp Name="AND">
                        <Signal Name="FRSTX1"/>
                        <Signal Name="FRSTX2"/>
                    </SignalLogicalOp>
                    <Condition Diagnostic="The instance must be activated in dual-role mode" Expression="DualRole$IpInstance"/>
                </Mode>
            </ModeLogicOperator>
        </Mode>
    </ModeLogicOperator>

    <RefSignal IOMode="Analog" Name="CC1"/>
    <RefSignal IOMode="Analog" Name="CC2"/>
    <RefSignal IOMode="System" Name="DBCC1"/>
    <RefSignal IOMode="System" Name="DBCC2"/>
    <RefSignal IOMode="System" Name="FRSTX1"/>
    <RefSignal IOMode="System" Name="FRSTX2"/>

    <!-- UCPD Semaphore for this IP. -->
    <Semaphore>UCPD_Used$context</Semaphore>

</IP>
