BankedArray.cc (10919:80069a602c83) BankedArray.cc (10978:436d5dde4bb7)
1/*
2 * Copyright (c) 2012 Advanced Micro Devices, Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 44 unchanged lines hidden (view full) ---

53{
54 if (accessLatency == 0)
55 return true;
56
57 unsigned int bank = mapIndexToBank(idx);
58 assert(bank < banks);
59
60 if (busyBanks[bank].endAccess >= curTick()) {
1/*
2 * Copyright (c) 2012 Advanced Micro Devices, Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 44 unchanged lines hidden (view full) ---

53{
54 if (accessLatency == 0)
55 return true;
56
57 unsigned int bank = mapIndexToBank(idx);
58 assert(bank < banks);
59
60 if (busyBanks[bank].endAccess >= curTick()) {
61 if (!(busyBanks[bank].startAccess == curTick() &&
62 busyBanks[bank].idx == idx)) {
63 return false;
61 return false;
62 }
63
64 return true;
65}
66
67void
68BankedArray::reserve(int64 idx)
69{
70 if (accessLatency == 0)
71 return;
72
73 unsigned int bank = mapIndexToBank(idx);
74 assert(bank < banks);
75
76 if(busyBanks[bank].endAccess >= curTick()) {
77 if (busyBanks[bank].startAccess == curTick() &&
78 busyBanks[bank].idx == idx) {
79 // this is the same reservation (can happen when
80 // e.g., reserve the same resource for read and write)
81 return; // OK
64 } else {
82 } else {
65 // We tried to allocate resources twice
66 // in the same cycle for the same addr
67 return true;
83 panic("BankedArray reservation error");
68 }
69 }
70
71 busyBanks[bank].idx = idx;
72 busyBanks[bank].startAccess = curTick();
73 busyBanks[bank].endAccess = curTick() +
74 (accessLatency-1) * m_ruby_system->clockPeriod();
84 }
85 }
86
87 busyBanks[bank].idx = idx;
88 busyBanks[bank].startAccess = curTick();
89 busyBanks[bank].endAccess = curTick() +
90 (accessLatency-1) * m_ruby_system->clockPeriod();
75
76 return true;
77}
78
79unsigned int
80BankedArray::mapIndexToBank(int64 idx)
81{
82 if (banks == 1) {
83 return 0;
84 }
85 return idx % banks;
86}
91}
92
93unsigned int
94BankedArray::mapIndexToBank(int64 idx)
95{
96 if (banks == 1) {
97 return 0;
98 }
99 return idx % banks;
100}