Source code for denspp.offline.analog.common_func

import numpy as np
from copy import deepcopy
from fxpmath import Fxp, Config


[docs] class CommonAnalogFunctions: _range: list = (-5.0, 5.0)
[docs] def define_voltage_range(self, volt_hgh: float, volt_low: float) -> list: """Defining the voltage range values""" self._range = [volt_low, volt_hgh] return self._range
@property def vcm(self) -> float: """Returning the common mode voltage value""" return (self._range[0] + self._range[1]) / 2
[docs] def clamp_voltage(self, uin: np.ndarray | float) -> np.ndarray | float: """Do voltage clipping at voltage supply""" uout = np.array(deepcopy(uin)) np.clip(uout, a_max=self._range[1], a_min=self._range[0], out=uout) return float(uout) if isinstance(uin, float) else uout
[docs] class CommonDigitalFunctions: _digital_border: np.ndarray _bitwidth: list = (2, 0) _bitsigned: bool = False
[docs] def define_limits(self, bit_signed: bool, total_bitwidth: int, frac_bitwidth: int) -> np.ndarray: """Defining the digital limitation values :param bit_signed: Integer data type (unsigned: False, signed: True) :param total_bitwidth: Total bitwidth :param frac_bitwidth: Fraction bitwidth :return: Numpy array with range (min, max) """ if total_bitwidth < 0 or frac_bitwidth < 0: raise ValueError("total_bitwidth and frac_bitwidth must be positive") else: self._bitwidth = [total_bitwidth, frac_bitwidth] self._bitsigned = bit_signed self._digital_border = self.quantize_fxp(xin=np.array([-np.inf, np.inf])) return self._digital_border
[docs] def clamp_digital(self, xin: np.ndarray) -> np.ndarray: """Do digital clamping of input data values :param xin: Input data stream :return: Output data stream """ xout = deepcopy(xin) np.clip(xout, a_min=self._digital_border[0], a_max=self._digital_border[1], out=xout) return xout
[docs] def quantize_fxp(self, xin: np.ndarray | float) -> np.ndarray: """Do signed quantization of input with full precision :param xin: Input data stream :return: Quantized output data stream """ config_fxp = Config() config_fxp.rounding = "around" config_fxp.overflow = "saturate" config_fxp.underflow = "saturate" val = Fxp(val=xin, signed=self._bitsigned, n_word=self._bitwidth[0], n_frac=self._bitwidth[1], config=config_fxp).get_val() return val if not type(xin) == type(float(1.2)) else float(val)