Skip to content

Commit e1f7f6b

Browse files
attie-argentumwhitequark
authored andcommitted
cli: add support for run-script mode
1 parent 696b94a commit e1f7f6b

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

software/glasgow/cli.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import os
22
import sys
3+
import ast
34
import logging
45
import argparse
56
import textwrap
@@ -142,16 +143,16 @@ def add_applet_arg(parser, mode, required=False):
142143
"tests", metavar="TEST", nargs="*",
143144
help="test cases to run")
144145

145-
if mode in ("build", "run", "run-repl"):
146+
if mode in ("build", "run", "run-repl", "run-script"):
146147
access_args = DirectArguments(applet_name=applet_name,
147148
default_port="AB",
148149
pin_count=16)
149-
if mode in ("run", "run-repl"):
150+
if mode in ("run", "run-repl", "run-script"):
150151
g_applet_build = p_applet.add_argument_group("build arguments")
151152
applet.add_build_arguments(g_applet_build, access_args)
152153
g_applet_run = p_applet.add_argument_group("run arguments")
153154
applet.add_run_arguments(g_applet_run, access_args)
154-
if mode != "run-repl":
155+
if mode not in ( "run-repl", "run-script" ):
155156
# FIXME: this makes it impossible to add subparsers in applets
156157
# g_applet_interact = p_applet.add_argument_group("interact arguments")
157158
# applet.add_interact_arguments(g_applet_interact)
@@ -245,6 +246,15 @@ def add_run_args(parser):
245246
add_run_args(p_run_repl)
246247
add_applet_arg(p_run_repl, mode="run-repl")
247248

249+
p_run_script = subparsers.add_parser(
250+
"run-script", formatter_class=TextHelpFormatter,
251+
help="run an applet and execute a script against its low-level interface")
252+
add_run_args(p_run_script)
253+
p_run_script.add_argument(
254+
"script", metavar="SCRIPT", type=argparse.FileType("r"),
255+
help="the script to run")
256+
add_applet_arg(p_run_script, mode="run-script")
257+
248258
p_run_prebuilt = subparsers.add_parser(
249259
"run-prebuilt", formatter_class=TextHelpFormatter,
250260
help="(advanced) load a prebuilt applet bitstream and run applet code")
@@ -495,12 +505,12 @@ async def _main():
495505
print("{}\t{:.2}\t{:.2}"
496506
.format(port, vio, vlimit))
497507

498-
if args.action in ("run", "run-repl", "run-prebuilt"):
508+
if args.action in ("run", "run-repl", "run-script", "run-prebuilt"):
499509
target, applet = _applet(device.revision, args)
500510
device.demultiplexer = DirectDemultiplexer(device, target.multiplexer.pipe_count)
501511
plan = target.build_plan()
502512

503-
if args.action in ("run", "run-repl"):
513+
if args.action in ("run", "run-repl", "run-script"):
504514
await device.download_target(plan, rebuild=args.rebuild)
505515
if args.action == "run-prebuilt":
506516
bitstream_file = args.bitstream or open("{}.bin".format(args.applet), "rb")
@@ -589,6 +599,12 @@ async def run_applet():
589599
logger.info("dropping to REPL; use 'help(iface)' to see available APIs")
590600
await AsyncInteractiveConsole(locals={"iface":iface},
591601
run_callback=device.demultiplexer.flush).interact()
602+
603+
if args.action == "run-script":
604+
c = compile(args.script.read(), filename=args.script.name, mode="exec",
605+
flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
606+
await eval(c, {"iface":iface, "device":device})
607+
592608
except GlasgowAppletError as e:
593609
applet.logger.error(str(e))
594610
except asyncio.CancelledError:

0 commit comments

Comments
 (0)