| <?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> |