Skip to content

Commit f120838

Browse files
committed
test(analyzer): cover interface functions through connect
1 parent 404c95a commit f120838

1 file changed

Lines changed: 86 additions & 0 deletions

File tree

crates/analyzer/src/tests/comb_loop_interface_function_tests.rs

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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"]
144230
fn comb_loop_external_interface_get_to_put_detects_same_receiver_feedback() {

0 commit comments

Comments
 (0)