/*
 * pout.c
 * process output routines for compatibility with the lisp simulator.
 * [eichin:19880403.0756EST]
 */


#include <msimdecl.h>
#define FUNCTION output_func
#define OUTPUT(A) make_tracer(output_func, A)
#define DONE

#include <string.h>

char *wirename(wr)
     Wire wr;
{
  START(wr);
  find_item(wr, WIRE, SYMNAME);
  return(wr[0].data.WIRE.symname);
}

Wire find_named_wire(nam, wl)
     char *nam;
     Wirelist wl;
{
  START(wl);
  while(wl[0].tag.CTL != END)
    {
      if(wl[0].tag.WIRELIST == WIRE)
	{
	  Wire awr, bwr;
	  char *str;
	  
	  bwr = awr = wl[0].data.WIRELIST.wire;
	  find_item(awr, WIRE, SYMNAME);
	  str = awr[0].data.WIRE.symname;
	  if(!strcmp(nam, str))
	    {
	      return(bwr);
	    }
	}
      INC(wl);
    }
  return(NULL);
}

struct _mappings {
  Event_tag	state;
  char		*label;
} outmap[] = {
  LOGIC_HI,	"1",
  LOGIC_LOW,	"0", 
  EARLY_HI,	"1",
  EARLY_LOW,	"0",
  TRISTATE,	"X",
  CONTENDING,	"C",
  UNDEFINED,	"U",
  0,		NULL,		/* end mark */
};

char *eventname(ev)
     Event_tag ev;
{
  struct _mappings *mp = outmap;

  do {
    if(ev == mp->state)
      return(mp->label);
  } while((++mp)->label);
  
  return("ERROR");
}

Event_tag named_event(nam)
     char *nam;
{
  struct _mappings *mp = outmap;
  do {
    if(!strncmp(nam, mp->label, strlen(mp->label)))
      {
	return(mp->state);
      }
  } while((++mp)->label);
  return(UNDEFINED);
}

output_func(dep)
     Generics dep;
{
  static Time lastglobal;
  Wire ww = dep[0].data.GENERIC.genwire;
  char *nwir = wirename(ww);
  char *neve;
  
  find_item(ww, WIRE, NOW);
  if(ww[0].data.WIRE.now[0].tag.CTL == END)
    {
      neve = "U";
    }
  else
    {
      neve = eventname(ww[0].data.WIRE.now[0].tag.EVENT);
    }
  
  if (globaltime != lastglobal)
    {
      printf("wait %d\n", globaltime - lastglobal);
      lastglobal = globaltime;
    }

  printf("%s %s\n", nwir, neve);
}

