pages tagged kicad
wsh
https://rtime.felk.cvut.cz/~sojka/tags/kicad/
wsh
ikiwiki
2019-04-28T13:51:35Z
KiCad Eeschema automation
https://rtime.felk.cvut.cz/~sojka/blog/kicad-schema-automation/
2019-04-28T13:51:35Z
2016-01-10T14:03:28Z
<p>
I started using <a href="http://kicad-pcb.org/">KiCad</a> (version 4.0.1) for electronic design. It seems
to be a great tool, but working with big connectors in schema editor
is tedious. All connections have to be done manually and thus the
process is error prone. Some way of automating the process would help.
KiCad comes with <a href="http://confluence.kicad-pcb.org/display/KICAD/KiCad+Scripting+Reference+Manual">scripting support</a>, but unfortunately only in pcbnew.
Eeschema seems not to have any support for automation yet. Hopefully,
one can use <a href="http://www.semicomplete.com/projects/xdotool/">xdotool</a> under Linux to automate some boring tasks.
</p>
<p>
I wanted to attach the same labels to FMC connector pins as on the
<a href="http://zedboard.org/sites/default/files/documentations/MBCC_FMC_UG_1.1.pdf">MicroZed FMC Carrier board</a> – there is about 70 pins used. My initial
state was this:
</p>
<div id="org8418353" class="figure">
<p><a href="https://rtime.felk.cvut.cz/~sojka/blog/kicad-schema-automation/before.png" width="100%"><img src="https://rtime.felk.cvut.cz/~sojka/blog/kicad-schema-automation/before.png" alt="before.png" width="100%" /></a>
</p>
</div>
<p>
I copied the pin names and net labels from the <a href="http://zedboard.org/sites/default/files/documentations/MBCC-FMC_RevB_Schematic_140211.pdf">original schmatic in
PDF</a> and put together the script bellow, which takes care of attaching
the labels to the right pins. So after a few seconds I got the
following:
</p>
<div id="org7965c3a" class="figure">
<p><a href="https://rtime.felk.cvut.cz/~sojka/blog/kicad-schema-automation/after.png" width="100%"><img src="https://rtime.felk.cvut.cz/~sojka/blog/kicad-schema-automation/after.png" alt="after.png" width="100%" /></a>
</p>
</div>
<p>
The Python script that does the magic is here:
</p>
<div class="org-src-container">
<pre class="src src-python"><span class="org-comment-delimiter">#</span><span class="org-comment">!/usr/bin/env python3</span>
<span class="org-keyword">import</span> subprocess
<span class="org-variable-name">conn</span> = [
(<span class="org-string">"LA06_P"</span>, <span class="org-string">"C10"</span>),
(<span class="org-string">"LA06_N"</span>, <span class="org-string">"C11"</span>),
(<span class="org-string">"LA10_P"</span>, <span class="org-string">"C14"</span>),
(<span class="org-string">"LA10_N"</span>, <span class="org-string">"C15"</span>),
(<span class="org-string">"LA14_P"</span>, <span class="org-string">"C18"</span>),
(<span class="org-string">"LA14_N"</span>, <span class="org-string">"C19"</span>),
(<span class="org-string">"LA18_CC_P"</span>, <span class="org-string">"C22"</span>),
(<span class="org-string">"LA18_CC_N"</span>, <span class="org-string">"C23"</span>),
(<span class="org-string">"LA27_P"</span>, <span class="org-string">"C26"</span>),
(<span class="org-string">"LA27_N"</span>, <span class="org-string">"C27"</span>),
(<span class="org-string">"LA01_CC_P"</span>, <span class="org-string">"D08"</span>),
(<span class="org-string">"LA01_CC_N"</span>, <span class="org-string">"D09"</span>),
(<span class="org-string">"LA05_P"</span>, <span class="org-string">"D11"</span>),
(<span class="org-string">"LA05_N"</span>, <span class="org-string">"D12"</span>),
(<span class="org-string">"LA09_P"</span>, <span class="org-string">"D14"</span>),
(<span class="org-string">"LA09_N"</span>, <span class="org-string">"D15"</span>),
(<span class="org-string">"LA13_P"</span>, <span class="org-string">"D17"</span>),
(<span class="org-string">"LA13_N"</span>, <span class="org-string">"D18"</span>),
(<span class="org-string">"LA17_CC_P"</span>, <span class="org-string">"D20"</span>),
(<span class="org-string">"LA17_CC_N"</span>, <span class="org-string">"D21"</span>),
(<span class="org-string">"LA23_P"</span>, <span class="org-string">"D23"</span>),
(<span class="org-string">"LA23_N"</span>, <span class="org-string">"D24"</span>),
(<span class="org-string">"LA26_P"</span>, <span class="org-string">"D26"</span>),
(<span class="org-string">"LA26_N"</span>, <span class="org-string">"D27"</span>),
(<span class="org-string">"CLK1_M2C_P"</span>, <span class="org-string">"G02"</span>),
(<span class="org-string">"CLK1_M2C_N"</span>, <span class="org-string">"G03"</span>),
(<span class="org-string">"LA00_CC_P"</span>, <span class="org-string">"G06"</span>),
(<span class="org-string">"LA00_CC_N"</span>, <span class="org-string">"G07"</span>),
(<span class="org-string">"LA03_P"</span>, <span class="org-string">"G09"</span>),
(<span class="org-string">"LA03_N"</span>, <span class="org-string">"G10"</span>),
(<span class="org-string">"LA08_P"</span>, <span class="org-string">"G12"</span>),
(<span class="org-string">"LA08_N"</span>, <span class="org-string">"G13"</span>),
(<span class="org-string">"LA12_P"</span>, <span class="org-string">"G15"</span>),
(<span class="org-string">"LA12_N"</span>, <span class="org-string">"G16"</span>),
(<span class="org-string">"LA16_P"</span>, <span class="org-string">"G18"</span>),
(<span class="org-string">"LA16_N"</span>, <span class="org-string">"G19"</span>),
(<span class="org-string">"LA20_P"</span>, <span class="org-string">"G21"</span>),
(<span class="org-string">"LA20_N"</span>, <span class="org-string">"G22"</span>),
(<span class="org-string">"LA22_P"</span>, <span class="org-string">"G24"</span>),
(<span class="org-string">"LA22_N"</span>, <span class="org-string">"G25"</span>),
(<span class="org-string">"LA25_P"</span>, <span class="org-string">"G27"</span>),
(<span class="org-string">"LA25_N"</span>, <span class="org-string">"G28"</span>),
(<span class="org-string">"LA29_P"</span>, <span class="org-string">"G30"</span>),
(<span class="org-string">"LA29_N"</span>, <span class="org-string">"G31"</span>),
(<span class="org-string">"LA31_P"</span>, <span class="org-string">"G33"</span>),
(<span class="org-string">"LA31_N"</span>, <span class="org-string">"G34"</span>),
(<span class="org-string">"LA33_P"</span>, <span class="org-string">"G36"</span>),
(<span class="org-string">"LA33_N"</span>, <span class="org-string">"G37"</span>),
(<span class="org-string">"CLK0_M2C_P"</span>, <span class="org-string">"H04"</span>),
(<span class="org-string">"CLK0_M2C_N"</span>, <span class="org-string">"H05"</span>),
(<span class="org-string">"LA02_P"</span>, <span class="org-string">"H07"</span>),
(<span class="org-string">"LA02_N"</span>, <span class="org-string">"H08"</span>),
(<span class="org-string">"LA04_P"</span>, <span class="org-string">"H10"</span>),
(<span class="org-string">"LA04_N"</span>, <span class="org-string">"H11"</span>),
(<span class="org-string">"LA07_P"</span>, <span class="org-string">"H13"</span>),
(<span class="org-string">"LA07_N"</span>, <span class="org-string">"H14"</span>),
(<span class="org-string">"LA11_P"</span>, <span class="org-string">"H16"</span>),
(<span class="org-string">"LA11_N"</span>, <span class="org-string">"H17"</span>),
(<span class="org-string">"LA15_P"</span>, <span class="org-string">"H19"</span>),
(<span class="org-string">"LA15_N"</span>, <span class="org-string">"H20"</span>),
(<span class="org-string">"LA19_P"</span>, <span class="org-string">"H22"</span>),
(<span class="org-string">"LA19_N"</span>, <span class="org-string">"H23"</span>),
(<span class="org-string">"LA21_P"</span>, <span class="org-string">"H25"</span>),
(<span class="org-string">"LA21_N"</span>, <span class="org-string">"H26"</span>),
(<span class="org-string">"LA24_P"</span>, <span class="org-string">"H28"</span>),
(<span class="org-string">"LA24_N"</span>, <span class="org-string">"H29"</span>),
(<span class="org-string">"LA28_P"</span>, <span class="org-string">"H31"</span>),
(<span class="org-string">"LA28_N"</span>, <span class="org-string">"H32"</span>),
(<span class="org-string">"LA30_P"</span>, <span class="org-string">"H34"</span>),
(<span class="org-string">"LA30_N"</span>, <span class="org-string">"H35"</span>),
(<span class="org-string">"LA32_P"</span>, <span class="org-string">"H37"</span>),
(<span class="org-string">"LA32_N"</span>, <span class="org-string">"H38"</span>),
]
subprocess.call([<span class="org-string">"xdotool"</span>, <span class="org-string">"search"</span>, <span class="org-string">"--name"</span>, <span class="org-string">"/FMC/"</span>, <span class="org-string">"windowfocus"</span>])
<span class="org-variable-name">xtab</span> = <span class="org-builtin">str</span>.maketrans({<span class="org-string">"_"</span>: <span class="org-string">"underscore"</span>})
<span class="org-keyword">for</span> net <span class="org-keyword">in</span> <span class="org-variable-name">conn</span>:
label = [char.translate(xtab) <span class="org-keyword">for</span> char <span class="org-keyword">in</span> net[0]]
<span class="org-variable-name">pin</span> = [char.translate(xtab) <span class="org-keyword">for</span> char <span class="org-keyword">in</span> net[1]]
subprocess.call([<span class="org-string">"xdotool"</span>, <span class="org-string">"key"</span>, <span class="org-string">"--delay"</span>, <span class="org-string">"50"</span>, <span class="org-string">"ctrl+f"</span>] + pin + [<span class="org-string">"Return"</span>, <span class="org-string">"Escape"</span>, <span class="org-string">"Down"</span>, <span class="org-string">"Left"</span>, <span class="org-string">"Left"</span>, <span class="org-string">"Left"</span>, <span class="org-string">"w"</span>,
<span class="org-string">"Left"</span>, <span class="org-string">"Left"</span>, <span class="org-string">"Left"</span>, <span class="org-string">"Left"</span>, <span class="org-string">"Left"</span>, <span class="org-string">"Left"</span>, <span class="org-string">"Left"</span>, <span class="org-string">"Left"</span>,
<span class="org-string">"Left"</span>, <span class="org-string">"Left"</span>, <span class="org-string">"k"</span>, <span class="org-string">"l"</span>] + label + [ <span class="org-string">"Return"</span>, <span class="org-string">"Return"</span>])
</pre>
</div>