<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:attributeGroup name="Nameable">
        <xs:attribute name="Name" type="xs:NMTOKEN" use="required"/>
        <xs:attribute name="Description" type="xs:string" use="optional"/>
    </xs:attributeGroup>
    <xs:attributeGroup name="TypedNameable">
        <xs:attributeGroup ref="Nameable"/>
        <xs:attribute name="Type" type="xs:NMTOKEN" use="required"/>
    </xs:attributeGroup>
    <xs:complexType name="ComponentInstance">
        <xs:attributeGroup ref="TypedNameable"/>
        <xs:attributeGroup ref="ArrayLengthAttribute"/>
        <xs:attribute name="Mapping" use="optional" type="xs:string"/>
    </xs:complexType>
    <xs:simpleType name="SizeType">
        <xs:restriction base="xs:positiveInteger">
            <xs:pattern value="8|16|32"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="SizeType64">
        <xs:restriction base="xs:positiveInteger">
            <xs:pattern value="8|16|32|64"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:attributeGroup name="IntegerParameterAttributes">
        <xs:attribute name="Size" type="SizeType" use="required"/>
        <xs:attribute name="Min" type="xs:integer" use="optional"/>
        <xs:attribute name="Max" type="xs:integer" use="optional"/>
        <xs:attribute name="Signed" type="xs:boolean" use="optional" default="false"/>
    </xs:attributeGroup>
    <xs:attributeGroup name="ArrayLengthAttribute">
        <xs:attribute name="ArrayLength" type="xs:nonNegativeInteger" use="optional" default="0"/>
    </xs:attributeGroup>
    <xs:complexType name="Adaptation">
        <xs:attribute name="Offset" type="xs:integer" default="0"/>
    </xs:complexType>
    <xs:complexType name="LinearAdaptationType">
        <xs:complexContent>
            <xs:extension base="Adaptation">
                <xs:attribute name="SlopeNumerator" type="xs:double" default="1"/>
                <xs:attribute name="SlopeDenominator" type="xs:double" default="1"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:element name="LinearAdaptation" type="LinearAdaptationType"/>
    <xs:element name="LogarithmicAdaptation">
        <xs:complexType>
            <xs:complexContent>
                <xs:extension base="LinearAdaptationType">
                    <xs:attribute name="LogarithmBase" type="xs:double" default="10"/>
                    <xs:attribute name="FloorValue" type="xs:double" default="-INF"/>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="Parameter" abstract="true">
        <xs:attributeGroup ref="Nameable"/>
        <xs:attribute name="Mapping" type="xs:string" use="optional"/>
        <xs:attributeGroup ref="ArrayLengthAttribute"/>
    </xs:complexType>
    <xs:element name="BooleanParameter">
        <xs:complexType>
            <xs:complexContent>
                <xs:extension base="Parameter">
                    <xs:attribute name="Size" fixed="8" type="SizeType"/>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="IntegerParameterType">
        <xs:complexContent>
            <xs:extension base="Parameter">
                <xs:choice minOccurs="0">
                    <xs:element ref="LinearAdaptation"/>
                    <xs:element ref="LogarithmicAdaptation"/>
                </xs:choice>
                <xs:attributeGroup ref="IntegerParameterAttributes"/>
                <xs:attribute name="Unit" type="xs:token" use="optional"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:element name="IntegerParameter" type="IntegerParameterType"/>
    <xs:complexType name="EnumParameterType">
        <xs:complexContent>
            <xs:extension base="Parameter">
                <xs:sequence>
                    <xs:element name="ValuePair" maxOccurs="unbounded">
                        <xs:complexType>
                            <xs:attribute name="Literal" type="xs:string" use="required"/>
                            <xs:attribute name="Numerical" use="required">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:pattern value="0|[+-]?[1-9][0-9]*"/>
                                        <xs:pattern value="0x[0-9a-fA-F]+"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:attribute>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
                <xs:attribute name="Size" type="SizeType" use="required"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:element name="EnumParameter" type="EnumParameterType">
        <xs:unique name="LiteralUniqueness">
            <xs:selector xpath="ValuePair"/>
            <xs:field xpath="@Literal"/>
        </xs:unique>
        <xs:unique name="NumericalUniqueness">
            <xs:selector xpath="ValuePair"/>
            <xs:field xpath="@Numerical"/>
        </xs:unique>
    </xs:element>
    <xs:simpleType name="PointBound">
        <xs:restriction base="xs:string">
            <xs:pattern value="(0|[+-]?0\.[0-9]+|(([+-]?[1-9][0-9]*)(\.[0-9]+)?))([Ee][+-]?[0-9]+)?"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="PointParameterType">
        <xs:complexContent>
            <xs:extension base="Parameter">
                <xs:attribute name="Unit" type="xs:token" use="optional"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="FixedPointParameterType">
        <xs:complexContent>
            <xs:extension base="PointParameterType">
                <xs:attribute name="Size" type="SizeType" use="required"/>
                <xs:attribute name="Integral" type="xs:nonNegativeInteger" use="required"/>
                <xs:attribute name="Fractional" type="xs:nonNegativeInteger" use="required"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:element name="FixedPointParameter" type="FixedPointParameterType"/>
    <xs:complexType name="FloatingPointParameterType">
        <xs:complexContent>
            <xs:extension base="PointParameterType">
                <xs:attribute name="Size" fixed="32" type="SizeType"/>
                <xs:attribute name="Min" type="PointBound" use="optional"/>
                <xs:attribute name="Max" type="PointBound" use="optional"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:element name="FloatingPointParameter" type="FloatingPointParameterType"/>
    <xs:complexType name="BitParameterType">
        <xs:attributeGroup ref="Nameable"/>
        <xs:attribute name="Size" use="required">
            <xs:simpleType>
                <xs:restriction base="xs:positiveInteger">
                    <xs:maxInclusive value="64"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="Pos" use="required">
            <xs:simpleType>
                <xs:restriction base="xs:nonNegativeInteger">
                    <xs:maxInclusive value="63"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="Max" type="xs:integer" use="optional"/>
    </xs:complexType>
    <xs:element name="BitParameterBlock">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="BitParameter" type="BitParameterType" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attributeGroup ref="Nameable"/>
            <xs:attribute name="Size" type="SizeType64" use="required"/>
            <xs:attribute name="Mapping" type="xs:string" use="optional"/>
        </xs:complexType>
        <xs:unique name="BitParameterBlockSubElementsUniqueness">
            <xs:selector xpath="*"/>
            <xs:field xpath="@Name"/>
        </xs:unique>
    </xs:element>
    <xs:element name="StringParameter">
        <xs:complexType>
            <xs:attributeGroup ref="Nameable"/>
            <xs:attribute name="Mapping" type="xs:string" use="optional"/>
            <xs:attribute name="MaxLength" type="xs:nonNegativeInteger" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:group name="ParameterBlockGroup">
        <xs:choice>
            <xs:element ref="BooleanParameter"/>
            <xs:element ref="IntegerParameter"/>
            <xs:element ref="EnumParameter"/>
            <xs:element ref="FixedPointParameter"/>
            <xs:element ref="FloatingPointParameter"/>
            <xs:element ref="BitParameterBlock"/>
            <xs:element ref="StringParameter"/>
            <xs:element name="Component" type="ComponentInstance"/>
            <xs:element name="ParameterBlock" type="ParameterBlockType">
                <xs:unique name="ParameterBlockSubElementsUniqueness">
                    <xs:selector xpath="*"/>
                    <xs:field xpath="@Name"/>
                </xs:unique>
            </xs:element>
        </xs:choice>
    </xs:group>
    <xs:complexType name="ParameterBlockType">
        <xs:sequence>
            <xs:group ref="ParameterBlockGroup" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attributeGroup ref="Nameable"/>
        <xs:attributeGroup ref="ArrayLengthAttribute"/>
        <xs:attribute name="Mapping" type="xs:string" use="optional"/>
    </xs:complexType>
</xs:schema>
