import unittest
from permute import permute

from myhdl import Signal, delay, Simulation, intbv, concat

class TestPermute(unittest.TestCase):
  def testA(self):
    self.do_a_test(3, (0, 1, 2))
    self.do_a_test(4, (3, 2, 0, 1))
    self.do_a_test(5, (3, 2, 0, 1, 4))

  def do_a_test(self, width, mapping):
    def test(a, x, mapping):
      for i in range(2 ** len(a)):
        a.next = i
        yield delay(10)
        print "a:", a, "x:", x
        for j in range(len(mapping)):
          expected_value = 0;
          if (i & (1 << mapping[j])):
            expected_value = 1;
          self.assertEqual(x[j], expected_value)

    a = Signal(intbv(0)[width:])
    x = Signal(intbv(0)[width:])
    dut = permute(a, x, mapping)
    check = test(a, x, mapping)
    sim = Simulation(dut, check)
    sim.run(quiet=1)

unittest.main()