<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema attributeFormDefault="unqualified"
	elementFormDefault="qualified" targetNamespace="http://www.omg.org/spec/gems/20110323/device"
	xmlns="http://www.omg.org/spec/gems/20110323/device" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

	<xsd:complexType name="Facet">
		<xsd:sequence />
		<xsd:attribute name="value" use="required" type="xsd:anySimpleType" />
	</xsd:complexType>

	<xsd:complexType name="lengthType">
		<xsd:complexContent>
			<xsd:restriction base="Facet">
				<xsd:sequence />
				<xsd:attribute name="value" use="required" type="xsd:positiveInteger" />
			</xsd:restriction>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="minLengthType">
		<xsd:complexContent>
			<xsd:restriction base="Facet">
				<xsd:sequence />
				<xsd:attribute name="value" use="required"
					type="xsd:nonNegativeInteger" />
			</xsd:restriction>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="maxLengthType">
		<xsd:complexContent>
			<xsd:restriction base="Facet">
				<xsd:sequence />
				<xsd:attribute name="value" use="required" type="xsd:positiveInteger" />
			</xsd:restriction>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="patternType">
		<xsd:complexContent>
			<xsd:restriction base="Facet">
				<xsd:sequence />
				<xsd:attribute name="value" use="required" type="xsd:string" />
			</xsd:restriction>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="enumerationType">
		<xsd:complexContent>
			<xsd:restriction base="Facet">
				<xsd:sequence />
				<xsd:attribute name="value" use="required" type="xsd:string" />
			</xsd:restriction>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="minInclusiveType">
		<xsd:complexContent>
			<xsd:restriction base="Facet">
				<xsd:sequence />
				<xsd:attribute name="value" use="required" type="xsd:string" />
			</xsd:restriction>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="minExclusiveType">
		<xsd:complexContent>
			<xsd:restriction base="Facet">
				<xsd:sequence />
				<xsd:attribute name="value" use="required" type="xsd:string" />
			</xsd:restriction>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="maxInclusiveType">
		<xsd:complexContent>
			<xsd:restriction base="Facet">
				<xsd:sequence />
				<xsd:attribute name="value" use="required" type="xsd:string" />
			</xsd:restriction>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="maxExclusiveType">
		<xsd:complexContent>
			<xsd:restriction base="Facet">
				<xsd:sequence />
				<xsd:attribute name="value" use="required" type="xsd:string" />
			</xsd:restriction>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="totalDigitsType">
		<xsd:complexContent>
			<xsd:restriction base="Facet">
				<xsd:sequence />
				<xsd:attribute name="value" use="required" type="xsd:positiveInteger" />
			</xsd:restriction>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="fractionDigitsType">
		<xsd:complexContent>
			<xsd:restriction base="Facet">
				<xsd:sequence />
				<xsd:attribute name="value" use="required"
					type="xsd:nonNegativeInteger" />
			</xsd:restriction>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="maxNanosType">
		<xsd:complexContent>
			<xsd:restriction base="Facet">
				<xsd:sequence />
				<xsd:attribute name="value" use="required"
					type="xsd:nonNegativeInteger" />
			</xsd:restriction>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="minNanosType">
		<xsd:complexContent>
			<xsd:restriction base="Facet">
				<xsd:sequence />
				<xsd:attribute name="value" use="required"
					type="xsd:nonNegativeInteger" />
			</xsd:restriction>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:complexType name="RestrictionType">
		<xsd:choice minOccurs="1" maxOccurs="unbounded">
			<xsd:element name="length" type="lengthType" minOccurs="0"
				maxOccurs="1" />
			<xsd:element name="enumeration" type="enumerationType"
				minOccurs="0" maxOccurs="unbounded" />
			<xsd:element name="maxExclusive" type="maxExclusiveType"
				minOccurs="0" maxOccurs="1" />
			<xsd:element name="minExclusive" type="minExclusiveType"
				minOccurs="0" maxOccurs="1" />
			<xsd:element name="maxInclusive" type="maxInclusiveType"
				minOccurs="0" maxOccurs="1" />
			<xsd:element name="minInclusive" type="minInclusiveType"
				minOccurs="0" maxOccurs="1" />
			<xsd:element name="maxLength" type="maxLengthType"
				minOccurs="0" maxOccurs="1" />
			<xsd:element name="minLength" type="minLengthType"
				minOccurs="0" maxOccurs="1" />
			<xsd:element name="maxNanos" type="maxNanosType"
				minOccurs="0" maxOccurs="1" />
			<xsd:element name="minNanos" type="minNanosType"
				minOccurs="0" maxOccurs="1" />
			<xsd:element name="pattern" type="patternType" minOccurs="0"
				maxOccurs="unbounded" />
		</xsd:choice>
	</xsd:complexType>

	<xsd:complexType name="ParameterDefType">
		<xsd:sequence>
			<xsd:element name="Description" minOccurs="0" maxOccurs="1"
				type="xsd:string" />
			<xsd:element name="Restriction" minOccurs="0" maxOccurs="unbounded"
				type="RestrictionType" />
		</xsd:sequence>
		<xsd:attribute name="name" type="xsd:string" use="required" />
		<xsd:attribute name="type" use="required">
			<xsd:simpleType>
				<xsd:restriction base="xsd:string">
					<xsd:enumeration value="string" />
					<xsd:enumeration value="bool" />
					<xsd:enumeration value="byte" />
					<xsd:enumeration value="ubyte" />
					<xsd:enumeration value="hex_value" />
					<xsd:enumeration value="double" />
					<xsd:enumeration value="long" />
					<xsd:enumeration value="ulong" />
					<xsd:enumeration value="int" />
					<xsd:enumeration value="uint" />
					<xsd:enumeration value="short" />
					<xsd:enumeration value="ushort" />
					<xsd:enumeration value="time" />
					<xsd:enumeration value="utime" />
				</xsd:restriction>
			</xsd:simpleType>
		</xsd:attribute>
		<xsd:attribute name="multiplicity" type="xsd:int" use="optional" />
	</xsd:complexType>
    
    <xsd:complexType name="ArgumentType">
        <xsd:sequence>
            <xsd:element name="ParameterDef" minOccurs="0" maxOccurs="unbounded"
                type="ParameterDefType">
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="ReturnValueType">
        <xsd:sequence>
            <xsd:element name="ParameterDef" minOccurs="0" maxOccurs="unbounded"
                type="ParameterDefType">
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="DirectiveDefType">
        <xsd:sequence>
            <xsd:element name="Description" minOccurs="0" maxOccurs="1"
                type="xsd:string" />
            <xsd:element name="Arguments" minOccurs="0" maxOccurs="1"
                type="ArgumentType" />
            <xsd:element name="ReturnValues" minOccurs="0" maxOccurs="1"
                type="ReturnValueType" />
        </xsd:sequence>
        <xsd:attribute name="name" type="xsd:string" use="required" />
    </xsd:complexType>

	<xsd:element name="GemsDeviceDefinition" type="GemsDeviceDefinitionType" />

	<xsd:complexType name="GemsDeviceDefinitionType">
        <xsd:sequence>
            <xsd:element name="Device" maxOccurs="unbounded" minOccurs="1" type="DeviceType" />
        </xsd:sequence>
		<xsd:attribute name="gems_version" type="xsd:decimal"
			use="required" />
	</xsd:complexType>

	<xsd:complexType name="ParameterSetDefType">
		<xsd:sequence>
			<xsd:element name="Description" minOccurs="0" maxOccurs="1"
				type="xsd:string" />
			<xsd:element name="ParameterDef" maxOccurs="unbounded" minOccurs="1"
                type="ParameterDefType" />
		</xsd:sequence>
        <xsd:attribute name="name" type="xsd:string" use="required" />
	</xsd:complexType>

	<xsd:complexType name="DeviceType">
        <xsd:sequence>
            <xsd:element name="Description" minOccurs="0" maxOccurs="1"
                type="xsd:string" />
            <xsd:element name="Parameters" maxOccurs="1" minOccurs="0"
                type="Parameters" />
            <xsd:element name="Directives" maxOccurs="1" minOccurs="0"
                type="Directives" />
        </xsd:sequence>
		<xsd:attribute name="target" type="xsd:string" use="required" />
	</xsd:complexType>

	<xsd:complexType name="Parameters">
    	<xsd:sequence>
		      <xsd:element name="ParameterDef" minOccurs="0"
			     maxOccurs="unbounded" type="ParameterDefType" />
		      <xsd:element name="ParameterSetDef" minOccurs="0"
			     maxOccurs="unbounded" type="ParameterSetDefType" />
		</xsd:sequence>
	</xsd:complexType>

    <xsd:complexType name="Directives">
        <xsd:sequence>
            <xsd:element name="DirectiveDef" minOccurs="0"
                maxOccurs="unbounded" type="DirectiveDefType" />
        </xsd:sequence>
    </xsd:complexType>



</xsd:schema>