diff --git a/code_coverage/ingest_tarmac.py b/code_coverage/ingest_tarmac.py
index 64d9251..bc386e0 100755
--- a/code_coverage/ingest_tarmac.py
+++ b/code_coverage/ingest_tarmac.py
@@ -1,6 +1,6 @@
 #!/usr/bin/python3
 # -----------------------------------------------------------------------------
-# Copyright (c) 2024, Arm Limited. All rights reserved.
+# Copyright (c) 2024-2025, Arm Limited. All rights reserved.
 #
 # SPDX-License-Identifier: BSD-3-Clause
 #
@@ -10,12 +10,28 @@
 import logging
 import re
 import elftools
+from itertools import islice
 
-def parse_line(line: str) -> str:
+def parse_line_fvp(line: str) -> str:
     split = line.split(" ")
-    addr = split[5]
-    size = len(split[6]) // 2
-    logging.debug("Instruction at {} of size {}".format(addr, size))
+    try:
+        addr = split[5]
+        size = len(split[6]) // 2
+        logging.debug("Instruction at {} of size {}".format(addr, size))
+    except Exception as e:
+        print("Parse error {} for line {}".format(e,line))
+        raise Exception
+    return (addr, size)
+
+def parse_line_rtl(line: str) -> str:
+    try:
+        split = line.split(" ")[1].replace("(", "").replace(")", "").split(":")
+        addr = split[0]
+        size = len(split[1]) // 2
+        logging.debug("Instruction at {} of size {}".format(addr, size))
+    except Exception as e:
+        print("Parse error {} for line {}".format(e,line))
+        raise Exception
     return (addr, size)
 
 parser = argparse.ArgumentParser()
@@ -27,19 +43,26 @@
 # logging setup
 logging.basicConfig(level=args.log_level)
 
-with open(args.input_file, "rt") as input_file:
-    trace = input_file.read()
-
-instructions = re.findall("[0-9]* [a-z]{2} [a-z\.]* IT .*", trace)
-
+instructions = []
+parse_function = parse_line_fvp
 hit_counts = {}
 
-for i in instructions:
-    addr = parse_line(i)
-    if addr in hit_counts.keys():
-        hit_counts[addr] += 1
-    else:
-        hit_counts[addr] = 1
+with open(args.input_file, "rt") as input_file:
+    while(lines := list(islice(input_file, 100000))):
+        lines = ''.join(lines)
+        chunk_instructions = re.findall(r'[0-9]* [a-z]{3} [a-z\.]* IT .*', lines)
+
+        if len(chunk_instructions) == 0:
+            chunk_instructions = re.findall(r'[0-9]* clk ES (.*:.*).*', lines)
+            if len(chunk_instructions) != 0:
+                parse_function = parse_line_rtl
+
+        for i in chunk_instructions:
+            addr = parse_function(i)
+            if addr in hit_counts.keys():
+                hit_counts[addr] += 1
+            else:
+                hit_counts[addr] = 1
 
 with open(args.output_file, "w+") as output_file:
     output_file.writelines(["{} {} {}\n".format(x[0], hit_counts[x], x[1]) for x in hit_counts.keys()])
