4444#include " xls/ir/channel.h"
4545#include " xls/ir/function_builder.h"
4646#include " xls/ir/ir_parser.h"
47+ #include " xls/ir/ir_test_base.h"
4748#include " xls/ir/package.h"
4849#include " xls/ir/proc_elaboration.h"
4950#include " xls/ir/value.h"
5051#include " xls/ir/verifier.h"
5152#include " xls/passes/optimization_pass.h"
5253#include " xls/passes/pass_base.h"
54+ #include " xls/solvers/z3_ir_equivalence_testutils.h"
5355
5456namespace xls {
5557namespace {
@@ -98,8 +100,7 @@ struct TestParam {
98100 };
99101};
100102
101- class ChannelLegalizationPassTest
102- : public TestWithParam<std::tuple<TestParam, ChannelStrictness>> {
103+ class ChannelLegalizationPassIrTest : public IrTestBase {
103104 protected:
104105 absl::StatusOr<bool > Run (Package* package) {
105106 PassResults results;
@@ -111,6 +112,11 @@ class ChannelLegalizationPassTest
111112 }
112113};
113114
115+ class ChannelLegalizationPassTest
116+ : public testing::WithParamInterface<
117+ std::tuple<TestParam, ChannelStrictness>>,
118+ public ChannelLegalizationPassIrTest {};
119+
114120TestParam kTestParameters [] = {
115121 TestParam{
116122 .test_name = " SingleProcBackToBackDataSwitchingOps" ,
@@ -995,6 +1001,29 @@ TEST_P(ChannelLegalizationPassTest, EvaluatesCorrectly) {
9951001 .evaluate (interpreter.get (), std::get<1 >(GetParam ())));
9961002}
9971003
1004+ TEST_F (ChannelLegalizationPassIrTest, LegalizeWithTokenSel) {
1005+ auto p = CreatePackage ();
1006+ ProcBuilder pb (NewStyleProc{}, TestName (), p.get ());
1007+ XLS_ASSERT_OK_AND_ASSIGN (
1008+ auto chan_out,
1009+ pb.AddOutputChannel (" out" , p->GetBitsType (32 ), ChannelKind::kStreaming ,
1010+ ChannelStrictness::kRuntimeMutuallyExclusive ));
1011+ auto st = pb.StateElement (" state" , UBits (0 , 1 ));
1012+ auto tok = pb.StateElement (" tok" , Value::Token ());
1013+ auto not_st = pb.Not (st);
1014+ auto tok_new_a1 = pb.SendIf (chan_out, tok, st, pb.Literal (UBits (32 , 32 )));
1015+ auto tok_new_b1 = pb.SendIf (chan_out, tok, not_st, pb.Literal (UBits (12 , 32 )));
1016+ pb.Next (st, not_st);
1017+ // NB This can come about from fairly normal dslx see:
1018+ // https://github.com/google/xls/issues/3738
1019+ pb.Next (tok, pb.Select (st, tok_new_a1, tok_new_b1));
1020+ XLS_ASSERT_OK_AND_ASSIGN (auto f, pb.Build ());
1021+ XLS_ASSERT_OK (p->SetTop (f));
1022+ solvers::z3::ScopedVerifyProcEquivalence svpe (f, /* activation_count=*/ 5 );
1023+ ScopedRecordIr sri (p.get ());
1024+ EXPECT_THAT (Run (p.get ()), IsOkAndHolds (true ));
1025+ }
1026+
9981027INSTANTIATE_TEST_SUITE_P (
9991028 ChannelLegalizationPassTestInstantiation, ChannelLegalizationPassTest,
10001029 Combine (ValuesIn(kTestParameters ),
0 commit comments