Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 24 additions & 20 deletions xls/codegen/block_conversion_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5629,16 +5629,18 @@ proc alternating_counter(counter0: bits[32], counter1: bits[32], index: bits[1],
package->GetProc("alternating_counter"));
AddPredicate only_on_0(*proc->GetNode("index_is_0"));
AddPredicate only_on_1(*proc->GetNode("index_is_1"));
XLS_ASSERT_OK(
proc->TransformStateElement(proc->GetStateReadByStateElement(
*proc->GetStateElementByName("counter0")),
Value(UBits(0, 32)), only_on_0)
.status());
XLS_ASSERT_OK(
proc->TransformStateElement(proc->GetStateReadByStateElement(
*proc->GetStateElementByName("counter1")),
Value(UBits(5, 32)), only_on_1)
.status());
XLS_ASSERT_OK(proc->TransformStateElement(
proc->GetStateReadsByStateElement(
*proc->GetStateElementByName("counter0"))
.front(),
Value(UBits(0, 32)), only_on_0)
.status());
XLS_ASSERT_OK(proc->TransformStateElement(
proc->GetStateReadsByStateElement(
*proc->GetStateElementByName("counter1"))
.front(),
Value(UBits(5, 32)), only_on_1)
.status());

ASSERT_THAT(proc->next_values(*proc->GetStateElementByName("counter0")),
SizeIs(1));
Expand Down Expand Up @@ -5746,16 +5748,18 @@ proc alternating_counter(counter0: bits[32], counter1: bits[32], index: bits[1],
package->GetProc("alternating_counter"));
AddPredicate only_on_0(*proc->GetNode("index_is_0"));
AddPredicate only_on_1(*proc->GetNode("index_is_1"));
XLS_ASSERT_OK(
proc->TransformStateElement(proc->GetStateReadByStateElement(
*proc->GetStateElementByName("counter0")),
Value(UBits(0, 32)), only_on_0)
.status());
XLS_ASSERT_OK(
proc->TransformStateElement(proc->GetStateReadByStateElement(
*proc->GetStateElementByName("counter1")),
Value(UBits(5, 32)), only_on_1)
.status());
XLS_ASSERT_OK(proc->TransformStateElement(
proc->GetStateReadsByStateElement(
*proc->GetStateElementByName("counter0"))
.front(),
Value(UBits(0, 32)), only_on_0)
.status());
XLS_ASSERT_OK(proc->TransformStateElement(
proc->GetStateReadsByStateElement(
*proc->GetStateElementByName("counter1"))
.front(),
Value(UBits(5, 32)), only_on_1)
.status());

SchedulingOptions scheduling_options =
SchedulingOptions()
Expand Down
44 changes: 24 additions & 20 deletions xls/codegen_v_1_5/block_conversion_pass_pipeline_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5857,16 +5857,18 @@ proc alternating_counter(counter0: bits[32], counter1: bits[32], index: bits[1],
package->GetProc("alternating_counter"));
AddPredicate only_on_0(*proc->GetNode("index_is_0"));
AddPredicate only_on_1(*proc->GetNode("index_is_1"));
XLS_ASSERT_OK(
proc->TransformStateElement(proc->GetStateReadByStateElement(
*proc->GetStateElementByName("counter0")),
Value(UBits(0, 32)), only_on_0)
.status());
XLS_ASSERT_OK(
proc->TransformStateElement(proc->GetStateReadByStateElement(
*proc->GetStateElementByName("counter1")),
Value(UBits(5, 32)), only_on_1)
.status());
XLS_ASSERT_OK(proc->TransformStateElement(
proc->GetStateReadsByStateElement(
*proc->GetStateElementByName("counter0"))
.front(),
Value(UBits(0, 32)), only_on_0)
.status());
XLS_ASSERT_OK(proc->TransformStateElement(
proc->GetStateReadsByStateElement(
*proc->GetStateElementByName("counter1"))
.front(),
Value(UBits(5, 32)), only_on_1)
.status());

ASSERT_THAT(proc->next_values(*proc->GetStateElementByName("counter0")),
SizeIs(1));
Expand Down Expand Up @@ -5970,16 +5972,18 @@ proc alternating_counter(counter0: bits[32], counter1: bits[32], index: bits[1],
package->GetProc("alternating_counter"));
AddPredicate only_on_0(*proc->GetNode("index_is_0"));
AddPredicate only_on_1(*proc->GetNode("index_is_1"));
XLS_ASSERT_OK(
proc->TransformStateElement(proc->GetStateReadByStateElement(
*proc->GetStateElementByName("counter0")),
Value(UBits(0, 32)), only_on_0)
.status());
XLS_ASSERT_OK(
proc->TransformStateElement(proc->GetStateReadByStateElement(
*proc->GetStateElementByName("counter1")),
Value(UBits(5, 32)), only_on_1)
.status());
XLS_ASSERT_OK(proc->TransformStateElement(
proc->GetStateReadsByStateElement(
*proc->GetStateElementByName("counter0"))
.front(),
Value(UBits(0, 32)), only_on_0)
.status());
XLS_ASSERT_OK(proc->TransformStateElement(
proc->GetStateReadsByStateElement(
*proc->GetStateElementByName("counter1"))
.front(),
Value(UBits(5, 32)), only_on_1)
.status());

SchedulingOptions scheduling_options =
SchedulingOptions()
Expand Down
8 changes: 6 additions & 2 deletions xls/contrib/xlscc/generate_fsm.cc
Original file line number Diff line number Diff line change
Expand Up @@ -837,8 +837,12 @@ NewFSMGenerator::GenerateNewFSMInvocation(
xls_state_element = pb.StateElement(
state_element.name, xls::ZeroOfType(state_element.type), body_loc);
} else {
xls::StateRead* state_read = pb.proc()->GetStateReadByStateElement(
state_element.existing_state_element);
absl::Span<xls::StateRead* const> reads =
pb.proc()->GetStateReadsByStateElement(
state_element.existing_state_element);
XLSCC_CHECK_LE(reads.size(), 1, body_loc);
XLSCC_CHECK(!reads.empty(), body_loc);
xls::StateRead* state_read = reads.front();
xls_state_element = TrackedBValue(state_read, &pb);
}

