Update to latest FST API files from GTKWave

This commit is contained in:
Cary R 2013-08-09 11:31:21 -07:00
parent 71552b7d1a
commit 638300045c
2 changed files with 296 additions and 22 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2009-2012 Tony Bybell. * Copyright (c) 2009-2013 Tony Bybell.
* *
* Permission is hereby granted, free of charge, to any person obtaining a * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@ -62,6 +62,7 @@ void **JenkinsIns(void *base_i, unsigned char *mem, uint32_t length, uint32_t ha
#define FST_WRITER_STR "fstWriter" #define FST_WRITER_STR "fstWriter"
#define FST_ID_NAM_SIZ (512) #define FST_ID_NAM_SIZ (512)
#define FST_ID_NAM_ATTR_SIZ (65536+4096)
#define FST_DOUBLE_ENDTEST (2.7182818284590452354) #define FST_DOUBLE_ENDTEST (2.7182818284590452354)
#define FST_HDR_SIM_VERSION_SIZE (128) #define FST_HDR_SIM_VERSION_SIZE (128)
#define FST_HDR_DATE_SIZE (120) #define FST_HDR_DATE_SIZE (120)
@ -1842,6 +1843,38 @@ if(xc && vers)
} }
static void fstWriterSetAttrGeneric(void *ctx, const char *comm, int typ)
{
struct fstWriterContext *xc = (struct fstWriterContext *)ctx;
if(xc && comm)
{
char *s = strdup(comm);
char *sf = s;
while(*s)
{
if((*s == '\n') || (*s == '\r')) *s = ' ';
s++;
}
fstWriterSetAttrBegin(xc, FST_AT_MISC, typ, sf, 0);
free(sf);
}
}
void fstWriterSetComment(void *ctx, const char *comm)
{
fstWriterSetAttrGeneric(ctx, comm, FST_MT_COMMENT);
}
void fstWriterSetEnvVar(void *ctx, const char *envvar)
{
fstWriterSetAttrGeneric(ctx, envvar, FST_MT_ENVVAR);
}
void fstWriterSetTimescale(void *ctx, int ts) void fstWriterSetTimescale(void *ctx, int ts)
{ {
struct fstWriterContext *xc = (struct fstWriterContext *)ctx; struct fstWriterContext *xc = (struct fstWriterContext *)ctx;
@ -1987,7 +2020,7 @@ return(0);
/* /*
* writer scope/var creation * writer attr/scope/var creation
*/ */
fstHandle fstWriterCreateVar(void *ctx, enum fstVarType vt, enum fstVarDir vd, fstHandle fstWriterCreateVar(void *ctx, enum fstVarType vt, enum fstVarDir vd,
uint32_t len, const char *nam, fstHandle aliasHandle) uint32_t len, const char *nam, fstHandle aliasHandle)
@ -2009,7 +2042,7 @@ if(xc && nam)
fputc(0, xc->hier_handle); fputc(0, xc->hier_handle);
xc->hier_file_len += (nlen+3); xc->hier_file_len += (nlen+3);
if((vt == FST_VT_VCD_REAL) || (vt == FST_VT_VCD_REAL_PARAMETER) || (vt == FST_VT_VCD_REALTIME)) if((vt == FST_VT_VCD_REAL) || (vt == FST_VT_VCD_REAL_PARAMETER) || (vt == FST_VT_VCD_REALTIME) || (vt == FST_VT_SV_SHORTREAL))
{ {
is_real = 1; is_real = 1;
len = 8; /* recast number of bytes to that of what a double is */ len = 8; /* recast number of bytes to that of what a double is */
@ -2093,7 +2126,7 @@ void fstWriterSetScope(void *ctx, enum fstScopeType scopetype,
{ {
struct fstWriterContext *xc = (struct fstWriterContext *)ctx; struct fstWriterContext *xc = (struct fstWriterContext *)ctx;
if(xc && scopename) if(xc)
{ {
fputc(FST_ST_VCD_SCOPE, xc->hier_handle); fputc(FST_ST_VCD_SCOPE, xc->hier_handle);
if((scopetype < FST_ST_VCD_MODULE) || (scopetype > FST_ST_MAX)) { scopetype = FST_ST_VCD_MODULE; } if((scopetype < FST_ST_VCD_MODULE) || (scopetype > FST_ST_MAX)) { scopetype = FST_ST_VCD_MODULE; }
@ -2129,6 +2162,54 @@ if(xc)
} }
void fstWriterSetAttrBegin(void *ctx, enum fstAttrType attrtype, int subtype,
const char *attrname, uint64_t arg)
{
struct fstWriterContext *xc = (struct fstWriterContext *)ctx;
if(xc)
{
fputc(FST_ST_GEN_ATTRBEGIN, xc->hier_handle);
if((attrtype < FST_AT_MISC) || (attrtype > FST_AT_MAX)) { attrtype = FST_AT_MISC; subtype = FST_MT_UNKNOWN; }
fputc(attrtype, xc->hier_handle);
switch(attrtype)
{
case FST_AT_ARRAY: if((subtype < FST_AR_NONE) || (subtype > FST_AR_MAX)) subtype = FST_AR_NONE; break;
case FST_AT_ENUM: if((subtype < FST_EV_SV_INTEGER) || (subtype > FST_EV_MAX)) subtype = FST_EV_SV_INTEGER; break;
case FST_AT_PACK: if((subtype < FST_PT_NONE) || (subtype > FST_PT_MAX)) subtype = FST_PT_NONE; break;
case FST_AT_MISC:
default: break;
}
fputc(subtype, xc->hier_handle);
fprintf(xc->hier_handle, "%s%c",
attrname ? attrname : "", 0);
if(attrname)
{
xc->hier_file_len += strlen(attrname);
}
xc->hier_file_len += 4; /* FST_ST_GEN_ATTRBEGIN + type + subtype + string terminating zero */
xc->hier_file_len += fstWriterVarint(xc->hier_handle, arg);
}
}
void fstWriterSetAttrEnd(void *ctx)
{
struct fstWriterContext *xc = (struct fstWriterContext *)ctx;
if(xc)
{
fputc(FST_ST_GEN_ATTREND, xc->hier_handle);
xc->hier_file_len++;
}
}
/* /*
* value and time change emission * value and time change emission
*/ */
@ -2387,14 +2468,33 @@ static const char *vartypes[] = {
"event", "integer", "parameter", "real", "real_parameter", "event", "integer", "parameter", "real", "real_parameter",
"reg", "supply0", "supply1", "time", "tri", "reg", "supply0", "supply1", "time", "tri",
"triand", "trior", "trireg", "tri0", "tri1", "triand", "trior", "trireg", "tri0", "tri1",
"wand", "wire", "wor", "port", "array", "realtime", "wand", "wire", "wor", "port", "sparray", "realtime",
"string" "string",
"bit", "logic", "int", "shortint", "longint", "byte", "enum", "shortreal"
}; };
static const char *modtypes[] = { static const char *modtypes[] = {
"module", "task", "function", "begin", "fork", "generate" "module", "task", "function", "begin", "fork", "generate", "struct", "union", "class", "interface", "package", "program"
}; };
static const char *attrtypes[] = {
"misc", "array", "enum", "class"
};
static const char *arraytypes[] = {
"none", "unpacked", "packed", "sparse"
};
static const char *enumvaluetypes[] = {
"integer", "bit", "logic", "int", "shortint", "longint", "byte",
"unsigned_integer", "unsigned_bit", "unsigned_logic", "unsigned_int", "unsigned_shortint", "unsigned_longint", "unsigned_byte"
};
static const char *packtypes[] = {
"none", "unpacked", "packed", "tagged_packed"
};
struct fstCurrHier struct fstCurrHier
{ {
struct fstCurrHier *prev; struct fstCurrHier *prev;
@ -3083,6 +3183,25 @@ if(!(isfeof=feof(xc->fh)))
xc->hier.htyp = FST_HT_UPSCOPE; xc->hier.htyp = FST_HT_UPSCOPE;
break; break;
case FST_ST_GEN_ATTRBEGIN:
xc->hier.htyp = FST_HT_ATTRBEGIN;
xc->hier.u.attr.typ = fgetc(xc->fh);
xc->hier.u.attr.subtype = fgetc(xc->fh);
xc->hier.u.attr.name = pnt = xc->str_scope_nam;
while((ch = fgetc(xc->fh)))
{
*(pnt++) = ch;
}; /* scopename */
*pnt = 0;
xc->hier.u.attr.name_length = pnt - xc->hier.u.scope.name;
xc->hier.u.attr.arg = fstReaderVarint64(xc->fh);
break;
case FST_ST_GEN_ATTREND:
xc->hier.htyp = FST_HT_ATTREND;
break;
case FST_VT_VCD_EVENT: case FST_VT_VCD_EVENT:
case FST_VT_VCD_INTEGER: case FST_VT_VCD_INTEGER:
case FST_VT_VCD_PARAMETER: case FST_VT_VCD_PARAMETER:
@ -3102,9 +3221,17 @@ if(!(isfeof=feof(xc->fh)))
case FST_VT_VCD_WIRE: case FST_VT_VCD_WIRE:
case FST_VT_VCD_WOR: case FST_VT_VCD_WOR:
case FST_VT_VCD_PORT: case FST_VT_VCD_PORT:
case FST_VT_VCD_ARRAY: case FST_VT_VCD_SPARRAY:
case FST_VT_VCD_REALTIME: case FST_VT_VCD_REALTIME:
case FST_VT_GEN_STRING: case FST_VT_GEN_STRING:
case FST_VT_SV_BIT:
case FST_VT_SV_LOGIC:
case FST_VT_SV_INT:
case FST_VT_SV_SHORTINT:
case FST_VT_SV_LONGINT:
case FST_VT_SV_BYTE:
case FST_VT_SV_ENUM:
case FST_VT_SV_SHORTREAL:
xc->hier.htyp = FST_HT_VAR; xc->hier.htyp = FST_HT_VAR;
xc->hier.u.var.typ = tag; xc->hier.u.var.typ = tag;
@ -3152,13 +3279,15 @@ return(!isfeof ? &xc->hier : NULL);
int fstReaderProcessHier(void *ctx, FILE *fv) int fstReaderProcessHier(void *ctx, FILE *fv)
{ {
struct fstReaderContext *xc = (struct fstReaderContext *)ctx; struct fstReaderContext *xc = (struct fstReaderContext *)ctx;
char str[FST_ID_NAM_SIZ+1]; char *str;
char *pnt; char *pnt;
int ch, scopetype; int ch, scopetype;
int vartype; int vartype;
uint32_t len, alias; uint32_t len, alias;
/* uint32_t maxvalpos=0; */ /* uint32_t maxvalpos=0; */
int num_signal_dyn = 65536; int num_signal_dyn = 65536;
int attrtype, subtype;
uint64_t attrarg;
if(!xc) return(0); if(!xc) return(0);
@ -3172,6 +3301,8 @@ if(!xc->fh)
} }
} }
str = malloc(FST_ID_NAM_ATTR_SIZ+1);
if(fv) if(fv)
{ {
char time_dimension[2] = {0, 0}; char time_dimension[2] = {0, 0};
@ -3237,6 +3368,7 @@ while(!feof(xc->fh))
{ {
case FST_ST_VCD_SCOPE: case FST_ST_VCD_SCOPE:
scopetype = fgetc(xc->fh); scopetype = fgetc(xc->fh);
if((scopetype < FST_ST_VCD_MIN) || (scopetype > FST_ST_MAX)) scopetype = FST_ST_VCD_MODULE;
pnt = str; pnt = str;
while((ch = fgetc(xc->fh))) while((ch = fgetc(xc->fh)))
{ {
@ -3252,6 +3384,50 @@ while(!feof(xc->fh))
if(fv) fprintf(fv, "$upscope $end\n"); if(fv) fprintf(fv, "$upscope $end\n");
break; break;
case FST_ST_GEN_ATTRBEGIN:
attrtype = fgetc(xc->fh);
subtype = fgetc(xc->fh);
pnt = str;
while((ch = fgetc(xc->fh)))
{
*(pnt++) = ch;
}; /* attrname */
*pnt = 0;
attrarg = fstReaderVarint64(xc->fh);
if(fv)
{
switch(attrtype)
{
case FST_AT_ARRAY: if((subtype < FST_AR_NONE) || (subtype > FST_AR_MAX)) subtype = FST_AR_NONE;
fprintf(fv, "$attrbegin %s %s %s %"PRId64" $end\n", attrtypes[attrtype], arraytypes[subtype], str, attrarg);
break;
case FST_AT_ENUM: if((subtype < FST_EV_SV_INTEGER) || (subtype > FST_EV_MAX)) subtype = FST_EV_SV_INTEGER;
fprintf(fv, "$attrbegin %s %s %s %"PRId64" $end\n", attrtypes[attrtype], enumvaluetypes[subtype], str, attrarg);
break;
case FST_AT_PACK: if((subtype < FST_PT_NONE) || (subtype > FST_PT_MAX)) subtype = FST_PT_NONE;
fprintf(fv, "$attrbegin %s %s %s %"PRId64" $end\n", attrtypes[attrtype], packtypes[subtype], str, attrarg);
break;
case FST_AT_MISC:
default: attrtype = FST_AT_MISC;
if(subtype == FST_MT_COMMENT)
{
fprintf(fv, "$comment\n\t%s\n$end\n", str);
}
else
{
fprintf(fv, "$attrbegin %s %02x %s %"PRId64" $end\n", attrtypes[attrtype], subtype, str, attrarg);
}
break;
}
}
break;
case FST_ST_GEN_ATTREND:
if(fv) fprintf(fv, "$attrend $end\n");
break;
case FST_VT_VCD_EVENT: case FST_VT_VCD_EVENT:
case FST_VT_VCD_INTEGER: case FST_VT_VCD_INTEGER:
case FST_VT_VCD_PARAMETER: case FST_VT_VCD_PARAMETER:
@ -3271,9 +3447,17 @@ while(!feof(xc->fh))
case FST_VT_VCD_WIRE: case FST_VT_VCD_WIRE:
case FST_VT_VCD_WOR: case FST_VT_VCD_WOR:
case FST_VT_VCD_PORT: case FST_VT_VCD_PORT:
case FST_VT_VCD_ARRAY: case FST_VT_VCD_SPARRAY:
case FST_VT_VCD_REALTIME: case FST_VT_VCD_REALTIME:
case FST_VT_GEN_STRING: case FST_VT_GEN_STRING:
case FST_VT_SV_BIT:
case FST_VT_SV_LOGIC:
case FST_VT_SV_INT:
case FST_VT_SV_SHORTINT:
case FST_VT_SV_LONGINT:
case FST_VT_SV_BYTE:
case FST_VT_SV_ENUM:
case FST_VT_SV_SHORTREAL:
vartype = tag; vartype = tag;
/* vardir = */ fgetc(xc->fh); /* unused in VCD reader, but need to advance read pointer */ /* vardir = */ fgetc(xc->fh); /* unused in VCD reader, but need to advance read pointer */
pnt = str; pnt = str;
@ -3302,9 +3486,9 @@ while(!feof(xc->fh))
xc->longest_signal_value_len = len; xc->longest_signal_value_len = len;
} }
if((vartype == FST_VT_VCD_REAL) || (vartype == FST_VT_VCD_REAL_PARAMETER) || (vartype == FST_VT_VCD_REALTIME)) if((vartype == FST_VT_VCD_REAL) || (vartype == FST_VT_VCD_REAL_PARAMETER) || (vartype == FST_VT_VCD_REALTIME) || (vartype == FST_VT_SV_SHORTREAL))
{ {
len = 64; len = (vartype != FST_VT_SV_SHORTREAL) ? 64 : 32;
xc->signal_typs[xc->maxhandle] = FST_VT_VCD_REAL; xc->signal_typs[xc->maxhandle] = FST_VT_VCD_REAL;
} }
if(fv) if(fv)
@ -3316,9 +3500,9 @@ while(!feof(xc->fh))
} }
else else
{ {
if((vartype == FST_VT_VCD_REAL) || (vartype == FST_VT_VCD_REAL_PARAMETER) || (vartype == FST_VT_VCD_REALTIME)) if((vartype == FST_VT_VCD_REAL) || (vartype == FST_VT_VCD_REAL_PARAMETER) || (vartype == FST_VT_VCD_REALTIME) || (vartype == FST_VT_SV_SHORTREAL))
{ {
len = 64; len = (vartype != FST_VT_SV_SHORTREAL) ? 64 : 32;
xc->signal_typs[xc->maxhandle] = FST_VT_VCD_REAL; xc->signal_typs[xc->maxhandle] = FST_VT_VCD_REAL;
} }
if(fv) if(fv)
@ -3348,6 +3532,7 @@ xc->temp_signal_value_buf = malloc(xc->longest_signal_value_len + 1);
xc->var_count = xc->maxhandle + xc->num_alias; xc->var_count = xc->maxhandle + xc->num_alias;
free(str);
return(1); return(1);
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2009-2012 Tony Bybell. * Copyright (c) 2009-2013 Tony Bybell.
* *
* Permission is hereby granted, free of charge, to any person obtaining a * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@ -60,9 +60,18 @@ enum fstScopeType {
FST_ST_VCD_BEGIN = 3, FST_ST_VCD_BEGIN = 3,
FST_ST_VCD_FORK = 4, FST_ST_VCD_FORK = 4,
FST_ST_VCD_GENERATE = 5, FST_ST_VCD_GENERATE = 5,
FST_ST_VCD_MAX = 5, FST_ST_VCD_STRUCT = 6,
FST_ST_VCD_UNION = 7,
FST_ST_VCD_CLASS = 8,
FST_ST_VCD_INTERFACE = 9,
FST_ST_VCD_PACKAGE = 10,
FST_ST_VCD_PROGRAM = 11,
FST_ST_VCD_MAX = 11,
FST_ST_MAX = 5, FST_ST_MAX = 11,
FST_ST_GEN_ATTRBEGIN = 252,
FST_ST_GEN_ATTREND = 253,
FST_ST_VCD_SCOPE = 254, FST_ST_VCD_SCOPE = 254,
FST_ST_VCD_UPSCOPE = 255 FST_ST_VCD_UPSCOPE = 255
@ -89,11 +98,21 @@ enum fstVarType {
FST_VT_VCD_WIRE = 16, FST_VT_VCD_WIRE = 16,
FST_VT_VCD_WOR = 17, FST_VT_VCD_WOR = 17,
FST_VT_VCD_PORT = 18, FST_VT_VCD_PORT = 18,
FST_VT_VCD_ARRAY = 19, /* used to define the rownum (index) port on the array */ FST_VT_VCD_SPARRAY = 19, /* used to define the rownum (index) port for a sparse array */
FST_VT_VCD_REALTIME = 20, FST_VT_VCD_REALTIME = 20,
FST_VT_GEN_STRING = 21, /* generic string type (max len is defined dynamically via fstWriterEmitVariableLengthValueChange) */ FST_VT_GEN_STRING = 21, /* generic string type (max len is defined dynamically via fstWriterEmitVariableLengthValueChange) */
FST_VT_VCD_MAX = 21 /* end of VCD datatypes */ FST_VT_SV_BIT = 22,
FST_VT_SV_LOGIC = 23,
FST_VT_SV_INT = 24, /* declare as 31:0 */
FST_VT_SV_SHORTINT = 25, /* declare as 15:0 */
FST_VT_SV_LONGINT = 26, /* declare as 63:0 */
FST_VT_SV_BYTE = 27, /* declare as 7:0 */
FST_VT_SV_ENUM = 28, /* declare as appropriate type range */
FST_VT_SV_SHORTREAL = 29, /* declare and emit same as FST_VT_VCD_REAL */
FST_VT_VCD_MAX = 29 /* end of VCD datatypes */
}; };
enum fstVarDir { enum fstVarDir {
@ -109,8 +128,64 @@ enum fstHierType {
FST_HT_SCOPE = 0, FST_HT_SCOPE = 0,
FST_HT_UPSCOPE = 1, FST_HT_UPSCOPE = 1,
FST_HT_VAR = 2, FST_HT_VAR = 2,
FST_HT_ATTRBEGIN = 3,
FST_HT_ATTREND = 4,
FST_HT_MAX = 2 FST_HT_MAX = 4
};
enum fstAttrType {
FST_AT_MISC = 0,
FST_AT_ARRAY = 1,
FST_AT_ENUM = 2,
FST_AT_PACK = 3,
FST_AT_MAX = 3
};
enum fstMiscType {
FST_MT_COMMENT = 0, /* self-contained: does not need matching FST_HT_ATTREND, use fstWriterSetComment() to emit */
FST_MT_ENVVAR = 1, /* self-contained: does not need matching FST_HT_ATTREND, use fstWriterSetEnvVar() to emit */
FST_MT_UNKNOWN = 2,
FST_MT_MAX = 2
};
enum fstArrayType {
FST_AR_NONE = 0,
FST_AR_UNPACKED = 1,
FST_AR_PACKED = 2,
FST_AR_SPARSE = 3,
FST_AR_MAX = 3
};
enum fstEnumValueType {
FST_EV_SV_INTEGER = 0,
FST_EV_SV_BIT = 1,
FST_EV_SV_LOGIC = 2,
FST_EV_SV_INT = 3,
FST_EV_SV_SHORTINT = 4,
FST_EV_SV_LONGINT = 5,
FST_EV_SV_BYTE = 6,
FST_EV_SV_UNSIGNED_INTEGER = 7,
FST_EV_SV_UNSIGNED_BIT = 8,
FST_EV_SV_UNSIGNED_LOGIC = 9,
FST_EV_SV_UNSIGNED_INT = 10,
FST_EV_SV_UNSIGNED_SHORTINT = 11,
FST_EV_SV_UNSIGNED_LONGINT = 12,
FST_EV_SV_UNSIGNED_BYTE = 13,
FST_EV_MAX = 13
};
enum fstPackType {
FST_PT_NONE = 0,
FST_PT_UNPACKED = 1,
FST_PT_PACKED = 2,
FST_PT_TAGGED_PACKED = 3,
FST_PT_MAX = 3
}; };
struct fstHier struct fstHier
@ -120,7 +195,7 @@ unsigned char htyp;
union { union {
/* if htyp == FST_HT_SCOPE */ /* if htyp == FST_HT_SCOPE */
struct fstHierScope { struct fstHierScope {
unsigned char typ; /* FST_ST_VCD_MODULE ... FST_ST_VCD_FORK */ unsigned char typ; /* FST_ST_VCD_MODULE ... FST_ST_VCD_PROGRAM */
const char *name; const char *name;
const char *component; const char *component;
uint32_t name_length; /* strlen(u.scope.name) */ uint32_t name_length; /* strlen(u.scope.name) */
@ -129,7 +204,7 @@ union {
/* if htyp == FST_HT_VAR */ /* if htyp == FST_HT_VAR */
struct fstHierVar { struct fstHierVar {
unsigned char typ; /* FST_VT_VCD_EVENT ... FST_VT_VCD_REALTIME */ unsigned char typ; /* FST_VT_VCD_EVENT ... FST_VT_GEN_STRING */
unsigned char direction; /* FST_VD_IMPLICIT ... FST_VD_INOUT */ unsigned char direction; /* FST_VD_IMPLICIT ... FST_VD_INOUT */
const char *name; const char *name;
uint32_t length; uint32_t length;
@ -137,6 +212,15 @@ union {
uint32_t name_length; /* strlen(u.var.name) */ uint32_t name_length; /* strlen(u.var.name) */
unsigned is_alias : 1; unsigned is_alias : 1;
} var; } var;
/* if htyp == FST_HT_ATTRBEGIN */
struct fstHierAttr {
unsigned char typ; /* FST_AT_MISC ... FST_AT_PACK */
unsigned char subtype; /* from fstMiscType, fstArrayType, fstEnumValueType, fstPackType */
const char *name;
uint64_t arg; /* number of array elements, struct members, or some other payload (possibly ignored) */
uint32_t name_length; /* strlen(u.attr.name) */
} attr;
} u; } u;
}; };
@ -158,6 +242,8 @@ void *fstWriterCreate(const char *nam, int use_compressed_hier);
void fstWriterClose(void *ctx); void fstWriterClose(void *ctx);
void fstWriterSetDate(void *ctx, const char *dat); void fstWriterSetDate(void *ctx, const char *dat);
void fstWriterSetVersion(void *ctx, const char *vers); void fstWriterSetVersion(void *ctx, const char *vers);
void fstWriterSetComment(void *ctx, const char *comm);
void fstWriterSetEnvVar(void *ctx, const char *envvar);
void fstWriterSetTimescale(void *ctx, int ts); void fstWriterSetTimescale(void *ctx, int ts);
void fstWriterSetTimescaleFromString(void *ctx, const char *s); void fstWriterSetTimescaleFromString(void *ctx, const char *s);
void fstWriterSetTimezero(void *ctx, int64_t tim); void fstWriterSetTimezero(void *ctx, int64_t tim);
@ -169,6 +255,9 @@ void fstWriterEmitVariableLengthValueChange(void *ctx, fstHandle handle, const v
void fstWriterEmitDumpActive(void *ctx, int enable); void fstWriterEmitDumpActive(void *ctx, int enable);
void fstWriterEmitTimeChange(void *ctx, uint64_t tim); void fstWriterEmitTimeChange(void *ctx, uint64_t tim);
void fstWriterFlushContext(void *ctx); void fstWriterFlushContext(void *ctx);
void fstWriterSetAttrBegin(void *ctx, enum fstAttrType attrtype, int subtype,
const char *attrname, uint64_t arg);
void fstWriterSetAttrEnd(void *ctx);
/* /*
* reader functions * reader functions