/*
 * funcs.c
 * a few pieces for a running simulator.
 * [eichin:19880401.0606EST]
 */

#include <msimdecl.h>

disp_func(dep)
     Generics dep;
{
  printf("disp_func(0x%08x)[hi=%d,low=%d]:\n", dep, LOGIC_HI, LOGIC_LOW);
  
  while(dep->tag.CTL != END)
    {
      Wire awire = dep->data.GENERIC.genwire;
      Wire swire = awire;
      ASSERT(dep->tag.GENERIC == GENWIRE);
      
      find_item(awire, WIRE, NOW);
      
      if(awire->data.WIRE.now[0].tag.EVENT == END)
	{
	  printf("\twire 0x%08x=END\n",
		 swire);
	}
      else
	{
	  printf("\twire 0x%08x=[%d]\t@time=%4d\n",
		 swire,
		 (awire->data.WIRE.now)->tag.EVENT,
		 (awire->data.WIRE.now)->data.EVENT);
	}
      INC(dep);
    }
}
#define dit(fn,val)  printf("%s(0x%08x):\n", fn, val);
#define den(fn,val)  printf("%s(0x%08x) end.\n", fn, val);

disp_event(ev)
     Event ev;
{
  if(ev[0].tag.CTL == END)
    {
      printf("\t\t\tevent: END\n");
    }
  else
    {
      printf("\t\t\tevent: time:%4d, value:%4d\n",
	     ev[0].data.EVENT,
	     ev[0].tag.EVENT);
    }
}

disp_timeline(tl)
     Timeline tl;
{
  dit("\t\tdisp_timeline", tl);

  START(tl);
  while(tl[0].tag.CTL != END)
    {
      disp_event(tl);
      INC(tl);
    }
  den("\t\tdisp_timeline", tl);
}

disp_deps(dp)
     Deps dp;
{
  Generics thedep;
  dit("\t\tdeps", dp);

  find_item(dp, DEPS, DEPSLIST);
  thedep = dp[0].data.DEPS.generics;
  
  START(thedep);
  while(thedep[0].tag.CTL != END)
    {
      switch(thedep[0].tag.GENERIC)
	{
	case GENINT:
	  printf("\t\t\tint=[%d]\n", thedep[0].data.GENERIC.genint);
	  break;
	case GENTIME:
	  printf("\t\t\ttime=[%d]\n", thedep[0].data.GENERIC.gentime);
	  break;
	case GENSTRING:
	  printf("\t\t\tstring=[%s]\n", thedep[0].data.GENERIC.genstring);
	  break;
	case GENFUNC:
	  dit("\t\t\tfunc", thedep[0].data.GENERIC.genfunc);
	  break;
	case GENWIRE:
	  {
	    Wire thewire = thedep[0].data.GENERIC.genwire;
	    find_item(thewire, WIRE, SYMNAME);
	    printf("\t\t\tdepends on [%s]\n",
		   thewire[0].data.WIRE.symname);
	  }
	  break;
	}
      INC(thedep);
    }
  den("\t\tdeps", dp);
}

disp_wire(wr)
     Wire wr;
{
  dit("\tdisp_wire", wr);

  START(wr);
  while(wr[0].tag.CTL != END)
    {
      switch(wr[0].tag.CTL)
	{
	case SYMNAME:
	  printf("\tSYMNAME:[%s]\n", wr[0].data.WIRE.symname);
	  break;
	case DEPENDS:
	  disp_deps(wr[0].data.WIRE.deps);
	  break;
	case NOW:
	  dit("\t\tnow", wr[0].data.WIRE.now);
	  disp_event(wr[0].data.WIRE.now);
	  break;
	case THEN:
	  dit("\t\tthen", wr[0].data.WIRE.then);
	  disp_event(wr[0].data.WIRE.then);
	  break;
	case FUTURE:
	  disp_timeline(wr[0].data.WIRE.future);
	  break;
	case PAST:
	  disp_timeline(wr[0].data.WIRE.past);
	  break;
	case CONTENTION:
	  dit("\t\tcontends", wr[0].data.WIRE.contention);
	  break;
	}
      INC(wr);
    }
  
  den("\tdisp_wire", wr);
}
disp_wirelist(wl)
     Wirelist wl;
{
  dit("disp_wirelist", wl);
  
  START(wl);
  while(wl[0].tag.CTL != END)
    {
      switch(wl[0].tag.WIRELIST)
	{
	case WIRE:
	  disp_wire(wl[0].data.WIRELIST.wire);
	  break;
	case WFILE:
	  printf("WFILE: time = %4d\n",
		 wl[0].data.WIRELIST.wfile->next);
	  break;
	}
      INC(wl);
    }
  den("disp_wirelist", wl);
}

