CMSIS-DSP: SDF Improvements

Improvement to the SDF memory optimization using graph coloring.
diff --git a/CMSIS/DSP/SDFTools/examples/example1/test.dot b/CMSIS/DSP/SDFTools/examples/example1/test.dot
index 8a8797e..4dff5dc 100755
--- a/CMSIS/DSP/SDFTools/examples/example1/test.dot
+++ b/CMSIS/DSP/SDFTools/examples/example1/test.dot
@@ -31,9 +31,17 @@
 
 
 
-source:i -> filter:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >7</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >5</FONT>>,label="f32(11)"]
+source:i -> filter:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >7</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >5</FONT>
+</TD></TR></TABLE>>,label="f32(11)"]
 
-filter:i -> sink:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >5</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >5</FONT>>,label="f32(5)"]
+filter:i -> sink:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >5</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >5</FONT>
+</TD></TR></TABLE>>,label="f32(5)"]
 
 
 }
diff --git a/CMSIS/DSP/SDFTools/examples/example1/test.pdf b/CMSIS/DSP/SDFTools/examples/example1/test.pdf
index b3c1f01..8216621 100755
--- a/CMSIS/DSP/SDFTools/examples/example1/test.pdf
+++ b/CMSIS/DSP/SDFTools/examples/example1/test.pdf
Binary files differ
diff --git a/CMSIS/DSP/SDFTools/examples/example2/test.dot b/CMSIS/DSP/SDFTools/examples/example2/test.dot
index dc3a90e..6bb73e3 100755
--- a/CMSIS/DSP/SDFTools/examples/example2/test.dot
+++ b/CMSIS/DSP/SDFTools/examples/example2/test.dot
@@ -23,15 +23,15 @@
     <TD ALIGN="CENTER" ROWSPAN="2">arm_add_f32<BR/>(CMSIS-DSP)</TD>
     <TD PORT="o"><FONT POINT-SIZE="9.0">o</FONT></TD>
   </TR>
-  <TR>
+<TR>
 <TD PORT="ib"><FONT POINT-SIZE="9.0">ib</FONT></TD>
-<TD></TD>
-</TR>
+
+ 
+<TD></TD></TR>
 
 </TABLE>>];
 
 
-
 arm_scale_f321 [label=<
 <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
   <TR>
@@ -39,15 +39,15 @@
     <TD ALIGN="CENTER" ROWSPAN="2">arm_scale_f32<BR/>(CMSIS-DSP)</TD>
     <TD PORT="o"><FONT POINT-SIZE="9.0">o</FONT></TD>
   </TR>
-  <TR>
+<TR>
 <TD PORT="ib"><FONT POINT-SIZE="9.0">ib</FONT></TD>
-<TD></TD>
-</TR>
+
+ 
+<TD></TD></TR>
 
 </TABLE>>];
 
 
-
 arm_scale_f322 [label=<
 <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
   <TR>
@@ -55,14 +55,14 @@
     <TD ALIGN="CENTER" ROWSPAN="2">arm_scale_f32<BR/>(CMSIS-DSP)</TD>
     <TD PORT="o"><FONT POINT-SIZE="9.0">o</FONT></TD>
   </TR>
-  <TR>
+<TR>
 <TD PORT="ib"><FONT POINT-SIZE="9.0">ib</FONT></TD>
-<TD></TD>
-</TR>
+
+ 
+<TD></TD></TR>
 
 </TABLE>>];
 
-
 audioWin [label=<
 <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
   <TR>
@@ -99,7 +99,8 @@
     <TD ALIGN="CENTER" ROWSPAN="2">toMono<BR/>(Unzip)</TD>
     <TD PORT="o1"><FONT POINT-SIZE="9.0">o1</FONT></TD>
   </TR>
-  <TR>
+<TR>
+ 
 <TD></TD>
 <TD PORT="o2"><FONT POINT-SIZE="9.0">o2</FONT></TD>
 </TR>
@@ -107,7 +108,6 @@
 </TABLE>>];
 
 
