Skip to content

Commit b6274e9

Browse files
allightcopybara-github
authored andcommitted
Allow UnrollProcToFunction to handle procs with asserts
When unrolling with asserts care must be taken to ensure that asserts are preserved correctly since we otherwise rewrite tokens into seq-numbers. Instead we just ignore token graph for asserts when unrolling. PiperOrigin-RevId: 861784441
1 parent 9294da4 commit b6274e9

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed

xls/ir/proc_testutils.cc

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,23 @@ class UnrollProcVisitor final : public DfsVisitorWithDefault {
9292
return absl::OkStatus();
9393
}
9494

95+
// Asserts are kept around but the token argument is just dropped.
96+
// TODO(allight): Should we handle trace/cover the same way?
97+
absl::Status HandleAssert(Assert* n) override {
98+
XLS_RETURN_IF_ERROR(fb_.GetError());
99+
std::vector<Node*> new_ops{fb_.Literal(Value::Token()).node(),
100+
values_[{n->condition(), activation_}].node()};
101+
XLS_ASSIGN_OR_RETURN(Node * new_node,
102+
n->CloneInNewFunction(new_ops, fb_.function()));
103+
// Give the assert a new label.
104+
if (n->label()) {
105+
new_node->As<Assert>()->set_label(absl::StrFormat(
106+
"%s_act%d_assert", n->label().value_or(n->GetName()), activation_));
107+
}
108+
values_[{n, activation_}] = BValue(new_node, &fb_);
109+
return absl::OkStatus();
110+
}
111+
95112
absl::Status HandleStateRead(StateRead* state_read) override {
96113
XLS_RETURN_IF_ERROR(fb_.GetError());
97114
if (state_read->GetType()->IsToken()) {

xls/ir/proc_testutils_test.cc

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
90137
TEST_F(UnrollProcTest, StateOnlyProcs) {
91138
auto p = CreatePackage();
92139
XLS_ASSERT_OK_AND_ASSIGN(

0 commit comments

Comments
 (0)