创建自定义网表和 BOM 文件

中间网表文件格式

BOM 文件和网表文件可以从 Eeschema 创建的中间网表文件转换。

此文件使用 XML 语法,称为中间网表。中间网表包含有关您的电路板的大量数据,因此,它可以与后处理一起用于创建 BOM 或其他报告。

根据输出(BOM 或网表),将在后处理中使用完整的中间网表文件的不同子集。

原理图样本

原理图样本

中间网表文件示例

上述电路的相应中间网表 (使用 XML 语法) 如下所示。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <export version="D">
  3. <design>
  4. <source>F:\kicad_aux\netlist_test\netlist_test.sch</source>
  5. <date>29/08/2010 20:35:21</date>
  6. <tool>eeschema (2010-08-28 BZR 2458)-unstable</tool>
  7. </design>
  8. <components>
  9. <comp ref="P1">
  10. <value>CONN_4</value>
  11. <libsource lib="conn" part="CONN_4"/>
  12. <sheetpath names="/" tstamps="/"/>
  13. <tstamp>4C6E2141</tstamp>
  14. </comp>
  15. <comp ref="U2">
  16. <value>74LS74</value>
  17. <libsource lib="74xx" part="74LS74"/>
  18. <sheetpath names="/" tstamps="/"/>
  19. <tstamp>4C6E20BA</tstamp>
  20. </comp>
  21. <comp ref="U1">
  22. <value>74LS04</value>
  23. <libsource lib="74xx" part="74LS04"/>
  24. <sheetpath names="/" tstamps="/"/>
  25. <tstamp>4C6E20A6</tstamp>
  26. </comp>
  27. <comp ref="C1">
  28. <value>CP</value>
  29. <libsource lib="device" part="CP"/>
  30. <sheetpath names="/" tstamps="/"/>
  31. <tstamp>4C6E2094</tstamp>
  32. </comp>
  33. <comp ref="R1">
  34. <value>R</value>
  35. <libsource lib="device" part="R"/>
  36. <sheetpath names="/" tstamps="/"/>
  37. <tstamp>4C6E208A</tstamp>
  38. </comp>
  39. </components>
  40. <libparts>
  41. <libpart lib="device" part="C">
  42. <description>Condensateur non polarise</description>
  43. <footprints>
  44. <fp>SM*</fp>
  45. <fp>C?</fp>
  46. <fp>C1-1</fp>
  47. </footprints>
  48. <fields>
  49. <field name="Reference">C</field>
  50. <field name="Value">C</field>
  51. </fields>
  52. <pins>
  53. <pin num="1" name="~" type="passive"/>
  54. <pin num="2" name="~" type="passive"/>
  55. </pins>
  56. </libpart>
  57. <libpart lib="device" part="R">
  58. <description>Resistance</description>
  59. <footprints>
  60. <fp>R?</fp>
  61. <fp>SM0603</fp>
  62. <fp>SM0805</fp>
  63. <fp>R?-*</fp>
  64. <fp>SM1206</fp>
  65. </footprints>
  66. <fields>
  67. <field name="Reference">R</field>
  68. <field name="Value">R</field>
  69. </fields>
  70. <pins>
  71. <pin num="1" name="~" type="passive"/>
  72. <pin num="2" name="~" type="passive"/>
  73. </pins>
  74. </libpart>
  75. <libpart lib="conn" part="CONN_4">
  76. <description>Symbole general de connecteur</description>
  77. <fields>
  78. <field name="Reference">P</field>
  79. <field name="Value">CONN_4</field>
  80. </fields>
  81. <pins>
  82. <pin num="1" name="P1" type="passive"/>
  83. <pin num="2" name="P2" type="passive"/>
  84. <pin num="3" name="P3" type="passive"/>
  85. <pin num="4" name="P4" type="passive"/>
  86. </pins>
  87. </libpart>
  88. <libpart lib="74xx" part="74LS04">
  89. <description>Hex Inverseur</description>
  90. <fields>
  91. <field name="Reference">U</field>
  92. <field name="Value">74LS04</field>
  93. </fields>
  94. <pins>
  95. <pin num="1" name="~" type="input"/>
  96. <pin num="2" name="~" type="output"/>
  97. <pin num="3" name="~" type="input"/>
  98. <pin num="4" name="~" type="output"/>
  99. <pin num="5" name="~" type="input"/>
  100. <pin num="6" name="~" type="output"/>
  101. <pin num="7" name="GND" type="power_in"/>
  102. <pin num="8" name="~" type="output"/>
  103. <pin num="9" name="~" type="input"/>
  104. <pin num="10" name="~" type="output"/>
  105. <pin num="11" name="~" type="input"/>
  106. <pin num="12" name="~" type="output"/>
  107. <pin num="13" name="~" type="input"/>
  108. <pin num="14" name="VCC" type="power_in"/>
  109. </pins>
  110. </libpart>
  111. <libpart lib="74xx" part="74LS74">
  112. <description>Dual D FlipFlop, Set &amp; Reset</description>
  113. <docs>74xx/74hc_hct74.pdf</docs>
  114. <fields>
  115. <field name="Reference">U</field>
  116. <field name="Value">74LS74</field>
  117. </fields>
  118. <pins>
  119. <pin num="1" name="Cd" type="input"/>
  120. <pin num="2" name="D" type="input"/>
  121. <pin num="3" name="Cp" type="input"/>
  122. <pin num="4" name="Sd" type="input"/>
  123. <pin num="5" name="Q" type="output"/>
  124. <pin num="6" name="~Q" type="output"/>
  125. <pin num="7" name="GND" type="power_in"/>
  126. <pin num="8" name="~Q" type="output"/>
  127. <pin num="9" name="Q" type="output"/>
  128. <pin num="10" name="Sd" type="input"/>
  129. <pin num="11" name="Cp" type="input"/>
  130. <pin num="12" name="D" type="input"/>
  131. <pin num="13" name="Cd" type="input"/>
  132. <pin num="14" name="VCC" type="power_in"/>
  133. </pins>
  134. </libpart>
  135. </libparts>
  136. <libraries>
  137. <library logical="device">
  138. <uri>F:\kicad\share\library\device.lib</uri>
  139. </library>
  140. <library logical="conn">
  141. <uri>F:\kicad\share\library\conn.lib</uri>
  142. </library>
  143. <library logical="74xx">
  144. <uri>F:\kicad\share\library\74xx.lib</uri>
  145. </library>
  146. </libraries>
  147. <nets>
  148. <net code="1" name="GND">
  149. <node ref="U1" pin="7"/>
  150. <node ref="C1" pin="2"/>
  151. <node ref="U2" pin="7"/>
  152. <node ref="P1" pin="4"/>
  153. </net>
  154. <net code="2" name="VCC">
  155. <node ref="R1" pin="1"/>
  156. <node ref="U1" pin="14"/>
  157. <node ref="U2" pin="4"/>
  158. <node ref="U2" pin="1"/>
  159. <node ref="U2" pin="14"/>
  160. <node ref="P1" pin="1"/>
  161. </net>
  162. <net code="3" name="">
  163. <node ref="U2" pin="6"/>
  164. </net>
  165. <net code="4" name="">
  166. <node ref="U1" pin="2"/>
  167. <node ref="U2" pin="3"/>
  168. </net>
  169. <net code="5" name="/SIG_OUT">
  170. <node ref="P1" pin="2"/>
  171. <node ref="U2" pin="5"/>
  172. <node ref="U2" pin="2"/>
  173. </net>
  174. <net code="6" name="/CLOCK_IN">
  175. <node ref="R1" pin="2"/>
  176. <node ref="C1" pin="1"/>
  177. <node ref="U1" pin="1"/>
  178. <node ref="P1" pin="3"/>
  179. </net>
  180. </nets>
  181. </export>

