major updates to manual
authoradam <adam@megacz.com>
Sun, 26 Aug 2007 10:50:10 +0000 (11:50 +0100)
committeradam <adam@megacz.com>
Sun, 26 Aug 2007 10:50:10 +0000 (11:50 +0100)
doc/archman.tex
doc/locations.svg [new file with mode: 0644]

index c969280..7e320e2 100644 (file)
@@ -1,6 +1,7 @@
 \documentclass[10pt,oneside]{article}
 \reversemarginpar 
 \usepackage{palatino}
+\usepackage{wrapfig}
 \usepackage{epsfig}
 \usepackage{verbatim}
 \usepackage{parskip}
@@ -22,6 +23,9 @@
 \bibitem[IES44]{ies44}
   Sutherland, Ivan,
   \href{http://research.cs.berkeley.edu/class/fleet/docs/people/ivan.e.sutherland/ies44-Fleet.Definition.pdf}{\it UCB-IES44: The Fleet Definition}
+\bibitem[MS68]{WheelOfReincarnation}
+  Myer, T. and Sutherland, Ivan, {\it On the Design of Display Processors}
+  Communications of the ACM, Vol 11, No. 6, June 1968 .
 \end{thebibliography}
 
 \vspace{3cm}
@@ -44,7 +48,10 @@ necessary to write software and compilers for Fleet.
 \pagebreak
 \section*{Introduction (from \cite{ies02})}
 
-In \cite{ies02}, Sutherland writes:
+During the past two and a half years, the Fleet architecture has gone
+through massive changes and improvements.  In spite of this, however,
+the fundamental idea behind Fleet remains unchanged.  As Sutherland
+writes in the original Berkeley Fleet description \cite{ies02},
 
 {\it
 When computers were new, logic and storage were expensive and wires
@@ -194,16 +201,16 @@ the instruction.
   \bitheader[b]{0,10,11,17,18-26,36}\\
   \bitbox[r]{12}{}
   \bitbox{11}{Instruction Path}
-  \bitbox{1}{K} 
-  \bitbox{1}{L} 
+  \bitbox{1}{1} 
   \bitbox{1}{Ti} 
   \bitbox{1}{Di} 
   \bitbox{1}{Dc} 
   \bitbox{1}{Do} 
   \bitbox{1}{To} 
+  \bitbox{1}{Ig} 
   \bitbox{1}{Rq} 
+  \bitbox{11}{Data/Token Path} 
   \bitbox{7}{Count} 
-  \bitbox{11}{Data/Token Path}
 \end{bytefield}
 }
 
@@ -219,42 +226,39 @@ instruction.
   \bitbox[r]{1}{0} 
   \bitbox{11}{Instruction Path}
   \bitbox{11}{Instruction Path}
-  \bitbox{1}{K} 
-  \bitbox{1}{L} 
+  \bitbox{1}{1} 
   \bitbox{1}{Ti} 
   \bitbox{1}{Di} 
   \bitbox{1}{Dc} 
   \bitbox{1}{Do} 
   \bitbox{1}{To} 
+  \bitbox{1}{Ig} 
   \bitbox{1}{Rq} 
+  \bitbox{11}{Data/Token Path} 
   \bitbox{7}{Count} 
-  \bitbox{11}{Data/Token Path}
 \end{bytefield}
 }
 
-
+\setlength{\bitwidth}{5mm}
 \pagebreak
 
 \section*{Instruction Formats}
+\begin{wrapfigure}{R}{2in}
+\epsfig{file=locations,width=2in}
+\vspace{-0.4in}
+\end{wrapfigure}
+Within the pump's instruction fifo, there are two points of particular
+interest.  The first point is the {\it insertion point}, which is the
+point in the ring where new instructions enter from the switch fabric.
+The other point of interest is the {\it execution point}, which is the
+point in the ring where instructions other than {\tt kill} and {\tt
+  unclog} are performed.
+
+The programmer may assume that the insertion point is the immediate
+successor of the insertion point.
 