-
 srcDelay [label=<
 <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
   <TR>
@@ -116,26 +116,62 @@
 </TABLE>>];
 
 
-src:i -> srcDelay:i [taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >320</FONT>>]
+src:i -> srcDelay:i [taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >320</FONT>
+</TD></TR></TABLE>>]
 
-srcDelay:i -> toMono:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >320</FONT>>,label="f32(330)"]
+srcDelay:i -> toMono:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >320</FONT>
+</TD></TR></TABLE>>,label="f32(330)"]
 
 
-toMono:o1 -> arm_scale_f321:ia [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>>,label="f32(160)"]
+toMono:o1 -> arm_scale_f321:ia [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>
+</TD></TR></TABLE>>,label="f32(160)"]
 
-toMono:o2 -> arm_scale_f322:ia [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>>,label="f32(160)"]
+toMono:o2 -> arm_scale_f322:ia [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>
+</TD></TR></TABLE>>,label="f32(160)"]
 
-arm_scale_f321:o -> arm_add_f321:ia [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>>,label="f32(160)"]
+arm_scale_f321:o -> arm_add_f321:ia [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>
+</TD></TR></TABLE>>,label="f32(160)"]
 
-arm_scale_f322:o -> arm_add_f321:ib [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>>,label="f32(160)"]
+arm_scale_f322:o -> arm_add_f321:ib [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>
+</TD></TR></TABLE>>,label="f32(160)"]
 
-arm_add_f321:o -> audioWin:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >320</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>>,label="f32(320)"]
+arm_add_f321:o -> audioWin:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >320</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >160</FONT>
+</TD></TR></TABLE>>,label="f32(320)"]
 
-audioWin:i -> mfcc:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >640</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >640</FONT>>,label="f32(640)"]
+audioWin:i -> mfcc:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >640</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >640</FONT>
+</TD></TR></TABLE>>,label="f32(640)"]
 
-mfcc:i -> mfccWind:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >250</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >10</FONT>>,label="f32(250)"]
+mfcc:i -> mfccWind:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >250</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >10</FONT>
+</TD></TR></TABLE>>,label="f32(250)"]
 
-mfccWind:i -> TFLite:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >500</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >500</FONT>>,label="f32(500)"]
+mfccWind:i -> TFLite:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >500</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >500</FONT>
+</TD></TR></TABLE>>,label="f32(500)"]
 
 HALF [label=<
 <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
diff --git a/CMSIS/DSP/SDFTools/examples/example2/test.pdf b/CMSIS/DSP/SDFTools/examples/example2/test.pdf
index 38415ac..485a0e5 100755
--- a/CMSIS/DSP/SDFTools/examples/example2/test.pdf
+++ b/CMSIS/DSP/SDFTools/examples/example2/test.pdf
Binary files differ
diff --git a/CMSIS/DSP/SDFTools/examples/example3/test.dot b/CMSIS/DSP/SDFTools/examples/example3/test.dot
index 4c072ec..87632a2 100755
--- a/CMSIS/DSP/SDFTools/examples/example3/test.dot
+++ b/CMSIS/DSP/SDFTools/examples/example3/test.dot
@@ -16,14 +16,14 @@
     <TD ALIGN="CENTER" ROWSPAN="2">arm_mult_f32<BR/>(CMSIS-DSP)</TD>
     <TD PORT="o"><FONT POINT-SIZE="9.0">o</FONT></TD>
   </TR>
-  <TR>
+<TR>
 <TD PORT="ib"><FONT POINT-SIZE="9.0">ib</FONT></TD>
-<TD></TD>
-</TR>
+
+ 
+<TD></TD></TR>
 
 </TABLE>>];
 
-
 audioOverlap [label=<
 <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
   <TR>
@@ -82,21 +82,53 @@
 
 
 
-src:i -> audioWin:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >128</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >192</FONT>>,label="f32(256)"]
+src:i -> audioWin:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >128</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >192</FONT>
+</TD></TR></TABLE>>,label="f32(256)"]
 
