SkiDL:使用 Python 设计电路原理图

描述

 持续更新 8 年,Github 超过 1k star 的项目。一种使用文本替代原理图的语言。 

追踪 skidl 项目很久了,之所以之前没有分享是因为老版本只能支持 KiCad 5.0 符号库的解析,而且生成的网表也仅能支持 KiCad 6,所以用起来比较麻烦。最近作者又更新了一个大版本,全面支持 KiCad 7 和 KiCad 8,虽然仍有一些问题,但跑起来比之前方便了很多。AI 时代的到来,让自动化设计又多了一个研究的方向。由于 skidl 的设计初衷就是用文本描述原理图,这对于机器学习来说无疑是非常合适的!感兴趣的小伙伴赶紧学习起来吧,有兴趣进一步讨论的也可以私信我或留言。

SKiDL 简介

通过 SKiDL Python 软件包,您可以用文本描述电子元件之间的连接。生成的 Python 程序可对常见错误进行电气规则检查,并输出网表,作为 PCB Layout 工具的输入。
  • 项目主页:https://github.com/devbisme/skidl

  • License MIT 

  • 文档:http://devbisme.github.io/skidl

  • 用户论坛:https://github.com/devbisme/skidl/discussions

skidl 希望做到的,提供一个选项,既可以通过传统方式设计原理图(下图一),也可以用代码的方式实现(下图二):

电路原理图

电路原理图

 

功能
  • 语法强大、灵活(因为它是 Python)。

  • 允许对电子电路进行简洁描述(想象一下不需要在多页原理图中追踪信号)。

  • 允许对电子电路进行文本描述(想想在电路中使用 diff 和 git)。

  • 针对常见错误(如未连接器件的 I/O 引脚)执行电气规则检查 (ERC)。

  • 支持电子设计的平铺/分层/混合描述。

  • 支持设计复用(想象一下使用 PyPi 和 Github 发布电子设计)。

  • 可创建智能电路模块,这些模块的行为/结构可通过参数改变(想想滤波器,其元件值可根据你所需的截止频率自动调整)。

  • 可与任何 ECAD 工具配合使用(只需两种方法:一种用于读取元件库,另一种用于输出正确的网表格式)。

  • 可执行 SPICE 仿真(仅限 Python 3)。

  • 充分利用 Python 生态系统的所有优势(因为它是 Python)。

举例

下面的 SKiDL 程序描述了一个由分立晶体管构建的双输入 AND 门,作为一个非常简单的例子:

