Task #3670
closed
Генерация кода для модели MMU
Added by Alexander Kamkin about 12 years ago.
Updated over 9 years ago.
Assignee:
Andrei Tatarnikov
Published in build:
2.2.15
Description
По описанию MMU (включающем [пока] только структуру буферов) сгенерировать набор классов на Java.
Часть классов является библиотечной, часть - генерируется по описанию.
Основной библиотечный класс - частично ассоциативный буфер (Buffer). Скорее всего, это generic-класс, параметризируемый классом строки. Класс строки генерируется по описанию (<ИмяБуфера>Line) и, по всей видимости, является наследником базовой строки (Line), агрегирующей объект класса RawData и объект класса (интерфейса) Policy. В библиотеке есть также несколько предопределенных (final-классов) стратегий замещения (FIFO, LRU, PLRU). Примерный интерфейс всех классов мы обсуждали.
Два этапа:
- Библиотека моделирования (+ unit-тесты)
- Трансляция описания в Java
Предлагаю для разминки заняться стратегиями вытеснения данных.
Базовый класс Policy. Его наследниками являются FIFO, LRU и PLRU.
Набросок класса Policy:
public abstract class Policy
{
/// @param size
the size of the buffer (associativity).
public Policy(int size)
{
this.size = size;
}
/// @return the size of the buffer (associativity).
public int getSize()
{
return size;
}
/// The method is called every time when the i-th item is accessed.
/// @param i
the item being accessed.
public abstract void onHit(int i);
/// The method is called when there is a miss.
/// @return the item to be replaced.
public abstract int onMiss();
}
Набросок класса FIFO:
public final class FIFO extends Policy
{
private LinkedList<Integer> fifo = new LinkedList<Integer>();
public FIFO(int size)
{
super(size);
for(int i = 0; i < size; i++)
{ fifo.add(i); }
}
@Override
public void onHit(int i)
{
for(int j = 0; j < fifo.size(); j++)
{
if(fifo.get(j) == i)
{
fifo.remove(j);
fifo.add(i);
return;
}
}
assert false;
}
@Override
public int onMiss()
{
return fifo.peek();
}
}
P.S. Не забыть про комментарии и тесты.
- Политика PLRU.
- Классы Address (абстрактный класс), Line (абстрактный класс), Set (набор из N лайнов), Buffer (набор из M сетов).
- Политика замещения должна быть в классе Set.
- В классе Line есть ссылка на объект RawData (спросить у Андрея) требуемого размера (параметр конструктора).
- У класса Buffer есть абстрактный метод
int index(Address address)
, возвращающий номер сета в буфере.
- Класс Line является часным случаем буфера, поэтому наследуется от класса Buffer
- Класс Set является частным случаем буфера, поэтому наследуется от класса Buffer.
- У класса Line и Set есть метод
bool match(Address address)
. У лайна этот метод абстрактный, у сета - реализуется через match'и входящих в него лайнов, у полноценного буфера путем getSet(index(address)).match(address)
.
Buffer, Line, Set и Policy добавлены.
В Set добавлены вызовы методов политики.
Что должен возвращать метод getVictim?
- Assignee changed from Taya Sergeeva to Alexander Kamkin
getVictim - это то же самое, что метод onMiss(). То есть он не нужен.
- Assignee changed from Alexander Kamkin to Taya Sergeeva
Нужно написать комментарии к коду (см. пример оформления кода у Андрея + TAB -> Spaces).
Следующий шаг - генерация кода по описанию подсистемы управления памятью.
- Генерация конкретного класса <ИмяБуфера>Address - наследника Address.
- Генерация конкретного класса <ИмяБуфера>Line - наследника Line.
- Генерация конкретного класса <ИмяБуфера>Set - наследника Set.
- Генерация конкретного класса <ИмяБуфера>Buffer - наследника Buffer.
Подкорректированы файлы классов.
Удален цикл вызова Setом Bufferа, и наоборот.
Тест-кейс на Buffer работает.
Tree walker в процессе.
Сделан TreeWalker. И вся грамматика компилируется.
- Subject changed from Генерация кода для модели MMU to [mmu] Генерация кода для модели MMU
- Target version set to 2.3
- Subject changed from [mmu] Генерация кода для модели MMU to Генерация кода для модели MMU
- Category set to 48
- Assignee changed from Taya Sergeeva to Andrei Tatarnikov
- Priority changed from Normal to High
- Status changed from New to Open
- % Done changed from 0 to 50
- % Done changed from 50 to 70
- Status changed from Open to Resolved
- % Done changed from 70 to 100
- Status changed from Resolved to Closed
- Published in build set to 2.2.15
Also available in: Atom
PDF