From cf1f9cdae2f36fe3bfaf61ae1fd1d75811700f65 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                           |  18 +++---
 .../test_max_min_lifetime_bar_plot.png        | Bin 0 -> 11016 bytes
 test/test_resources.py                        |  55 +++++++++++++++++-
 3 files changed, 65 insertions(+), 8 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 9b2a6bbc..1e8530a3 100644
--- a/b_asic/resources.py
+++ b/b_asic/resources.py
@@ -549,8 +549,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:
@@ -563,8 +563,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
@@ -582,15 +582,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
                     [
                         (
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
zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sV0^&A#=yW}dhyN^1_lPp64!{5;QX|b^2DN4
z2H(Vzf}H%4oXjMJvecsD%=|oKJ##%n9fgdNl7eC@ef?ax0=@jAbp6|09PJDY44efX
zk;M!Q{D~mUxWayUCIf?3si%u$NX4ADcdKhezV7}1@w>{+oE<q$4;LwLE?~8h(u<qm
zHenIdtYC|RRok`}uzXo=s~eS>6}?gGVPN)!RY!|AaQqW_W6AHbTHyBw^@I=wrlNd}
z8%opLqgoiGRLm!(PM&*Te&T^i1)MEs4m|%_WAkm|n=@}d%>4W2&A!ibZyqd+y)MeY
zz;LGH^DYJk1_l#-CItqD216DH1_p*?js^w>hGPN@j0_AtiVRE)3=+-^EDQ_=Z44X?
z3<*4p0t^fXBt|vh4JDtZ>#TE5FS@v*?ESs90U9dD3-{=;Gce3yx?UO@7Pic9u9c?V
zxn~g)j30R3+}j(SnVA_kosogT@9?>~)>n5Hr>{T#fraq{Pm7bH=cVQI>sDR464JkV
zqpncri@W9buWm>@EW*LENAI{v)kFO+hwWdq*1x&GKmP8n($&9Zws$a8u<^-%<85{F
z^7H$)L+ZBD#Ez(KIV+z$Nx2tc>!$ywweAP|-VgmADoUQq{O@n7d?3xhaKM0SG3xnY
zSHtIv+q$x*UfmHlJ<)56m6GSJ2(dt!^;!NGx$76o|8vyeBivPfWv{6JuZtCCvu<qb
z%K94daq9Kd8J7>Oy|#K1+uFP9z1pX5o&KVA{{{a43&ii;vRWXk_(4O4DKDw#4<o|^
z`x?9BN_0w_lOL2as>%HD`gQsJQq%WW|J}24-Swm>vt-+pYq7uPFJH=gdP(i>B~wCP
z?$XJ8vwlg~$+&Pn28MIaEC<v!)ch>smA8xe`0*pJ{)gNDl|$W^u>bddHAAoV@6?bV
z3qyWw-BQ0kWRLr<=Z2bl+qb;ue!0Ic*81(m|F`!@Gcg>f)RE!KetK%^tE;Q0Utd~r
z?u+7s*xhBBXJ!~?-QKn~YD>n#xV=@GcXyTc#+_dgxcJJ}?C`Vm?f3sX^GPW4bJoju
z_dROaJ;axJPLI|6`yoB(+1a4$r<WX$o3zi?=hc<aSJnYi-zRLbieI(T?sG2-1A~<a
zU-p$1fxA8)lm2=_xxXT|@A(<F1MBzyi(+Qu2~ZHYaHy60>-YWtW6#@s?$O)vpy_hd
z{dKXsOK#_Gf7!fWr(^ELMWJtVpDMi!_;DpHEKqA}j_y%o2X2M~lGY+&-}>{e?tZ^d
z+jEv>@v`HrmFIH~ReU<BK6To(Wj8mcU-x}|ZSC#M_2)}tE&CQPm;crJ<&oCQ4-X&w
zV0kHic}eE}DgW;O_qhK`_3N)~CKVxXD;th$X-<3g&+(L0@vW^43=NC_)Xuf5dLO%f
z^#{?-j34yte|G2X`<ZsP?)TfMZ8<ab_Welu`(?TPRom}(itik6Ih@#f*xl`;m$!HF
zv)$`f@7=vG;L)<FUGFDXrW`vE{Upvh;^NtCk-x{;T(9efemP$slJF?lOXAyK<^J^=
z!9Ok<7G2t{U3kXDQm?(iKa_jB+B5Y%&aj--cl&o#@1F1KRk_!A)_Z^CJzg4n{k77b
z2~(!1c%C|U?%Lb!_t$OBzW%C_UG4(6{+<OJlaHJIm@#LLjPFdNr%PU+J9qBd0>@^*
z9cRA0yu7vWvD@AskGdx<Id#hG>60fK5<IUay2}M7B_%0u=U`xv@i&nQEi2n*_xsJ}
zU74z?s$PEEDv$DRW;8G~47?sw+#9woCer+Ey8Z8&*Ve_Z?zj83;^1);6Q&u{riInt
z_1`CF&2*#T#O%!>e{Yp+t@xY2Rk?n@q_X;i6-Vy>^YjbqzI;b(chnBkD$AG^yPIl5
zU&=hceIrBc%c1xe?e!P9-|twrdLnnx>t2Q^zJ@e@#_~5e0;k8zRrB53|L64n7iZ1y
z+q_F|I=G<e;Df^F)_sfl=IUL$7kAyWz5Ly!zn30=_cH$<@T#ox?R4vHc~kCHIG)<$
zI+a~}>HVIGho%<Q|J}1nOMB_5Q@4&U+hSX!r|9RoRCvAD@i(V$g~JL4xf?s04(~s1
z@S97<AfdtT=ab1ZGNZTWg-+Lt^~<j9d+aeuZqBcsy2_Fa@2t@3o6~=8Ub5(X_Imak
z`zB8@-SsWVAo`zH?#+PRZ+;}Z@y16g$A;9m2r@939C~_Pqxgiu+J6shT^9$gU;UAF
zGvkNn_WyUT+x^bU_Tv%ZU;n=EUvHXyE#umn$XTY@*D}|xFMfV*mRatsU3`*?Yqji*
zlnpiRew}?Q+WA+Ex~`tp+InFIhB-|~7R;Obd)cx(mAl1sqn613|8e}8K5OzftA@Y7
zzFux(<^J+&^?EI3W#|2W-{za<-ZJTxv)y&^^{LaRFN3Oq_qFe<(-#IYFcd5kYIc13
z^l9eFNvc(UJ|5qzcf2^wok2D8$A^bfb~QgF*QY-?(0KfR{sRVv27Q)hM_xIbh@(f3
zs>lDZNiSmoRpDAxEAWYIB>3uxyswC5Vqmafn}2?z&>p=9HJA5>Hf`g}SiVW>`s*N{
z&M@~aubo#eh+p+ch$(J*vee!W;=dlse>r5mu)_Urv|wf5vCV~IAC$7|CU$J`4w@g}
z(8!R#CT@}VKPUS?&2b0(Em(LEEtI}cvqs-kK~;98((jhn85kITNNO(SOv(Kb6}mQg
zd9Lh*J^>B}hMG?21L>Uinb;T@>Rjp8%(=m{@6RXizfaWd1FNcbH62`_x9f${-I~v5
zqc$eBs$^bU6Deg=v0>8W$xki%_+%^|<Q`;Tc(7;MgHp!l&98h{FHP{)T)cmZ#2WMe
z*P`>UE_81Ha!Pysi%H&k7w_$@{`&9t`_(&kL`*9A@WAnI(P`aXPp3tjWL{eGOi!MH
zK_c0T;n|ZX8K<Ub8eXpY_GYDS^fr?$+pCt3v+H-7IM4c4=EGrA@Swr&&j)AS*j*v_
zf1WE>@r>P7a&hbRxajR?j&usEdU{XS%l+d9YB^5&>3kqOrm(fEtLs(X>FN6Rf2Y2^
zq2nu~C(Cu+H|y@Mtx?<a*6!J3(|Y)!u#E%*!-C2g{0*F(oV#8u>VB2?_SRPG&7$va
z=+y2}OZ!{=?94^&^?MeX<=)CT(7;&r<6-;P?fd_}<<VwmV6d=V#?R<|X<P2?D=UN5
zRaI3rjg5nM?%e6+@1I|Av%o^exGOv=>ehoI#+_YZ?joI6?)~3h|J$5b+RW$lbp7kE
zuCCr%@iEEv>y=<o{qt_m=X1M`hlYoHPg0uLq0}zl6I}G;=cCHca<DXK|Dy59j&-lA
zVq3z+^kP<g`c(Aw&COs}SJzoasa<7nZ!JAL+gw|O>uU7Ag~e>rljhD{>)6aTw_xVW
z%geJLAM369cvSrLvfNu+JV8b7zwh<`!`DV{&-=s1$j~s^s^Y_fx-X06S1wuNa`NQK
zxap5MFEf6KVCRzwn64N5<;~{vuiou`zs`LBLcs%Dwrr_7&AM#gvZ>#B!siD(*zy0`
zmdwjvo=o;%wPMAJyjz=6Pn(py2zYyYyMOMjEtZ>m4b_A?HSF!<o!j|B6$<`5mra+4
z`>CtD`|8GI_sfhI{wO|JyfyQ(n{CyX3*X+}mYyTe!zRjeZU33m8<mPgrV9ip2m}-s
zZp_>Nx9o1|_1IT;cW-xEIN{pb=;i72D&3Ub`$7~1F3hv7-jaS^uJ+r_^hrx}qqk{@
zaB14w#;#ns(syU)^SurV2c%c~Uw}3Fj(_%N=n0IATPJH>_QL+(V|%}P)#+&-;W9gq
zc)z~3_Uiun`o9nP>o4@lT8nhLOqn)qS@pY}?)>(DHmJO86_4w%+*0%7!^bx_H=E|&
z*>QP2D+9v<#%0V8n)&Tk2r9d+@Sd)BYj5>-HUD{Qe*CDoTX<Y{`SwF>>zE~Y*rv{&
zz533bJCE&j)YaWBEiIRS&u3y_Fq!m{;m1+&_!oWF??8UNwLO1*BQtx})m5Qc_xIH<
zzBYM+ar9NswOQ`}q<+i?b&dWUDPfpno*y@Pjrzjy`q1tB7I<D`Wnd`SHgms#2?Ile
zDZM*T=O+d1d0ff~>ce`0THOZ^t=0=D%DTPlH@L+7c!i09p<ZdJNn_l?hFfavd-RwY
z7#>V1;E(`y;oKNzA6T}jV-mCA`qKuwQL(@O<m+^6^o5shwz?WDw=Fbe^_pY3ZCwQ>
z-+2Eo5dRk#bu8UX|Df80tq-$9w|?8jbvtUu)vC}-3%33aefeQiUS2f&7VAWgJ7Ixq
z<+S%@9qTHP_}x~2f&0IQ*8f|tg=~&1CNQMGNl~uu`NP<-pYGku2ffSXC*-};u>HRJ
z*XL#atLA?H!o2nS^S{$e{_9>^k?(o`{Dh)op4QvVvv)ES*eNp9CBM3|vPi~VSl#c-
zE|CXwMEKgj-m89}`SQ|IEe(wemzH{ixSBG2^8X#*T6><pH|fw+_hquHCQZ|sU=>r7
za_hd`B)6XF%l_JHem7mYEUM~9d(hQ`o3}eM6v%mh*u`KUvAb+-+POI^@9nLwj^!%w
zvl8KZef$2-xYpLz(#!K|zeRcm-QQPh`uHxtblrpPRi3W%y|wR6%-gfI?AE99CEvuo
z#h1!PzUvH6mjB+Jd5OQu^R}7SUZdH0&I|`QJ}Wmoefm_&wrWdU%}3YRf`hDa)0yW~
z^R=43Th?g!@O?&WYpYcGWrvp+3f-9U|1I3|W2^Fa@$-}0{ysSJKg~7r?RkOUIt+98
zJ~I{^YT^9#u6+M$Md!APSgwM+TYIAB=iI6|<Z5?wOW>~x-^0fFd$yL{yEk|1_WkRp
z=I#3WL%Z8;skq$abuZLQ_rBrbVrSUxBhNI?Jb#{9&W#0Iv#-y)^yy)N#j~1amo5c)
z261n9>x-@p%Q~_$^Wn84e_TGVEL(CyQ%8Kl>XyadCOhYatczg{zNJy~wzsRgeBP5?
zU2)Zmn@(zSou2yGZED4teWe+{R9x+EFM447`R02+Mre{N$_{y2Dkx_x%~1aC&PsN<
z3WuLRe|mX&SuH*O<k_>VQ&Tj*F0-%Cm>d<hHRqL3p;R27cvWnZCF}37*EfSB-u<gx
zZMs4$qWu5PSxKQ+LS8&v^);&e@YPwS+0#^B-m89p)im_=SC_MlTUT|yXk7KRw11{)
z_O!6|ackA*RXB;am3fEmo?TUZF8Yl$sIOc8;ezAe6R(wQo<S-U@lT&VeR==?-}|oq
z{`IrNf`gTh7mA3BF9%g({#g|)2D-Yw;(IoFhOWJB68<v7fqT1~emi$*_=fdbbAL>>
zXYgINt6-@T|J)~YY&{!SuGd`nzO?i^zwO`RouW&*{OUaOe0x{Dd!ujJHz_VsRoyP`
zp=SB%%&BXRu>V)MUMl+Y@#0mHJ3S6A|F>pG_wKo8eXZ7S$OjJyEcwLz>({n8Elth9
zqM}XLpH>`t!|}k^{O%Ip*=9$5r0whW=<R-E^!L~G{p-a4sc1^@Xi4x~n;rM^$m&yu
zze9d`fm-KP7x(ym^gq!d<J$MGS6Kbz%D3T8O<$7UnzybN;(MRm_vFacbMyZNyj_}D
zl%{>h$n{rM{adBAPC*-7C+D8}*;5M|%=jL|wBs&=1Xt^ni4z5l*M_bR%euWSckfFE
zKZV8ntG>M|KBV9D<;_+1`7woWJFj2XD*02Hzdz{r=jq35ET4#9_WReH$lzd`#;nkw
zHc8^jobS_Ls~=vM{~^ereLeGxpVvR#kmR>3fAsa)8Ou+<A1yN06J{u2Vf>)sJzekX
zE|v##rbzIB>VT+yH9HqwTmfpPN9XNyEi5dQvM5+!$9LRQ%l>5*1H;*7295=uEX|I0
zOD_9%xhR1ubvAyvH4X{^*2Xnj;$4gkCgPvPo7fl_Hqd?Otif2UtNdJs9m9f3)r!~y
zKNB8?ifdSIU3)!shS=J^jO*<|j{8H7s)ELlrUdL+{BEt^pRh~t#`yM`s}3cC)9#<e
zCHqU7ue(<CFx+6NYGulredgSor5-M~R9E_IEO2Ou`*HE4lhQdpXcZyz@aJ;@1JF?7
zA5XpqJvpma^jU6^Ufbs}$!wadNck1(Gb?4Z*ceRs@AWdy*_JDM_0`5lt7l~D-pSgl
zm3iUT-&G|^_mj5qWw>*&Fvvd;Fle}Z?S_8o2UP)v5A5{rt}xgb=H0Qd>|6Z*&-wpr
z%<~Vma2Cn9KR(twSw&PtB;!bj;HxVuC(9fUjEjr=EXK|7T=Ftw!Lc4mP*Z8r<jGU#
z%vp2hjE`>2jtj3hH56Z7xM9mehpVmHp#cHEgQdB$mdm?GMa_D4cJ}g9r%vt43=IvP
zWnI4R(&fvqmxYFetni<2SM~4b^YgFN7#c)5<HR2<JvY}n`_+||ukP*L9drFEsGU4f
z+5Oe}`oF8!?Rdns{xtJB+4e)1jy$~7cecx;>f4LT>1iI9?@beG{wh~?H8ec)c%SSn
z`}%!u{c^gVAjYN3m#?mk-oESUrcIlsOr2U<ww;lI$IzC^BIyXn-`D&9t=?7sex00c
z)r<1|zvqHl@u923Dr2Pz-dSk<G0iys?AFiYlAL>9uiI@>{q4=J-}?LiY&zC2UvH+x
z%20E-guy1t*SGiC+1bmxy0}u)(yC(l3f|q=^XtdM_ZwtqFYUi>Vv&7jh9M}E+5P`h
zT>J0mb5P&sSdV0}7#AypOxiDj4Jx4K^URquSFKtV^!nP`tqBL2V(WfB<<*nsYZv8{
zmprPWt2<T2RY}lQX=2(+abD{`e=fH_6J6V<@xWvGr#0+Pw4!7$J`{6Z9O$|@5Y*U>
zjEt;$xpexIUF$%8o-`@QeE-6EVd3GIUk4xA2kL0rzhGnxu&w?Ul9;&A%ggJ_G3oq_
zH#as$ZOe&lRx~g-4-a1Ev(miw<RsOso10RLr*uy~asK@GT`a}#?r*pHHfO)E&i2=b
z7nIc&|L@k{7vSpJdav@iY-&nM#<MdsCoQRdzc>8-p3i;X-rZgO=~L0(&*!YaUfWvt
zw~CdiaoKGS<{RdJn&T?oKRDPNH~oPnWYp+S%83bzyS`lVer?y&ckKd4LR8eOuCA^t
z+j4I|(-A)2;i7cv{Q2t_7CLjXoy|y&bh*Cw$2KMYzYmt2W`p+`a_isi`<*9iQQ(lj
z@8`0ttgMokOQ)YIl*zrnFZScdkGsBJi@v(dS9<T4OWuaBJ$-zx%>Vx<y;sKa)0&*i
zKij}Xa=nPS`0C{2eMoh~AC3nb7hTNoIbj`TAQ55^@qcztqeH{oo9ZuIKX-XgP+I;&
zJ;kN(kx<_kbv-@5!otE*+uz6S|0#NUd3mie-@j*1%<b*@>!Yuqn``~`<8gUyQ&ZDt
zMTQo3;G*Q-<Dceo4C=nKmaJK$vvm3L)oa%H6hA+A_0m#rP&aP9H}g4J$-mk9UyBy$
zH^t0Sj4gc28D6|-|Do$^qnAtP?O6D(uB>dEO6Hpz8)q4(`z=1j${@kt@cY}_%X7=`
ztz5K7Y3Y(BE6U&Bi`rAMv5immRcYpdoyvw0)pPehj^%o0ah=g7vcURR{cj1IiVYUg
ztPHdIUNTg?+3CvQcln{fkB?HUPhS12UH$dG>@RJl<z-LSH+DNPGweyWVqnT}>U4a0
z>h;tIVc7wp0mhTog&ldQ%f|4hgWHjrzEdd=wzNK)yLp!l!-F>-A9gV?JYV;2t<aWI
z2kWU<ca&aUbXD-}uK=wV(^u_iak%>hTnSX1W@NB`a984hq@~#vSEWmOp0!SltW1q<
z@+=G=MA{n=GeU<IA8byDb}c<)8EEl)(N#guOUE{KJgNw-?uz@t{r3ZZ)kE2Hj_dl<
z7kB2aUJ=$W8ebXPW{FhHS438K!c?wZ%X~|assE7T1GQr(<QW+L9e!S{L*LR~Xpi23
zmgVvjKE<!M|NH9TCFlAn|DI=N9yZFnucxURx=YVn>bLgF(4x)LxfmGE)h}~rC@wC(
zx<1~%)k(4R#RbR3ZoQY(=hs|%@l_{&UyP}#se0UtS<*|w&5zwvJ3Haq`>9>uJ-*wh
zosChl{V``tUgwvbZ<%?b3=A0_7Bbf+sd_)zwGK4AU&0WxEoY{h&x{43tHU(y?c*nU
zxEyZd1&ul^zGj?tMWgiXt<cZU&)ffVYIM=u>ikCcircHInO|;rU)tX8Id_*=ExXra
zxk+Kqy-lyCZ>eQqSa5A&K?KNgz2^5;xXV=@d0k|a{!8G)BG>MucjspsyUSXYT=@0%
zwQ0tM1#WAzudj>U^>*9sFIVP2^OTkPexpjuYw5JLODitFWn@^8DZ{1x+dX;fujcP6
zp2q3tzU)wVKU0p;Cd|{bQ$^F%bnC@_Tbnt5zBuonAY~=9=a+5flcgKChtJPm(2<n+
zPJYQ6!`^j_3=Ad@-oO5GvHHE1RBu&mXTHIaFTEKit2%|%vko*co;q<NqhMx%#hL<(
znDYHwwwR>td%f${?$_L^c~L8W*v%}x%)c{mXYIP+2mkIL)p_4?>qKF{%(GJMQzCUG
zJ#)Ui^O7+(Oq26l(;6-OS@_;U=)hpb@wc^W-R}Js-fNcKc75p&HpUOq!fHMjo}Hb&
zwdUui$9j`z&t9z=ylhTM?Dw~^OC3WyOTW)wtr_O3u%<ouyZq)Sbt_kW+kOf${vQ7~
zr1NV1<P-J1-->ozcrEmSw+cEBXTE4V&(&Au;;%NJxBI+HB)%YKAJ^jF?{@p=@BKQB
zi;L^Z+UV_%^{#`<@u<B|h341Tma%+zIsf!pjnINm-n{Fsuhj_tVV?YiMQG}e+x90t
zvkKXwlY^0a02S*`8}`ETj_mbP(;~;by@CfOO%hU7zrE+lte1ig*Go(P|NWkQu!%Kl
zSIJAx!}C>Gn;lu34?aFuF5@n16}x8d-gT4v?(Ljwp(zyj^!o80hGWOQIXf@qAM<$V
zwR3-6T<FxPL8+;4|4iAo_4I=&p;jMPmH6ymQ`-!)wy{^+;!ict<@E<Rh1D|N-Pu|7
zdhK=*u2#@!kY|vWS69@Qj5`{09$QRW!oJ*YalDzxt!ugy-@OpFUi*3JrStP9ZOd7)
z*WS*!?4Ne_lI~ai222bMZae-+rSeHGyDGouxVYoKL@S1KGXj5KKk(pSbMmtD^K7FZ
zAM4G&vdgOc-I~nH%T~UgAb4rjqZ>2%?ZT_A=N)zJ{k5He!9iJt?dzL6=B7{2-QJpU
zQR(lG<Mw9tni7{8H>~ulKXdx@<qr=Ji^|Kd=UqBcEmEC<A;YTk-~v#0?4rB8rn2(k
z8iprU4ZaBv4m5T>kFjN7sL_?+$@=i%VCnMQNH@9-4@2hJH*~f>l3nl3z`$_)!Dq`b
z(2R2auI*kIt}(t1342@>+ogH&RYzH^hUgdX&={u!uZw&Z!xFr@$om!5+DhjyR+yb*
zic2}GFEp{t^OZ1{hQNc~tKP8Ln;)DgMfyfB28M#T+hKvS#d&p^kw*?^{b>YE`Jaov
zt+ncE^3ia^%acy+|F%Nv{{v7P-y**-w69HY0G0_HD`C*l(74bcs0<nkw(MKHXOGQ#
zZzcwY^wW@5_Uy3g*v{vmLfu<bRP@#5<^At=z1FLJUw!}cE*a2xoeY<^aJ#p)+3H)b
zqiPP6Fq}DcDkv;$+VxZhhK9{ASA1xXTE@@F%)r2GwqEUz?BOpQ3CXRX8N-LWelK0R
zbkY(Jl|>#Zk3u6SyqZ`4>wzsI_g@ucmFY~k6=U2WSX5kWntEzV)#d3rk&CA3Mpp$0
z_D!8X|9vUv4>st4?4qA{_vde&_jMP?d_@McLrXj-PnkP67F6(sWM*dWde|m?Wm|4E
zzqYfAP+(o%zBWGDRSpUdN-dYcr_ncV)LHcZo{-(oregvO(u&Y7xf}<}jhVGgaiCs3
zcm`!r<xy1+!RxQJ{v0o1(9zew{_XAU*YE0oy<D!PqZ5*qwd&I4%eHHH7#K`u_WZlF
zRI*0!iN>=1tb6kATE$jAox1DODQ#8Hn>TNQ7+-HB_gBV9GB9KqbvkC=y1i9VU{X&%
z1D~8t#JbZv3>X-m?>(&e;jyXLid6xn=PK4~f12_Vl#F;hdA!2o*0+3GfA)XA0wjDR
zT<Dpn&P6Y*IR09wM)TlnCI$wEbJLL9Ltfv#%_|}%%Yz0c4^*zLUVURnuncEKNM}8C
zxRh!w643gH;+d~^O<J;PlMyQuBXnWMgM-aly1Gln<zTt^hkIn?%q7b6ABzbxoOdWJ
z+^DiLdV8K+I1>Yd6li`&Q&Tf;`a@2p2a+DXzEf5HexCo|<Tul&?n{?~mM&eI`TX2m
z(E5*EGM8bKrT+qhf);)G@@3cg!fuX+bOpV2-$YJLnIck_Hs8a~Z<)BABWwn{|M2|B
zVmI#=F)%PJhAjs=?_eNt<;ls(qC9MS^^V$9f%;4F;921R3&bZqj{3(38UlCh!MQ5q
zK_;k2dv$AexT>n^%KHERqBf`XURRwN5)iNeG=Lwx+^<N+y|S`0ZhA^sUf#N2Utcc|
z&{)DJYn5?jMc}U|ll}MTon9hooCa#Rmx{}rJ9FmBp;qp_dfbzi`OVcjUT9MI$Ys5^
zp{BaJd*9<DcR+(x>ra1TVf<jS=i9Ap(9HXjlase59%lRc^0K@6{hH0+-rjy*n)xgQ
z(cj*ycXUtc>1mmVS~#P&W=;L{`Lk%Ji%HH6gV2zWir86}bFIs-U0E3n>a?wm-tK39
zuVS%VpUldB`+qlHU-F4Y9@6c~M4lJ>zDvcwKyt?A3;XNqzrMcie|fq8bQRadflHSz
zefjVA`|Hm9woeL6%PjjAvvP}p{2Mo&$uqw0=TfVZ7Yjfxy0E}8ZhCTDR@SPz|G)3Q
zez*Jmw_PHWPn|wpdNnlsWq<vj#d7t33ctR+9e#P4@8?}Q#YII$Q>IT}e&~?Xdhd@i
z$_>3GFD@vqjo%;V+{UwVwwSp1az*F17mNGtK5Z~M5bx#XrE>C1{kC`PrlzK|%=71I
zX=zQFIrC+yWt#5{1IPP+-<2oZSwHB_y}fN^@N&OhPbPVrRDH<+CAu%WRQy#cVh`+m
zwtD@(AYb2Jy*(ce&3GvuSFvzg&do=Gp$+?876<yyu?PgMB5`wTyZ&^>mdwj)scC7e
zR;}_{8@>Hn6DxPg&!^L?W2bq3es=b98?W@1vbRy|y$#pb|Nl43IK8jx+Z#}?&3C4e
z>-G5hy=M9M)&yugDXl!)#lW%PB*=xc&GXHw^LpjKytx_N+S;n6sd-U4f6u~=$;Y#9
zZc1%AkhZP(xu5Na1I(w+pAQcTnsoi?jOkOShJLSpe{U~n>Z$bQCD--)|Lxj&S(&4u
z_sY6h>!ZhyXTQI<*YNW9cXwBJ>+L$RcooC{9q;%3{_^d1{^|t_9Ohb=f7>OqSx8v;
z>)QNU?@1+JuZCy8y|uOK-OlGG#m{{DwKu2!{q^<M_Wb$lcD-7)E7R1}6f}46<>h5j
zzIIW0`S*#f+d$(I&`G$xdP{E>@+By%s;RwtwR-)v-|zRwo9jyTzWV$9{_{UlGoI~Q
z_ip!lJKcy44)Qf08h4exepc#f;bkHfY9aG&7f*5Cu9s?{ArsIH!uITSJKYw$_lG4W
zDn2}){PgM5TN{(xt;*iKDAhdMCwSoUgt>FqZcIM@YF73-(9G^?P@8JeBB#g4`@iop
zDL!@jbn?HV-(N2KhekxKxN;?A>GI{(5i@N;&E`8hi@#or&es&-$~-^McG8k5Q$)6A
zTs-vnRnAP4%t@e;m3i~lZQ5jXcCK}}_jJ9hkB)Zl)jK;UKqKV6&5f|NQ7dzAZ<{0k
zx{+PJCP3M(2Q=lmrTTlG?>w7G&}hWtKI=VtYi|lN_#fu4`@mfL^Xc@eHye+GnwFr{
z-7TiO>ibcFIkm5^t-Z`^ekY*Z-r72Pl1bT{h_f?|k1t-8Gs`f!O(pZggM)^b)6dUa
zTln~xX}x0`Xo9r-Ugh$xuC6JQCM~+Rw>tadqoYz*B`dBkWt{ixQMZ1{aoO?}J9b38
zy}kYVfkx)7Sy#2T=HI{f`qC`f>x|$9ki`Sg*rDFg@jv^ikF{riGJ28>TJ!1Y>gTe~
HDWM4f2QuVF

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