summaryrefslogtreecommitdiff
path: root/Source/Provers/SMTLib/SMTLibProcess.cs
diff options
context:
space:
mode:
authorGravatar MichalMoskal <unknown>2011-02-17 18:59:50 +0000
committerGravatar MichalMoskal <unknown>2011-02-17 18:59:50 +0000
commit6873de1e22575d6d227b26ead84621d0fe4cab04 (patch)
tree263c8c66b98fe3cc72c96e70e6988cb1be88e5d7 /Source/Provers/SMTLib/SMTLibProcess.cs
parentd1467b27944cc71bdf1c2b6350ab7d60933fedb3 (diff)
Make it possible to run Z3 on pipe; use generic PROVER_LOG options
Diffstat (limited to 'Source/Provers/SMTLib/SMTLibProcess.cs')
-rw-r--r--Source/Provers/SMTLib/SMTLibProcess.cs28
1 files changed, 24 insertions, 4 deletions
diff --git a/Source/Provers/SMTLib/SMTLibProcess.cs b/Source/Provers/SMTLib/SMTLibProcess.cs
index da058ab6..4a631960 100644
--- a/Source/Provers/SMTLib/SMTLibProcess.cs
+++ b/Source/Provers/SMTLib/SMTLibProcess.cs
@@ -18,6 +18,7 @@ namespace Microsoft.Boogie.SMTLib
public class SMTLibProcess
{
readonly Process prover;
+ readonly SMTLibProverOptions options;
readonly Queue<string> proverOutput = new Queue<string>();
readonly Queue<string> proverErrors = new Queue<string>();
readonly TextWriter toProver;
@@ -34,12 +35,14 @@ namespace Microsoft.Boogie.SMTLib
};
}
- public SMTLibProcess(ProcessStartInfo psi)
+ public SMTLibProcess(ProcessStartInfo psi, SMTLibProverOptions options)
{
+ this.options = options;
+
try {
- prover.ErrorDataReceived += prover_ErrorDataReceived;
- prover.OutputDataReceived += prover_OutputDataReceived;
prover = Process.Start(psi);
+ prover.ErrorDataReceived += prover_ErrorDataReceived;
+ prover.OutputDataReceived += prover_OutputDataReceived;
prover.BeginErrorReadLine();
prover.BeginOutputReadLine();
toProver = prover.StandardInput;
@@ -50,6 +53,13 @@ namespace Microsoft.Boogie.SMTLib
public void Send(string cmd)
{
+ if (options.Verbosity >= 2) {
+ var log = cmd;
+ if (log.Length > 50)
+ log = log.Substring(0, 50) + "...";
+ log = log.Replace("\r", "").Replace("\n", " ");
+ Console.WriteLine("[SMT-INP] {0}", log);
+ }
toProver.WriteLine(cmd);
}
@@ -78,6 +88,8 @@ namespace Microsoft.Boogie.SMTLib
public SExpr GetProverResponse()
{
+ toProver.Flush();
+
while (true) {
var exprs = ParseSExprs(true).ToArray();
Contract.Assert(exprs.Length <= 1);
@@ -114,8 +126,10 @@ namespace Microsoft.Boogie.SMTLib
if (linePos < currLine.Length)
return currLine[linePos];
- else
+ else {
currLine = null;
+ linePos = 0;
+ }
}
}
@@ -138,6 +152,7 @@ namespace Microsoft.Boogie.SMTLib
if (quoted) {
sb.Append("\n");
currLine = ReadProver();
+ linePos = 0;
if (currLine == null)
break;
} else break;
@@ -176,6 +191,7 @@ namespace Microsoft.Boogie.SMTLib
if (c == ')') {
if (top)
ParseError("stray ')'");
+ break;
}
string id;
@@ -245,6 +261,8 @@ namespace Microsoft.Boogie.SMTLib
void prover_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
lock (this) {
+ if (options.Verbosity >= 1)
+ Console.WriteLine("[SMT-OUT] {0}", e.Data);
proverOutput.Enqueue(e.Data);
Monitor.Pulse(this);
}
@@ -253,6 +271,8 @@ namespace Microsoft.Boogie.SMTLib
void prover_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
lock (this) {
+ if (options.Verbosity >= 1)
+ Console.WriteLine("[SMT-ERR] {0}", e.Data);
proverErrors.Enqueue(e.Data);
Monitor.Pulse(this);
}