From 5580dc74eccffc1ce396b32b419e1dda064a81ec Mon Sep 17 00:00:00 2001
From: Mikael Henriksson <mike.zx@hotmail.com>
Date: Tue, 9 May 2023 14:35:35 +0200
Subject: [PATCH] add max and min lifetime plot test, and multi-read memory
 variable test (closes #245)

---
 b_asic/resources.py                           |  20 ++++---
 .../test_max_min_lifetime_bar_plot.png        | Bin 0 -> 11016 bytes
 test/test_resources.py                        |  55 +++++++++++++++++-
 3 files changed, 66 insertions(+), 9 deletions(-)
 create mode 100644 test/baseline/test_max_min_lifetime_bar_plot.png

diff --git a/b_asic/resources.py b/b_asic/resources.py
index 208c0239..8ad13879 100644
--- a/b_asic/resources.py
+++ b/b_asic/resources.py
@@ -550,8 +550,8 @@ class ProcessCollection:
                 else bar_start % self._schedule_time
             )
             bar_end = (
-                bar_end
-                if bar_end == self._schedule_time
+                self.schedule_time
+                if bar_end and bar_end % self._schedule_time == 0
                 else bar_end % self._schedule_time
             )
             if show_markers:
@@ -564,8 +564,8 @@ class ProcessCollection:
                 )
                 for end_time in process.read_times:
                     end_time = (
-                        end_time
-                        if end_time == self._schedule_time
+                        self.schedule_time
+                        if end_time and end_time % self.schedule_time == 0
                         else end_time % self._schedule_time
                     )
                     _ax.scatter(  # type: ignore
@@ -583,15 +583,19 @@ class ProcessCollection:
                     color=_WARNING_COLOR,
                 )
             elif process.execution_time == 0:
-                # Execution time zero, don't draw the bar
-                pass
+                # Execution time zero, draw a slim bar
+                _ax.broken_barh(  # type: ignore
+                    [(PAD_L + bar_start, bar_end - bar_start - PAD_L - PAD_R)],
+                    (bar_row + 0.55, 0.9),
+                    color=bar_color,
+                )
             elif bar_end > bar_start:
                 _ax.broken_barh(  # type: ignore
                     [(PAD_L + bar_start, bar_end - bar_start - PAD_L - PAD_R)],
                     (bar_row + 0.55, 0.9),
                     color=bar_color,
                 )
-            else:  # bar_end < bar_start
+            else:  # bar_end <= bar_start
                 _ax.broken_barh(  # type: ignore
                     [
                         (
@@ -1224,7 +1228,7 @@ class ProcessCollection:
         Forward-Backward Register Allocation [1].
 
         [1]: K. Parhi: VLSI Digital Signal Processing Systems: Design and
-            Implementation, Ch. 6.3.2
+             Implementation, Ch. 6.3.2
 
         Parameters
         ----------
diff --git a/test/baseline/test_max_min_lifetime_bar_plot.png b/test/baseline/test_max_min_lifetime_bar_plot.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c42a415a67107e00e5aa19325c24b0e8995b4de
GIT binary patch
literal 11016
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
HzyH4g2QuVF

literal 0
HcmV?d00001

diff --git a/test/test_resources.py b/test/test_resources.py
index 6248c41c..6751879f 100644
--- a/test/test_resources.py
+++ b/test/test_resources.py
@@ -1,4 +1,3 @@
-import pickle
 import re
 
 import matplotlib.pyplot as plt
@@ -145,3 +144,57 @@ class TestProcessCollectionPlainMemoryVariable:
         simple_collection.remove_process(new_proc)
         assert len(simple_collection) == 7
         assert new_proc not in simple_collection
+
+    @pytest.mark.mpl_image_compare(style='mpl20')
+    def test_max_min_lifetime_bar_plot(self):
+        fig, ax = plt.subplots()
+        collection = ProcessCollection(
+            {
+                # Process starting exactly at scheudle start
+                PlainMemoryVariable(0, 0, {0: 0}, "S1"),
+                PlainMemoryVariable(0, 0, {0: 5}, "S2"),
+                # Process starting somewhere between schedule start and end
+                PlainMemoryVariable(2, 0, {0: 0}, "M1"),
+                PlainMemoryVariable(2, 0, {0: 5}, "M2"),
+                # Process starting at the schedule end
+                PlainMemoryVariable(5, 0, {0: 0}, "E1"),
+                PlainMemoryVariable(5, 0, {0: 5}, "E2"),
+            },
+            schedule_time=5,
+        )
+        collection.plot(ax)
+        return fig
+
+    def test_multiple_reads_exclusion_greaph(self):
+        # Initial collection
+        p0 = PlainMemoryVariable(0, 0, {0: 3}, 'P0')
+        p1 = PlainMemoryVariable(1, 0, {0: 2}, 'P1')
+        p2 = PlainMemoryVariable(2, 0, {0: 2}, 'P2')
+        p3 = PlainMemoryVariable(3, 0, {0: 3}, 'P3')
+        collection = ProcessCollection({p0, p1, p2, p3}, 5, cyclic=True)
+        exclusion_graph = collection.create_exclusion_graph_from_ports(
+            read_ports=1,
+            write_ports=1,
+            total_ports=1,
+        )
+        for p in [p0, p1, p2, p3]:
+            assert p in exclusion_graph
+        assert exclusion_graph.degree(p0) == 2
+        assert exclusion_graph.degree(p1) == 2
+        assert exclusion_graph.degree(p2) == 0
+        assert exclusion_graph.degree(p3) == 2
+
+        # Add multi-read process
+        p4 = PlainMemoryVariable(0, 0, {0: 1, 1: 2, 2: 3, 3: 4}, 'P4')
+        collection.add_process(p4)
+        exclusion_graph = collection.create_exclusion_graph_from_ports(
+            read_ports=1,
+            write_ports=1,
+            total_ports=1,
+        )
+        for p in [p0, p1, p2, p3, p4]:
+            assert p in exclusion_graph
+        assert exclusion_graph.degree(p0) == 3
+        assert exclusion_graph.degree(p1) == 3
+        assert exclusion_graph.degree(p2) == 1
+        assert exclusion_graph.degree(p3) == 3
-- 
GitLab