diff --git a/.gitignore b/.gitignore index baea84b8d1f1..c30403ceb2f7 100644 --- a/.gitignore +++ b/.gitignore @@ -108,3 +108,4 @@ venv.bak/ .try .vscode/ .vs/ +scripts/python3.bat \ No newline at end of file diff --git a/boolean_algebra/full_adder.py b/boolean_algebra/full_adder.py new file mode 100644 index 000000000000..55b845ff1849 --- /dev/null +++ b/boolean_algebra/full_adder.py @@ -0,0 +1,67 @@ +""" +A Full Adder is a fundamental combinational circuit in digital logic. +It computes the sum and carry outputs for two input bits and an input carry bit. + +Truth Table: + ----------------------------------------- + | A | B | Cin | Sum | Cout | + ----------------------------------------- + | 0 | 0 | 0 | 0 | 0 | + | 0 | 1 | 0 | 1 | 0 | + | 1 | 0 | 0 | 1 | 0 | + | 1 | 1 | 0 | 0 | 1 | + | 0 | 0 | 1 | 1 | 0 | + | 0 | 1 | 1 | 0 | 1 | + | 1 | 0 | 1 | 0 | 1 | + | 1 | 1 | 1 | 1 | 1 | + ----------------------------------------- + +Refer: +https://en.wikipedia.org/wiki/Adder_(electronics)#Full_adder +""" + + +def full_adder(input_a: int, input_b: int, carry_in: int) -> tuple[int, int]: + """ + Compute the sum and carry-out for a Full Adder. + + Args: + input_a: First input bit (0 or 1). + input_b: Second input bit (0 or 1). + carry_in: Carry-in bit (0 or 1). + + Returns: + A tuple `(sum_bit, carry_out)`. + + >>> full_adder(0, 0, 0) + (0, 0) + >>> full_adder(0, 1, 0) + (1, 0) + >>> full_adder(1, 0, 0) + (1, 0) + >>> full_adder(1, 1, 0) + (0, 1) + >>> full_adder(0, 0, 1) + (1, 0) + >>> full_adder(1, 1, 1) + (1, 1) + + Raises: + ValueError: If any input is not 0 or 1. + """ + if input_a not in (0, 1) or input_b not in (0, 1) or carry_in not in (0, 1): + raise ValueError("Inputs must be 0 or 1.") + + # Sum is XOR of the inputs + sum_bit = input_a ^ input_b ^ carry_in + + # Carry-out is true if any two or more inputs are 1 + carry_out = (input_a & input_b) | (input_b & carry_in) | (input_a & carry_in) + + return sum_bit, carry_out + + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/boolean_algebra/half_adder.py b/boolean_algebra/half_adder.py new file mode 100644 index 000000000000..838287757ffc --- /dev/null +++ b/boolean_algebra/half_adder.py @@ -0,0 +1,46 @@ +""" +A Half Adder is a basic combinational circuit in digital logic. +It computes the sum and carry outputs for two input bits. + +Truth Table: + ------------------------- + | Input A | Input B | Sum | Carry | + ------------------------- + | 0 | 0 | 0 | 0 | + | 0 | 1 | 1 | 0 | + | 1 | 0 | 1 | 0 | + | 1 | 1 | 0 | 1 | + ------------------------- + +Refer - https://en.wikipedia.org/wiki/Adder_(electronics)#Half_adder +""" + + +def half_adder(a: int, b: int) -> tuple[int, int]: + """ + Compute the sum and carry for a Half Adder. + + >>> half_adder(0, 0) + (0, 0) + >>> half_adder(0, 1) + (1, 0) + >>> half_adder(1, 0) + (1, 0) + >>> half_adder(1, 1) + (0, 1) + + Raises: + ValueError: If inputs are not 0 or 1. + """ + if a not in (0, 1) or b not in (0, 1): + raise ValueError("Inputs must be 0 or 1") + + sum_bit = a ^ b + carry_bit = a & b + return sum_bit, carry_bit + + +if __name__ == "__main__": + import doctest + + doctest.testmod()