-audioWin:i -> arm_mult_f321:ia [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>>,label="f32(256)"]
+audioWin:i -> arm_mult_f321:ia [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>
+</TD></TR></TABLE>>,label="f32(256)"]
 
-arm_mult_f321:o -> toCmplx:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>>,label="f32(256)"]
+arm_mult_f321:o -> toCmplx:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>
+</TD></TR></TABLE>>,label="f32(256)"]
 
-toCmplx:i -> cfft:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>>,label="f32(512)"]
+toCmplx:i -> cfft:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>
+</TD></TR></TABLE>>,label="f32(512)"]
 
-cfft:i -> icfft:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>>,label="f32(512)"]
+cfft:i -> icfft:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>
+</TD></TR></TABLE>>,label="f32(512)"]
 
-icfft:i -> toReal:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>>,label="f32(512)"]
+icfft:i -> toReal:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>
+</TD></TR></TABLE>>,label="f32(512)"]
 
-toReal:i -> audioOverlap:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>>,label="f32(256)"]
+toReal:i -> audioOverlap:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>
+</TD></TR></TABLE>>,label="f32(256)"]
 
-audioOverlap:i -> sink:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >192</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >128</FONT>>,label="f32(256)"]
+audioOverlap:i -> sink:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >192</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >128</FONT>
+</TD></TR></TABLE>>,label="f32(256)"]
 
 HANN [label=<
 <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
diff --git a/CMSIS/DSP/SDFTools/examples/example3/test.pdf b/CMSIS/DSP/SDFTools/examples/example3/test.pdf
index c436053..5c1db1b 100755
--- a/CMSIS/DSP/SDFTools/examples/example3/test.pdf
+++ b/CMSIS/DSP/SDFTools/examples/example3/test.pdf
Binary files differ
diff --git a/CMSIS/DSP/SDFTools/examples/example4/test.dot b/CMSIS/DSP/SDFTools/examples/example4/test.dot
index 4c072ec..87632a2 100755
--- a/CMSIS/DSP/SDFTools/examples/example4/test.dot
+++ b/CMSIS/DSP/SDFTools/examples/example4/test.dot
@@ -16,14 +16,14 @@
     <TD ALIGN="CENTER" ROWSPAN="2">arm_mult_f32<BR/>(CMSIS-DSP)</TD>
     <TD PORT="o"><FONT POINT-SIZE="9.0">o</FONT></TD>
   </TR>
-  <TR>
+<TR>
 <TD PORT="ib"><FONT POINT-SIZE="9.0">ib</FONT></TD>
-<TD></TD>
-</TR>
+
+ 
+<TD></TD></TR>
 
 </TABLE>>];
 
-
 audioOverlap [label=<
 <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
   <TR>
@@ -82,21 +82,53 @@
 
 
 
-src:i -> audioWin:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >128</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >192</FONT>>,label="f32(256)"]
+src:i -> audioWin:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >128</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >192</FONT>
+</TD></TR></TABLE>>,label="f32(256)"]
 
-audioWin:i -> arm_mult_f321:ia [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>>,label="f32(256)"]
+audioWin:i -> arm_mult_f321:ia [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>
+</TD></TR></TABLE>>,label="f32(256)"]
 
-arm_mult_f321:o -> toCmplx:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>>,label="f32(256)"]
+arm_mult_f321:o -> toCmplx:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>
+</TD></TR></TABLE>>,label="f32(256)"]
 
-toCmplx:i -> cfft:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>>,label="f32(512)"]
+toCmplx:i -> cfft:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>
+</TD></TR></TABLE>>,label="f32(512)"]
 
-cfft:i -> icfft:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>>,label="f32(512)"]
+cfft:i -> icfft:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>
+</TD></TR></TABLE>>,label="f32(512)"]
 
-icfft:i -> toReal:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>>,label="f32(512)"]
+icfft:i -> toReal:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >512</FONT>
+</TD></TR></TABLE>>,label="f32(512)"]
 
-toReal:i -> audioOverlap:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>>,label="f32(256)"]
+toReal:i -> audioOverlap:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>
+</TD></TR></TABLE>>,label="f32(256)"]
 
-audioOverlap:i -> sink:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >192</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >128</FONT>>,label="f32(256)"]
+audioOverlap:i -> sink:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >192</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >128</FONT>
+</TD></TR></TABLE>>,label="f32(256)"]
 
 HANN [label=<
 <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
diff --git a/CMSIS/DSP/SDFTools/examples/example4/test.pdf b/CMSIS/DSP/SDFTools/examples/example4/test.pdf
index c436053..5c1db1b 100755
--- a/CMSIS/DSP/SDFTools/examples/example4/test.pdf
+++ b/CMSIS/DSP/SDFTools/examples/example4/test.pdf
Binary files differ
diff --git a/CMSIS/DSP/SDFTools/examples/example5/test.dot b/CMSIS/DSP/SDFTools/examples/example5/test.dot
index 2bbf4bd..b28b8de 100755
--- a/CMSIS/DSP/SDFTools/examples/example5/test.dot
+++ b/CMSIS/DSP/SDFTools/examples/example5/test.dot
@@ -52,15 +52,35 @@
 
 
 
-src:i -> toMono:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >384</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >384</FONT>>,label="q15(384)"]
+src:i -> toMono:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >384</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >384</FONT>
+</TD></TR></TABLE>>,label="q15(384)"]
 
-toMono:i -> audioWin:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >768</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >192</FONT>>,label="q15(768)"]
+toMono:i -> audioWin:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >768</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >192</FONT>
+</TD></TR></TABLE>>,label="q15(768)"]
 
-audioWin:i -> mfcc:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >1024</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >1024</FONT>>,label="q15(1024)"]
+audioWin:i -> mfcc:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >1024</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >1024</FONT>
+</TD></TR></TABLE>>,label="q15(1024)"]
 
-mfcc:i -> mfccWin:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >377</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >13</FONT>>,label="q15(377)"]
+mfcc:i -> mfccWin:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >377</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >13</FONT>
+</TD></TR></TABLE>>,label="q15(377)"]
 
-mfccWin:i -> sink:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >754</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >754</FONT>>,label="q15(754)"]
+mfccWin:i -> sink:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >754</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >754</FONT>
+</TD></TR></TABLE>>,label="q15(754)"]
 
 
 }
diff --git a/CMSIS/DSP/SDFTools/examples/example5/test.pdf b/CMSIS/DSP/SDFTools/examples/example5/test.pdf
index bac671a..ce5864f 100755
--- a/CMSIS/DSP/SDFTools/examples/example5/test.pdf
+++ b/CMSIS/DSP/SDFTools/examples/example5/test.pdf
Binary files differ
diff --git a/CMSIS/DSP/SDFTools/examples/example6/test.dot b/CMSIS/DSP/SDFTools/examples/example6/test.dot
index 5d03f6b..76451a6 100755
--- a/CMSIS/DSP/SDFTools/examples/example6/test.dot
+++ b/CMSIS/DSP/SDFTools/examples/example6/test.dot
@@ -45,13 +45,29 @@
 
 
 
-src:i -> audioWin:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >128</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >192</FONT>>,label="f32(256)"]
+src:i -> audioWin:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >128</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >192</FONT>
+</TD></TR></TABLE>>,label="f32(256)"]
 
-audioWin:i -> mfcc:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>>,label="f32(256)"]
+audioWin:i -> mfcc:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >256</FONT>
+</TD></TR></TABLE>>,label="f32(256)"]
 
-mfcc:i -> mfccWin:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >13</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >13</FONT>>,label="f32(13)"]
+mfcc:i -> mfccWin:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >13</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >13</FONT>
+</TD></TR></TABLE>>,label="f32(13)"]
 
-mfccWin:i -> sink:i [headlabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >13</FONT>>,taillabel=<<FONT COLOR="blue" POINT-SIZE="12.0" >26</FONT>>,label="f32(26)"]
+mfccWin:i -> sink:i [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >13</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >26</FONT>
+</TD></TR></TABLE>>,label="f32(26)"]
 
 
 }
diff --git a/CMSIS/DSP/SDFTools/examples/example6/test.pdf b/CMSIS/DSP/SDFTools/examples/example6/test.pdf
index dcf9b4c..f4c0c35 100755
--- a/CMSIS/DSP/SDFTools/examples/example6/test.pdf
+++ b/CMSIS/DSP/SDFTools/examples/example6/test.pdf
Binary files differ
diff --git a/CMSIS/DSP/SDFTools/sdf/schedule/config.py b/CMSIS/DSP/SDFTools/sdf/schedule/config.py
index ae47021..1a7afc6 100755
--- a/CMSIS/DSP/SDFTools/sdf/schedule/config.py
+++ b/CMSIS/DSP/SDFTools/sdf/schedule/config.py
@@ -68,6 +68,9 @@
         # True for an horizontal graphviz layout
         self.horizontal = True
 
+        # Display FIFO buffers in graph instead of datatype
+        self.displayFIFOBuf = False
+
     @property
     def debug(self):
         return (self.debugLimit > 0)
diff --git a/CMSIS/DSP/SDFTools/sdf/schedule/description.py b/CMSIS/DSP/SDFTools/sdf/schedule/description.py
index 3e14729..c276fba 100755
--- a/CMSIS/DSP/SDFTools/sdf/schedule/description.py
+++ b/CMSIS/DSP/SDFTools/sdf/schedule/description.py
@@ -40,6 +40,9 @@
 from sdf.schedule.config import *
 from sdf.schedule.types import *
 
+# To debug graph coloring for memory optimization
+#import matplotlib.pyplot as plt
+
 class IncompatibleIO(Exception):
     pass
 
@@ -67,16 +70,14 @@
     def __init__(self,fifoid):
         # The FIFO is in fact just an array
         self.isArray=False 
-        # Max distance between a write and a read to the FIFO
-        # If it is 1, data written to FIFO
-        # is immediately read so buffer can be reused
-        self.distance=1
         # FIFO length
         self.length=0
         # FIFO type
         self.theType=None 
         # Buffer used by FIFO
         self.buffer=None 
+        # Used for plot in graphviz
+        self.bufferID=-1
         self._fifoID=fifoid 
         # Source IO
         self.src = None 
@@ -84,15 +85,16 @@
         self.dst = None 
         # FIFO delay
         self.delay=0
-        # Can use a shared buffer ?
-        self.isShared = False
 
-        self._writeTime= 0
-
-        # Track when FIFO is used
-        # For allocation of shared buffers we need
-        # to know when 2 buffers are used at same time
-        self._timeOfUse=[]
+        # Used for liveliness analysis
+        # To share buffers between FIFO in memory optimization
+        # mode, we need to know when a FIFO is in use.
+        # We compute the maximum extent : so the biggest interval
+        # and not a disconnected union of intervals
+        # This could be improved. We could use
+        # a disjoint union of intervals but they should be mapped
+        # to the same node in the interference graph
+        self._liveInterval=(-1,-1)
 
         # shared buffer number not yet allocated
         self.sharedNB=-1
@@ -110,36 +112,31 @@
         return(self.delay>0)
 
     def dump(self):
-        shared=0 
-        if self.isShared:
-            shared=1
-        print("array %d dist %d len %d %s id %d src %s:%s dst %s:%s  shared:%d" % 
+        
+        print("array %d len %d %s id %d src %s:%s dst %s:%s  " % 
             (self.isArray,
-             self.distance,
              self.length,
              self.theType.ctype,
              self.fifoID,
              self.src.owner.nodeID,
              self.src.name,
              self.dst.owner.nodeID,
-             self.dst.name,
-             shared))
+             self.dst.name))
 
     @property
     def fifoID(self):
         return self._fifoID
     
     def recordWrite(self,theTime):
-        self._timeOfUse.append(theTime)
-        if self._writeTime == 0:
-           self._writeTime = theTime
+        start,stop=self._liveInterval  
+        if start==-1:
+            self._liveInterval=(theTime,stop)
 
     def recordRead(self,theTime):
