fhdl.ir: a subfragment's input that we don't drive is also our input.
This commit is contained in:
		
							parent
							
								
									bb04c9e0da
								
							
						
					
					
						commit
						9661e897e6
					
				|  | @ -152,8 +152,10 @@ class Fragment: | ||||||
|             # to provide. If the subfragment is not driving it, it will silently ignore it. |             # to provide. If the subfragment is not driving it, it will silently ignore it. | ||||||
|             sub_ins, sub_outs = subfrag._propagate_ports(ports=self_used | ports) |             sub_ins, sub_outs = subfrag._propagate_ports(ports=self_used | ports) | ||||||
|             # Refine the input port approximation: if a subfragment is driving a signal, |             # Refine the input port approximation: if a subfragment is driving a signal, | ||||||
|             # it is definitely not our input. |             # it is definitely not our input. But, if a subfragment requires a signal as an input, | ||||||
|  |             # and we aren't driving it, it has to be our input as well. | ||||||
|             ins  -= sub_outs |             ins  -= sub_outs | ||||||
|  |             ins  |= sub_ins - self_driven | ||||||
|             # Refine the output port approximation: if a subfragment is driving a signal, |             # Refine the output port approximation: if a subfragment is driving a signal, | ||||||
|             # and we're asked to provide it, we can provide it now. |             # and we're asked to provide it, we can provide it now. | ||||||
|             outs |= ports & sub_outs |             outs |= ports & sub_outs | ||||||
|  |  | ||||||
|  | @ -71,6 +71,19 @@ class FragmentPortsTestCase(FHDLTestCase): | ||||||
|         self.assertEqual(f1.ports, ValueSet()) |         self.assertEqual(f1.ports, ValueSet()) | ||||||
|         self.assertEqual(f2.ports, ValueSet((self.s1,))) |         self.assertEqual(f2.ports, ValueSet((self.s1,))) | ||||||
| 
 | 
 | ||||||
|  |     def test_input_only_in_subfragment(self): | ||||||
|  |         f1 = Fragment() | ||||||
|  |         f2 = Fragment() | ||||||
|  |         f2.add_statements( | ||||||
|  |             self.c1.eq(self.s1) | ||||||
|  |         ) | ||||||
|  |         f1.add_subfragment(f2) | ||||||
|  |         ins, outs = f1._propagate_ports(ports=()) | ||||||
|  |         self.assertEqual(ins, ValueSet((self.s1,))) | ||||||
|  |         self.assertEqual(outs, ValueSet()) | ||||||
|  |         self.assertEqual(f1.ports, ValueSet((self.s1,))) | ||||||
|  |         self.assertEqual(f2.ports, ValueSet((self.s1,))) | ||||||
|  | 
 | ||||||
|     def test_output_from_subfragment(self): |     def test_output_from_subfragment(self): | ||||||
|         f1 = Fragment() |         f1 = Fragment() | ||||||
|         f1.add_statements( |         f1.add_statements( | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 whitequark
						whitequark