[EXTAPI] refactor weight compression to be used by an external consumer

*lint
*added unit tests
*added typecheck
*added docstring for the api
Change-Id: Ibd4bc40d4381ac40ad2ea3d500b26c4ec565ab07
Signed-off-by: Manupa Karunaratne <manupa.karunaratne@arm.com>
diff --git a/ethosu/vela/architecture_features.py b/ethosu/vela/architecture_features.py
index 6460c52..43b3210 100644
--- a/ethosu/vela/architecture_features.py
+++ b/ethosu/vela/architecture_features.py
@@ -120,6 +120,19 @@
     Size = Accumulators + 1
 
 
+class Accelerator(enum.Enum):
+    Ethos_U55_32 = "ethos-u55-32"
+    Ethos_U55_64 = "ethos-u55-64"
+    Ethos_U55_128 = "ethos-u55-128"
+    Ethos_U55_256 = "ethos-u55-256"
+    Yoda_256 = "yoda-256"
+    Yoda_512 = "yoda-512"
+
+    @classmethod
+    def member_list(cls):
+        return [e.value for e in cls]
+
+
 class ArchitectureFeatures:
     """This class is a container for various parameters of the Ethos-U55 core
 and system configuration that can be tuned, either by command line
@@ -136,15 +149,28 @@
         "ArchitectureConfig", "macs cores ofm_ublock ifm_ublock shram_banks shram_granules elem_units"
     )
     accelerator_configs = {
-        "yoda-512": ArchitectureConfig(256, 2, Block(2, 2, 8), Block(2, 2, 8), 48, [8, 8, 8, 8, 8, 16, 20], 8),
-        "yoda-256": ArchitectureConfig(256, 1, Block(2, 2, 8), Block(2, 2, 8), 48, [8, 8, 8, 8, 8, 16, 20], 8),
-        "ethos-u55-256": ArchitectureConfig(256, 1, Block(2, 2, 8), Block(2, 2, 8), 48, [8, 8, 8, 8, 8, 16, 20], 8),
-        "ethos-u55-128": ArchitectureConfig(128, 1, Block(2, 1, 8), Block(2, 2, 8), 24, [4, 4, 4, 4, 4, 8, 12], 4),
-        "ethos-u55-64": ArchitectureConfig(64, 1, Block(1, 1, 8), Block(1, 1, 8), 16, [2, 2, 2, 2, 4, 4, 8], 2),
-        "ethos-u55-32": ArchitectureConfig(32, 1, Block(1, 1, 4), Block(1, 1, 8), 16, [2, 2, 2, 2, 4, 4, 4], 1),
+        Accelerator.Yoda_512: ArchitectureConfig(
+            256, 2, Block(2, 2, 8), Block(2, 2, 8), 48, [8, 8, 8, 8, 8, 16, 20], 8
+        ),
+        Accelerator.Yoda_256: ArchitectureConfig(
+            256, 1, Block(2, 2, 8), Block(2, 2, 8), 48, [8, 8, 8, 8, 8, 16, 20], 8
+        ),
+        Accelerator.Ethos_U55_256: ArchitectureConfig(
+            256, 1, Block(2, 2, 8), Block(2, 2, 8), 48, [8, 8, 8, 8, 8, 16, 20], 8
+        ),
+        Accelerator.Ethos_U55_128: ArchitectureConfig(
+            128, 1, Block(2, 1, 8), Block(2, 2, 8), 24, [4, 4, 4, 4, 4, 8, 12], 4
+        ),
+        Accelerator.Ethos_U55_64: ArchitectureConfig(
+            64, 1, Block(1, 1, 8), Block(1, 1, 8), 16, [2, 2, 2, 2, 4, 4, 8], 2
+        ),
+        Accelerator.Ethos_U55_32: ArchitectureConfig(
+            32, 1, Block(1, 1, 4), Block(1, 1, 8), 16, [2, 2, 2, 2, 4, 4, 4], 1
+        ),
     }
 
     OFMSplitDepth = 16
+    SubKernelMax = Block(8, 8, 65536)
 
     def __init__(
         self,
@@ -159,20 +185,18 @@
     ):
         accelerator_config = accelerator_config.lower()
         self.vela_config = vela_config
-        self.accelerator_config = accelerator_config
-        if self.accelerator_config not in ArchitectureFeatures.accelerator_configs:
+        if accelerator_config not in Accelerator.member_list():
             raise OptionError("--accelerator-config", self.accelerator_config, "Unknown accelerator configuration")
+        self.accelerator_config = Accelerator(accelerator_config)
         accel_config = ArchitectureFeatures.accelerator_configs[self.accelerator_config]
         self.config = accel_config
 
         self.system_config = system_config
-
-        self.is_yoda_system = "yoda-" in self.accelerator_config
+        self.is_yoda_system = self.accelerator_config in (Accelerator.Yoda_256, Accelerator.Yoda_512)
 
         self.ncores = accel_config.cores
         self.ofm_ublock = accel_config.ofm_ublock
         self.ifm_ublock = accel_config.ifm_ublock
-        self.subkernel_max = Block(8, 8, 65536)
         self.ofm_block_max = Block(64, 32, 128)
         self.override_block_config = override_block_config
         self.block_config_limit = block_config_limit