-        self._timeOfUse.append(theTime)
-        delta = theTime - self._writeTime 
-        self._writeTime = 0
-        if delta > self.distance:
-            self.distance = delta
+        start,stop=self._liveInterval 
+        if (theTime > stop):
+            self._liveInterval=(start,theTime)
+
 
 def analyzeStep(vec,allFIFOs,theTime):
     """Analyze an evolution step to know which FIFOs are read and written to"""
@@ -209,7 +206,7 @@
 
         return(res)
 
-    def initializeFIFODescriptions(self,config,allFIFOs, fifoLengths):
+    def initializeFIFODescriptions(self,config,allFIFOs, fifoLengths,maxTime):
         """Initialize FIFOs datastructure""" 
         for fifo in allFIFOs:
             edge = self._sortedEdges[fifo.fifoID]
@@ -218,113 +215,126 @@
             fifo.src=src
             fifo.dst=dst 
             fifo.delay=self.getDelay(edge)
+            # When a FIFO is working as an array then its buffer may
+            # potentially be shared with other FIFOs workign as arrays
             if src.nbSamples == dst.nbSamples:
                 if fifo.delay==0:
                    fifo.isArray = True 
-                if fifo.distance==1:
-                    if fifo.delay==0:
-                       fifo.isShared = True
             fifo.theType = src.theType
             #fifo.dump()
 
-        # When we have bufA -> Node -> bufB then
-        # bufA and bufB can't share the same memory.
-
-        # For the allocation of shared buffer we scan all times 
-        # of use and for each time we look at the FIFOs which 
-        # can be potentially shared.
-
-        # For each time of use, record the potentially shareable fifos
-        # which are used
-        fifoForTime={} 
-        for fifo in allFIFOs:
-            if fifo.isShared:
-                for t in fifo._timeOfUse:
-                    if t in fifoForTime:
-                        fifoForTime[t].append(fifo)
-                    else:
-                        fifoForTime[t]=[fifo]
-
-        # If several shareable FIFOs are used at same time, they
-        # must be assigned to different shared buffers if possible
-        usedAtSameTime={} 
-        for t in sorted(fifoForTime.keys()):
-            if len(fifoForTime[t])>2:
-                # This case is not managed in this version.
-                # It could occur with quadripoles for instance
-                for fifo in fifoForTime[t]:
-                    fifo.isShared=False
-            elif len(fifoForTime[t])==2:
-                 # 2 FIFOs are used at the same time
-                 fifoA = fifoForTime[t][0]
-                 fifoB = fifoForTime[t][1]
-                 if fifoA.sharedNB >= 0 and fifoA.sharedNB == fifoB.sharedNB:
-                     # Those FIFOs are already both assigned to a buffer
-                     # and we can't reassign and they use the same buffer
-                     # So we can't consistently associate shared buffers to those
-                     # FIFOs
-                     fifoA.isShared=False 
-                     fifoB.isShared=False
-                 else:
-                     # The 2 FIFOs were never associated with a shared buffer
-                     if fifoA.sharedNB < 0 and fifoB.sharedNB < 0:
-                         fifoA.sharedNB=0 
-                         fifoB.sharedNB=1 
-                     # One FIFO is associated, so we associate the other one
-                     # to the other shared buffer
-                     elif fifoA.sharedNB < 0:
-                         fifoA.sharedNB = 1 - fifoB.sharedNB 
-                     else:
-                         fifoB.sharedNB = 1 - fifoA.sharedNB 
-            else:
-                fifoA = fifoForTime[t][0]
-                if fifoA.sharedNB < 0:
-                    fifoA.sharedNB = 0
-                        
-
-
-        # Now we create buffers 
-        maxSharedA=0
-        maxSharedB=0
-        allBuffers=[]
-        for fifo in allFIFOs:
-            lengthInBytes = fifo.theType.bytes * fifo.length
-            if fifo.isShared:
-                if fifo.sharedNB == 0:
-                    if lengthInBytes > maxSharedA:
-                       maxSharedA = lengthInBytes 
-                if fifo.sharedNB == 1:
-                    if lengthInBytes > maxSharedB:
-                       maxSharedB = lengthInBytes 
 
         bufferID=0
