MLBEDSW-1941: Bug fix shared weights

If same weight tensor was used with different block configs,
errors would occur.

Fixed by always cloning weight tensors, using a global weight
compression cache and modifying the linear allocator to
detect multiple usage of same weight compression.

Change-Id: I91ca59176e1c59c66e0ac7a4227f2b5f0b47053f
Signed-off-by: Louis Verhaard <louis.verhaard@arm.com>
diff --git a/ethosu/vela/high_level_command_stream_generator.py b/ethosu/vela/high_level_command_stream_generator.py
index 0cc70a7..3b968dc 100644
--- a/ethosu/vela/high_level_command_stream_generator.py
+++ b/ethosu/vela/high_level_command_stream_generator.py
@@ -27,12 +27,8 @@
 from .tensor import TensorPurpose
 
 
-def need_dma(tens):
-    return len(tens.ops) == 1 and tens.ops[0].type == "DMA"
-
-
 def dma_if_necessary(ps, box, tensor):
-    if need_dma(tensor):
+    if tensor.needs_dma():
         dma_op = tensor.ops[0]
         in_tensor = dma_op.inputs[0]
         yield DMA(in_tensor, tensor, box)
@@ -93,7 +89,7 @@
     if strat == SchedulingStrategy.WeightStream:
         ofm_step = block_config[-1]
         ofm_stop = ofm_end[-1]
-        if weight_tensor is None or not need_dma(weight_tensor):
+        if weight_tensor is None or not weight_tensor.needs_dma():
             ofm_step = ofm_stop
         for start in range(ofm_start[-1], ofm_stop, ofm_step):
             end = min(start + ofm_step, ofm_stop)