Source code for elasticai.creator_plugins.lutron.lutron

from itertools import chain
from typing import TypeAlias

from elasticai.creator.ir2vhdl import Code, Implementation, type_handler

from .language import Port, VHDLEntity

IOPair: TypeAlias = tuple[tuple[int, ...], tuple[int, ...]]


[docs] @type_handler def lutron(lowered: Implementation) -> Code: def _iter(): name: str = lowered.name d_in_width: int = lowered.attributes["input_size"] d_out_width: int = lowered.attributes["output_size"] io_pairs: tuple[IOPair, ...] = lowered.attributes["truth_table"] entity = VHDLEntity( name=name, port=Port( inputs=dict(d_in=logic_vector(d_in_width)), outputs=dict(d_out=logic_vector(d_out_width)), ), generics=dict(), ) def rtl(): yield from [ f"architecture rtl of {name} is", "begin", " process (d_in) is", " begin", " case d_in is", ] for _in, out in io_pairs: yield f' when b"{_in}" => d_out <= b"{out}";' yield " when others => d_out <= (others => 'X');" yield from (" end case;", " end process;", "end architecture;") yield from chain(entity.generate_entity(), ("",), rtl()) return lowered.name, _iter()
[docs] def logic_vector(width: int | str) -> str: return f"std_logic_vector({width} - 1 downto 0)"