-Instructions can be grouped into two categories: {\it killing}
-instructions, which are acted upon as soon as they leave the
-instruction horn, and {\it executing} instructions, which pass through
-the instruction queue before being acted upon.
-
-Blank fields below are reserved for future use and must be set to
-zero.
-
-Note that the arbiter is requested whenever {\it any of the first
-  three bits is {\tt 1}}.  If the arbiter is not requested, 
-
-
-
-\setlength{\bitwidth}{5mm}
-
-\subsection*{Killing Instructions}
-
-Kill (kill anything other than a Clog)
+\vspace{0.3cm}
+{\bf Kill}
 
 {\tt
 \begin{bytefield}{26}
@@ -267,35 +271,51 @@ Kill (kill anything other than a Clog)
   \bitbox{14}{}
   \bitbox{7}{Count} 
 \end{bytefield}}
+When a {\tt kill} instruction reaches the insertion point, it will
+wait there for a non-{\tt clog} instruction to reach the execution
+point.  When this occurs, the instruction at the execution point is
+retired and the count field of the {\tt kill} instruction is
+decremented.  If the {\tt kill} instruction's count was {\tt 0} before
+decrementing, the {\tt kill} instruction is retired.
 
-UnClog (kill a Clog)
+\vspace{0.3cm}
+{\bf Clog}
 
 {\tt
 \begin{bytefield}{26}
   \bitheader[b]{0,20-25}\\
   \bitbox{1}{0} 
   \bitbox{1}{0} 
-  \bitbox{1}{0} 
   \bitbox{1}{1} 
   \bitbox{1}{0} 
+  \bitbox{1}{0} 
   \bitbox{21}{}
 \end{bytefield}}
+When a {\tt clog} instruction reaches the execution point, no more
+instructions will be executed until an {\tt unclog} is performed.
 
-\subsection*{Executing Instructions}
-Clog
+\vspace{0.3cm}
+{\bf UnClog}
 
 {\tt
 \begin{bytefield}{26}
   \bitheader[b]{0,20-25}\\
   \bitbox{1}{0} 
   \bitbox{1}{0} 
-  \bitbox{1}{1} 
   \bitbox{1}{0} 
+  \bitbox{1}{1} 
   \bitbox{1}{0} 
   \bitbox{21}{}
 \end{bytefield}}
+When an {\tt unclog} instruction reaches the insertion point, it will wait
+there until a {\tt clog} instruction is at the execution point.  When
+this occurs, both instructions retire. {\it Note:} this means
+that if an {\tt unclog} instruction enters the instruction fifo
+without a {\tt clog} ahead of it, the pump's insertion point will become
+irretrievably jammed.
 
-Literal (sign extended, implicit {\tt Rq=1})
+\vspace{0.3cm}
+{\bf Literal}
 
 {\tt
 \begin{bytefield}{26}
@@ -305,34 +325,18 @@ Literal (sign extended, implicit {\tt Rq=1})
   \bitbox{17}{Literal}
   \bitbox{7}{Count} 
 \end{bytefield}}
-
-
-Normal
-
-{\tt
-\begin{bytefield}{26}
-  \bitheader[b]{0,6,7,17-25}\\
-  \bitbox{1}{1} 
-  \bitbox{1}{Ti} 
-  \bitbox{1}{Di} 
-  \bitbox{1}{Dc} 
-  \bitbox{1}{Do} 
-  \bitbox{1}{To} 
-  \bitbox{1}{Ig} 
-  \bitbox{1}{Rq} 
-  \bitbox{11}{Dest} 
-  \bitbox{7}{Count} 
-\end{bytefield}}
-
-
+When a literal instruction reaches the execution point, its {\tt
+  Literal} field is sign-extended to a full word length and captured
+in the data latch.
 
 
 \pagebreak
