本帖最后由 sunsili 于 2023-10-25 17:58 编辑
【KiCAD】怎么给差分信号定义网络类?
“ KiCad 7 之后,网络类的定义改用通配符或正则表达式,变得不那么直观,被不少小伙伴诟病。那如何用新方法来定义差分对的网络类呢? ”
差分对网络类的定义我们之前知道,KiCad 的差分对定义使用 + 和 - 或 P 和 N 作为后缀。例如,网络 USB+ 和 USB- 构成一个差分对,网络 USB_P 和 USB_N 也是如此。在具体分析如何使用通配符或正则表达式来定义网络类之前,我们先给出结论(定义差分对的网络类):
.*[+-]
.*[PN]
这是两个正则表达式,可以匹配所有结尾为 “+”、“-” 以及 “P”、“N” 的网络。其中 “*” 表示任意字符,[ ] 表示其中任意字符匹配即可。注意,以上的正则表达式会匹配所有后缀满足条件的网络,即使不是差分对。因此,为了完美匹配差分对,表达式中还应包含差分对的基本名称。比如无论差分对网络名分别为 USB+ 、USB- 或者 USB_Conn_D+、USB_Conn_D-,只要网络中名称含 “USB” 都可以用以下表达式描述:.*USB*[+-].*USB*[PN]从应用的角度,记住这个结论就可以了。可以不可以用以下的方式匹配呢?.*[-+PN]当然可以,但是不建议在同一个设计中使用不同的方式(+/-、P/N混用)代表差分对...喜欢钻研的小伙伴可以继续往下看,我会尝试解释网络类匹配中一些比较让人疑惑的地方(亲身体会,我也研究了很久才搞明白),比如 *USB*[+-] 为什么匹配不到任何结果。内容稍微有点烧脑,不过学会之后会有豁然开朗的感觉。 吐槽时刻 KiCad 6 创建网络类的方式非常直观,直接可以查看所有网络,选择添加到相应的网络类即可。但 KiCad 7 之后,改成了更 “高端” 通配符和正则表达式,虽然更灵活,但非常 “反人类”,将网络添加到 “网络类” 变得非常烧脑。 通配符与正则表达式首先需要强调一点,KiCad 中网络类匹配的功能同时支持通配符和正则表达式,也就是说 KiCad 会将字符串分别用通配符和正则表达式进行匹配,只要有一种方式匹配成功,就会返回结果。 这里最容易犯的错就是把通配符和正则表达式的语法混在一个字符串里,那就什么都返回不了...
通配符通配符(Wildcard)是最常用的匹配方法,语法也相当简单:“*” 号代表任意字符,“?” 号代表单一字符。比如,您已经知道了差分对网络名为 USB_D+ 和 USB_D-,希望将其添加到 DP 的网络类,可以使用 *USB_D? 或者 *USB*。 这里出现了第一个问题,为什么最前面要加一个 “*” 号呢?你会发现,如果不加 “*” 号,没有任何匹配结果:
原因是 KiCad 中网络名不一定和网络标签完全一致。根原理图的网络名前会加一个 “/”,如果是子图的话会有多层斜杠,比如 “/abc/USB-”。所以必须在网络标签的名称前加个通配符 “*”:如果 DP 网络类需要增加网络 USB_Conn_D+、USB_Conn_D-,可以使用表达式 *USB*,这时 “?” 显然不再适用:这里就出现了第二个问题,*USB* 这个表达式太宽泛了,如果图纸中存在类似 USB_3V3,USB_GND 的网络,也会被这个表达式匹配到。这时候通配符的方式就无能为力了,必须要使用正则表达式。正则表达式正则表达式在软件工程中应用相当广泛,无论是网页中常用的文本匹配,还是芯片设计中分组索引,都会大量用到正则表达式(Regular Expression)。正则表达式的语法比通配符复杂的多,这里不详细展开。下面的表格是最基本的语法:
详细的正则表达式说明请参考: https://docs.wxwidgets.org/3.0/overview_resyntax.html简单说,正则表达式基本可以描述一切有规律可循的字符串匹配。 *USB*[+-] 为什么匹配不到结果? 既然正则表达式已经涵盖了通配符,那为什么 *USB*[+-] 匹配不到任何结果呢?因为 *USB*[+-](前面没有句号)是一个无效的正则表达式。正则表达式的语法规定 “*” 字符只能作用于前一个字符(因此,将其放在开头而没有前一个字符是无效的)。所以正确的语法是在表达式最前面加一个 “.” 号,在正则中,“.” 号代表任意单字符。即 .*USB*[+-]。在匹配过程中,KiCad 会先尝试将其理解为一个正则表达式,然后发现这个表达式是无效的。因此只能用通配符的方式进行匹配,而在通配符的语法中,*USB*[+-] 中 [+-] 并不会被翻译为 “+” 或 “-”,而是严格的字符串 [+-],这自然也无法与类似 USB_D+ 的网络名匹配。如果不确定正则表达式是否有效,可以用以下的网站进行检查:https://www.regexpal.com/这个网站会指出表达式中每个字符的含义,非常好用。下图中指出了 “*” 号是无效的。光标移动到任何字符,都会给出清晰的解释: 问题在哪里?即使您理解正则表达式,在 KiCad 中进行网络类匹配时也会经常疑惑为什么匹配不到结果,主要原因在于:KiCad 中的网络名不等同于网络标签的名字
- KiCad 会分别尝试用 正则表达式 和 通配符 的方式去进行匹配,但却并没有明确的告诉用户当前匹配使用的是哪种方式,也不会指出匹配的问题出在那儿。
如果可以用颜色或标签的方式指出当前匹配的模式,或者像 DRC 自定义规则那样,给出一些常用的示例,无疑会大大方便用户的理解和使用。 另外,用正则表达式进行网络类匹配是一个动态的过程。如果在原理图中增加了符合模式的网络标签,该网络会自动添加到网络类中,无需用户手动添加。这种方式对于网络标签使用规范的场景(比如一类总线都以相似方式命名)相当方便。但如果使用不规范,也会导致在用户不知情的情况下将某个网络误加入网络类的情况。
结束语本文介绍了如何用通配符和正则表达式的方式添加差分对的网络类。但同样的方式对于总线、电源等需要添加网络类以便定义特殊规则或用颜色区分网络的场景同样有效。希望更多了解网络类的小伙伴可以参考之前的文章学习如何添加网络类:KiCad 7中添加网络类(一)
KiCad 7中添加网络类(二)
|