/*
 * process.h
 *
 * x-kernel v3.3
 *
 * Copyright (c) 1996,1993,1991,1990  Arizona Board of Regents
 */

#ifndef xsim_h
#define xsim_h

#include "xtime.h"

#define EIQ_FLAG  0x1
#define ERQ_FLAG  0x2
#define ESE_FLAG  0x4
#define EES_FLAG  0x8
#define ECI_FLAG  0x10
#define ESQ_FLAG  0x20
#define EFN_FLAG  0x40
#define EHT_FLAG  0x80
#define EAL_FLAG  0xff
#define SED_FLAG  0x1000
#define SL0_FLAG  0x2000
#define SL1_FLAG  0x4000
#define SL2_FLAG  0x8000
#define PKT_FLAG 0xc000
#define ROUTER_FLAG  0x9000
#define SPC_FLAG  0x10000
#define SAL_FLAG  0xff000
#define TET_FLAG  0x100000
#define TTR_FLAG  0x200000
#define TMG_FLAG  0x400000
#define TAL_FLAG  0xf00000
#define ALL_FLAGS 0xfffffff
#define NUM_FLAGS 20

struct xsimDbgTableStruct {
    char id[10];
    int  flag;
};

#ifdef DEFINE_VARS /* ------------------------------------------------ 1 */

#define SIM_CLOCK_MULT        16
/* Clock granularity in nanoseconds (between 1 and 1000) */
#define SIM_CLOCK_GRANULARITY 1000/SIM_CLOCK_MULT
#define SIM_CLOCK_POWER       4

unsigned long xsimCurrentTime = 0;	/* global clock in usecs */
unsigned long xsimCurrentTimeFine = 0;	/* global clock in finer granularity */
         int xsimTimeGranularity = 1;	/* in microseconds */
         int xsimDbgFlags = 0;

struct xsimDbgTableStruct  xsimDbgTable[NUM_FLAGS] = {
    {"EIQ", EIQ_FLAG}, {"ERQ", ERQ_FLAG}, {"ESE", ESE_FLAG},
    {"EES", EES_FLAG}, {"ECI", ECI_FLAG}, {"ESQ", ESQ_FLAG}, {"EFN", EFN_FLAG},
    {"EHT", EHT_FLAG}, {"EAL", EAL_FLAG}, 
    {"SED", SED_FLAG}, {"SL0", SL0_FLAG}, {"SL1", SL1_FLAG},
    {"SL2", SL2_FLAG}, {"SPC", SPC_FLAG}, {"SAL", SAL_FLAG}, {"SPK",PKT_FLAG},
    {"TET", TET_FLAG}, {"TTR", TTR_FLAG}, {"TMG", TMG_FLAG}, {"TAL", TAL_FLAG}
};

char  *xsimHelp[] = {
    "\nHelp for debugging xsim:\n",
    "  xsim  -xsimdbg  E:<Event codes>  S:<Simulator codes>  T:<Test codes>\n",
    "    where code strings are 2-letter, event specific codes\n",
    "         Event codes:",
    "           IQ  show event queue inserts",
    "           RQ  show event queue removals",
    "           SE  show stub executions",
    "           ES  show evSchedule calls",
    "           CI  show clock interupt handler execution",
    "           SQ  show full queue in IQ and RQ",
    "           FN  use function names when listing",
    "           AL  equivalent to all Event codes\n",
    "         Simulator codes:",
    "           ED  show ethd stuff",
    "           L0  show very detailed simulator stuff",
    "           L1  show detailed simulator stuff",
    "           L2  show coarse simulator stuff",
    "           PC  show packet collision stuff",
    "		PK show packet route",
    "           AL  equivalent to all Simulator codes\n",
    "         Test codes:",
    "           ET  show ethtest stuff",
    "           MG  show megtest stuff",
    "           TR  show traffic stuff",
    "           AL  equivalent to all Test codes\n",
    " Examples:     xsim -xsimdbg E:ESCIFN S:AL T:MG",
    "           or  xsim -xsimdbg E:ES,CI,FN S:AL T:MG",
    NULL
};

#else /* ! DEFINE_VARS  -------------------------------------------    */

extern unsigned long xsimCurrentTime;
extern          int xsimTimeGranularity;
extern int          xsimDbgFlags;
extern struct xsimDbgTableStruct xsimDbgTable[];

#endif /* DEFINE_VARS  --------------------------------------------- 1 */

/*#define XSIM_DEBUG*/

#ifdef XSIM_DEBUG
#define xsimDbg(flg,f) {if (xsimDbgFlags & flg) f;}
#define xsimShowQueue(flg) \
  { if ((xsimDbgFlags & flg) && (xsimDbgFlags & ESQ_FLAG)) showEventQueue();}
#else
#define xsimDbg(flg,f) 
#define xsimShowQueue(flg)
#endif

#endif /* xsim_h */


