OR-1 dataflow CPU sketch
at main 69 lines 1.9 kB view raw
1"""CLI entry point: python -m monitor [path/to/file.dfasm]""" 2 3import argparse 4import sys 5from pathlib import Path 6 7from monitor.backend import SimulationBackend 8from monitor.commands import LoadCmd 9from monitor.repl import MonitorREPL 10 11 12def main() -> None: 13 parser = argparse.ArgumentParser( 14 prog="monitor", 15 description="Interactive OR1 dataflow CPU simulation monitor.", 16 ) 17 parser.add_argument( 18 "file", 19 nargs="?", 20 type=Path, 21 default=None, 22 help="Optional .dfasm file to load on startup", 23 ) 24 parser.add_argument( 25 "--web", 26 action="store_true", 27 help="Start web server instead of CLI REPL", 28 ) 29 parser.add_argument( 30 "--port", 31 type=int, 32 default=8421, 33 help="Port for web server (default: 8421)", 34 ) 35 36 args = parser.parse_args() 37 38 backend = SimulationBackend() 39 backend.start() 40 41 try: 42 if args.web: 43 import uvicorn 44 from monitor.server import create_app 45 46 app = create_app(backend) 47 if args.file is not None: 48 if not args.file.exists(): 49 print(f"Error: file not found: {args.file}", file=sys.stderr) 50 sys.exit(1) 51 source = args.file.resolve().read_text() 52 backend.send_command(LoadCmd(source=source), timeout=10.0) 53 uvicorn.run(app, host="127.0.0.1", port=args.port, log_level="info") 54 else: 55 repl = MonitorREPL(backend) 56 57 if args.file is not None: 58 if not args.file.exists(): 59 print(f"Error: file not found: {args.file}", file=sys.stderr) 60 sys.exit(1) 61 repl.do_load(str(args.file.resolve())) 62 63 repl.cmdloop() 64 finally: 65 backend.stop() 66 67 68if __name__ == "__main__": 69 main()