You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

245 lines
7.9 KiB
Verilog

// © IBM Corp. 2020
// Licensed under the Apache License, Version 2.0 (the "License"), as modified by
// the terms below; you may not use the files in this repository except in
// compliance with the License as modified.
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
//
// Modified Terms:
//
// 1) For the purpose of the patent license granted to you in Section 3 of the
// License, the "Work" hereby includes implementations of the work of authorship
// in physical form.
//
// 2) Notwithstanding any terms to the contrary in the License, any licenses
// necessary for implementation of the Work that are available from OpenPOWER
// via the Power ISA End User License Agreement (EULA) are explicitly excluded
// hereunder, and may be obtained from OpenPOWER under the terms and conditions
// of the EULA.
//
// Unless required by applicable law or agreed to in writing, the reference design
// 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.
//
// Additional rights, including the ability to physically implement a softcore that
// is compliant with the required sections of the Power ISA Specification, are
// available at no cost under the terms of the OpenPOWER Power ISA EULA, which can be
// obtained (along with the Power ISA) here: https://openpowerfoundation.org.
// input phase is importent
// (change X (B) by switching xor/xnor )
`timescale 1 ns / 1 ns
`include "tri_a2o.vh"
module lq_agen_lo(
x_b,
y_b,
sum,
sum_arr,
dir_ig_57_b
);
input [0:11] x_b; // after xor
input [0:11] y_b;
input dir_ig_57_b; // when this is low , bit 57 becomes "1" .
output [0:11] sum;
output [0:5] sum_arr;
wire [0:11] p01_b;
wire [0:11] p01;
wire [1:11] g01;
wire [1:10] t01;
wire [0:11] sum_x;
wire [0:11] sum_b;
wire sum_x_11_b;
wire [1:11] g12_x_b;
wire [1:11] g02_b;
wire [1:11] g04;
wire [1:11] c;
wire [1:7] g12_y_b;
wire [1:3] g12_z_b;
wire [1:9] t02_b;
wire [1:7] t04;
//####################################################################
//# propagate, generate, transmit
//####################################################################
//assign g01[1:11] = (~(x_b[1:11] | y_b[1:11]));
tri_nor2 #(.WIDTH(11)) g01_1 (.y(g01[1:11]), .a(x_b[1:11]), .b(y_b[1:11]));
//assign t01[1:10] = (~(x_b[1:10] & y_b[1:10]));
tri_nand2 #(.WIDTH(10)) t01_1 (.y(t01[1:10]), .a(x_b[1:10]), .b(y_b[1:10]));
//assign p01_b[0:11] = (~(x_b[0:11] ^ y_b[0:11]));
tri_xnor2 #(.WIDTH(12)) p01_b_1 (.y(p01_b[0:11]), .a(x_b[0:11]), .b(y_b[0:11]));
//assign p01[0:11] = (~(p01_b[0:11]));
tri_inv #(.WIDTH(12)) p01_0 (.y(p01[0:11]), .a(p01_b[0:11]));
//####################################################################
//# final sum and drive
//####################################################################
//assign sum_x[0:10] = p01[0:10] ^ c[1:11];
tri_xor2 #(.WIDTH(11)) sum_x_0 (.y(sum_x[0:10]), .a(p01[0:10]), .b(c[1:11]));
//assign sum_x_11_b = (~(p01[11]));
tri_inv sum_x_11_b_11 (.y(sum_x_11_b), .a(p01[11]));
//assign sum_x[11] = (~(sum_x_11_b));
tri_inv sum_x_11 (.y(sum_x[11]), .a(sum_x_11_b));
// 00 01 02 03 04 05 06 07 08 09 10 11
// 52 53 54 55 56 57 58 59 60 61 62 63
//assign sum_b[0:11] = (~(sum_x[0:11]));
tri_inv #(.WIDTH(12)) sum_b_0 (.y(sum_b[0:11]), .a(sum_x[0:11]));
//assign sum[0:11] = (~(sum_b[0:11]));
tri_inv #(.WIDTH(12)) sum_0 (.y(sum[0:11]), .a(sum_b[0:11]));
//assign sum_arr[0] = (~(sum_b[0]));
tri_inv #(.WIDTH(5)) sum_arr_0 (.y(sum_arr[0:4]), .a(sum_b[0:4]));
//assign sum_arr[5] = (~(sum_b[5] & dir_ig_57_b)); // OR with negative inputs
tri_nand2 sum_arr_5 (.y(sum_arr[5]), .a(sum_b[5]), .b(dir_ig_57_b));
//####################################################################
//# carry path is cogge-stone
//####################################################################
//assign g02_b[1] = (~(g01[1] | (t01[1] & g01[2])));
tri_aoi21 #(.WIDTH(10)) g02_b_1 (.y(g02_b[1:10]), .a0(t01[1:10]), .a1(g01[2:11]), .b0(g01[1:10]));
//assign g02_b[11] = (~(g01[11]));
tri_inv g02_b_11 (.y(g02_b[11]), .a(g01[11]));
//assign t02_b[1] = (~(t01[1] & t01[2]));
tri_nand2 #(.WIDTH(9)) t02_b_1 (.y(t02_b[1:9]), .a(t01[1:9]), .b(t01[2:10]));
//assign g04[1] = (~(g02_b[1] & (t02_b[1] | g02_b[3])));
tri_oai21 #(.WIDTH(9)) g04_1 (.y(g04[1:9]), .a0(t02_b[1:9]), .a1(g02_b[3:11]), .b0(g02_b[1:9]));
//assign g04[10] = (~(g02_b[10]));
tri_inv #(.WIDTH(2)) g04_10 (.y(g04[10:11]), .a(g02_b[10:11]));
//assign t04[1] = (~(t02_b[1] | t02_b[3]));
tri_nor2 #(.WIDTH(7)) t04_1 (.y(t04[1:7]), .a(t02_b[1:7]), .b(t02_b[3:9]));
//assign g12_x_b[1] = (~(g04[1]));
tri_inv g12_x_b_1 (.y(g12_x_b[1]), .a(g04[1]));
//assign g12_y_b[1] = (~(t04[1] & g04[5]));
tri_nand2 g12_y_b_1 (.y(g12_y_b[1]), .a(t04[1]), .b(g04[5]));
//assign g12_z_b[1] = (~(t04[1] & t04[5] & g04[9]));
tri_nand3 g12_z_b_1 (.y(g12_z_b[1]), .a(t04[1]), .b(t04[5]), .c(g04[9]));
//assign c[1] = (~(g12_x_b[1] & g12_y_b[1] & g12_z_b[1]));
tri_nand3 c_1 (.y(c[1]), .a(g12_x_b[1]), .b(g12_y_b[1]), .c(g12_z_b[1]));
//assign g12_x_b[2] = (~(g04[2]));
tri_inv g12_x_b_2 (.y(g12_x_b[2]), .a(g04[2]));
//assign g12_y_b[2] = (~(t04[2] & g04[6]));
tri_nand2 g12_y_b_2 (.y(g12_y_b[2]), .a(t04[2]), .b(g04[6]));
//assign g12_z_b[2] = (~(t04[2] & t04[6] & g04[10]));
tri_nand3 g12_z_b_2 (.y(g12_z_b[2]), .a(t04[2]), .b(t04[6]), .c(g04[10]));
//assign c[2] = (~(g12_x_b[2] & g12_y_b[2] & g12_z_b[2]));
tri_nand3 c_2 (.y(c[2]), .a(g12_x_b[2]), .b(g12_y_b[2]), .c(g12_z_b[2]));
//assign g12_x_b[3] = (~(g04[3]));
tri_inv g12_x_b_3 (.y(g12_x_b[3]), .a(g04[3]));
//assign g12_y_b[3] = (~(t04[3] & g04[7]));
tri_nand2 g12_y_b_3 (.y(g12_y_b[3]), .a(t04[3]), .b(g04[7]));
//assign g12_z_b[3] = (~(t04[3] & t04[7] & g04[11]));
tri_nand3 g12_z_b_3 (.y(g12_z_b[3]), .a(t04[3]), .b(t04[7]), .c(g04[11]));
//assign c[3] = (~(g12_x_b[3] & g12_y_b[3] & g12_z_b[3]));
tri_nand3 c_3 (.y(c[3]), .a(g12_x_b[3]), .b(g12_y_b[3]), .c(g12_z_b[3]));
//assign g12_x_b[4] = (~(g04[4]));
tri_inv g12_x_b_4 (.y(g12_x_b[4]), .a(g04[4]));
//assign g12_y_b[4] = (~(t04[4] & g04[8]));
tri_nand2 g12_y_b_4 (.y(g12_y_b[4]), .a(t04[4]), .b(g04[8]));
//assign c[4] = (~(g12_x_b[4] & g12_y_b[4]));
tri_nand2 c_4 (.y(c[4]), .a(g12_x_b[4]), .b(g12_y_b[4]));
//assign g12_x_b[5] = (~(g04[5]));
tri_inv g12_x_b_5 (.y(g12_x_b[5]), .a(g04[5]));
//assign g12_y_b[5] = (~(t04[5] & g04[9]));
tri_nand2 g12_y_b_5 (.y(g12_y_b[5]), .a(t04[5]), .b(g04[9]));
//assign c[5] = (~(g12_x_b[5] & g12_y_b[5]));
tri_nand2 c_5 (.y(c[5]), .a(g12_x_b[5]), .b(g12_y_b[5]));
//assign g12_x_b[6] = (~(g04[6]));
tri_inv g12_x_b_6 (.y(g12_x_b[6]), .a(g04[6]));
//assign g12_y_b[6] = (~(t04[6] & g04[10]));
tri_nand2 g12_y_b_6 (.y(g12_y_b[6]), .a(t04[6]), .b(g04[10]));
//assign c[6] = (~(g12_x_b[6] & g12_y_b[6]));
tri_nand2 c_6 (.y(c[6]), .a(g12_x_b[6]), .b(g12_y_b[6]));
//assign g12_x_b[7] = (~(g04[7]));
tri_inv g12_x_b_7 (.y(g12_x_b[7]), .a(g04[7]));
//assign g12_y_b[7] = (~(t04[7] & g04[11]));
tri_nand2 g12_y_b_7 (.y(g12_y_b[7]), .a(t04[7]), .b(g04[11]));
//assign c[7] = (~(g12_x_b[7] & g12_y_b[7]));
tri_nand2 c_7 (.y(c[7]), .a(g12_x_b[7]), .b(g12_y_b[7]));
//assign g12_x_b[8] = (~(g04[8]));
tri_inv g12_x_b_8 (.y(g12_x_b[8]), .a(g04[8]));
//assign c[8] = (~(g12_x_b[8]));
tri_inv c_8 (.y(c[8]), .a(g12_x_b[8]));
//assign g12_x_b[9] = (~(g04[9]));
tri_inv g12_x_b_9 (.y(g12_x_b[9]), .a(g04[9]));
//assign c[9] = (~(g12_x_b[9]));
tri_inv c_9 (.y(c[9]), .a(g12_x_b[9]));
//assign g12_x_b[10] = (~(g04[10]));
tri_inv g12_x_b_10 (.y(g12_x_b[10]), .a(g04[10]));
//assign c[10] = (~(g12_x_b[10]));
tri_inv c_10 (.y(c[10]), .a(g12_x_b[10]));
//assign g12_x_b[11] = (~(g04[11]));
tri_inv g12_x_b_11 (.y(g12_x_b[11]), .a(g04[11]));
//assign c[11] = (~(g12_x_b[11]));
tri_inv c_11 (.y(c[11]), .a(g12_x_b[11]));
endmodule