Source code for elasticai.creator_plugins.combinatorial.vhdl_nodes.shift_register

import warnings

from elasticai.creator.ir2vhdl import Instance, VhdlNode

from .clocked_combinatorial import ClockedInstance
from .node_factory import (
    InstanceFactoryForCombinatorial,
)


[docs] @InstanceFactoryForCombinatorial.register def shift_register(node: VhdlNode) -> Instance: return ShiftRegister(node)
def _check_input_output_shape_compatibility(node): input_shape, output_shape = node.input_shape, node.output_shape if output_shape.size() % input_shape.size() != 0: raise ValueError( "Found incompatible input output shapes for shift_register. Total output size has to be an integer multiple of total input size, but found output={output} and input={input}.".format( output=output_shape, input=input_shape ) ) if output_shape.depth != input_shape.depth: warnings.warn( 'Detected mismatching input output shapes for shift_register for node "{}". Width of output and input shape should usually be equal, but found output={} and input={}.'.format( node.name, output_shape, input_shape ), stacklevel=3, )
[docs] class ShiftRegister(ClockedInstance): _logic_signals_with_default_suffix = ("valid_in", "valid_out") def __init__(self, node: VhdlNode): _check_input_output_shape_compatibility(node) data_width = node.input_shape.size() output_width = node.output_shape.size() if output_width % data_width != 0: raise ValueError( "incompatible shapes input: {} output: {}".format( node.input_shape, node.output_shape ) ) num_points = output_width // data_width super().__init__( node, input_width=data_width, output_width=output_width, generic_map={"data_width": data_width, "num_points": num_points}, )