diff options
author | Andreas Sandberg <andreas@sandberg.pp.se> | 2013-03-12 18:41:29 +0100 |
---|---|---|
committer | Andreas Sandberg <andreas@sandberg.pp.se> | 2013-03-12 18:41:29 +0100 |
commit | fc6f569d94fe35a8c9a833e64dd82d6978dfb1cf (patch) | |
tree | 7580d9f5151676525033d91804af876038ec8a98 | |
parent | 53a05978054ac9bb718e419a48371bd10c720267 (diff) | |
download | gem5-fc6f569d94fe35a8c9a833e64dd82d6978dfb1cf.tar.xz |
cpu: Fix state transition bug in the traffic generator
The traffic generator used to incorrectly determine the next state in
when state 0 had a non-zero probability. Due to the way the next
transition was determined, state 0 could never be entered other than
as an initial state. This changeset updates the transitition() method
to correctly handle such cases and cases where the transition matrix
is a 1x1 matrix.
-rw-r--r-- | src/cpu/testers/traffic_gen/traffic_gen.cc | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/cpu/testers/traffic_gen/traffic_gen.cc b/src/cpu/testers/traffic_gen/traffic_gen.cc index d9d040858..292fe54e0 100644 --- a/src/cpu/testers/traffic_gen/traffic_gen.cc +++ b/src/cpu/testers/traffic_gen/traffic_gen.cc @@ -324,13 +324,14 @@ TrafficGen::StateGraph::transition() // determine next state double p = random_mt.gen_real1(); assert(currState < transitionMatrix.size()); - double cumulative = transitionMatrix[currState][0]; - size_t i = 1; - while (p < cumulative && i != transitionMatrix[currState].size()) { + double cumulative = 0.0; + size_t i = 0; + do { cumulative += transitionMatrix[currState][i]; ++i; - } - enterState(i); + } while (cumulative < p && i < transitionMatrix[currState].size()); + + enterState(i - 1); } void |