Module ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_array_multiplier
Classes
class UnsignedTruncatedArrayMultiplier (a: Bus,
b: Bus,
truncation_cut: int = 0,
prefix: str = '',
name: str = 'u_tm',
**kwargs)-
Class representing unsigned truncated array multiplier.
It represents an approximative version of unsigned array multiplier with simpler structure. It is created by modifying an ordinary N-bit unsigned array multiplier by ignoring (truncating) some of the partial products.
The design promises better area and power parameters in exchange for the loss of computation precision.
CUT=2 A3B0 A2B0 │ A1B0 A0B0 ┌───┐ ┌───┐ ┌───┐ ┌───┐ │AND│ │AND│ │ │AND│ │AND│ └───┘ └───┘ └───┘ └───┘ ┌ ─ ─ ─ ┘ A3B1 A2B1 A1B1 A0B1 ┌───┐ ┌───┐ │ ┌───┐ ┌───┐ │AND│ │AND│ │AND│ │AND│ └───┘ └───┘ │ └───┘ └───┘ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │ │ │ │ │ │ │ │ │ HA │ │ FA │ │ FA │ │ HA │ │ │ │ │ │ │ │ │ │ └────┘ └────┘ └────┘ └────┘ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┬ ─ ─ ─ ─ ┴─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ CUT=2 A3B2 A2B2 A1B2 A0B2 ┌▼─▼┐ ┌▼─▼┐ │ ┌───┐ ┌───┐ │AND│ │AND│ │AND│ │AND│ └┬──┘ └┬──┘ │ └───┘ └───┘ │ │ ┌────┐ ┌────┐ │ │ │ │ │ │ │ │ ┌ ─ ┼─ ─ ─ ┘ │ FA │ │ HA │ │ │ │ │ │ │ │ │ │ └────┘ └────┘ A3B3 │ A2B3 │ A1B3 A0B3 ┌▼─▼┐ │ ┌▼─▼┐ │ │ ┌───┐ ┌───┐ │AND│ │ │AND│ │ │AND│ │AND│ └┬──┘ │ └┬──┘ │ │ └───┘ └───┘ ┌───▼┐ ┌▼──▼┐ ┌┼───┐ ┌────┐ │ │ │ │ │ ││ │ │ │ ┌──────┤ HA │◄────┤ HA │ ││FA │ │ HA │ │ │ │ │ │ │ ││ │ │ │ │ └──┬─┘ └──┬─┘ └┼───┘ └────┘ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ P7 P6 P5 │ P4 P3=0 P2=0 P1=0 P0=0
Description of the init method.
Args
a
:Bus
- First input bus.
b
:Bus
- Second input bus.
truncation_cut
:int
, optional- Specifies truncation cut level used in the truncated array multiplier circuit creation. Note: If equal to 0, the final circuit behaves as an ordinary array multiplier. Defaults to 0.
prefix
:str
, optional- Prefix name of unsigned truncated array multiplier. Defaults to "".
name
:str
, optional- Name of unsigned truncated array multiplier. Defaults to "u_tm".
Expand source code
class UnsignedTruncatedArrayMultiplier(MultiplierCircuit): """Class representing unsigned truncated array multiplier. It represents an approximative version of unsigned array multiplier with simpler structure. It is created by modifying an ordinary N-bit unsigned array multiplier by ignoring (truncating) some of the partial products. The design promises better area and power parameters in exchange for the loss of computation precision. ``` CUT=2 A3B0 A2B0 │ A1B0 A0B0 ┌───┐ ┌───┐ ┌───┐ ┌───┐ │AND│ │AND│ │ │AND│ │AND│ └───┘ └───┘ └───┘ └───┘ ┌ ─ ─ ─ ┘ A3B1 A2B1 A1B1 A0B1 ┌───┐ ┌───┐ │ ┌───┐ ┌───┐ │AND│ │AND│ │AND│ │AND│ └───┘ └───┘ │ └───┘ └───┘ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │ │ │ │ │ │ │ │ │ HA │ │ FA │ │ FA │ │ HA │ │ │ │ │ │ │ │ │ │ └────┘ └────┘ └────┘ └────┘ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┬ ─ ─ ─ ─ ┴─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ CUT=2 A3B2 A2B2 A1B2 A0B2 ┌▼─▼┐ ┌▼─▼┐ │ ┌───┐ ┌───┐ │AND│ │AND│ │AND│ │AND│ └┬──┘ └┬──┘ │ └───┘ └───┘ │ │ ┌────┐ ┌────┐ │ │ │ │ │ │ │ │ ┌ ─ ┼─ ─ ─ ┘ │ FA │ │ HA │ │ │ │ │ │ │ │ │ │ └────┘ └────┘ A3B3 │ A2B3 │ A1B3 A0B3 ┌▼─▼┐ │ ┌▼─▼┐ │ │ ┌───┐ ┌───┐ │AND│ │ │AND│ │ │AND│ │AND│ └┬──┘ │ └┬──┘ │ │ └───┘ └───┘ ┌───▼┐ ┌▼──▼┐ ┌┼───┐ ┌────┐ │ │ │ │ │ ││ │ │ │ ┌──────┤ HA │◄────┤ HA │ ││FA │ │ HA │ │ │ │ │ │ │ ││ │ │ │ │ └──┬─┘ └──┬─┘ └┼───┘ └────┘ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ P7 P6 P5 │ P4 P3=0 P2=0 P1=0 P0=0 ``` Description of the __init__ method. Args: a (Bus): First input bus. b (Bus): Second input bus. truncation_cut (int, optional): Specifies truncation cut level used in the truncated array multiplier circuit creation. Note: If equal to 0, the final circuit behaves as an ordinary array multiplier. Defaults to 0. prefix (str, optional): Prefix name of unsigned truncated array multiplier. Defaults to "". name (str, optional): Name of unsigned truncated array multiplier. Defaults to "u_tm". """ def __init__(self, a: Bus, b: Bus, truncation_cut: int = 0, prefix: str = "", name: str = "u_tm", **kwargs): # NOTE: If truncation_cut is specified as 0 the final circuit is a simple array multiplier self.truncation_cut = truncation_cut self.N = max(a.N, b.N) # Cut level should be: 0 <= truncation_cut < N assert truncation_cut < self.N super().__init__(inputs=[a, b], prefix=prefix, name=name, out_N=self.N*2, **kwargs) # Bus sign extension in case buses have different lengths self.a.bus_extend(N=self.N, prefix=a.prefix) self.b.bus_extend(N=self.N, prefix=b.prefix) # Gradual generation of partial products for b_multiplier_index in range(self.truncation_cut, self.N): for a_multiplicand_index in range(self.truncation_cut, self.N): # AND gates generation for calculation of partial products obj_and = AndGate(self.a.get_wire(a_multiplicand_index), self.b.get_wire(b_multiplier_index), prefix=self.prefix+"_and"+str(a_multiplicand_index)+"_"+str(b_multiplier_index)) self.add_component(obj_and) if b_multiplier_index != self.truncation_cut: previous_product = self.components[a_multiplicand_index + b_multiplier_index - 2*self.truncation_cut].out if b_multiplier_index == self.truncation_cut + 1 else self.get_previous_partial_product(a_index=a_multiplicand_index, b_index=b_multiplier_index, mult_type="tm") # HA generation for first 1-bit adder in each row starting from the second one if a_multiplicand_index == self.truncation_cut: obj_adder = HalfAdder(self.get_previous_component().out, previous_product, prefix=self.prefix+"_ha"+str(a_multiplicand_index)+"_"+str(b_multiplier_index)) self.add_component(obj_adder) # Product generation self.out.connect(b_multiplier_index + self.truncation_cut, obj_adder.get_sum_wire()) # HA generation, last 1-bit adder in second row elif a_multiplicand_index == self.N-1 and b_multiplier_index == self.truncation_cut+1: obj_adder = HalfAdder(self.get_previous_component().out, self.get_previous_component(number=2).get_carry_wire(), prefix=self.prefix+"_ha"+str(a_multiplicand_index)+"_"+str(b_multiplier_index)) self.add_component(obj_adder) # FA generation else: obj_adder = FullAdder(self.get_previous_component().out, previous_product, self.get_previous_component(number=2).get_carry_wire(), prefix=self.prefix+"_fa"+str(a_multiplicand_index)+"_"+str(b_multiplier_index)) self.add_component(obj_adder) # PRODUCT GENERATION if (a_multiplicand_index == self.truncation_cut and b_multiplier_index == self.truncation_cut) or (self.truncation_cut == self.N-1): self.out.connect(a_multiplicand_index + b_multiplier_index, obj_and.out) # 1 bit multiplier case if a_multiplicand_index == self.N-1 and b_multiplier_index == self.N-1: self.out.connect(a_multiplicand_index+b_multiplier_index+1, ConstantWireValue0()) elif b_multiplier_index == self.N-1 and self.truncation_cut != self.N-1: self.out.connect(b_multiplier_index + a_multiplicand_index, obj_adder.get_sum_wire()) if a_multiplicand_index == self.N-1: self.out.connect(self.out.N-1, obj_adder.get_carry_wire()) # Connecting the output bits generated from ommited cells to ground for grounded_out_index in range(0, self.truncation_cut*2): self.out.connect(grounded_out_index, ConstantWireValue0())
Ancestors
Inherited members
MultiplierCircuit
:add_column_wire
add_column_wires
add_component
add_row_wires
get_blif_code_flat
get_blif_code_hier
get_c_code_flat
get_c_code_hier
get_cgp_code_flat
get_circuit_blif
get_circuit_c
get_circuit_def
get_circuit_gates
get_circuit_v
get_circuit_wire_index
get_circuit_wires
get_column_height
get_column_wire
get_component_types
get_declaration_blif
get_declaration_c_flat
get_declaration_c_hier
get_declaration_v_flat
get_declaration_v_hier
get_declarations_c_hier
get_declarations_v_hier
get_function_blif_flat
get_function_block_blif
get_function_block_c
get_function_block_v
get_function_blocks_blif
get_function_blocks_c
get_function_blocks_v
get_function_out_blif
get_function_out_c_flat
get_function_out_c_hier
get_function_out_python_flat
get_function_out_v_flat
get_function_out_v_hier
get_hier_subcomponent_def
get_includes_c
get_init_c_flat
get_init_c_hier
get_init_python_flat
get_init_v_flat
get_init_v_hier
get_instance_num
get_invocation_blif_hier
get_invocations_blif_hier
get_maximum_height
get_multi_bit_components
get_one_bit_components
get_out_invocation_c
get_out_invocation_v
get_outputs_cgp
get_parameters_cgp
get_previous_component
get_previous_partial_product
get_prototype_blif
get_prototype_c
get_prototype_python
get_prototype_v
get_python_code_flat
get_triplets_cgp
get_unique_types
get_v_code_flat
get_v_code_hier
init_column_heights
init_row_lengths
save_wire_id
update_column_heights
update_column_wires