Add preliminary schemas for VPR XML files.

Signed-off-by: Jeppe Johansen <jeppe@j-software.dk>
diff --git a/fpga_architecture.xsd b/fpga_architecture.xsd
new file mode 100644
index 0000000..40855e0
--- /dev/null
+++ b/fpga_architecture.xsd
@@ -0,0 +1,667 @@
+<?xml version="1.0"?>

+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

+

+  <xs:complexType name="port">

+    <xs:attribute name="name" type="xs:string" use="required" />

+    <xs:attribute name="is_clock" type="xs:boolean" />

+    <xs:attribute name="clock" type="xs:string" />

+    <xs:attribute name="combinational_sink_ports" type="xs:string" />

+  </xs:complexType>

+

+  <xs:complexType name="port_list">

+    <xs:sequence>

+      <xs:element name="port" type="port" maxOccurs="unbounded" />

+    </xs:sequence>

+  </xs:complexType>

+

+  <xs:complexType name="model_type">

+    <xs:choice maxOccurs="unbounded">

+      <xs:element name="input_ports" type="port_list"/>

+      <xs:element name="output_ports" type="port_list"/>

+    </xs:choice>

+    <xs:attribute name="name" type="xs:string" use="required" />

+  </xs:complexType>

+

+  <xs:complexType name="models">

+    <xs:sequence>

+      <xs:element name="model" type="model_type" maxOccurs="unbounded"/>

+    </xs:sequence>

+  </xs:complexType>

+

+  <xs:complexType name="fill">

+    <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:attribute name="type" type="xs:string" use="required"/>

+    <xs:attribute name="priority" type="xs:int" use="required"/>

+  </xs:complexType>

+

+  <xs:complexType name="corners">

+    <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: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: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: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: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 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:double" 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:double" use="required"/>

+    <xs:attribute name="width" type="xs:double"/>

+    <xs:attribute name="xpeak" type="xs:double"/>

+    <xs:attribute name="dc" type="xs:double"/>

+  </xs:complexType>

+

+  <xs:complexType name="chan_width_distr">

+    <xs:choice maxOccurs="unbounded">

+      <xs:element name="x" type="chan_dist"/>

+      <xs:element name="y" type="chan_dist"/>

+    </xs:choice>

+  </xs:complexType>

+

+  <xs:complexType name="device">

+    <xs:all>

+      <xs:element name="sizing">

+        <xs:complexType>

+          <xs:attribute name="R_minW_nmos" type="xs:double" use="required"/>

+          <xs:attribute name="R_minW_pmos" type="xs:double" 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:double" 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" use="required"/>

+        </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"/>

+          <xs:attribute name="in_val" type="xs:double"/>

+          <xs:attribute name="out_type" type="fc_type_enum"/>

+          <xs:attribute name="out_val" type="xs:double"/>

+        </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:double">

+      <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:double" 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:double" use="required"/>

+    <xs:attribute name="Cin" type="xs:double" use="required"/>

+    <xs:attribute name="Cout" type="xs:double" use="required"/>

+    <xs:attribute name="Tdel" type="xs:double"/>

+    <xs:attribute name="buf_size" type="buf_size" default="auto"/>

+    <xs:attribute name="mux_trans_size" type="xs:double"/>

+    <xs:attribute name="power_buf_size" type="xs:double"/>

+  </xs:complexType>

+

+  <xs:complexType name="switchlist">

+    <xs:sequence>

+      <xs:element name="switch" type="switch" 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:complexType name="pb_type_input">

+    <xs:attribute name="name" type="xs:string" use="required"/>

+    <xs:attribute name="num_pins" type="xs:int" use="required"/>

+    <xs:attribute name="equivalent" type="xs:boolean" default="false"/>

+    <xs:attribute name="is_non_clock_global" type="xs:boolean"/>

+    <xs:attribute name="port_class" type="xs:string" />

+  </xs:complexType>

+

+  <xs:complexType name="pb_type_output">

+    <xs:attribute name="name" type="xs:string" use="required"/>

+    <xs:attribute name="num_pins" type="xs:int" use="required"/>

+    <xs:attribute name="equivalent" type="xs:boolean" default="false"/>

