From 17b38e7ec1f3c89d595f9d9bbb2417d57e12b02d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20G=C3=BCnther?= <p.gunther@cern.ch>
Date: Tue, 7 May 2024 13:54:16 +0200
Subject: [PATCH] add testbench arg for writing encoding keys

---
 .../MooreScripts/testbench/architecture.py    | 25 +++++++++++++++++++
 MooreScripts/scripts/testbench.py             |  9 +++++++
 2 files changed, 34 insertions(+)

diff --git a/MooreScripts/python/MooreScripts/testbench/architecture.py b/MooreScripts/python/MooreScripts/testbench/architecture.py
index 6e9adc735..22a725e4f 100644
--- a/MooreScripts/python/MooreScripts/testbench/architecture.py
+++ b/MooreScripts/python/MooreScripts/testbench/architecture.py
@@ -12,6 +12,7 @@ import os
 import platform
 import xml.etree.ElementTree as ET
 from string import Template
+from typing import Any
 
 
 def node_name():
@@ -92,3 +93,27 @@ def instance_args(tasks, replacements):
                         "INSTANCE": instance,
                     }))
     return result
+
+
+def overwrite_dict_value(data: Any, mapping: dict) -> Any:
+    """Recursively loop through data and overwrite item's value with corresponding mapping's value.
+
+    Args:
+        data (Any): Iterable input datra
+        mapping (dict): Key value pairs to overwrite.
+
+    Returns:
+        Any: Overwritten data.
+    """
+    if isinstance(data, dict):
+        return {
+            k: mapping[k] if k in mapping.keys() else overwrite_dict_value(
+                v, mapping)
+            for k, v in data.items()
+        }
+    elif isinstance(data, list):
+        return [overwrite_dict_value(item, mapping) for item in data]
+    elif isinstance(data, tuple):
+        return (overwrite_dict_value(item, mapping) for item in data)
+    else:
+        return data
diff --git a/MooreScripts/scripts/testbench.py b/MooreScripts/scripts/testbench.py
index 550d6c4e1..f16ee43c9 100755
--- a/MooreScripts/scripts/testbench.py
+++ b/MooreScripts/scripts/testbench.py
@@ -117,6 +117,12 @@ parser.add_argument(
     type=int,
     help="Number of files to download from the TestFileDB entry",
 )
+parser.add_argument(
+    "--write-encoding-keys",
+    action="store_true",
+    help=
+    "Enables writing of the encoding keys by setting env WRITE_ENCODING_KEYS=1.",
+)
 args, unknown_argv = parser.parse_known_args()
 args.data_dir = args.working_dir / args.data_dir
 
@@ -151,6 +157,9 @@ replacements = {
 }
 
 arch = architecture.read_xml(args.architecture)
+if args.write_encoding_keys:
+    arch = architecture.overwrite_dict_value(arch,
+                                             {"WRITE_ENCODING_KEYS": "1"})
 task_instance_args = architecture.instance_args(arch, replacements)
 
 emulator.check_for_orphans([a["args"][0] for a in task_instance_args])
-- 
GitLab