module __bfloat16__full_precision_mul( input wire [15:0] x, input wire [15:0] y, output wire [23:0] out ); // lint_off MULTIPLY function automatic [15:0] umul16b_8b_x_8b (input reg [7:0] lhs, input reg [7:0] rhs); begin umul16b_8b_x_8b = lhs * rhs; end endfunction // lint_on MULTIPLY wire [7:0] x_bexp__2; wire [7:0] y_bexp__2; wire [6:0] x_fraction__2; wire [6:0] y_fraction__2; wire eq_586; wire eq_587; wire [7:0] x_significand__2; wire [7:0] y_significand__2; wire nor_592; wire [8:0] add_593; wire [15:0] umul_594; wire [15:0] full_product; wire eq_601; wire eq_602; wire eq_603; wire eq_604; wire [9:0] exp; wire in_upper_binade; wire [9:0] exp__1; wire has_inf_arg; wire [9:0] result_exp; wire [9:0] result_exp__1; wire sge_619; wire sle_620; wire has_0_arg; wire x_sign__2; wire y_sign__2; wire result_sign; wire is_result_nan; wire [14:0] result_fraction__1; wire [23:0] tuple_649; assign x_bexp__2 = x[14:7]; assign y_bexp__2 = y[14:7]; assign x_fraction__2 = x[6:0]; assign y_fraction__2 = y[6:0]; assign eq_586 = x_bexp__2 == 8'h00; assign eq_587 = y_bexp__2 == 8'h00; assign x_significand__2 = {1'h1, x_fraction__2}; assign y_significand__2 = {1'h1, y_fraction__2}; assign nor_592 = ~(eq_586 | eq_587); assign add_593 = {1'h0, x_bexp__2} + {1'h0, y_bexp__2}; assign umul_594 = umul16b_8b_x_8b(x_significand__2, y_significand__2); assign full_product = umul_594 & {16{nor_592}}; assign eq_601 = x_bexp__2 == 8'hff; assign eq_602 = x_fraction__2 == 7'h00; assign eq_603 = y_bexp__2 == 8'hff; assign eq_604 = y_fraction__2 == 7'h00; assign exp = {1'h0, add_593} + 10'h381; assign in_upper_binade = full_product[15]; assign exp__1 = exp & {10{nor_592}}; assign has_inf_arg = eq_601 & eq_602 | eq_603 & eq_604; assign result_exp = exp__1 + {9'h000, in_upper_binade}; assign result_exp__1 = has_inf_arg ? 10'h1ff : result_exp; assign sge_619 = $signed(result_exp__1) >= $signed(10'h0ff); assign sle_620 = $signed(result_exp__1) <= $signed(10'h000); assign has_0_arg = eq_586 | eq_587; assign x_sign__2 = x[15:15]; assign y_sign__2 = y[15:15]; assign result_sign = x_sign__2 ^ y_sign__2; assign is_result_nan = ~(~eq_601 | eq_602) | ~(~eq_603 | eq_604) | has_0_arg & has_inf_arg; assign result_fraction__1 = in_upper_binade ? umul_594[14:0] : {full_product[13:0], 1'h0}; assign tuple_649 = {~(is_result_nan | ~result_sign), is_result_nan | sge_619 ? 8'hff : result_exp__1[7:0] & {8{~sle_620}}, is_result_nan ? 15'h4000 : result_fraction__1 & {15{~(sge_619 | sle_620 | has_inf_arg)}}}; assign out = tuple_649; endmodule