blob: 49c174997f172e222f644f35a6e54c383ff6cfa9 [file]
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<!-- Sort the attributes by name and remove the xml:base attribute -->
<xsl:for-each select="@*[name()!='xml:base']">
<xsl:sort select="name( . )"/>
<xsl:attribute name="{local-name()}"><xsl:value-of select="normalize-space(.)"/></xsl:attribute>
</xsl:for-each>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!-- Allow from attribute which gives you a relative to a given pb_type -->
<xsl:template name="from-pb_type">
<xsl:choose>
<xsl:when test="@from='current'"><xsl:value-of select="ancestor::pb_type[1]/@name"/></xsl:when>
<xsl:when test="@from"><xsl:value-of select="@from"/></xsl:when>
<xsl:otherwise><xsl:value-of select="ancestor::pb_type[1]/@name"/></xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--
Convert
* <port name=XXX> to XXX
* <port name=XXX bit=Y> to XXX[Y]
* <port name=XXX bit_msb=M bit_lsb=L> to XXX[M:L]
-->
<xsl:template name="port-value"><xsl:value-of select="@name"/><xsl:choose><xsl:when test="@bit">[<xsl:value-of select="@bit"/>]</xsl:when><xsl:when test="@bit-msb">[<xsl:value-of select="@bit-msb"/>:<xsl:value-of select="@bit-lsb"/>]</xsl:when><xsl:otherwise></xsl:otherwise></xsl:choose></xsl:template>
<!--
Convert
<interconnect><XXX><port type='input' ...><port type='output' ...></XXX><YYY../></interconnect>
to
<interconnect><XXX input='...' output='...'><YYY../></XXX></interconnect>
-->
<xsl:template match="interconnect/*/port[@type='input']">
<xsl:attribute name="input"><xsl:call-template name="from-pb_type"/>.<xsl:call-template name="port-value"/></xsl:attribute>
</xsl:template>
<xsl:template match="interconnect/*/port[@type='output']">
<xsl:attribute name="name"><xsl:call-template name="from-pb_type"/>-<xsl:call-template name="port-value"/></xsl:attribute>
<xsl:attribute name="output"><xsl:call-template name="from-pb_type"/>.<xsl:call-template name="port-value"/></xsl:attribute>
</xsl:template>
<!--
Convert
<loc ...><port ...><port ...></loc>
to
<loc ...>BLOCK.PORT BLOCK.PORT</loc>
-->
<xsl:template match="loc/port"><xsl:text>
</xsl:text><xsl:call-template name="from-pb_type"/>.<xsl:call-template name="port-value"/>
</xsl:template>
<xsl:template match="loc/port[last()]"><xsl:text>
</xsl:text><xsl:call-template name="from-pb_type"/>.<xsl:call-template name="port-value"/><xsl:text>
</xsl:text>
</xsl:template>
<!-- Remove duplicate model nodes -->
<xsl:key name="model-by-name" match="model" use="@name" />
<xsl:template match="models">
<models>
<xsl:for-each select="model[count(. | key('model-by-name', @name)[1]) = 1]">
<xsl:copy>
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:for-each>
</models>
</xsl:template>
<xsl:template match="text()|comment()|processing-instruction()">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>