1c6d43980SLemover/*************************************************************************************** 2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3*f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory 4c6d43980SLemover* 5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2. 6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2. 7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at: 8c6d43980SLemover* http://license.coscl.org.cn/MulanPSL2 9c6d43980SLemover* 10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13c6d43980SLemover* 14c6d43980SLemover* See the Mulan PSL v2 for more details. 15c6d43980SLemover***************************************************************************************/ 16c6d43980SLemover 177f1506e3SLinJiaweipackage xiangshan.backend.fu.util 187f1506e3SLinJiawei 197f1506e3SLinJiaweiimport chisel3._ 207f1506e3SLinJiaweiimport chisel3.util._ 217f1506e3SLinJiawei 227f1506e3SLinJiaweiabstract class CarrySaveAdderMToN(m: Int, n: Int)(len: Int) extends Module{ 237f1506e3SLinJiawei val io = IO(new Bundle() { 247f1506e3SLinJiawei val in = Input(Vec(m, UInt(len.W))) 257f1506e3SLinJiawei val out = Output(Vec(n, UInt(len.W))) 267f1506e3SLinJiawei }) 277f1506e3SLinJiawei} 287f1506e3SLinJiawei 297f1506e3SLinJiaweiclass CSA2_2(len: Int) extends CarrySaveAdderMToN(2, 2)(len) { 307f1506e3SLinJiawei val temp = Wire(Vec(len, UInt(2.W))) 317f1506e3SLinJiawei for((t, i) <- temp.zipWithIndex){ 327f1506e3SLinJiawei val (a, b) = (io.in(0)(i), io.in(1)(i)) 337f1506e3SLinJiawei val sum = a ^ b 347f1506e3SLinJiawei val cout = a & b 357f1506e3SLinJiawei t := Cat(cout, sum) 367f1506e3SLinJiawei } 377f1506e3SLinJiawei io.out.zipWithIndex.foreach({case(x, i) => x := Cat(temp.reverse map(_(i)))}) 387f1506e3SLinJiawei} 397f1506e3SLinJiawei 407f1506e3SLinJiaweiclass CSA3_2(len: Int) extends CarrySaveAdderMToN(3, 2)(len){ 417f1506e3SLinJiawei val temp = Wire(Vec(len, UInt(2.W))) 427f1506e3SLinJiawei for((t, i) <- temp.zipWithIndex){ 437f1506e3SLinJiawei val (a, b, cin) = (io.in(0)(i), io.in(1)(i), io.in(2)(i)) 447f1506e3SLinJiawei val a_xor_b = a ^ b 457f1506e3SLinJiawei val a_and_b = a & b 467f1506e3SLinJiawei val sum = a_xor_b ^ cin 477f1506e3SLinJiawei val cout = a_and_b | (a_xor_b & cin) 487f1506e3SLinJiawei t := Cat(cout, sum) 497f1506e3SLinJiawei } 507f1506e3SLinJiawei io.out.zipWithIndex.foreach({case(x, i) => x := Cat(temp.reverse map(_(i)))}) 517f1506e3SLinJiawei} 527f1506e3SLinJiawei 537f1506e3SLinJiaweiclass CSA5_3(len: Int)extends CarrySaveAdderMToN(5, 3)(len){ 547f1506e3SLinJiawei val FAs = Array.fill(2)(Module(new CSA3_2(len))) 557f1506e3SLinJiawei FAs(0).io.in := io.in.take(3) 567f1506e3SLinJiawei FAs(1).io.in := VecInit(FAs(0).io.out(0), io.in(3), io.in(4)) 577f1506e3SLinJiawei io.out := VecInit(FAs(1).io.out(0), FAs(0).io.out(1), FAs(1).io.out(1)) 587f1506e3SLinJiawei} 597f1506e3SLinJiawei 607f1506e3SLinJiaweiclass C22 extends CSA2_2(1) 617f1506e3SLinJiaweiclass C32 extends CSA3_2(1) 627f1506e3SLinJiaweiclass C53 extends CSA5_3(1) 637f1506e3SLinJiawei 64