转换为新的网表格式

通过将后处理过滤器应用于中间网表文件,您可以生成外部网表文件以及 BOM 文件。 由于此转换是文本到文本转换,因此可以使用 Python,XSLT 或任何其他能够将 XML 作为输入的工具来编写此后处理过滤器。

XSLT 本身是一种非常适合 XML 转换的 XML 语言。 有一个名为 xsltproc 的免费程序,您可以下载并安装。 xsltproc 程序可用于读取中间 XML 网表输入文件,应用样式表来转换输入,并将结果保存在输出文件中。 使用 xsltproc 需要使用 XSLT 约定的样式表文件。 完成转换过程由 Eeschema 处理,在配置一次后以特定方式运行 xsltproc。

XSLT 方法

描述 XSL 转换(XSLT)的文档可在此处获得:

http://www.w3.org/TR/xslt

创建 Pads-Pcb 网表文件

“pads-pcb” 的格式由两部分组成。

  • 封装列表。

  • 网表: 按网络对焊盘引用进行分组。

紧接下面是样式表,它将中间网表文件转换为 pad-pcb 网表格式:

  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <!--XSL style sheet to Eeschema Generic Netlist Format to PADS netlist format
  3. Copyright (C) 2010, SoftPLC Corporation.
  4. GPL v2.
  5. 如何使用:
  6. https://lists.launchpad.net/kicad-developers/msg05157.html
  7. -->
  8. <!DOCTYPE xsl:stylesheet [
  9. <!ENTITY nl "&#xd;&#xa;"> <!--new line CR, LF -->
  10. ]>
  11. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  12. <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
  13. <xsl:template match="/export">
  14. <xsl:text>*PADS-PCB*&nl;*PART*&nl;</xsl:text>
  15. <xsl:apply-templates select="components/comp"/>
  16. <xsl:text>&nl;*NET*&nl;</xsl:text>
  17. <xsl:apply-templates select="nets/net"/>
  18. <xsl:text>*END*&nl;</xsl:text>
  19. </xsl:template>
  20. <!-- for each component -->
  21. <xsl:template match="comp">
  22. <xsl:text> </xsl:text>
  23. <xsl:value-of select="@ref"/>
  24. <xsl:text> </xsl:text>
  25. <xsl:choose>
  26. <xsl:when test = "footprint != '' ">
  27. <xsl:apply-templates select="footprint"/>
  28. </xsl:when>
  29. <xsl:otherwise>
  30. <xsl:text>unknown</xsl:text>
  31. </xsl:otherwise>
  32. </xsl:choose>
  33. <xsl:text>&nl;</xsl:text>
  34. </xsl:template>
  35. <!-- for each net -->
  36. <xsl:template match="net">
  37. <!-- nets are output only if there is more than one pin in net -->
  38. <xsl:if test="count(node)>1">
  39. <xsl:text>*SIGNAL* </xsl:text>
  40. <xsl:choose>
  41. <xsl:when test = "@name != '' ">
  42. <xsl:value-of select="@name"/>
  43. </xsl:when>
  44. <xsl:otherwise>
  45. <xsl:text>N-</xsl:text>
  46. <xsl:value-of select="@code"/>
  47. </xsl:otherwise>
  48. </xsl:choose>
  49. <xsl:text>&nl;</xsl:text>
  50. <xsl:apply-templates select="node"/>
  51. </xsl:if>
  52. </xsl:template>
  53. <!-- for each node -->
  54. <xsl:template match="node">
  55. <xsl:text> </xsl:text>
  56. <xsl:value-of select="@ref"/>
  57. <xsl:text>.</xsl:text>
  58. <xsl:value-of select="@pin"/>
  59. <xsl:text>&nl;</xsl:text>
  60. </xsl:template>
  61. </xsl:stylesheet>

