mirror of
https://github.com/YosysHQ/yosys
synced 2025-06-06 22:23:23 +00:00
Improve smtio performance by using reader thread, not writer thread
This commit is contained in:
parent
f513494f5f
commit
1170508264
1 changed files with 30 additions and 10 deletions
|
@ -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:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue