summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas@sandberg.pp.se>2013-03-12 18:41:29 +0100
committerAndreas Sandberg <andreas@sandberg.pp.se>2013-03-12 18:41:29 +0100
commitfc6f569d94fe35a8c9a833e64dd82d6978dfb1cf (patch)
tree7580d9f5151676525033d91804af876038ec8a98
parent53a05978054ac9bb718e419a48371bd10c720267 (diff)
downloadgem5-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.cc11
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