这是运行 xsltproc 后的 pads-pcb 输出文件:

  1. *PADS-PCB*
  2. *PART*
  3. P1 unknown
  4. U2 unknown
  5. U1 unknown
  6. C1 unknown
  7. R1 unknown
  8. *NET*
  9. *SIGNAL* GND
  10. U1.7
  11. C1.2
  12. U2.7
  13. P1.4
  14. *SIGNAL* VCC
  15. R1.1
  16. U1.14
  17. U2.4
  18. U2.1
  19. U2.14
  20. P1.1
  21. *SIGNAL* N-4
  22. U1.2
  23. U2.3
  24. *SIGNAL* /SIG_OUT
  25. P1.2
  26. U2.5
  27. U2.2
  28. *SIGNAL* /CLOCK_IN
  29. R1.2
  30. C1.1
  31. U1.1
  32. P1.3
  33. *END*

进行此转换的命令行是:

  1. kicad\\bin\\xsltproc.exe -o test.net kicad\\bin\\plugins\\netlist_form_pads-pcb.xsl test.tmp

创建一个 Cadstar 网表文件

Cadstar 格式由两个部分组成。

  • 封装列表。

  • 网表: 按网络对焊盘引用进行分组。

以下是进行此特定转换的样式表文件:

  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <!--XSL style sheet to Eeschema Generic Netlist Format to CADSTAR netlist format
  3. Copyright (C) 2010, Jean-Pierre Charras.
  4. Copyright (C) 2010, SoftPLC Corporation.
  5. GPL v2.
  6. <!DOCTYPE xsl:stylesheet [
  7. <!ENTITY nl "&#xd;&#xa;"> <!--new line CR, LF -->
  8. ]>
  9. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  10. <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
  11. <!-- Netlist header -->
  12. <xsl:template match="/export">
  13. <xsl:text>.HEA&nl;</xsl:text>
  14. <xsl:apply-templates select="design/date"/> <!-- Generate line .TIM <time> -->
  15. <xsl:apply-templates select="design/tool"/> <!-- Generate line .APP <eeschema version> -->
  16. <xsl:apply-templates select="components/comp"/> <!-- Generate list of components -->
  17. <xsl:text>&nl;&nl;</xsl:text>
  18. <xsl:apply-templates select="nets/net"/> <!-- Generate list of nets and connections -->
  19. <xsl:text>&nl;.END&nl;</xsl:text>
  20. </xsl:template>
  21. <!-- Generate line .TIM 20/08/2010 10:45:33 -->
  22. <xsl:template match="tool">
  23. <xsl:text>.APP "</xsl:text>
  24. <xsl:apply-templates/>
  25. <xsl:text>"&nl;</xsl:text>
  26. </xsl:template>
  27. <!-- Generate line .APP "eeschema (2010-08-17 BZR 2450)-unstable" -->
  28. <xsl:template match="date">
  29. <xsl:text>.TIM </xsl:text>
  30. <xsl:apply-templates/>
  31. <xsl:text>&nl;</xsl:text>
  32. </xsl:template>
  33. <!-- for each component -->
  34. <xsl:template match="comp">
  35. <xsl:text>.ADD_COM </xsl:text>
  36. <xsl:value-of select="@ref"/>
  37. <xsl:text> </xsl:text>
  38. <xsl:choose>
  39. <xsl:when test = "value != '' ">
  40. <xsl:text>"</xsl:text> <xsl:apply-templates select="value"/> <xsl:text>"</xsl:text>
  41. </xsl:when>
  42. <xsl:otherwise>
  43. <xsl:text>""</xsl:text>
  44. </xsl:otherwise>
  45. </xsl:choose>
  46. <xsl:text>&nl;</xsl:text>
  47. </xsl:template>
  48. <!-- for each net -->
  49. <xsl:template match="net">
  50. <!-- nets are output only if there is more than one pin in net -->
  51. <xsl:if test="count(node)>1">
  52. <xsl:variable name="netname">
  53. <xsl:text>"</xsl:text>
  54. <xsl:choose>
  55. <xsl:when test = "@name != '' ">
  56. <xsl:value-of select="@name"/>
  57. </xsl:when>
  58. <xsl:otherwise>
  59. <xsl:text>N-</xsl:text>
  60. <xsl:value-of select="@code"/>
  61. </xsl:otherwise>
  62. </xsl:choose>
  63. <xsl:text>"&nl;</xsl:text>
  64. </xsl:variable>
  65. <xsl:apply-templates select="node" mode="first"/>
  66. <xsl:value-of select="$netname"/>
  67. <xsl:apply-templates select="node" mode="others"/>
  68. </xsl:if>
  69. </xsl:template>
  70. <!-- for each node -->
  71. <xsl:template match="node" mode="first">
  72. <xsl:if test="position()=1">
  73. <xsl:text>.ADD_TER </xsl:text>
  74. <xsl:value-of select="@ref"/>
  75. <xsl:text>.</xsl:text>
  76. <xsl:value-of select="@pin"/>
  77. <xsl:text> </xsl:text>
  78. </xsl:if>
  79. </xsl:template>
  80. <xsl:template match="node" mode="others">
  81. <xsl:choose>
  82. <xsl:when test='position()=1'>
  83. </xsl:when>
  84. <xsl:when test='position()=2'>
  85. <xsl:text>.TER </xsl:text>
  86. </xsl:when>
  87. <xsl:otherwise>
  88. <xsl:text> </xsl:text>
  89. </xsl:otherwise>
  90. </xsl:choose>
  91. <xsl:if test="position()>1">
  92. <xsl:value-of select="@ref"/>
  93. <xsl:text>.</xsl:text>
  94. <xsl:value-of select="@pin"/>
  95. <xsl:text>&nl;</xsl:text>
  96. </xsl:if>
  97. </xsl:template>
  98. </xsl:stylesheet>

