<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:xsd="undefined">
	<xs:element name="Field" type="FieldType">
	</xs:element>
	<xs:element name="Union">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="Field" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="TypeDef" type="FieldType"/>
	<xs:element name="ICD">
		<xs:complexType>
		    <xs:sequence>
		        <xs:element name="Section" maxOccurs="unbounded">
		            <xs:complexType>
		                <xs:sequence>
		                    <xs:element name="Description" type="xs:string" minOccurs="0"/>
		                    <xs:element name="Word" type="WordType" maxOccurs="unbounded"/>
		                </xs:sequence>
		                <xs:attribute name="Name" type="Name"/>
		            </xs:complexType>
		        </xs:element>
		    </xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:simpleType name="DataType">
		<xs:union>
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="uint8"/>
					<xs:enumeration value="uint16"/>
					<xs:enumeration value="uint64"/>
					<xs:enumeration value="int8"/>
					<xs:enumeration value="int16"/>
					<xs:enumeration value="int32"/>
					<xs:enumeration value="int64"/>
					<xs:enumeration value="float32"/>
					<xs:enumeration value="float64"/>
					<xs:enumeration value="uint32"/>
					<xs:enumeration value="logical"/>
					<xs:enumeration value="enum"/>
					<xs:enumeration value="enable"/>
					<xs:enumeration value="disable"/>
				</xs:restriction>
			</xs:simpleType>
			<xs:simpleType>
				<xs:restriction base="xs:string"/>
			</xs:simpleType>
		</xs:union>
	</xs:simpleType>
	<xs:simpleType name="HexType">
	    <xs:union>
	        <xs:simpleType>
	            <xs:list>
	                <xs:simpleType>
	                    <xs:restriction base="xs:string">
	                        <xs:pattern value="0x[0123456789ABCDEF]*"/>
	                    </xs:restriction>
	                </xs:simpleType>
	            </xs:list>
	        </xs:simpleType>
	        <xs:simpleType>
	            <xs:restriction base="xs:string">
	                <xs:pattern value="0x[0123456789ABCDEF]*:0x[0123456789ABCDEF]*:0x[0123456789ABCDEF]*"/>
	            </xs:restriction>
	        </xs:simpleType>
	    </xs:union>
	</xs:simpleType>
	<xs:simpleType name="Name">
		<xs:restriction base="xs:string"/>
	</xs:simpleType>
	<xs:simpleType name="StrataType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="uint8"/>
			<xs:enumeration value="uint16"/>
			<xs:enumeration value="uint64"/>
			<xs:enumeration value="uint32"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:complexType name="FieldType">
		<xs:sequence>
			<xs:element name="LetterID">
			    <xs:simpleType>
			        <xs:restriction base="xs:string">
			            <xs:pattern value="[A-Za-z]"/>
			        </xs:restriction>
			    </xs:simpleType>
			</xs:element>
			<xs:element name="Description" type="xs:string" minOccurs="0"/>
			<xs:element name="Address" minOccurs="0" type="HexType">
			</xs:element>
			<xs:element name="NumElements" type="xs:integer" minOccurs="0"/>
			<xs:element name="AddressStep" type="HexType" minOccurs="0"/>
			<xs:choice>
				<xs:sequence>
					<xs:element name="DataType" type="DataType"/>
					<xs:sequence minOccurs="0">
						<xs:element name="StartBit" type="xs:integer" minOccurs="1" default="0"/>
						<xs:element name="NumberOfBits" type="xs:integer" minOccurs="1" default="32"/>
					</xs:sequence>
					<xs:element name="Min" minOccurs="0"/>
					<xs:element name="Max" minOccurs="0"/>
					<xs:element name="FixedValue" minOccurs="0"/>
					<xs:element name="Offset" type="xs:float" minOccurs="0" nillable="true"/>
					<xs:element name="LSB" type="xs:float" default="1" minOccurs="0" nillable="true"/>
					<xs:element name="Unit" type="Unit" minOccurs="0">
					</xs:element>
					<xs:element name="Enumerations" minOccurs="0">
						<xs:complexType>
							<xs:sequence minOccurs="1" maxOccurs="1">
								<xs:element name="Enumeration" maxOccurs="unbounded">
									<xs:complexType>
										<xs:sequence>
											<xs:element name="Value" type="xs:integer"/>
											<xs:element name="String" type="xs:string"/>
										</xs:sequence>
									</xs:complexType>
								</xs:element>
							</xs:sequence>
						</xs:complexType>
					</xs:element>
				</xs:sequence>
				<xs:sequence>
					<xs:element name="Substrate" type="StrataType" minOccurs="0"/>
					<xs:element name="TypeLength" minOccurs="0">
						<xs:complexType>
							<xs:sequence>
								<xs:element ref="Field" maxOccurs="unbounded">
									<xs:annotation>
										<xs:documentation>Need a way to restrict the name of the first field to NumElements</xs:documentation>
									</xs:annotation>
								</xs:element>
							</xs:sequence>
						</xs:complexType>
					</xs:element>
					<xs:choice>
						<xs:element name="VarCount" minOccurs="0">
							<xs:complexType>
								<xs:sequence>
									<xs:element ref="Field" maxOccurs="unbounded">
										<xs:annotation>
											<xs:documentation>Need a way to restrict the name of the first field to NumElements</xs:documentation>
										</xs:annotation>
									</xs:element>
									<xs:element name="Element">
										<xs:complexType>
											<xs:group ref="G1" maxOccurs="unbounded"/>
										</xs:complexType>
									</xs:element>
								</xs:sequence>
							</xs:complexType>
						</xs:element>
					</xs:choice>
					<xs:group ref="G1" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
				<xs:element name="Word" type="WordType"/>
			</xs:choice>
		</xs:sequence>
		<xs:attribute name="Name" use="required" type="Name"/>
		<xs:attribute name="NotRequired" type="xs:boolean" default="true"/>
		<xs:attribute name="ID" type="HexType" use="optional"/>
	</xs:complexType>
	<xs:complexType name="WordType">
		<xs:sequence>
		    <xs:element name="AddOffset" type="HexType" minOccurs="0"/>
		    <xs:element name="Description" type="xs:string" minOccurs="0"/>
		    <xs:element name="Substrate" type="StrataType" minOccurs="0"/>
		    <xs:choice>
		        <xs:element ref="Field" maxOccurs="unbounded" minOccurs="0"/>
		        <xs:element name="Word" type="WordType" maxOccurs="unbounded"/>
		    </xs:choice>
		</xs:sequence>
		<xs:attribute name="Name" type="Name"/>
	</xs:complexType>
	<xs:simpleType name="Unit">
		<xs:restriction base="xs:string">
			<xs:pattern value="(1|(m|Km|cm|mm|um|nm|ft|nmi)|(clk|s|Ks|ms|us|ns|ps|min|h)|(g|Kg|mg|ug|ng)|(rad|mad|deg)|K|(Hz|KHz|MHz|GHz)|(mW|W|KW|MW))?((\*|/)((m|Km|cm|mm|um|nm|ft|nmi)|(s|Ks|ms|us|ns|ps|min|h)|(g|Kg|mg|ug|ng)|(rad|mad|deg)|K|(Hz|KHz|MHz|GHz)|(mW|W|KW|MW)))*"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:group name="G1">
		<xs:choice>
			<xs:element name="AddressMap" type="FieldType"/>
			<xs:element name="TypeDef" type="FieldType"/>
			<xs:element ref="Field" maxOccurs="1"/>
			<xs:element ref="Union"/>
		</xs:choice>
	</xs:group>
</xs:schema>