From b24bfafb39978decce7fe03dcf6c092b6bba8ef7 Mon Sep 17 00:00:00 2001 From: Branislav Stojkovic Date: Mon, 25 Feb 2019 11:05:15 +0100 Subject: [PATCH] add unit tests for netlist --- .../src/org/diylc/netlist/Group.java | 7 + .../org/diylc/netlist/NetlistAnalyzer.java} | 6 +- .../src/org/diylc/netlist/Tree.java | 19 ++- diylc/diylc-library/.classpath | 2 + diylc/diylc-library/lib/diylc-core.jar | Bin 262463 -> 262463 bytes .../diylc/netlist/GuitarDiagramAnalyzer.java | 2 +- .../diylc/netlist/NetlistAnalyzerTests.java | 126 ++++++++++++++++++ diylc/diylc-swing/lib/diylc-core.jar | Bin 262463 -> 262463 bytes diylc/diylc-swing/library/main.jar | Bin 612581 -> 612581 bytes diylc/diylc-swing/update.xml | 12 ++ 10 files changed, 169 insertions(+), 5 deletions(-) rename diylc/{diylc-library/src/org/diylc/netlist/AbstractNetlistAnalyzer.java => diylc-core/src/org/diylc/netlist/NetlistAnalyzer.java} (96%) create mode 100644 diylc/diylc-library/test/org/diylc/netlist/NetlistAnalyzerTests.java diff --git a/diylc/diylc-core/src/org/diylc/netlist/Group.java b/diylc/diylc-core/src/org/diylc/netlist/Group.java index 5cb3f844..52423eb4 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/Group.java +++ b/diylc/diylc-core/src/org/diylc/netlist/Group.java @@ -27,6 +27,8 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import org.diylc.core.IDIYComponent; + /** * Represents a group of {@link Node}s that are connected together. * @@ -44,6 +46,11 @@ public class Group implements Comparable { nodes.add(node1); nodes.add(node2); } + + public Group connect(IDIYComponent component, int index) { + getNodes().add(new Node(component, index)); + return this; + } public Set getNodes() { return nodes; diff --git a/diylc/diylc-library/src/org/diylc/netlist/AbstractNetlistAnalyzer.java b/diylc/diylc-core/src/org/diylc/netlist/NetlistAnalyzer.java similarity index 96% rename from diylc/diylc-library/src/org/diylc/netlist/AbstractNetlistAnalyzer.java rename to diylc/diylc-core/src/org/diylc/netlist/NetlistAnalyzer.java index b4ec4a2f..ae892835 100644 --- a/diylc/diylc-library/src/org/diylc/netlist/AbstractNetlistAnalyzer.java +++ b/diylc/diylc-core/src/org/diylc/netlist/NetlistAnalyzer.java @@ -28,11 +28,11 @@ import java.util.Set; import org.diylc.core.IDIYComponent; -public abstract class AbstractNetlistAnalyzer { +public class NetlistAnalyzer { - public AbstractNetlistAnalyzer() {} + public NetlistAnalyzer() {} - protected Tree constructTreeBetween(Netlist netlist, Node nodeA, Node nodeB) { + public Tree constructTreeBetween(Netlist netlist, Node nodeA, Node nodeB) { Tree tree = new Tree(TreeConnectionType.Parallel); connectNodes(netlist, nodeA, nodeB, tree.getChildren(), new Tree(TreeConnectionType.Series), new HashSet()); diff --git a/diylc/diylc-core/src/org/diylc/netlist/Tree.java b/diylc/diylc-core/src/org/diylc/netlist/Tree.java index 33dc26f3..fad41e30 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/Tree.java +++ b/diylc/diylc-core/src/org/diylc/netlist/Tree.java @@ -22,6 +22,8 @@ package org.diylc.netlist; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; public class Tree { @@ -97,6 +99,19 @@ public class Tree { return false; return true; } + + private List getOrderedChildren() { + if (getConnectionType() == TreeConnectionType.Series) + return children; + List ordered = new ArrayList(children); + Collections.sort(ordered, new Comparator() { + + @Override + public int compare(Tree o1, Tree o2) { + return o1.toString().compareToIgnoreCase(o2.toString()); + }}); + return ordered; + } @Override public String toString() { @@ -105,7 +120,7 @@ public class Tree { StringBuilder sb = new StringBuilder("("); boolean first = true; - for(Tree child : children) { + for(Tree child : getOrderedChildren()) { if (!first) sb.append(" " ).append(connectionType).append(" "); first = false; @@ -119,6 +134,8 @@ public class Tree { if (leaf != null) return leaf.toHTML(); + List children = getOrderedChildren(); + StringBuilder sb = new StringBuilder(); if (depth > 0 && children.size() > 1) sb.append("("); diff --git a/diylc/diylc-library/.classpath b/diylc/diylc-library/.classpath index 490517cd..2fcda798 100644 --- a/diylc/diylc-library/.classpath +++ b/diylc/diylc-library/.classpath @@ -1,6 +1,7 @@ + @@ -8,5 +9,6 @@ + diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 23ae811663f6f299c5fd8b9bf2b82d5bf38ab912..b7edbed5456fbe62c354d83247a9aa0c85d99370 100644 GIT binary patch delta 4691 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 diff --git a/diylc/diylc-library/src/org/diylc/netlist/GuitarDiagramAnalyzer.java b/diylc/diylc-library/src/org/diylc/netlist/GuitarDiagramAnalyzer.java index 58c8e350..0999dfc9 100644 --- a/diylc/diylc-library/src/org/diylc/netlist/GuitarDiagramAnalyzer.java +++ b/diylc/diylc-library/src/org/diylc/netlist/GuitarDiagramAnalyzer.java @@ -37,7 +37,7 @@ import org.diylc.components.guitar.SingleCoilPickup; import org.diylc.components.passive.PotentiometerPanel; import org.diylc.core.IDIYComponent; -public class GuitarDiagramAnalyzer extends AbstractNetlistAnalyzer implements INetlistAnalyzer { +public class GuitarDiagramAnalyzer extends NetlistAnalyzer implements INetlistAnalyzer { private static Set JACK_TYPES = new HashSet(); private static Set POT_TYPES = new HashSet(); diff --git a/diylc/diylc-library/test/org/diylc/netlist/NetlistAnalyzerTests.java b/diylc/diylc-library/test/org/diylc/netlist/NetlistAnalyzerTests.java new file mode 100644 index 00000000..55a7362a --- /dev/null +++ b/diylc/diylc-library/test/org/diylc/netlist/NetlistAnalyzerTests.java @@ -0,0 +1,126 @@ +/* + + DIY Layout Creator (DIYLC). + Copyright (c) 2009-2018 held jointly by the individual authors. + + This file is part of DIYLC. + + DIYLC is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DIYLC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DIYLC. If not, see . + +*/ +package org.diylc.netlist; + +import static org.junit.Assert.assertEquals; + +import org.diylc.components.electromechanical.OpenJack1_4; +import org.diylc.components.guitar.HumbuckerPickup; +import org.diylc.components.guitar.SingleCoilPickup; +import org.junit.Test; + +public class NetlistAnalyzerTests { + + @Test + public void testOneSinglePickup() throws TreeException { + OpenJack1_4 jack = new OpenJack1_4(); + SingleCoilPickup pickup = new SingleCoilPickup(); + pickup.setName("Pickup"); + Netlist netlist = new Netlist(); + Group tipGroup = new Group().connect(jack, 0).connect(pickup, 1); + Group sleeveGroup = new Group().connect(jack, 1).connect(pickup, 2); + netlist.getGroups().add(tipGroup); + netlist.getGroups().add(sleeveGroup); + Tree tree = new GuitarDiagramAnalyzer().constructTree(netlist); + String s = tree.toString(); + assertEquals("((Pickup.North<-))", s); + } + + @Test + public void testOneSinglePickupReverse() throws TreeException { + OpenJack1_4 jack = new OpenJack1_4(); + SingleCoilPickup pickup = new SingleCoilPickup(); + pickup.setName("Pickup"); + Netlist netlist = new Netlist(); + Group tipGroup = new Group().connect(jack, 0).connect(pickup, 2); + Group sleeveGroup = new Group().connect(jack, 1).connect(pickup, 1); + netlist.getGroups().add(tipGroup); + netlist.getGroups().add(sleeveGroup); + Tree tree = new GuitarDiagramAnalyzer().constructTree(netlist); + String s = tree.toString(); + assertEquals("((Pickup.North->))", s); + } + + @Test + public void testOneHumbuckerSeries() throws TreeException { + OpenJack1_4 jack = new OpenJack1_4(); + HumbuckerPickup pickup = new HumbuckerPickup(); + pickup.setName("Pickup"); + Netlist netlist = new Netlist(); + Group tipGroup = new Group().connect(jack, 0).connect(pickup, 0); + Group coilTapGroup = new Group().connect(pickup, 1).connect(pickup, 2); + Group sleeveGroup = new Group().connect(jack, 1).connect(pickup, 3); + netlist.getGroups().add(tipGroup); + netlist.getGroups().add(coilTapGroup); + netlist.getGroups().add(sleeveGroup); + Tree tree = new GuitarDiagramAnalyzer().constructTree(netlist); + String s = tree.toString(); + assertEquals("((Pickup.North<- + Pickup.South<-))", s); + } + + @Test + public void testOneHumbuckerSeriesReverse() throws TreeException { + OpenJack1_4 jack = new OpenJack1_4(); + HumbuckerPickup pickup = new HumbuckerPickup(); + pickup.setName("Pickup"); + Netlist netlist = new Netlist(); + Group tipGroup = new Group().connect(jack, 0).connect(pickup, 3); + Group coilTapGroup = new Group().connect(pickup, 1).connect(pickup, 2); + Group sleeveGroup = new Group().connect(jack, 1).connect(pickup, 0); + netlist.getGroups().add(tipGroup); + netlist.getGroups().add(coilTapGroup); + netlist.getGroups().add(sleeveGroup); + Tree tree = new GuitarDiagramAnalyzer().constructTree(netlist); + String s = tree.toString(); + assertEquals("((Pickup.South-> + Pickup.North->))", s); + } + + @Test + public void testOneHumbuckerParallel() throws TreeException { + OpenJack1_4 jack = new OpenJack1_4(); + HumbuckerPickup pickup = new HumbuckerPickup(); + pickup.setName("Pickup"); + Netlist netlist = new Netlist(); + Group tipGroup = new Group().connect(jack, 0).connect(pickup, 0).connect(pickup, 2); + Group sleeveGroup = new Group().connect(jack, 1).connect(pickup, 1).connect(pickup, 3); + netlist.getGroups().add(tipGroup); + netlist.getGroups().add(sleeveGroup); + Tree tree = new GuitarDiagramAnalyzer().constructTree(netlist); + String s = tree.toString(); + assertEquals("((Pickup.South<-) || (Pickup.North<-))", s); + } + + @Test + public void testOneHumbuckerParallelOutOfPhase() throws TreeException { + OpenJack1_4 jack = new OpenJack1_4(); + HumbuckerPickup pickup = new HumbuckerPickup(); + pickup.setName("Pickup"); + Netlist netlist = new Netlist(); + Group tipGroup = new Group().connect(jack, 0).connect(pickup, 0).connect(pickup, 3); + Group sleeveGroup = new Group().connect(jack, 1).connect(pickup, 1).connect(pickup, 2); + netlist.getGroups().add(tipGroup); + netlist.getGroups().add(sleeveGroup); + Tree tree = new GuitarDiagramAnalyzer().constructTree(netlist); + String s = tree.toString(); + assertEquals("((Pickup.North<-) || (Pickup.South->))", s); + } +} diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 23ae811663f6f299c5fd8b9bf2b82d5bf38ab912..b7edbed5456fbe62c354d83247a9aa0c85d99370 100644 GIT binary patch delta 4691 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 diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index cad29881b9c676e0f893cee1fa8d21626a191793..bff905e7ed705f43e9d54e28f6ef4a8c963dea0e 100644 GIT binary patch delta 5301 zcmY*cdtB8;7Qese%v>(-H}_rv1(Am!7^sK}3YvmEM1hnv+k9clqZKnvtk$(vE0A-t(*H=gyeU&%~!<1wRRZ510y~<#f*EWV} zF^%4;pOo}bhkNnbvV7Zb|M)YRx|27bRs0$^s&;9Z67~pKSG(^Y`Vn1XGyBCMaZAuC zP2&78D&yVvWWoeh;_1XafQysgcYCc92?QsN>l35fY~v{Z;a%cv+?+u9v2Gf&?@tBE zz<8+mMPSM+4K*agtny;mADX5cz>t0P;@Aa(;Q-|g-HLN{f`s}@xc8PBv@B)1Q zXcgd~Gc&<%^VxgBQr~oCyC(z}di>_kfA_H2UJhw&JKCEE5$3(`nOmJ6(7Z#NOI|uk zY__{zygFTRHTtN8R}toCZB>-hMDSSEOldVeWu3m&?=)UgZMH1#`;g)mrj#d97H&Q3 zqg<7)t@-{+1(S=5F2!3WV_l0LDfOLrSWwmNl$gvCA%7V`nQx;Cy3+@+~<3R93<9iw(*pIDY6A<&39Pt=g@81x~9hg@j1SqO-~)s+cdU zy-oSfS1yi!rAz}!%s-W`KqiNO!DAn`poNKvVjQqAzb4>ps$)JfcAjvI?qIG3A1``w4XmEVk6DC1Fx>uU<_C zhJ=^Zd*C`|r#b~}{;*q}1*+?>t3yMiaokCD2B;c7R96Q{N%&=TfS+6x{YNbU)s9R)W7^|7q;S4p>$-3e(sB)&?BixZR;8Dgi~-k&)ct3VX0u(UYt}kBC_8;Laa#q) z?f~uY!1`RUmfS~5_NQybAn_Qcore%E6>B3w5>=vg_=Cf9UDuLZgu|JJoMZ6_)oX+& z&C?v#@Cxk+7%THMOs=9z+Z-yHJyvRuf~s=0MxiZ>>b2bx`4T4*7|-n!8}6y zjhXVgH#NJJ(W3c*ap9ZV=TOM_lNvUB@G0#esBWIomOx%LZQ2fyxIfYSA+MA>+FfrM zMgq~JnWvnlMkD*^d%~An-Y^$0j272om5=^49IW=&2g*m)`m0-?<|!8>UKbCMSd=H~ z?|R9FYnWaNk_DN1n2&hUt%gGVunCEb_g_9U*|6E#9DKy9#JTQao$*~UEX>+ist+~f z>Cek`9}l^>HcKzTR`q*$VfqVho9$etY$Tj<&epxHXDjqgZfP3%yzcKK7ioXi3z%H2 z*rJPzC>GVb^ttkZw>tLe-5}|BM}HD>DQnduVf+_=p;v+AdWWt;?XOi>nU*mpE<09-Fg6#Zay}QQs9cE#xYp@U^mu7W-EP+ z+Z3v>uy98032&P%zYje2{NE{t7oVLZUc3)NjW+1V##kdB!u=q{$bqu@WEo9BxOV>T=zPa6%`p9cE$##Hf|9`%NcR-a&c zTUS3a@}chOpBec;zVf263#bPD!^ihzG-cAAV@y8{N`Ak7pSnwU zXg2UYgCJvb%@dfy*}C5sZ}PL*w)NvT>I|ohz?*N(U|v>QzWEwFHJy)`3|f43mKgzM zcT}6_A(YFtW*tQN=pwTTqU>H`ns6J75{&zAHn9=wx0r{Z4yAuJ_rODE z9yV{A^4afx-y8>Djd3T%M5e7LI z3~6sa{L1u5k@gx5eiUF{%~wo^HOWmN+)$Nv}~%n{G#(loLJ z0_(~klOdh5Y_b7Ld}|zufe3r$lT;|nq*8JfY_g`2dElaDIyr}LazJV5tHt88GGGAK zx${0Xtd^N%0i+c3G>L(V6h1@juqaG$YMg}n;A86KnLI1PU3lY9*eM^ z*iGWWqIoa51y$m26a4sk93Y>9NUnTHrh;V5xt;><|Ac%G zr?$0|B{;F4XZO7lFW#eUZ~ie8U)TlOStu2N?>-w|_&L|7btCp_9gkzB)CqGxalM4Yw~j`-P=X+S_~YF%v;2;{uNHoq562k z^DoR7pVA?OE4kvg0;+q{HF)(-wWm5;o#MyVaPix(N4vK#ZHJj%HIh2v&Th}6pF)hw z3TPk<6rVslLGt7zngXxU?n>GQi@KGx3WB}SNImkGn(DCCf0rgmlB~OQtQ4-kOY`Oai@UT~ zqA+?;;_#n@F~3LSdW>DX^B$F9aIgEcu*cHHm)u9Xo%d;u6yCT`b0v!7qb2_FCpui> zaf!m6*(LM>i@WFqiLZ4DGJ*HH=tB}G{wx|IaR1M=QesRuohorfH=Qo=YR`V$FZ40F zZ}|my*6M7M*sh(zW=eRE&6CO$g*`5@Sz#3t9V(k5agNF!mUvQSWfFU9Y_i0q8k;5Y zipJ(joT#IIug)MiX0T~eUSY6OiSHT6)7wPeIuq?KnnEv<9!OALPw?Cg!sf_x<&;5E zhbV(&doko&$k6UW4-T>8`E_>G|6s>Bb3Kq}zX$RJIgsZ`2ktL8(Cz_G#ClK6ZkU`I-lr``KR^~GcEYG^}#swC{`f% zlcMlkOBDKbMq^wHqFIsDpNwX3uibrdU)5LK6d^y+SIEVq;fg_?c`;bG^D)Rjupjng zT|bQbPCw*-G#2IW$D&UNKc9s5-zTBJ+yOX;Zw|nEdL*N~A{qO1G8yX`mx6rDQZS#( zDJUN`5cAmDgW3ZXZv!1yy$v93+27~hYn7}vvT7*}f=@|tv zhG86^4#PM`497TLAC7*4M&S9UMqod_9DzI|Gf}@I6XPIRB0upq)MN=effuu|pP3`k z?zNFv7sn{{vtSg;zv#hH*{I*1jedM`@O*6!@^$3k+z%a%^SEX-=5e!UpF0Noxor%} z%?FWZ{(~6rM-QStW-RujZY=iW>R61YcpT!PaTr&hTzm&!$VHx8xfsusJgmpzJnTop zc;w;ZQUCLJ)KAaHJ{-%(`bHOEek%)5e!T$giV88_eTB#uQG|S}ico&N2;(T7fN>n2 zfcb(rFoE5ESnj?sMo~ViG z%h@o>tl?YZ-sj#s7;x`kfPHF`B%4hp zYBDtzmD&f14MnA0SM&d8eEI*M+l!4wWiCQ6hn_+NhkPNH!vUci2X85`%t>_RkL|=> zj*UfG$)>;lw8e3*;Jk=aHYlJ~_@H)yvdJ`vYL7oBma?s(R6E&BTUWi85&?`y(^mu2;7l)tGfd7- zhxemnWd#@#PTU+=WH212T4}RjSzp2esvIX4gY%jx42;XC`2$wxZH4gT3)i`DvKQ}k z1bO?Vk9jw$T9xzz{n)i-fKS(L2i&Ob_T>7619`l)Ri7Sq1Uz*jAF%7iNnp42aziVw zFTcOb0h04N{q)s0b|%xh)@3y(+G?JJIaMuwR&NK&qgyl9oFFFCOGm9BMzEGSi$u#O z%vIkm2p5RKqZcrtT6N%q{z-mOc1tvw;x(5Mg3U0cS~z7s`rFRJ10GtR;U?rV{&3SO zIPqfihyFqv-UZz*NFWR%u3zZ=6JNlUE@j6LTeSQf!9nvjGZ%eCq+kZ8i7~=%UXt#d zDBM7rA%d43m#8CzDBdl-XSQJGQ`QIO2x$;}bFT0c1b_D};Q(YFJzwYxs(A~AubjB? zkk!HpaKBk9+yeKb?+X_lxN5~d;SL1N*9Fp=OXge_#({fnjqo!cm45n;Fcu_%KMGAA zjQ3>I#n4YwZP8^RQXkVK1b}u)v*5u;pl|jN?I7Il)?y*3Y!=ZA`q9lt{EwB}JnJDA zdhmxSX=0WL9g2DQ^PcCPCe!I~?cfe#(Qdgjznyl&MBsFoDmnnCb%yv9?ROn6k6CTZ z<)E_Rl4Q|*OGQsTr9gx&*PGuIw?XJ_GsO&V9;l&2i~xqvbz%dA4%{P-0-JyC6DNb} z(MMtrXhQH=aU!Tn&xtGf{^>rq#ZLS@>1n@<8KBzzO!RW+l9NoDCPN8VJ5+D*F;ZG0 z!H}J8%u~;Elp-+UlGeq)@0U!b+jQ-Eiw4SiX9-TLzRz9y23X%|B}KI3tcPNxbdcEf zl&(Swx6-9PAo0(T>f9jUm8ORgl}5lx3g2Vn5-O317Cv3F*L&qk$H7>bE@5%G`O;P| z&TO|_ngFW2l@f)q%qfxffh4d@x@iUGjL922m<;CL(qGI}EB;tA>#>!RD;TGKEZu-c zhMbjf;N8wkM?m%TqBI{mT393P28r!!$qnj?d?CGrtqdh{0D}`&rX-yB!iZ(#C(Np) z1{lX;g|mDY91Gm!&aj~$+T^jYvm``@i%8E7lRtOl6eoPne2FnU(ZDx1l4 zC5{ggd@MP#lm2$Dyv4?S{FcdX&io#F2tP}O}V&xTsE zs%1Y||9RiZ`5<{zCyS8zliMhr3P9{@wJGkt%Un3PqEhpT# z@xJs@YG59lgOm_R_sd8n5!&h;uapDfzP?Ilu(>@{*#b6;vXul-ogSlH1>;TAm0~Es zTA+-AOJ>djB^PY&6)R7mS=URH-(Z#(HYwY{IB%=s11ngvT}gy<`t4`RbMU%ct^5d8 z=%4MEs#%+4S2@YCGsOqFYxTGXQ-($X2l7W2rO=T}ob^TsRgeVJd zEBHh@a=EzJ%#d301AI zF-yCueo)Y!c(t?2_o2SO>MB9Y8%wIhy+(uz1@ALRGAKzsgC$%pek*;8tI4#ZgZ89Y zvG5F>w9T>1QIAemcfwUuKTc&Z;s=veUue61fqE5Exjj=YhAbz{QOhCA=J~1$r%_$2 z#)H?ujp`3z+;OXlgV?xDJqmru{7~Hw7oB=ceGYjypHc?_;h?i>HW2PQug(OC?$SJ|2N|!iN>|LFq+JV#F}EsNGK;OfouZFvq2;fGHjDfqM$9qGsy$6 zi62X*Lx{@p$;E z#EZbLgi5pe`5GmaYc+R_`>A9wGizH)iMuv+A2DnDmk>uibq(Y`5b=sa<5~4K^X1@BH`$z~_R2(4BpiA1P1V6rZhsiaN-1(eL1)J34 z#2?x<^DM~&$^CO=3`qK4X=&i0ugNdqwWF5I$Bn&_(EfgiaUUf(X?6q%e ziKjlbj`RTcUH8ZpSh@KR$sAyQ@rd|>%Ig_9370^iqZ-gU$`p`hvPKPM#o{S zk?%w{?=qTKso-M7JtK<#Umtn})u&6Bt(swcO1l$HNHTsapt>zxi%0K#ZIq?jV*J?Z zW&HMQ(H>||YhhFpRYZ8q8k|W2;u*KzSOPVr#%Xc;*Swj;Y!QY3yG6rJcp;t7I zV_-8K!*OXd9nbMW%ln|$^bP)A`5JiE%WSyux_%U!#Ni7zohu^+HjQJ2z;Zd-i)<9f zDIy!q@vO+QIJTA8NRA67HkspniB07=Oh)|ynL%<)VPm;GS7DhPzfh2;t%|(GD%#yt zQQw)Myo8|N6T+r&zii5&sH2oYv27UI&thnIy#>3Q(SL&(^^eV%XObQA9I`_mPkZE< zZIAEQ?a{7_17e8-*73lBP2lm99Wn3yjx3wM+c}}#WG6Nj?u3wsPv=psz=e5ecbyn4 zPoy)nRx5YL9!V~2BKOU8VL2SXc0qltEBgn3-{#6-K*WvB;P12CFm|mQ+9$fBey=;q zoje!}xX=UT*FA7{{X7vr@kG1Ut#CF=T44` zCj_DVR1n$)1Y`U~!PuwzVC-}M5ain*g8Seait@QF_(Lf2BzDAk?Cyx~_F>r1H^SI3 zp8t_Bj2jS+`eos0|4TT=OX`Gs_;Dxfr(Fcfb0ct0XCttm!I8+fC=%kR9G{G~1UvgK4qyOCAIFBECBTt_=)bEbNJV-p&R~V0WH{)@haedHkXCLf~eP4`I)EDL7 zwP4=_)bC0_f9FK>pP7j7b&0t5J^JB3uI-0)JZ*VT>W}l>(I4gN0Q8$N0Q0>x0QG?b zaUR73G2aIRF`x87h(`xuUhR_b9$1xxJkOFapHYLcAIApcJVJ*ck2VDLuZEz0d@|1A zWHR@~uci`J*(2019-02-03 00:00:00.000 CET + + NEW_FEATURE + "Create Netlist" feature added under File -> Analyze + + + NEW_FEATURE + "Analyze Guitar Wiring" feature added under File -> Analyze + + + NEW_FEATURE + Guitar pickups now have separate terminals for start and finish point of each coil. Single coil pickups have polarity property added + NEW_FEATURE Added center-OFF options for "Mini Toggle Switch"