这是 Cadstar 输出文件。

  1. .HEA
  2. .TIM 21/08/2010 08:12:08
  3. .APP "eeschema (2010-08-09 BZR 2439)-unstable"
  4. .ADD_COM P1 "CONN_4"
  5. .ADD_COM U2 "74LS74"
  6. .ADD_COM U1 "74LS04"
  7. .ADD_COM C1 "CP"
  8. .ADD_COM R1 "R"
  9. .ADD_TER U1.7 "GND"
  10. .TER C1.2
  11. U2.7
  12. P1.4
  13. .ADD_TER R1.1 "VCC"
  14. .TER U1.14
  15. U2.4
  16. U2.1
  17. U2.14
  18. P1.1
  19. .ADD_TER U1.2 "N-4"
  20. .TER U2.3
  21. .ADD_TER P1.2 "/SIG_OUT"
  22. .TER U2.5
  23. U2.2
  24. .ADD_TER R1.2 "/CLOCK_IN"
  25. .TER C1.1
  26. U1.1
  27. P1.3
  28. .END

创建 OrcadPCB2 网表文件

此格式只有一个部分是封装列表。 每个封装包括其参考网络的焊盘列表。

以下是此特定转换的样式表:

  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <!--XSL style sheet to Eeschema Generic Netlist Format to CADSTAR netlist format
  3. Copyright (C) 2010, SoftPLC Corporation.
  4. GPL v2.
  5. 如何使用:
  6. https://lists.launchpad.net/kicad-developers/msg05157.html
  7. -->
  8. <!DOCTYPE xsl:stylesheet [
  9. <!ENTITY nl "&#xd;&#xa;"> <!--new line CR, LF -->
  10. ]>
  11. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  12. <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
  13. <!--
  14. Netlist header
  15. Creates the entire netlist
  16. (can be seen as equivalent to main function in C
  17. -->
  18. <xsl:template match="/export">
  19. <xsl:text>( { Eeschema Netlist Version 1.1 </xsl:text>
  20. <!-- Generate line .TIM <time> -->
  21. <xsl:apply-templates select="design/date"/>
  22. <!-- Generate line eeschema version ... -->
  23. <xsl:apply-templates select="design/tool"/>
  24. <xsl:text>}&nl;</xsl:text>
  25. <!-- Generate the list of components -->
  26. <xsl:apply-templates select="components/comp"/> <!-- Generate list of components -->
  27. <!-- end of file -->
  28. <xsl:text>)&nl;*&nl;</xsl:text>
  29. </xsl:template>
  30. <!--
  31. Generate id in header like "eeschema (2010-08-17 BZR 2450)-unstable"
  32. -->
  33. <xsl:template match="tool">
  34. <xsl:apply-templates/>
  35. </xsl:template>
  36. <!--
  37. Generate date in header like "20/08/2010 10:45:33"
  38. -->
  39. <xsl:template match="date">
  40. <xsl:apply-templates/>
  41. <xsl:text>&nl;</xsl:text>
  42. </xsl:template>
  43. <!--
  44. This template read each component
  45. (path = /export/components/comp)
  46. creates lines:
  47. ( 3EBF7DBD $noname U1 74LS125
  48. ... pin list ...
  49. )
  50. and calls "create_pin_list" template to build the pin list
  51. -->
  52. <xsl:template match="comp">
  53. <xsl:text> ( </xsl:text>
  54. <xsl:choose>
  55. <xsl:when test = "tstamp != '' ">
  56. <xsl:apply-templates select="tstamp"/>
  57. </xsl:when>
  58. <xsl:otherwise>
  59. <xsl:text>00000000</xsl:text>
  60. </xsl:otherwise>
  61. </xsl:choose>
  62. <xsl:text> </xsl:text>
  63. <xsl:choose>
  64. <xsl:when test = "footprint != '' ">
  65. <xsl:apply-templates select="footprint"/>
  66. </xsl:when>
  67. <xsl:otherwise>
  68. <xsl:text>$noname</xsl:text>
  69. </xsl:otherwise>
  70. </xsl:choose>
  71. <xsl:text> </xsl:text>
  72. <xsl:value-of select="@ref"/>
  73. <xsl:text> </xsl:text>
  74. <xsl:choose>
  75. <xsl:when test = "value != '' ">
  76. <xsl:apply-templates select="value"/>
  77. </xsl:when>
  78. <xsl:otherwise>
  79. <xsl:text>"~"</xsl:text>
  80. </xsl:otherwise>
  81. </xsl:choose>
  82. <xsl:text>&nl;</xsl:text>
  83. <xsl:call-template name="Search_pin_list" >
  84. <xsl:with-param name="cmplib_id" select="libsource/@part"/>
  85. <xsl:with-param name="cmp_ref" select="@ref"/>
  86. </xsl:call-template>
  87. <xsl:text> )&nl;</xsl:text>
  88. </xsl:template>
  89. <!--
  90. This template search for a given lib component description in list
  91. lib component descriptions are in /export/libparts,
  92. and each description start at ./libpart
  93. We search here for the list of pins of the given component
  94. This template has 2 parameters:
  95. "cmplib_id" (reference in libparts)
  96. "cmp_ref" (schematic reference of the given component)
  97. -->
  98. <xsl:template name="Search_pin_list" >
  99. <xsl:param name="cmplib_id" select="0" />
  100. <xsl:param name="cmp_ref" select="0" />
  101. <xsl:for-each select="/export/libparts/libpart">
  102. <xsl:if test = "@part = $cmplib_id ">
  103. <xsl:apply-templates name="build_pin_list" select="pins/pin">
  104. <xsl:with-param name="cmp_ref" select="$cmp_ref"/>
  105. </xsl:apply-templates>
  106. </xsl:if>
  107. </xsl:for-each>
  108. </xsl:template>
  109. <!--
  110. This template writes the pin list of a component
  111. from the pin list of the library description
  112. The pin list from library description is something like
  113. <pins>
  114. <pin num="1" type="passive"/>
  115. <pin num="2" type="passive"/>
  116. </pins>
  117. Output pin list is ( <pin num> <net name> )
  118. something like
  119. ( 1 VCC )
  120. ( 2 GND )
  121. -->
  122. <xsl:template name="build_pin_list" match="pin">
  123. <xsl:param name="cmp_ref" select="0" />
  124. <!-- write pin numner and separator -->
  125. <xsl:text> ( </xsl:text>
  126. <xsl:value-of select="@num"/>
  127. <xsl:text> </xsl:text>
  128. <!-- search net name in nets section and write it: -->
  129. <xsl:variable name="pinNum" select="@num" />
  130. <xsl:for-each select="/export/nets/net">
  131. <!-- net name is output only if there is more than one pin in net
  132. else use "?" as net name, so count items in this net
  133. -->
  134. <xsl:variable name="pinCnt" select="count(node)" />
  135. <xsl:apply-templates name="Search_pin_netname" select="node">
  136. <xsl:with-param name="cmp_ref" select="$cmp_ref"/>
  137. <xsl:with-param name="pin_cnt_in_net" select="$pinCnt"/>
  138. <xsl:with-param name="pin_num"> <xsl:value-of select="$pinNum"/>
  139. </xsl:with-param>
  140. </xsl:apply-templates>
  141. </xsl:for-each>
  142. <!-- close line -->
  143. <xsl:text> )&nl;</xsl:text>
  144. </xsl:template>
  145. <!--
  146. This template writes the pin netname of a given pin of a given component
  147. from the nets list
  148. The nets list description is something like
  149. <nets>
  150. <net code="1" name="GND">
  151. <node ref="J1" pin="20"/>
  152. <node ref="C2" pin="2"/>
  153. </net>
  154. <net code="2" name="">
  155. <node ref="U2" pin="11"/>
  156. </net>
  157. </nets>
  158. This template has 2 parameters:
  159. "cmp_ref" (schematic reference of the given component)
  160. "pin_num" (pin number)
  161. -->
  162. <xsl:template name="Search_pin_netname" match="node">
  163. <xsl:param name="cmp_ref" select="0" />
  164. <xsl:param name="pin_num" select="0" />
  165. <xsl:param name="pin_cnt_in_net" select="0" />
  166. <xsl:if test = "@ref = $cmp_ref ">
  167. <xsl:if test = "@pin = $pin_num">
  168. <!-- net name is output only if there is more than one pin in net
  169. else use "?" as net name
  170. -->
  171. <xsl:if test = "$pin_cnt_in_net>1">
  172. <xsl:choose>
  173. <!-- if a net has a name, use it,
  174. else build a name from its net code
  175. -->
  176. <xsl:when test = "../@name != '' ">
  177. <xsl:value-of select="../@name"/>
  178. </xsl:when>
  179. <xsl:otherwise>
  180. <xsl:text>$N-0</xsl:text><xsl:value-of select="../@code"/>
  181. </xsl:otherwise>
  182. </xsl:choose>
  183. </xsl:if>
  184. <xsl:if test = "$pin_cnt_in_net &lt;2">
  185. <xsl:text>?</xsl:text>
  186. </xsl:if>
  187. </xsl:if>
  188. </xsl:if>
  189. </xsl:template>
  190. </xsl:stylesheet>

这是 OrcadPCB2 输出文件。

  1. ( { Eeschema Netlist Version 1.1 29/08/2010 21:07:51
  2. eeschema (2010-08-28 BZR 2458)-unstable}
  3. ( 4C6E2141 $noname P1 CONN_4
  4. ( 1 VCC )
  5. ( 2 /SIG_OUT )
  6. ( 3 /CLOCK_IN )
  7. ( 4 GND )
  8. )
  9. ( 4C6E20BA $noname U2 74LS74
  10. ( 1 VCC )
  11. ( 2 /SIG_OUT )
  12. ( 3 N-04 )
  13. ( 4 VCC )
  14. ( 5 /SIG_OUT )
  15. ( 6 ? )
  16. ( 7 GND )
  17. ( 14 VCC )
  18. )
  19. ( 4C6E20A6 $noname U1 74LS04
  20. ( 1 /CLOCK_IN )
  21. ( 2 N-04 )
  22. ( 7 GND )
  23. ( 14 VCC )
  24. )
  25. ( 4C6E2094 $noname C1 CP
  26. ( 1 /CLOCK_IN )
  27. ( 2 GND )
  28. )
  29. ( 4C6E208A $noname R1 R
  30. ( 1 VCC )
  31. ( 2 /CLOCK_IN )
  32. )
  33. )
  34. *

Eeschema 插件界面

中间网表转换器可以在 Eeschema 中自动启动。

初始化对话窗口

可以通过单击 添加插件 按钮添加新的网表插件用户界面选项卡。

eeschema_plugin_add_plugin_png

以下是 PadsPcb 选项卡的配置数据:

eeschema_plugin_padspcb_png

插件配置参数

Eeschema 插件配置对话框需要以下信息:

  • 标题:例如,网表格式的名称。

  • 用于启动转换器的命令行。

单击网表按钮后,将发生以下情况:

  1. Eeschema 创建了一个中间网表文件 *.xml,例如 test.xml。

  2. Eeschema 通过读取 test.xml 来运行插件, 并创建 test.net。

使用命令行生成网络列表文件

假设我们使用程序 xsltproc.exe 将工作表样式应用于中间文件,则使用以下命令执行 xsltproc.exe

xsltproc.exe -o <output filename> < style-sheet filename> <input XML file to convert>

在 Windows 下的 KiCad 中,命令行如下:

f:/kicad/bin/xsltproc.exe -o “%O” f:/kicad/bin/plugins/netlist_form_pads-pcb.xsl “%I”

在 Linux 下,命令变为如下:

xsltproc -o “%O” /usr/local/kicad/bin/plugins/netlist_form_pads-pcb.xsl “%I”

netlist_form_pads-pcb.xsl 是您要应用的样式表。 不要忘记文件名周围的双引号,这允许它们在 Eeschema 替换后有空格。

命令行格式接受文件名的参数:

支持的格式设置参数是。

  • %B ⇒ 基本文件名和所选输出文件的路径,减去路径和扩展名。

  • %I ⇒ 完整的文件名和临时输入文件的路径(中间网络文件)。

  • %O ⇒ 完整的文件名和用户选择的输出文件的路径。

%I 将被实际的中间文件名替换

%O 将替换为实际输出文件名。

命令行格式:xsltproc 的示例

xsltproc 的命令行格式如下:

<path of xsltproc> xsltproc <xsltproc parameters>

在 Windows 下:

f:/kicad/bin/xsltproc.exe -o “%O” f:/kicad/bin/plugins/netlist_form_pads-pcb.xsl “%I”

在 Linux 下:

xsltproc -o “%O” /usr/local/kicad/bin/plugins/netlist_form_pads-pcb.xsl “%I”

上面的示例假设 xsltproc 安装在 Windows 下的 PC 上,所有文件都位于 kicad/bin 中。

物料清单(BOM)生成

由于中间网表文件包含有关已使用元件的所有信息,因此可以从中提取 BOM。 以下是用于创建自定义物料清单(BOM)文件的插件设置窗口(在 Linux 上):

bom-netlist-tab_png

样式表 bom2csv.xsl 的路径取决于系统。 目前用于 BOM 生成的最佳 XSLT 样式表称为 bom2csv.xsl。 您可以根据自己的需要自由修改它,如果您开发了一些非常有用的东西,请让它成为 KiCad 项目的一部分。

命令行格式:python 脚本的示例

python 的命令行格式如下:

python <脚本文件名> <输入文件名> <输出文件名>

在 Windows 下:

python *.exe f:/kicad/python/my_python_script.py “%I” “%O”

在 Linux 下:

python /usr/local/kicad/python/my_python_script.py “%I” “%O”

假设你的 PC 上安装了 python。

中间网表结构

此示例提供了网表文件格式的概念。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <export version="D">
  3. <design>
  4. <source>F:\kicad_aux\netlist_test\netlist_test.sch</source>
  5. <date>29/08/2010 21:07:51</date>
  6. <tool>eeschema (2010-08-28 BZR 2458)-unstable</tool>
  7. </design>
  8. <components>
  9. <comp ref="P1">
  10. <value>CONN_4</value>
  11. <libsource lib="conn" part="CONN_4"/>
  12. <sheetpath names="/" tstamps="/"/>
  13. <tstamp>4C6E2141</tstamp>
  14. </comp>
  15. <comp ref="U2">
  16. <value>74LS74</value>
  17. <libsource lib="74xx" part="74LS74"/>
  18. <sheetpath names="/" tstamps="/"/>
  19. <tstamp>4C6E20BA</tstamp>
  20. </comp>
  21. <comp ref="U1">
  22. <value>74LS04</value>
  23. <libsource lib="74xx" part="74LS04"/>
  24. <sheetpath names="/" tstamps="/"/>
  25. <tstamp>4C6E20A6</tstamp>
  26. </comp>
  27. <comp ref="C1">
  28. <value>CP</value>
  29. <libsource lib="device" part="CP"/>
  30. <sheetpath names="/" tstamps="/"/>
  31. <tstamp>4C6E2094</tstamp>
  32. <comp ref="R1">
  33. <value>R</value>
  34. <libsource lib="device" part="R"/>
  35. <sheetpath names="/" tstamps="/"/>
  36. <tstamp>4C6E208A</tstamp>
  37. </comp>
  38. </components>
  39. <libparts/>
  40. <libraries/>
  41. <nets>
  42. <net code="1" name="GND">
  43. <node ref="U1" pin="7"/>
  44. <node ref="C1" pin="2"/>
  45. <node ref="U2" pin="7"/>
  46. <node ref="P1" pin="4"/>
  47. </net>
  48. <net code="2" name="VCC">
  49. <node ref="R1" pin="1"/>
  50. <node ref="U1" pin="14"/>
  51. <node ref="U2" pin="4"/>
  52. <node ref="U2" pin="1"/>
  53. <node ref="U2" pin="14"/>
  54. <node ref="P1" pin="1"/>
  55. </net>
  56. <net code="3" name="">
  57. <node ref="U2" pin="6"/>
  58. </net>
  59. <net code="4" name="">
  60. <node ref="U1" pin="2"/>
  61. <node ref="U2" pin="3"/>
  62. </net>
  63. <net code="5" name="/SIG_OUT">
  64. <node ref="P1" pin="2"/>
  65. <node ref="U2" pin="5"/>
  66. <node ref="U2" pin="2"/>
  67. </net>
  68. <net code="6" name="/CLOCK_IN">
  69. <node ref="R1" pin="2"/>
  70. <node ref="C1" pin="1"/>
  71. <node ref="U1" pin="1"/>
  72. <node ref="P1" pin="3"/>
  73. </net>
  74. </nets>
  75. </export>

一般网表文件结构

中间网表占五个部分。

  • “标题” 部分。

  • “元件” 部分。

  • “库元件” 部分。

  • “库” 部分。

  • “网” 部分。

文件内容具有分隔符 <export>

  1. <export version="D">
  2. ...
  3. </export>

“标题” 部分

标题具有分隔符 <design>

  1. <design>
  2. <source>F:\kicad_aux\netlist_test\netlist_test.sch</source>
  3. <date>21/08/2010 08:12:08</date>
  4. <tool>eeschema (2010-08-09 BZR 2439)-unstable</tool>
  5. </design>

此部分可被视为批注部分。

“元件” 部分

元件部分具有分隔符 <components>

  1. <components>
  2. <comp ref="P1">
  3. <value>CONN_4</value>
  4. <libsource lib="conn" part="CONN_4"/>
  5. <sheetpath names="/" tstamps="/"/>
  6. <tstamp>4C6E2141</tstamp>
  7. </comp>
  8. </components>

本节包含原理图中的元件列表。 每个元件都是这样描述的:

  1. <comp ref="P1">
  2. <value>CONN_4</value>
  3. <libsource lib="conn" part="CONN_4"/>
  4. <sheetpath names="/" tstamps="/"/>
  5. <tstamp>4C6E2141</tstamp>
  6. </comp>
libsource找到此元件的库的名称。

part

此库中的组件名称。

sheetpath

层次结构中工作表的路径:标识工作表 在完整的原理图层次结构中。

tstamps (time stamps)

原理图文件的时间戳。

tstamp (time stamp)

元件的时间戳。

关于元件的时间戳的注意事项

要识别网表中的元件,从而识别板上,时间戳参考对每个元件都是唯一的。 然而,KiCad 提供了一种辅助方法来识别元件,该元件是电路板上相应的占位面积。 这允许重新批注原理图项目中的元件,并且不会丢失元件与其占用空间之间的链接。

时间戳是原理图项目中每个元件或工作表的唯一标识符。但是, 在复杂的层次结构中, 同一工作表多次使用, 因此此工作表包含具有相同时间戳的元件。

复杂层次结构中的给定工作表具有唯一标识符:其 sheetpath。 给定元件(在复杂层次结构内)具有唯一标识符:sheetpath + 其 tstamp

“库部件” 部分

库部件部分具有分隔符 <libparts>,并且此部分的内容在原理图库中定义。 库部件部分包含

  • 允许的封装名称(名称使用通配符)以 <fp> 为分隔符。

  • 库分隔符中定义的字段 <fields>。

  • 引脚列表分隔 <pins>。

  1. <libparts>
  2. <libpart lib="device" part="CP">
  3. <description>Condensateur polarise</description>
  4. <footprints>
  5. <fp>CP*</fp>
  6. <fp>SM*</fp>
  7. </footprints>
  8. <fields>
  9. <field name="Reference">C</field>
  10. <field name="Valeur">CP</field>
  11. </fields>
  12. <pins>
  13. <pin num="1" name="1" type="passive"/>
  14. <pin num="2" name="2" type="passive"/>
  15. </pins>
  16. </libpart>
  17. </libparts>

类似 <pin num=”1” type=”passive”/> 的线路也给出了电气引脚类型。可能的电气引脚类型有

Input

输入引脚

Output

输出引脚

Bidirectional

输入或输出

Tri-state

总线输入/输出

Passive

无源元件的结束

Unspecified

未知电气类型

Power input

单元件电源输入引脚

Power output

电源输出引脚作为稳压器输出

Open collector

模拟比较器中常见的开路集电极输出

Open emitter

有时在逻辑中找到开放发射器输出。

Not connected

必须在原理图中保持未连接状态

“库” 部分

库部分具有分隔符<libraries>。 本节包含项目中使用的原理图库列表。

  1. <libraries>
  2. <library logical="device">
  3. <uri>F:\kicad\share\library\device.lib</uri>
  4. </library>
  5. <library logical="conn">
  6. <uri>F:\kicad\share\library\conn.lib</uri>
  7. </library>
  8. </libraries>

“网” 部分

“网” 部分具有分隔符 <nets>。本节包含原理图的 “连接”。

  1. <nets>
  2. <net code="1" name="GND">
  3. <node ref="U1" pin="7"/>
  4. <node ref="C1" pin="2"/>
  5. <node ref="U2" pin="7"/>
  6. <node ref="P1" pin="4"/>
  7. </net>
  8. <net code="2" name="VCC">
  9. <node ref="R1" pin="1"/>
  10. <node ref="U1" pin="14"/>
  11. <node ref="U2" pin="4"/>
  12. <node ref="U2" pin="1"/>
  13. <node ref="U2" pin="14"/>
  14. <node ref="P1" pin="1"/>
  15. </net>
  16. </nets>

本节列出了原理图中的所有网络。

可能的网络包含以下内容。

  1. <net code="1" name="GND">
  2. <node ref="U1" pin="7"/>
  3. <node ref="C1" pin="2"/>
  4. <node ref="U2" pin="7"/>
  5. <node ref="P1" pin="4"/>
  6. </net>

net code

是此网络的内部标识符

name

是此网络的名称

node

给出一个连接到该网络的引脚引用

有关 xsltproc 的更多信息

请参阅页面:http://xmlsoft.org/XSLT/xsltproc.html

简介

xsltproc 是一个命令行工具,用于将 XSLT 样式表应用于 XML 文档。 虽然它是作为 GNOME 项目的一部分开发的,但它可以独立于 GNOME 桌面运行。

从命令行调用 xsltproc,其中包含要使用的样式表的名称,后跟要应用样式表的文件的名称。 如果提供的文件名是 - ,它将使用标准输入。

如果样式表包含在带有样式表处理指令的 XML 文档中,则不需要在命令行中命名样式表。xsltproc 将自动检测包含的样式表并使用它。 默认情况下,输出为 stdout。 您可以使用 -o 选项指定要输出的文件。

简介

  1. xsltproc [[-V] | [-v] | [-o *file* ] | [--timing] | [--repeat] |
  2. [--debug] | [--novalid] | [--noout] | [--maxdepth *val* ] | [--html] |
  3. [--param *name* *value* ] | [--stringparam *name* *value* ] | [--nonet] |
  4. [--path *paths* ] | [--load-trace] | [--catalogs] | [--xinclude] |
  5. [--profile] | [--dumpextensions] | [--nowrite] | [--nomkdir] |
  6. [--writesubtree] | [--nodtdattr]] [ *stylesheet* ] [ *file1* ] [ *file2* ]
  7. [ *....* ]

命令行选项

-V o --version

显示使用的 libxml 和 libxslt 的版本。

-v o --verbose

输出 xsltproc 在处理样式表和文档时采取的每个步骤。

-o o --output file

直接输出到名为 file 的文件。对于多个输出,也称为 chunking,-o directory/ 将输出文件定向到指定的目录。该目录必须已存在。

--timing

显示用于解析样式表,解析文档和应用样式表并保存结果的时间。以毫秒显示。

--repeat

运行转换20次。用于定时测试。

--debug

输出转换后文档的 XML 树,以进行调试。

--novalid

跳过加载文档的 DTD。

--noout

不输出结果。

--maxdepth value

在 libxslt 断定它处于无限循环之前调整模板堆栈的最大深度。 默认值为500。

--html

输入文档是 HTML 文件。

--param name value

将名称 name 和值 value 的参数传递给样式表。 您可以传递多个名称/值对,最多为32.如果传递的值是字符串而不是节点标识符,请改用 —stringparam。

--stringparam name value

传递名称 name 和值 value 的参数,其中 value 是字符串而不是节点标识符。(注意:字符串必须是utf-8。)

--nonet

不要使用互联网来获取 DTD,实体或文档。

--path paths

使用 paths 指定的文件系统路径的列表(由空格或列分隔)来加载 DTD,实体或文档。

--load-trace

向 stderr 显示处理期间加载的所有文档。

--catalogs

使用 SGML_CATALOG_FILES 中指定的 SGML 目录来解析外部实体的位置。默认情况下,xsltproc 查找 XML_CATALOG_FILES 中指定的目录。如果未指定,则使用 /etc/xml/catalog。

--xinclude

使用 Xinclude 规范处理输入文档。有关这方面的更多详细信息,请参阅 Xinclude 规范:http://www.w3.org/TR/xinclude/\[[http://www.w3.org/TR/xinclude/](http://www.w3.org/TR/xinclude/)\]

--profile —norman

输出分析信息,详细说明样式表的每个部分所花费的时间。这在优化样式表性能时很有用。

--dumpextensions

将所有已注册扩展名的列表转储到 stdout。

--nowrite

拒绝写入任何文件或资源。

--nomkdir

拒绝创建目录。

--writesubtree path

仅允许在 path 子树内写入文件。

--nodtdattr

不要从文档的 DTD 应用默认属性。

Xsltproc 返回值

xsltproc 返回一个状态编号,在脚本中调用它时非常有用。

0: 正常

1: 无参数

2: 参数太多

3: 未知选项

4:无法解析样式表

5: 样式表中的错误

6:其中一个文件出错

7: 不支持的 xsl: 输出方法

8:字符串参数包含引号和双引号

9: 内部处理错误

10:通过终止消息停止处理

11:无法将结果写入输出文件

有关 xsltproc 的更多信息

libxml 网页:http://www.xmlsoft.org/\[[http://www.xmlsoft.org/](http://www.xmlsoft.org/)\]

W3C XSLT 页面:http://www.w3.org/TR/xslt\[[http://www.w3.org/TR/xslt](http://www.w3.org/TR/xslt)\]