--- /dev/null
+.\" -*-nroff-*-
+.de VS
+.sp 1
+.RS
+.nf
+.ft B
+..
+.de VE
+.ft R
+.fi
+.RE
+.sp 1
+..
+.de hP
+.IP
+.ft B
+\h'-\w'\\$1\ 'u'\\$1\ \c
+.ft P
+..
+.ie t \{\
+. ds o \(bu
+. de VP
+. sp .4v
+..
+\}
+.el \{\
+. ds o o
+. de VP
+. sp
+..
+\}
+..
+.TH tvec-output 3 "11 March 2024" "Straylight/Edgeware" "mLib utilities library"
+.SH NAME
+tvec-output \- test vector framework output driver interface
+.\" @tvec_strlevel
+.
+.SH SYNOPSIS
+.nf
+.B "#include <mLib/tvec.h>"
+.PP
+.ta 2n
+.B "enum {"
+.B " TVOUT_LOSE,"
+.B " TVOUT_SKIP,"
+.B " TVOUT_WIN,"
+.B " TVOUT_XFAIL,"
+.B " TVOUT_LIMIT"
+.B "};"
+.PP
+.B "struct tvec_state {"
+.B " unsigned f;"
+.B " const struct tvec_test *test;"
+.B " unsigned curr[TVOUT_LIMIT], all[TVOUT_LIMIT], grps[TVOUT_LIMIT];"
+.B " ..."
+.B "};"
+.B "#define TVSF_ERROR ..."
+.PP
+.B "struct tvec_output {"
+.B " const struct tvec_outops *ops;"
+.B "};"
+.B "struct tvec_outops {"
+.BI " void (*" bsession ")(struct tvec_output *" o ", struct tvec_state *" tv );
+.BI " int (*" esession ")(struct tvec_output *" o );
+.BI " void (*" bgroup ")(struct tvec_output *" o );
+.ta 2n +\w'\fBvoid (*\,\fIskipgroup\/\fB)('u
+.BI " void (*" skipgroup ")(struct tvec_output *" o ,
+.BI " const char *" excuse ", void *" ap );
+.BI " void (*" egroup ")(struct tvec_output *" o );
+.BI " void (*" btest ")(struct tvec_output *" o );
+.ta 2n +\w'\fBvoid (*\,\fIskip\/\fB)('u
+.BI " void (*" skip ")(struct tvec_output *" o ,
+.BI " const char *" excuse ", void *" ap );
+.ta 2n +\w'\fBvoid (*\,\fIfail\/\fB)('u
+.BI " void (*" fail ")(struct tvec_output *" o ,
+.BI " const char *" fail ", void *" ap );
+.ta 2n +\w'\fBvoid (*\,\fIdumpreg\/\fB)('u
+.BI " void (*" dumpreg ")(struct tvec_output *" o ,
+.BI " unsigned " disp ", const union tvec_regval *" rv ,
+.BI " const struct tvec_regdef *" rd );
+.BI " void (*" etest ")(struct tvec_output *" o ", unsigned " outcome );
+.ta 2n +\w'\fBvoid (*\,\fIbbench\/\fB)('u
+.BI " void (*" bbench ")(struct tvec_output *" o ,
+.BI " const char *" ident ", unsigned " unit );
+.ta 2n +\w'\fBvoid (*\,\fIebench\/\fB)('u
+.BI " void (*" ebench ")(struct tvec_output *" o ,
+.BI " const char *" ident ", unsigned " unit ,
+.BI " const struct bench_timing *" tm );
+.ta 2n +\w'\fBvoid (*\,\fIreport\/\fB)('u
+.BI " void (*" report ")(struct tvec_output *" o ", unsigned " level ,
+.BI " const char *" msg ", va_list *" ap );
+.BI " void (*" level ")(struct tvec_output *" o );
+.B "};"
+.PP
+.B "const char *tvec_strlevel(unsigned " level );
+.fi