A.2. Elements

<xs:complexType name="ProcUnitModel">
    <xs:attribute name="version" type="xs:string" use="required"/>

    <xs:element name="procunit" type="ProcUnit" minOccurs="1" maxOccurs="unbounded">
      <xs:complexType>
        <xs:attribute name="type" type="xs:string"/>

        <xs:element name="execmodel" type="ExecModel" minOccurs="1" maxOccurs="unbounded"/>
        <xs:element name="memmodel" type="MemModel" minOccurs="1" maxOccurs="unbounded"/>
        <xs:element name="dpmodel" type="DPModel" minOccurs="1" maxOccurs="unbounded"/>
      </xs:complexType>
    </xs:element>

</xs:complexType>

<xs:complexType name="ExecModel">
    <xs:attribute name="sched" type="IdentName" use="required"/>

    <xs:element name="operation" type="Operation" minOccurs="1" maxOccurs="unbounded">
      <xs:complexType>
        <xs:attribute name="name" type="IdentName" use="required"/>
        <xs:attribute name="var_type" type="IdentName" use="required"/>

        <xs:element name="stgref" type="StgRef" minOccurs="1" maxOccurs="unbounded">
        <xs:complexType>
        <xs:attribute name="name" type="IdentName" use="required"/>
        <xs:attribute name="flags" use="required">
        <xs:simpleType>
        <xs:restriction base="xs:string">
        <xs:enumeration value="COMMIT"/>
        <xs:enumeration value="DEMAND"/>
        <xs:enumeration value="DEMAND COMMIT"/>
        </xs:restriction>
        </xs:simpleType>
        </xs:attribute>

        <xs:element name="furef" type="FURef" minOccurs="1" maxOccurs="unbounded"/>
        </xs:complexType>
        </xs:element>
      </xs:complexType>
    </xs:element>
</xs:complexType>

<xs:complexType name="FURef">
    <xs:attribute name="type" type="IdentName" use="required"/>
    <xs:attribute name="quantity" type="IdentName" use="required"/>
    <xs:attribute name="mode" type="IdentName" use="required"/>
</xs:complexType>

<xs:complexType name="MemModel">
    <xs:element name="cache" type="Cache" minOccurs="0" maxOccurs="unbounded">
      <xs:complexType>
        <xs:attribute name="policy" type="IdentName" use="required"/>

        <!-- below is for cache which has distinction btn i cache and d cache -->
        <xs:attribute name="i_cache_delay" type="xs:int"/>
        <xs:attribute name="d_cache_delay" type="xs:int"/>

        <!-- below is for cache which has no distinction btn i cache and d cache -->
        <xs:attribute name="delay" type="xs:string"/>
        <xs:attribute name="cache_size" type="xs:string"/>
        <xs:attribute name="i_cache_ratio" type="xs:float"/>
        <xs:attribute name="d_cache_ratio" type="xs:float"/>

        <xs:element name="InstCache" type="InstCache" minOccurs="0" maxOccurs="unbounded">
        <xs:attribute name="i_cache_size" type="xs:string" use="required"/>
        <xs:attribute name="i_cache_ratio" type="xs:float" use="required"/>
        </xs:element>
        <xs:element name="DataCache" type="DataCache" minOccurs="0" maxOccurs="unbounded">
        <xs:attribute name="d_cache_size" type="xs:string" use="required"/>
        <xs:attribute name="d_cache_ratio" type="xs:float" use="required"/>
        </xs:element>
      </xs:complexType>
    </xs:element>
    <xs:element name="memory" type="Memory" minOccurs="1" maxOccurs="unbounded">
      <xs:complexType>
        <xs:attribute name="w_delay" type="xs:int" use="required"/>
        <xs:attribute name="r_delay" type="xs:int" use="required"/>
      </xs:complexType>
    </xs:element>
</xs:complexType>

<xs:complexType name="DPModel">
    <xs:element name="pipeline" type="Pipeline" minOccurs="1" maxOccurs="unbounded">
      <xs:complexType>
        <xs:attribute name="name" type="IdentName" use="required"/>
        <xs:attribute name="br_pred_policy" type="IdentName" use="required">
        <xs:simpleType>
        <xs:restriction base="xs:string">
        <xs:enumeration value="TAKEN"/>
        <xs:enumeration value="NOT_TAKEN"/>
        </xs:restriction>
        </xs:simpleType>
        </xs:attribute>
        <xs:attribute name="br_pred_hit_ratio" type="xs:float" use="required"/>
        <xs:attribute name="br_penalty" type="xs:int" use="required"/>

        <xs:element name="stage" type="Stage" minOccurs="1" maxOccurs="unbounded">
        <xs:complexType>
        <xs:attribute name="name" type="IdentName" use="required"/>

        <xs:element name="furef" type="FURef" minOccurs="1" maxOccurs="unbounded"/>
        </xs:complexType>
        </xs:element>
      </xs:complexType>
    </xs:element>

    <xs:element name="funcunit" type="FuncUnit" minOccurs="1" maxOccurs="unbounded">
      <xs:complexType>
        <xs:attribute name="type" type="IdentName" use="required"/>
        <xs:attribute name="quantity" type="xs:int" use="required"/>

        <xs:element name="opermode" type="OperMode" minOccurs="1" maxOccurs="unbounded">
        <xs:complexType>
        <xs:attribute name="mode" type="IdentName" use="required"/>
        <xs:attribute name="oplat" type="xs:int" use="required"/>
        </xs:complexType>
        </xs:element>
      </xs:complexType>
    </xs:element>
</xs:complexType>