aboutsummaryrefslogtreecommitdiffstats
path: root/backends/smt2
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2017-10-26 01:01:55 +0200
committerClifford Wolf <clifford@clifford.at>2017-10-26 01:01:55 +0200
commit11705082648143c8be1a8b8fd4ef60ee81451c01 (patch)
tree2451244f89abc19b7519106089ee488f0ec28fe2 /backends/smt2
parentf513494f5fabd2596b1748cf67dcaf70723b28f7 (diff)
downloadyosys-11705082648143c8be1a8b8fd4ef60ee81451c01.tar.gz
yosys-11705082648143c8be1a8b8fd4ef60ee81451c01.tar.bz2
yosys-11705082648143c8be1a8b8fd4ef60ee81451c01.zip
Improve smtio performance by using reader thread, not writer thread
Diffstat (limited to 'backends/smt2')
-rw-r--r--backends/smt2/smtio.py40
1 files changed, 30 insertions, 10 deletions
diff --git a/backends/smt2/smtio.py b/backends/smt2/smtio.py
index 6e7b68242..61ac14c82 100644
--- a/backends/smt2/smtio.py
+++ b/backends/smt2/smtio.py
@@ -20,7 +20,7 @@ import sys, subprocess, re, os
from copy import deepcopy
from select import select
from time import time
-from queue import Queue
+from queue import Queue, Empty
from threading import Thread
@@ -213,32 +213,52 @@ class SmtIo:
def p_thread_main(self):
while True:
- data = self.p_queue.get()
- if data is None: break
- self.p.stdin.write(data[0])
- if data[1]: self.p.stdin.flush()
+ data = self.p.stdout.readline().decode("ascii")
+ if data == "": break
+ self.p_queue.put(data)
+ self.p_running = False
def p_open(self):
assert self.p is None
self.p = subprocess.Popen(self.popen_vargs, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ self.p_running = True
+ self.p_next = None
self.p_queue = Queue()
self.p_thread = Thread(target=self.p_thread_main)
self.p_thread.start()
def p_write(self, data, flush):
assert self.p is not None
- self.p_queue.put((bytes(data, "ascii"), flush))
+ self.p.stdin.write(bytes(data, "ascii"))
+ if flush: self.p.stdin.flush()
def p_read(self):
assert self.p is not None
- return self.p.stdout.readline().decode("ascii")
+ assert self.p_running
+ if self.p_next is not None:
+ data = self.p_next
+ self.p_next = None
+ return data
+ return self.p_queue.get()
+
+ def p_poll(self):
+ assert self.p is not None
+ assert self.p_running
+ if self.p_next is not None:
+ return False
+ try:
+ self.p_next = self.p_queue.get(True, 0.1)
+ return False
+ except Empty:
+ return True
def p_close(self):
assert self.p is not None
- self.p_queue.put(None)
- self.p_thread.join()
self.p.stdin.close()
+ self.p_thread.join()
+ assert not self.p_running
self.p = None
+ self.p_next = None
self.p_queue = None
self.p_thread = None
@@ -485,7 +505,7 @@ class SmtIo:
count = 0
num_bs = 0
- while select([self.p.stdout], [], [], 0.1) == ([], [], []):
+ while self.p_poll():
count += 1
if count < 25: