1818#include < optional>
1919#include < string>
2020#include < string_view>
21+ #include < utility>
2122#include < vector>
2223
2324#include " gmock/gmock.h"
@@ -1006,18 +1007,22 @@ class ScheduledBlockTest : public IrTestBase {
10061007 struct TestBlock {
10071008 ScheduledBlock* block;
10081009 Node* iv0;
1010+ Node* or0;
1011+ Node* aiv0;
10091012 Node* ov0;
10101013 };
10111014 absl::StatusOr<TestBlock> CreateScheduledBlock (Package* p) {
10121015 ScheduledBlockBuilder bb (" b" , p);
10131016 BValue iv0 = bb.Literal (UBits (1 , 1 ), SourceInfo (), " iv0" );
1014- bb.StartStage (iv0);
1017+ BValue or0 = bb.Literal (UBits (1 , 1 ), SourceInfo (), " or0" );
1018+ bb.StartStage (iv0, or0);
10151019 BValue x = bb.InputPort (" x" , p->GetBitsType (32 ));
10161020 bb.OutputPort (" out" , x);
1021+ BValue aiv0 = bb.Literal (UBits (1 , 1 ), SourceInfo (), " aiv0" );
10171022 BValue ov0 = bb.Literal (UBits (1 , 1 ), SourceInfo (), " ov0" );
1018- bb.EndStage (ov0);
1023+ bb.EndStage (aiv0, ov0);
10191024 XLS_ASSIGN_OR_RETURN (ScheduledBlock * block, bb.Build ());
1020- return TestBlock{block, iv0.node (), ov0.node ()};
1025+ return TestBlock{block, iv0.node (), or0. node (), aiv0. node (), ov0.node ()};
10211026 }
10221027
10231028 void ExpectIr (std::string_view got, std::string_view test_name) {
@@ -1044,23 +1049,38 @@ TEST_F(ScheduledBlockTest, StageAddAndClear) {
10441049
10451050 XLS_ASSERT_OK_AND_ASSIGN (
10461051 Node * iv1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1052+ XLS_ASSERT_OK_AND_ASSIGN (
1053+ Node * or1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1054+ XLS_ASSERT_OK_AND_ASSIGN (
1055+ Node * aiv1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
10471056 XLS_ASSERT_OK_AND_ASSIGN (
10481057 Node * ov1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1049- block->AddStage (Stage (iv1, ov1));
1058+ Stage stage1 (iv1, or1, aiv1, ov1);
1059+ stage1.AddNode (aiv1);
1060+ stage1.AddNode (ov1);
1061+ block->AddStage (std::move (stage1));
1062+
10501063 EXPECT_EQ (block->stages ().size (), 2 );
10511064
10521065 XLS_ASSERT_OK_AND_ASSIGN (
10531066 Node * iv2, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1067+ XLS_ASSERT_OK_AND_ASSIGN (
1068+ Node * or2, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1069+ XLS_ASSERT_OK_AND_ASSIGN (
1070+ Node * aiv2, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
10541071 XLS_ASSERT_OK_AND_ASSIGN (
10551072 Node * ov2, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1056- block->AddStage (Stage (iv2, ov2));
1073+ Stage stage2 (iv2, or2, aiv2, ov2);
1074+ stage2.AddNode (aiv2);
1075+ stage2.AddNode (ov2);
1076+ block->AddStage (std::move (stage2));
10571077 EXPECT_EQ (block->stages ().size (), 3 );
10581078
10591079 block->ClearStages ();
10601080 EXPECT_TRUE (block->stages ().empty ());
10611081
10621082 // Re-stage nodes to satisfy the verifier on destruction.
1063- block->AddStage (Stage (tb.iv0 , tb.ov0 ));
1083+ block->AddStage (Stage (tb.iv0 , tb.or0 , tb. aiv0 , tb. ov0 ));
10641084 for (Node* node : block->nodes ()) {
10651085 if (!block->IsStaged (node)) {
10661086 XLS_ASSERT_OK (block->AddNodeToStage (0 , node).status ());
@@ -1075,9 +1095,16 @@ TEST_F(ScheduledBlockTest, GetStageIndex) {
10751095
10761096 XLS_ASSERT_OK_AND_ASSIGN (
10771097 Node * iv1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1098+ XLS_ASSERT_OK_AND_ASSIGN (
1099+ Node * or1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1100+ XLS_ASSERT_OK_AND_ASSIGN (
1101+ Node * aiv1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
10781102 XLS_ASSERT_OK_AND_ASSIGN (
10791103 Node * ov1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1080- block->AddStage (Stage (iv1, ov1)); // Stage 1
1104+ Stage stage1 (iv1, or1, aiv1, ov1);
1105+ stage1.AddNode (aiv1);
1106+ stage1.AddNode (ov1);
1107+ block->AddStage (std::move (stage1));
10811108
10821109 XLS_ASSERT_OK_AND_ASSIGN (
10831110 Node * lit1,
@@ -1094,9 +1121,16 @@ TEST_F(ScheduledBlockTest, AddNodeToStage) {
10941121 ScheduledBlock* block = tb.block ;
10951122 XLS_ASSERT_OK_AND_ASSIGN (
10961123 Node * iv1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1124+ XLS_ASSERT_OK_AND_ASSIGN (
1125+ Node * or1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1126+ XLS_ASSERT_OK_AND_ASSIGN (
1127+ Node * aiv1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
10971128 XLS_ASSERT_OK_AND_ASSIGN (
10981129 Node * ov1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1099- block->AddStage (Stage (iv1, ov1)); // Stage 1
1130+ Stage stage1 (iv1, or1, aiv1, ov1);
1131+ stage1.AddNode (aiv1);
1132+ stage1.AddNode (ov1);
1133+ block->AddStage (std::move (stage1));
11001134
11011135 XLS_ASSERT_OK_AND_ASSIGN (
11021136 Node * lit, block->MakeNode <Literal>(SourceInfo (), Value (UBits (10 , 32 ))));
@@ -1114,9 +1148,16 @@ TEST_F(ScheduledBlockTest, MakeNodeInStage) {
11141148 ScheduledBlock* block = tb.block ;
11151149 XLS_ASSERT_OK_AND_ASSIGN (
11161150 Node * iv1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1151+ XLS_ASSERT_OK_AND_ASSIGN (
1152+ Node * or1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1153+ XLS_ASSERT_OK_AND_ASSIGN (
1154+ Node * aiv1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
11171155 XLS_ASSERT_OK_AND_ASSIGN (
11181156 Node * ov1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1119- block->AddStage (Stage (iv1, ov1)); // Stage 1
1157+ Stage stage1 (iv1, or1, aiv1, ov1);
1158+ stage1.AddNode (aiv1);
1159+ stage1.AddNode (ov1);
1160+ block->AddStage (std::move (stage1));
11201161
11211162 XLS_ASSERT_OK_AND_ASSIGN (
11221163 Literal * literal,
@@ -1130,9 +1171,16 @@ TEST_F(ScheduledBlockTest, MakeNodeWithNameInStage) {
11301171 ScheduledBlock* block = tb.block ;
11311172 XLS_ASSERT_OK_AND_ASSIGN (
11321173 Node * iv1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1174+ XLS_ASSERT_OK_AND_ASSIGN (
1175+ Node * or1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1176+ XLS_ASSERT_OK_AND_ASSIGN (
1177+ Node * aiv1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
11331178 XLS_ASSERT_OK_AND_ASSIGN (
11341179 Node * ov1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1135- block->AddStage (Stage (iv1, ov1)); // Stage 1
1180+ Stage stage1 (iv1, or1, aiv1, ov1);
1181+ stage1.AddNode (aiv1);
1182+ stage1.AddNode (ov1);
1183+ block->AddStage (std::move (stage1));
11361184
11371185 XLS_ASSERT_OK_AND_ASSIGN (
11381186 Literal * literal, block->MakeNodeWithNameInStage <Literal>(
@@ -1154,14 +1202,28 @@ TEST_F(ScheduledBlockTest, CloneScheduledBlock) {
11541202 ScheduledBlock* block = tb.block ;
11551203 XLS_ASSERT_OK_AND_ASSIGN (
11561204 Node * iv1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1205+ XLS_ASSERT_OK_AND_ASSIGN (
1206+ Node * or1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1207+ XLS_ASSERT_OK_AND_ASSIGN (
1208+ Node * aiv1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
11571209 XLS_ASSERT_OK_AND_ASSIGN (
11581210 Node * ov1, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1159- block->AddStage (Stage (iv1, ov1));
1211+ Stage stage1 (iv1, or1, aiv1, ov1);
1212+ stage1.AddNode (aiv1);
1213+ stage1.AddNode (ov1);
1214+ block->AddStage (std::move (stage1));
11601215 XLS_ASSERT_OK_AND_ASSIGN (
11611216 Node * iv2, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1217+ XLS_ASSERT_OK_AND_ASSIGN (
1218+ Node * or2, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1219+ XLS_ASSERT_OK_AND_ASSIGN (
1220+ Node * aiv2, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
11621221 XLS_ASSERT_OK_AND_ASSIGN (
11631222 Node * ov2, block->MakeNode <Literal>(SourceInfo (), Value (UBits (1 , 1 ))));
1164- block->AddStage (Stage (iv2, ov2));
1223+ Stage stage2 (iv2, or2, aiv2, ov2);
1224+ stage1.AddNode (aiv2);
1225+ stage1.AddNode (ov2);
1226+ block->AddStage (std::move (stage2));
11651227
11661228 XLS_ASSERT_OK (block->MakeNodeWithNameInStage <Literal>(
11671229 0 , SourceInfo (), Value (UBits (1 , 32 )), " my_x" ));
0 commit comments