Index: /soft/giet_vm/transpose/main.c
===================================================================
--- /soft/giet_vm/transpose/main.c	(revision 316)
+++ /soft/giet_vm/transpose/main.c	(revision 317)
@@ -100,12 +100,17 @@
         }
 
-        barrier_init( &barrier_0, ntasks );
-        barrier_init( &barrier_1, ntasks );
-        barrier_init( &barrier_2, ntasks );
-        barrier_init( &barrier_3, ntasks );
-        barrier_init( &barrier_4, ntasks );
-
-        giet_shr_printf("\n*** Proc [%d,%d,%d] completes barrier init at cycle %d\n",
+        if ( ntasks > 1 )
+        {
+            barrier_init( &barrier_0, ntasks );
+            barrier_init( &barrier_1, ntasks );
+            barrier_init( &barrier_2, ntasks );
+            barrier_init( &barrier_3, ntasks );
+            barrier_init( &barrier_4, ntasks );
+        }
+
+        giet_shr_printf("\n[TRANSPOSE] Proc [%d,%d,%d] completes barrier init at cycle %d\n",
                         0, 0, 0, giet_proctime() );
+        giet_shr_printf(" - nclusters = %d\n", nclusters );
+        giet_shr_printf(" - ntasks    = %d\n", ntasks );
 
         init_ok = 0;
@@ -124,5 +129,5 @@
         // get heap vaddr in cluster[0,0]
         unsigned int heap_base;         
-        giet_vobj_get_vbase( "transpose", "heap_0_0", &heap_base );
+        giet_vobj_get_vbase( "transpose", "trsp_heap_0_0", &heap_base );
  
         // allocate buffers in cluster[x,y]
@@ -130,5 +135,5 @@
         buf_out[cluster_id] = buf_in[cluster_id] + NN*NN/nclusters;
 
-        giet_shr_printf("\n*** Proc [%d,%d,%d] completes buffer allocation at cycle %d\n"
+        giet_shr_printf("\n[TRANSPOSE] Proc [%d,%d,%d] completes buffer allocation at cycle %d\n"
                         " - buf_in  = %x\n"
                         " - buf_out = %x\n",
@@ -147,8 +152,14 @@
             giet_exit(" open() failure");
         }
+        else
+        {
+            giet_shr_printf("\n[TRANSPOSE] Processor[%d,%d,%d]"
+                            " open file misc/images.raw\n",
+                            x, y, lpid );
+        }
     }
 
-    ///////////////////////////
-    barrier_wait( &barrier_0 );
+    /////////////////////////////////////////////
+    if ( ntasks > 1 ) barrier_wait( &barrier_0 );
 
     // Main loop (on images)
@@ -167,5 +178,6 @@
                            ((image*nblocks) + ((nblocks*cluster_id)/nclusters)) );
 
-            giet_shr_printf("\n*** Proc [%d,%d,0] completes load for image %d at cycle %d\n",
+            giet_shr_printf("\n[TRANSPOSE] Proc [%d,%d,0] completes load"
+                            "  for image %d at cycle %d\n",
                             x, y, image, giet_proctime() );
         }
@@ -173,6 +185,6 @@
         LOAD_END[cluster_id][lpid] = giet_proctime();
 
-        ///////////////////////////
-        barrier_wait( &barrier_1 );
+        /////////////////////////////////////////////
+        if ( ntasks > 1 ) barrier_wait( &barrier_1 );
 
         // parallel transpose from buf_in to buf_out
@@ -221,12 +233,13 @@
         if ( lpid == 0 )
         {
-            giet_shr_printf("\n*** proc [%d,%d,0] completes transpose for image %d at cycle %d\n", 
-                        x, y, image, giet_proctime() );
+            giet_shr_printf("\n[TRANSPOSE] proc [%d,%d,0] completes transpose"
+                            " for image %d at cycle %d\n", 
+                            x, y, image, giet_proctime() );
 
         }
         TRSP_END[cluster_id][lpid] = giet_proctime();
 
-        ///////////////////////////
-        barrier_wait( &barrier_2 );
+        /////////////////////////////////////////////
+        if ( ntasks > 1 ) barrier_wait( &barrier_2 );
 
         // optional parallel display from local buf_out to frame buffer
@@ -245,5 +258,6 @@
             if ( lpid == 0 )
             {
-                giet_shr_printf("\n*** Proc [%d,%d,0] completes display for image %d at cycle %d\n",
+                giet_shr_printf("\n[TRANSPOSE] Proc [%d,%d,0] completes display"
+                                " for image %d at cycle %d\n",
                                 x, y, image, giet_proctime() );
             }
@@ -251,6 +265,6 @@
             DISP_END[cluster_id][lpid] = giet_proctime();
 
-            ///////////////////////////
-            barrier_wait( &barrier_3 );
+            /////////////////////////////////////////////
+            if ( ntasks > 1 ) barrier_wait( &barrier_3 );
         }
 