Expand Down
27 changes: 21 additions & 6 deletions xls/contrib/xlscc/translate_block.cc
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
#include "absl/strings/str_join.h"
#include "absl/types/span.h"
#include "clang/include/clang/AST/Attr.h"
#include "clang/include/clang/AST/Attrs.inc"
#include "clang/include/clang/AST/Decl.h"
Expand Down Expand Up @@ -258,8 +259,11 @@ absl::StatusOr<TrackedBValue> ComposeStaticValueInput(
if (!generate_new_fsm || !TypeIsDecomposable(xls_type)) {
xls::StateElement* state_element = state_element_for_static.at(
DeclLeaf{.decl = namedecl, .leaf_index = -1});
return TrackedBValue(pb.proc()->GetStateReadByStateElement(state_element),
&pb);
absl::Span<xls::StateRead* const> reads =
pb.proc()->GetStateReadsByStateElement(state_element);
CHECK(!reads.empty());
CHECK_LE(reads.size(), 1);
return TrackedBValue(reads.front(), &pb);
}
absl::InlinedVector<xls::Type*, 1> decomposed_types =
DecomposeTupleTypes(xls_type);
Expand All @@ -268,7 +272,11 @@ absl::StatusOr<TrackedBValue> ComposeStaticValueInput(
for (int64_t i = 0; i < decomposed_types.size(); ++i) {
xls::StateElement* decomposed_element = state_element_for_static.at(
DeclLeaf{.decl = namedecl, .leaf_index = i});
nodes.push_back(pb.proc()->GetStateReadByStateElement(decomposed_element));
absl::Span<xls::StateRead* const> reads =
pb.proc()->GetStateReadsByStateElement(decomposed_element);
CHECK(!reads.empty());
CHECK_LE(reads.size(), 1);
nodes.push_back(reads.front());
}

XLS_ASSIGN_OR_RETURN(xls::Node * node,
Expand Down Expand Up @@ -662,8 +670,11 @@ absl::StatusOr<xls::Proc*> Translator::GenerateIR_Block(
next_state_value.value = TrackedBValue(decomposed_next_val, &pb);
} else {
XLSCC_CHECK_EQ(decomposed_elems.size(), 1, body_loc);
xls::StateRead* state_read =
pb.proc()->GetStateReadByStateElement(decomposed_elem);
absl::Span<xls::StateRead* const> reads =
pb.proc()->GetStateReadsByStateElement(decomposed_elem);
XLSCC_CHECK(!reads.empty(), body_loc);
XLSCC_CHECK_LE(reads.size(), 1, body_loc);
xls::StateRead* state_read = reads.front();
TrackedBValue prev_val(state_read, &pb);
next_state_value.value =
pb.And(prev_val,
Expand Down Expand Up @@ -2268,7 +2279,11 @@ absl::StatusOr<xls::Proc*> Translator::BuildWithNextStateValueMap(
return absl::InternalError(
absl::StrFormat("No next values for state element %s", elem->name()));
}
xls::StateRead* state_read = pb.proc()->GetStateReadByStateElement(elem);
absl::Span<xls::StateRead* const> reads =
pb.proc()->GetStateReadsByStateElement(elem);
XLSCC_CHECK(!reads.empty(), loc);
XLSCC_CHECK_LE(reads.size(), 1, loc);
xls::StateRead* state_read = reads.front();
TrackedBValue read_bval(state_read, &pb);
if (values_for_elem == 1) {
const NextStateValue& next_state_value =
Expand Down
8 changes: 6 additions & 2 deletions xls/contrib/xlscc/translate_loops.cc
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include "absl/status/statusor.h"
#include "absl/strings/str_format.h"
#include "absl/time/time.h"
#include "absl/types/span.h"
#include "clang/include/clang/AST/Attr.h"
#include "clang/include/clang/AST/Decl.h"
#include "clang/include/clang/AST/Expr.h"
Expand Down Expand Up @@ -1374,8 +1375,11 @@ Translator::GenerateIR_PipelinedLoopContents(
} else {
xls::StateElement* state_elem =
prepared.state_element_for_variable.at(DeclLeaf{.decl = decl});
state_reads_by_decl[decl] =
TrackedBValue(pb.proc()->GetStateReadByStateElement(state_elem), &pb);
absl::Span<xls::StateRead* const> reads =
pb.proc()->GetStateReadsByStateElement(state_elem);
XLSCC_CHECK(!reads.empty(), loc);
XLSCC_CHECK_LE(reads.size(), 1);
state_reads_by_decl[decl] = TrackedBValue(reads.front(), &pb);
}
}

Expand Down
6 changes: 5 additions & 1 deletion xls/contrib/xlscc/unit_tests/unit_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -938,7 +938,11 @@ XlsccTestBase::GetStatesByIONodeForFSMProc(std::string_view func_name) {

CHECK_EQ(found_proc_with_fsm, nullptr);
found_proc_with_fsm = proc.get();
fsm_state_read = proc->GetStateReadByStateElement(state_element);
absl::Span<xls::StateRead* const> reads =
proc->GetStateReadsByStateElement(state_element);
CHECK(!reads.empty());
CHECK_LE(reads.size(), 1);
fsm_state_read = reads.front();

CHECK_NE(found_proc_with_fsm, nullptr);
CHECK_NE(fsm_state_read, nullptr);
Expand Down
8 changes: 5 additions & 3 deletions xls/dev_tools/ir_minimizer_main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -450,14 +450,16 @@ absl::StatusOr<bool> RemoveDeadParameters(FunctionBase* f) {
// Replace all uses of invariant state elements (i.e.: ones where
// next[i] == param[i]) with a literal of the initial value.
Value init_value = invariant->initial_value();
Node* state_read = p->GetStateReadByStateElement(invariant);
absl::btree_set<Next*, Node::NodeIdLessThan> next_values =
p->next_values(invariant);
for (Next* next : next_values) {
XLS_RETURN_IF_ERROR(p->RemoveNode(next));
}
XLS_RETURN_IF_ERROR(
state_read->ReplaceUsesWithNew<Literal>(init_value).status());
for (xls::StateRead* state_read :
p->GetStateReadsByStateElement(invariant)) {
XLS_RETURN_IF_ERROR(
state_read->ReplaceUsesWithNew<xls::Literal>(init_value).status());
}
dead_state_elements.insert(invariant);
}

Expand Down
1 change: 1 addition & 0 deletions xls/ir/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -931,6 +931,7 @@ cc_test(
"@com_google_absl//absl/base",
"@com_google_absl//absl/status",
"@com_google_absl//absl/strings",
"@com_google_absl//absl/types:span",
"@googletest//:gtest",
],
)
Expand Down
8 changes: 5 additions & 3 deletions xls/ir/ir_parser.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1895,9 +1895,11 @@ absl::StatusOr<Parser::BodyResult> Parser::ParseBody(
Proc * source_proc,
ParseProc(package, /*outer_attributes=*/{}, &source));
for (StateElement* element : source_proc->StateElements()) {
name_to_value->emplace(
element->name(),
bb->SourceNode(source_proc->GetStateReadByStateElement(element)));
absl::Span<StateRead* const> reads =
source_proc->GetStateReadsByStateElement(element);
XLS_RET_CHECK_EQ(reads.size(), 1);
name_to_value->emplace(element->name(),
bb->SourceNode(reads.front()));
}
} else {
return absl::InvalidArgumentError(absl::StrFormat(
Expand Down
18 changes: 13 additions & 5 deletions xls/ir/ir_parser_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include "absl/strings/ascii.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/substitute.h"
#include "absl/types/span.h"
#include "xls/common/source_location.h"
#include "xls/common/status/matchers.h"
#include "xls/ir/bits.h"
Expand Down Expand Up @@ -607,7 +608,9 @@ proc foo( x: bits[32], y: (), z: bits[32], init={42, (), 123}) {
XLS_ASSERT_OK_AND_ASSIGN(Proc * proc, package->GetProc("foo"));
EXPECT_EQ(proc->GetStateElementCount(), 3);
XLS_ASSERT_OK_AND_ASSIGN(StateElement * x, proc->GetStateElementByName("x"));
EXPECT_THAT(proc->GetStateReadByStateElement(x)->predicate(), std::nullopt);
absl::Span<StateRead* const> reads = proc->GetStateReadsByStateElement(x);
ASSERT_EQ(reads.size(), 1);
EXPECT_THAT(reads.front()->predicate(), std::nullopt);
}

TEST(IrParserTest, ProcWithPredicatedStateRead) {
Expand All @@ -626,17 +629,22 @@ proc foo( x: bits[32], y: bits[1], z: bits[32], init={42, 1, 123}) {
EXPECT_EQ(proc->GetStateElementCount(), 3);

XLS_ASSERT_OK_AND_ASSIGN(StateElement * x, proc->GetStateElementByName("x"));
std::optional<Node*> x_predicate =
proc->GetStateReadByStateElement(x)->predicate();
absl::Span<StateRead* const> reads_x = proc->GetStateReadsByStateElement(x);
ASSERT_EQ(reads_x.size(), 1);
std::optional<Node*> x_predicate = reads_x.front()->predicate();
ASSERT_TRUE(x_predicate.has_value());
ASSERT_EQ((*x_predicate)->op(), Op::kStateRead);
EXPECT_EQ((*x_predicate)->As<StateRead>()->state_element()->name(), "y");

XLS_ASSERT_OK_AND_ASSIGN(StateElement * y, proc->GetStateElementByName("y"));
ASSERT_FALSE(proc->GetStateReadByStateElement(y)->predicate().has_value());
absl::Span<StateRead* const> reads_y = proc->GetStateReadsByStateElement(y);
ASSERT_EQ(reads_y.size(), 1);
ASSERT_FALSE(reads_y.front()->predicate().has_value());

XLS_ASSERT_OK_AND_ASSIGN(StateElement * z, proc->GetStateElementByName("z"));
ASSERT_FALSE(proc->GetStateReadByStateElement(z)->predicate().has_value());
absl::Span<StateRead* const> reads_z = proc->GetStateReadsByStateElement(z);
ASSERT_EQ(reads_z.size(), 1);
ASSERT_FALSE(reads_z.front()->predicate().has_value());
}

TEST(IrParserTest, ParseSendReceiveChannel) {
Expand Down
4 changes: 2 additions & 2 deletions xls/ir/node_util_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,7 @@ TEST_F(NodeUtilTest, ChannelNodes) {

EXPECT_THAT(GetChannelUsedByNode(rcv.node()), IsOkAndHolds(ch0));
EXPECT_THAT(GetChannelUsedByNode(send.node()), IsOkAndHolds(ch1));
EXPECT_THAT(GetChannelUsedByNode(proc->GetStateRead(0)),
EXPECT_THAT(GetChannelUsedByNode(proc->GetStateReads(0).front()),
StatusIs(absl::StatusCode::kNotFound,
HasSubstr("No channel associated with node")));
}
Expand Down Expand Up @@ -435,7 +435,7 @@ TEST_F(NodeUtilTest, ReplaceTupleIndicesWorksWithToken) {
// works, we'd need to make an after_all and add the receive's output token to
// it after calling ReplaceTupleElementsWith().
XLS_EXPECT_OK(ReplaceTupleElementsWith(
receive_node, {{0, proc->GetStateRead(0)}, {1, lit0}}));
receive_node, {{0, proc->GetStateReads(0).front()}, {1, lit0}}));

ExpectIr(proc->DumpIr(), TestName());
}
Expand Down
Loading
Loading