OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_61/] [or1ksim/] [tick/] [tick.c] - Diff between revs 802 and 884

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 802 Rev 884
Line 40... Line 40...
unsigned long ttcr;
unsigned long ttcr;
 
 
/* TT Mode Register */
/* TT Mode Register */
unsigned long ttmr;
unsigned long ttmr;
 
 
extern int cycles;
 
 
 
/* Reset. It initializes TTCR register. */
/* Reset. It initializes TTCR register. */
void tick_reset()
void tick_reset()
{
{
  if (config.sim.verbose)
  if (config.sim.verbose)
    printf("Resetting Tick Timer.\n");
    printf("Resetting Tick Timer.\n");
Line 60... Line 58...
  /*debug (7, "tick_job%i, param %i\n", param, mode);*/
  /*debug (7, "tick_job%i, param %i\n", param, mode);*/
  switch (mode) {
  switch (mode) {
  case 1:
  case 1:
    if (!param) {
    if (!param) {
      sprs[SPR_TTCR] = ttcr = 0;
      sprs[SPR_TTCR] = ttcr = 0;
      cycles_start = cycles - ttcr;
      cycles_start = runtime.sim.cycles - ttcr;
      SCHED_ADD(tick_job, 0, cycles + (ttmr & SPR_TTMR_PERIOD) - ttcr);
      SCHED_ADD(tick_job, 0, runtime.sim.cycles + (ttmr & SPR_TTMR_PERIOD) - ttcr);
    }
    }
  case 2:
  case 2:
    if (ttmr & SPR_TTMR_IE) {
    if (ttmr & SPR_TTMR_IE) {
      setsprbits(SPR_TTMR, SPR_TTMR_IP, 1);
      setsprbits(SPR_TTMR, SPR_TTMR_IP, 1);
      if ((mfspr(SPR_SR) & SPR_SR_TEE) == SPR_SR_TEE)
      if ((mfspr(SPR_SR) & SPR_SR_TEE) == SPR_SR_TEE)
        except_handle(EXCEPT_TICK, mfspr(SPR_EEAR_BASE));
        except_handle(EXCEPT_TICK, mfspr(SPR_EEAR_BASE));
      else
      else
        /* If TEE is currently not set we have to pend tick exception
        /* If TEE is currently not set we have to pend tick exception
           by rescheduling. */
           by rescheduling. */
        SCHED_ADD(tick_job, 1, cycles + 1);
        SCHED_ADD(tick_job, 1, runtime.sim.cycles + 1);
    }
    }
    break;
    break;
  }
  }
}
}
 
 
Line 87... Line 85...
  ttcr = value;
  ttcr = value;
  /* Remove previous if it exists */
  /* Remove previous if it exists */
  SCHED_FIND_REMOVE(tick_job, 0);
  SCHED_FIND_REMOVE(tick_job, 0);
  SCHED_FIND_REMOVE(tick_job, 1);
  SCHED_FIND_REMOVE(tick_job, 1);
  if (mode == 1 || mode == 2) {
  if (mode == 1 || mode == 2) {
    SCHED_ADD(tick_job, 0, cycles + (ttmr & SPR_TTMR_PERIOD) - ttcr);
    SCHED_ADD(tick_job, 0, runtime.sim.cycles + (ttmr & SPR_TTMR_PERIOD) - ttcr);
    cycles_start = cycles - ttcr;
    cycles_start = runtime.sim.cycles - ttcr;
  }
  }
}
}
 
 
void spr_write_ttmr (unsigned long value)
void spr_write_ttmr (unsigned long value)
{
{
Line 104... Line 102...
      SCHED_FIND_REMOVE(tick_job, 0);
      SCHED_FIND_REMOVE(tick_job, 0);
      SCHED_FIND_REMOVE(tick_job, 1);
      SCHED_FIND_REMOVE(tick_job, 1);
      break;
      break;
    case 1:    /* Timer should auto restart */
    case 1:    /* Timer should auto restart */
      sprs[SPR_TTCR] = ttcr = 0;
      sprs[SPR_TTCR] = ttcr = 0;
      cycles_start = cycles;
      cycles_start = runtime.sim.cycles;
      SCHED_FIND_REMOVE(tick_job, 0);
      SCHED_FIND_REMOVE(tick_job, 0);
      SCHED_FIND_REMOVE(tick_job, 1);
      SCHED_FIND_REMOVE(tick_job, 1);
      SCHED_ADD(tick_job, 0, cycles + (ttmr & SPR_TTMR_PERIOD) - ttcr);
      SCHED_ADD(tick_job, 0, runtime.sim.cycles + (ttmr & SPR_TTMR_PERIOD) - ttcr);
      break;
      break;
    case 2:    /* Stop the timer when match */
    case 2:    /* Stop the timer when match */
      SCHED_FIND_REMOVE(tick_job, 0);
      SCHED_FIND_REMOVE(tick_job, 0);
      SCHED_FIND_REMOVE(tick_job, 1);
      SCHED_FIND_REMOVE(tick_job, 1);
      break;
      break;
Line 120... Line 118...
  }
  }
}
}
 
 
unsigned long spr_read_ttcr ()
unsigned long spr_read_ttcr ()
{
{
  /*debug (7, "ttcr ---- %08x\n", cycles - cycles_start);*/
  /*debug (7, "ttcr ---- %08x\n", runtime.sim.cycles - cycles_start);*/
  return cycles - cycles_start;
  return runtime.sim.cycles - cycles_start;
}
}
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.