电路原理图

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
from skidl import *
# Create part templates.q = Part("Device", "Q_PNP_CBE", dest=TEMPLATE)r = Part("Device", "R", dest=TEMPLATE)
# Create nets.gnd, vcc = Net("GND"), Net("VCC")a, b, a_and_b = Net("A"), Net("B"), Net("A_AND_B")
# Instantiate parts.gndt = Part("power", "GND")             # Ground terminal.vcct = Part("power", "VCC")             # Power terminal.q1, q2 = q(2)                           # Two transistors.r1, r2, r3, r4, r5 = r(5, value="10K")  # Five 10K resistors.
# Make connections between parts.a & r1 & q1["B C"] & r4 & q2["B C"] & a_and_b & r5 & gndb & r2 & q1["B"]q1["C"] & r3 & gndvcc += q1["E"], q2["E"], vcctgnd += gndt
generate_netlist(tool=KICAD8) # Create KICAD version 8 netlist.
以下是输出的网表,可以直接在 KiCad 中导入:
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
(export (version D)  (design    (source "/home/devb/projects/KiCad/tools/skidl/tests/examples/svg/simple_and_gate.py")    (date "07/19/2024 05:54 AM")    (tool "SKiDL (1.2.2)"))  (components    (comp (ref #PWR1)      (value GND)      (footprint )      (fields        (field (name F0) #PWR)        (field (name F1) GND))      (libsource (lib power) (part GND))      (sheetpath (names /top/18388231966295430075) (tstamps /top/18388231966295430075)))    (comp (ref #PWR2)      (value VCC)      (footprint )      (fields        (field (name F0) #PWR)        (field (name F1) VCC))      (libsource (lib power) (part VCC))      (sheetpath (names /top/12673122245445984714) (tstamps /top/12673122245445984714)))    (comp (ref Q1)      (value Q_PNP_CBE)      (footprint )      (fields        (field (name F0) Q)        (field (name F1) Q_PNP_CBE))      (libsource (lib Device) (part Q_PNP_CBE))      (sheetpath (names /top/5884947020177711792) (tstamps /top/5884947020177711792)))    (comp (ref Q2)      (value Q_PNP_CBE)      (footprint )      (fields        (field (name F0) Q)        (field (name F1) Q_PNP_CBE))      (libsource (lib Device) (part Q_PNP_CBE))      (sheetpath (names /top/12871193304116279102) (tstamps /top/12871193304116279102)))    (comp (ref R1)      (value 10K)      (footprint )      (fields        (field (name F0) R)        (field (name F1) R))      (libsource (lib Device) (part R))      (sheetpath (names /top/17200003438453088695) (tstamps /top/17200003438453088695)))    (comp (ref R2)      (value 10K)      (footprint )      (fields        (field (name F0) R)        (field (name F1) R))      (libsource (lib Device) (part R))      (sheetpath (names /top/12314015795656540138) (tstamps /top/12314015795656540138)))    (comp (ref R3)      (value 10K)      (footprint )      (fields        (field (name F0) R)        (field (name F1) R))      (libsource (lib Device) (part R))      (sheetpath (names /top/11448722674936198910) (tstamps /top/11448722674936198910)))    (comp (ref R4)      (value 10K)      (footprint )      (fields        (field (name F0) R)        (field (name F1) R))      (libsource (lib Device) (part R))      (sheetpath (names /top/2224275500810828611) (tstamps /top/2224275500810828611)))    (comp (ref R5)      (value 10K)      (footprint )      (fields        (field (name F0) R)        (field (name F1) R))      (libsource (lib Device) (part R))      (sheetpath (names /top/3631169005149914336) (tstamps /top/3631169005149914336))))  (nets    (net (code 1) (name A)      (node (ref R1) (pin 1)))    (net (code 2) (name A_AND_B)      (node (ref Q2) (pin 1))      (node (ref R5) (pin 1)))    (net (code 3) (name B)      (node (ref R2) (pin 1)))    (net (code 4) (name GND)      (node (ref #PWR1) (pin 1))      (node (ref R3) (pin 2))      (node (ref R5) (pin 2)))    (net (code 5) (name N$1)      (node (ref Q1) (pin 2))      (node (ref R1) (pin 2))      (node (ref R2) (pin 2)))    (net (code 6) (name N$2)      (node (ref Q1) (pin 1))      (node (ref R3) (pin 1))      (node (ref R4) (pin 1)))    (net (code 7) (name N$3)      (node (ref Q2) (pin 2))      (node (ref R4) (pin 2)))    (net (code 8) (name VCC)      (node (ref #PWR2) (pin 1))      (node (ref Q1) (pin 3))      (node (ref Q2) (pin 3)))))

注意事项

skidl 在 Windows 上运行的时候经常会碰到问题。最常见的问题是没有正确设置符号库的环境变量,导致无法找到符号库,解析错误。这个错误可以在代码中加入以下语句解决:

  •  
os.environ["KICAD8_SYMBOL_DIR"] = "C:\symbols"
“=” 号后面的路径为实际的符号路径。 如果您使用的不是 KiCad 8,而是其他版本的 KiCad,那么最好设置一下默认工具:
  •  
set_default_tool(KICAD8)
同样的,输出网表的时候也要指定网表的版本(K8/K7/K6 网表格式有变动):
  •  
generate_netlist(tool=KICAD8)
此外, 目前版本的 skidl 还可以直接生成原理图和 PCB,但功能尚不完备,环境配置比较复杂,建议编程基础较好的小伙伴尝试。

结束语

skidl 的具体使用方式,这里就不再赘述了,有兴趣的小伙伴可以自行阅读 skidl 的文档,遇到问题也可以搜索仓库中的 issue 和 forum,作者 Dave 也非常乐意与大家互动,解答大家的问题。 最后总结一下 skidl 做了什么:用 python 代码实现图形界面的原理图设计。具体的实现方式为:
  1. 通过环境变量找到需要使用的原理图符号,parse出符号的引脚编号(名称)
  2. 在文本编辑器(或IDE)中使用编程语言连接这些管脚
  3. 生成 KiCad 格式的网表

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分