Restructure the configuration representation

Signed-off-by: Gabor Mezei <gabor.mezei@arm.com>
diff --git a/scripts/config.py b/scripts/config.py
index d73ce6c..8fda2e2 100755
--- a/scripts/config.py
+++ b/scripts/config.py
@@ -58,7 +58,7 @@
     """
 
     # pylint: disable=unused-argument
-    def __init__(self, **kw):
+    def __init__(self):
         self.settings = {}
 
     def __contains__(self, name):
@@ -561,17 +561,18 @@
     See the documentation of the `Config` class for methods to query
     and modify the configuration.
     """
-    def __init__(self, mbedtls_config=None, **kw):
+    def __init__(self, filename=None):
         """Read the Mbed TLS configuration file."""
         super().__init__()
-        self.mbedtls_config = MbedtlsConfigFile(mbedtls_config)
-        self.settings.update({name: Setting(active, name, value, section, self.mbedtls_config)
+        self.configfile = MbedtlsConfigFile(filename)
+        self.settings.update({name: Setting(active, name, value, section)
                               for (active, name, value, section)
-                              in self.mbedtls_config.parse_file()})
+                              in self.configfile.parse_file()})
 
     def set(self, name, value=None):
         if name not in self.settings:
-            self.mbedtls_config.templates.append((name, '', '#define ' + name + ' '))
+            self.configfile.templates.append((name, '', '#define ' + name + ' '))
+
         super().set(name, value)
 
     def write(self, filename=None):
@@ -579,10 +580,10 @@
 
         If filename is specified, write to this file instead.
         """
-        self.mbedtls_config.write(self.settings, filename)
+        self.configfile.write(self.settings, filename)
 
-    def filename(self, name):
-        return self.mbedtls_config.filename
+    def filename(self):
+        return self.configfile.filename
 
 class CryptoConfig(Config):
     """Representation of the PSA crypto configuration.
@@ -590,13 +591,13 @@
     See the documentation of the `Config` class for methods to query
     and modify the configuration.
     """
-    def __init__(self, crypto_config=None, **kw):
+    def __init__(self, filename=None):
         """Read the PSA crypto configuration file."""
         super().__init__()
-        self.crypto_config = CryptoConfigFile(crypto_config)
-        self.settings.update({name: Setting(active, name, value, section, self.crypto_config)
+        self.configfile = CryptoConfigFile(filename)
+        self.settings.update({name: Setting(active, name, value, section)
                               for (active, name, value, section)
-                              in self.crypto_config.parse_file()})
+                              in self.configfile.parse_file()})
 
     def set(self, name, value=None):
         if name in UNSUPPORTED_FEATURE:
@@ -605,7 +606,8 @@
             raise ValueError(f'Feature is unstable: \'{name}\'')
 
         if name not in self.settings:
-            self.crypto_config.templates.append((name, '', '#define ' + name + ' ' + '1'))
+            self.configfile.templates.append((name, '', '#define ' + name + ' '))
+
         super().set(name, value)
 
     def write(self, filename=None):
@@ -613,43 +615,65 @@
 
         If filename is specified, write to this file instead.
         """
-        self.crypto_config.write(self.settings, filename)
+        self.configfile.write(self.settings, filename)
 
-    def filename(self, name):
-        return self.crypto_config.filename
+    def filename(self):
+        return self.configfile.filename
 
-class MultiConfig(MbedtlsConfig, CryptoConfig):
+class MultiConfig(Config):
     """Representation of MbedTLS and PSA crypto configuration
 
     See the documentation of the `Config` class for methods to query
     and modify the configuration.
     """
 
-    def __init__(self, mbedtls_config, crypto_config):
-        super().__init__(mbedtls_config=mbedtls_config, crypto_config=crypto_config)
+    def __init__(self, mbedtls_filename=None, crypto__filename=None):
+        super().__init__()
+        self.mbedtls_configfile = MbedtlsConfigFile(mbedtls_filename)
+        self.crypto_configfile = CryptoConfigFile(crypto__filename)
+        self.settings.update({name: Setting(active, name, value, section, configfile)
+                              for configfile in [self.mbedtls_configfile, self.crypto_configfile]
+                              for (active, name, value, section) in configfile.parse_file()})
 
     _crypto_regexp = re.compile(r'$PSA_.*')
-    def _get_related_config(self, name):
-        if re.match(self._crypto_regexp, name):
-            return CryptoConfig
+    def _get_configfile(self, name):
+        """Find a config type for a setting name
+        """
+        if name in self.settings:
+            return self.settings[name].configfile
+        elif re.match(self._crypto_regexp, name):
+            return self.crypto_configfile
         else:
-            return MbedtlsConfig
+            return self.mbedtls_configfile
 
     def set(self, name, value=None):
-        super(self._get_related_config(name), self).set(name, value)
+        configfile = self._get_configfile(name)
 
-    # pylint: disable=arguments-renamed
+        if configfile == self.crypto_configfile:
+            if name in UNSUPPORTED_FEATURE:
+                raise ValueError(f'Feature is unsupported: \'{name}\'')
+            if name in UNSTABLE_FEATURE:
+                raise ValueError(f'Feature is unstable: \'{name}\'')
+
+        if name not in self.settings:
+            configfile.templates.append((name, '', '#define ' + name + ' '))
+
+        super().set(name, value)
+
     def write(self, mbedtls_file=None, crypto_file=None):
         """Write the whole configuration to the file it was read from.
 
         If mbedtls_file or crypto_file is specified, write the specific configuration
         to the corresponding file instead.
         """
-        self.mbedtls_config.write(self.settings, mbedtls_file)
-        self.crypto_config.write(self.settings, crypto_file)
+        self.mbedtls_configfile.write(self.settings, mbedtls_file)
+        self.crypto_configfile.write(self.settings, crypto_file)
 
-    def filename(self, name):
-        return self.settings[name].configfile
+    def filename(self, name=None):
+        if not name:
+            return [config.filename for config in [self.mbedtls_configfile, self.crypto_configfile]]
+
+        return self._get_configfile(name).filename
 
 if __name__ == '__main__':
     #pylint: disable=too-many-statements