@@ -283,10 +297,12 @@
             if ( success ) 
             {
-                giet_shr_printf("\n*** proc [%d,%d,0] : checksum OK for image %d\n",
+                giet_shr_printf("\n[TRANSPOSE] proc [%d,%d,0] checksum OK"
+                                " for image %d\n",
                                 x, y, image );
             }
             else
             {
-                giet_shr_printf("\n*** proc [%d,%d,0] : checksum KO for image %d\n",
+                giet_shr_printf("\n[TRANSPOSE] proc [%d,%d,0] checksum KO"
+                                " for image %d\n",
                                 x, y, image );
             }
@@ -360,5 +376,5 @@
         // all tasks wait instrumentation completion 
         //////////////////////////////////////////////////
-        barrier_wait( &barrier_4 );
+        if ( ntasks > 1 ) barrier_wait( &barrier_4 );
 
     } // end while image      
Index: /soft/giet_vm/transpose/transpose.py
===================================================================
--- /soft/giet_vm/transpose/transpose.py	(revision 317)
+++ /soft/giet_vm/transpose/transpose.py	(revision 317)
@@ -0,0 +1,105 @@
+#!/usr/bin/env python
+
+from mapping import *
+
+######################################################################################
+#   file   : transpose.py
+#   date   : may 2014
+#   author : Alain Greiner
+#######################################################################################
+#  This file describes the mapping of the multi-threaded "transpose" 
+#  application on a multi-clusters, multi-processors architecture.
+#  This include both the mapping of virtual segments on the clusters,
+#  and the mapping of tasks on processors.
+#  This mapping uses 5 platform parameters, (obtained from the "mapping" argument)
+#  - x_size    : number of clusters in a row
+#  - y_size    : number of clusters in a column
+#  - x_width   : number of bits coding x coordinate
+#  - y_width   : number of bits coding y coordinate
+#  - procs_max : number of processors per cluster
+####################################################################################
+
+#########################
+def transpose( mapping ):
+
+    x_size    = mapping.x_size
+    y_size    = mapping.y_size
+    procs_max = mapping.procs_max
+    x_width   = mapping.x_width
+    y_width   = mapping.y_width
+
+    # define vsegs base & size
+    code_base  = 0x10000000
+    code_size  = 0x00010000     # 64 Kbytes
+    
+    data_base  = 0x20000000
+    data_size  = 0x00010000     # 64 Kbytes
+
+    ptab_base  = 0x30000000
+    ptab_size  = 0x00040000     # 256 Kbytes
+
+    stack_base = 0x40000000 
+    stack_size = 0x00010000     # 64 Kbytes
+
+    heap_base  = 0x50000000 
+    heap_size  = 0x00010000     # 64 Kbytes
+
+    # create Vspace
+    vspace = mapping.addVspace( name = 'transpose', startname = 'trsp_data' )
+    
+    # non replicated vsegs in cluster[0,0]
+    mapping.addVseg( vspace, 'trsp_code', code_base , code_size, 'CXWU', vtype = 'ELF', 
+                     x = 0, y = 0, pseg = 'RAM', binpath = 'build/transpose/transpose.elf' )
+
+    mapping.addVseg( vspace, 'trsp_data', data_base , data_size, 'C_WU', vtype = 'ELF',
+                     x = 0, y = 0, pseg = 'RAM', binpath = 'build/transpose/transpose.elf' )
+
+    mapping.addVseg( vspace, 'trsp_ptab', ptab_base , ptab_size, 'C_WU', vtype = 'PTAB',
+                     x = 0, y = 0, pseg = 'RAM', align = 13 )
+
+    # distributed vsegs: one stack per processor/task, one heap per cluster
+    for x_rep in xrange (x_size):
+        for y_rep in xrange (y_size):
+            cluster_offset = ((x_rep << y_width) + y_rep) << 20  # 1 Mbytes per cluster
+            mapping.addVseg( vspace, 'trsp_heap_%d_%d' % (x_rep, y_rep), 
+                             heap_base + cluster_offset, heap_size, 'C_WU', 
+                             vtype = 'BUFFER', x = x_rep, y = y_rep, pseg = 'RAM' )
+            
+            for p in xrange( procs_max ):
+                proc_offset = cluster_offset + (p << 18)         # 256 Kbytes per proc
+                mapping.addVseg( vspace, 'trsp_stack_%d_%d_%d' % (x_rep, y_rep, p),
+                                 stack_base + proc_offset, stack_size, 'C_WU',
+                                 vtype = 'BUFFER', x = x_rep, y = y_rep, pseg = 'RAM' )
+            
+    # distributed tasks / one task per processor
+    for x in xrange (x_size):
+        for y in xrange (y_size):
+            for p in xrange( procs_max ):
+
+                trdid = (((x * y_size) + y) * procs_max) + p
+                mapping.addTask( vspace, 'sort_%d_%d_%d' % (x,y,p), trdid, x, y, p,
+                                 'trsp_stack_%d_%d_%d' % (x,y,p),
+                                 'trsp_heap_%d_%d' % (x,y), 0 )
+
+    # extend mapping name
+    mapping.name += '_transpose'
+
+    return vspace  # useful for test
+            
+################################ test ######################################################
+
+if __name__ == '__main__':
+
+    vspace = transpose( Mapping( 'test', 2, 2, 4 ) )
+    print vspace.xml()
+
+
+# Local Variables:
+# tab-width: 4;
+# c-basic-offset: 4;
+# c-file-offsets:((innamespace . 0)(inline-open . 0));
+# indent-tabs-mode: nil;
+# End:
+#
+# vim: filetype=python:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
+