-        sharedA=None
-        sharedB=None
-        if maxSharedA > 0 and config.memoryOptimization:
-           # Create the shared buffer if memory optimization on
-           sharedA = FifoBuffer(bufferID,CType(UINT8),maxSharedA)
-           allBuffers.append(sharedA)
-           bufferID = bufferID + 1
+        allBuffers=[]
 
-        if maxSharedB > 0 and config.memoryOptimization:
-           # Create the shared buffer if memory optimization on
-           sharedB = FifoBuffer(bufferID,CType(UINT8),maxSharedB)
-           allBuffers.append(sharedB)
-           bufferID = bufferID + 1
+        # Compute a graph describing when FIFOs are used at the same time
+        # The use graph coloring to allocate buffer to those FIFOs.
+        # Then size the buffer based on the longest FIFO using it
+        if config.memoryOptimization:
+            G = nx.Graph()
+
+            for fifo in allFIFOs: 
+                    if fifo.isArray:
+                        G.add_node(fifo)
+
+            # Create the interference graph
+
+            # Dictionary of active FIFOs at a given time.
+            # The time is a scheduling step
+            active={}
+            currentTime=0
+            while currentTime<=maxTime:
+                # Remove fifo no more active.
+                # Thei stop time < currenTime
+                toDelete=[]
+                for k in active:
+                    start,stop=k._liveInterval 
+                    if stop<currentTime:
+                        toDelete.append(k)
+                for k in toDelete:
+                    del active[k]   
+    
+                # Check FIFOs becoming active.
+                # They are added to the active list
+                # and an interference edge is added between thus FIFO
+                # and all the FIFOs active at same time.
+                for fifo in allFIFOs: 
+                    if fifo.isArray:
+                        start,stop=fifo._liveInterval
+                        # If a src -> node -> dst
+                        # At time t, node will read for src and the stop time
+                        # will be currentTime t.
+                        # And it will write to dst and the start time will be
+                        # currentTime
+                        # So, src and dst are both live at this time.
+                        # Which means the condition on the stop time must be 
+                        # stop >= currentTime and not a strict comparison
+                        if start<=currentTime and stop >= currentTime:
+                            if not (fifo in active):
+                                for k in active:
+                                    G.add_edge(k,fifo)
+                                active[fifo]=True 
+    
+                currentTime = currentTime + 1
+
+            # To debug and display the graph
+            if False:
+               labels={}
+               for n in G.nodes:
+                  labels[n]="%s -> %s" % (n.src.owner.nodeName,n.dst.owner.nodeName)
+       
+               pos = nx.spring_layout(G, seed=3113794652)
+               subax1 = plt.subplot(121)
+               nx.draw_networkx_edges(G, pos, width=1.0, alpha=0.5)
+               
+               nx.draw_networkx_labels(G, pos, labels, font_size=10)
+               plt.show()
+               quit()
+
+        
+            # Graph coloring
+            d = nx.coloring.greedy_color(G, strategy="largest_first")
+
+            # Allocate the colors (buffer ID) to the FIFO
+            # and keep track of the max color number
+            # Since other buffers (for real FIFOs) will have their
+            # numbering start after this one.
+            for fifo in d:
+                fifo.sharedNB=d[fifo]
+                bufferID=max(bufferID,fifo.sharedNB)
+
+
+
+            # Compute the max size for each shared buffer
+            maxSizes={} 
+            for fifo in d:
+                lengthInBytes = fifo.theType.bytes * fifo.length
+                if fifo.sharedNB in maxSizes:
+                    maxSizes[fifo.sharedNB] = max(maxSizes[fifo.sharedNB],lengthInBytes) 
+                else:
+                    maxSizes[fifo.sharedNB]=lengthInBytes
+
+            # Create the buffers
+            for theID in maxSizes:
+              sharedA = FifoBuffer(theID,CType(UINT8),maxSizes[theID])
+              allBuffers.append(sharedA)
 
         for fifo in allFIFOs:
             # Use shared buffer if memory optimization
