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.
271 lines
11 KiB
VHDL
271 lines
11 KiB
VHDL
-- © 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.
|
|
|
|
|
|
library ieee,ibm,support,tri,work;
|
|
use ieee.std_logic_1164.all;
|
|
use ibm.std_ulogic_unsigned.all;
|
|
use ibm.std_ulogic_support.all;
|
|
use ibm.std_ulogic_function_support.all;
|
|
use support.power_logic_pkg.all;
|
|
use tri.tri_latches_pkg.all;
|
|
use ibm.std_ulogic_ao_support.all;
|
|
use ibm.std_ulogic_mux_support.all;
|
|
|
|
|
|
entity xuq_add is
|
|
generic( expand_type : integer := 2 ); -- 0 - ibm tech, 1 - other );
|
|
port(
|
|
x_b :in std_ulogic_vector(0 to 63) ; -- after xor
|
|
y_b :in std_ulogic_vector(0 to 63) ;
|
|
ci :in std_ulogic_vector(8 to 8) ;
|
|
|
|
sum :out std_ulogic_vector(0 to 63);
|
|
cout_32 :out std_ulogic ;
|
|
cout_0 :out std_ulogic
|
|
);
|
|
|
|
|
|
end xuq_add; -- ENTITY
|
|
|
|
architecture xuq_add of xuq_add is
|
|
|
|
constant tiup : std_ulogic := '1';
|
|
constant tidn : std_ulogic := '0';
|
|
|
|
signal g01, g01_b :std_ulogic_vector(0 to 63);
|
|
signal t01, t01_b :std_ulogic_vector(0 to 63);
|
|
signal sum_0, sum_1 :std_ulogic_vector(0 to 63);
|
|
signal g08 :std_ulogic_vector(0 to 7);
|
|
signal t08 :std_ulogic_vector(0 to 7);
|
|
signal c64_b :std_ulogic_vector(0 to 7);
|
|
signal cout_32x , cout_32y_b :std_ulogic;
|
|
signal ci_cp1_lv1_b , ci_cp1_lv2 , ci_cp1_lv3_b , ci_cp1_lv4 :std_ulogic;
|
|
signal ci_cp2_lv2 , ci_cp2_lv3_b :std_ulogic;
|
|
|
|
|
|
begin
|
|
|
|
|
|
|
|
u_ci_11: ci_cp1_lv1_b <= not ci(8) ; -- x2
|
|
u_ci_12: ci_cp1_lv2 <= not ci_cp1_lv1_b ; -- x2
|
|
u_ci_13: ci_cp1_lv3_b <= not ci_cp1_lv2 ; -- x3
|
|
u_ci_14: ci_cp1_lv4 <= not ci_cp1_lv3_b ; -- x4
|
|
|
|
u_ci_22: ci_cp2_lv2 <= not ci_cp1_lv1_b ; -- x2
|
|
u_ci_23: ci_cp2_lv3_b <= not ci_cp2_lv2 ; -- x3
|
|
|
|
|
|
--//##################################################
|
|
--//## pgt
|
|
--//##################################################
|
|
|
|
u_g01: g01(0 to 63) <= not( x_b(0 to 63) or y_b(0 to 63) );
|
|
u_t01: t01(0 to 63) <= not( x_b(0 to 63) and y_b(0 to 63) );
|
|
u_g01b: g01_b(0 to 63) <= not g01(0 to 63); -- small, buffer off
|
|
u_t01b: t01_b(0 to 63) <= not t01(0 to 63); -- small, buffer off
|
|
|
|
|
|
--//##################################################
|
|
--//## local part of byte group
|
|
--//##################################################
|
|
|
|
loc_0: entity work.xuq_add_loc(xuq_add_loc) port map(
|
|
g01_b(0 to 7) => g01_b(0 to 7) ,--i--
|
|
t01_b(0 to 7) => t01_b(0 to 7) ,--i--
|
|
sum_0(0 to 7) => sum_0(0 to 7) ,--o--
|
|
sum_1(0 to 7) => sum_1(0 to 7) );--o--
|
|
|
|
loc_1: entity work.xuq_add_loc(xuq_add_loc) port map(
|
|
g01_b(0 to 7) => g01_b(8 to 15) ,--i--
|
|
t01_b(0 to 7) => t01_b(8 to 15) ,--i--
|
|
sum_0(0 to 7) => sum_0(8 to 15) ,--o--
|
|
sum_1(0 to 7) => sum_1(8 to 15) );--o--
|
|
|
|
loc_2: entity work.xuq_add_loc(xuq_add_loc) port map(
|
|
g01_b(0 to 7) => g01_b(16 to 23) ,--i--
|
|
t01_b(0 to 7) => t01_b(16 to 23) ,--i--
|
|
sum_0(0 to 7) => sum_0(16 to 23) ,--o--
|
|
sum_1(0 to 7) => sum_1(16 to 23) );--o--
|
|
|
|
loc_3: entity work.xuq_add_loc(xuq_add_loc) port map(
|
|
g01_b(0 to 7) => g01_b(24 to 31) ,--i--
|
|
t01_b(0 to 7) => t01_b(24 to 31) ,--i--
|
|
sum_0(0 to 7) => sum_0(24 to 31) ,--o--
|
|
sum_1(0 to 7) => sum_1(24 to 31) );--o--
|
|
|
|
loc_4: entity work.xuq_add_loc(xuq_add_loc) port map(
|
|
g01_b(0 to 7) => g01_b(32 to 39) ,--i--
|
|
t01_b(0 to 7) => t01_b(32 to 39) ,--i--
|
|
sum_0(0 to 7) => sum_0(32 to 39) ,--o--
|
|
sum_1(0 to 7) => sum_1(32 to 39) );--o--
|
|
|
|
loc_5: entity work.xuq_add_loc(xuq_add_loc) port map(
|
|
g01_b(0 to 7) => g01_b(40 to 47) ,--i--
|
|
t01_b(0 to 7) => t01_b(40 to 47) ,--i--
|
|
sum_0(0 to 7) => sum_0(40 to 47) ,--o--
|
|
sum_1(0 to 7) => sum_1(40 to 47) );--o--
|
|
|
|
loc_6: entity work.xuq_add_loc(xuq_add_loc) port map(
|
|
g01_b(0 to 7) => g01_b(48 to 55) ,--i--
|
|
t01_b(0 to 7) => t01_b(48 to 55) ,--i--
|
|
sum_0(0 to 7) => sum_0(48 to 55) ,--o--
|
|
sum_1(0 to 7) => sum_1(48 to 55) );--o--
|
|
|
|
loc_7: entity work.xuq_add_loc(xuq_add_loc) port map(
|
|
g01_b(0 to 7) => g01_b(56 to 63) ,--i--
|
|
t01_b(0 to 7) => t01_b(56 to 63) ,--i--
|
|
sum_0(0 to 7) => sum_0(56 to 63) ,--o--
|
|
sum_1(0 to 7) => sum_1(56 to 63) );--o--
|
|
|
|
|
|
--//##################################################
|
|
--//## local part of global carry
|
|
--//##################################################
|
|
|
|
gclc_0: entity work.xuq_add_glbloc(xuq_add_glbloc) port map(
|
|
g01(0 to 7) => g01(0 to 7) ,--i--
|
|
t01(0 to 7) => t01(0 to 7) ,--i--
|
|
g08 => g08(0) ,--o--
|
|
t08 => t08(0) );--o--
|
|
|
|
gclc_1: entity work.xuq_add_glbloc(xuq_add_glbloc) port map(
|
|
g01(0 to 7) => g01(8 to 15) ,--i--
|
|
t01(0 to 7) => t01(8 to 15) ,--i--
|
|
g08 => g08(1) ,--o--
|
|
t08 => t08(1) );--o--
|
|
|
|
gclc_2: entity work.xuq_add_glbloc(xuq_add_glbloc) port map(
|
|
g01(0 to 7) => g01(16 to 23) ,--i--
|
|
t01(0 to 7) => t01(16 to 23) ,--i--
|
|
g08 => g08(2) ,--o--
|
|
t08 => t08(2) );--o--
|
|
|
|
gclc_3: entity work.xuq_add_glbloc(xuq_add_glbloc) port map(
|
|
g01(0 to 7) => g01(24 to 31) ,--i--
|
|
t01(0 to 7) => t01(24 to 31) ,--i--
|
|
g08 => g08(3) ,--o--
|
|
t08 => t08(3) );--o--
|
|
|
|
gclc_4: entity work.xuq_add_glbloc(xuq_add_glbloc) port map(
|
|
g01(0 to 7) => g01(32 to 39) ,--i--
|
|
t01(0 to 7) => t01(32 to 39) ,--i--
|
|
g08 => g08(4) ,--o--
|
|
t08 => t08(4) );--o--
|
|
|
|
gclc_5: entity work.xuq_add_glbloc(xuq_add_glbloc) port map(
|
|
g01(0 to 7) => g01(40 to 47) ,--i--
|
|
t01(0 to 7) => t01(40 to 47) ,--i--
|
|
g08 => g08(5) ,--o--
|
|
t08 => t08(5) );--o--
|
|
|
|
gclc_6: entity work.xuq_add_glbloc(xuq_add_glbloc) port map(
|
|
g01(0 to 7) => g01(48 to 55) ,--i--
|
|
t01(0 to 7) => t01(48 to 55) ,--i--
|
|
g08 => g08(6) ,--o--
|
|
t08 => t08(6) );--o--
|
|
|
|
gclc_7: entity work.xuq_add_glbloc(xuq_add_glbloc) port map(
|
|
g01(0 to 7) => g01(56 to 63) ,--i--
|
|
t01(0 to 7) => t01(56 to 63) ,--i--
|
|
g08 => g08(7) ,--o--
|
|
t08 => t08(7) );--o--
|
|
|
|
|
|
--//##################################################
|
|
--//## global part of global carry
|
|
--//##################################################
|
|
|
|
gc: entity work.xuq_add_glbglbci(xuq_add_glbglbci) port map(
|
|
g08(0 to 7) => g08(0 to 7) ,--i--
|
|
t08(0 to 7) => t08(0 to 7) ,--i--
|
|
ci => ci_cp1_lv4 ,--i--
|
|
c64_b(0 to 7) => c64_b(0 to 7) );--o--
|
|
|
|
u_c32x: cout_32x <= not c64_b(4) ; --(small)
|
|
u_c32y: cout_32y_b <= not cout_32x ;
|
|
u_c32: cout_32 <= not cout_32y_b ; --output--
|
|
|
|
u_c64: cout_0 <= not c64_b(0) ; --output-- --rename--
|
|
|
|
--//##################################################
|
|
--//## final mux
|
|
--//##################################################
|
|
|
|
fm_0: entity work.xuq_add_csmux(xuq_add_csmux) port map(
|
|
ci_b => c64_b(1) ,--i--
|
|
sum_0(0 to 7) => sum_0(0 to 7) ,--i--
|
|
sum_1(0 to 7) => sum_1(0 to 7) ,--i--
|
|
sum (0 to 7) => sum (0 to 7) );--o--
|
|
|
|
fm_1: entity work.xuq_add_csmux(xuq_add_csmux) port map(
|
|
ci_b => c64_b(2) ,--i--
|
|
sum_0(0 to 7) => sum_0(8 to 15) ,--i--
|
|
sum_1(0 to 7) => sum_1(8 to 15) ,--i--
|
|
sum (0 to 7) => sum (8 to 15) );--o--
|
|
|
|
fm_2: entity work.xuq_add_csmux(xuq_add_csmux) port map(
|
|
ci_b => c64_b(3) ,--i--
|
|
sum_0(0 to 7) => sum_0(16 to 23) ,--i--
|
|
sum_1(0 to 7) => sum_1(16 to 23) ,--i--
|
|
sum (0 to 7) => sum (16 to 23) );--o--
|
|
|
|
fm_3: entity work.xuq_add_csmux(xuq_add_csmux) port map(
|
|
ci_b => c64_b(4) ,--i--
|
|
sum_0(0 to 7) => sum_0(24 to 31) ,--i--
|
|
sum_1(0 to 7) => sum_1(24 to 31) ,--i--
|
|
sum (0 to 7) => sum (24 to 31) );--o--
|
|
|
|
fm_4: entity work.xuq_add_csmux(xuq_add_csmux) port map(
|
|
ci_b => c64_b(5) ,--i--
|
|
sum_0(0 to 7) => sum_0(32 to 39) ,--i--
|
|
sum_1(0 to 7) => sum_1(32 to 39) ,--i--
|
|
sum (0 to 7) => sum (32 to 39) );--o--
|
|
|
|
fm_5: entity work.xuq_add_csmux(xuq_add_csmux) port map(
|
|
ci_b => c64_b(6) ,--i--
|
|
sum_0(0 to 7) => sum_0(40 to 47) ,--i--
|
|
sum_1(0 to 7) => sum_1(40 to 47) ,--i--
|
|
sum (0 to 7) => sum (40 to 47) );--o--
|
|
|
|
fm_6: entity work.xuq_add_csmux(xuq_add_csmux) port map(
|
|
ci_b => c64_b(7) ,--i--
|
|
sum_0(0 to 7) => sum_0(48 to 55) ,--i--
|
|
sum_1(0 to 7) => sum_1(48 to 55) ,--i--
|
|
sum (0 to 7) => sum (48 to 55) );--o--
|
|
|
|
fm_7: entity work.xuq_add_csmux(xuq_add_csmux) port map(
|
|
ci_b => ci_cp2_lv3_b ,--i--
|
|
sum_0(0 to 7) => sum_0(56 to 63) ,--i--
|
|
sum_1(0 to 7) => sum_1(56 to 63) ,--i--
|
|
sum (0 to 7) => sum (56 to 63) );--o--
|
|
|
|
end; -- xuq_add ARCHITECTURE
|
|
|