OR-1 dataflow CPU sketch
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()