@@ -139,6 +139,92 @@ const EXTERNAL_INTERFACE_API: &str = r#"
139139 }
140140"# ;
141141
142+ fn connected_interface_function_code ( top_declarations : & str ) -> String {
143+ format ! (
144+ r#"
145+ interface Bus {{
146+ var forward : logic;
147+ var backward: logic;
148+ function get_forward () -> logic {{
149+ return forward;
150+ }}
151+ function put_backward (value: input logic) {{
152+ backward = value;
153+ }}
154+ modport source {{
155+ forward : output,
156+ backward : input,
157+ get_forward : import,
158+ put_backward: import,
159+ }}
160+ modport sink {{
161+ get_forward : import,
162+ put_backward: import,
163+ ..converse(source)
164+ }}
165+ }}
166+ module Top {{
167+ inst source: Bus;
168+ inst sink : Bus;
169+ connect source.source <> sink.sink;
170+ {top_declarations}
171+ }}
172+ "#
173+ )
174+ }
175+
176+ #[ test]
177+ #[ ignore = "comb-loop migration: false negative; connected sink getter feeds its source" ]
178+ fn comb_loop_connect_detects_interface_function_member_read_feedback ( ) {
179+ assert_interface_function_comb_loop (
180+ & connected_interface_function_code (
181+ r#"assign sink.forward = source.get_forward();
182+ assign source.backward = 0;"# ,
183+ ) ,
184+ true ,
185+ ) ;
186+ }
187+
188+ #[ test]
189+ fn comb_loop_connect_keeps_interface_function_member_read_one_way ( ) {
190+ assert_interface_function_comb_loop (
191+ & connected_interface_function_code (
192+ r#"var observed: logic;
193+ assign sink.forward = source.backward;
194+ assign source.backward = 0;
195+ assign observed = source.get_forward();"# ,
196+ ) ,
197+ false ,
198+ ) ;
199+ }
200+
201+ #[ test]
202+ #[ ignore = "comb-loop migration: false negative; connected sink setter feeds its source" ]
203+ fn comb_loop_connect_detects_interface_function_member_write_feedback ( ) {
204+ assert_interface_function_comb_loop (
205+ & connected_interface_function_code (
206+ r#"always_comb {
207+ source.put_backward(sink.forward);
208+ }
209+ assign sink.forward = sink.backward;"# ,
210+ ) ,
211+ true ,
212+ ) ;
213+ }
214+
215+ #[ test]
216+ fn comb_loop_connect_keeps_interface_function_member_write_one_way ( ) {
217+ assert_interface_function_comb_loop (
218+ & connected_interface_function_code (
219+ r#"always_comb {
220+ source.put_backward(sink.forward);
221+ }
222+ assign sink.forward = 0;"# ,
223+ ) ,
224+ false ,
225+ ) ;
226+ }
227+
142228#[ test]
143229#[ ignore = "comb-loop migration: false negative; same receiver interface get-to-put feedback" ]
144230fn comb_loop_external_interface_get_to_put_detects_same_receiver_feedback ( ) {
0 commit comments