@@ -1047,6 +1047,203 @@ endmodule
10471047 EXPECT_EQ (std::string_view{emitted}, kWantEmitted );
10481048}
10491049
1050+ TEST (XlsCApiTest, VastModuleScopeConditional) {
1051+ const std::string_view kWantEmitted = R"( module top;
1052+ parameter A = 1;
1053+ parameter B = 2;
1054+ wire out;
1055+ if (A == B) begin
1056+ assign out = 1'h1;
1057+ end else begin
1058+ assign out = 1'h0;
1059+ end
1060+ endmodule
1061+ )" ;
1062+
1063+ xls_vast_verilog_file* f =
1064+ xls_vast_make_verilog_file (xls_vast_file_type_system_verilog);
1065+ ASSERT_NE (f, nullptr );
1066+ absl::Cleanup free_file ([&] { xls_vast_verilog_file_free (f); });
1067+
1068+ xls_vast_verilog_module* m = xls_vast_verilog_file_add_module (f, " top" );
1069+ ASSERT_NE (m, nullptr );
1070+
1071+ // parameter A = 1; parameter B = 2;
1072+ xls_vast_parameter_ref* A = xls_vast_verilog_module_add_parameter (
1073+ m, " A" ,
1074+ xls_vast_literal_as_expression (
1075+ xls_vast_verilog_file_make_plain_literal (f, 1 )));
1076+ xls_vast_parameter_ref* B = xls_vast_verilog_module_add_parameter (
1077+ m, " B" ,
1078+ xls_vast_literal_as_expression (
1079+ xls_vast_verilog_file_make_plain_literal (f, 2 )));
1080+ ASSERT_NE (A, nullptr );
1081+ ASSERT_NE (B, nullptr );
1082+
1083+ // wire out;
1084+ xls_vast_data_type* scalar = xls_vast_verilog_file_make_scalar_type (f);
1085+ ASSERT_NE (scalar, nullptr );
1086+ xls_vast_logic_ref* out = xls_vast_verilog_module_add_wire (m, " out" , scalar);
1087+ ASSERT_NE (out, nullptr );
1088+
1089+ auto make_ubits_literal = [&](int64_t bit_count,
1090+ uint64_t value) -> xls_vast_expression* {
1091+ xls_bits* bits = nullptr ;
1092+ char * error = nullptr ;
1093+ absl::Cleanup free_error ([&] { xls_c_str_free (error); });
1094+ EXPECT_TRUE (xls_bits_make_ubits (bit_count, value, &error, &bits))
1095+ << (error ? error : " " );
1096+ absl::Cleanup free_bits ([&] { xls_bits_free (bits); });
1097+ xls_vast_literal* lit = nullptr ;
1098+ EXPECT_TRUE (xls_vast_verilog_file_make_literal (
1099+ f, bits, xls_format_preference_hex, /* emit_bit_count=*/ true , &error,
1100+ &lit))
1101+ << (error ? error : " " );
1102+ EXPECT_NE (lit, nullptr );
1103+ return xls_vast_literal_as_expression (lit);
1104+ };
1105+
1106+ // if (A == B) ...
1107+ xls_vast_expression* eq = xls_vast_verilog_file_make_binary (
1108+ f, xls_vast_parameter_ref_as_expression (A),
1109+ xls_vast_parameter_ref_as_expression (B), xls_vast_operator_kind_eq);
1110+ ASSERT_NE (eq, nullptr );
1111+ xls_vast_conditional* cond = xls_vast_verilog_module_add_conditional (m, eq);
1112+ ASSERT_NE (cond, nullptr );
1113+
1114+ xls_vast_statement_block* then_block =
1115+ xls_vast_conditional_get_then_block (cond);
1116+ ASSERT_NE (then_block, nullptr );
1117+ ASSERT_NE (xls_vast_statement_block_add_continuous_assignment (
1118+ then_block, xls_vast_logic_ref_as_expression (out),
1119+ make_ubits_literal (/* bit_count=*/ 1 , /* value=*/ 1 )),
1120+ nullptr );
1121+
1122+ xls_vast_statement_block* else_block = xls_vast_conditional_add_else (cond);
1123+ ASSERT_NE (else_block, nullptr );
1124+ ASSERT_NE (xls_vast_statement_block_add_continuous_assignment (
1125+ else_block, xls_vast_logic_ref_as_expression (out),
1126+ make_ubits_literal (/* bit_count=*/ 1 , /* value=*/ 0 )),
1127+ nullptr );
1128+
1129+ char * emitted = xls_vast_verilog_file_emit (f);
1130+ ASSERT_NE (emitted, nullptr );
1131+ absl::Cleanup free_emitted ([&] { xls_c_str_free (emitted); });
1132+ EXPECT_EQ (std::string_view{emitted}, kWantEmitted );
1133+ }
1134+
1135+ TEST (XlsCApiTest, VastGenerateLoopConditional) {
1136+ const std::string_view kWantEmitted = R"( module top;
1137+ wire [2:0] out;
1138+ for (genvar i = 0; i < 3; i = i + 1) begin : g
1139+ if (i == 0) begin
1140+ assign out[i] = 1'h0;
1141+ end else if (i == 1) begin
1142+ assign out[i] = 1'h1;
1143+ end else begin
1144+ assign out[i] = 'X;
1145+ end
1146+ end
1147+ endmodule
1148+ )" ;
1149+
1150+ xls_vast_verilog_file* f =
1151+ xls_vast_make_verilog_file (xls_vast_file_type_system_verilog);
1152+ ASSERT_NE (f, nullptr );
1153+ absl::Cleanup free_file ([&] { xls_vast_verilog_file_free (f); });
1154+
1155+ xls_vast_verilog_module* m = xls_vast_verilog_file_add_module (f, " top" );
1156+ ASSERT_NE (m, nullptr );
1157+
1158+ xls_vast_data_type* u3 =
1159+ xls_vast_verilog_file_make_bit_vector_type (f, 3 , /* is_signed=*/ false );
1160+ xls_vast_logic_ref* out = xls_vast_verilog_module_add_wire (m, " out" , u3);
1161+ ASSERT_NE (out, nullptr );
1162+
1163+ xls_vast_generate_loop* loop = xls_vast_verilog_module_add_generate_loop (
1164+ m, " i" ,
1165+ xls_vast_literal_as_expression (
1166+ xls_vast_verilog_file_make_plain_literal (f, 0 )),
1167+ xls_vast_literal_as_expression (
1168+ xls_vast_verilog_file_make_plain_literal (f, 3 )),
1169+ " g" );
1170+ ASSERT_NE (loop, nullptr );
1171+
1172+ xls_vast_logic_ref* i_lr = xls_vast_generate_loop_get_genvar (loop);
1173+ ASSERT_NE (i_lr, nullptr );
1174+
1175+ // Helper to form out[i] (as expression).
1176+ xls_vast_indexable_expression* out_idxable =
1177+ xls_vast_logic_ref_as_indexable_expression (out);
1178+ ASSERT_NE (out_idxable, nullptr );
1179+ xls_vast_index* out_i = xls_vast_verilog_file_make_index (
1180+ f, out_idxable, xls_vast_logic_ref_as_expression (i_lr));
1181+ ASSERT_NE (out_i, nullptr );
1182+ xls_vast_expression* out_i_expr = xls_vast_index_as_expression (out_i);
1183+ ASSERT_NE (out_i_expr, nullptr );
1184+
1185+ auto make_ubits_literal = [&](int64_t bit_count,
1186+ uint64_t value) -> xls_vast_expression* {
1187+ xls_bits* bits = nullptr ;
1188+ char * error = nullptr ;
1189+ absl::Cleanup free_error ([&] { xls_c_str_free (error); });
1190+ EXPECT_TRUE (xls_bits_make_ubits (bit_count, value, &error, &bits))
1191+ << (error ? error : " " );
1192+ absl::Cleanup free_bits ([&] { xls_bits_free (bits); });
1193+ xls_vast_literal* lit = nullptr ;
1194+ EXPECT_TRUE (xls_vast_verilog_file_make_literal (
1195+ f, bits, xls_format_preference_hex, /* emit_bit_count=*/ true , &error,
1196+ &lit))
1197+ << (error ? error : " " );
1198+ EXPECT_NE (lit, nullptr );
1199+ return xls_vast_literal_as_expression (lit);
1200+ };
1201+
1202+ // if (i == 0) ...
1203+ xls_vast_expression* i_eq_0 = xls_vast_verilog_file_make_binary (
1204+ f, xls_vast_logic_ref_as_expression (i_lr),
1205+ xls_vast_literal_as_expression (
1206+ xls_vast_verilog_file_make_plain_literal (f, 0 )),
1207+ xls_vast_operator_kind_eq);
1208+ ASSERT_NE (i_eq_0, nullptr );
1209+ xls_vast_conditional* cond =
1210+ xls_vast_generate_loop_add_conditional (loop, i_eq_0);
1211+ ASSERT_NE (cond, nullptr );
1212+
1213+ xls_vast_statement_block* then_block =
1214+ xls_vast_conditional_get_then_block (cond);
1215+ ASSERT_NE (then_block, nullptr );
1216+ ASSERT_NE (xls_vast_statement_block_add_continuous_assignment (
1217+ then_block, out_i_expr,
1218+ make_ubits_literal (/* bit_count=*/ 1 , /* value=*/ 0 )),
1219+ nullptr );
1220+
1221+ xls_vast_expression* i_eq_1 = xls_vast_verilog_file_make_binary (
1222+ f, xls_vast_logic_ref_as_expression (i_lr),
1223+ xls_vast_literal_as_expression (
1224+ xls_vast_verilog_file_make_plain_literal (f, 1 )),
1225+ xls_vast_operator_kind_eq);
1226+ xls_vast_statement_block* else_if_block =
1227+ xls_vast_conditional_add_else_if (cond, i_eq_1);
1228+ ASSERT_NE (else_if_block, nullptr );
1229+ ASSERT_NE (xls_vast_statement_block_add_continuous_assignment (
1230+ else_if_block, out_i_expr,
1231+ make_ubits_literal (/* bit_count=*/ 1 , /* value=*/ 1 )),
1232+ nullptr );
1233+
1234+ xls_vast_statement_block* else_block = xls_vast_conditional_add_else (cond);
1235+ ASSERT_NE (else_block, nullptr );
1236+ ASSERT_NE (xls_vast_statement_block_add_continuous_assignment (
1237+ else_block, out_i_expr,
1238+ xls_vast_verilog_file_make_unsized_x_literal (f)),
1239+ nullptr );
1240+
1241+ char * emitted = xls_vast_verilog_file_emit (f);
1242+ ASSERT_NE (emitted, nullptr );
1243+ absl::Cleanup free_emitted ([&] { xls_c_str_free (emitted); });
1244+ EXPECT_EQ (std::string_view{emitted}, kWantEmitted );
1245+ }
1246+
10501247// Tests that we can assign a 128-bit output wire using a 128-bit literal
10511248// value.
10521249TEST (XlsCApiTest, ContinuousAssignmentOf128BitLiteral) {
0 commit comments