📄 mdtsvgblkd_calculations.xsl
字号:
<xsl:param name="iBusName" select="'_busname_'"/> <!-- Store the heights in a variable --> <xsl:variable name="busConnYs_"> <xsl:if test="not(/EDKSYSTEM/BLKDSHAPES/CMPLXSHAPES/CMPLXSHAPE/BUSCONNS/BUSCONNLANE/BUSCONN)"> <BUSCONNY HEIGHT="0"/> </xsl:if> <xsl:for-each select="/EDKSYSTEM/BLKDSHAPES/CMPLXSHAPES/CMPLXSHAPE/BUSCONNS/BUSCONNLANE[(@BUSNAME = $iBusName)]/BUSCONN"> <xsl:variable name="peri_cstk_y_"> <xsl:call-template name="_calc_CStackShapesAbv_Height"> <xsl:with-param name="iCStackIndex" select="../@CSTACK_INDEX"/> <xsl:with-param name="iCStackModY" select="@CSTACK_MODS_Y"/> </xsl:call-template> </xsl:variable> <xsl:variable name="peri_bif_dy_"> <xsl:value-of select="(($BLKD_BIF_H + $BLKD_BIF_GAP_H) * @BIF_Y)"/> </xsl:variable> <xsl:variable name="peri_bc_y_"> <xsl:value-of select="($BLKD_MOD_LANE_H + $BLKD_MOD_LABEL_H + $BLKD_BIF_GAP_H + $peri_bif_dy_ + ceiling($BLKD_BIF_H div 2)) - ceiling($BLKD_BIFC_H div 2)"/> </xsl:variable> <!-- <xsl:message>Found a busconn lane</xsl:message>--> <BUSCONNY HEIGHT="{$peri_cstk_y_ + $peri_bc_y_}"/> </xsl:for-each> </xsl:variable> <!-- Return the min of them --> <xsl:value-of select="math:min(exsl:node-set($busConnYs_)/BUSCONNY/@HEIGHT)"/> </xsl:template> <xsl:template name="_calc_Stack_Height"> <xsl:param name="iStackIdx" select="100"/> <xsl:variable name="stack_height_"> <!-- if this is called with no vert index of a shape it defaults to the total height of the stack --> <xsl:call-template name="_calc_Stack_Shape_Y"> <xsl:with-param name="iHorizIdx" select="$iStackIdx"/> </xsl:call-template> </xsl:variable> <xsl:value-of select="$stack_height_"/></xsl:template> <!-- --> <xsl:template name="_calc_Stack_Width"> <xsl:param name="iStackIdx" select="100"/> <!-- <xsl:message>=============Stack Idx <xsl:value-of select="$iStackIdx"/>====</xsl:message> --> <xsl:variable name="shape_widths_"> <xsl:if test="not(/EDKSYSTEM/BLKDSHAPES/CMPLXSHAPES/CMPLXSHAPE[@STACK_HORIZ_INDEX = $iStackIdx])"> <SHAPE WIDTH="0"/> </xsl:if> <xsl:if test="not(/EDKSYSTEM/BLKDSHAPES/PROCSHAPES/MODULE[@STACK_HORIZ_INDEX = $iStackIdx])"> <SHAPE WIDTH="0"/> </xsl:if> <xsl:for-each select="/EDKSYSTEM/BLKDSHAPES/PROCSHAPES/MODULE[(@STACK_HORIZ_INDEX = $iStackIdx)]"><!-- <xsl:variable name="proc_w_"> <xsl:value-of select="$BLKD_MOD_W"/> </xsl:variable> <xsl:message>Found processor of width <xsl:value-of select="$proc_w_"/></xsl:message>--> <SHAPE WIDTH="{$BLKD_MOD_W}"/> </xsl:for-each> <xsl:for-each select="/EDKSYSTEM/BLKDSHAPES/CMPLXSHAPES/CMPLXSHAPE[(@STACK_HORIZ_INDEX = $iStackIdx)]"> <xsl:variable name="shpClass_" select="@MODCLASS"/> <xsl:variable name="shape_w_"> <xsl:choose> <xsl:when test="$shpClass_ = 'PERIPHERAL'"> <xsl:value-of select="$BLKD_MOD_W"/> </xsl:when> <xsl:when test="$shpClass_ = 'MEMORY_UNIT'"> <xsl:value-of select="($BLKD_MOD_W * @MODS_W)"/> </xsl:when> <xsl:otherwise>0</xsl:otherwise> </xsl:choose> </xsl:variable> <!-- <xsl:message>Found shape width <xsl:value-of select="$shape_w_"/></xsl:message>--> <SHAPE WIDTH="{$shape_w_}"/> </xsl:for-each> <xsl:for-each select="/EDKSYSTEM/BLKDSHAPES/SBSBUCKETS/SBSBUCKET[(@STACK_HORIZ_INDEX = $iStackIdx)]"> <xsl:variable name="bucket_w_"> <xsl:value-of select="(($BLKD_MOD_BKTLANE_W * 2) + (($BLKD_MOD_W * @MODS_W) + ($BLKD_MOD_BUCKET_G * (@MODS_W - 1))))"/> </xsl:variable> <!-- <xsl:message>Found bucket of width <xsl:value-of select="$bucket_w_"/></xsl:message>--> <SHAPE WIDTH="{$bucket_w_}"/> </xsl:for-each> </xsl:variable> <xsl:value-of select="math:max(exsl:node-set($shape_widths_)/SHAPE/@WIDTH)"/></xsl:template> <xsl:template name="_calc_Stack_X"> <xsl:param name="iStackIdx" select="0"/><!-- <xsl:message>Looking for stack indexes less than <xsl:value-of select="$iStackIdx"/></xsl:message>--> <!-- Store the stack widths in a variable --> <xsl:variable name="stackspace_widths_"> <xsl:if test="not(/EDKSYSTEM/BLKDSHAPES/CMPLXSHAPES[(@STACK_HORIZ_INDEX < $iStackIdx)])"> <STACKSPACE WIDTH="0"/> </xsl:if> <xsl:if test="not(/EDKSYSTEM/BLKDSHAPES/PROCSHAPES[(@STACK_HORIZ_INDEX < $iStackIdx)])"> <STACKSPACE WIDTH="0"/> </xsl:if> <xsl:if test="not(/EDKSYSTEM/SBSBUCKETS/SBSBUCKET[(@STACK_HORIZ_INDEX < $iStackIdx)])"> <STACKSPACE WIDTH="0"/> </xsl:if> <xsl:for-each select="/EDKSYSTEM/BLKDSHAPES/BCLANESPACES/BCLANESPACE[(@EAST <= $iStackIdx)]"> <!-- <xsl:message>==============================</xsl:message> <xsl:message>Found a space of index <xsl:value-of select="@EAST"/></xsl:message> <xsl:message>Bus lane space width <xsl:value-of select="@BUSLANES_W"/></xsl:message> <xsl:message>Bus lane space is <xsl:value-of select="$space_width_"/></xsl:message> <xsl:variable name="space_width_" select="($BLKD_BUS_LANE_W * @BUSLANES_W)"/>--> <xsl:variable name="East_"> <xsl:choose> <xsl:when test="@EAST"><xsl:value-of select="@EAST"/></xsl:when> <xsl:otherwise>'NONE'</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="West_"> <xsl:choose> <xsl:when test="@WEST"><xsl:value-of select="@WEST"/></xsl:when> <xsl:otherwise>NONE</xsl:otherwise> </xsl:choose> </xsl:variable> <!-- <xsl:message>1 - West_ <xsl:value-of select="$West_"/></xsl:message> <xsl:message>1 - East_ <xsl:value-of select="$East_"/></xsl:message>--> <xsl:variable name="space_width_"> <xsl:call-template name="_calc_Space_Width"> <xsl:with-param name="iStackToWest" select="$West_"/> <xsl:with-param name="iStackToEast" select="$East_"/> </xsl:call-template> </xsl:variable> <xsl:variable name="stack_width_"> <xsl:if test="not(@EAST = $iStackIdx)"> <xsl:call-template name="_calc_Stack_Width"> <xsl:with-param name="iStackIdx" select="@EAST"/> </xsl:call-template> </xsl:if> <xsl:if test="(@EAST = $iStackIdx)">0</xsl:if> </xsl:variable> <!-- <xsl:message>Found stack of width <xsl:value-of select="$stack_width_"/></xsl:message> <xsl:message>==============================</xsl:message>--> <STACKSPACE WIDTH="{$stack_width_ + $space_width_}"/> </xsl:for-each> <xsl:for-each select="/EDKSYSTEM/BLKDSHAPES/BCLANESPACES/BCLANESPACE[(not(@EAST) and (@WEST = ($iStackIdx -1)))]"> <xsl:variable name="space_width_" select="($BLKD_BUS_LANE_W * @BUSLANES_W)"/> <!-- <xsl:message>Found end space of <xsl:value-of select="$space_width_"/></xsl:message>--> <STACKSPACE WIDTH="{$space_width_}"/> </xsl:for-each> </xsl:variable> <xsl:value-of select="sum(exsl:node-set($stackspace_widths_)/STACKSPACE/@WIDTH)"/> </xsl:template> <xsl:template name="_calc_Space_Width"> <xsl:param name="iStackToWest" select="'NONE'"/> <xsl:param name="iStackToEast" select="'NONE'"/> <!-- <xsl:message>Stack to West <xsl:value-of select="$stackToWest"/></xsl:message> <xsl:message>Stack to East <xsl:value-of select="$stackToEast"/></xsl:message>--> <xsl:variable name="spaceWidth_"> <xsl:choose> <xsl:when test="/EDKSYSTEM/BLKDSHAPES/BCLANESPACES/BCLANESPACE[((@EAST = $iStackToEast) or (not($iStackToWest = 'NONE') and (@WEST = $iStackToWest)))]"> <xsl:value-of select="((/EDKSYSTEM/BLKDSHAPES/BCLANESPACES/BCLANESPACE[((@EAST = $iStackToEast) or (not($iStackToWest = 'NONE') and (@WEST = $iStackToWest)))]/@BUSLANES_W + 1) * $BLKD_BUS_LANE_W)"/> </xsl:when> <xsl:otherwise>0</xsl:otherwise> </xsl:choose> </xsl:variable> <!-- <xsl:message>Space width <xsl:value-of select="$spaceWidth_"/></xsl:message>--> <xsl:value-of select="$spaceWidth_"/></xsl:template> <xsl:template name="_calc_Space_X"> <xsl:param name="iStackToWest" select="'NONE'"/> <xsl:param name="iStackToEast" select="'NONE'"/> <!-- <xsl:message>Stack East <xsl:value-of select="$stackToEast"/></xsl:message> <xsl:message>Stack West <xsl:value-of select="$stackToWest"/></xsl:message>--> <!-- Store the stack widths in a variable --> <!-- <xsl:message>Looking for stack indexes less than <xsl:value-of select="$stackIdx"/></xsl:message>--> <xsl:variable name="stackspace_widths_"> <xsl:if test="not(/EDKSYSTEM/BLKDSHAPES/CMPLXSHAPES[(@STACK_HORIZ_INDEX < $iStackToEast)])"> <STACKSPACE WIDTH="0"/> </xsl:if> <xsl:if test="not(/EDKSYSTEM/BLKDSHAPES/PROCSHAPES[(@STACK_HORIZ_INDEX < $iStackToEast)])"> <STACKSPACE WIDTH="0"/> </xsl:if> <xsl:if test="not(/EDKSYSTEM/SBSBUCKETS/SBSBUCKET[(@STACK_HORIZ_INDEX < $iStackToEast)])"> <STACKSPACE WIDTH="0"/> </xsl:if> <xsl:for-each select="/EDKSYSTEM/BLKDSHAPES/BCLANESPACES/BCLANESPACE[((@EAST < $iStackToEast) or (not($iStackToWest = 'NONE') and (@EAST <= $iStackToWest)))]"> <!-- <xsl:message>==============================</xsl:message> <xsl:message>Found a space of index <xsl:value-of select="@EAST"/></xsl:message> <xsl:variable name="space_width_" select="($BLKD_BUS_LANE_W * @BUSLANES_W)"/>--> <xsl:variable name="East_"> <xsl:choose> <xsl:when test="@EAST"><xsl:value-of select="@EAST"/></xsl:when> <xsl:otherwise>'NONE'</xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="West_"> <xsl:choose> <xsl:when test="@WEST"><xsl:value-of select="@WEST"/></xsl:when> <xsl:otherwise>NONE</xsl:otherwise> </xsl:choose> </xsl:variable> <!-- <xsl:message>1 - West_ <xsl:value-of select="$West_"/></xsl:message> <xsl:message>1 - East_ <xsl:value-of select="$East_"/></xsl:message>--> <xsl:variable name="space_width_"> <xsl:call-template name="_calc_Space_Width"> <xsl:with-param name="iStackToWest" select="$West_"/> <xsl:with-param name="iStackToEast" select="$East_"/> </xsl:call-template> </xsl:variable> <!-- <xsl:message>Bus lane space width <xsl:value-of select="@BUSLANES_W"/></xsl:message> <xsl:message>Bus lane space is <xsl:value-of select="$space_width_"/></xsl:message>--> <xsl:variable name="stack_width_"> <xsl:call-template name="_calc_Stack_Width"> <xsl:with-param name="iStackIdx" select="@EAST"/> </xsl:call-template> </xsl:variable> <!-- <xsl:message>Found stack of width <xsl:value-of select="$stack_width_"/></xsl:message> <xsl:message>==============================</xsl:message>--> <STACKSPACE WIDTH="{$stack_width_ + $space_width_}"/> </xsl:for-each> </xsl:variable> <xsl:variable name = "stackToWest_W_"> <xsl:choose> <xsl:when test="(($iStackToEast = '0') and ($iStackToWest = 'NONE'))">0</xsl:when> <xsl:when test="(($iStackToEast = 'NONE') and not($iStackToWest = 'NONE'))"> <xsl:call-template name="_calc_Stack_Width"> <xsl:with-param name="iStackIdx" select="$iStackToWest"/> </xsl:call-template> </xsl:when> <xsl:when test="(not($iStackToEast = '0') and ($iStackToWest = 'NONE'))"> <xsl:call-template name="_calc_Stack_Width"> <xsl:with-param name="iStackIdx" select="($iStackToEast - 1)"/> </xsl:call-template> </xsl:when> <xsl:otherwise>0</xsl:otherwise> </xsl:choose> </xsl:variable> <!-- <xsl:variable name = "stackToEast_W_"> <xsl:call-template name="_calc_Stack_Width"> <xsl:with-param name="stackIdx" select="$stackToEast"/> </xsl:call-template> </xsl:variable> <xsl:variable name ="extSpaceEast_W_" select="ceiling($stackToEast_W_ div 2)"/>--> <xsl:variable name ="extSpaceWest_W_" select="ceiling($stackToWest_W_ div 2)"/> <xsl:value-of select="sum(exsl:node-set($stackspace_widths_)/STACKSPACE/@WIDTH) - $extSpaceWest_W_"/></xsl:template> </xsl:stylesheet>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -