<?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:attribute name="Mapping" use="optional"/>
	</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"/>
				</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:complexType name="FixedPointParameterType">
		<xs:complexContent>
			<xs:extension base="Parameter">
				<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:attribute name="Unit" type="xs:token" use="optional"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:element name="FixedPointParameter" type="FixedPointParameterType"/>
	<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="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>