optimizing a gate level bcm to the end of the earth and back
1"""Command-line interface for BCD to 7-segment optimization.""" 2 3import argparse 4import sys 5 6from .solver import BCDTo7SegmentSolver 7from .truth_tables import print_truth_table 8from .export import to_verilog, to_c_code, to_equations 9 10 11def main(): 12 parser = argparse.ArgumentParser( 13 description="Optimize BCD to 7-segment decoder gate inputs", 14 formatter_class=argparse.RawDescriptionHelpFormatter, 15 epilog=""" 16Examples: 17 bcd-optimize Run with default settings 18 bcd-optimize --target 20 Try to beat 20 gate inputs 19 bcd-optimize --exact Use SAT-based exact synthesis 20 bcd-optimize --truth-table Show the BCD truth table 21 bcd-optimize --format verilog Output as Verilog module 22 bcd-optimize --format c Output as C function 23 """, 24 ) 25 26 parser.add_argument( 27 "--target", 28 type=int, 29 default=23, 30 help="Target gate input count to beat (default: 23)", 31 ) 32 parser.add_argument( 33 "--exact", 34 action="store_true", 35 help="Use SAT-based exact synthesis (slower but optimal)", 36 ) 37 parser.add_argument( 38 "--truth-table", 39 action="store_true", 40 help="Print the BCD to 7-segment truth table and exit", 41 ) 42 parser.add_argument( 43 "--format", "-f", 44 choices=["text", "verilog", "c", "equations"], 45 default="text", 46 help="Output format (default: text)", 47 ) 48 parser.add_argument( 49 "--verbose", "-v", 50 action="store_true", 51 help="Verbose output", 52 ) 53 54 args = parser.parse_args() 55 56 if args.truth_table: 57 print_truth_table() 58 return 0 59 60 # Suppress progress output for non-text formats 61 quiet = args.format != "text" 62 63 if not quiet: 64 print("BCD to 7-Segment Decoder Optimizer") 65 print("=" * 40) 66 print(f"Target: < {args.target} gate inputs") 67 print() 68 69 solver = BCDTo7SegmentSolver() 70 71 try: 72 # Temporarily redirect stdout for quiet mode 73 if quiet: 74 import io 75 old_stdout = sys.stdout 76 sys.stdout = io.StringIO() 77 78 result = solver.solve(target_cost=args.target, use_exact=args.exact) 79 80 if quiet: 81 sys.stdout = old_stdout 82 83 # Output in requested format 84 if args.format == "verilog": 85 print(to_verilog(result)) 86 elif args.format == "c": 87 print(to_c_code(result)) 88 elif args.format == "equations": 89 print(to_equations(result)) 90 else: 91 print() 92 solver.print_result(result) 93 94 if result.cost < args.target: 95 print(f"\n✓ SUCCESS: Beat target by {args.target - result.cost} gate inputs!") 96 else: 97 print(f"\n✗ Did not beat target (need {result.cost - args.target + 1} more reduction)") 98 99 return 0 if result.cost < args.target else 1 100 101 except Exception as e: 102 if quiet: 103 sys.stdout = old_stdout 104 print(f"Error: {e}", file=sys.stderr) 105 if args.verbose: 106 import traceback 107 traceback.print_exc() 108 return 1 109 110 111if __name__ == "__main__": 112 sys.exit(main())