blob: 55d160d2941278a1a0a2799d93319370900a7bdf [file] [log] [blame]
// ========== Copyright Header Begin ==========================================
//
// OpenSPARC T1 Processor File: fpu_cnt_lead0_64b.v
// Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
//
// The above named program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// The above named program is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this work; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
// ========== Copyright Header End ============================================
///////////////////////////////////////////////////////////////////////////////
//
// 64 bit lead 0 counter.
//
///////////////////////////////////////////////////////////////////////////////
module fpu_cnt_lead0_64b (
din,
lead0
);
input [63:0] din; // data in- count its leading 0's
output [5:0] lead0; // number of leading 0's in data in
wire din_63_60_eq_0;
wire din_63_62_eq_0;
wire lead0_63_60_0;
wire din_59_56_eq_0;
wire din_59_58_eq_0;
wire lead0_59_56_0;
wire din_55_52_eq_0;
wire din_55_54_eq_0;
wire lead0_55_52_0;
wire din_51_48_eq_0;
wire din_51_50_eq_0;
wire lead0_51_48_0;
wire din_47_44_eq_0;
wire din_47_46_eq_0;
wire lead0_47_44_0;
wire din_43_40_eq_0;
wire din_43_42_eq_0;
wire lead0_43_40_0;
wire din_39_36_eq_0;
wire din_39_38_eq_0;
wire lead0_39_36_0;
wire din_35_32_eq_0;
wire din_35_34_eq_0;
wire lead0_35_32_0;
wire din_31_28_eq_0;
wire din_31_30_eq_0;
wire lead0_31_28_0;
wire din_27_24_eq_0;
wire din_27_26_eq_0;
wire lead0_27_24_0;
wire din_23_20_eq_0;
wire din_23_22_eq_0;
wire lead0_23_20_0;
wire din_19_16_eq_0;
wire din_19_18_eq_0;
wire lead0_19_16_0;
wire din_15_12_eq_0;
wire din_15_14_eq_0;
wire lead0_15_12_0;
wire din_11_8_eq_0;
wire din_11_10_eq_0;
wire lead0_11_8_0;
wire din_7_4_eq_0;
wire din_7_6_eq_0;
wire lead0_7_4_0;
wire din_3_0_eq_0;
wire din_3_2_eq_0;
wire lead0_3_0_0;
wire din_63_56_eq_0;
wire lead0_63_56_1;
wire lead0_63_56_0;
wire din_55_48_eq_0;
wire lead0_55_48_1;
wire lead0_55_48_0;
wire din_47_40_eq_0;
wire lead0_47_40_1;
wire lead0_47_40_0;
wire din_39_32_eq_0;
wire lead0_39_32_1;
wire lead0_39_32_0;
wire din_31_24_eq_0;
wire lead0_31_24_1;
wire lead0_31_24_0;
wire din_23_16_eq_0;
wire lead0_23_16_1;
wire lead0_23_16_0;
wire din_15_8_eq_0;
wire lead0_15_8_1;
wire lead0_15_8_0;
wire din_7_0_eq_0;
wire lead0_7_0_1;
wire lead0_7_0_0;
wire din_63_48_eq_0;
wire lead0_63_48_2;
wire lead0_63_48_1;
wire lead0_63_48_0;
wire din_47_32_eq_0;
wire lead0_47_32_2;
wire lead0_47_32_1;
wire lead0_47_32_0;
wire din_31_16_eq_0;
wire lead0_31_16_2;
wire lead0_31_16_1;
wire lead0_31_16_0;
wire din_15_0_eq_0;
wire lead0_15_0_2;
wire lead0_15_0_1;
wire lead0_15_0_0;
wire din_63_32_eq_0;
wire lead0_63_32_3;
wire lead0_63_32_2;
wire lead0_63_32_1;
wire din_31_0_eq_0;
wire lead0_31_0_3;
wire lead0_31_0_2;
wire lead0_31_0_1;
wire lead0_31_0_0;
wire lead0_6;
wire lead0_5;
wire lead0_4;
wire lead0_3;
wire lead0_2;
wire lead0_1;
wire lead0_0;
wire [5:0] lead0;
///////////////////////////////////////////////////////////////////////////////
//
// Instantiations of lead 0 building blocks.
//
///////////////////////////////////////////////////////////////////////////////
fpu_cnt_lead0_lvl1 i_fpu_cnt_lead0_lvl1_63_60 (
.din (din[63:60]),
.din_3_0_eq_0 (din_63_60_eq_0),
.din_3_2_eq_0 (din_63_62_eq_0),
.lead0_4b_0 (lead0_63_60_0)
);
fpu_cnt_lead0_lvl1 i_fpu_cnt_lead0_lvl1_59_56 (
.din (din[59:56]),
.din_3_0_eq_0 (din_59_56_eq_0),
.din_3_2_eq_0 (din_59_58_eq_0),
.lead0_4b_0 (lead0_59_56_0)
);
fpu_cnt_lead0_lvl1 i_fpu_cnt_lead0_lvl1_55_52 (
.din (din[55:52]),
.din_3_0_eq_0 (din_55_52_eq_0),
.din_3_2_eq_0 (din_55_54_eq_0),
.lead0_4b_0 (lead0_55_52_0)
);
fpu_cnt_lead0_lvl1 i_fpu_cnt_lead0_lvl1_51_48 (
.din (din[51:48]),
.din_3_0_eq_0 (din_51_48_eq_0),
.din_3_2_eq_0 (din_51_50_eq_0),
.lead0_4b_0 (lead0_51_48_0)
);
fpu_cnt_lead0_lvl1 i_fpu_cnt_lead0_lvl1_47_44 (
.din (din[47:44]),
.din_3_0_eq_0 (din_47_44_eq_0),
.din_3_2_eq_0 (din_47_46_eq_0),
.lead0_4b_0 (lead0_47_44_0)
);
fpu_cnt_lead0_lvl1 i_fpu_cnt_lead0_lvl1_43_40 (
.din (din[43:40]),
.din_3_0_eq_0 (din_43_40_eq_0),
.din_3_2_eq_0 (din_43_42_eq_0),
.lead0_4b_0 (lead0_43_40_0)
);
fpu_cnt_lead0_lvl1 i_fpu_cnt_lead0_lvl1_39_36 (
.din (din[39:36]),
.din_3_0_eq_0 (din_39_36_eq_0),
.din_3_2_eq_0 (din_39_38_eq_0),
.lead0_4b_0 (lead0_39_36_0)
);
fpu_cnt_lead0_lvl1 i_fpu_cnt_lead0_lvl1_35_32 (
.din (din[35:32]),
.din_3_0_eq_0 (din_35_32_eq_0),
.din_3_2_eq_0 (din_35_34_eq_0),
.lead0_4b_0 (lead0_35_32_0)
);
fpu_cnt_lead0_lvl1 i_fpu_cnt_lead0_lvl1_31_28 (
.din (din[31:28]),
.din_3_0_eq_0 (din_31_28_eq_0),
.din_3_2_eq_0 (din_31_30_eq_0),
.lead0_4b_0 (lead0_31_28_0)
);
fpu_cnt_lead0_lvl1 i_fpu_cnt_lead0_lvl1_27_24 (
.din (din[27:24]),
.din_3_0_eq_0 (din_27_24_eq_0),
.din_3_2_eq_0 (din_27_26_eq_0),
.lead0_4b_0 (lead0_27_24_0)
);
fpu_cnt_lead0_lvl1 i_fpu_cnt_lead0_lvl1_23_20 (
.din (din[23:20]),
.din_3_0_eq_0 (din_23_20_eq_0),
.din_3_2_eq_0 (din_23_22_eq_0),
.lead0_4b_0 (lead0_23_20_0)
);
fpu_cnt_lead0_lvl1 i_fpu_cnt_lead0_lvl1_19_16 (
.din (din[19:16]),
.din_3_0_eq_0 (din_19_16_eq_0),
.din_3_2_eq_0 (din_19_18_eq_0),
.lead0_4b_0 (lead0_19_16_0)
);
fpu_cnt_lead0_lvl1 i_fpu_cnt_lead0_lvl1_15_12 (
.din (din[15:12]),
.din_3_0_eq_0 (din_15_12_eq_0),
.din_3_2_eq_0 (din_15_14_eq_0),
.lead0_4b_0 (lead0_15_12_0)
);
fpu_cnt_lead0_lvl1 i_fpu_cnt_lead0_lvl1_11_8 (
.din (din[11:8]),
.din_3_0_eq_0 (din_11_8_eq_0),
.din_3_2_eq_0 (din_11_10_eq_0),
.lead0_4b_0 (lead0_11_8_0)
);
fpu_cnt_lead0_lvl1 i_fpu_cnt_lead0_lvl1_7_4 (
.din (din[7:4]),
.din_3_0_eq_0 (din_7_4_eq_0),
.din_3_2_eq_0 (din_7_6_eq_0),
.lead0_4b_0 (lead0_7_4_0)
);
fpu_cnt_lead0_lvl1 i_fpu_cnt_lead0_lvl1_3_0 (
.din (din[3:0]),
.din_3_0_eq_0 (din_3_0_eq_0),
.din_3_2_eq_0 (din_3_2_eq_0),
.lead0_4b_0 (lead0_3_0_0)
);
fpu_cnt_lead0_lvl2 i_fpu_cnt_lead0_lvl2_63_56 (
.din_7_4_eq_0 (din_63_60_eq_0),
.din_7_6_eq_0 (din_63_62_eq_0),
.lead0_4b_0_hi (lead0_63_60_0),
.din_3_0_eq_0 (din_59_56_eq_0),
.din_3_2_eq_0 (din_59_58_eq_0),
.lead0_4b_0_lo (lead0_59_56_0),
.din_7_0_eq_0 (din_63_56_eq_0),
.lead0_8b_1 (lead0_63_56_1),
.lead0_8b_0 (lead0_63_56_0)
);
fpu_cnt_lead0_lvl2 i_fpu_cnt_lead0_lvl2_55_48 (
.din_7_4_eq_0 (din_55_52_eq_0),
.din_7_6_eq_0 (din_55_54_eq_0),
.lead0_4b_0_hi (lead0_55_52_0),
.din_3_0_eq_0 (din_51_48_eq_0),
.din_3_2_eq_0 (din_51_50_eq_0),
.lead0_4b_0_lo (lead0_51_48_0),
.din_7_0_eq_0 (din_55_48_eq_0),
.lead0_8b_1 (lead0_55_48_1),
.lead0_8b_0 (lead0_55_48_0)
);
fpu_cnt_lead0_lvl2 i_fpu_cnt_lead0_lvl2_47_40 (
.din_7_4_eq_0 (din_47_44_eq_0),
.din_7_6_eq_0 (din_47_46_eq_0),
.lead0_4b_0_hi (lead0_47_44_0),
.din_3_0_eq_0 (din_43_40_eq_0),
.din_3_2_eq_0 (din_43_42_eq_0),
.lead0_4b_0_lo (lead0_43_40_0),
.din_7_0_eq_0 (din_47_40_eq_0),
.lead0_8b_1 (lead0_47_40_1),
.lead0_8b_0 (lead0_47_40_0)
);
fpu_cnt_lead0_lvl2 i_fpu_cnt_lead0_lvl2_39_32 (
.din_7_4_eq_0 (din_39_36_eq_0),
.din_7_6_eq_0 (din_39_38_eq_0),
.lead0_4b_0_hi (lead0_39_36_0),
.din_3_0_eq_0 (din_35_32_eq_0),
.din_3_2_eq_0 (din_35_34_eq_0),
.lead0_4b_0_lo (lead0_35_32_0),
.din_7_0_eq_0 (din_39_32_eq_0),
.lead0_8b_1 (lead0_39_32_1),
.lead0_8b_0 (lead0_39_32_0)
);
fpu_cnt_lead0_lvl2 i_fpu_cnt_lead0_lvl2_31_24 (
.din_7_4_eq_0 (din_31_28_eq_0),
.din_7_6_eq_0 (din_31_30_eq_0),
.lead0_4b_0_hi (lead0_31_28_0),
.din_3_0_eq_0 (din_27_24_eq_0),
.din_3_2_eq_0 (din_27_26_eq_0),
.lead0_4b_0_lo (lead0_27_24_0),
.din_7_0_eq_0 (din_31_24_eq_0),
.lead0_8b_1 (lead0_31_24_1),
.lead0_8b_0 (lead0_31_24_0)
);
fpu_cnt_lead0_lvl2 i_fpu_cnt_lead0_lvl2_23_16 (
.din_7_4_eq_0 (din_23_20_eq_0),
.din_7_6_eq_0 (din_23_22_eq_0),
.lead0_4b_0_hi (lead0_23_20_0),
.din_3_0_eq_0 (din_19_16_eq_0),
.din_3_2_eq_0 (din_19_18_eq_0),
.lead0_4b_0_lo (lead0_19_16_0),
.din_7_0_eq_0 (din_23_16_eq_0),
.lead0_8b_1 (lead0_23_16_1),
.lead0_8b_0 (lead0_23_16_0)
);
fpu_cnt_lead0_lvl2 i_fpu_cnt_lead0_lvl2_15_8 (
.din_7_4_eq_0 (din_15_12_eq_0),
.din_7_6_eq_0 (din_15_14_eq_0),
.lead0_4b_0_hi (lead0_15_12_0),
.din_3_0_eq_0 (din_11_8_eq_0),
.din_3_2_eq_0 (din_11_10_eq_0),
.lead0_4b_0_lo (lead0_11_8_0),
.din_7_0_eq_0 (din_15_8_eq_0),
.lead0_8b_1 (lead0_15_8_1),
.lead0_8b_0 (lead0_15_8_0)
);
fpu_cnt_lead0_lvl2 i_fpu_cnt_lead0_lvl2_7_0 (
.din_7_4_eq_0 (din_7_4_eq_0),
.din_7_6_eq_0 (din_7_6_eq_0),
.lead0_4b_0_hi (lead0_7_4_0),
.din_3_0_eq_0 (din_3_0_eq_0),
.din_3_2_eq_0 (din_3_2_eq_0),
.lead0_4b_0_lo (lead0_3_0_0),
.din_7_0_eq_0 (din_7_0_eq_0),
.lead0_8b_1 (lead0_7_0_1),
.lead0_8b_0 (lead0_7_0_0)
);
fpu_cnt_lead0_lvl3 i_fpu_cnt_lead0_lvl3_63_48 (
.din_15_8_eq_0 (din_63_56_eq_0),
.din_15_12_eq_0 (din_63_60_eq_0),
.lead0_8b_1_hi (lead0_63_56_1),
.lead0_8b_0_hi (lead0_63_56_0),
.din_7_0_eq_0 (din_55_48_eq_0),
.din_7_4_eq_0 (din_55_52_eq_0),
.lead0_8b_1_lo (lead0_55_48_1),
.lead0_8b_0_lo (lead0_55_48_0),
.din_15_0_eq_0 (din_63_48_eq_0),
.lead0_16b_2 (lead0_63_48_2),
.lead0_16b_1 (lead0_63_48_1),
.lead0_16b_0 (lead0_63_48_0)
);
fpu_cnt_lead0_lvl3 i_fpu_cnt_lead0_lvl3_47_32 (
.din_15_8_eq_0 (din_47_40_eq_0),
.din_15_12_eq_0 (din_47_44_eq_0),
.lead0_8b_1_hi (lead0_47_40_1),
.lead0_8b_0_hi (lead0_47_40_0),
.din_7_0_eq_0 (din_39_32_eq_0),
.din_7_4_eq_0 (din_39_36_eq_0),
.lead0_8b_1_lo (lead0_39_32_1),
.lead0_8b_0_lo (lead0_39_32_0),
.din_15_0_eq_0 (din_47_32_eq_0),
.lead0_16b_2 (lead0_47_32_2),
.lead0_16b_1 (lead0_47_32_1),
.lead0_16b_0 (lead0_47_32_0)
);
fpu_cnt_lead0_lvl3 i_fpu_cnt_lead0_lvl3_31_16 (
.din_15_8_eq_0 (din_31_24_eq_0),
.din_15_12_eq_0 (din_31_28_eq_0),
.lead0_8b_1_hi (lead0_31_24_1),
.lead0_8b_0_hi (lead0_31_24_0),
.din_7_0_eq_0 (din_23_16_eq_0),
.din_7_4_eq_0 (din_23_20_eq_0),
.lead0_8b_1_lo (lead0_23_16_1),
.lead0_8b_0_lo (lead0_23_16_0),
.din_15_0_eq_0 (din_31_16_eq_0),
.lead0_16b_2 (lead0_31_16_2),
.lead0_16b_1 (lead0_31_16_1),
.lead0_16b_0 (lead0_31_16_0)
);
fpu_cnt_lead0_lvl3 i_fpu_cnt_lead0_lvl3_15_0 (
.din_15_8_eq_0 (din_15_8_eq_0),
.din_15_12_eq_0 (din_15_12_eq_0),
.lead0_8b_1_hi (lead0_15_8_1),
.lead0_8b_0_hi (lead0_15_8_0),
.din_7_0_eq_0 (din_7_0_eq_0),
.din_7_4_eq_0 (din_7_4_eq_0),
.lead0_8b_1_lo (lead0_7_0_1),
.lead0_8b_0_lo (lead0_7_0_0),
.din_15_0_eq_0 (din_15_0_eq_0),
.lead0_16b_2 (lead0_15_0_2),
.lead0_16b_1 (lead0_15_0_1),
.lead0_16b_0 (lead0_15_0_0)
);
fpu_cnt_lead0_lvl4 i_fpu_cnt_lead0_lvl4_63_32 (
.din_31_16_eq_0 (din_63_48_eq_0),
.din_31_24_eq_0 (din_63_56_eq_0),
.lead0_16b_2_hi (lead0_63_48_2),
.lead0_16b_1_hi (lead0_63_48_1),
.lead0_16b_0_hi (lead0_63_48_0),
.din_15_0_eq_0 (din_47_32_eq_0),
.din_15_8_eq_0 (din_47_40_eq_0),
.lead0_16b_2_lo (lead0_47_32_2),
.lead0_16b_1_lo (lead0_47_32_1),
.lead0_16b_0_lo (lead0_47_32_0),
.din_31_0_eq_0 (din_63_32_eq_0),
.lead0_32b_3 (lead0_63_32_3),
.lead0_32b_2 (lead0_63_32_2),
.lead0_32b_1 (lead0_63_32_1),
.lead0_32b_0 (lead0_63_32_0)
);
fpu_cnt_lead0_lvl4 i_fpu_cnt_lead0_lvl4_31_0 (
.din_31_16_eq_0 (din_31_16_eq_0),
.din_31_24_eq_0 (din_31_24_eq_0),
.lead0_16b_2_hi (lead0_31_16_2),
.lead0_16b_1_hi (lead0_31_16_1),
.lead0_16b_0_hi (lead0_31_16_0),
.din_15_0_eq_0 (din_15_0_eq_0),
.din_15_8_eq_0 (din_15_8_eq_0),
.lead0_16b_2_lo (lead0_15_0_2),
.lead0_16b_1_lo (lead0_15_0_1),
.lead0_16b_0_lo (lead0_15_0_0),
.din_31_0_eq_0 (din_31_0_eq_0),
.lead0_32b_3 (lead0_31_0_3),
.lead0_32b_2 (lead0_31_0_2),
.lead0_32b_1 (lead0_31_0_1),
.lead0_32b_0 (lead0_31_0_0)
);
assign lead0_6= din_63_32_eq_0 && din_31_0_eq_0;
assign lead0_5= (!lead0_6) && din_63_32_eq_0;
assign lead0_4= ((!din_63_32_eq_0) && din_63_48_eq_0)
|| (din_63_32_eq_0 && din_31_16_eq_0 && (!lead0_6));
assign lead0_3= ((!din_63_32_eq_0) && lead0_63_32_3)
|| (din_63_32_eq_0 && lead0_31_0_3 && (!lead0_6));
assign lead0_2= ((!din_63_32_eq_0) && lead0_63_32_2)
|| (din_63_32_eq_0 && lead0_31_0_2 && (!lead0_6));
assign lead0_1= ((!din_63_32_eq_0) && lead0_63_32_1)
|| (din_63_32_eq_0 && lead0_31_0_1 && (!lead0_6));
assign lead0_0= ((!din_63_32_eq_0) && lead0_63_32_0)
|| (din_63_32_eq_0 && lead0_31_0_0 && (!lead0_6));
assign lead0[5:0]= {lead0_5, lead0_4, lead0_3, lead0_2, lead0_1,
lead0_0};
endmodule