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

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_50/] [or1ksim/] [cuc/] [timings.c] - Diff between revs 879 and 883

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

Rev 879 Rev 883
Line 31... Line 31...
double cycle_duration;
double cycle_duration;
double max_bb_delay;
double max_bb_delay;
 
 
static cuc_timing_table *timing_table;
static cuc_timing_table *timing_table;
 
 
static double insn_time (cuc_insn *ii)
/* Returns instruction delay */
 
double insn_time (cuc_insn *ii)
{
{
  if (ii->opt[2] & OPT_CONST)
  if (ii->opt[2] & OPT_CONST)
    return timing_table[ii->index].delayi;
    return timing_table[ii->index].delayi;
  else return timing_table[ii->index].delay;
  else return timing_table[ii->index].delay;
}
}
 
 
 
/* Returns instruction size */
 
double insn_size (cuc_insn *ii)
 
{
 
  if (ii->opt[2] & OPT_CONST)
 
    return timing_table[ii->index].sizei;
 
  else return timing_table[ii->index].size;
 
}
 
 
 
/* Returns normal instruction size */
 
double ii_size (int index, int imm)
 
{
 
  if (imm) return timing_table[index].sizei;
 
  else return timing_table[index].size;
 
}
 
 
/* Returns dataflow tree height in cycles */
/* Returns dataflow tree height in cycles */
static double max_delay (cuc_func *f, int b)
static double max_delay (cuc_func *f, int b)
{
{
  double max_d = 0.;
  double max_d = 0.;
  double *d;
  double *d;
Line 136... Line 152...
  d = ceil (x / cycle_duration);
  d = ceil (x / cycle_duration);
  if (d < 1) d = 1;
  if (d < 1) d = 1;
  if (cut && x > cycle_duration) cut_tree (f, b, x / d);
  if (cut && x > cycle_duration) cut_tree (f, b, x / d);
 
 
  if (x / d > max_bb_delay) max_bb_delay = x / d;
  if (x / d > max_bb_delay) max_bb_delay = x / d;
 
 
  return memory_delay (f, b) + d;
  return memory_delay (f, b) + d;
}
}
 
 
/* Cuts the tree and marks registers */
/* Cuts the tree and marks registers */
void mark_cut (cuc_func *f)
void mark_cut (cuc_func *f)
Line 203... Line 220...
/* Analizes current version of design and places results into timings structure */
/* Analizes current version of design and places results into timings structure */
void analyse_timings (cuc_func *f, cuc_timings *timings)
void analyse_timings (cuc_func *f, cuc_timings *timings)
{
{
  long new_time = 0;
  long new_time = 0;
  double size = 0.;
  double size = 0.;
  int b;
  int b, i;
 
 
 
  /* Add time needed for mtspr/mfspr */
 
  for (i = 0; i < MAX_REGS; i++) if (f->used_regs[i]) new_time++;
 
  new_time++; /* always one mfspr at the end */
 
  new_time *= f->num_runs;
 
 
  max_bb_delay = 0.;
  max_bb_delay = 0.;
  for (b = 0; b < f->num_bb; b++) {
  for (b = 0; b < f->num_bb; b++) {
    new_time += new_bb_cycles (f, b, 0) * f->bb[b].cnt;
    new_time += new_bb_cycles (f, b, 0) * f->bb[b].cnt;
    size = size + bb_size (&f->bb[b]);
    size = size + bb_size (&f->bb[b]);

powered by: WebSVN 2.1.0

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