sim: fix ValueCastable not being recognized as a coroutine command
This commit is contained in:
		
							parent
							
								
									4014aef033
								
							
						
					
					
						commit
						ded84fe9d6
					
				|  | @ -1,7 +1,7 @@ | ||||||
| import inspect | import inspect | ||||||
| 
 | 
 | ||||||
| from ..hdl import * | from ..hdl import * | ||||||
| from ..hdl.ast import Statement, SignalSet | from ..hdl.ast import Statement, SignalSet, ValueCastable | ||||||
| from .core import Tick, Settle, Delay, Passive, Active | from .core import Tick, Settle, Delay, Passive, Active | ||||||
| from ._base import BaseProcess | from ._base import BaseProcess | ||||||
| from ._pyrtl import _ValueCompiler, _RHSValueCompiler, _StatementCompiler | from ._pyrtl import _ValueCompiler, _RHSValueCompiler, _StatementCompiler | ||||||
|  | @ -66,6 +66,8 @@ class PyCoroProcess(BaseProcess): | ||||||
|                     command = self.default_cmd |                     command = self.default_cmd | ||||||
|                 response = None |                 response = None | ||||||
| 
 | 
 | ||||||
|  |                 if isinstance(command, ValueCastable): | ||||||
|  |                     command = Value.cast(command) | ||||||
|                 if isinstance(command, Value): |                 if isinstance(command, Value): | ||||||
|                     exec(_RHSValueCompiler.compile(self.state, command, mode="curr"), |                     exec(_RHSValueCompiler.compile(self.state, command, mode="curr"), | ||||||
|                         self.exec_locals) |                         self.exec_locals) | ||||||
|  |  | ||||||
|  | @ -690,6 +690,27 @@ class SimulatorIntegrationTestCase(FHDLTestCase): | ||||||
|             sim.add_process(process) |             sim.add_process(process) | ||||||
|         self.assertTrue(survived) |         self.assertTrue(survived) | ||||||
| 
 | 
 | ||||||
|  |     def test_value_castable(self): | ||||||
|  |         class MyValue(ValueCastable): | ||||||
|  |             @ValueCastable.lowermethod | ||||||
|  |             def as_value(self): | ||||||
|  |                 return Signal() | ||||||
|  |              | ||||||
|  |             def shape(): | ||||||
|  |                 return unsigned(1) | ||||||
|  |          | ||||||
|  |         a = Array([1,2,3]) | ||||||
|  |         a[MyValue()] | ||||||
|  | 
 | ||||||
|  |         survived = False | ||||||
|  |         with self.assertSimulation(Module()) as sim: | ||||||
|  |             def process(): | ||||||
|  |                 nonlocal survived | ||||||
|  |                 yield MyValue() | ||||||
|  |                 survived = True | ||||||
|  |             sim.add_process(process) | ||||||
|  |         self.assertTrue(survived) | ||||||
|  | 
 | ||||||
|     def setUp_memory(self, rd_synchronous=True, rd_transparent=True, wr_granularity=None): |     def setUp_memory(self, rd_synchronous=True, rd_transparent=True, wr_granularity=None): | ||||||
|         self.m = Module() |         self.m = Module() | ||||||
|         self.memory = Memory(width=8, depth=4, init=[0xaa, 0x55]) |         self.memory = Memory(width=8, depth=4, init=[0xaa, 0x55]) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Jaro Habiger
						Jaro Habiger