Source code for elasticai.creator_plugins.combinatorial.unclocked_combinatorial
from collections.abc import Callable, Iterator, Sequence
from itertools import chain
from elasticai.creator.ir2vhdl import Implementation, type_handler
from .combinatorial import wrap_in_architecture
from .language import Port, VHDLEntity
from .vhdl_nodes.node_factory import InstanceFactoryForCombinatorial
from .wiring import connect_data_signals
[docs]
@type_handler
def unclocked_combinatorial(impl: Implementation) -> tuple[str, Sequence[str]]:
def _generate_entity(name, input_size, output_size):
entity = VHDLEntity(
name=name,
port=Port(
inputs=dict(
d_in=f"std_logic_vector({input_size} - 1 downto 0)",
),
outputs=dict(
d_out=f"std_logic_vector({output_size} - 1 downto 0)",
),
),
generics=dict(),
)
return entity
return impl.name, combinatorial(impl, _generate_entity)
[docs]
def combinatorial(
impl: Implementation, entity_fn: Callable[[str, int, int], VHDLEntity]
) -> Iterator[str]:
name = impl.name
nodes = []
for n in impl.nodes.values():
nodes.append(InstanceFactoryForCombinatorial(n))
nodes = tuple(nodes)
instances = tuple(n for n in nodes if n.name not in ("input", "output"))
input = impl.nodes["input"]
output = impl.nodes["output"]
connections = tuple((e.src, e.dst, e.src_dst_indices) for e in impl.edges.values())
signal_defs = (line for n in nodes for line in n.define_signals())
instantiations = (line for n in instances for line in n.instantiate())
data_signal_connections = connect_data_signals(connections)
entity = entity_fn(name, input.input_shape.size(), output.output_shape.size())
yield from entity.generate_entity()
yield ""
declarations = signal_defs
implementation = chain(data_signal_connections, instantiations)
yield from wrap_in_architecture(name, declarations, implementation)