optimizing a gate level bcm to the end of the earth and back
1"""
2Truth tables for BCD to 7-segment decoder.
3
4BCD inputs: 4 bits (A, B, C, D) representing digits 0-9
5- Positions 0-9: valid BCD digits
6- Positions 10-15: don't care (invalid BCD)
7
87-segment display layout:
9 aaa
10 f b
11 f b
12 ggg
13 e c
14 e c
15 ddd
16
17Each segment's truth table: 1 = ON, 0 = OFF, - = don't care
18"""
19
20# Truth tables as strings (index 0-15, positions 10-15 are don't cares)
21# Format: digit 0 at index 0, digit 9 at index 9, don't cares at 10-15
22SEGMENT_TRUTH_TABLES = {
23 'a': "1011011111------", # ON for 0,2,3,5,6,7,8,9
24 'b': "1111100111------", # ON for 0,1,2,3,4,7,8,9
25 'c': "1101111111------", # ON for 0,1,3,4,5,6,7,8,9
26 'd': "1011011011------", # ON for 0,2,3,5,6,8,9
27 'e': "1010001010------", # ON for 0,2,6,8
28 'f': "1000111011------", # ON for 0,4,5,6,8,9
29 'g': "0011111011------", # ON for 2,3,4,5,6,8,9
30}
31
32SEGMENT_NAMES = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
33
34# Minterms (ON-set) for each segment - these are the BCD digit indices where segment is ON
35SEGMENT_MINTERMS = {
36 'a': [0, 2, 3, 5, 6, 7, 8, 9],
37 'b': [0, 1, 2, 3, 4, 7, 8, 9],
38 'c': [0, 1, 3, 4, 5, 6, 7, 8, 9],
39 'd': [0, 2, 3, 5, 6, 8, 9],
40 'e': [0, 2, 6, 8],
41 'f': [0, 4, 5, 6, 8, 9],
42 'g': [2, 3, 4, 5, 6, 8, 9],
43}
44
45# Don't care positions (invalid BCD values 10-15)
46DONT_CARES = [10, 11, 12, 13, 14, 15]
47
48# Input variable names (MSB to LSB)
49INPUT_VARS = ['A', 'B', 'C', 'D']
50
51
52def minterm_to_bits(minterm: int) -> tuple[int, int, int, int]:
53 """Convert a minterm index to its 4-bit representation (A, B, C, D)."""
54 return (
55 (minterm >> 3) & 1, # A (MSB)
56 (minterm >> 2) & 1, # B
57 (minterm >> 1) & 1, # C
58 minterm & 1, # D (LSB)
59 )
60
61
62def bits_to_minterm(a: int, b: int, c: int, d: int) -> int:
63 """Convert 4-bit representation to minterm index."""
64 return (a << 3) | (b << 2) | (c << 1) | d
65
66
67def print_truth_table():
68 """Print the complete truth table for all segments."""
69 print("BCD to 7-Segment Truth Table")
70 print("=" * 50)
71 print(f"{'Digit':>5} | {'A':>2} {'B':>2} {'C':>2} {'D':>2} | ", end="")
72 print(" ".join(f"{s}" for s in SEGMENT_NAMES))
73 print("-" * 50)
74
75 for i in range(16):
76 a, b, c, d = minterm_to_bits(i)
77 digit = str(i) if i < 10 else "X"
78 segments = " ".join(
79 SEGMENT_TRUTH_TABLES[s][i] for s in SEGMENT_NAMES
80 )
81 print(f"{digit:>5} | {a} {b} {c} {d} | {segments}")
82
83
84if __name__ == "__main__":
85 print_truth_table()