Module ariths_gen.multi_bit_circuits.adders.carry_save_adder
Classes
class CarrySaveAdderComponent (a: Bus,
b: Bus,
c: Bus,
prefix: str = '',
name: str = 'csa_component',
signed: bool = False,
**kwargs)-
Expand source code
class CarrySaveAdderComponent(GeneralCircuit): """Class representing carry save adder component. The carry save adder component is especially useful when constructing tree multiplier architectures to reduce the propagation delay as opposed to traditional implementation of tree multipliers with half/full adders. The circuit is composed of full adders that operate in parallel and each take 3 input operands. The final output bus is composed of sum and carry bits of its corresponding contained full adders. ``` C3 B3 A3 C2 B2 A2 C1 B1 A1 C0 B0 A0 │ │ │ │ │ │ │ │ │ │ │ │ ┌▼─▼─▼─┐ ┌▼─▼─▼─┐ ┌▼─▼─▼─┐ ┌▼─▼─▼─┐ │ │ │ │ │ │ │ │ │ FA │ │ FA │ │ FA │ │ FA │ │ │ │ │ │ │ │ │ └─┬──┬─┘ └─┬──┬─┘ └─┬──┬─┘ └─┬──┬─┘ │c3│s3 │c2│s2 │c1│s1 │c0│s0 └──┼──┐ ┌─┘ │┌──────┼──┼───────┘ │ │ │ │ ┌─┼┼──────┘ └───────┐ │ │ │ │ │ └┼──────────────┐ │ │ └──┼──┼──┼──┼───────────┐ │ │ │ │ │ │ │ 0 0/1│ │ │ │ │ │ │ │ │ │ │ │ │ │ o9 o8 o7 o6 o5 o4 o3 o2 o1 o0 c3 c2 c1 c0 0 0/1 s3 s2 s1 s0 ``` Description of the __init__ method. Args: a (Bus): First input bus. b (Bus): Second input bus. c (Bus): Third input bus. prefix (str, optional): Prefix name of csa component. Defaults to "". name (str, optional): Name of csa component. Defaults to "csa_component". signed (bool, optional): Specifies whether the component should be used in (un)signed context (used during the construction of tree multipliers). Defaults to False. """ def __init__(self, a: Bus, b: Bus, c: Bus, prefix: str = "", name: str = "csa_component", signed: bool = False, **kwargs): self.N = max(a.N, b.N, c.N) super().__init__(inputs=[a, b, c], prefix=prefix, name=name, out_N=(2*self.N)+2, signed=signed, **kwargs) self.out.signed = False # CSA component has always unsigned output bus_extension_wire = ConstantWireValue1() if self.signed is True else ConstantWireValue0() self.a.bus_extend(N=self.N, prefix=a.prefix, desired_extension_wire=bus_extension_wire) self.b.bus_extend(N=self.N, prefix=b.prefix, desired_extension_wire=bus_extension_wire) self.c.bus_extend(N=self.N, prefix=c.prefix, desired_extension_wire=bus_extension_wire) self.sum_bits = Bus(prefix=self.prefix + "_sums", N=int(self.out.N/2)) self.carry_bits = Bus(prefix=self.prefix + "_carries", N=int(self.out.N/2)) self.sum_bits.connect(-1, bus_extension_wire) self.carry_bits.connect(0, ConstantWireValue0()) # Gradual addition of 1-bit CSA components (FAs are used) for input_index in range(self.N): obj_adder = FullAdder(self.a.get_wire(input_index), self.b.get_wire(input_index), self.c.get_wire(input_index), prefix=self.prefix+"_fa"+str(input_index)) self.add_component(obj_adder) self.sum_bits.connect(input_index, obj_adder.get_sum_wire()) self.carry_bits.connect(input_index+1, obj_adder.get_carry_wire()) [self.out.connect(o, self.sum_bits.get_wire(o)) for o in range(0, int(self.out.N/2))] [self.out.connect(o, self.carry_bits.get_wire(o-int(self.out.N/2))) for o in range(int(self.out.N/2), self.out.N)]Class representing carry save adder component.
The carry save adder component is especially useful when constructing tree multiplier architectures to reduce the propagation delay as opposed to traditional implementation of tree multipliers with half/full adders.
The circuit is composed of full adders that operate in parallel and each take 3 input operands. The final output bus is composed of sum and carry bits of its corresponding contained full adders.
C3 B3 A3 C2 B2 A2 C1 B1 A1 C0 B0 A0 │ │ │ │ │ │ │ │ │ │ │ │ ┌▼─▼─▼─┐ ┌▼─▼─▼─┐ ┌▼─▼─▼─┐ ┌▼─▼─▼─┐ │ │ │ │ │ │ │ │ │ FA │ │ FA │ │ FA │ │ FA │ │ │ │ │ │ │ │ │ └─┬──┬─┘ └─┬──┬─┘ └─┬──┬─┘ └─┬──┬─┘ │c3│s3 │c2│s2 │c1│s1 │c0│s0 └──┼──┐ ┌─┘ │┌──────┼──┼───────┘ │ │ │ │ ┌─┼┼──────┘ └───────┐ │ │ │ │ │ └┼──────────────┐ │ │ └──┼──┼──┼──┼───────────┐ │ │ │ │ │ │ │ 0 0/1│ │ │ │ │ │ │ │ │ │ │ │ │ │ o9 o8 o7 o6 o5 o4 o3 o2 o1 o0 c3 c2 c1 c0 0 0/1 s3 s2 s1 s0Description of the init method.
Args
a:Bus- First input bus.
b:Bus- Second input bus.
c:Bus- Third input bus.
prefix:str, optional- Prefix name of csa component. Defaults to "".
name:str, optional- Name of csa component. Defaults to "csa_component".
signed:bool, optional- Specifies whether the component should be used in (un)signed context (used during the construction of tree multipliers). Defaults to False.
Ancestors
Inherited members
GeneralCircuit:add_componentget_blif_code_flatget_blif_code_hierget_c_code_flatget_c_code_hierget_cgp_code_flatget_circuit_blifget_circuit_cget_circuit_defget_circuit_gatesget_circuit_vget_circuit_wire_indexget_circuit_wiresget_component_typesget_declaration_blifget_declaration_c_flatget_declaration_c_hierget_declaration_v_flatget_declaration_v_hierget_declarations_c_hierget_declarations_v_hierget_function_blif_flatget_function_block_blifget_function_block_cget_function_block_vget_function_blocks_blifget_function_blocks_cget_function_blocks_vget_function_out_blifget_function_out_c_flatget_function_out_c_hierget_function_out_python_flatget_function_out_v_flatget_function_out_v_hierget_hier_subcomponent_defget_includes_cget_init_c_flatget_init_c_hierget_init_python_flatget_init_v_flatget_init_v_hierget_instance_numget_invocation_blif_hierget_invocations_blif_hierget_multi_bit_componentsget_one_bit_componentsget_out_invocation_cget_out_invocation_vget_outputs_cgpget_parameters_cgpget_previous_componentget_prototype_blifget_prototype_cget_prototype_pythonget_prototype_vget_python_code_flatget_triplets_cgpget_unique_typesget_v_code_flatget_v_code_hiersave_wire_id
class UnsignedCarrySaveAdder (a: Bus,
b: Bus,
c: Bus,
prefix: str = '',
name: str = 'u_csa',
unsigned_adder_class_name: str = ariths_gen.multi_bit_circuits.adders.carry_lookahead_adder.UnsignedCarryLookaheadAdder,
**kwargs)-
Expand source code
class UnsignedCarrySaveAdder(GeneralCircuit): """Class representing unsigned carry save adder. Unsigned carry save adder represents 3 input N-bit unsigned adder which is composed of N one bit full adders, that are not interconnected as in for example the ripple carry adder, but instead operate in parallel. The sum and carry bits of the individual full adders are connected to a multi bit adder to sum the final result. ``` C3 B3 A3 C2 B2 A2 C1 B1 A1 C0 B0 A0 │ │ │ │ │ │ │ │ │ │ │ │ ┌▼─▼─▼─┐ ┌▼─▼─▼─┐ ┌▼─▼─▼─┐ ┌▼─▼─▼─┐ │ │ │ │ │ │ │ │ │ FA │ │ FA │ │ FA │ │ FA │ │ │ │ │ │ │ │ │ └─┬──┬─┘ └─┬──┬─┘ └─┬──┬─┘ └─┬──┬─┘ ┌┘c3│s3┌────┘c2│s2┌────┘c1│s1┌────┘c0│s0 0 │ │ │ │ │ │ │ │ 0 │Y4│X4 │Y3│X3 │Y2│X2 │Y1│X1 │Y0│X0 ┌─▼──▼───▼──▼───────▼──▼───────▼──▼───────▼──▼─┐ │ 5-bit multi bit adder │ │ │ └┬────────┬────────┬────────┬────────┬────────┬┘ Cout S4 S3 S2 S1 S0 ``` Description of the __init__ method. Args: a (Bus): First input bus. b (Bus): Second input bus. c (Bus): Third input bus. prefix (str, optional): Prefix name of unsigned csa. Defaults to "". name (str, optional): Name of unsigned csa. Defaults to "u_csa". unsigned_adder_class_name (str, optional): Unsigned multi bit adder used to obtain final sum. Defaults to UnsignedCarryLookaheadAdder. """ def __init__(self, a: Bus, b: Bus, c: Bus, prefix: str = "", name: str = "u_csa", unsigned_adder_class_name: str = UnsignedCarryLookaheadAdder, **kwargs): self.N = max(a.N, b.N, c.N) super().__init__(inputs=[a, b, c], 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) self.c.bus_extend(N=self.N, prefix=c.prefix) csa_adder = CarrySaveAdderComponent(a=self.a, b=self.b, c=self.c, prefix=prefix, name="csa_comp" + str(self.N), inner_component=True) self.add_component(csa_adder) # Obtain proper adder name with its bit width adder_name = unsigned_adder_class_name(a=self.a, b=self.b).prefix + str(self.N+1) adder_a = Bus(prefix="a", N=csa_adder.sum_bits.N) adder_b = Bus(prefix="b", N=csa_adder.carry_bits.N) adder_a.connect_bus(connecting_bus=csa_adder.out, end_connection_pos=int(csa_adder.out.N/2)) adder_b.connect_bus(connecting_bus=csa_adder.out, start_connection_pos=int(csa_adder.out.N/2), end_connection_pos=csa_adder.out.N, offset=int(csa_adder.out.N/2)) final_adder = unsigned_adder_class_name(a=adder_a, b=adder_b, prefix=self.prefix, name=adder_name, inner_component=True) self.add_component(final_adder) self.out.connect_bus(connecting_bus=final_adder.out)Class representing unsigned carry save adder.
Unsigned carry save adder represents 3 input N-bit unsigned adder which is composed of N one bit full adders, that are not interconnected as in for example the ripple carry adder, but instead operate in parallel.
The sum and carry bits of the individual full adders are connected to a multi bit adder to sum the final result.
C3 B3 A3 C2 B2 A2 C1 B1 A1 C0 B0 A0 │ │ │ │ │ │ │ │ │ │ │ │ ┌▼─▼─▼─┐ ┌▼─▼─▼─┐ ┌▼─▼─▼─┐ ┌▼─▼─▼─┐ │ │ │ │ │ │ │ │ │ FA │ │ FA │ │ FA │ │ FA │ │ │ │ │ │ │ │ │ └─┬──┬─┘ └─┬──┬─┘ └─┬──┬─┘ └─┬──┬─┘ ┌┘c3│s3┌────┘c2│s2┌────┘c1│s1┌────┘c0│s0 0 │ │ │ │ │ │ │ │ 0 │Y4│X4 │Y3│X3 │Y2│X2 │Y1│X1 │Y0│X0 ┌─▼──▼───▼──▼───────▼──▼───────▼──▼───────▼──▼─┐ │ 5-bit multi bit adder │ │ │ └┬────────┬────────┬────────┬────────┬────────┬┘ Cout S4 S3 S2 S1 S0Description of the init method.
Args
a:Bus- First input bus.
b:Bus- Second input bus.
c:Bus- Third input bus.
prefix:str, optional- Prefix name of unsigned csa. Defaults to "".
name:str, optional- Name of unsigned csa. Defaults to "u_csa".
unsigned_adder_class_name:str, optional- Unsigned multi bit adder used to obtain final sum. Defaults to UnsignedCarryLookaheadAdder.
Ancestors
Inherited members
GeneralCircuit:add_componentget_blif_code_flatget_blif_code_hierget_c_code_flatget_c_code_hierget_cgp_code_flatget_circuit_blifget_circuit_cget_circuit_defget_circuit_gatesget_circuit_vget_circuit_wire_indexget_circuit_wiresget_component_typesget_declaration_blifget_declaration_c_flatget_declaration_c_hierget_declaration_v_flatget_declaration_v_hierget_declarations_c_hierget_declarations_v_hierget_function_blif_flatget_function_block_blifget_function_block_cget_function_block_vget_function_blocks_blifget_function_blocks_cget_function_blocks_vget_function_out_blifget_function_out_c_flatget_function_out_c_hierget_function_out_python_flatget_function_out_v_flatget_function_out_v_hierget_hier_subcomponent_defget_includes_cget_init_c_flatget_init_c_hierget_init_python_flatget_init_v_flatget_init_v_hierget_instance_numget_invocation_blif_hierget_invocations_blif_hierget_multi_bit_componentsget_one_bit_componentsget_out_invocation_cget_out_invocation_vget_outputs_cgpget_parameters_cgpget_previous_componentget_prototype_blifget_prototype_cget_prototype_pythonget_prototype_vget_python_code_flatget_triplets_cgpget_unique_typesget_v_code_flatget_v_code_hiersave_wire_id