package permute;
use europa_module_factory;
@ISA = qw(europa_module_factory);
use strict;

sub _width
{
  my $this = shift;
  return scalar @{$this->mapping()};
}

sub add_contents_to_module
{
  my $this = shift;
  my $module = $this->module();
  my $width = $this->_width();

  $module->add_contents(
    e_signal->new({
      name => 'a', width => $width,
    }),
    e_signal->new({
      name => 'x', width => $width,
    }),
  );
  my @mapping = @{$this->mapping()};
  for my $i (0 .. -1 + $width)
  {
    $module->add_contents(
      e_assign->new({
        lhs => "x\[$i\]",
        rhs => "a\[$mapping[$i]\]",
      }),
    );
  }
}

# Note: static method; can be called for constructing help text.
sub get_fields
{
  my $class = shift;

  my %fields = (
    mapping => {ref => [], },
  );

  return \%fields;
}

sub declare_ports
{
  my $this = shift;
  my $width = $this->_width();

  my %outputs = (
    x => {width => $width,},
  );

  my %inputs = (
    a => {width => $width,},
  );

  map {$inputs{$_}->{direction} = "input"} keys %inputs;
  map {$outputs{$_}->{direction} = "output"} keys %outputs;
  my %ports = (
    %inputs,
    %outputs,
  );

  return \%ports;
}

1;