Add missing power and clocks elements.
Added sb_loc elements.
Changed pb_type io equivalent to match definitions uses in VPR archdefs.
Made fs in switch_block optional, as it can be for custom switch_blocks.
Added device_layout as an alias for fixed_layout.

Signed-off-by: Jeppe Johansen <jeppe@j-software.dk>
diff --git a/fpga_architecture.xsd b/fpga_architecture.xsd
index 4fc6d50..6d93afd 100644
--- a/fpga_architecture.xsd
+++ b/fpga_architecture.xsd
@@ -62,7 +62,7 @@
 

   <xs:complexType name="models">

     <xs:sequence>

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

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

     </xs:sequence>

   </xs:complexType>

 

@@ -126,7 +126,7 @@
   </xs:complexType>

 

   <xs:complexType name="layout_info">

-    <xs:choice maxOccurs="unbounded">

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

       <xs:element name="fill" type="fill"/>

       <xs:element name="perimeter" type="perimeter"/>

       <xs:element name="corners" type="corners"/>

@@ -159,6 +159,7 @@
     <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:element name="device_layout" type="fixed_layout" maxOccurs="unbounded"/> <!-- Apparently a legacy name -->

     </xs:choice>

   </xs:complexType>

 

@@ -223,7 +224,7 @@
       <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:attribute name="fs" type="xs:int"/>

         </xs:complexType>

       </xs:element>

       <xs:element name="chan_width_distr" minOccurs="0" type="chan_width_distr"/>

@@ -271,7 +272,7 @@
     <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="Cout" type="xs:double"/>

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

@@ -292,10 +293,20 @@
     </xs:restriction>

   </xs:simpleType>

 

+  <xs:simpleType name="pb_io_equivalent">

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

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

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

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

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

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

+    </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="equivalent" type="pb_io_equivalent" default="false"/>

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

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

   </xs:complexType>

@@ -303,7 +314,7 @@
   <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="equivalent" type="pb_io_equivalent" default="false"/>

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

   </xs:complexType>

 

@@ -396,27 +407,59 @@
     </xs:restriction>

   </xs:simpleType>

 

+  <xs:complexType name="power_dynamic_power">

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

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

+  </xs:complexType>

+  

+  <xs:complexType name="power_static_power">

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

+  </xs:complexType>

+  

+  <xs:complexType name="power_port">

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

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

+    <xs:attribute name="factor" type="xs:double" default="0.5"/>

+  </xs:complexType>

+  

+  <xs:complexType name="power_buffers">

+    <xs:attribute name="logical_effort_factor" type="xs:double" default="4"/>

+  </xs:complexType>

+  

+  <xs:complexType name="power_ff_size">

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

+  </xs:complexType>

+  

+  <xs:complexType name="power_LUT_transistor_size">

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

+  </xs:complexType>

+  

+  <xs:complexType name="power_mux_transistor_size">

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

+

+  <xs:complexType name="global_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:element name="local_interconnect" type="power_local_interconnect"/>

+      <xs:element name="buffers" type="power_buffers"/>

+      <xs:element name="mux_transistor_size" type="power_mux_transistor_size"/>

+      <xs:element name="FF_size" type="power_ff_size"/>

+      <xs:element name="LUT_transistor_size" type="power_LUT_transistor_size"/>

     </xs:choice>

     <xs:attribute name="method" type="power_estimation_method" default="auto-size"/>

   </xs:complexType>

@@ -424,6 +467,7 @@
   <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>

@@ -466,7 +510,26 @@
     </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>

@@ -571,7 +634,7 @@
       <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="name" type="xs:string"/>

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

@@ -650,20 +713,15 @@
     </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>

+  

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

@@ -688,6 +746,18 @@
     </xs:sequence>

   </xs:complexType>

 

+  <xs:complexType name="clock">

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

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

+    <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:choice minOccurs="0" maxOccurs="unbounded">

@@ -697,6 +767,8 @@
         <xs:element name="switchlist" type="switchlist"/>

         <xs:element name="switchblocklist" type="switchblocklist"/>

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

+        <xs:element name="power" type="global_power"/>

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

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

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

       </xs:choice>