+    <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="xs:string">

+        <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:double"/>

+    <xs:attribute name="min" type="xs:double"/>

+    <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:double" 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:double"/>

+    <xs:attribute name="min" type="xs:double"/>

+    <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:group ref="timing_group" minOccurs="0"/>

+    <xs:attribute name="name" type="xs:string" use="required"/>

+    <xs:attribute name="input" type="xs:string" use="required"/>

+    <xs:attribute name="output" type="xs:string" 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:element name="pack_pattern">

+        <xs:complexType>

+          <xs:attribute name="name" type="xs:string" use="required"/>

+          <xs:attribute name="in_port" type="xs:string" use="required"/>

+          <xs:attribute name="out_port" type="xs:string" use="required"/>

+        </xs:complexType>

+      </xs:element>

+    </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">

+    <xs:choice maxOccurs="unbounded">

+      <xs:element name="dynamic_power">

+        <xs:complexType>

+          <xs:attribute name="power_per_instance" type="xs:double"/>

+          <xs:attribute name="C_internal" type="xs:double"/>

+        </xs:complexType>

+      </xs:element>

+      <xs:element name="static_power">

+        <xs:complexType>

+          <xs:attribute name="power_per_instance" type="xs:double"/>

+        </xs:complexType>

+      </xs:element>

+      <xs:element name="port">

+        <xs:complexType>

+          <xs:attribute name="name" type="xs:string" use="required"/>

+          <xs:attribute name="energy_per_toggle" type="xs:double" 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:element>

+    </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="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="pinlocations">

+    <xs:sequence>

+      <xs:element name="loc" maxOccurs="unbounded" minOccurs="0">

+        <xs:complexType>

+          <xs:simpleContent>

+            <xs:extension base="xs:string">

+              <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:element>

+    </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:complexType name="switchblock_locations">

+    <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:double" 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:double" use="required"/>

+    <xs:attribute name="out_type" type="fc_type_enum" use="required"/>

+    <xs:attribute name="out_val" type="xs:double" use="required"/>

+  </xs:complexType>

+

+  <xs:complexType name="pb_type">

+    <xs:choice maxOccurs="unbounded" minOccurs="0">

+      <xs:element name="pb_type" type="pb_type"/>

+      <xs:element name="input" type="pb_type_input"/>

+      <xs:element name="output" type="pb_type_output"/>

+      <xs:element name="clock" type="pb_type_output"/>

+      <xs:element name="mode">

+        <xs:complexType>

+          <xs:choice maxOccurs="unbounded" minOccurs="0">

+            <xs:element name="pb_type" type="pb_type"/>

+            <xs:element name="interconnect" type="interconnect"/>

+            <xs:element name="pinlocations" type="pinlocations"/>

+            <xs:element name="switchblock_locations" type="switchblock_locations"/>

+          </xs:choice>

+          <xs:attribute name="name" type="xs:string" use="required"/>

+        </xs:complexType>

+      </xs:element>

+      <xs:element name="interconnect" type="interconnect"/>

+      <xs:element name="pinlocations" type="pinlocations"/>

+      <xs:element name="switchblock_locations" type="switchblock_locations"/>

+      <xs:element name="fc" type="fc"/>

+      <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="capacity" type="xs:int"/>

+    <xs:attribute name="width" type="xs:int"/>

+    <xs:attribute name="height" type="xs:int"/>

+    <xs:attribute name="area" type="xs:double"/>

+    <xs:attribute name="class" type="pb_type_class"/>

+  </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="xs:string">

+        <xs:attribute name="type" use="required">

+          <xs:simpleType>

+            <xs:restriction base="xs:string">

+              <xs:enumeration value="pattern"/>

+            </xs:restriction>

+          </xs:simpleType>

+        </xs:attribute>

+      </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>

+

+  <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:double" use="required"/>

+    <xs:attribute name="Rmetal" type="xs:double" use="required"/>

+    <xs:attribute name="Cmetal" type="xs:double" use="required"/>

+  </xs:complexType>

+

+  <xs:complexType name="segmentlist">

+    <xs:sequence>

+      <xs:element name="segment" type="segment" 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" use="required"/>

+  </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">

