blob: efd964a9b0f5a9a9d7261129874d5e7d2d93a162 [file] [log] [blame]
<?xml version="1.0"?>
<!--
Copyright (C) 2020 The SymbiFlow Authors.
Use of this source code is governed by a ISC-style
license that can be found in the LICENSE file or at
https://opensource.org/licenses/ISC
SPDX-License-Identifier: ISC
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>