Превратите функцию в предварительно вычисленную таблицу поиска, не проходя через шаблон Haskell - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть следующая функция CLaSH:

toBCD :: Word8 -> Vec 3 Word8
toBCD x =
    x `div` 100 :>
    (x `div` 10) `mod` 10 :>
    x `mod` 10 :>
    Nil

Конечно, полученный модуль HDL является несинтезируемым из-за деления на непостоянную степень 2 константы.Поэтому я хотел бы вместо этого превратить его в справочную таблицу и поместить в небольшое асинхронное ПЗУ.

Сначала я подумал, что будет достаточно сделать что-то вроде

romBCD :: Word8 -> Vec 3 Word8
romBCD = asyncROM $ fmap toBCD $ iterate d256 succ 0

но полученный VHDL по-прежнему содержит формулу для вычисления toBCD 0, toBCD 1 и т. д. Вместо этого я хотел бы получить VHDL, который просто содержит предварительно вычисленные значения в таблице 256x24.

Один обходной путь Ifound должен был вычислить содержимое romBCD с помощью Template Haskell:

romBCD = asyncRom $(listToVecTH $ fmap toBCD [minBound .. maxBound])

, но тогда вынуждает определение romBCD находиться в отдельном модуле, чем toBCD.

...