# 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)
# 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_ins - self_driven
# Refine the output port approximation: if a subfragment is driving a signal,
# and we're asked to provide it, we can provide it now.
outs |= ports & sub_outs
self.assertEqual(f1.ports, ValueSet())
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):
f1 = Fragment()
f1.add_statements(