coreblocks.func_blocks.fu.fpu package

Submodules

coreblocks.func_blocks.fu.fpu.close_path module

class coreblocks.func_blocks.fu.fpu.close_path.ClosePathMethodLayout

Bases: object

Close path module layouts for methods

Parameters
fpu_params; FPUParams

FPU parameters

__init__(*, fpu_params: FPUParams)

r_sign - sign of the result sig_a - two’s complement form of first significand sig_2 - two’s complement form of second significand exp - exponent of result before shifts rounding_mode - rounding mode guard_bit - guard_bit (pth bit of second significand where p is precision)

class coreblocks.func_blocks.fu.fpu.close_path.ClosePathModule

Bases: Elaboratable

Close path module Based on http://i.stanford.edu/pub/cstr/reports/csl/tr/90/442/CSL-TR-90-442.pdf. This module computes results for efficient subtraction, whenever difference of exponents is lesser than 2. Besides computing the result, this implementation also performs rounding at the same time as subtraction by using two adders (one computing a+b and the other one computing a+b+1). The correct output is chosen based on flags that are different for each rounding mode.

Parameters
fpu_params: FPUParams

FPU rounding module parameters

Attributes
close_path_request: Method

Transactional method for initiating close path computation. Takes ‘close_path_in_layout’ as argument. Returns result as ‘close_path_out_layout’.

__init__(*, fpu_params: FPUParams)

coreblocks.func_blocks.fu.fpu.far_path module

class coreblocks.func_blocks.fu.fpu.far_path.FarPathMethodLayout

Bases: object

Far path module layouts for methods

Parameters
fpu_params; FPUParams

FPU parameters

__init__(*, fpu_params: FPUParams)

r_sign - result sign sig_a - significand of first operand (for effective subtraction in two’s complement form) sig_b - significand of second operand (for effective subtraction in two’s complement form) exp - exponent of result before shift sub_op - effective operation. 1 for subtraction 0 for addition rounding_mode - rounding mode guard_bit - guard bit (pth bit of second significand where p is precision) round_bit - round bit ((p+1)th bit of second significand where p is precision) sticky_bit - sticky_bit (OR of all bits with index >=p of second significand where p is precision)

class coreblocks.func_blocks.fu.fpu.far_path.FarPathModule

Bases: Elaboratable

Far Path module Based on: https://userpages.cs.umbc.edu/phatak/645/supl/lza/lza-survey-arith01.pdf. This module implements far path of adder/subtractor. It performs subtraction for operands whose exponent differs by more than 1 and addition for all combinations of operands. Besides addition it also performs rounding at the same time as addition using two adders (one producing a+b and second one producing a+b+1). The correct output is chosen by flags that differ for each rounding mode. To deal with certain complication that may arise during addition in certain rounding modes the input of second may be either input operand or (a & b)<<1 and (a^b). This allows second adder to compute a+b+2 in special cases that are better explained in paper linked above.

Parameters
fpu_params: FPUParams

FPU rounding module parameters

Attributes
far_path_request: Method

Transactional method for initiating far path computation. Takes ‘far_path_in_layout’ as argument. Returns result as ‘far_path_out_layout’.

__init__(*, fpu_params: FPUParams)

coreblocks.func_blocks.fu.fpu.fpu_common module

class coreblocks.func_blocks.fu.fpu.fpu_common.Errors

Bases: IntFlag

DIVISION_BY_ZERO = 2
INEXACT = 16
INVALID_OPERATION = 1
OVERFLOW = 4
UNDERFLOW = 8
__new__(value)
class coreblocks.func_blocks.fu.fpu.fpu_common.FPUParams

Bases: object

FPU parameters

Parameters
sig_width: int

Width of significand, including implicit bit

exp_width: int

Width of exponent

__init__(*, sig_width: int = 24, exp_width: int = 8)
class coreblocks.func_blocks.fu.fpu.fpu_common.RoundingModes

Bases: Enum

ROUND_DOWN = 2
ROUND_NEAREST_AWAY = 4
ROUND_NEAREST_EVEN = 0
ROUND_UP = 3
ROUND_ZERO = 1
coreblocks.func_blocks.fu.fpu.fpu_common.create_data_layout(params: FPUParams)

coreblocks.func_blocks.fu.fpu.fpu_error_module module

class coreblocks.func_blocks.fu.fpu.fpu_error_module.FPUErrorMethodLayout

Bases: object

FPU error checking module layouts for methods

Parameters
fpu_params: FPUParams

FPU parameters

__init__(*, fpu_params: FPUParams)

input_inf is a flag that comes from previous stage. Its purpose is to indicate that the infinity on input is a result of infinity arithmetic and not a result of overflow

class coreblocks.func_blocks.fu.fpu.fpu_error_module.FPUErrorModule

Bases: Elaboratable

FPU error checking module

Parameters
fpu_params: FPUParams

FPU rounding module parameters

Attributes
error_checking_request: Method

Transactional method for initiating error checking of a floating point number. Takes ‘error_in_layout’ as argument Returns final number and errors as ‘error_out_layout’

__init__(*, fpu_params: FPUParams)

coreblocks.func_blocks.fu.fpu.fpu_rounding_module module

class coreblocks.func_blocks.fu.fpu.fpu_rounding_module.FPURoudningMethodLayout

Bases: object

FPU Rounding module layouts for methods

Parameters
fpu_params: FPUParams

FPU parameters

__init__(*, fpu_params: FPUParams)
class coreblocks.func_blocks.fu.fpu.fpu_rounding_module.FPURounding

Bases: Elaboratable

FPU Rounding module

Parameters
fpu_params: FPUParams

FPU parameters

Attributes
rounding_request: Method

Transactional method for initiating rounding of a floating point number. Takes ‘rounding_in_layout’ as argument Returns rounded number and errors as ‘rounding_out_layout’

__init__(*, fpu_params: FPUParams)

coreblocks.func_blocks.fu.fpu.lza module

class coreblocks.func_blocks.fu.fpu.lza.LZAMethodLayout

Bases: object

LZA module layouts for methods

Parameters
fpu_params: FPUParams

FPU parameters

__init__(*, fpu_params: FPUParams)

sig_a - significand of a sig_b - significand of b carry - indicates if we want to predict result of a+b or a+b+1 shift_amount - position to shift needed to normalize number is_zero - indicates if result is zero

class coreblocks.func_blocks.fu.fpu.lza.LZAModule

Bases: Elaboratable

LZA module Based on: https://userpages.cs.umbc.edu/phatak/645/supl/lza/lza-survey-arith01.pdf After performing subtracion, we may have to normalize floating point numbers and For that, we have to know the number of leading zeros. The most basic approach includes using LZC (leading zero counter) after subtracion, a more advanced approach includes using LZA (Leading Zero Anticipator) to predict the number of leading zeroes. It is worth noting that this LZA module works under assumptions that significands are in two’s complement and that before complementation sig_a was greater or equal to sig_b. Another thing worth noting is that LZA works with error = 1. That means that if ‘n’ is the result of the LZA module, in reality, to normalize number we may have to shift left by ‘n’ or ‘n+1’. There are few techniques of dealing with that error like specially designed shifters or predicting the error but the most basic approach is to just use multiplexer after shifter to perform one more shift left if necessary.

Parameters
fpu_params: FPUParams

FPU rounding module parameters

Attributes
predict_request: Method

Transactional method for initiating leading zeros prediction. Takes ‘predict_in_layout’ as argument Returns shift amount as ‘predict_out_layout’

__init__(*, fpu_params: FPUParams)

Module contents