-\subsection*{Field Descriptions}
+{\bf Normal Instruction (at Execution Point)}
+
 {\tt
 \begin{bytefield}{26}
   \bitheader[b]{0,6,7,16-25}\\
-  \bitbox{1}{0} 
+  \bitbox{1}{1} 
   \bitbox{1}{Ti} 
   \bitbox{1}{Di} 
   \bitbox{1}{Dc} 
@@ -396,13 +400,15 @@ Note how a ``standing'' instruction is encoded as {\tt Count=1111111}
 
    However, in the special case of an outbox, if {\tt Do=1,To=1}, then
    the {\it most significant} {\tt 11} bits of the value in the {\it
-   data register} are used as a destination address instead.  \footnote{This
-   functionality eliminates the need for any sort of ``{\tt Execute}''
-   ship, and lets a {\tt Fifo} ship act as an extension of the
-   instruction queue in the pump.}
+   data register} are used as a destination address instead.
+   %\footnote{This
+   %functionality eliminates the need for any sort of ``{\tt Execute}''
+   %ship, and lets a {\tt Fifo} ship act as an extension of the
+   %instruction queue in the pump.}
 
 \end{itemize}
 
+
 \pagebreak
 \section*{Fleet Assembly Language}
 
@@ -413,6 +419,83 @@ syntax is given below:
 \verbatiminput{fleet.g}
 
 \pagebreak
