@@ -87,6 +87,53 @@ TEST_F(UnrollProcTest, BasicProcEquivalence) {
8787 EXPECT_THAT (TryProveEquivalence (f, converted), IsOkAndHolds (IsProvenTrue ()));
8888}
8989
90+ TEST_F (UnrollProcTest, BasicProcEquivalenceWithAsserts) {
91+ auto p = CreatePackage ();
92+ FunctionBuilder fb (absl::StrCat (TestName (), " _func" ), p.get ());
93+ ProcBuilder pb (absl::StrCat (TestName (), " _proc" ), p.get ());
94+ XLS_ASSERT_OK_AND_ASSIGN (
95+ auto foo_ch, p->CreateStreamingChannel (" foo_ch" , ChannelOps::kReceiveOnly ,
96+ p->GetBitsType (4 )));
97+ XLS_ASSERT_OK_AND_ASSIGN (
98+ auto ret_ch, p->CreateStreamingChannel (" ret_ch" , ChannelOps::kSendOnly ,
99+ p->GetBitsType (4 )));
100+ auto tok = pb.StateElement (" tok" , Value::Token ());
101+ auto state = pb.StateElement (" cnt" , UBits (1 , 4 ));
102+ auto recv = pb.Receive (foo_ch, tok);
103+ auto nxt_val = pb.Add (state, pb.TupleIndex (recv, 1 ));
104+ auto final_tok = pb.Send (ret_ch, pb.TupleIndex (recv, 0 ), nxt_val);
105+ pb.Assert (pb.Literal (Value::Token ()), pb.ULt (state, pb.Literal (UBits (4 , 4 ))),
106+ " assert_msg" , /* label=*/ " my_label" );
107+ pb.Next (state, nxt_val);
108+ pb.Next (tok, final_tok);
109+ XLS_ASSERT_OK_AND_ASSIGN (Proc * proc, pb.Build ());
110+
111+ auto read_1 = fb.Param (" foo_ch_act0_read" , p->GetBitsType (4 ));
112+ auto read_2 = fb.Param (" foo_ch_act1_read" , p->GetBitsType (4 ));
113+ auto st_1 = fb.Literal (UBits (1 , 4 ));
114+ auto ftok = fb.Literal (Value::Token ());
115+ auto limit = fb.Literal (UBits (4 , 4 ));
116+ fb.Assert (ftok, fb.ULt (st_1, limit), " assert_msg" ,
117+ /* label=*/ " my_label_act0_assert" );
118+ auto st_2 = fb.Add (st_1, read_1);
119+ fb.Assert (ftok, fb.ULt (st_2, limit), " assert_msg" ,
120+ /* label=*/ " my_label_act1_assert" );
121+ auto st_3 = fb.Add (st_2, read_2);
122+
123+ fb.Tuple ({fb.Tuple ({fb.Tuple ({fb.Literal (UBits (1 , 1 )), st_2})}),
124+ fb.Tuple ({fb.Tuple ({fb.Literal (UBits (1 , 1 )), st_3})})});
125+ XLS_ASSERT_OK_AND_ASSIGN (Function * f, fb.Build ());
126+
127+ XLS_ASSERT_OK_AND_ASSIGN (
128+ Function * converted,
129+ UnrollProcToFunction (proc, 2 , /* include_state=*/ false ));
130+
131+ RecordProperty (" func" , f->DumpIr ());
132+ RecordProperty (" proc" , proc->DumpIr ());
133+ RecordProperty (" converted" , converted->DumpIr ());
134+ EXPECT_THAT (TryProveEquivalence (f, converted), IsOkAndHolds (IsProvenTrue ()));
135+ }
136+
90137TEST_F (UnrollProcTest, StateOnlyProcs) {
91138 auto p = CreatePackage ();
92139 XLS_ASSERT_OK_AND_ASSIGN (
0 commit comments