Skip to content

CM SEMI E142 schema#

The SEMI E142 Standard was customized in Critical Manufacturing MES to allow more xml substrate maps and better accommodate the needs of our customers.

What follows is the customized XSD of the SEMI E142 format:

<?xml version="1.0" encoding="UTF-8"?>
<!--CMF: Removed target namespaces and imports-->
<xs:schema id="MapData"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:annotation>
    <xs:appinfo>Schema for SEMI E142 Substrate Mapping</xs:appinfo>
  </xs:annotation>
  <!-- Elements -->
  <xs:element name="MapData" type="MapDataType">
    <xs:key name="LayoutKey">
      <xs:selector xpath="Layouts/Layout" />
      <xs:field xpath="@LayoutId" />
    </xs:key>
    <xs:key name="SubstrateKey">
      <xs:selector xpath="Substrates/Substrate" />
      <xs:field xpath="@SubstrateType" />
      <xs:field xpath="@SubstrateId" />
    </xs:key>
    <xs:key name="SubstrateMapKey">
      <xs:selector xpath="SubstrateMaps/SubstrateMap" />
      <xs:field xpath="@SubstrateType" />
      <xs:field xpath="@SubstrateId" />
      <xs:field xpath="@LayoutSpecifier" />
    </xs:key>
    <xs:keyref name="ChildLayoutRef" refer="LayoutKey">
      <xs:selector xpath="Layouts/Layout/ChildLayouts/ChildLayout" />
      <xs:field xpath="@LayoutId" />
    </xs:keyref>
    <xs:keyref name="FromSubstrateMapRef" refer="SubstrateMapKey">
      <xs:selector xpath="SubstrateMaps/SubstrateMap/Overlay/TransferMap" />
      <xs:field xpath="@FromSubstrateType" />
      <xs:field xpath="@FromSubstrateId" />
      <xs:field xpath="@FromSubstrateLayoutSpecifier" />
    </xs:keyref>
  </xs:element>
  <!-- Complex Types -->
  <xs:complexType name="MapDataType">
    <xs:sequence>
      <xs:element name="Layouts" type="LayoutsType" minOccurs="0" />
      <xs:element name="Substrates" type="SubstratesType" minOccurs="0" />
      <xs:element name="SubstrateMaps" type="SubstrateMapsType" minOccurs="0" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="LayoutsType">
    <xs:sequence>
      <xs:element name="Layout" type="LayoutType" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="LayoutType">
    <!--CMF: LayoutType child elements can be sent in any order (xs:all) instead of a defined sequence (xs:sequence) -->
    <xs:all>
      <xs:element name="Dimension" type="LogicalCoordinatesType" />
      <xs:element name="LowerLeft" type="PhysicalCoordinatesType" minOccurs="0" />
      <xs:element name="DeviceSize" type="PhysicalCoordinatesType" minOccurs="0" />
      <xs:element name="StepSize" type="PhysicalCoordinatesType" minOccurs="0" />
      <xs:element name="Z" type="ZDimensionsType" minOccurs="0" />
      <xs:element name="TopImage" type="xs:string" minOccurs="0" />
      <xs:element name="BottomImage" type="xs:string" minOccurs="0" />
      <xs:element name="ProductId" type="xs:string" minOccurs="0" />
      <xs:element name="ChildLayouts" type="ChildLayoutsType" minOccurs="0" />
    </xs:all>
    <xs:attribute name="LayoutId" type="xs:string" use="required" />
    <xs:attribute name="DefaultUnits" type="xs:string" use="required" />
    <xs:attribute name="TopLevel" type="CustomBoolean" use="optional" default="false" />
    <xs:attribute name="Package" type="CustomBoolean" use="optional" default="false" />
  </xs:complexType>
  <xs:complexType name="ChildLayoutsType">
    <xs:sequence>
      <xs:element name="ChildLayout" type="ChildLayoutType" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ChildLayoutType">
    <xs:attribute name="LayoutId" type="xs:string" />
  </xs:complexType>
  <xs:complexType name="SubstratesType">
    <xs:sequence>
      <xs:element name="Substrate" type="SubstrateType" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="SubstrateType">
    <!--CMF: SubstrateType child elements can be sent in any order (xs:all) instead of a defined sequence (xs:sequence) -->
    <xs:all>
      <xs:element name="LotId" type="LotIdType" minOccurs="0"/>
      <xs:element name="AliasIds" type="AliasIdsType" minOccurs="0"/>
      <xs:element name="CarrierType" type="xs:string" minOccurs="0"/>
      <xs:element name="CarrierId" type="LotIdType" minOccurs="0"/>
      <xs:element name="SlotNumber" type="xs:nonNegativeInteger" minOccurs="0"/>
      <xs:element name="SubstrateNumber" type="xs:nonNegativeInteger" minOccurs="0"/>
      <xs:element name="GoodDevices" type="xs:nonNegativeInteger" minOccurs="0"/>
      <xs:element name="SupplierName" type="xs:string" minOccurs="0"/>
      <xs:element name="Status" type="xs:string" minOccurs="0"/>     
    </xs:all>
    <xs:attribute name="SubstrateType" type="SubstrateTypeEnum" use="required" />
    <xs:attribute name="SubstrateId" type="MaterialIdType" use="required" />
    <!--CMF: SubstrateType can have any defined attribute. Since processContents=lax, no validation will be applied to this attribute-->
    <xs:anyAttribute processContents="lax"/>
  </xs:complexType>
  <xs:complexType name="SubstrateMapsType">
    <xs:sequence>
      <xs:element name="SubstrateMap" type="SubstrateMapType" maxOccurs="unbounded">
        <!--CMF: OverlayKey, defined as xs:unique can have null values. If it were defined as xs:key all its elements would have been required-->
        <xs:unique name="OverlayKey">
          <xs:selector xpath="Overlay" />
          <xs:field xpath="@MapName" />
          <xs:field xpath="@MapVersion" />
        </xs:unique>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="SubstrateMapType">
    <xs:sequence>
      <xs:element name="Overlay" type="OverlayType" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="SubstrateType" type="SubstrateTypeEnum" use="required" />
    <xs:attribute name="SubstrateId" type="MaterialIdType" use="required" />
    <xs:attribute name="LayoutSpecifier" type="xs:string" use="required" />
    <xs:attribute name="SubstrateSide" type="SubstrateSideEnum" use="optional" default="TopSide" />
    <xs:attribute name="Orientation" type="OrientationType" use="optional" default="0" />
    <xs:attribute name="OriginLocation" type="OriginLocationEnum" use="optional" default="LowerLeft" />
    <xs:attribute name="AxisDirection" type="AxisDirectionEnum" use="optional" default="UpRight" />
  </xs:complexType>
  <xs:complexType name="AliasIdsType">
    <xs:sequence>
      <xs:element name="AliasId" type="AliasIdType" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="AliasIdType">
    <xs:attribute name="Type" type="xs:string" use="required" />
    <xs:attribute name="Value" type="MaterialIdType" use="required" />
  </xs:complexType>
  <xs:complexType name="OverlayType">
    <xs:sequence>
      <xs:element name="ReferenceDevices" type="ReferenceDevicesType" minOccurs="0" />
      <xs:choice minOccurs="0">
        <xs:element name="BinCodeMap" type="BinCodeMapType" />
        <xs:element name="DeviceIdMap" type="DeviceIdMapType" />
        <xs:element name="TransferMap" type="TransferMapType" maxOccurs="unbounded" />
        <xs:element name="DeviceDataMap" type="DeviceDataMapType" maxOccurs="unbounded" />
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="MapName" type="xs:string" use="required" />
    <xs:attribute name="MapVersion" type="xs:string" use="optional" default="" />
  </xs:complexType>
  <xs:complexType name="ReferenceDevicesType">
    <xs:sequence>
      <xs:element name="ReferenceDevice" type="ReferenceDeviceType" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ReferenceDeviceType">
    <xs:sequence>
      <xs:element name="Coordinates" type="LogicalCoordinatesType" />
      <xs:element name="Position" type="PhysicalCoordinatesType" minOccurs="0" />
    </xs:sequence>
    <xs:attribute name="Name" type="xs:string" use="optional" default="" />
  </xs:complexType>
  <xs:complexType name="BinCodeMapType">
    <xs:sequence>
      <xs:element name="BinDefinitions" type="BinDefinitionsType" minOccurs="0" />
      <xs:element name="BinCode" type="BinCodeType" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="BinType" type="BinTypeEnum" use="required" />
    <xs:attribute name="NullBin" type="xs:string" use="required" />
    <xs:attribute name="MapType" type="MapTypeEnum" use="optional" />
  </xs:complexType>
  <xs:complexType name="BinCodeType">
    <xs:simpleContent>
      <xs:extension base="BinCodeContentType">
        <xs:attribute name="X" type="xs:integer" use="optional" />
        <xs:attribute name="Y" type="xs:integer" use="optional" />
        <xs:attribute name="Number" type="xs:integer" use="optional" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="BinDefinitionsType">
    <xs:sequence>
      <xs:element name="BinDefinition" type="BinDefinitionType" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="BinDefinitionType">
    <xs:attribute name="BinCode" type="xs:string" use="required" />
    <xs:attribute name="BinCount" type="xs:nonNegativeInteger" use="optional" />
    <xs:attribute name="BinQuality" type="xs:string" use="optional" default="" />
    <xs:attribute name="BinDescription" type="xs:string" use="optional" default="" />
    <xs:attribute name="Pick" type="CustomBoolean" use="optional" default="false" />
  </xs:complexType>
  <xs:complexType name="DeviceIdMapType">
    <xs:sequence>
      <xs:element name="Id" type="DeviceIdType" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="DeviceIdType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="X" type="xs:integer" />
        <xs:attribute name="Y" type="xs:integer" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="TransferMapType">
    <xs:sequence>
      <xs:element name="T" type="TransferType" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="FromSubstrateType" type="SubstrateTypeEnum" use="required" />
    <xs:attribute name="FromSubstrateId" type="MaterialIdType" use="required" />
    <xs:attribute name="FromSubstrateLayoutSpecifier" type="xs:string" use="required" />
  </xs:complexType>
  <xs:complexType name="TransferType">
    <xs:attribute name="FX" type="xs:integer" use="required" />
    <xs:attribute name="FY" type="xs:integer" use="required" />
    <xs:attribute name="TX" type="xs:integer" use="required" />
    <xs:attribute name="TY" type="xs:integer" use="required" />
  </xs:complexType>
  <xs:complexType name="DeviceDataMapType">
    <xs:sequence>
      <xs:element name="Parameter" type="ParameterType" minOccurs="1" maxOccurs="unbounded" />
      <!--CMF: 'DeviceData' can be abbreviated as 'D'-->
      <xs:choice minOccurs="1" maxOccurs="unbounded">
        <xs:element name="DeviceData" type="DeviceDataType" minOccurs="1" />
        <xs:element name="D" type="DeviceDataType" minOccurs="1" />
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ParameterType">
    <xs:attribute name="Name" type="xs:string" />
    <xs:attribute name="Description" type="xs:string" use="optional" />
    <!--CMF: ParameterType can have any defined attribute. Since processContents=lax, no validation will be applied to this attribute-->
    <xs:anyAttribute processContents="lax"/>
  </xs:complexType>
  <xs:simpleType name="NoValueReasonEnumType" final="#all">
    <xs:restriction base="xs:string">
      <xs:enumeration value="ValueNotAvailable"/>
      <xs:enumeration value="NoSuchSource"/>
      <xs:enumeration value="NoSuchParameter"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="NoValueType">
  <xs:sequence>
    <xs:element name="Description" type="xs:string" nillable="false"/>
  </xs:sequence>
  <xs:attribute name="reasonCode" type="NoValueReasonEnumType" use="required"/>
  </xs:complexType>
  <xs:group name="PVType">
      <xs:choice>
        <xs:element name="F8" type="xs:double" block="#all" nillable="true"/>
        <xs:element name="F4" type="xs:float" block="#all" nillable="true"/>
        <xs:element name="I8" type="xs:long" block="#all" nillable="true"/>
        <xs:element name="I4" type="xs:int" block="#all" nillable="true"/>
        <xs:element name="I2" type="xs:short" block="#all" nillable="true"/>
        <xs:element name="I1" type="xs:byte" block="#all" nillable="true"/>
        <xs:element name="S" type="xs:string" block="#all" nillable="true"/>
        <xs:element name="D" type="xs:dateTime" block="#all" nillable="true"/>
        <xs:element name="B" type="CustomBoolean" block="#all" nillable="true"/>
        <xs:element name="URI" type="xs:anyURI" block="#all" nillable="true"/>
        <xs:element name="B64" type="xs:base64Binary" block="#all" nillable="true"/>
        <xs:element name="EI" type="xs:int" block="#all" nillable="true"/>
        <xs:element name="ES" type="xs:string" block="#all" nillable="true"/>
        <xs:element name="Su" type="StructureValueType" nillable="true"/>
        <xs:element name="Arr" type="ArrayValueType" nillable="true"/>
        <xs:element name="NoValue" type="NoValueType" nillable="false"/>
      </xs:choice>
  </xs:group>
  <xs:complexType name="PVSetType">
    <xs:group ref="PVType" minOccurs="0" maxOccurs="unbounded"/>
  </xs:complexType>
  <xs:complexType name="ArrayValueType">
        <xs:complexContent>
            <xs:restriction base="PVSetType">
                <xs:group ref="PVType" minOccurs="0" maxOccurs="unbounded"/>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="StructureValueType">
        <xs:complexContent>
            <xs:restriction base="PVSetType">
                <xs:group ref="PVType" minOccurs="1" maxOccurs="unbounded"/>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
  <xs:element name="PVSet" type="PVSetType"/>
  <xs:complexType name="DeviceDataType">
    <xs:sequence>
      <xs:element ref="PVSet" minOccurs="1"/>
    </xs:sequence>
    <xs:attribute name="X" type="xs:integer" />
    <xs:attribute name="Y" type="xs:integer" />
  </xs:complexType>
  <xs:complexType name="LogicalCoordinatesType">
    <xs:attribute name="X" type="xs:integer" use="required" />
    <xs:attribute name="Y" type="xs:integer" use="required" />
  </xs:complexType>
  <xs:complexType name="PhysicalCoordinatesType">
    <xs:attribute name="X" type="xs:double" use="required" />
    <xs:attribute name="Y" type="xs:double" use="required" />
    <xs:attribute name="Units" type="xs:string" use="optional" />
  </xs:complexType>
  <xs:complexType name="ZDimensionsType">
    <xs:attribute name="Order" type="xs:integer" use="optional" default="0" />
    <xs:attribute name="Height" type="xs:double" use="optional" default="0" />
    <xs:attribute name="Units" type="xs:string" use="optional" />
  </xs:complexType>
  <!-- Simple Types -->
  <xs:simpleType name="LotIdType">
    <xs:restriction base="xs:string">
      <xs:maxLength value="80" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="MaterialIdType">
    <xs:restriction base="xs:string">
      <xs:maxLength value="32" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="BinCodeContentType">
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="OrientationType">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0" />
      <xs:maxInclusive value="359" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="BinTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Ascii" />
      <xs:enumeration value="Decimal" />
      <xs:enumeration value="HexaDecimal" />
      <xs:enumeration value="Integer2" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="SubstrateSideEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="TopSide" />
      <xs:enumeration value="BottomSide" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="OriginLocationEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="LowerLeft" />
      <xs:enumeration value="UpperLeft" />
      <xs:enumeration value="LowerRight" />
      <xs:enumeration value="UpperRight" />
      <xs:enumeration value="Center" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="AxisDirectionEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="UpRight" />
      <xs:enumeration value="DownRight" />
      <xs:enumeration value="UpLeft" />
      <xs:enumeration value="DownLeft" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="SubstrateTypeEnum">
    <!--CMF: SubstrateType can be written with uppercase letters or be capitalized-->
    <xs:restriction base="xs:string">
      <xs:enumeration value="Wafer" />
      <xs:enumeration value="Frame" />
      <xs:enumeration value="Strip" />
      <xs:enumeration value="Tray" />
      <xs:enumeration value="WAFER" />
      <xs:enumeration value="FRAME" />
      <xs:enumeration value="STRIP" />
      <xs:enumeration value="TRAY" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="MapTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="2DArray" />
      <xs:enumeration value="Row/Column" />
      <xs:enumeration value="Array" />
      <xs:enumeration value="Coordinate" />
    </xs:restriction>
  </xs:simpleType>
  <!--CMF: Custom Boolean Type-->
  <xs:simpleType name="CustomBoolean">
    <xs:restriction base="xs:string">
      <xs:enumeration value="True"/>
      <xs:enumeration value="False"/>
      <xs:enumeration value="true"/>
      <xs:enumeration value="false"/>
      <xs:enumeration value="1"/>
      <xs:enumeration value="0"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>