+\section*{FleetDoc}
+
+Inspired by JavaDoc, the Fleet software toolchain includes a tool
+called {\tt FleetDoc}, which processes {\it ship description files}
+(with the extension {\tt .ship}).  These files contain sections for:
+
+\begin{itemize}
+\item The name of the ship
+\item A list of its ports
+\item A prose description of the ship
+\item A list of the constants associated with a ship
+\item Java source code for a software simulation of the ship
+\item Verilog source code for an FPGA simulation of the ship
+\item A test case for the ship
+\item A list of the contributors to all of the above
+\end{itemize}
+
+Keeping all of this information in a single file ensures that changes
+to one item (such as the list of ports) are propagated to the other
+items (such as the verilog code for simulation purposes).
+
+Keeping this information in {\it machine-readable} format makes it
+possible to automatically generate tools which depend on the precise
+details of ship ports (such as the Fleet assembler) without the risk
+inherent in manual synchronization of the spec with the
+implementation.
+
+The latter half of this manual is generated automatically from the
+contents of the {\tt .ship} files.
+
+\pagebreak
+\subsection*{An Example FleetDoc File}
+\begin{verbatim}
+ship: BitFifo
+
+== Ports ===========================================================
+in:   in
+in:   inOp
+  constant lsbFirst: ....................................1
+  constant msbFirst: ....................................0
+  constant drop:     .............................uuuuuu..
+  constant take:     .......................uuuuuu........
+...
+  
+== TeX ==============================================================
+The BitFifo internally stores some number of bits in a fifo structure.
+Its capacity is guaranteed to be at least two full machine words or
+more.
+...
+
+== Fleeterpreter ====================================================
+public void service() {
+  if (box_inOp.dataReadyForShip() && box_in.dataReadyForShip()) {
+  ...
+
+== FPGA ==============================================================
+always @(posedge clk) begin
+  if (!in_r    && in_a)     in_a    <= 0;
+  if (!inOp_r  && inOp_a)   inOp_a  <= 0;
+  ...
+
+== Test ==============================================================
+#expect 1
+#expect 68719476736
+#ship debug        : Debug
+#ship bitfifo      : BitFifo
+
+bitfifo.outOp:      literal BitFifo.outOp[take=37]; [*] deliver;
+...
+
+== Contributors =========================================================
+Amir Kamil <kamil@cs.berkeley.edu>
+Adam Megacz <megacz@cs.berkeley.edu>
+\end{verbatim}
+
+
+\pagebreak
 \section*{Java APIs}
 \subsection*{Representing Code}
 \subsection*{Representing Ships}
@@ -430,6 +513,8 @@ syntax is given below:
 \pagebreak
 \section*{Future Directions}
 
+\subsection*{The Role of the Count Field}
+
 Looking back on the design of the pump, several things are now
 apparent which were not initially.  In particular, it seems that it
 could be useful to separate {\it loading the count register} from
@@ -438,31 +523,97 @@ other types of instructions.  This would have a few advantages:
 \begin{itemize}
 \item The size of the count field would not be a consideration in the
       ``instruction budget'' of normal execution instructions
+
 \item It would be possible to have finitely-repeating,
-      infinitely-requeueing instructions (FIXME).
+      infinitely-requeueing instructions.  Various implementation
+      details\footnote{in many implementations, the count field of an
+      instruction is destroyed as it counts down; another register and
+      mux would be needed to ``save'' this value so it could be
+      restored prior to being requeued} make it awkward to support
+      this unless the count register can be manipulated independently
+      of instruction execution.
 \end{itemize}
 
-\begin{verbatim}
-essence of the pump:
-
-ti
-di
+With this in mind, we can refactor the ``essence of the pump'' into
+the following fields, which are basically orthogonal:
 
-dc (data capture)
-dl (data literal, take from instruction bits)
+\begin{itemize}
+\item wait for a token
+\item wait for a datum
+\item load the data latch from the awaited datum
+\item load the data latch from a literal in the instruction
+\item send a datum to a destination indicated by the instruction
+\item send a datum to a destination indicated by the data latch value
+\item send a token to a destination indicated by the instruction
+\item send a token to a destination indicated by the data latch value
+\item set the count register to a literal value
+\item decrement the count register
+\item requeue this instruction if {\tt count>0}
+\item requeue this instruction unconditionally
+\item repeat this instruction if {\tt count>0}
+\item repeat this instruction unconditionally
+\end{itemize}
 
-di
-doi (data output, destination taken from instruction)
-dod (data output, destination taken from Data register)
+The crucial change here is the decoupling of the act of {\it loading
+  the count register} from the act of {\it loading the next
+  instruction}.
+
+At this point, it boils down to a question of instruction bit
+budgeting.  Currently we have a separate instruction form for
+literals, so that the literal can use bits which are not otherwise
+relevant to literal instructions (for example, {\tt Di}).  Adding an
+additional instruction form for loading the count register would have
+similar advantages.
+
+
+\subsection*{For Just a Little Bit More...}
+
+Compared to early revisions of the Fleet architecture, the valves of
+FleetTwo are substantially more powerful.  One might ask, why not add
+additional power to the valves, perhaps up to the point of making them
+tiny von Neumann machines in their own right?  Indeed, doing so would
+risk reliving the {\it Wheel of Reincarnation}
+\cite{WheelOfReincarnation}.
+
+I believe, however, that there is a fundamental distinction to be
+made between devices whose control flow {\it can branch} and those
+whose control flow {\it cannot branch}, and that this distinction is
+founded in the geometry of VLSI, and indeed, Euclidean space.
+Ultimately, the instruction stream for any component of a processor
+must exist in some physical incarnation -- some geometric extent.  If
+the control flow of a program is linear, with no branching, then the
+instruction stream has an optimal spatial mapping which is quite
+efficient: it is simply laid out in FIFO fashion.
+
+By contrast, however, a program whose instruction stream has
+unrestricted branching is logically a {\it tree} structure.  Quite
+unfortunately, general trees have no efficient mapping onto
+two-dimensional surfaces.  By this, I mean that in every possible
+mapping, there exists some pair of {\it logically adjacent}
+instructions whose {\it physical distance} is proportional to the size
+of the entire program, rather than some constant factor irrespective
+of the program size.  Therefore I conclude that the spatial mapping of
+a program with unrestricted branching is in an entirely different
+class than that of programs with linear control flow.  I choose this
+distinction as the basis for limiting our valves to linear control
+flow sequences.  A similar argument can be made for looping constructs
+in which two or more loops may be nested within a single parent loop.
+
+With this distinction in mind, it would not be objectionable for
+future incarnations of Fleet to have {\it predicated} instructions at
+the valves.  This might take the form of:
 
-set count
-decrement count
+\begin{itemize}
+\item Instructions to unconditionally set some ``state flags''
+\item Instructions to conditionally set some ``state flags'' based on the contents of the data latch
+\item Bits which cause an instruction to be ignored or retired based on the state flags
+\end{itemize}
 
-requeue if count>0
-requeue unconditionally
-repeat  if count>0
-repeat  unconditionally
+I feel that this addition would not risk falling down the slippery
+slope -- instruction streams with predicated instructions (but not
+unrestricted branching) preserve the crucial property that they have
+an efficient spatial mapping.  Any steps beyond this, however, cross a
+fairly fundamental line.
 
-\end{verbatim}
 
 
diff --git a/doc/locations.svg b/doc/locations.svg
new file mode 100644 (file)
index 0000000..1563a5e
--- /dev/null
@@ -0,0 +1,271 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="1052.3622"
+   height="744.09448"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.45.1"
+   sodipodi:docbase="/Users/megacz/proj/fleet/doc"
+   sodipodi:docname="locations.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   version="1.0">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Mstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Mstart"
+       style="overflow:visible">
+      <path
+         id="path3224"
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.6) translate(0,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path3227"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(-0.6,-0.6)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend"
+       style="overflow:visible">
+      <path
+         id="path3209"
+         d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     gridtolerance="10000"
+     guidetolerance="10"
+     objecttolerance="10"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.3060085"
+     inkscape:cx="485.19327"
+     inkscape:cy="306.01725"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     gridspacingx="2mm"
+     gridspacingy="2mm"
+     gridanglex="8.4666669mm"
+     gridanglez="8.4666669mm"
+     grid_units="mm"
+     inkscape:grid-bbox="false"
+     inkscape:grid-points="true"
+     inkscape:window-width="1462"
+     inkscape:window-height="1079"
+     inkscape:window-x="75"
+     inkscape:window-y="52"
+     width="1052.3622px"
+     height="744.09448px"
+     showguides="true"
+     inkscape:guide-bbox="true" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#999999;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 744.09449,354.33071 L 492.97638,354.33071"
+       id="path3413"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#999999;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mend);stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 481.88976,304.72441 L 711.74803,304.72441"
+       id="path3397"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#999999;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 315.81102,340.15748 L 222.77165,340.15748"
+       id="path3193"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#999999;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 432.28346,425.19686 L 432.28346,368.50394"
+       id="path3171" />
+    <path
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#999999;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 488.97638,283.46456 L 488.97638,389.76378 L 361.41733,389.76378 L 311.81103,340.15748 L 361.41733,283.46456 L 488.97638,283.46456 z "
+       id="path3187"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#999999;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 422.72608,389.92662 L 432.28346,375.59056 L 441.84084,389.92662 L 422.72608,389.92662 z "
+       id="path3189" />
+    <g
+       id="g3407"
+       transform="translate(190.67764,269.74805)"
+       style="stroke:#999999">
+      <rect
+         y="74.409424"
+         x="439.37009"
+         height="21.259842"
+         width="21.259842"
+         id="rect3399"
+         style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#999999;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <rect
+         y="74.409424"
+         x="460.62991"
+         height="21.259842"
+         width="21.259842"
+         id="rect3401"
+         style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#999999;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <rect
+         y="74.409424"
+         x="481.88977"
+         height="21.259842"
+         width="21.259842"
+         id="rect3403"
+         style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#999999;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+      <rect
+         y="74.409424"
+         x="503.1496"
+         height="21.259842"
+         width="21.259842"
+         id="rect3405"
+         style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#999999;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:21.72095108px;font-style:normal;font-weight:normal;fill:#999999;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="414.26114"
+       y="330.02695"
+       id="text3565"><tspan
+         sodipodi:role="line"
+         id="tspan3567"
+         x="414.26114"
+         y="330.02695"
+         style="text-align:center;text-anchor:middle;fill:#999999">Data</tspan><tspan
+         sodipodi:role="line"
+         x="414.26114"
+         y="357.17814"
+         id="tspan3569"
+         style="text-align:center;text-anchor:middle;fill:#999999">Latch</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#999999;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 304.72441,425.54331 L 474.80315,425.54331 C 474.80315,425.54331 482.22667,425.21799 481.88976,432.62992 L 481.88976,488.97638 C 481.88976,488.97638 482.55199,496.06299 474.80315,496.06299 L 276.37795,496.06299 C 276.37795,496.06299 269.29133,497.39903 269.29133,488.97638 L 269.29133,432.62992 C 268.28061,424.20727 276.37795,425.54331 276.37795,425.54331 L 304.72441,425.54331 z "
+       id="path2247"
+       sodipodi:nodetypes="cccccccccc" />
+    <path
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#999999;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 290.37796,412.11024 L 290.37796,440.45669 L 325.81103,440.45669 L 339.98426,426.28347 L 325.81103,412.11024 L 290.37796,412.11024 z "
+       id="path2249" />
+    <path
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#999999;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 347.07087,412.11024 L 347.07087,440.45669 L 382.50394,440.45669 L 396.67717,426.28347 L 382.50394,412.11024 L 347.07087,412.11024 z "
+       id="path2251" />
+    <path
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#999999;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 453.37007,482.97637 L 453.37007,511.32282 L 417.937,511.32282 L 403.76377,497.1496 L 417.937,482.97637 L 453.37007,482.97637 z "
+       id="path2253" />
+    <path
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#999999;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 396.67716,482.97638 L 396.67716,511.32283 L 361.24409,511.32283 L 347.07086,497.14961 L 361.24409,482.97638 L 396.67716,482.97638 z "
+       id="path2255" />
+    <path
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#999999;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 339.98425,482.97637 L 339.98425,511.32282 L 304.55118,511.32282 L 290.37795,497.1496 L 304.55118,482.97637 L 339.98425,482.97637 z "
+       id="path2257" />
+    <path
+       style="fill:#ffffff;fill-rule:evenodd;stroke:#008000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 410.8504,412.11024 L 410.8504,440.45669 L 446.28347,440.45669 L 460.4567,426.28347 L 446.28347,412.11024 L 410.8504,412.11024 z "
+       id="path2259" />
+    <text
+       xml:space="preserve"
+       style="font-size:21.72095108px;font-style:normal;font-weight:normal;fill:#999999;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="349.24408"
+       y="467.5433"
+       id="text2261"><tspan
+         sodipodi:role="line"
+         id="tspan2263"
+         x="349.24408"
+         y="467.5433">Pump</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 596.3622,506.06299 L 490.06299,433.19684"
+       id="path3244"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#008000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mend);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 581.10236,389.76377 L 460.62992,418.11023"
+       id="path4215"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:21.72095108px;font-style:normal;font-weight:normal;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="589.10236"
+       y="396.8504"
+       id="text4217"><tspan
+         sodipodi:role="line"
+         id="tspan4219"
+         x="589.10236"
+         y="396.8504">Execution Point</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:21.72095108px;font-style:normal;font-weight:normal;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       x="614.59222"
+       y="531.49603"
+       id="text4221"><tspan
+         sodipodi:role="line"
+         id="tspan4223"
+         x="614.59222"
+         y="531.49603"
+         style="text-align:center;text-anchor:middle;fill:#ff0000">Insertion</tspan><tspan
+         sodipodi:role="line"
+         x="614.59223"
+         y="558.64722"
+         id="tspan4225"
+         style="text-align:center;text-anchor:middle;fill:#ff0000">Point</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 687.40157,425.19685 L 488.97638,425.19685 C 488.97638,425.19685 481.21595,424.87154 481.88976,432.28347 L 481.88976,460.62992"
+       id="path3417"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#999999;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 744.09449,425.19685 L 492.97638,425.19685"
+       id="path3419"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>