optimizing a gate level bcm to the end of the earth and back
at main 85 lines 2.5 kB view raw
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()