[util] New i2csvg utility to make pictures of I2C transactions

Add a new util to convert text representations of the data
written to the master I2C fifo into pictures matching those in
the SMBus specification.

i2csvg can work from either a readable text format or from a
hex dump of values written to the fifo. See the README.md for
details and examples.

Used to show how all the SMBus 3.0 chapter 6.7 commands can
be encoded using the interface. Added markdown that can be
merged into the I2C documentation eventually.

Signed-off-by: Mark Hayter <mark.hayter@gmail.com>
diff --git a/util/i2csvg/i2csvg_data.py b/util/i2csvg/i2csvg_data.py
new file mode 100644
index 0000000..c9e7c0e
--- /dev/null
+++ b/util/i2csvg/i2csvg_data.py
@@ -0,0 +1,141 @@
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+#
+# Svg data for I2C display
+
+# constants in svg tag
+svgtag_consts = """
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   overflow="hidden"
+"""
+
+# styles
+svgstyle = """
+    <style type="text/css">
+      text { font-size: 11pt; font-style: normal; font-variant:
+      normal; font-weight: bold; font-stretch: normal;
+      text-align: center; text-anchor: middle; fill-opacity: 1; font-family:
+      Helvetica }
+
+      .tt {
+      text-anchor: start; font-weight: normal; font-size: 10pt;
+      font-family: monospace
+      }
+
+      .shost {
+      fill: none;
+      stroke: #000;
+      stroke-width: 1;
+      stroke-linecap: round;
+      stroke-linejoin: miter;
+      stroke-miterlimit: 4;
+      stroke-opacity: 1;
+      stroke-dasharray: none
+      }
+
+      .dash {
+      fill: none;
+      stroke: #000;
+      stroke-width: 1;
+      stroke-linecap: butt;
+      stroke-linejoin: miter;
+      stroke-miterlimit: 4;
+      stroke-opacity: 1;
+      stroke-dasharray: 8;
+      }
+
+      .sdev {
+      fill: #CCC;
+      stroke: #000;
+      stroke-width: 1;
+      stroke-linecap: round;
+      stroke-linejoin: miter;
+      stroke-miterlimit: 4;
+      stroke-opacity: 1;
+      stroke-dasharray: none
+      }
+
+
+    </style>
+"""
+
+# width of the svg
+svgw = 1000
+
+# svg defs are made with a bit-box 20,40 so set constants based on that
+bitw = 20
+bith = 40
+bytew = 160
+
+# text is offset from the top of a bit
+txty = 25
+
+# formatting:
+wrap = 880  # the wrap point for long transactions
+cindent = 60  # the indentation for continuation lines
+linesep = 50  # separation between lines
+
+svg_defs = """
+    <defs>
+      <g id="start">
+        <path d="M0,0 h 20 m0,40 h -20 v -40" class="shost" />
+        <text x="10" y="25">S</text>
+      </g>
+      <g id="pstop">
+        <path d="M0,0 h 20 v 40 h -20 M0,0" class="shost" />
+        <text x="10" y="25">P</text>
+      </g>
+      <g id="ackh">
+        <path d="M0,0 h 20 v 40 h -20 v -40" class="shost" />
+        <text x="10" y="25">A</text>
+      </g>
+      <g id="ackd">
+        <path d="M0,0 h 20 v 40 h -20 v -40" class="sdev" />
+        <text x="10" y="25">A</text>
+      </g>
+      <g id="nackh">
+        <path d="M0,0 h 20 v 40 h -20 v -40" class="shost" />
+        <text x="10" y="25">N</text>
+      </g>
+      <g id="nackd">
+        <path d="M0,0 h 20 v 40 h -20 v -40" class="sdev" />
+        <text x="10" y="25">N</text>
+      </g>
+      <g id="norackd">
+        <path d="M0,0 h 20 v 40 h -20 v -40" class="sdev" />
+        <text x="5" y="15">A/</text>
+        <text x="15" y="35">N</text>
+      </g>
+      <g id="skip">
+        <path d="M0,0 h 8 l-5,30 l5,-10 l-5,20 h -3 v -40" class="shost" />
+        <path d="M17,0 h 3 v 40 h -8 l5,-30 l-5,10 l5,-20" class="shost" />
+      </g>
+      <g id="hbyte">
+        <path d="M0,0 h 160 m0,40 h -160 v -40" class="shost" />
+      </g>
+      <g id="dbyte">
+        <path d="M0,0 h 160 v 40 h -160 v -40" class="sdev" />
+      </g>
+      <g id="adr0">
+        <path d="M0,0 h 160 m0,40 h -160 v -40" class="shost" />
+        <path d="M140,0 v 40" class="dash" />
+        <text x="80" y="25">Adr</text>
+        <text x="150" y="25">wr</text>
+      </g>
+      <g id="adr1">
+        <path d="M0,0 h 160 m0,40 h -160 v -40" class="shost" />
+        <path d="M140,0 v 40" class="dash" />
+        <text x="80" y="25">Adr</text>
+        <text x="150" y="25">rd</text>
+      </g>
+      <g id="adr2">
+        <path d="M0,0 h 160 m0,40 h -160 v -40" class="shost" />
+        <path d="M140,0 v 40" class="dash" />
+        <text x="80" y="25">Adr</text>
+        <text x="150" y="25">d</text>
+      </g>
+
+    </defs>
+"""