Added 'File' -> 'Import Netlist' option that can import components from

a Tango PCB file
This commit is contained in:
bancika
2021-01-03 00:03:44 +01:00
parent 4144956a09
commit 75758e0250
19 changed files with 1039 additions and 3 deletions
@@ -28,7 +28,7 @@ package org.diylc.netlist;
*/
public interface ISpiceMapper {
int mapToSpiceNode(int pontIndex);
int mapToSpiceNode(int pointIndex);
String getComment();
@@ -0,0 +1,116 @@
package org.diylc.netlist;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.diylc.components.passive.AxialElectrolyticCapacitor;
import org.diylc.components.passive.AxialFilmCapacitor;
import org.diylc.components.passive.CapacitorSymbol;
import org.diylc.components.passive.MultiSectionCapacitor;
import org.diylc.components.passive.RadialCeramicDiskCapacitor;
import org.diylc.components.passive.RadialElectrolytic;
import org.diylc.components.passive.RadialFilmCapacitor;
import org.diylc.components.passive.Resistor;
import org.diylc.components.passive.ResistorSymbol;
import org.diylc.components.semiconductors.DIL_IC;
import org.diylc.components.semiconductors.DiodeGlass;
import org.diylc.components.semiconductors.DiodePlastic;
import org.diylc.components.semiconductors.DiodeSymbol;
import org.diylc.components.semiconductors.LED;
import org.diylc.components.semiconductors.LEDSymbol;
import org.diylc.components.semiconductors.PhotoDiodeSymbol;
import org.diylc.components.semiconductors.SchottkyDiodeSymbol;
import org.diylc.components.semiconductors.ZenerDiodeSymbol;
import org.diylc.core.measures.Capacitance;
import org.diylc.core.measures.Resistance;
public class TangoNetlistParser extends AbstractNetlistParser {
@Override
public String getName() {
return "Tango";
}
@Override
public String getFileExt() {
return "pcb";
}
@Override
public String getItemRegex() {
return "\\[\\s*(?<Name>.+?)\\n(?<Type>.+?)\\n(?<Value>.+?)\\s*\\]";
}
@Override
public List<Class<?>> getComponentTypeCandidates(String type,
Map<String, Object> additionalOutputs) {
List<Class<?>> types = new ArrayList<Class<?>>();
if ("RESISTOR".equalsIgnoreCase(type)) {
types.add(Resistor.class);
types.add(ResistorSymbol.class);
}
if (type.toUpperCase().startsWith("CAP_CERAMIC")) {
types.add(RadialCeramicDiskCapacitor.class);
types.add(CapacitorSymbol.class);
}
if (type.toUpperCase().startsWith("CAP_FILM")) {
types.add(AxialFilmCapacitor.class);
types.add(RadialFilmCapacitor.class);
types.add(CapacitorSymbol.class);
}
if (type.toUpperCase().startsWith("CAP_ELECTRO")) {
additionalOutputs.put("Polarized", true);
types.add(AxialElectrolyticCapacitor.class);
types.add(RadialElectrolytic.class);
types.add(MultiSectionCapacitor.class);
types.add(CapacitorSymbol.class);
}
if (type.toUpperCase().startsWith("DIP")) {
try {
int pinCount = Integer.parseInt(type.substring(3));
additionalOutputs.put("PinCount", DIL_IC.PinCount.valueOf("_" + pinCount));
} catch (Exception e) {
}
types.add(DIL_IC.class);
}
if (type.equalsIgnoreCase("DIODE")) {
types.add(DiodeGlass.class);
types.add(DiodePlastic.class);
types.add(SchottkyDiodeSymbol.class);
types.add(PhotoDiodeSymbol.class);
types.add(DiodeSymbol.class);
types.add(ZenerDiodeSymbol.class);
}
if (type.equalsIgnoreCase("LED")) {
types.add(LED.class);
types.add(LEDSymbol.class);
}
return types;
}
@Override
public List<String> getPropertyNames() {
return Arrays.asList("Name", "Value");
}
@Override
public Object parseValue(String type, String propertyName, String valueStr) {
if ("RESISTOR".equalsIgnoreCase(type) && "Value".equals(propertyName))
return Resistance.parseResistance(valueStr);
if ((type.toUpperCase().startsWith("CAP_CERAMIC") || type.toUpperCase().startsWith("CAP_FILM")
|| type.toUpperCase().startsWith("CAP_ELECTRO")) && "Value".equals(propertyName))
return Capacitance.parseCapacitance(valueStr + "F");
return valueStr;
}
}
@@ -0,0 +1,90 @@
package org.diylc.netlist;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
public class TangoParserTests {
@Test
public void testParse1() {
String content = "[\r\n" +
"R9\r\n" +
"RESISTOR\r\n" +
"100k\r\n" +
"\r\n" +
"]\r\n" +
"[\r\n" +
"D4\r\n" +
"LED\r\n" +
"LED\r\n" +
"\r\n" +
"]\r\n" +
"[\r\n" +
"C3\r\n" +
"CAP_FILM\r\n" +
"82n\r\n" +
"\r\n" +
"]\r\n" +
"[\r\n" +
"C2\r\n" +
"CAP_ELECTRO_200\r\n" +
"1u\r\n" +
"\r\n" +
"]\r\n" +
"[\r\n" +
"C1\r\n" +
"CAP_CERAMIC1\r\n" +
"820p\r\n" +
"\r\n" +
"]\r\n" +
"[\r\n" +
"U2\r\n" +
"DIP14\r\n" +
"TL074\r\n" +
"\r\n" +
"]\r\n" +
"[\r\n" +
"D1\r\n" +
"DIODE\r\n" +
"Zener 12V\r\n" +
"\r\n" +
"]\r\n" +
"[\r\n" +
"B1\r\n" +
"PADS2\r\n" +
"9V\r\n" +
"\r\n" +
"]\r\n" +
"(\r\n" +
"unnamed_net15\r\n" +
"U4-11\r\n" +
")\r\n" +
"(\r\n" +
"unnamed_net14\r\n" +
"U3-3\r\n" +
"U1-3\r\n" +
"R7-1\r\n" +
"R8-2\r\n" +
"U2-3\r\n" +
")\r\n" +
"(\r\n" +
"unnamed_net13\r\n" +
"R1-2\r\n" +
"B1-1\r\n" +
")";
List<String> outputWarnings = new ArrayList<String>();
try {
TangoNetlistParser parser = new TangoNetlistParser();
List<ParsedNetlistEntry> parsed = parser.parse(content, outputWarnings);
Assert.assertNotNull(parsed);
} catch (NetlistParseException e) {
fail("Unexpected error:" + e.getMessage());
}
}
}