astra-sim-alibabacloud/astra-sim/system/QueueLevelHandler.cc (60 lines of code) (raw):
/******************************************************************************
This source code is licensed under the MIT license found in the
LICENSE file in the root directory of this source tree.
*******************************************************************************/
#include "QueueLevelHandler.hh"
namespace AstraSim {
QueueLevelHandler::QueueLevelHandler(
int level,
int start,
int end,
AstraNetworkAPI::BackendType backend) {
for (int i = start; i <= end; i++) {
queues.push_back(i); // queues means that it has [start, end) queues
}
allocator = 0;
first_allocator = 0;
last_allocator = queues.size() / 2;
this->level = level;
this->backend = backend;
}
std::pair<int, RingTopology::Direction> QueueLevelHandler::get_next_queue_id() {
RingTopology::Direction dir;
if ((backend != AstraNetworkAPI::BackendType::Garnet || level > 0) &&
queues.size() > 1 && allocator >= (queues.size() / 2)) {
dir = RingTopology::Direction::Anticlockwise;
} else {
dir = RingTopology::Direction::Clockwise;
}
if (queues.size() == 0) {
return std::make_pair(-1, dir);
}
int tmp = queues[allocator++];
if (allocator == queues.size()) {
allocator = 0;
}
return std::make_pair(tmp, dir);
}
std::pair<int, RingTopology::Direction> QueueLevelHandler::
get_next_queue_id_first() {
RingTopology::Direction dir;
dir = RingTopology::Direction::Clockwise;
if (queues.size() == 0) {
return std::make_pair(-1, dir);
}
int tmp = queues[first_allocator++];
if (first_allocator == queues.size() / 2) {
first_allocator = 0;
}
return std::make_pair(tmp, dir);
}
std::pair<int, RingTopology::Direction> QueueLevelHandler::
get_next_queue_id_last() {
RingTopology::Direction dir;
dir = RingTopology::Direction::Anticlockwise;
if (queues.size() == 0) {
return std::make_pair(-1, dir);
}
int tmp = queues[last_allocator++];
if (last_allocator == queues.size()) {
last_allocator = queues.size() / 2;
}
return std::make_pair(tmp, dir);
}
} // namespace AstraSim