about summary refs log tree commit diff stats
path: root/main.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xmain.py92
1 files changed, 92 insertions, 0 deletions
diff --git a/main.py b/main.py
new file mode 100755
index 0000000..076dc0e
--- /dev/null
+++ b/main.py
@@ -0,0 +1,92 @@
+#! /bin/python3
+
+import argparse
+
+import arancini
+from arch import x86
+from compare import compare
+from run import run_native_execution
+from utils import check_version
+
+def read_logs(txl_path, native_path, program):
+    txl = []
+    with open(txl_path, "r") as txl_file:
+        txl = txl_file.readlines()
+
+    native = []
+    if program is not None:
+        breakpoints = arancini.parse_break_addresses(txl)
+        native = run_native_execution(program, breakpoints)
+    else:
+        assert(native_path is not None)
+        with open(native_path, "r") as native_file:
+            native = native_file.readlines()
+
+    return txl, native
+
+def parse_arguments():
+    parser = argparse.ArgumentParser(description='Comparator for emulator logs to reference')
+    parser.add_argument('-p', '--program',
+                        type=str,
+                        help='Path to oracle program')
+    parser.add_argument('-r', '--ref',
+                        type=str,
+                        required=True,
+                        help='Path to the reference log (gathered with run.sh)')
+    parser.add_argument('-t', '--txl',
+                        type=str,
+                        required=True,
+                        help='Path to the translation log (gathered via Arancini)')
+    parser.add_argument('-s', '--stats',
+                        action='store_true',
+                        default=False,
+                        help='Run statistics on comparisons')
+    parser.add_argument('-v', '--verbose',
+                        action='store_true',
+                        default=True,
+                        help='Path to oracle program')
+    parser.add_argument('--progressive',
+                        action='store_true',
+                        default=False,
+                        help='Try to match exhaustively before declaring \
+                        mismatch')
+    args = parser.parse_args()
+    return args
+
+def main():
+    args = parse_arguments()
+
+    txl_path = args.txl
+    native_path = args.ref
+    program = args.program
+
+    stats = args.stats
+    verbose = args.verbose
+    progressive = args.progressive
+
+    # Our architexture
+    arch = x86.ArchX86()
+
+    if verbose:
+        print("Enabling verbose program output")
+        print(f"Verbose: {verbose}")
+        print(f"Statistics: {stats}")
+        print(f"Progressive: {progressive}")
+
+    if program is None and native_path is None:
+        raise ValueError('Either program or path to native file must be'
+                         'provided')
+
+    txl, native = read_logs(txl_path, native_path, program)
+
+    if program != None and native_path != None:
+        with open(native_path, 'w') as w:
+            w.write(''.join(native))
+
+    txl = arancini.parse(txl, arch)
+    native = arancini.parse(native, arch)
+    compare(txl, native, stats)
+
+if __name__ == "__main__":
+    check_version('3.7')
+    main()