53a54
> import ticks
635,636d635
< ticks_per_sec = None
<
640,669c639
< # convert a floting-point # of ticks to integer, and warn if rounding
< # discards too much precision
< def tick_check(float_ticks):
< if float_ticks == 0:
< return 0
< int_ticks = int(round(float_ticks))
< err = (float_ticks - int_ticks) / float_ticks
< if err > frequency_tolerance:
< print >> sys.stderr, "Warning: rounding error > tolerance"
< print >> sys.stderr, " %f rounded to %d" % (float_ticks, int_ticks)
< #raise ValueError
< return int_ticks
<
< def getLatency(value):
< if isinstance(value, Latency) or isinstance(value, Clock):
< return value.value
< elif isinstance(value, Frequency) or isinstance(value, RootClock):
< return 1 / value.value
< elif isinstance(value, str):
< try:
< return convert.toLatency(value)
< except ValueError:
< try:
< return 1 / convert.toFrequency(value)
< except ValueError:
< pass # fall through
< raise ValueError, "Invalid Frequency/Latency value '%s'" % value
<
<
< class Latency(NumericParamValue):
---
> class TickParamValue(NumericParamValue):
673a644,645
>
> class Latency(TickParamValue):
675c647,658
< self.value = getLatency(value)
---
> if isinstance(value, (Latency, Clock)):
> self.ticks = value.ticks
> self.value = value.value
> elif isinstance(value, Frequency):
> self.ticks = value.ticks
> self.value = 1.0 / value.value
> elif value.endswith('t'):
> self.ticks = True
> self.value = int(value[:-1])
> else:
> self.ticks = False
> self.value = convert.toLatency(value)
686c669,672
< return str(tick_check(self.value * ticks_per_sec))
---
> if self.ticks or self.value == 0:
> return '%d' % self.value
> else:
> return '%d' % (ticks.fromSeconds(self.value))
688,692c674
< class Frequency(NumericParamValue):
< cxx_type = 'Tick'
< cxx_predecls = ['#include "sim/host.hh"']
< swig_predecls = ['%import "python/m5/swig/stdint.i"\n' +
< '%import "sim/host.hh"']
---
> class Frequency(TickParamValue):
694c676,687
< self.value = 1 / getLatency(value)
---
> if isinstance(value, (Latency, Clock)):
> if value.value == 0:
> self.value = 0
> else:
> self.value = 1.0 / value.value
> self.ticks = value.ticks
> elif isinstance(value, Frequency):
> self.value = value.value
> self.ticks = value.ticks
> else:
> self.ticks = False
> self.value = convert.toFrequency(value)
703c696
< # convert frequency to ticks per period
---
> # convert latency to ticks
705c698,701
< return self.period.ini_str()
---
> if self.ticks or self.value == 0:
> return '%d' % self.value
> else:
> return '%d' % (ticks.fromSeconds(1.0 / self.value))
707,727d702
< # Just like Frequency, except ini_str() is absolute # of ticks per sec (Hz).
< # We can't inherit from Frequency because we don't want it to be directly
< # assignable to a regular Frequency parameter.
< class RootClock(ParamValue):
< cxx_type = 'Tick'
< cxx_predecls = ['#include "sim/host.hh"']
< swig_predecls = ['%import "python/m5/swig/stdint.i"\n' +
< '%import "sim/host.hh"']
< def __init__(self, value):
< self.value = 1 / getLatency(value)
<
< def __getattr__(self, attr):
< if attr == 'frequency':
< return Frequency(self)
< if attr in ('latency', 'period'):
< return Latency(self)
< raise AttributeError, "Frequency object has no attribute '%s'" % attr
<
< def ini_str(self):
< return str(tick_check(self.value))
<
737c712,723
< self.value = getLatency(value)
---
> if isinstance(value, (Latency, Clock)):
> self.ticks = value.ticks
> self.value = value.value
> elif isinstance(value, Frequency):
> self.ticks = value.ticks
> self.value = 1.0 / value.value
> elif value.endswith('t'):
> self.ticks = True
> self.value = int(value[:-1])
> else:
> self.ticks = False
> self.value = convert.anyToLatency(value)
752c738,739
< val = convert.toNetworkBandwidth(value) / 8.0
---
> # convert to bits per second
> val = convert.toNetworkBandwidth(value)
759c746,749
< return '%f' % (ticks_per_sec / float(self))
---
> # convert to seconds per byte
> value = 8.0 / float(self)
> # convert to ticks per byte
> return '%f' % (ticks.fromSeconds(value))
763a754
> # we want the number of ticks per byte of data
771c762,765
< return '%f' % (ticks_per_sec / float(self))
---
> # convert to seconds per byte
> value = 1.0 / float(self)
> # convert to ticks per byte
> return '%f' % (ticks.fromSeconds(value))
1026c1020
< 'Latency', 'Frequency', 'RootClock', 'Clock',
---
> 'Latency', 'Frequency', 'Clock',