Source code for elasticai.creator.vhdl.shared_designs.rom.design

from elasticai.creator.file_generation.savable import Path
from elasticai.creator.file_generation.template import (
    InProjectTemplate,
    module_to_package,
)
from elasticai.creator.vhdl.code_generation.addressable import calculate_address_width
from elasticai.creator.vhdl.code_generation.code_abstractions import (
    to_vhdl_binary_string,
)


[docs] class Rom: def __init__( self, name: str, data_width: int, values_as_integers: list[int] ) -> None: self._name = name self._data_width = data_width number_of_values = len(values_as_integers) self._address_width = self._bits_required_to_address_n_values(number_of_values) self._values = [ to_vhdl_binary_string(x, self._data_width) for x in self._append_zeros_to_fill_addressable_memory(values_as_integers) ]
[docs] def save_to(self, destination: Path): template = InProjectTemplate( file_name="rom.tpl.vhd", package=module_to_package(self.__module__), parameters=dict( rom_value=self._rom_values(), rom_addr_bitwidth=str(self._address_width), rom_data_bitwidth=str(self._data_width), name=self._name, resource_option="auto", ), ) destination.as_file(".vhd").write(template)
def _rom_values(self) -> str: return ",".join(self._values) def _append_zeros_to_fill_addressable_memory(self, values: list[int]) -> list[int]: missing_number_of_zeros = 2**self._address_width - len(values) return values + _zeros(missing_number_of_zeros) def _bits_required_to_address_n_values(self, n: int) -> int: return calculate_address_width(n)
def _zeros(n: int) -> list[int]: return [0] * n