Mar 17, 2017 14:10
Понял я как поддержать аппаратно вложенные транзакции.
Транзакции по вложенности образуют дерево. Есть такое кодирование деревьев (слегка избыточное) - узел кодируется отрезком, ребра дерева от наиболее облегающего отрезка в наибольшим подотрезкам.
Таким образом идентификатор транзакции, который добавляется к каждой строке кеш-памяти, состоит из трех чисел - начала, конца и длины (для оптимизации) отрезка. При поиске ячейки выбираются все с заданным адресом в основной памяти, началом отрезка меньше начала у текущей транзакции и с большим, чем у текущей, концом (тоже отрезка). Строки, попадающие под такое условие выставляют на шину специального компаратора свою длину (можно ее сразу вычислить, но не держать же сумматор на каждую ячейку), а он возвращает самую маленькую величину (устройство сложное, но не запредельно). А потом ячейка сравнивает минимальную длину с длиной своего идентификационного отрезка.
Осталось все это закодировать на Clash...
hard,
fp,
haskell