-            if fifo.isShared and config.memoryOptimization:
-                if fifo.sharedNB == 0:
-                   fifo.buffer=sharedA 
-                else:
-                    fifo.buffer=sharedB
+            if fifo.isArray and config.memoryOptimization:
+                fifo.buffer=allBuffers[fifo.sharedNB] 
+                fifo.bufferID=fifo.sharedNB
+            # Create a new buffer for a real FIFO
+            # Use bufferID which is starting after the numbers allocated
+            # to shared buffers
             else:
                 buf = FifoBuffer(bufferID,fifo.theType,fifo.length)
                 allBuffers.append(buf)
                 fifo.buffer=buf
+                fifo.bufferID = bufferID
                 bufferID = bufferID + 1
 
+        # Compute the total memory used in bytes
         self._totalMemory = 0
         for buf in allBuffers:
             self._totalMemory = self._totalMemory + buf._theType.bytes * buf._length
@@ -529,7 +539,7 @@
 
         fifoMax=np.floor(bMax).astype(np.int32)
         
-        allBuffers=self.initializeFIFODescriptions(config,allFIFOs,fifoMax)
+        allBuffers=self.initializeFIFODescriptions(config,allFIFOs,fifoMax,evolutionTime)
         self._allFIFOs = allFIFOs 
         self._allBuffers = allBuffers
         return(Schedule(self,self._sortedNodes,self._sortedEdges,schedule))
diff --git a/CMSIS/DSP/SDFTools/sdf/templates/dot_template.dot b/CMSIS/DSP/SDFTools/sdf/templates/dot_template.dot
index ce22313..abfa5a7 100755
--- a/CMSIS/DSP/SDFTools/sdf/templates/dot_template.dot
+++ b/CMSIS/DSP/SDFTools/sdf/templates/dot_template.dot
@@ -115,17 +115,31 @@
 <TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >{{fifos[id].src.nbSamples}}</FONT>
 </TD></TR></TABLE>>]
 
+{% if config.displayFIFOBuf %}
+{{delayBoxID(id)}}:i -> {{io(fifos[id].dst.owner,fifos[id].dst)}} [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >{{fifos[id].dst.nbSamples}}</FONT>
+</TD></TR></TABLE>>,label="buf{{fifos[id].bufferID}}"]
+{% else %}
 {{delayBoxID(id)}}:i -> {{io(fifos[id].dst.owner,fifos[id].dst)}} [headlabel=<
 <TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >{{fifos[id].dst.nbSamples}}</FONT>
 </TD></TR></TABLE>>,label="{{fifos[id].theType.graphViztype}}({{fifos[id].length}})"]
+{% endif %}
 
 {% else %}
+{% if config.displayFIFOBuf %}
+{{io(fifos[id].src.owner,fifos[id].src)}} -> {{io(fifos[id].dst.owner,fifos[id].dst)}} [headlabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >{{fifos[id].dst.nbSamples}}</FONT>
+</TD></TR></TABLE>>,taillabel=<
+<TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >{{fifos[id].src.nbSamples}}</FONT>
+</TD></TR></TABLE>>,label="buf{{fifos[id].bufferID}}"]
+{% else %}
 {{io(fifos[id].src.owner,fifos[id].src)}} -> {{io(fifos[id].dst.owner,fifos[id].dst)}} [headlabel=<
 <TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >{{fifos[id].dst.nbSamples}}</FONT>
 </TD></TR></TABLE>>,taillabel=<
 <TABLE BORDER="0" CELLPADDING="2"><TR><TD><FONT COLOR="blue" POINT-SIZE="12.0" >{{fifos[id].src.nbSamples}}</FONT>
 </TD></TR></TABLE>>,label="{{fifos[id].theType.graphViztype}}({{fifos[id].length}})"]
 {% endif %}
+{% endif %}
 {% endfor %}
 
 {% for c in constObjs %}