<?xml version="1.0" encoding="UTF-8"?>
<!--
// Description : subInstances.xsd
// Author: The SPIRIT Consortium Schema Working Group
// Version:     $Revision: 1116 $
// Date:        $Date: 2008-01-30 12:57:04 -0800 (Wed, 30 Jan 2008) $
// Tag:         $Name$
//
// Copyright (c) 2005, 2006, 2007 The SPIRIT Consortium.  All rights reserved.
// www.spiritconsortium.org
//
// THIS WORK FORMS PART OF A SPIRIT CONSORTIUM SPECIFICATION.
// USE OF THESE MATERIALS ARE GOVERNED BY
// THE LEGAL TERMS AND CONDITIONS OUTLINED IN THE SPIRIT
// SPECIFICATION DISCLAIMER AVAILABLE FROM
// www.spiritconsortium.org
//
// This source file is provided on an AS IS basis. The SPIRIT Consortium disclaims 
// ANY WARRANTY EXPRESS OR IMPLIED INCLUDING ANY WARRANTY OF
// MERCHANTABILITY AND FITNESS FOR USE FOR A PARTICULAR PURPOSE. 
// The user of the source file shall indemnify and hold The SPIRIT Consortium harmless
// from any damages or liability arising out of the use thereof or the performance or
// implementation or partial implementation of the schema.
-->
<xs:schema xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4" elementFormDefault="qualified" attributeFormDefault="qualified">
    <xs:include schemaLocation="simpleTypes.xsd"/>
    <xs:include schemaLocation="commonStructures.xsd"/>
    <xs:include schemaLocation="identifier.xsd"/>
    <xs:include schemaLocation="autoConfigure.xsd"/>
    <xs:element name="configurableElementValues">
        <xs:annotation>
            <xs:documentation>All configuration information for a contained component, generator, generator chain or abstractor instance.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="spirit:configurableElementValue" maxOccurs="unbounded">
                    <xs:annotation>
                        <xs:documentation>Describes the content of a configurable element. The required referenceId attribute refers to the ID attribute of the configurable element.</xs:documentation>
                    </xs:annotation>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="configurableElementValue">
        <xs:annotation>
            <xs:documentation>Describes the content of a configurable element. The required referenceId attribute refers to the ID attribute of the configurable element.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="referenceId" type="xs:Name" use="required">
                        <xs:annotation>
                            <xs:documentation>Refers to the ID attribute of the configurable element.</xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>
    <xs:element name="instanceName" type="xs:Name">
        <xs:annotation>
            <xs:documentation>An instance name assigned to subcomponent instances and contained channels, that is unique within the parent component.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="componentInstance">
        <xs:annotation>
            <xs:documentation>Component instance element.  The instance name is contained in the unique-value instanceName attribute.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="spirit:instanceName"/>
                <xs:element name="displayName" type="xs:string" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>Display name for the subcomponent instance.</xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="description" type="xs:string" minOccurs="0">
                    <xs:annotation>
                        <xs:documentation>String for describing this component instance to users</xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="componentRef" type="spirit:libraryRefType">
                    <xs:annotation>
                        <xs:documentation>References a component to be found in an external library.  The four attributes define the VLNV of the referenced element.</xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element ref="spirit:configurableElementValues" minOccurs="0"/>
                <xs:element ref="spirit:vendorExtensions" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="componentInstances">
        <xs:annotation>
            <xs:documentation>Sub instances of internal components.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="spirit:componentInstance" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="adHocConnection">
        <xs:annotation>
            <xs:documentation>Represents an ad-hoc connection between component ports.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:group ref="spirit:nameGroup"/>
                <xs:element name="internalPortReference" maxOccurs="unbounded">
                    <xs:annotation>
                        <xs:documentation>Defines a reference to a port on a component contained within the design.</xs:documentation>
                    </xs:annotation>
                    <xs:complexType>
                        <xs:attribute name="componentRef" type="xs:Name" use="required">
                            <xs:annotation>
                                <xs:documentation>A reference to the instanceName element of a component in this design.</xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                        <xs:attribute name="portRef" type="xs:Name" use="required">
                            <xs:annotation>
                                <xs:documentation>A port on the on the referenced component from componentRef.</xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                        <xs:attribute name="left" type="xs:nonNegativeInteger">
                            <xs:annotation>
                                <xs:documentation>Left index of a vector.</xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                        <xs:attribute name="right" type="xs:nonNegativeInteger">
                            <xs:annotation>
                                <xs:documentation>Right index of a vector.</xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                    </xs:complexType>
                </xs:element>
                <xs:element name="externalPortReference" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation>
                        <xs:documentation>Defines a reference to a port on the component containing this design. The portRef attribute indicates the name of the port in the containing component.</xs:documentation>
                    </xs:annotation>
                    <xs:complexType>
                        <xs:attribute name="portRef" type="xs:Name" use="required">
                            <xs:annotation>
                                <xs:documentation>A port on the top level component.</xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                        <xs:attribute name="left" type="xs:nonNegativeInteger">
                            <xs:annotation>
                                <xs:documentation>Left index of a vector.</xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                        <xs:attribute name="right" type="xs:nonNegativeInteger">
                            <xs:annotation>
                                <xs:documentation>Right index of a vector.</xs:documentation>
                            </xs:annotation>
                        </xs:attribute>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="tiedValue" type="spirit:scaledNonNegativeInteger">
                <xs:annotation>
                    <xs:documentation>The logic value of this connection. Only valid for ports of style wire.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="adHocConnections">
        <xs:annotation>
            <xs:documentation>Defines the set of ad-hoc connections in a design. An ad-hoc connection represents a connection between two component pins which were not connected as a result of interface connections (i.e.the pin to pin connection was made explicitly and is represented explicitly).</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="spirit:adHocConnection" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="interconnection">
        <xs:annotation>
            <xs:documentation>Describes a connection between two active (not monitor) busInterfaces.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:group ref="spirit:nameGroup"/>
                <xs:element name="activeInterface" type="spirit:interface" minOccurs="2" maxOccurs="2">
                    <xs:annotation>
                        <xs:documentation>Describes one interface of the interconnection.

The componentRef and busRef attributes indicate the instance name and bus interface name of one end of the connection.</xs:documentation>
                    </xs:annotation>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="interconnections">
        <xs:annotation>
            <xs:documentation>Connections between internal sub components.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="spirit:interconnection" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="spirit:monitorInterconnection" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="interface">
        <xs:annotation>
            <xs:documentation>A representation of a component/bus interface relation; i.e. a bus interface belonging to a certain component.</xs:documentation>
        </xs:annotation>
        <xs:attribute name="componentRef" type="xs:Name" use="required">
            <xs:annotation>
                <xs:documentation>Reference to a component instance name.</xs:documentation>
            </xs:annotation>
        </xs:attribute>
        <xs:attribute name="busRef" type="xs:Name" use="required">
            <xs:annotation>
                <xs:documentation>Reference to the components  bus interface</xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>
    <xs:element name="monitorInterconnection">
        <xs:annotation>
            <xs:documentation>Describes a connection from the interface of one component to any number of monitor interfaces in the design.

An active interface can be connected to unlimited number of monitor interfaces.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:group ref="spirit:nameGroup"/>
                <xs:element name="activeInterface" type="spirit:interface">
                    <xs:annotation>
                        <xs:documentation>Describes an active interface of the design that all the monitors will be connected to.

The componentRef and busRef attributes indicate the instance name and bus interface name.</xs:documentation>
                    </xs:annotation>
                </xs:element>
                <xs:element name="monitorInterface" type="spirit:interface" maxOccurs="unbounded">
                    <xs:annotation>
                        <xs:documentation>Describes a list of monitor interfaces that are connected to the single active interface.

The componentRef and busRef attributes indicate the instance name and bus interface name.</xs:documentation>
                    </xs:annotation>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
