blob: 729d813ded3e322d96b339994a139804c3c5d151 [file] [log] [blame]
// Copyright 2024 Google LLC
//
// 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.
package common
import chisel3._
import chisel3.util._
import chiseltest._
/** Effectively "reinterpret_casts" a float32 into a BigInt. BigInt is used
* because there's no easy uint32 type in scala, but BigInt works well enough
* for Chisel use cases.
* @param f A scala float.
* @return A BigInt (representing uint32) bit interpretation of the float.
*/
object Float2BigInt {
def apply(f: Float): BigInt = {
val abs = f.abs
var int = BigInt(java.lang.Float.floatToIntBits(abs))
if (f < 0) {
int += (BigInt(1) << 31)
}
int
}
}
/** Breaks down a float32 into it's sign, exponent and mantissa.
* @param f A scala float.
* @return A tuple of the sign, exponent and mantissa.
*/
object Float2Bits {
def apply(f: Float): (Boolean, Int, Int) = {
val abs = f.abs
var int = java.lang.Float.floatToIntBits(abs)
val sign: Boolean = (f < 0)
val exponent: Int = int >> 23
val mantissa: Int = int & ((1 << 23) - 1)
(sign, exponent, mantissa)
}
}
/** Pokes a float.
* @param dut The float input.
* @param f A scala float.
*/
object PokeFloat {
def apply(dut: Fp32, f: Float) = {
val int = java.lang.Float.floatToRawIntBits(f)
val sign = if (int < 0) { true.B } else { false.B }
val mantissa = int & 0x7FFFFF
val exponent = (int >> 23) & 0xFF
dut.sign.poke(sign)
dut.mantissa.poke(mantissa)
dut.exponent.poke(exponent)
}
}
/** Peeks a float.
* @param dut The float input.
* @param f A scala float.
*/
object PeekFloat {
def apply(dut: Fp32): Float = {
val sign = dut.sign.peekInt().toInt
val exponent = dut.exponent.peekInt().toInt
val mantissa = dut.mantissa.peekInt().toInt
val i = (sign << 31) + (exponent << 23) + mantissa
java.lang.Float.intBitsToFloat(i)
}
}