diff --git a/src/main/java/de/neemann/digital/core/extern/handler/GHDLProcess.java b/src/main/java/de/neemann/digital/core/extern/handler/GHDLProcess.java index 37b479e10..b40dd621c 100644 --- a/src/main/java/de/neemann/digital/core/extern/handler/GHDLProcess.java +++ b/src/main/java/de/neemann/digital/core/extern/handler/GHDLProcess.java @@ -9,6 +9,7 @@ import de.neemann.digital.core.extern.PortDefinition; import java.io.File; import java.io.IOException; +import java.util.LinkedList; /** * Can use GHDL as VHDL simulator. @@ -51,4 +52,14 @@ public class GHDLProcess extends VHDLProcess { return false; } } + + @Override + public String getConsoleOutNoWarn(LinkedList consoleOut) { + StringBuilder sb = new StringBuilder(); + for (String s : consoleOut) { + if (!s.contains("(assertion warning)")) + sb.append(s).append("\n"); + } + return sb.toString(); + } } diff --git a/src/main/java/de/neemann/digital/core/extern/handler/StdIOProcess.java b/src/main/java/de/neemann/digital/core/extern/handler/StdIOProcess.java index 568e173af..942fb4f6a 100644 --- a/src/main/java/de/neemann/digital/core/extern/handler/StdIOProcess.java +++ b/src/main/java/de/neemann/digital/core/extern/handler/StdIOProcess.java @@ -19,6 +19,7 @@ import java.util.LinkedList; public class StdIOProcess implements ProcessHandler { private static final String PREFIX = "Digital:"; private static final int MAX_CONSOLE_LINES = 30; + private static final long TIMEOUT = 5000; private Process process; private BufferedWriter writer; private Thread thread; @@ -26,6 +27,7 @@ public class StdIOProcess implements ProcessHandler { private final Object lock = new Object(); private String dataFound; + private boolean terminated = false; /** @@ -60,6 +62,7 @@ public class StdIOProcess implements ProcessHandler { private void setReaderWriter(BufferedReader reader, BufferedWriter writer) { this.writer = writer; consoleOut = new LinkedList<>(); + terminated = false; thread = new Thread(() -> { try { String line; @@ -79,6 +82,10 @@ public class StdIOProcess implements ProcessHandler { } catch (IOException | InterruptedException e) { e.printStackTrace(); } + synchronized (lock) { + terminated = true; + lock.notify(); + } }); thread.setDaemon(true); thread.start(); @@ -88,10 +95,13 @@ public class StdIOProcess implements ProcessHandler { synchronized (lock) { try { long startTime = System.currentTimeMillis(); - while (dataFound == null && (System.currentTimeMillis() - startTime) < 5000) + long time = 0; + while (dataFound == null && !terminated && (time - startTime) < TIMEOUT) { lock.wait(1000); + time = System.currentTimeMillis(); + } - if (dataFound == null) + if (!((time - startTime) < TIMEOUT)) throw new IOException(Lang.get("err_timeoutReadingData_O", getConsoleOut())); String line = dataFound; @@ -168,7 +178,18 @@ public class StdIOProcess implements ProcessHandler { v.set(value, highZ); } } else - throw new IOException(Lang.get("err_processTerminatedUnexpected_O", getConsoleOut())); + throw new IOException(Lang.get("err_processTerminatedUnexpected_O", getConsoleOutNoWarn(consoleOut))); + } + + /** + * Returns the console out without warnings. + * Used to remove not needed content which obfuscates the real error cause. + * + * @param consoleOut the console out + * @return the clean error message + */ + public String getConsoleOutNoWarn(LinkedList consoleOut) { + return getConsoleOut(); } private String getConsoleOut() { diff --git a/src/test/resources/dig/external/ghdl.dig b/src/test/resources/dig/external/ghdl.dig index 22d93c9b6..cfef78210 100644 --- a/src/test/resources/dig/external/ghdl.dig +++ b/src/test/resources/dig/external/ghdl.dig @@ -44,7 +44,7 @@ end add; architecture add_arch of add is signal temp : std_logic_vector(4 downto 0); begin - temp <= ('0' & a) + ('0' & b) + ('0' & c_i); + temp <= ('0' & a) + b + c_i; s <= temp(3 downto 0); c_o <= temp(4); @@ -69,7 +69,7 @@ end add_arch; - + In @@ -144,7 +144,7 @@ end loop - + @@ -165,8 +165,8 @@ end loop - - + + @@ -181,7 +181,7 @@ end loop - +