<?xml version="1.0"?>
<!-- CPU-related definitions used in multiple grammars -->
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">

  <define name="cpuMode">
    <attribute name="mode">
      <choice>
        <value>custom</value>
        <value>host-model</value>
        <value>host-passthrough</value>
      </choice>
    </attribute>
  </define>

  <define name="cpuMatch">
    <attribute name="match">
      <choice>
        <value>minimum</value>
        <value>exact</value>
        <value>strict</value>
      </choice>
    </attribute>
  </define>

  <define name="cpuCheck">
    <attribute name="check">
      <choice>
        <value>none</value>
        <value>partial</value>
        <value>full</value>
      </choice>
    </attribute>
  </define>

  <define name="cpuModel">
    <element name="model">
      <optional>
        <attribute name="fallback">
          <choice>
            <value>allow</value>
            <value>forbid</value>
          </choice>
        </attribute>
      </optional>
      <optional>
        <attribute name="vendor_id">
          <data type="string">
            <param name='pattern'>[^,]{12}</param>
          </data>
        </attribute>
      </optional>
      <choice>
        <text/>
        <empty/>
      </choice>
    </element>
  </define>

  <define name="cpuVendor">
    <element name="vendor">
      <text/>
    </element>
  </define>

  <define name="cpuFeature">
    <element name="feature">
      <attribute name="policy">
        <choice>
          <value>force</value>
          <value>require</value>
          <value>optional</value>
          <value>disable</value>
          <value>forbid</value>
        </choice>
      </attribute>
      <attribute name="name">
        <ref name="featureName"/>
      </attribute>
      <empty/>
    </element>
  </define>

  <define name="cpuTopology">
    <element name="topology">
      <attribute name="sockets">
        <ref name="positiveInteger"/>
      </attribute>
      <attribute name="cores">
        <ref name="positiveInteger"/>
      </attribute>
      <attribute name="threads">
        <ref name="positiveInteger"/>
      </attribute>
    </element>
  </define>

  <define name="cpuNuma">
    <element name="numa">
      <oneOrMore>
        <ref name="numaCell"/>
      </oneOrMore>
    </element>
  </define>

  <define name="numaCell">
    <element name="cell">
      <optional>
        <attribute name="id">
          <ref name="unsignedInt"/>
        </attribute>
      </optional>
      <attribute name="cpus">
        <ref name="cpuset"/>
      </attribute>
      <attribute name="memory">
        <ref name="memoryKB"/>
      </attribute>
      <optional>
        <attribute name="unit">
          <ref name="unit"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="memAccess">
          <choice>
            <value>shared</value>
            <value>private</value>
          </choice>
        </attribute>
      </optional>
      <optional>
        <element name="distances">
          <oneOrMore>
            <ref name="numaDistance"/>
          </oneOrMore>
        </element>
      </optional>
    </element>
  </define>

  <define name="numaDistance">
    <element name="sibling">
      <attribute name="id">
        <ref name="unsignedInt"/>
      </attribute>
      <attribute name="value">
        <ref name="numaDistanceValue"/>
      </attribute>
    </element>
  </define>

  <!-- Memory as an attribute is in KiB, no way to express a unit -->
  <define name="memoryKB">
    <data type="unsignedLong"/>
  </define>
  <define name="featureName">
    <data type="string">
      <param name='pattern'>[a-zA-Z0-9\-_\.]+</param>
    </data>
  </define>

  <define name="cpuCache">
    <element name="cache">
      <optional>
        <attribute name="level">
          <choice>
            <value>1</value>
            <value>2</value>
            <value>3</value>
          </choice>
        </attribute>
      </optional>
      <attribute name="mode">
        <choice>
          <value>emulate</value>
          <value>passthrough</value>
          <value>disable</value>
        </choice>
      </attribute>
    </element>
  </define>

</grammar>