+    <xs:choice maxOccurs="unbounded">

+      <xs:element name="from" maxOccurs="unbounded">

+        <xs:complexType>

+          <xs:attribute name="type" type="xs:string" use="required"/>

+          <xs:attribute name="switchpoint" type="xs:string" use="required"/>

+        </xs:complexType>

+      </xs:element>

+      <xs:element name="to" maxOccurs="unbounded">

+        <xs:complexType>

+          <xs:attribute name="type" type="xs:string" use="required"/>

+          <xs:attribute name="switchpoint" type="xs:string" use="required"/>

+        </xs:complexType>

+      </xs:element>

+    </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" maxOccurs="unbounded"/>

+      <xs:element name="switchfuncs" type="switchblock_func" maxOccurs="unbounded"/>

+      <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:element name="architecture">

+    <xs:complexType>

+      <xs:choice minOccurs="0" maxOccurs="unbounded">

+        <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="switchblocklist" type="switchblocklist"/>

+        <xs:element name="segmentlist" type="segmentlist"/>

+        <xs:element name="directlist" type="directlist"/>

+        <xs:element name="complexblocklist" type="complexblocklist"/>

+      </xs:choice>

+    </xs:complexType>

+  </xs:element>

+

+</xs:schema>
\ No newline at end of file
diff --git a/packed_netlist.xsd b/packed_netlist.xsd
new file mode 100644
index 0000000..e7c7cba
--- /dev/null
+++ b/packed_netlist.xsd
@@ -0,0 +1,71 @@
+<?xml version="1.0"?>

+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

+

+  <xs:complexType name="named_value">

+    <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="port">

+    <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="port_rotation_map">

+    <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="port_group">

+    <xs:sequence>

+      <xs:element name="port" type="port" minOccurs="0" maxOccurs="unbounded"/>

+    </xs:sequence>

+  </xs:complexType>

+

+  <xs:complexType name="block">

+    <xs:choice minOccurs="0" maxOccurs="unbounded">

+      <xs:element name="inputs">

+        <xs:complexType>

+          <xs:choice minOccurs="0" maxOccurs="unbounded">

+            <xs:element name="port" type="port"/>

+            <xs:element name="port_rotation_map" type="port_rotation_map"/>

+          </xs:choice>

+        </xs:complexType>

+      </xs:element>

+      <xs:element name="outputs" type="port_group"/>

+      <xs:element name="clocks" type="port_group"/>

+      <xs:element name="attributes">

+        <xs:complexType>

+          <xs:sequence>

+            <xs:element name="attribute" type="named_value" minOccurs="0" maxOccurs="unbounded"/>

+          </xs:sequence>

+        </xs:complexType>

+      </xs:element>

+      <xs:element name="parameters">

+        <xs:complexType>

+          <xs:sequence>

+            <xs:element name="parameter" type="named_value" minOccurs="0" maxOccurs="unbounded"/>

+          </xs:sequence>

+        </xs:complexType>

+      </xs:element>

+

+      <xs:element name="block" type="block"/>

+    </xs:choice>

+

+    <xs:attribute name="name" type="xs:string"/>

+    <xs:attribute name="instance" type="xs:string"/>

+    <xs:attribute name="mode" type="xs:string"/>

+  </xs:complexType>

+

+  <xs:element name="block" type="block"/>

+

+</xs:schema>
\ No newline at end of file
diff --git a/routing_resource.xsd b/routing_resource.xsd
new file mode 100644
index 0000000..7d4ec5b
--- /dev/null
+++ b/routing_resource.xsd
@@ -0,0 +1,240 @@
+<?xml version="1.0"?>

+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

+

+  <xs:complexType name="channel">

+    <xs:attribute name="chan_width_max" type="xs:int" use="required"/>

+    <xs:attribute name="x_min" type="xs:int" use="required"/>

+    <xs:attribute name="y_min" type="xs:int" use="required"/>

+    <xs:attribute name="x_max" type="xs:int" use="required"/>

+    <xs:attribute name="y_max" type="xs:int" use="required"/>

+  </xs:complexType>

+

+  <xs:complexType name="x_list">

+    <xs:attribute name="index" type="xs:int" use="required"/>

+    <xs:attribute name="info" type="xs:int" use="required"/>

+  </xs:complexType>

+

+  <xs:complexType name="y_list">

+    <xs:attribute name="index" type="xs:int" use="required"/>

+    <xs:attribute name="info" type="xs:int" use="required"/>

+  </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:complexType name="timing">

+    <xs:attribute name="R" type="xs:double"/>

+    <xs:attribute name="Cin" type="xs:double"/>

+    <xs:attribute name="Cout" type="xs:double"/>

+    <xs:attribute name="Tdel" type="xs:double"/>

+  </xs:complexType>

+

+  <xs:complexType name="sizing">

+    <xs:attribute name="mux_trans_size" type="xs:int" use="required"/>

+    <xs:attribute name="buf_size" type="xs:double" use="required"/>

+  </xs:complexType>

+

+  <xs:complexType name="switch">

+    <xs:choice maxOccurs="unbounded">

+      <xs:element name="timing" type="timing"/>

+      <xs:element name="sizing" type="sizing"/>

+    </xs:choice>

+    <xs:attribute name="id" type="xs:int" use="required"/>

+    <xs:attribute name="name" type="xs:string" use="required"/>

+    <xs:attribute name="type" type="switch_type"/>

+  </xs:complexType>

+

+  <xs:complexType name="segment_timing">

+    <xs:attribute name="R_per_meter" type="xs:double"/>

+    <xs:attribute name="C_per_meter" type="xs:double"/>

+  </xs:complexType>

+

+  <xs:complexType name="segment">

+    <xs:sequence>

+      <xs:element name="timing" type="segment_timing" maxOccurs="unbounded"/>

+    </xs:sequence>

+    <xs:attribute name="id" type="xs:int" use="required"/>

+    <xs:attribute name="name" type="xs:string" use="required"/>

+  </xs:complexType>

+

+  <xs:complexType name="pin">

+    <xs:simpleContent>

+      <xs:extension base="xs:string">

+        <xs:attribute name="ptc" type="xs:int" use="required"/>

+      </xs:extension>

+    </xs:simpleContent>

+  </xs:complexType>

+

+  <xs:complexType name="pin_class">

+    <xs:sequence>

+      <xs:element name="pin" type="pin" maxOccurs="unbounded"/>

+    </xs:sequence>

+    <xs:attribute name="type" type="pin_type" use="required"/>

+  </xs:complexType>

+

+  <xs:complexType name="block_type">

+    <xs:sequence>

+      <xs:element name="pin_class" type="pin_class" maxOccurs="unbounded"/>

+    </xs:sequence>

+    <xs:attribute name="id" type="xs:int" use="required"/>

+    <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:complexType>

+

+  <xs:simpleType name="pin_type">

+    <xs:restriction base="xs:string">

+      <xs:enumeration value="OPEN"/>

+      <xs:enumeration value="OUTPUT"/>

+      <xs:enumeration value="INPUT"/>

+    </xs:restriction>

+  </xs:simpleType>

+

+  <xs:complexType name="grid_loc">

+    <xs:attribute name="x" type="xs:int" use="required"/>

+    <xs:attribute name="y" type="xs:int" use="required"/>

+    <xs:attribute name="block_type_id" type="xs:int" use="required"/>

+    <xs:attribute name="width_offset" type="xs:int" use="required"/>

+    <xs:attribute name="height_offset" type="xs:int" use="required"/>

+  </xs:complexType>

+

+  <xs:simpleType name="node_type">

+    <xs:restriction base="xs:string">

+      <xs:enumeration value="CHANX"/>

+      <xs:enumeration value="CHANY"/>

+      <xs:enumeration value="SOURCE"/>

+      <xs:enumeration value="SINK"/>

+      <xs:enumeration value="OPIN"/>

+      <xs:enumeration value="IPIN"/>

+    </xs:restriction>

+  </xs:simpleType>

+

+  <xs:simpleType name="node_direction">

+    <xs:restriction base="xs:string">

+      <xs:enumeration value="INC_DIR"/>

+      <xs:enumeration value="DEC_DIR"/>

+      <xs:enumeration value="BI_DIR"/>

+    </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="TOP"/>

+      <xs:enumeration value="BOTTOM"/>

+    </xs:restriction>

+  </xs:simpleType>

+

+  <xs:complexType name="node_loc">

+    <xs:attribute name="xlow" type="xs:int" use="required"/>

+    <xs:attribute name="ylow" type="xs:int" use="required"/>

+    <xs:attribute name="xhigh" type="xs:int" use="required"/>

+    <xs:attribute name="yhigh" type="xs:int" use="required"/>

+    <xs:attribute name="side" type="loc_side"/>

+    <xs:attribute name="ptc" type="xs:int" use="required"/>

+  </xs:complexType>

+

+  <xs:complexType name="node_timing">

+    <xs:attribute name="R" type="xs:double" use="required"/>

+    <xs:attribute name="C" type="xs:double" use="required"/>

+  </xs:complexType>

+

+  <xs:complexType name="node_segment">

+    <xs:attribute name="segment_id" type="xs:int" use="required"/>

+  </xs:complexType>

+

+  <xs:complexType name="node">

+    <xs:choice maxOccurs="unbounded">

+      <xs:element name="loc" type="node_loc"/>

+      <xs:element name="timing" type="node_timing"/>

+      <xs:element name="segment" type="node_segment"/>

+    </xs:choice>

+    <xs:attribute name="id" type="xs:int" use="required"/>

+    <xs:attribute name="type" type="node_type" use="required"/>

+    <xs:attribute name="direction" type="node_direction"/>

+    <xs:attribute name="capacity" type="xs:int" use="required"/>

+  </xs:complexType>

+

+  <xs:complexType name="edge">

+    <xs:attribute name="src_node" type="xs:int" use="required"/>

+    <xs:attribute name="sink_node" type="xs:int" use="required"/>

+    <xs:attribute name="switch_id" type="xs:int" use="required"/>

+  </xs:complexType>

+

+  <xs:element name="rr_graph">

+    <xs:complexType>

+      <xs:choice maxOccurs="unbounded">

+        <xs:element name="channels">

+          <xs:complexType>

+            <xs:choice maxOccurs="unbounded">

+              <xs:element name="channel" type="channel"/>

+              <xs:element name="x_list" type="x_list"/>

+              <xs:element name="y_list" type="y_list"/>

+            </xs:choice>

+          </xs:complexType>

+        </xs:element>

+

+        <xs:element name="switches">

+          <xs:complexType>

+            <xs:sequence>

+              <xs:element name="switch" type="switch" maxOccurs="unbounded"/>

+            </xs:sequence>

+          </xs:complexType>

+        </xs:element>

+

+        <xs:element name="segments">

+          <xs:complexType>

+            <xs:sequence>

+              <xs:element name="segment" type="segment" maxOccurs="unbounded"/>

+            </xs:sequence>

+          </xs:complexType>

+        </xs:element>

+

+        <xs:element name="block_types">

+          <xs:complexType>

+            <xs:sequence>

+              <xs:element name="block_type" type="block_type" maxOccurs="unbounded"/>

+            </xs:sequence>

+          </xs:complexType>

+        </xs:element>

+

+        <xs:element name="grid">

+          <xs:complexType>

+            <xs:sequence>

+              <xs:element name="grid_loc" type="grid_loc" maxOccurs="unbounded"/>

+            </xs:sequence>

+          </xs:complexType>

+        </xs:element>

+

+        <xs:element name="rr_nodes">

+          <xs:complexType>

+            <xs:choice maxOccurs="unbounded">

+              <xs:element name="node" type="node"/>

+            </xs:choice>

+          </xs:complexType>

+        </xs:element>

+

+        <xs:element name="rr_edges">

+          <xs:complexType>

+            <xs:choice maxOccurs="unbounded">

+              <xs:element name="edge" type="edge"/>

+            </xs:choice>

+          </xs:complexType>

+        </xs:element>

+      </xs:choice>

+

+      <xs:attribute name="tool_name" type="xs:string"/>

+      <xs:attribute name="tool_version" type="xs:string"/>

+      <xs:attribute name="tool_comment" type="xs:string"/>

+    </xs:complexType>

+  </xs:element>

+

+</xs:schema>
\ No newline at end of file