netlist parse improvements

This commit is contained in:
bancika
2021-01-03 09:19:58 +01:00
parent 1737df8047
commit 458b853830
6 changed files with 79 additions and 25 deletions
@@ -40,7 +40,7 @@ public class Voltage extends AbstractMeasure<VoltageUnit> {
return new Voltage(value, unit);
}
public static Voltage parseCapacitance(String value) {
public static Voltage parseVoltage(String value) {
value = value.replace("*", "");
for (VoltageUnit unit : VoltageUnit.values()) {
if (value.toLowerCase().endsWith(unit.toString().toLowerCase())) {
@@ -42,9 +42,10 @@ public abstract class AbstractNetlistParser implements INetlistParser {
private static Size X_OFFSET = new Size(1.5d, SizeUnit.in);
private static Size Y_OFFSET = new Size(0.3d, SizeUnit.in);
private static int ROW_COUNT = 15;
private static int ROW_COUNT = 12;
public List<ParsedNetlistEntry> parseFile(String fileName, List<String> outputWarnings) throws NetlistParseException {
public List<ParsedNetlistEntry> parseFile(String fileName, List<String> outputWarnings)
throws NetlistParseException {
String content;
try {
content = new String(Files.readAllBytes(Paths.get(fileName)));
@@ -55,7 +56,8 @@ public abstract class AbstractNetlistParser implements INetlistParser {
return parse(content, outputWarnings);
}
public List<ParsedNetlistEntry> parse(String content, List<String> outputWarnings) throws NetlistParseException {
public List<ParsedNetlistEntry> parse(String content, List<String> outputWarnings)
throws NetlistParseException {
List<ParsedNetlistEntry> result = new ArrayList<ParsedNetlistEntry>();
Pattern pattern = Pattern.compile(getItemRegex(), Pattern.MULTILINE | Pattern.DOTALL);
@@ -75,9 +77,15 @@ public abstract class AbstractNetlistParser implements INetlistParser {
}
Map<String, Object> valueMap = new HashMap<String, Object>();
List<Class<?>> typeCandidates = getComponentTypeCandidates(type, valueMap);
if (typeCandidates == null) {
outputWarnings.add("Type mappings not found for " + type + ".");
List<Class<?>> typeCandidates;
try {
typeCandidates = getComponentTypeCandidates(type, valueMap);
if (typeCandidates == null) {
outputWarnings.add("Type mappings not found for " + type + ".");
continue;
}
} catch (Exception e) {
outputWarnings.add("Error parsing type mappings for " + type + ".");
continue;
}
@@ -94,16 +102,17 @@ public abstract class AbstractNetlistParser implements INetlistParser {
result.add(new ParsedNetlistEntry(typeCandidates, type, valueMap));
}
Collections.sort(result, new Comparator<ParsedNetlistEntry>() {
@Override
public int compare(ParsedNetlistEntry o1, ParsedNetlistEntry o2) {
int comp = o1.getRawType().compareToIgnoreCase(o2.getRawType());
if (comp == 0 && o1.getValues().containsKey("Name") && o2.getValues().containsKey("Name"))
comp = o1.getValues().get("Name").toString().compareToIgnoreCase(o2.getValues().get("Name").toString());
comp = o1.getValues().get("Name").toString()
.compareToIgnoreCase(o2.getValues().get("Name").toString());
return comp;
}
}
});
return result;
@@ -113,6 +122,7 @@ public abstract class AbstractNetlistParser implements INetlistParser {
List<String> outputWarnings) {
double dx = 0;
double dy = 0;
int rowIdx = 0;
List<IDIYComponent<?>> result = new ArrayList<IDIYComponent<?>>();
for (int i = 0; i < components.size(); i++) {
ParsedNetlistComponent parsedComponent = components.get(i);
@@ -133,18 +143,21 @@ public abstract class AbstractNetlistParser implements INetlistParser {
Point2D controlPoint = new Point2D.Double(p.getX() + dx, p.getY() + dy);
component.setControlPoint(controlPoint, j);
}
if (i > 0 && i % ROW_COUNT == 0) {
if (rowIdx + 1 == ROW_COUNT) {
dx += X_OFFSET.convertToPixels();
dy = 0;
rowIdx = 0;
} else {
dy += Y_OFFSET.convertToPixels();
rowIdx++;
}
Method[] methods = clazz.getMethods();
for (Map.Entry<String, Object> value : parsedComponent.getValues().entrySet()) {
try {
Optional<Method> first = Arrays.stream(methods).filter(x -> x.getName().equals("set" + value.getKey())).findFirst();
Optional<Method> first = Arrays.stream(methods)
.filter(x -> x.getName().equals("set" + value.getKey())).findFirst();
if (first.isPresent()) {
Method setter = first.get();
setter.invoke(component, value.getValue());
@@ -5,6 +5,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.diylc.components.passive.AxialElectrolyticCapacitor;
import org.diylc.components.passive.AxialFilmCapacitor;
import org.diylc.components.passive.CapacitorSymbol;
@@ -14,20 +15,28 @@ 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.BJTSymbol;
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.JFETSymbol;
import org.diylc.components.semiconductors.LED;
import org.diylc.components.semiconductors.LEDSymbol;
import org.diylc.components.semiconductors.MOSFETSymbol;
import org.diylc.components.semiconductors.PhotoDiodeSymbol;
import org.diylc.components.semiconductors.SchottkyDiodeSymbol;
import org.diylc.components.semiconductors.TransistorTO220;
import org.diylc.components.semiconductors.TransistorTO92;
import org.diylc.components.semiconductors.ZenerDiodeSymbol;
import org.diylc.core.measures.Capacitance;
import org.diylc.core.measures.Resistance;
import org.diylc.core.measures.Voltage;
public class TangoNetlistParser extends AbstractNetlistParser {
private static final Logger LOG = Logger.getLogger(TangoNetlistParser.class);
@Override
public String getName() {
return "Tango";
@@ -65,23 +74,36 @@ public class TangoNetlistParser extends AbstractNetlistParser {
}
if (type.toUpperCase().startsWith("CAP_ELECTRO")) {
additionalOutputs.put("Polarized", true);
boolean polarized = true;
if (type.toUpperCase().endsWith("_NP")) {
polarized = false;
type = type.substring(0, type.length() - 3);
}
if (type.length() > "CAP_ELECTRO".length()) {
String voltage = type.substring("CAP_ELECTRO".length() + 1) + "V";
try {
additionalOutputs.put("VoltageNew", Voltage.parseVoltage(voltage));
} catch (Exception e) {
LOG.error("Error while parsing voltage " + voltage);
}
}
additionalOutputs.put("Polarized", polarized);
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));
int pinCount = Integer.parseInt(type.substring(3));
additionalOutputs.put("PinCount", DIL_IC.PinCount.valueOf("_" + pinCount));
} catch (Exception e) {
} catch (Exception e) {
}
types.add(DIL_IC.class);
types.add(DIL_IC.class);
}
if (type.equalsIgnoreCase("DIODE")) {
types.add(DiodeGlass.class);
types.add(DiodePlastic.class);
@@ -90,12 +112,26 @@ public class TangoNetlistParser extends AbstractNetlistParser {
types.add(DiodeSymbol.class);
types.add(ZenerDiodeSymbol.class);
}
if (type.equalsIgnoreCase("LED")) {
types.add(LED.class);
types.add(LEDSymbol.class);
}
if (type.equalsIgnoreCase("TO92")) {
types.add(TransistorTO92.class);
types.add(BJTSymbol.class);
types.add(MOSFETSymbol.class);
types.add(JFETSymbol.class);
}
if (type.equalsIgnoreCase("TO220")) {
types.add(TransistorTO220.class);
types.add(BJTSymbol.class);
types.add(MOSFETSymbol.class);
types.add(JFETSymbol.class);
}
return types;
}
+1 -1
View File
@@ -10,7 +10,7 @@
<property name="jar.dir" value="${build.dir}/jar" />
<property name="report.dir" value="${build.dir}/junitreport" />
<property name="main.class" value="org.diylc.DIYLCStarter" />
<property name="diylc.version" value="4.14.0" />
<property name="diylc.version" value="4.15.0" />
<property name="osx.jre8.path" value="jre\osx\jdk8u275-b01-jre\Contents\Home\" />
Binary file not shown.
@@ -524,7 +524,8 @@ public class ActionFactory {
@Override
public String getDescription() {
return LangUtil.translate("Netlist files");
List<String> ext = extensions.stream().map(ex -> "*." + ex).collect(Collectors.toList());
return LangUtil.translate("Netlist files") + " (" + String.join(",", ext) + ")";
}
};
}
@@ -546,6 +547,8 @@ public class ActionFactory {
LOG.debug("Importing netlist from " + file.getAbsolutePath());
List<String> outputWarnings = new ArrayList<String>();
List<ParsedNetlistEntry> entries = parser.parseFile(file.getAbsolutePath(), outputWarnings);
if (!outputWarnings.isEmpty())
LOG.warn("Parsing produced warnings:\n" + String.join("\n", outputWarnings));
return entries;
}
@@ -560,6 +563,8 @@ public class ActionFactory {
List<ParsedNetlistComponent> parsedComponents = entries.stream().map(entry ->
new ParsedNetlistComponent(results.get(entry.getRawType()), entry.getValues())).collect(Collectors.toList());
List<IDIYComponent<?>> components = parser.generateComponents(parsedComponents, outputWarnings);
if (!outputWarnings.isEmpty())
LOG.warn("Component creation produced warnings:\n" + String.join("\n", outputWarnings));
plugInPort.pasteComponents(components, false, false);
}
} catch (Exception e) {