# i2csvg -- Generate svg pictures of I2C commands from text description

i2csvg is a Python tool to read I2C transactions from a text file and
generate `svg` pictures of them. It also supports SMBus transactions
and the smbus subdirectory contains examples of how to use the tool to
generate all the transactions from section 6.5 of the [SMBus
Specification 3.0](http://smbus.org/specs/SMBus_3_0_20141220.pdf)

Two source representations are supported. The first is a more
readable format and describes transactions in text. The second is a
hex-dump of values written to the I2C FIFO. In either format a line
starting with a `#` is taken as a comment and a line staring with a
`T` will be used to generate a title in the output.

To assist in parsing debug output the tool can be given a prefix. Only
lines with the prefix will be processed (after removal of the prefix).

### Textual Source Format

The textual description includes the flags and value written to the
I2C host interface FIFO to make the transaction. The flags and data
may be separated by whitespace. The flags are letters representing
each of the 5 control bits written to the FIFO:

|Flag | Use |
|-----|-----|
|S | Send a start signal before the data |
|P | Send a stop signal after the data |
|R | Read transaction (data value indicates how many bytes to read) |
|C | With R, allows read to continue by ACK of the last byte read |
|N | NACK OK, do not raise an error on a NACK |
|. | A dot is guaranteed to be ignored in the input, it is included in the text output format to help readability |

The flags may occur in any order (but not be repeated) and additional
characters will be ignored. In general other than dot (`.`) other
characters should be avoided since they may be used by future
versions of the tool!

The value may be an integer (binary, octal, decimal and hex
supported) or one of the special values that change how the output is
drawn:

|Value | Use |
|------|-----|
|A0 | Address with direction bit set to 0 (write) |
|A1 | Address with direction bit set to 1 (read) |
|A2 | Address in SMBus Quick command with direction bit used for data |
|M  | Multi-byte transaction, drawn as D1, D2 ... DN (like SMBus) |
|'tag'| In single quotes: Tag for the value that is drawn in output |

Lines of the input may consist of a single flag+value per line or a
comma separated list of flag+value pairs.

### Hexdump source format

In the hexdump source format tool processes the raw 13-bit data that
is written to the I2C FIFO. This is normally in hex (preceded with
0x) but the tool will accept binary, octal or decimal. Lines of input
may consist of a single hex value, multiple values separated by commas
(and optionally whitespace) or multiple values separated by
whitespace.

### Output file format

The output file generated depends on the options specified.

|Type | Options|
|-----|--------|
|`.svg`  | If multiple output files are generated or debug/text not selected |
|`.html` | If debug/text is selected and svg is generated |
|`.txt`  | If debug/test is selected and no svg is generated (`--nosvg`) |

The example commands assume `$REPO_TOP` is set to the toplevel
directory of the repo.

### Setup

The i2csvg tool does not depend on any other packages.

### Examples using i2csvg.py

The i2csvg/examples directory contains some example I2C files. For
simple examples text can be piped in to the tool using echo.

A simple I2C write consists of a Start with Address and direction bit
of zero, and a single data byte (4 in the example) with a Stop.

The baseline tool will generate an svg file (which can be viewed in a
browser) that includes the diagrammatic form of the transaction and a
line with the comma separated structured text form.

```console
$ cd $REPO_TOP/util
$ echo "SA0, P4" | ./i2csvg.py > out.svg
```

The text version (which is just the input with more structured
formatting) can be viewed in the terminal by suppressing the svg
output. This output will always have the five flags in order and five
characters in the flags field (including a `.` if the flag is not
set):

```console
$ cd $REPO_TOP/util
$ echo "SA0, P4" | ./i2csvg.py --text --nosvg
S.... A0
.P... 0x4
```

The debug version is intended for tool development:

```console
$ cd $REPO_TOP/util
$ echo "SA0, P4" | ./i2csvg.py --debug --nosvg
I2cOp(read=False, rcont=False, start=True, stop=False, nackok=False, mvalue=False, adr=True, size=10, fbyte=0, tag=None)
I2cOp(read=False, rcont=False, start=False, stop=True, nackok=False, mvalue=False, adr=False, size=10, fbyte=4, tag=None)
```

If svg generation is not suppressed then the text or debug output and
the svg are generated in an HTML file.

```console
$ cd $REPO_TOP/util
$ echo "SA0, P4" | ./i2csvg.py --text > out.html
```

The smbus directory contains files with each of the commands listed in
section 6.5 of the SMBus 3.0 specification. These can be used to
generate an HTML file with all the transactions expanded.

```console
$ cd $REPO_TOP/util
$ ./i2csvg.py i2csvg/smbus/*.txt > out.html
```

Alternatively, these can all be converted to individual svg files (for
example for inclusion in documents) with the `--multiout` command.
The output filename matches the input filename with the extension
replaced with `.svg`. Note that if the `--text` or `--debug` flags
are given then the output will be HTML and the extension will be
`.html`.

```console
$ cd $REPO_TOP/util
$ ls i2csvg/smbus
01-Quick.txt        04-WriteWord.txt    07-BlockRead.txt       10-Write32.txt
02-SendByte.txt     05-ReadByte.txt     07-BlockWrite.txt      11-Read32.txt
03-ReceiveByte.txt  05-ReadWord.txt     08-BlockWrRdPCall.txt  12-Write64.txt
04-WriteByte.txt    06-ProcessCall.txt  09-HostNotify.txt      13-Read64.txt
$ ./i2csvg.py --multiout i2csvg/smbus/*.txt
$ ls i2csvg/smbus
01-Quick.svg        04-WriteWord.svg    07-BlockRead.svg       10-Write32.svg
01-Quick.txt        04-WriteWord.txt    07-BlockRead.txt       10-Write32.txt
02-SendByte.svg     05-ReadByte.svg     07-BlockWrite.svg      11-Read32.svg
02-SendByte.txt     05-ReadByte.txt     07-BlockWrite.txt      11-Read32.txt
03-ReceiveByte.svg  05-ReadWord.svg     08-BlockWrRdPCall.svg  12-Write64.svg
03-ReceiveByte.txt  05-ReadWord.txt     08-BlockWrRdPCall.txt  12-Write64.txt
04-WriteByte.svg    06-ProcessCall.svg  09-HostNotify.svg      13-Read64.svg
04-WriteByte.txt    06-ProcessCall.txt  09-HostNotify.txt      13-Read64.txt
```

### Example use in Debugging

The examples directory contains example output from a microcontroller
using the I2C interface. Mixed in to the other debug output are lines
produced when writes are done to the I2C FIFO. These lines are
prefixed by `I2CF:` Prior to a transaction a title line starting with
`T` is produced. This output can be processed to give a simple text
representation:

```console
$ cd $REPO_TOP/util
$ ./i2csvg.py --nosvg --text --fifodata --prefix=I2CF: i2csvg/examples/traceout.txt
T read sensor
S.... 0x40
.PR.. 0x1
T fix value
S.... 0x41
..... 0x22
.P... 0x33
```

Or the output can be converted into pictures for display in a browser:

```console
$ cd $REPO_TOP/util
$ ./i2csvg.py --text --fifodata --prefix=I2CF: i2csvg/examples/traceout.txt > out.html
```
