mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Terminate running SMT solver when smtbmc is terminated
Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
		
							parent
							
								
									3ced2cca6e
								
							
						
					
					
						commit
						a44e1edaa3
					
				
					 1 changed files with 31 additions and 1 deletions
				
			
		|  | @ -16,7 +16,7 @@ | ||||||
| # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||||
| # | # | ||||||
| 
 | 
 | ||||||
| import sys, re, os | import sys, re, os, signal | ||||||
| import resource, subprocess | import resource, subprocess | ||||||
| from copy import deepcopy | from copy import deepcopy | ||||||
| from select import select | from select import select | ||||||
|  | @ -35,6 +35,25 @@ if resource.getrlimit(resource.RLIMIT_STACK)[0] < smtio_stacksize: | ||||||
|     resource.setrlimit(resource.RLIMIT_STACK, (smtio_stacksize, -1)) |     resource.setrlimit(resource.RLIMIT_STACK, (smtio_stacksize, -1)) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | # currently running solvers (so we can kill them) | ||||||
|  | running_solvers = dict() | ||||||
|  | got_term_signal = False | ||||||
|  | solvers_index = 0 | ||||||
|  | 
 | ||||||
|  | def sig_handler(signum, frame): | ||||||
|  |     global got_term_signal | ||||||
|  |     if not got_term_signal: | ||||||
|  |         print("<%s>" % signal.Signals(signum).name) | ||||||
|  |         got_term_signal = True | ||||||
|  |     for p in running_solvers.values(): | ||||||
|  |         os.killpg(os.getpgid(p.pid), signal.SIGTERM) | ||||||
|  |     sys.exit(0) | ||||||
|  | 
 | ||||||
|  | signal.signal(signal.SIGINT, sig_handler) | ||||||
|  | signal.signal(signal.SIGHUP, sig_handler) | ||||||
|  | signal.signal(signal.SIGTERM, sig_handler) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| hex_dict = { | hex_dict = { | ||||||
|     "0": "0000", "1": "0001", "2": "0010", "3": "0011", |     "0": "0000", "1": "0001", "2": "0010", "3": "0011", | ||||||
|     "4": "0100", "5": "0101", "6": "0110", "7": "0111", |     "4": "0100", "5": "0101", "6": "0110", "7": "0111", | ||||||
|  | @ -66,6 +85,8 @@ class SmtModInfo: | ||||||
| 
 | 
 | ||||||
| class SmtIo: | class SmtIo: | ||||||
|     def __init__(self, opts=None): |     def __init__(self, opts=None): | ||||||
|  |         global solvers_index | ||||||
|  | 
 | ||||||
|         self.logic = None |         self.logic = None | ||||||
|         self.logic_qf = True |         self.logic_qf = True | ||||||
|         self.logic_ax = True |         self.logic_ax = True | ||||||
|  | @ -76,6 +97,8 @@ class SmtIo: | ||||||
|         self.produce_models = True |         self.produce_models = True | ||||||
|         self.smt2cache = [list()] |         self.smt2cache = [list()] | ||||||
|         self.p = None |         self.p = None | ||||||
|  |         self.p_index = solvers_index | ||||||
|  |         solvers_index += 1 | ||||||
| 
 | 
 | ||||||
|         if opts is not None: |         if opts is not None: | ||||||
|             self.logic = opts.logic |             self.logic = opts.logic | ||||||
|  | @ -109,6 +132,11 @@ class SmtIo: | ||||||
|         self.topmod = None |         self.topmod = None | ||||||
|         self.setup_done = False |         self.setup_done = False | ||||||
| 
 | 
 | ||||||
|  |     def __del__(self): | ||||||
|  |         if self.p is not None: | ||||||
|  |             os.killpg(os.getpgid(self.p.pid), signal.SIGTERM) | ||||||
|  |             del running_solvers[self.p_index] | ||||||
|  | 
 | ||||||
|     def setup(self): |     def setup(self): | ||||||
|         assert not self.setup_done |         assert not self.setup_done | ||||||
| 
 | 
 | ||||||
|  | @ -241,6 +269,7 @@ class SmtIo: | ||||||
|     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) | ||||||
|  |         running_solvers[self.p_index] = self.p | ||||||
|         self.p_running = True |         self.p_running = True | ||||||
|         self.p_next = None |         self.p_next = None | ||||||
|         self.p_queue = Queue() |         self.p_queue = Queue() | ||||||
|  | @ -277,6 +306,7 @@ class SmtIo: | ||||||
|         self.p.stdin.close() |         self.p.stdin.close() | ||||||
|         self.p_thread.join() |         self.p_thread.join() | ||||||
|         assert not self.p_running |         assert not self.p_running | ||||||
|  |         del running_solvers[self.p_index] | ||||||
|         self.p = None |         self.p = None | ||||||
|         self.p_next = None |         self.p_next = None | ||||||
|         self.p_queue = None |         self.p_queue = None | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue