revise arch schema Signed-off-by: Fahrican Koşar <duck2@protonmail.com>
diff --git a/fpga_architecture.xsd b/fpga_architecture.xsd index ac0f0e7..bcbd6a0 100644 --- a/fpga_architecture.xsd +++ b/fpga_architecture.xsd
@@ -52,31 +52,40 @@ </xs:sequence> </xs:complexType> - <xs:complexType name="model_type"> - <xs:choice maxOccurs="unbounded"> + <xs:complexType name="model"> + <xs:all> <xs:element name="input_ports" type="port_list"/> <xs:element name="output_ports" type="port_list"/> - </xs:choice> + </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_type" minOccurs="0" maxOccurs="unbounded"/> + <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> @@ -92,6 +101,9 @@ </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"/> @@ -101,6 +113,9 @@ </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"/> @@ -111,6 +126,9 @@ </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"/> @@ -140,7 +158,7 @@ <xs:complexType name="auto_layout"> <xs:complexContent> <xs:extension base="layout_info"> - <xs:attribute name="aspect_ratio" type="xs:double" default="1.0" /> + <xs:attribute name="aspect_ratio" type="xs:float" default="1.0" /> </xs:extension> </xs:complexContent> </xs:complexType> @@ -159,7 +177,6 @@ <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> @@ -197,18 +214,18 @@ </xs:complexType> <xs:complexType name="chan_width_distr"> - <xs:choice maxOccurs="unbounded"> + <xs:all> <xs:element name="x" type="chan_dist"/> <xs:element name="y" type="chan_dist"/> - </xs:choice> + </xs:all> </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: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"> @@ -218,22 +235,22 @@ </xs:element> <xs:element name="area"> <xs:complexType> - <xs:attribute name="grid_logic_tile_area" type="xs:double" use="required"/> + <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"/> + <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"/> - <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: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:element> </xs:all> @@ -250,7 +267,7 @@ </xs:simpleType> <xs:simpleType name="buf_size"> - <xs:union memberTypes="xs:double"> + <xs:union memberTypes="xs:float"> <xs:simpleType> <xs:restriction base="xs:NMTOKEN"> <xs:enumeration value="auto"/> @@ -264,25 +281,25 @@ <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: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:double" use="required"/> - <xs:attribute name="Cin" type="xs:double" use="required"/> - <xs:attribute name="Cinternal" type="xs:double"/> - <xs:attribute name="Cout" type="xs:double"/> - <xs:attribute name="Tdel" type="xs:double"/> + <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:double"/> - <xs:attribute name="power_buf_size" type="xs:double"/> + <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" maxOccurs="unbounded"/> + <xs:element name="switch" type="switch" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> @@ -402,7 +419,7 @@ <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"/> @@ -433,37 +450,41 @@ <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 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="power_buffers"> - <xs:attribute name="logical_effort_factor" type="xs:double" default="4"/> + + <xs:complexType name="gpower_buffers"> + <xs:attribute name="logical_effort_factor" type="xs:float" default="4"/> </xs:complexType> - - <xs:complexType name="power_ff_size"> - <xs:attribute name="FF_size" type="xs:double" use="required"/> + + <xs:complexType name="gpower_ff_size"> + <xs:attribute name="FF_size" type="xs:float" use="required"/> </xs:complexType> - - <xs:complexType name="power_LUT_transistor_size"> - <xs:attribute name="LUT_transistor_size" type="xs:double" use="required"/> + + <xs:complexType name="gpower_LUT_transistor_size"> + <xs:attribute name="LUT_transistor_size" type="xs:float" use="required"/> </xs:complexType> - - <xs:complexType name="power_mux_transistor_size"> - <xs:attribute name="mux_transistor_size" type="xs:double" use="required"/> + + <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"> @@ -475,13 +496,17 @@ <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="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: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> @@ -619,6 +644,9 @@ </xs:sequence> </xs:complexType> +<!-- XSD 1.1 <alternative> tag can be used to differentiate between + toplevel, intermediate and leaf blocks. + It can also be used to assert input/output ports in memory blocks. --> <xs:complexType name="pb_type"> <xs:choice maxOccurs="unbounded" minOccurs="0"> <xs:element name="pb_type" type="pb_type"/> @@ -683,25 +711,32 @@ <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.0 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:element name="sb" type="segment_block" maxOccurs="unbounded"/> + <xs:element name="cb" type="segment_block" maxOccurs="unbounded"/> + <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"/> + <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: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" maxOccurs="unbounded"/> + <xs:element name="segment" type="segment" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> @@ -758,7 +793,7 @@ <xs:enumeration value="br"/> </xs:restriction> </xs:simpleType> - + <xs:complexType name="switchblock_func"> <xs:sequence> <xs:element name="func" maxOccurs="unbounded"> @@ -769,12 +804,15 @@ </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"/> @@ -788,11 +826,11 @@ </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:all> + <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:all> <xs:attribute name="name" type="xs:string" use="required"/> <xs:attribute name="type" type="switchblock_type" use="required"/> </xs:complexType> @@ -804,8 +842,8 @@ </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="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> @@ -817,19 +855,18 @@ <xs:element name="architecture"> <xs:complexType> - <xs:choice minOccurs="0" maxOccurs="unbounded"> + <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="switchblocklist" type="switchblocklist"/> <xs:element name="segmentlist" type="segmentlist"/> + <xs:element name="switchblocklist" type="switchblocklist"/> + <xs:element name="complexblocklist" type="complexblocklist"/> + <xs:element name="directlist" type="directlist" minOccurs="0"/> <xs:element name="power" type="global_power"/> <xs:element name="clocks" type="clocks"/> - <xs:element name="directlist" type="directlist"/> - <xs:element name="tiles" type="tiles"/> - <xs:element name="complexblocklist" type="complexblocklist"/> - </xs:choice> + </xs:all> </xs:complexType> </xs:element>