]> granicus.if.org Git - graphviz/commitdiff
Add contributed SDL node shapes
authorerg <devnull@localhost>
Fri, 20 Jan 2006 20:58:20 +0000 (20:58 +0000)
committererg <devnull@localhost>
Fri, 20 Jan 2006 20:58:20 +0000 (20:58 +0000)
contrib/sdlshapes/README [new file with mode: 0644]
contrib/sdlshapes/sdl.ps [new file with mode: 0644]
contrib/sdlshapes/sdlshapes.dot [new file with mode: 0644]

diff --git a/contrib/sdlshapes/README b/contrib/sdlshapes/README
new file mode 100644 (file)
index 0000000..baa99dc
--- /dev/null
@@ -0,0 +1,2 @@
+PostScript library for SDL node shapes (http://www.sdl-forum.org/SDL/index.htm)
+by Mark Rison of Cambridge Silicon Radio Ltd.
diff --git a/contrib/sdlshapes/sdl.ps b/contrib/sdlshapes/sdl.ps
new file mode 100644 (file)
index 0000000..e645d0a
--- /dev/null
@@ -0,0 +1,655 @@
+%! SDL shapes for Graphviz/dot in PostScript output mode
+
+% FILE
+%   sdl.ps  -  SDL shapes for Graphviz/dot in PostScript output mode
+%
+% USE
+%   All procedures expect to be passed a rectangular bounding box in the
+%   order [upper right, lower right, lower left, upper left, upper right].
+%   All procedures expect to be used with "peripheries = 0".
+%
+% BUGS
+%   The following shapes are currently not implemented:
+%   - frame/system/block/process/procedure/service/procedure, and types thereof
+%   - macro inlet/outlet/call
+%   - exception handler/handle/raise
+%   - decision (suggest use diamond)
+%   - alternative (suggest use triangle)
+%   - internal input/output (suggest stop using historical relics!)
+%
+% COPYRIGHT AND PERMISSION NOTICE
+%   Copyright (C) 2005 Cambridge Silicon Radio Ltd.; all rights reserved.
+%
+%   Permission is hereby granted, free of charge, to any person obtaining
+%   a copy of this software and associated documentation files (the
+%   "Software"), to deal in the Software without restriction, including
+%   without limitation the rights to use, copy, modify, merge, publish,
+%   distribute, sublicense, and/or sell copies of the Software, and to
+%   permit persons to whom the Software is furnished to do so, subject to
+%   the following conditions:
+%
+%   The above copyright notice and this permission notice shall be
+%   included in all copies or substantial portions of the Software.
+%
+%   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+%   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+%   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+%   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+%   LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+%   OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+%   WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+%
+%   Except as contained in this notice, the name of a copyright holder
+%   shall not be used in advertising or otherwise to promote the sale, use
+%   or other dealings in the Software without prior written authorization
+%   of the copyright holder.
+%
+% REVISION
+%   #4
+
+/xdef {exch def} bind def
+
+% SDL task
+
+/sdl_task {
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        newpath
+        moveto
+        lineto
+        lineto
+        lineto
+        pop pop
+        closepath
+        { fill } { stroke } ifelse
+} bind def
+
+% SDL input from right
+% The indent has lines at 45 degrees
+% There should be a few spaces at the end of this shape's label
+
+/sdl_input_from_right {
+    9 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef /urx xdef
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef /ulx xdef
+        /h2 ury lry sub 2 div def
+        newpath
+        moveto
+        urx h2 sub ury h2 sub lineto
+        lrx lry lineto
+        llx lly lineto
+        ulx uly lineto
+        closepath
+        { fill } { stroke } ifelse
+    end
+} bind def
+
+% SDL input from left
+% Similar to SDL input from right
+% There should be a few spaces at the start of this shape's label
+
+/sdl_input_from_left {
+    9 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef /urx xdef
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef /ulx xdef
+        /h2 uly lly sub 2 div def
+        newpath
+        moveto
+        lrx lry lineto
+        llx lly lineto
+        ulx h2 add ury h2 sub lineto
+        ulx uly lineto
+        closepath
+        { fill } { stroke } ifelse
+    end
+} bind def
+
+% SDL priority input from right
+% Similar to SDL input from right
+% The chevrons are displaced by an eighth of the shape height
+% The filled version is indistinguishable from a non-priority SDL input
+
+/sdl_priority_input_from_right {
+    9 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef /urx xdef
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef /ulx xdef
+        /h2 ury lry sub 2 div def
+        newpath
+        moveto
+        urx h2 sub ury h2 sub lineto
+        lrx lry lineto
+        llx lly lineto
+        ulx uly lineto
+        closepath
+        { fill } { stroke
+        urx h2 4 div sub ury moveto
+        urx h2 sub h2 4 div sub ury h2 sub lineto
+        lrx h2 4 div sub lry lineto
+        stroke } ifelse
+    end
+} bind def
+
+% SDL priority input from left
+% Similar to SDL priority input from right
+
+/sdl_priority_input_from_left {
+    9 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef /urx xdef
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef /ulx xdef
+        /h2 uly lly sub 2 div def
+        newpath
+        moveto
+        lrx lry lineto
+        llx lly lineto
+        ulx h2 add uly h2 sub lineto
+        ulx uly lineto
+        closepath
+        { fill } { stroke
+        llx h2 4 div add lly moveto
+        ulx h2 add h2 4 div add uly h2 sub lineto
+        ulx h2 4 div add uly lineto
+        stroke } ifelse
+    end
+} bind def
+
+% SDL start
+% The left and right sides are semicircles
+% This should be used with "label = "                ""
+
+/sdl_start {
+    9 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef /urx xdef
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef /ulx xdef
+        pop pop
+        /r ury lry sub 2 div def
+        newpath
+        urx r sub ury r sub r 90 -90 arcn
+        ulx r add uly r sub r -90 90 arcn
+        closepath
+        { fill } { stroke } ifelse
+    end
+} bind def
+
+% SDL procedure start
+% Similar to SDL start
+% The filled version is indistinguishable from an SDL start
+% This should be used with "label = "                ""
+
+/sdl_procedure_start {
+    9 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef /urx xdef
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef /ulx xdef
+        pop pop
+        /r ury lry sub 2 div def
+        newpath
+        urx r sub ury r sub r 90 -90 arcn
+        ulx r add uly r sub r -90 90 arcn
+        closepath
+        { fill } { stroke
+        lrx r sub lry moveto
+        0 r 2 mul rlineto
+        llx r add lly moveto
+        0 r 2 mul rlineto
+        stroke } ifelse
+    end
+} bind def
+
+% SDL state/nextstate
+% The left and right sides are arcs
+
+/sdl_state {
+    12 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef /urx xdef
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef /ulx xdef
+        pop pop
+        /h2 ury lry sub 2 div def
+        /w2 h2 1.5 mul def % was urx ulx sub 2 div def but this made curvature width-dependent
+        /r w2 def
+        /th h2 r dup mul h2 dup mul sub sqrt atan def
+        newpath
+        urx w2 sub ury h2 sub r th th neg arcn
+        ulx w2 add uly h2 sub r -180 th add -180 th sub arcn
+        closepath
+        { fill } { stroke } ifelse
+    end
+} bind def
+
+% SDL output to right
+% The outdent has lines at 45 degrees
+% There should be a few spaces at the end of this shape's label
+
+/sdl_output_to_right {
+    9 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef /urx xdef
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef /ulx xdef
+        /h2 ury lry sub 2 div def
+        newpath
+        exch h2 sub exch moveto
+        urx ury h2 sub lineto
+        lrx h2 sub lry lineto
+        llx lly lineto
+        ulx uly lineto
+        closepath
+        { fill } { stroke } ifelse
+    end
+} bind def
+
+% SDL output to left
+% Similar to SDL output to right
+% There should be a few spaces at the start of this shape's label
+
+/sdl_output_to_left {
+    9 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef /urx xdef
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef /ulx xdef
+        /h2 ury lry sub 2 div def
+        newpath
+        moveto
+        lrx lry lineto
+        llx h2 add lly lineto
+        ulx ury h2 sub lineto
+        ulx h2 add uly lineto
+        closepath
+        { fill } { stroke } ifelse
+    end
+} bind def
+
+% SDL continuous signal/enabling condition
+% The chevrons have lines at 45 degrees
+% There should be a few spaces at the start and end of this shape's label
+
+/sdl_condition {
+    9 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef /urx xdef
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef /ulx xdef
+        /h2 ury lry sub 2 div def
+        newpath
+        exch h2 sub exch moveto
+        urx ury h2 sub lineto
+        lrx h2 sub lry lineto
+        dup llx h2 add lly 3 -1 roll { lineto } { moveto } ifelse
+        ulx uly h2 sub lineto
+        ulx h2 add uly lineto
+        { fill } { stroke } ifelse
+    end
+} bind def
+
+% SDL save
+% The left and right edges are at about 60 degrees
+% There should be a few spaces at the start and end of this shape's label
+
+/sdl_save {
+    9 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef /urx xdef
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef /ulx xdef
+        /h3 ury lry sub 3 div def
+        newpath
+        moveto
+        lrx h3 sub lry lineto
+        llx lly lineto
+        ulx h3 add uly lineto
+        closepath
+        { fill } { stroke } ifelse
+    end
+} bind def
+
+% SDL stop
+% The width of the bounding box is ignored; the lines are set at 45 degrees
+% This shape cannot be filled
+% This should be used with "label = """ and "arrowhead = none, headclip = false"
+
+/sdl_stop {
+    7 dict begin
+        { stop } if % make sure not asked to fill this
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        pop pop
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef pop
+        /h2 uly lly sub 2 div def
+        /mx llx lrx add 2 div def
+        newpath
+        mx h2 add exch moveto pop
+        mx h2 sub lly lineto
+        mx h2 sub uly moveto
+        mx h2 add lry lineto
+        closepath
+        stroke
+    end
+} bind def
+
+% SDL return
+% The width of the bounding box is ignored; the lines are set at 45 degrees
+% The filled version is indistinguishable from an SDL connection
+
+/sdl_return {
+    9 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef pop
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef pop
+        pop pop
+        /h2 uly lly sub 2 div 2 sqrt div def
+        /mx llx lrx add 2 div def
+        /my lry ury add 2 div def
+        newpath
+        mx my uly lly sub 2 div 0 360 arc
+        { fill } { stroke
+        mx h2 add my h2 add moveto
+        mx h2 sub my h2 sub lineto
+        mx h2 sub my h2 add moveto
+        mx h2 add my h2 sub lineto
+        stroke } ifelse
+    end
+} bind def
+
+% SDL create
+% The extra lines are displaced by an eighth of the shape height
+% The filled version is indistinguishable from an SDL task
+
+/sdl_create {
+    9 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef /urx xdef
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef /ulx xdef
+        /h8 ury lry sub 8 div def
+        newpath
+        moveto
+        lrx lry lineto
+        llx lly lineto
+        ulx uly lineto
+        closepath
+        { fill } { stroke
+        ulx uly h8 sub moveto
+        urx ury h8 sub lineto
+        llx lly h8 add moveto
+        lrx lry h8 add lineto
+        stroke } ifelse
+    end
+} bind def
+
+% SDL call
+% The extra lines are displaced by an eighth of the shape height
+% The filled version is indistinguishable from an SDL task
+% There should be a few spaces at the start and end of this shape's label
+
+/sdl_call {
+    9 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef /urx xdef
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef /ulx xdef
+        /h8 ury lry sub 8 div def
+        newpath
+        moveto
+        lrx lry lineto
+        llx lly lineto
+        ulx uly lineto
+        closepath
+        { fill } { stroke
+        urx h8 sub ury moveto
+        lrx h8 sub lry lineto
+        llx h8 add lly moveto
+        ulx h8 add uly lineto
+        stroke } ifelse
+    end
+} bind def
+
+% SDL text symbol
+% The corner has a size of twice the H height
+
+/sdl_text {
+    10 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef /urx xdef
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef /ulx xdef
+        /h8 ury lry sub 8 div def
+        newpath
+        moveto
+        /d (H) true charpath flattenpath pathbbox exch pop exch sub exch pop 2 mul def
+        newpath
+        urx ury d sub moveto
+        lrx lry lineto
+        llx lly lineto
+        ulx uly lineto
+        urx d sub ury lineto
+        closepath
+        { fill } { stroke } ifelse
+        urx ury d sub moveto
+        d neg 0 rlineto
+        0 d rlineto
+        stroke
+    end
+} bind def
+
+% SDL text extension from left
+% This should be used with "rank = same"
+
+/sdl_text_extension_from_left {
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        pop pop
+        moveto
+        lineto
+        lineto
+        lineto
+        { fill } { stroke } ifelse
+} bind def
+
+% SDL text extension from right
+% This should be used with "rank = same"
+
+/sdl_text_extension_from_right {
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        pop pop
+        8 4 roll
+        moveto
+        lineto
+        lineto
+        lineto
+        { fill } { stroke } ifelse
+} bind def
+
+% SDL comment from left
+% This should be used with "style = dashed" and "rank = same"
+
+/sdl_comment_from_left { sdl_text_extension_from_left } bind def
+
+% SDL comment from right
+% This should be used with "style = dashed" and "rank = same"
+
+/sdl_comment_from_right { sdl_text_extension_from_right } bind def
+
+% SDL connector
+% The width of the bounding box is ignored
+
+/sdl_connector {
+    7 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        pop pop
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef pop
+        pop pop
+        /h2 uly lly sub 2 div def
+        /mx llx lrx add 2 div def
+        newpath
+        mx uly h2 sub h2 0 360 arc
+        { fill } { stroke } ifelse
+    end
+} bind def
+
+% SDL set (extension)
+% The hourglass has a size of twice the H height
+% There should be a few spaces at the start of this shape's label
+
+/sdl_set {
+    10 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef /urx xdef
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef /ulx xdef
+        /my uly lly add 2 div def
+        newpath
+        moveto
+        /d (H) true charpath flattenpath pathbbox exch pop exch sub exch pop def
+        newpath
+        llx d add my d add moveto
+        ulx d add uly lineto
+        urx ury lineto
+        lrx lry lineto
+        llx d add lly lineto
+        llx d add my d sub lineto
+        dup { closepath fill } { stroke } ifelse
+        llx my d sub moveto
+        d 2 mul dup rlineto
+        d 2 mul neg 0 rlineto
+        d 2 mul dup neg rlineto
+        closepath
+        { fill } { stroke } ifelse
+    end
+} bind def
+
+% SDL reset (extension)
+% The cross has a size of twice the H height
+% There should be a few spaces at the start of this shape's label
+
+/sdl_reset {
+    10 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef /urx xdef
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef /ulx xdef
+        /my uly lly add 2 div def
+        newpath
+        moveto
+        /d (H) true charpath flattenpath pathbbox exch pop exch sub exch pop def
+        newpath
+        urx ury moveto
+        lrx lry lineto
+        llx d add lly lineto
+        ulx d add uly lineto
+        closepath
+        { fill } { stroke } ifelse
+        llx my d sub moveto
+        d 2 mul dup rlineto
+        llx d 2 mul add my d sub moveto
+        d 2 mul dup neg exch rlineto
+        stroke
+    end
+} bind def
+
+% SDL export (extension)
+% The store has a width of twice the H height
+% There should be a few spaces at the start of this shape's label
+
+/sdl_export {
+    10 dict begin
+        3 1 roll % put filled flag at end
+        4 ne { stop } if % sanity-check number of sides
+        aload pop
+        /ury xdef /urx xdef
+        /lry xdef /lrx xdef
+        /lly xdef /llx xdef
+        /uly xdef /ulx xdef
+        /my uly lly add 2 div def
+        newpath
+        moveto
+        /d (H) true charpath flattenpath pathbbox exch pop exch sub exch pop def
+        newpath
+        llx d add my d 2 div add moveto
+        ulx d add uly lineto
+        urx ury lineto
+        lrx lry lineto
+        llx d add lly lineto
+        llx d add my d 2 div sub lineto
+        { closepath fill } { stroke } ifelse
+        llx my d 2 div sub moveto
+        d 2 mul 0 rlineto
+        llx my d 2 div add moveto
+        d 2 mul 0 rlineto
+        stroke
+    end
+} bind def
\ No newline at end of file
diff --git a/contrib/sdlshapes/sdlshapes.dot b/contrib/sdlshapes/sdlshapes.dot
new file mode 100644 (file)
index 0000000..99bf6ae
--- /dev/null
@@ -0,0 +1,78 @@
+digraph test
+{
+        sdl_task [shape=sdl_task, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_task2 [shape=sdl_task, label="sdl_task", peripheries=0];
+        sdl_task -> sdl_task2;
+        sdl_input_from_right [shape=sdl_input_from_right, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_input_from_right2 [shape=sdl_input_from_right, label="sdl_input_from_right    ", peripheries=0];
+        sdl_input_from_right -> sdl_input_from_right2;
+        sdl_input_from_left [shape=sdl_input_from_left, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_input_from_left2 [shape=sdl_input_from_left, label="    sdl_input_from_left", peripheries=0];
+        sdl_input_from_left -> sdl_input_from_left2;
+        sdl_priority_input_from_right [shape=sdl_priority_input_from_right, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_priority_input_from_right2 [shape=sdl_priority_input_from_right, label="sdl_priority_input_from_right     ", peripheries=0];
+        sdl_priority_input_from_right -> sdl_priority_input_from_right2;
+        sdl_priority_input_from_left [shape=sdl_priority_input_from_left, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_priority_input_from_left2 [shape=sdl_priority_input_from_left, label="     sdl_priority_input_from_left", peripheries=0];
+        sdl_priority_input_from_left -> sdl_priority_input_from_left2;
+        sdl_start [shape=sdl_start, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_start2 [shape=sdl_start, label="                ", peripheries=0];
+        sdl_start -> sdl_start2;
+        sdl_procedure_start [shape=sdl_procedure_start, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_procedure_start2 [shape=sdl_procedure_start, label="                ", peripheries=0];
+        sdl_procedure_start -> sdl_procedure_start2;
+        sdl_state [shape=sdl_state, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_state2 [shape=sdl_state, peripheries=0];
+        sdl_state -> sdl_state2;
+        sdl_output_to_right [shape=sdl_output_to_right, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_output_to_right2 [shape=sdl_output_to_right, label="sdl_output_to_right  ", peripheries=0];
+        sdl_output_to_right -> sdl_output_to_right2;
+        sdl_output_to_left [shape=sdl_output_to_left, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_output_to_left2 [shape=sdl_output_to_left, label="  sdl_output_to_left", peripheries=0];
+        sdl_output_to_left -> sdl_output_to_left2;
+        sdl_condition [shape=sdl_condition, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_condition2 [shape=sdl_condition, label="  sdl_condition  ", peripheries=0];
+        sdl_condition -> sdl_condition2;
+        sdl_save [shape=sdl_save, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_save2 [shape=sdl_save, label="  sdl_save  ", peripheries=0];
+        sdl_save -> sdl_save2;
+        sdl_stop [shape=sdl_stop, peripheries=0];
+        sdl_stop2 [shape=sdl_stop, label="", peripheries=0];
+        sdl_stop -> sdl_stop2 [arrowhead=none, headclip=false];
+        sdl_return [shape=sdl_return, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_return2 [shape=sdl_return, label="", peripheries=0];
+        sdl_return -> sdl_return2;
+        sdl_create [shape=sdl_create, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_create2 [shape=sdl_create, peripheries=0];
+        sdl_create -> sdl_create2;
+        sdl_call [shape=sdl_call, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_call2 [shape=sdl_call, label="  sdl_call  ", peripheries=0];
+        sdl_call -> sdl_call2;
+        sdl_text [shape=sdl_text, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_text2 [shape=sdl_text, peripheries=0];
+        sdl_text -> sdl_text2;
+        sdl_text_extension_from_left [shape=sdl_text_extension_from_left, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_text_extension_from_left2 [shape=sdl_text_extension_from_left, peripheries=0];
+        sdl_text_extension_from_left -> sdl_text_extension_from_left2;
+        sdl_text_extension_from_right [shape=sdl_text_extension_from_right, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_text_extension_from_right2 [shape=sdl_text_extension_from_right, peripheries=0];
+        sdl_text_extension_from_right -> sdl_text_extension_from_right2;
+        sdl_comment_from_left [shape=sdl_comment_from_left, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_comment_from_left2 [shape=sdl_comment_from_left, style=dashed, peripheries=0];
+        sdl_comment_from_left -> sdl_comment_from_left2;
+        sdl_comment_from_right [shape=sdl_comment_from_right, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_comment_from_right2 [shape=sdl_comment_from_right, style=dashed, peripheries=0];
+        sdl_comment_from_right -> sdl_comment_from_right2;
+        sdl_connector [shape=sdl_connector, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_connector2 [shape=sdl_connector, peripheries=0];
+        sdl_connector -> sdl_connector2;
+        sdl_set [shape=sdl_set, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_set2 [shape=sdl_set, label="    sdl_set2", peripheries=0];
+        sdl_set -> sdl_set2;
+        sdl_reset [shape=sdl_reset, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_reset2 [shape=sdl_reset, label="    sdl_reset2", peripheries=0];
+        sdl_reset -> sdl_reset2;
+        sdl_export [shape=sdl_export, color=red, fillcolor=cyan, style=filled, peripheries=0];
+        sdl_export2 [shape=sdl_export, label="    sdl_export", peripheries=0];
+        sdl_export -> sdl_export2;
+}
\ No newline at end of file