diff --git a/b_asic/architecture.py b/b_asic/architecture.py
index 28f44d96d4c0a4deb4e696b88a417e9ba3006bfb..2d17dd76cba12529cf9e2ca784bb5363bf21decc 100644
--- a/b_asic/architecture.py
+++ b/b_asic/architecture.py
@@ -8,6 +8,7 @@ from typing import Dict, Iterable, Iterator, List, Optional, Set, Tuple, Union,
 import matplotlib.pyplot as plt
 from graphviz import Digraph
 
+from b_asic.mpl_utils import FigureWrapper
 from b_asic.port import InputPort, OutputPort
 from b_asic.process import MemoryVariable, OperatorProcess, PlainMemoryVariable
 from b_asic.resources import ProcessCollection
@@ -174,19 +175,34 @@ class Resource(HardwareBlock):
         # doc-string inherited
         return self._collection.schedule_time
 
-    def show_content(self):
+    def plot_content(self, ax: plt.Axes) -> None:
         if not self.is_assigned:
-            self._collection.show()
+            self._collection.plot(ax)
         else:
-            fig, ax = plt.subplots()
             for i, pc in enumerate(self._assignment):  # type: ignore
                 pc.plot(ax=ax, row=i)
-            fig.show()  # type: ignore
+
+    def show_content(self):
+        fig, ax = plt.subplots()
+        self.plot_content(ax)
+        fig.show()  # type: ignore
 
     @property
     def is_assigned(self) -> bool:
         return self._assignment is not None
 
+    @property
+    def content(self) -> FigureWrapper:
+        """
+        Return a graphical representation of the content.
+
+        This is visible in enriched shells, but the object in itself has no further
+        meaning.
+        """
+        fig, ax = plt.subplots()
+        self.plot_content(ax)
+        return FigureWrapper(fig)
+
 
 class ProcessingElement(Resource):
     """
diff --git a/b_asic/mpl_utils.py b/b_asic/mpl_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..f0213df85a28617dd9070e097bef763a3c4f58d3
--- /dev/null
+++ b/b_asic/mpl_utils.py
@@ -0,0 +1,18 @@
+"""
+B-ASIC utilities for Matplotlib integration.
+"""
+import io
+
+from matplotlib.figure import Figure
+
+
+class FigureWrapper:
+    """Simple wrapper to display a figure inline in enriched shells."""
+
+    def __init__(self, figure: Figure):
+        self._figure = figure
+
+    def _repr_svg_(self):
+        buffer = io.StringIO()
+        self._figure.savefig(buffer, format="svg")
+        return buffer.getvalue()
diff --git a/docs_sphinx/api/index.rst b/docs_sphinx/api/index.rst
index 484dfd3b104578a508dc5a9c383ee08306e1d025..e0cf7ef388c7e1d9f02f7e1cf1ca8ef490e62afb 100644
--- a/docs_sphinx/api/index.rst
+++ b/docs_sphinx/api/index.rst
@@ -8,6 +8,7 @@ API
     architecture.rst
     core_operations.rst
     graph_component.rst
+    mpl_utils.rst
     operation.rst
     port.rst
     process.rst
diff --git a/docs_sphinx/api/mpl_utils.rst b/docs_sphinx/api/mpl_utils.rst
new file mode 100644
index 0000000000000000000000000000000000000000..2a528cc0d03bedd985bbc18509b3f11d4fdf686b
--- /dev/null
+++ b/docs_sphinx/api/mpl_utils.rst
@@ -0,0 +1,7 @@
+********************
+``b_asic.mpl_utils``
+********************
+
+.. automodule:: b_asic.mpl_utils
+   :members:
+   :undoc-members: