3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-06-06 06:03:23 +00:00

Improve smtio performance by using reader thread, not writer thread

This commit is contained in:
Clifford Wolf 2017-10-26 01:01:55 +02:00
parent f513494f5f
commit 1170508264

View file

@ -20,7 +20,7 @@ import sys, subprocess, re, os
from copy import deepcopy from copy import deepcopy
from select import select from select import select
from time import time from time import time
from queue import Queue from queue import Queue, Empty
from threading import Thread from threading import Thread
@ -213,32 +213,52 @@ class SmtIo:
def p_thread_main(self): def p_thread_main(self):
while True: while True:
data = self.p_queue.get() data = self.p.stdout.readline().decode("ascii")
if data is None: break if data == "": break
self.p.stdin.write(data[0]) self.p_queue.put(data)
if data[1]: self.p.stdin.flush() self.p_running = False
def p_open(self): def p_open(self):
assert self.p is None assert self.p is None
self.p = subprocess.Popen(self.popen_vargs, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 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_queue = Queue()
self.p_thread = Thread(target=self.p_thread_main) self.p_thread = Thread(target=self.p_thread_main)
self.p_thread.start() self.p_thread.start()
def p_write(self, data, flush): def p_write(self, data, flush):
assert self.p is not None 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): def p_read(self):
assert self.p is not None 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): def p_close(self):
assert self.p is not None assert self.p is not None
self.p_queue.put(None)
self.p_thread.join()
self.p.stdin.close() self.p.stdin.close()
self.p_thread.join()
assert not self.p_running
self.p = None self.p = None
self.p_next = None
self.p_queue = None self.p_queue = None
self.p_thread = None self.p_thread = None
@ -485,7 +505,7 @@ class SmtIo:
count = 0 count = 0
num_bs = 0 num_bs = 0
while select([self.p.stdout], [], [], 0.1) == ([], [], []): while self.p_poll():
count += 1 count += 1
if count < 25: if count < 25: