blob: cce649fe30d62a7ee7cd42c594ca41b1436bc9f5 [file] [log] [blame] [edit]
<?xml version="1.0"?>
<!--
Copyright 2020-2022 F4PGA Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
SPDX-License-Identifier: Apache-2.0
XML 1.0 Schema for the FPGA architecture description structure developed based on documentation here:
http://vtr-verilog-to-routing.readthedocs.io/en/latest/arch/index.html
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Metadata -->
<xs:complexType name="meta">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="metadata">
<xs:sequence>
<xs:element name="meta" type="meta" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="stringlist">
<xs:list itemType="xs:string"/>
</xs:simpleType>
<xs:simpleType name="intlist">
<xs:list itemType="xs:int"/>
</xs:simpleType>
<xs:simpleType name="floatlist">
<xs:list itemType="xs:float"/>
</xs:simpleType>
<!-- Actual definitions -->
<xs:complexType name="port">
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="is_clock" type="xs:boolean" />
<xs:attribute name="is_non_clock_global" type="xs:boolean" />
<xs:attribute name="clock" type="xs:string" />
<xs:attribute name="combinational_sink_ports" type="stringlist" />
</xs:complexType>
<xs:complexType name="port_list">
<xs:sequence>
<xs:element name="port" type="port" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="model">
<xs:all>
<xs:element name="input_ports" type="port_list" minOccurs="0"/>
<xs:element name="output_ports" type="port_list" minOccurs="0"/>
</xs:all>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
<xs:complexType name="models">
<xs:sequence>
<xs:element name="model" type="model" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="fill">
<xs:sequence>
<xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string" use="required"/>
<xs:attribute name="priority" type="xs:int" use="required"/>
</xs:complexType>
<xs:complexType name="perimeter">
<xs:sequence>
<xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string" use="required"/>
<xs:attribute name="priority" type="xs:int" use="required"/>
</xs:complexType>
<xs:complexType name="corners">
<xs:sequence>
<xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string" use="required"/>
<xs:attribute name="priority" type="xs:int" use="required"/>
</xs:complexType>
<xs:complexType name="single">
<xs:sequence>
<xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string" use="required"/>
<xs:attribute name="priority" type="xs:int" use="required"/>
<xs:attribute name="x" type="xs:string" use="required"/>
<xs:attribute name="y" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="col">
<xs:sequence>
<xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string" use="required"/>
<xs:attribute name="priority" type="xs:int" use="required"/>
<xs:attribute name="startx" type="xs:string" use="required"/>
<xs:attribute name="repeatx" type="xs:string"/>
<xs:attribute name="starty" type="xs:string" default="0"/>
<xs:attribute name="incry" type="xs:string" default="h"/>
</xs:complexType>
<xs:complexType name="row">
<xs:sequence>
<xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string" use="required"/>
<xs:attribute name="priority" type="xs:int" use="required"/>
<xs:attribute name="starty" type="xs:string" use="required"/>
<xs:attribute name="repeaty" type="xs:string"/>
<xs:attribute name="startx" type="xs:string" default="0"/>
<xs:attribute name="incrx" type="xs:string" default="w"/>
</xs:complexType>
<xs:complexType name="region">
<xs:sequence>
<xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string" use="required"/>
<xs:attribute name="priority" type="xs:int" use="required"/>
<xs:attribute name="startx" type="xs:string" default="0"/>
<xs:attribute name="endx" type="xs:string" default="W-1"/>
<xs:attribute name="incrx" type="xs:string" default="w"/>
<xs:attribute name="repeatx" type="xs:string"/>
<xs:attribute name="starty" type="xs:string" default="0"/>
<xs:attribute name="endy" type="xs:string" default="H-1"/>
<xs:attribute name="incry" type="xs:string" default="h"/>
<xs:attribute name="repeaty" type="xs:string"/>
</xs:complexType>
<xs:complexType name="layout_info">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="fill" type="fill"/>
<xs:element name="perimeter" type="perimeter"/>
<xs:element name="corners" type="corners"/>
<xs:element name="single" type="single"/>
<xs:element name="col" type="col"/>
<xs:element name="row" type="row"/>
<xs:element name="region" type="region"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="auto_layout">
<xs:complexContent>
<xs:extension base="layout_info">
<xs:attribute name="aspect_ratio" type="xs:float" default="1.0" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="fixed_layout">
<xs:complexContent>
<xs:extension base="layout_info">
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="width" type="xs:int" use="required" />
<xs:attribute name="height" type="xs:int" use="required" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="layout">
<xs:choice minOccurs="1">
<xs:element name="auto_layout" type="auto_layout" maxOccurs="1"/>
<xs:element name="fixed_layout" type="fixed_layout" maxOccurs="unbounded"/>
</xs:choice>
</xs:complexType>
<xs:simpleType name="switch_block_type">
<xs:restriction base="xs:string">
<xs:enumeration value="wilton"/>
<xs:enumeration value="subset"/>
<xs:enumeration value="universal"/>
<xs:enumeration value="custom"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="fc_type_enum">
<xs:restriction base="xs:string">
<xs:enumeration value="frac"/>
<xs:enumeration value="abs"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="chan_distribution">
<xs:restriction base="xs:string">
<xs:enumeration value="gaussian"/>
<xs:enumeration value="uniform"/>
<xs:enumeration value="pulse"/>
<xs:enumeration value="delta"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="chan_dist">
<xs:attribute name="distr" type="chan_distribution" use="required"/>
<xs:attribute name="peak" type="xs:float" use="required"/>
<xs:attribute name="width" type="xs:float"/>
<xs:attribute name="xpeak" type="xs:float"/>
<xs:attribute name="dc" type="xs:float"/>
</xs:complexType>
<xs:complexType name="chan_width_distr">
<xs:all>
<xs:element name="x" type="chan_dist"/>
<xs:element name="y" type="chan_dist"/>
</xs:all>
</xs:complexType>
<xs:complexType name="device">
<xs:all>
<xs:element name="sizing">
<xs:complexType>
<xs:attribute name="R_minW_nmos" type="xs:float" use="required"/>
<xs:attribute name="R_minW_pmos" type="xs:float" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="connection_block">
<xs:complexType>
<xs:attribute name="input_switch_name" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="area">
<xs:complexType>
<xs:attribute name="grid_logic_tile_area" type="xs:float" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="switch_block">
<xs:complexType>
<xs:attribute name="type" type="switch_block_type" use="required"/>
<xs:attribute name="fs" type="xs:int" default="3"/>
</xs:complexType>
</xs:element>
<xs:element name="chan_width_distr" minOccurs="0" type="chan_width_distr"/>
<xs:element name="default_fc" minOccurs="0">
<xs:complexType>
<xs:attribute name="in_type" type="fc_type_enum" use="required"/>
<xs:attribute name="in_val" type="xs:float" use="required"/>
<xs:attribute name="out_type" type="fc_type_enum" use="required"/>
<xs:attribute name="out_val" type="xs:float" use="required"/>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
<xs:simpleType name="switch_type">
<xs:restriction base="xs:string">
<xs:enumeration value="mux"/>
<xs:enumeration value="tristate"/>
<xs:enumeration value="pass_gate"/>
<xs:enumeration value="short"/>
<xs:enumeration value="buffer"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="buf_size">
<xs:union memberTypes="xs:float">
<xs:simpleType>
<xs:restriction base="xs:NMTOKEN">
<xs:enumeration value="auto"/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
<xs:complexType name="switch">
<xs:sequence>
<xs:element name="Tdel" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="num_inputs" type="xs:int" use="required"/>
<xs:attribute name="delay" type="xs:float" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="type" type="switch_type" use="required"/>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="R" type="xs:float" use="required"/>
<xs:attribute name="Cin" type="xs:float" use="required"/>
<xs:attribute name="Cinternal" type="xs:float"/>
<xs:attribute name="Cout" type="xs:float"/>
<xs:attribute name="Tdel" type="xs:float"/>
<xs:attribute name="buf_size" type="buf_size" default="auto"/>
<xs:attribute name="mux_trans_size" type="xs:float"/>
<xs:attribute name="power_buf_size" type="xs:int"/>
</xs:complexType>
<xs:complexType name="switchlist">
<xs:sequence>
<xs:element name="switch" type="switch" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="pb_type_class">
<xs:restriction base="xs:string">
<xs:enumeration value="lut"/>
<xs:enumeration value="flipflop"/>
<xs:enumeration value="memory"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="input_equivalent">
<xs:restriction base="xs:string">
<xs:enumeration value="none"/>
<xs:enumeration value="full"/>
<xs:enumeration value="instance"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="input_port">
<xs:sequence>
<xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="equivalent" type="input_equivalent" default="none"/>
<xs:attribute name="num_pins" type="xs:int" use="required"/>
<xs:attribute name="is_non_clock_global" type="xs:boolean"/>
<xs:attribute name="port_class" type="xs:string" />
</xs:complexType>
<xs:simpleType name="output_equivalent">
<xs:restriction base="xs:string">
<xs:enumeration value="none"/>
<xs:enumeration value="full"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="output_port">
<xs:sequence>
<xs:element name="metadata" type="metadata" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="equivalent" type="output_equivalent" default="none"/>
<xs:attribute name="num_pins" type="xs:int" use="required"/>
<xs:attribute name="port_class" type="xs:string" />
</xs:complexType>
<xs:simpleType name="clock_equivalent">
<xs:restriction base="xs:string">
<xs:enumeration value="none"/>
<xs:enumeration value="full"/>
<xs:enumeration value="instance"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="clock_port">
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="equivalent" type="clock_equivalent" default="none"/>
<xs:attribute name="num_pins" type="xs:int" use="required"/>
<xs:attribute name="port_class" type="xs:string"/>
</xs:complexType>
<xs:simpleType name="delay_matrix_type">
<xs:restriction base="xs:string">
<xs:enumeration value="min"/>
<xs:enumeration value="max"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="delay_matrix">
<xs:simpleContent>
<xs:extension base="floatlist">
<xs:attribute name="type" type="delay_matrix_type" use="required"/>
<xs:attribute name="in_port" type="xs:string" use="required"/>
<xs:attribute name="out_port" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="T_timing_minmax">
<xs:attribute name="max" type="xs:float"/>
<xs:attribute name="min" type="xs:float"/>
<xs:attribute name="in_port" type="xs:string" use="required"/>
<xs:attribute name="out_port" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="T_timing">
<xs:attribute name="value" type="xs:float" use="required"/>
<xs:attribute name="port" type="xs:string" use="required"/>
<xs:attribute name="clock" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="T_clock_timing">
<xs:attribute name="max" type="xs:float"/>
<xs:attribute name="min" type="xs:float"/>
<xs:attribute name="port" type="xs:string" use="required"/>
<xs:attribute name="clock" type="xs:string" use="required"/>
</xs:complexType>
<xs:group name="timing_group">
<xs:choice>
<xs:element name="delay_constant" type="T_timing_minmax"/>
<xs:element name="delay_matrix" type="delay_matrix"/>
</xs:choice>
</xs:group>
<xs:group name="timing_group_pbtype">
<xs:choice>
<xs:group ref="timing_group" minOccurs="0"/>
<xs:element name="T_setup" type="T_timing"/>
<xs:element name="T_hold" type="T_timing"/>
<xs:element name="T_clock_to_Q" type="T_clock_timing"/>
</xs:choice>
</xs:group>
<xs:complexType name="interconnect_type">
<xs:choice maxOccurs="unbounded">
<xs:element name="pack_pattern" type="pack_pattern"/>
<xs:group ref="timing_group" minOccurs="0"/>
<xs:element name="metadata" type="metadata"/>
</xs:choice>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="input" type="stringlist" use="required"/>
<xs:attribute name="output" type="stringlist" use="required"/>
</xs:complexType>
<xs:complexType name="pack_pattern">
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="in_port" type="stringlist" use="required"/>
<xs:attribute name="out_port" type="stringlist" use="required"/>
</xs:complexType>
<xs:complexType name="interconnect">
<xs:choice maxOccurs="unbounded">
<xs:element name="complete" type="interconnect_type"/>
<xs:element name="direct" type="interconnect_type"/>
<xs:element name="mux" type="interconnect_type"/>
</xs:choice>
</xs:complexType>
<xs:simpleType name="power_estimation_method">
<xs:restriction base="xs:string">
<xs:enumeration value="specify-size"/>
<xs:enumeration value="auto-size"/>
<xs:enumeration value="pin-toggle"/>
<xs:enumeration value="C-internal"/>
<xs:enumeration value="absolute"/>
<xs:enumeration value="ignore"/>
<xs:enumeration value="sum-of-children"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="power_dynamic_power">
<xs:attribute name="power_per_instance" type="xs:float"/>
<xs:attribute name="C_internal" type="xs:float"/>
</xs:complexType>
<xs:complexType name="power_static_power">
<xs:attribute name="power_per_instance" type="xs:float"/>
</xs:complexType>
<xs:complexType name="power_port">
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="energy_per_toggle" type="xs:float" use="required"/>
<xs:attribute name="scaled_by_static_prob" type="xs:string"/>
<xs:attribute name="scaled_by_static_prob_n" type="xs:string"/>
</xs:complexType>
<xs:complexType name="gpower_local_interconnect">
<xs:attribute name="C_wire" type="xs:float" default="0"/>
<xs:attribute name="factor" type="xs:float" default="0.5"/>
</xs:complexType>
<xs:complexType name="gpower_buffers">
<xs:attribute name="logical_effort_factor" type="xs:float" default="4"/>
</xs:complexType>
<xs:complexType name="gpower_ff_size">
<xs:attribute name="FF_size" type="xs:float" use="required"/>
</xs:complexType>
<xs:complexType name="gpower_LUT_transistor_size">
<xs:attribute name="LUT_transistor_size" type="xs:float" use="required"/>
</xs:complexType>
<xs:complexType name="gpower_mux_transistor_size">
<xs:attribute name="mux_transistor_size" type="xs:float" use="required"/>
</xs:complexType>
<xs:complexType name="gpower_sram">
<xs:attribute name="transistors_per_bit" type="xs:float" use="required"/>
</xs:complexType>
<xs:complexType name="power">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="dynamic_power" type="power_dynamic_power"/>
<xs:element name="static_power" type="power_static_power"/>
<xs:element name="port" type="power_port"/>
</xs:choice>
<xs:attribute name="method" type="power_estimation_method" default="auto-size"/>
</xs:complexType>
<!-- Global power is very schema-unfriendly. Default values are assigned if the elements
holding the attributes aren't present. There is no way for XSD to know that.
It could be much better if the <power> tag had all these settings as its own attributes. -->
<xs:complexType name="global_power">
<xs:choice maxOccurs="unbounded">
<xs:element name="local_interconnect" type="gpower_local_interconnect"/>
<xs:element name="buffers" type="gpower_buffers"/>
<xs:element name="sram" type="gpower_sram"/>
<xs:element name="mux_transistor_size" type="gpower_mux_transistor_size"/>
<xs:element name="FF_size" type="gpower_ff_size"/>
<xs:element name="LUT_transistor_size" type="gpower_LUT_transistor_size"/>
</xs:choice>
<xs:attribute name="method" type="power_estimation_method" default="auto-size"/>
</xs:complexType>
<xs:simpleType name="pinlocations_pattern">
<xs:restriction base="xs:string">
<xs:enumeration value="spread"/>
<xs:enumeration value="spread_inputs_perimeter_outputs"/>
<xs:enumeration value="perimeter"/>
<xs:enumeration value="custom"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="loc_side">
<xs:restriction base="xs:string">
<xs:enumeration value="left"/>
<xs:enumeration value="right"/>
<xs:enumeration value="bottom"/>
<xs:enumeration value="top"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="loc">
<xs:simpleContent>
<xs:extension base="stringlist">
<xs:attribute name="side" type="loc_side" use="required"/>
<xs:attribute name="xoffset" type="xs:int" default="0"/>
<xs:attribute name="yoffset" type="xs:int" default="0"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="pinlocations">
<xs:sequence>
<xs:element name="loc" type="loc" maxOccurs="unbounded" minOccurs="0" />
</xs:sequence>
<xs:attribute name="pattern" type="pinlocations_pattern"/>
</xs:complexType>
<xs:simpleType name="switchblock_locations_pattern">
<xs:restriction base="xs:string">
<xs:enumeration value="external_full_internal_straight"/>
<xs:enumeration value="all"/>
<xs:enumeration value="external"/>
<xs:enumeration value="internal"/>
<xs:enumeration value="none"/>
<xs:enumeration value="custom"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="sb_loc_type">
<xs:restriction base="xs:string">
<xs:enumeration value="full"/>
<xs:enumeration value="straight"/>
<xs:enumeration value="turns"/>
<xs:enumeration value="none"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="sb_loc">
<xs:attribute name="type" type="sb_loc_type" default="full"/>
<xs:attribute name="xoffset" type="xs:int" default="0"/>
<xs:attribute name="yoffset" type="xs:int" default="0"/>
<xs:attribute name="switch_override" type="xs:string"/>
</xs:complexType>
<xs:complexType name="switchblock_locations">
<xs:sequence>
<xs:element name="sb_loc" type="sb_loc" maxOccurs="unbounded" minOccurs="0" />
</xs:sequence>
<xs:attribute name="pattern" type="switchblock_locations_pattern" default="external_full_internal_straight"/>
<xs:attribute name="internal_switch" type="xs:string"/>
</xs:complexType>
<xs:complexType name="fc">
<xs:sequence>
<xs:element name="fc_override" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="fc_type" type="fc_type_enum" use="required"/>
<xs:attribute name="fc_val" type="xs:float" use="required"/>
<xs:attribute name="port_name" type="xs:string"/>
<xs:attribute name="segment_name" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="in_type" type="fc_type_enum" use="required"/>
<xs:attribute name="in_val" type="xs:float" use="required"/>
<xs:attribute name="out_type" type="fc_type_enum" use="required"/>
<xs:attribute name="out_val" type="xs:float" use="required"/>
</xs:complexType>
<xs:complexType name="mode">
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element name="pb_type" type="pb_type"/>
<xs:element name="pb_array" type="pb_array"/>
<xs:element name="interconnect" type="interconnect"/>
<xs:element name="pinlocations" type="pinlocations"/>
<xs:element name="switchblock_locations" type="switchblock_locations"/>
<xs:element name="metadata" type="metadata"/>
</xs:choice>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="map">
<xs:attribute name="from" type="xs:string" use="required"/>
<xs:attribute name="to" type="xs:string" use="required"/>
<xs:attribute name="num_pins" type="xs:string"/>
</xs:complexType>
<xs:complexType name="tile_mode">
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element name="map" type="map"/>
</xs:choice>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="equivalent_sites">
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element name="site"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="tile">
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element name="input" type="input_port"/>
<xs:element name="output" type="output_port"/>
<xs:element name="clock" type="clock_port"/>
<xs:element name="equivalent_sites" type="equivalent_sites"/>
<xs:element name="pinlocations" type="pinlocations"/>
<xs:element name="fc" type="fc"/>
<xs:element name="switchblock_locations" type="switchblock_locations"/>
</xs:choice>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="capacity" type="xs:int"/>
<xs:attribute name="width" type="xs:int"/>
<xs:attribute name="height" type="xs:int"/>
<xs:attribute name="area" type="xs:float"/>
</xs:complexType>
<xs:complexType name="tiles">
<xs:sequence>
<xs:element name="tile" type="tile" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="pb_type">
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element name="pb_type" type="pb_type"/>
<xs:element name="pb_array" type="pb_array"/>
<xs:element name="input" type="input_port"/>
<xs:element name="output" type="output_port"/>
<xs:element name="clock" type="clock_port"/>
<xs:element name="metadata" type="metadata"/>
<xs:element name="mode" type="mode"/>
<xs:element name="interconnect" type="interconnect"/>
<xs:group ref="timing_group_pbtype"/>
<xs:element name="power" type="power"/>
</xs:choice>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="num_pb" type="xs:int"/>
<xs:attribute name="blif_model" type="xs:string"/>
<xs:attribute name="class" type="pb_type_class"/>
</xs:complexType>
<xs:complexType name="pb_array">
<xs:sequence>
<xs:element name="pb_type" type="pb_type" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="segment_type">
<xs:restriction base="xs:string">
<xs:enumeration value="bidir"/>
<xs:enumeration value="unidir"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="segment_length">
<xs:union memberTypes="xs:nonNegativeInteger">
<xs:simpleType>
<xs:restriction base="xs:NMTOKEN">
<xs:enumeration value="longline"/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
<xs:complexType name="complexblocklist">
<xs:sequence>
<xs:element name="pb_type" type="pb_type" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="segment_block">
<xs:simpleContent>
<xs:extension base="intlist">
<xs:attribute name="type" type="xs:string" use="required" fixed="pattern"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="segment_mux">
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="segment_wire_switch">
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
<!-- Segment type relies on the "type" attr to determine the required children.
XSD 1.1 provides an <alternative> tag to check some attribute and choose a sub-type.
Segment wire_switches and opin_switches correspond to switch names.
XSD 1.1 also provides a <keyref> tag which asserts a correspondence to some value
at an XPath.
Being able to use these tags requires some work in the parser generator.
Therefore, for now, further validation about segments should be implemented in the postprocessor. -->
<xs:complexType name="segment">
<xs:choice maxOccurs="unbounded">
<xs:element name="sb" type="segment_block"/>
<xs:element name="cb" type="segment_block"/>
<xs:element name="mux" type="segment_mux"/>
<xs:element name="wire_switch" type="segment_wire_switch"/>
<xs:element name="opin_switch" type="segment_wire_switch"/>
</xs:choice>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="length" type="segment_length" use="required"/>
<xs:attribute name="type" type="segment_type" use="required"/>
<xs:attribute name="freq" type="xs:float" use="required"/>
<xs:attribute name="Rmetal" type="xs:float" use="required"/>
<xs:attribute name="Cmetal" type="xs:float" use="required"/>
</xs:complexType>
<xs:complexType name="segmentlist">
<xs:sequence>
<xs:element name="segment" type="segment" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="direct">
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="from_pin" type="xs:string" use="required"/>
<xs:attribute name="to_pin" type="xs:string" use="required"/>
<xs:attribute name="x_offset" type="xs:int" use="required"/>
<xs:attribute name="y_offset" type="xs:int" use="required"/>
<xs:attribute name="z_offset" type="xs:int" use="required"/>
<xs:attribute name="switch_name" type="xs:string"/>
</xs:complexType>
<xs:complexType name="directlist">
<xs:sequence>
<xs:element name="direct" type="direct" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="switchblock_location_type">
<xs:restriction base="xs:string">
<xs:enumeration value="EVERYWHERE"/>
<xs:enumeration value="PERIMETER"/>
<xs:enumeration value="CORNER"/>
<xs:enumeration value="FRINGE"/>
<xs:enumeration value="CORE"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="switchblock_location">
<xs:attribute name="type" type="switchblock_location_type" use="required"/>
</xs:complexType>
<xs:simpleType name="switchblock_type">
<xs:restriction base="xs:string">
<xs:enumeration value="bidir"/>
<xs:enumeration value="unidir"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="func_type">
<xs:restriction base="xs:string">
<xs:enumeration value="lt"/>
<xs:enumeration value="lr"/>
<xs:enumeration value="lb"/>
<xs:enumeration value="tr"/>
<xs:enumeration value="tb"/>
<xs:enumeration value="tl"/>
<xs:enumeration value="rb"/>
<xs:enumeration value="rl"/>
<xs:enumeration value="rt"/>
<xs:enumeration value="bl"/>
<xs:enumeration value="bt"/>
<xs:enumeration value="br"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="switchblock_func">
<xs:sequence>
<xs:element name="func" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="type" type="func_type" use="required" />
<xs:attribute name="formula" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="wireconn_connection">
<xs:attribute name="type" type="xs:string" use="required"/>
<xs:attribute name="switchpoint" type="xs:string" use="required"/>
</xs:complexType>
<!-- It would be better to change the string or int lists here to use whitespace as a
delimiter instead of commas, so they can be expressed as <xs:list>s instead of
just strings. -->
<xs:complexType name="wireconn">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="from" type="wireconn_connection" maxOccurs="unbounded"/>
<xs:element name="to" type="wireconn_connection" maxOccurs="unbounded"/>
</xs:choice>
<xs:attribute name="num_conns_type" type="xs:string" use="required"/>
<xs:attribute name="from_type" type="xs:string"/>
<xs:attribute name="to_type" type="xs:string"/>
<xs:attribute name="from_switchpoint" type="xs:string"/>
<xs:attribute name="to_switchpoint" type="xs:string"/>
</xs:complexType>
<xs:complexType name="switchblock">
<xs:sequence>
<xs:element name="switchblock_location" type="switchblock_location"/>
<xs:element name="switchfuncs" type="switchblock_func"/>
<xs:element name="wireconn" type="wireconn" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="type" type="switchblock_type" use="required"/>
</xs:complexType>
<xs:complexType name="switchblocklist">
<xs:sequence>
<xs:element name="switchblock" type="switchblock" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="clock">
<xs:attribute name="C_wire" type="xs:float"/>
<xs:attribute name="C_wire_per_m" type="xs:float"/>
<xs:attribute name="buffer_size" type="buf_size"/>
</xs:complexType>
<xs:complexType name="clocks">
<xs:sequence>
<xs:element name="clock" type="clock" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:element name="architecture">
<xs:complexType>
<xs:all>
<xs:element name="models" type="models"/>
<xs:element name="layout" type="layout"/>
<xs:element name="device" type="device"/>
<xs:element name="switchlist" type="switchlist"/>
<xs:element name="segmentlist" type="segmentlist"/>
<xs:element name="switchblocklist" type="switchblocklist" minOccurs="0"/>
<xs:element name="complexblocklist" type="complexblocklist"/>
<xs:element name="directlist" type="directlist" minOccurs="0"/>
<xs:element name="power" type="global_power" minOccurs="0"/>
<xs:element name="clocks" type="clocks" minOccurs="0"/>
<xs:element name="tiles" type="tiles" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>