/*----------------------------------------------------------------------*/ /* tclanalyzer.c --- The command-line commands to control the analyzer */ /* window. */ /* */ /* Written by Tim Edwards January 2005 */ /* */ /*----------------------------------------------------------------------*/ #define _GNU_SOURCE #include #include #include #include #include #include "globals.h" #include "ana.h" #include "ana_glob.h" #include "graphics.h" #include "units.h" extern Tcl_Interp *irsiminterp; extern char **targv; extern int targc; extern int lookup(); extern Trptr get_trace(); extern void WritePSfile(); extern void SetTimeLeft(), SetTimeRight(); extern void TraceValue(), TraceInput(), TraceBits(), RemoveTrace(); extern void UpdateWinRemove(), GetNameLen(); extern void MoveToTimeValue(), ChangeTraceBase(), SetCursor(); extern void MoveCursorToTime(), MoveDeltaToTime(), MoveToT(); extern void MoveTraces(), SelectTrace(); extern int ValidTime(); extern int psBanner, psLegend, psTimes, psOutline; extern int max_name_len, autoScroll; /*------------------------------------------------------*/ /* The original Analyzer was driven by Xt callbacks, so */ /* there is no command syntax for it. We create one */ /* here. */ /*------------------------------------------------------*/ /*------------------------------------------------------*/ /* base [trace] [value] */ /*------------------------------------------------------*/ int tclirsim_base() { int varg = 2, idx; Trptr trace = selectedTrace; char *bptr; static char *baseTypes[] = { "none", "binary", "quartile", "octal", "hexidecimal", "decimal", "signed" }; static char *baseOptions[] = { "get", "set", NULL }; enum baseopt { BASE_GET, BASE_SET }; if (targc == 1) { lprintf(stderr, "Usage: base get [trace]\n"); lprintf(stderr, "Usage: base set [trace] type\n"); return 0; } idx = lookup(targv[1], baseOptions, FALSE); if (idx < 0) return -1; /* If there are 3 arguments, the second one should */ /* be a vector or node. Otherwise, trace is set to */ /* NULL, and ChangeTraceBase will use the */ /* currently selected trace, if there is one. */ if (((idx == BASE_GET) && (targc == 3)) || ((idx == BASE_SET) && (targc == 4))) { varg = 3; trace = get_trace(targv[2]); if (trace == NULL) { lprintf(stderr, "No trace named \"%s\"!\n", targv[2]); return -1; } } if (idx == BASE_GET) { Tcl_SetResult(irsiminterp, baseTypes[trace->bdigit], 0); } else if (targc <= varg) { lprintf(stderr, "Trace types are: binary, decimal, octal, or hexidecimal.\n"); lprintf(stderr, "Trace type may begin with \"u\" to make it unsigned.\n"); return -1; } else { bptr = targv[varg]; switch (*bptr) { case 'b': case 'd': case 'o': case 'h': case 'x': case 's': ChangeTraceBase(trace, bptr); break; default: lprintf(stderr, "Unknown/unhandled numeric base.\n"); return -1; } } return 0; } /*------------------------------------------------------*/ /* marker [set|move|delta] */ /*------------------------------------------------------*/ int tclirsim_marker() { float rtime; TimeType time; /* TimeType is "Ulong" in ana.h */ Trptr t; int idx, which, argst; double dt; static char *markerOptions[] = { "get", "move", "set", "off", NULL }; enum markeropt { MARKER_GET, MARKER_MOVE, MARKER_SET, MARKER_OFF }; if (targc == 1) { lprintf(stderr, "Usage: marker [1|2]