Source code for elasticai.creator.vhdl.auto_wire_protocols.port_definitions
from typing import Optional, cast
from elasticai.creator.vhdl.code_generation.addressable import calculate_address_width
from elasticai.creator.vhdl.code_generation.vhdl_ports import (
template_string_for_port_definition,
)
from elasticai.creator.vhdl.design import std_signals as _signals
from elasticai.creator.vhdl.design.ports import Port
[docs]
def create_port(
x_width: int,
y_width: int,
*,
x_count: int = 0,
y_count: int = 0,
x_address_width: Optional[int] = None,
y_address_width: Optional[int] = None,
) -> Port:
if (
x_count == 0
and y_count == 0
and x_address_width is None
and y_address_width is None
):
return create_port_for_bufferless_design(x_width, y_width)
else:
return create_port_for_buffered_design(
x_width=x_width,
y_width=y_width,
x_count=x_count,
y_count=y_count,
x_address_width=x_address_width,
y_address_width=y_address_width,
)
[docs]
def create_port_for_bufferless_design(x_width: int, y_width: int) -> Port:
in_signals = [
_signals.enable(),
_signals.clock(),
_signals.x(x_width),
]
out_signals = [
_signals.y(y_width),
]
return Port(incoming=in_signals, outgoing=out_signals)
[docs]
def create_port_for_buffered_design(
*,
x_width: int,
y_width: int,
x_count: int,
y_count: int,
x_address_width: Optional[int] = None,
y_address_width: Optional[int] = None,
) -> Port:
if not (
(not (x_address_width is None and y_address_width is None))
or (x_count > 0 or y_count > 0)
):
raise ValueError(
"Provide either (x_count, y_count) or (x_address_width, y_address_width)"
)
if x_address_width is None and y_address_width is None:
x_address_width = calculate_address_width(x_count)
y_address_width = calculate_address_width(y_count)
in_signals = [
_signals.enable(),
_signals.clock(),
_signals.x(x_width),
_signals.y_address(cast(int, y_address_width)),
]
out_signals = [
_signals.done(),
_signals.y(y_width),
_signals.x_address(cast(int, x_address_width)),
]
return Port(incoming=in_signals, outgoing=out_signals)
[docs]
def port_definition_template_for_buffered_design() -> list[str]:
return template_string_for_port_definition(
create_port_for_buffered_design(x_width=1, y_width=1, x_count=1, y_count=1)
)
[docs]
def port_definition_template_for_bufferless_design() -> list[str]:
return template_string_for_port_definition(create_port_for_bufferless_design(1, 1))