calyx_utils/
float.rs

1//! Implement parsing and generation for floating point constants used by std_float_const.
2
3use crate::{CalyxResult, Error};
4
5pub fn parse(rep: u64, width: u64, fl: String) -> CalyxResult<u64> {
6    if rep != 0 {
7        return Err(Error::misc(format!(
8            "Unknown representation: {rep}. Support representations: 0 (IEEE754)"
9        )));
10    }
11
12    let bits: u64 = match width {
13        32 => {
14            let fl = fl.parse::<f32>().map_err(|e| {
15                Error::misc(format!(
16                    "Expected valid floating point number: {e}"
17                ))
18            })?;
19            fl.to_bits() as u64
20        }
21        64 => {
22            let fl = fl.parse::<f64>().map_err(|e| {
23                Error::misc(format!(
24                    "Expected valid floating point number: {e}"
25                ))
26            })?;
27            fl.to_bits()
28        }
29        r => {
30            return Err(Error::misc(format!(
31                "Unsupported floating point width: {r}. Supported values: 32, 64"
32            )));
33        }
34    };
35
36    Ok(bits)
37}
38
39pub fn emit(bits: u64, width: u64) -> CalyxResult<String> {
40    match width {
41        32 => {
42            let fl = f32::from_bits(bits as u32);
43            Ok(format!("{fl}"))
44        }
45        64 => {
46            let fl = f64::from_bits(bits);
47            Ok(format!("{fl}"))
48        }
49        r => Err(Error::misc(format!(
50            "Unsupported floating point width: {r}. Supported values: 32, 64"
51        ))),
52    }
53}