blob: 6d79df57a82163e8404f83934f8d7dd0a4b9e6ec [file] [log] [blame]
//****************************************************************************
//
// Copyright 2017-2023 Vivante Corporation
//
// Portions Copyright (c) 2003 Silicon Image GmbH, used with permission
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//****************************************************************************
// Auto-generated file on 11/03/2023.
//
//****************************************************************************
function [7:0] f_sqrt_8bit;
input [11:0] in_data_12bit;
reg [1:0] v_mux;
reg [7:0] v_in_mux;
reg [3:0] v_segment;
reg [1:0] v_p2_dx;
reg [7:0] v_y_i;
reg [4:0] v_dy;
reg [2:0] v_x_int;
reg [4:0] v_delta_x;
reg [9:0] v_prod_1;
reg [6:0] v_delta_y4;
reg [9:0] v_y_sum;
reg [7:0] v_y_out;
reg [7:0] v_out_sqrt;
reg [8:0] v_out_sqrt_mux;
reg [8:0] v_sqrt_round;
begin
v_mux = (in_data_12bit[11: 8] == 4'h0) ? 2'h0 :
(in_data_12bit[11:10] == 2'h0) ? 2'h1 : 2'h2;
case (v_mux)
2'd0 : v_in_mux = in_data_12bit[7:0];
2'd1 : v_in_mux = in_data_12bit[9:2];
default: v_in_mux = in_data_12bit[11:4];
endcase
if (v_in_mux[7:4] == 4'd0) begin
if (v_in_mux[3:0] == 4'd0) v_segment=0;
else if (v_in_mux[3:2] == 2'd0) v_segment=1;
else if (v_in_mux[3 ] == 1'd0) v_segment=2;
else v_segment=3;
end else if (v_in_mux[7] == 1'd0) begin
if (v_in_mux[6:4] == 3'd1) v_segment=4;
else if (v_in_mux[6:4] == 3'd2) v_segment=5;
else if (v_in_mux[6:5] == 2'd1) v_segment=6;
else if (v_in_mux[6:5] == 2'd2) v_segment=7;
else v_segment=8;
end else begin
case (v_in_mux[6:5])
2'd0 : v_segment=9;
2'd1 : v_segment=10;
2'd2 : v_segment=11;
default : v_segment=12;
endcase
end
case(v_segment)
4'd0 : v_y_i = 8'd0;
4'd1 : v_y_i = 8'd11;
4'd2 : v_y_i = 8'd32;
4'd3 : v_y_i = 8'd46;
4'd4 : v_y_i = 8'd65;
4'd5 : v_y_i = 8'd91;
4'd6 : v_y_i = 8'd111;
4'd7 : v_y_i = 8'd128;
4'd8 : v_y_i = 8'd157;
4'd9 : v_y_i = 8'd181;
4'd10 : v_y_i = 8'd203;
4'd11 : v_y_i = 8'd222;
default: v_y_i = 8'd240;
endcase
case(v_segment)
4'd0 : v_dy = 5'd0;
4'd1 : v_dy = 5'd21;
4'd2 : v_dy = 5'd14;
4'd3 : v_dy = 5'd19;
4'd4 : v_dy = 5'd26;
4'd5 : v_dy = 5'd20;
4'd6 : v_dy = 5'd17;
4'd7 : v_dy = 5'd29;
4'd8 : v_dy = 5'd24;
4'd9 : v_dy = 5'd22;
4'd10 : v_dy = 5'd19;
4'd11 : v_dy = 5'd18;
default: v_dy = 5'd16;
endcase
case (v_segment)
4'd2 : v_x_int = 3'd1;
4'd3 : v_x_int = 3'd2;
4'd4 : v_x_int = 3'd4;
4'd6 : v_x_int = 3'd4;
default: v_x_int = 3'd0;
endcase
case(v_segment)
4'd0 : v_p2_dx = 2'd0;
4'd1 : v_p2_dx = 2'd0;
4'd2 : v_p2_dx = 2'd0;
4'd3 : v_p2_dx = 2'd1;
4'd4 : v_p2_dx = 2'd2;
4'd5 : v_p2_dx = 2'd2;
4'd6 : v_p2_dx = 2'd2;
default: v_p2_dx = 2'd3;
endcase
v_delta_x = {(v_in_mux[4:2] - v_x_int), v_in_mux[1:0]};
v_prod_1 = v_delta_x * v_dy;
v_delta_y4 = v_prod_1 >> v_p2_dx;
v_y_sum = {2'b0, v_delta_y4[6:1]} + {1'b0, v_y_i, 1'b1};
v_y_out = v_y_sum[8:1];
v_out_sqrt = (v_y_sum[9]) ? 8'd255 : v_y_out;
case (v_mux)
2'd0 : v_out_sqrt_mux = {2'b0,v_out_sqrt[7:1]};
2'd1 : v_out_sqrt_mux = {1'b0,v_out_sqrt} ;
default: v_out_sqrt_mux = {v_out_sqrt, 1'b0};
endcase
v_sqrt_round = v_out_sqrt_mux +1;
f_sqrt_8bit = v_sqrt_round[8:1];
end
endfunction