/* fex17perm: by karttu, Jan 30 2005. (based on fex4perm.v written Jan 2 2005). Output an "one-based" permutation of {1..18} corresponding to a factorial expansion that is fed in the inputs f1 - f17. The result is given in d0 - out_d17, i.e. eighteen digits 1-18. For the algorithm used, see A060118. Should be used together with the module inc17fexb.v */ module fex17perm(input CLK, input input_valid, input f1, input [1:0] f2, // 0-2 input [1:0] f3, // 0-3 input [2:0] f4, // 0-4 input [2:0] f5, // 0-5 input [2:0] f6, // 0-6 input [2:0] f7, // 0-7 input [3:0] f8, // 0-8 input [3:0] f9, // 0-9 input [3:0] f10, // 0-10 input [3:0] f11, // 0-11 input [3:0] f12, // 0-12 input [3:0] f13, // 0-13 input [3:0] f14, // 0-14 input [3:0] f15, // 0-15 input [4:0] f16, // 0-16 input [4:0] f17, // 0-17 output output_valid, output [4:0] d0, output [4:0] d1, output [4:0] d2, output [4:0] d3, output [4:0] d4, output [4:0] d5, output [4:0] d6, output [4:0] d7, output [4:0] d8, output [4:0] d9, output [4:0] d10, output [4:0] d11, output [4:0] d12, output [4:0] d13, output [4:0] d14, output [4:0] d15, output [4:0] d16, output [4:0] d17); // This version purely combinational. CLK not used, assign output_valid = input_valid; // and no latency! parameter w = 4; parameter [w:0] lev0_0 = 1; parameter [w:0] lev0_1 = 2; parameter [w:0] lev0_2 = 3; parameter [w:0] lev0_3 = 4; parameter [w:0] lev0_4 = 5; parameter [w:0] lev0_5 = 6; parameter [w:0] lev0_6 = 7; parameter [w:0] lev0_7 = 8; parameter [w:0] lev0_8 = 9; parameter [w:0] lev0_9 = 10; parameter [w:0] lev0_10 = 11; parameter [w:0] lev0_11 = 12; parameter [w:0] lev0_12 = 13; parameter [w:0] lev0_13 = 14; parameter [w:0] lev0_14 = 15; parameter [w:0] lev0_15 = 16; parameter [w:0] lev0_16 = 17; parameter [w:0] lev0_17 = 18; // This part generated with fexpermgen.scm Scheme-module: wire [w:0] lev1_0 = (1 == f1 ? lev0_1 : lev0_0); wire [w:0] lev1_1 = (1 == f1 ? lev0_0 : lev0_1); wire [w:0] lev2_0 = (2 == f2 ? lev0_2 : lev1_0); wire [w:0] lev2_1 = (1 == f2 ? lev0_2 : lev1_1); wire [w:0] lev2_2 = (2 == f2 ? lev1_0 : (1 == f2 ? lev1_1 : lev0_2)); wire [w:0] lev3_0 = (3 == f3 ? lev0_3 : lev2_0); wire [w:0] lev3_1 = (2 == f3 ? lev0_3 : lev2_1); wire [w:0] lev3_2 = (1 == f3 ? lev0_3 : lev2_2); wire [w:0] lev3_3 = (3 == f3 ? lev2_0 : (2 == f3 ? lev2_1 : (1 == f3 ? lev2_2 : lev0_3))); wire [w:0] lev4_0 = (4 == f4 ? lev0_4 : lev3_0); wire [w:0] lev4_1 = (3 == f4 ? lev0_4 : lev3_1); wire [w:0] lev4_2 = (2 == f4 ? lev0_4 : lev3_2); wire [w:0] lev4_3 = (1 == f4 ? lev0_4 : lev3_3); wire [w:0] lev4_4 = (4 == f4 ? lev3_0 : (3 == f4 ? lev3_1 : (2 == f4 ? lev3_2 : (1 == f4 ? lev3_3 : lev0_4)))); wire [w:0] lev5_0 = (5 == f5 ? lev0_5 : lev4_0); wire [w:0] lev5_1 = (4 == f5 ? lev0_5 : lev4_1); wire [w:0] lev5_2 = (3 == f5 ? lev0_5 : lev4_2); wire [w:0] lev5_3 = (2 == f5 ? lev0_5 : lev4_3); wire [w:0] lev5_4 = (1 == f5 ? lev0_5 : lev4_4); wire [w:0] lev5_5 = (5 == f5 ? lev4_0 : (4 == f5 ? lev4_1 : (3 == f5 ? lev4_2 : (2 == f5 ? lev4_3 : (1 == f5 ? lev4_4 : lev0_5))))); wire [w:0] lev6_0 = (6 == f6 ? lev0_6 : lev5_0); wire [w:0] lev6_1 = (5 == f6 ? lev0_6 : lev5_1); wire [w:0] lev6_2 = (4 == f6 ? lev0_6 : lev5_2); wire [w:0] lev6_3 = (3 == f6 ? lev0_6 : lev5_3); wire [w:0] lev6_4 = (2 == f6 ? lev0_6 : lev5_4); wire [w:0] lev6_5 = (1 == f6 ? lev0_6 : lev5_5); wire [w:0] lev6_6 = (6 == f6 ? lev5_0 : (5 == f6 ? lev5_1 : (4 == f6 ? lev5_2 : (3 == f6 ? lev5_3 : (2 == f6 ? lev5_4 : (1 == f6 ? lev5_5 : lev0_6)))))); wire [w:0] lev7_0 = (7 == f7 ? lev0_7 : lev6_0); wire [w:0] lev7_1 = (6 == f7 ? lev0_7 : lev6_1); wire [w:0] lev7_2 = (5 == f7 ? lev0_7 : lev6_2); wire [w:0] lev7_3 = (4 == f7 ? lev0_7 : lev6_3); wire [w:0] lev7_4 = (3 == f7 ? lev0_7 : lev6_4); wire [w:0] lev7_5 = (2 == f7 ? lev0_7 : lev6_5); wire [w:0] lev7_6 = (1 == f7 ? lev0_7 : lev6_6); wire [w:0] lev7_7 = (7 == f7 ? lev6_0 : (6 == f7 ? lev6_1 : (5 == f7 ? lev6_2 : (4 == f7 ? lev6_3 : (3 == f7 ? lev6_4 : (2 == f7 ? lev6_5 : (1 == f7 ? lev6_6 : lev0_7))))))); wire [w:0] lev8_0 = (8 == f8 ? lev0_8 : lev7_0); wire [w:0] lev8_1 = (7 == f8 ? lev0_8 : lev7_1); wire [w:0] lev8_2 = (6 == f8 ? lev0_8 : lev7_2); wire [w:0] lev8_3 = (5 == f8 ? lev0_8 : lev7_3); wire [w:0] lev8_4 = (4 == f8 ? lev0_8 : lev7_4); wire [w:0] lev8_5 = (3 == f8 ? lev0_8 : lev7_5); wire [w:0] lev8_6 = (2 == f8 ? lev0_8 : lev7_6); wire [w:0] lev8_7 = (1 == f8 ? lev0_8 : lev7_7); wire [w:0] lev8_8 = (8 == f8 ? lev7_0 : (7 == f8 ? lev7_1 : (6 == f8 ? lev7_2 : (5 == f8 ? lev7_3 : (4 == f8 ? lev7_4 : (3 == f8 ? lev7_5 : (2 == f8 ? lev7_6 : (1 == f8 ? lev7_7 : lev0_8)))))))); wire [w:0] lev9_0 = (9 == f9 ? lev0_9 : lev8_0); wire [w:0] lev9_1 = (8 == f9 ? lev0_9 : lev8_1); wire [w:0] lev9_2 = (7 == f9 ? lev0_9 : lev8_2); wire [w:0] lev9_3 = (6 == f9 ? lev0_9 : lev8_3); wire [w:0] lev9_4 = (5 == f9 ? lev0_9 : lev8_4); wire [w:0] lev9_5 = (4 == f9 ? lev0_9 : lev8_5); wire [w:0] lev9_6 = (3 == f9 ? lev0_9 : lev8_6); wire [w:0] lev9_7 = (2 == f9 ? lev0_9 : lev8_7); wire [w:0] lev9_8 = (1 == f9 ? lev0_9 : lev8_8); wire [w:0] lev9_9 = (9 == f9 ? lev8_0 : (8 == f9 ? lev8_1 : (7 == f9 ? lev8_2 : (6 == f9 ? lev8_3 : (5 == f9 ? lev8_4 : (4 == f9 ? lev8_5 : (3 == f9 ? lev8_6 : (2 == f9 ? lev8_7 : (1 == f9 ? lev8_8 : lev0_9))))))))); wire [w:0] lev10_0 = (10 == f10 ? lev0_10 : lev9_0); wire [w:0] lev10_1 = (9 == f10 ? lev0_10 : lev9_1); wire [w:0] lev10_2 = (8 == f10 ? lev0_10 : lev9_2); wire [w:0] lev10_3 = (7 == f10 ? lev0_10 : lev9_3); wire [w:0] lev10_4 = (6 == f10 ? lev0_10 : lev9_4); wire [w:0] lev10_5 = (5 == f10 ? lev0_10 : lev9_5); wire [w:0] lev10_6 = (4 == f10 ? lev0_10 : lev9_6); wire [w:0] lev10_7 = (3 == f10 ? lev0_10 : lev9_7); wire [w:0] lev10_8 = (2 == f10 ? lev0_10 : lev9_8); wire [w:0] lev10_9 = (1 == f10 ? lev0_10 : lev9_9); wire [w:0] lev10_10 = (10 == f10 ? lev9_0 : (9 == f10 ? lev9_1 : (8 == f10 ? lev9_2 : (7 == f10 ? lev9_3 : (6 == f10 ? lev9_4 : (5 == f10 ? lev9_5 : (4 == f10 ? lev9_6 : (3 == f10 ? lev9_7 : (2 == f10 ? lev9_8 : (1 == f10 ? lev9_9 : lev0_10)))))))))); wire [w:0] lev11_0 = (11 == f11 ? lev0_11 : lev10_0); wire [w:0] lev11_1 = (10 == f11 ? lev0_11 : lev10_1); wire [w:0] lev11_2 = (9 == f11 ? lev0_11 : lev10_2); wire [w:0] lev11_3 = (8 == f11 ? lev0_11 : lev10_3); wire [w:0] lev11_4 = (7 == f11 ? lev0_11 : lev10_4); wire [w:0] lev11_5 = (6 == f11 ? lev0_11 : lev10_5); wire [w:0] lev11_6 = (5 == f11 ? lev0_11 : lev10_6); wire [w:0] lev11_7 = (4 == f11 ? lev0_11 : lev10_7); wire [w:0] lev11_8 = (3 == f11 ? lev0_11 : lev10_8); wire [w:0] lev11_9 = (2 == f11 ? lev0_11 : lev10_9); wire [w:0] lev11_10 = (1 == f11 ? lev0_11 : lev10_10); wire [w:0] lev11_11 = (11 == f11 ? lev10_0 : (10 == f11 ? lev10_1 : (9 == f11 ? lev10_2 : (8 == f11 ? lev10_3 : (7 == f11 ? lev10_4 : (6 == f11 ? lev10_5 : (5 == f11 ? lev10_6 : (4 == f11 ? lev10_7 : (3 == f11 ? lev10_8 : (2 == f11 ? lev10_9 : (1 == f11 ? lev10_10 : lev0_11))))))))))); wire [w:0] lev12_0 = (12 == f12 ? lev0_12 : lev11_0); wire [w:0] lev12_1 = (11 == f12 ? lev0_12 : lev11_1); wire [w:0] lev12_2 = (10 == f12 ? lev0_12 : lev11_2); wire [w:0] lev12_3 = (9 == f12 ? lev0_12 : lev11_3); wire [w:0] lev12_4 = (8 == f12 ? lev0_12 : lev11_4); wire [w:0] lev12_5 = (7 == f12 ? lev0_12 : lev11_5); wire [w:0] lev12_6 = (6 == f12 ? lev0_12 : lev11_6); wire [w:0] lev12_7 = (5 == f12 ? lev0_12 : lev11_7); wire [w:0] lev12_8 = (4 == f12 ? lev0_12 : lev11_8); wire [w:0] lev12_9 = (3 == f12 ? lev0_12 : lev11_9); wire [w:0] lev12_10 = (2 == f12 ? lev0_12 : lev11_10); wire [w:0] lev12_11 = (1 == f12 ? lev0_12 : lev11_11); wire [w:0] lev12_12 = (12 == f12 ? lev11_0 : (11 == f12 ? lev11_1 : (10 == f12 ? lev11_2 : (9 == f12 ? lev11_3 : (8 == f12 ? lev11_4 : (7 == f12 ? lev11_5 : (6 == f12 ? lev11_6 : (5 == f12 ? lev11_7 : (4 == f12 ? lev11_8 : (3 == f12 ? lev11_9 : (2 == f12 ? lev11_10 : (1 == f12 ? lev11_11 : lev0_12)))))))))))); wire [w:0] lev13_0 = (13 == f13 ? lev0_13 : lev12_0); wire [w:0] lev13_1 = (12 == f13 ? lev0_13 : lev12_1); wire [w:0] lev13_2 = (11 == f13 ? lev0_13 : lev12_2); wire [w:0] lev13_3 = (10 == f13 ? lev0_13 : lev12_3); wire [w:0] lev13_4 = (9 == f13 ? lev0_13 : lev12_4); wire [w:0] lev13_5 = (8 == f13 ? lev0_13 : lev12_5); wire [w:0] lev13_6 = (7 == f13 ? lev0_13 : lev12_6); wire [w:0] lev13_7 = (6 == f13 ? lev0_13 : lev12_7); wire [w:0] lev13_8 = (5 == f13 ? lev0_13 : lev12_8); wire [w:0] lev13_9 = (4 == f13 ? lev0_13 : lev12_9); wire [w:0] lev13_10 = (3 == f13 ? lev0_13 : lev12_10); wire [w:0] lev13_11 = (2 == f13 ? lev0_13 : lev12_11); wire [w:0] lev13_12 = (1 == f13 ? lev0_13 : lev12_12); wire [w:0] lev13_13 = (13 == f13 ? lev12_0 : (12 == f13 ? lev12_1 : (11 == f13 ? lev12_2 : (10 == f13 ? lev12_3 : (9 == f13 ? lev12_4 : (8 == f13 ? lev12_5 : (7 == f13 ? lev12_6 : (6 == f13 ? lev12_7 : (5 == f13 ? lev12_8 : (4 == f13 ? lev12_9 : (3 == f13 ? lev12_10 : (2 == f13 ? lev12_11 : (1 == f13 ? lev12_12 : lev0_13))))))))))))); wire [w:0] lev14_0 = (14 == f14 ? lev0_14 : lev13_0); wire [w:0] lev14_1 = (13 == f14 ? lev0_14 : lev13_1); wire [w:0] lev14_2 = (12 == f14 ? lev0_14 : lev13_2); wire [w:0] lev14_3 = (11 == f14 ? lev0_14 : lev13_3); wire [w:0] lev14_4 = (10 == f14 ? lev0_14 : lev13_4); wire [w:0] lev14_5 = (9 == f14 ? lev0_14 : lev13_5); wire [w:0] lev14_6 = (8 == f14 ? lev0_14 : lev13_6); wire [w:0] lev14_7 = (7 == f14 ? lev0_14 : lev13_7); wire [w:0] lev14_8 = (6 == f14 ? lev0_14 : lev13_8); wire [w:0] lev14_9 = (5 == f14 ? lev0_14 : lev13_9); wire [w:0] lev14_10 = (4 == f14 ? lev0_14 : lev13_10); wire [w:0] lev14_11 = (3 == f14 ? lev0_14 : lev13_11); wire [w:0] lev14_12 = (2 == f14 ? lev0_14 : lev13_12); wire [w:0] lev14_13 = (1 == f14 ? lev0_14 : lev13_13); wire [w:0] lev14_14 = (14 == f14 ? lev13_0 : (13 == f14 ? lev13_1 : (12 == f14 ? lev13_2 : (11 == f14 ? lev13_3 : (10 == f14 ? lev13_4 : (9 == f14 ? lev13_5 : (8 == f14 ? lev13_6 : (7 == f14 ? lev13_7 : (6 == f14 ? lev13_8 : (5 == f14 ? lev13_9 : (4 == f14 ? lev13_10 : (3 == f14 ? lev13_11 : (2 == f14 ? lev13_12 : (1 == f14 ? lev13_13 : lev0_14)))))))))))))); wire [w:0] lev15_0 = (15 == f15 ? lev0_15 : lev14_0); wire [w:0] lev15_1 = (14 == f15 ? lev0_15 : lev14_1); wire [w:0] lev15_2 = (13 == f15 ? lev0_15 : lev14_2); wire [w:0] lev15_3 = (12 == f15 ? lev0_15 : lev14_3); wire [w:0] lev15_4 = (11 == f15 ? lev0_15 : lev14_4); wire [w:0] lev15_5 = (10 == f15 ? lev0_15 : lev14_5); wire [w:0] lev15_6 = (9 == f15 ? lev0_15 : lev14_6); wire [w:0] lev15_7 = (8 == f15 ? lev0_15 : lev14_7); wire [w:0] lev15_8 = (7 == f15 ? lev0_15 : lev14_8); wire [w:0] lev15_9 = (6 == f15 ? lev0_15 : lev14_9); wire [w:0] lev15_10 = (5 == f15 ? lev0_15 : lev14_10); wire [w:0] lev15_11 = (4 == f15 ? lev0_15 : lev14_11); wire [w:0] lev15_12 = (3 == f15 ? lev0_15 : lev14_12); wire [w:0] lev15_13 = (2 == f15 ? lev0_15 : lev14_13); wire [w:0] lev15_14 = (1 == f15 ? lev0_15 : lev14_14); wire [w:0] lev15_15 = (15 == f15 ? lev14_0 : (14 == f15 ? lev14_1 : (13 == f15 ? lev14_2 : (12 == f15 ? lev14_3 : (11 == f15 ? lev14_4 : (10 == f15 ? lev14_5 : (9 == f15 ? lev14_6 : (8 == f15 ? lev14_7 : (7 == f15 ? lev14_8 : (6 == f15 ? lev14_9 : (5 == f15 ? lev14_10 : (4 == f15 ? lev14_11 : (3 == f15 ? lev14_12 : (2 == f15 ? lev14_13 : (1 == f15 ? lev14_14 : lev0_15))))))))))))))); wire [w:0] lev16_0 = (16 == f16 ? lev0_16 : lev15_0); wire [w:0] lev16_1 = (15 == f16 ? lev0_16 : lev15_1); wire [w:0] lev16_2 = (14 == f16 ? lev0_16 : lev15_2); wire [w:0] lev16_3 = (13 == f16 ? lev0_16 : lev15_3); wire [w:0] lev16_4 = (12 == f16 ? lev0_16 : lev15_4); wire [w:0] lev16_5 = (11 == f16 ? lev0_16 : lev15_5); wire [w:0] lev16_6 = (10 == f16 ? lev0_16 : lev15_6); wire [w:0] lev16_7 = (9 == f16 ? lev0_16 : lev15_7); wire [w:0] lev16_8 = (8 == f16 ? lev0_16 : lev15_8); wire [w:0] lev16_9 = (7 == f16 ? lev0_16 : lev15_9); wire [w:0] lev16_10 = (6 == f16 ? lev0_16 : lev15_10); wire [w:0] lev16_11 = (5 == f16 ? lev0_16 : lev15_11); wire [w:0] lev16_12 = (4 == f16 ? lev0_16 : lev15_12); wire [w:0] lev16_13 = (3 == f16 ? lev0_16 : lev15_13); wire [w:0] lev16_14 = (2 == f16 ? lev0_16 : lev15_14); wire [w:0] lev16_15 = (1 == f16 ? lev0_16 : lev15_15); wire [w:0] lev16_16 = (16 == f16 ? lev15_0 : (15 == f16 ? lev15_1 : (14 == f16 ? lev15_2 : (13 == f16 ? lev15_3 : (12 == f16 ? lev15_4 : (11 == f16 ? lev15_5 : (10 == f16 ? lev15_6 : (9 == f16 ? lev15_7 : (8 == f16 ? lev15_8 : (7 == f16 ? lev15_9 : (6 == f16 ? lev15_10 : (5 == f16 ? lev15_11 : (4 == f16 ? lev15_12 : (3 == f16 ? lev15_13 : (2 == f16 ? lev15_14 : (1 == f16 ? lev15_15 : lev0_16)))))))))))))))); wire [w:0] lev17_0 = (17 == f17 ? lev0_17 : lev16_0); wire [w:0] lev17_1 = (16 == f17 ? lev0_17 : lev16_1); wire [w:0] lev17_2 = (15 == f17 ? lev0_17 : lev16_2); wire [w:0] lev17_3 = (14 == f17 ? lev0_17 : lev16_3); wire [w:0] lev17_4 = (13 == f17 ? lev0_17 : lev16_4); wire [w:0] lev17_5 = (12 == f17 ? lev0_17 : lev16_5); wire [w:0] lev17_6 = (11 == f17 ? lev0_17 : lev16_6); wire [w:0] lev17_7 = (10 == f17 ? lev0_17 : lev16_7); wire [w:0] lev17_8 = (9 == f17 ? lev0_17 : lev16_8); wire [w:0] lev17_9 = (8 == f17 ? lev0_17 : lev16_9); wire [w:0] lev17_10 = (7 == f17 ? lev0_17 : lev16_10); wire [w:0] lev17_11 = (6 == f17 ? lev0_17 : lev16_11); wire [w:0] lev17_12 = (5 == f17 ? lev0_17 : lev16_12); wire [w:0] lev17_13 = (4 == f17 ? lev0_17 : lev16_13); wire [w:0] lev17_14 = (3 == f17 ? lev0_17 : lev16_14); wire [w:0] lev17_15 = (2 == f17 ? lev0_17 : lev16_15); wire [w:0] lev17_16 = (1 == f17 ? lev0_17 : lev16_16); wire [w:0] lev17_17 = (17 == f17 ? lev16_0 : (16 == f17 ? lev16_1 : (15 == f17 ? lev16_2 : (14 == f17 ? lev16_3 : (13 == f17 ? lev16_4 : (12 == f17 ? lev16_5 : (11 == f17 ? lev16_6 : (10 == f17 ? lev16_7 : (9 == f17 ? lev16_8 : (8 == f17 ? lev16_9 : (7 == f17 ? lev16_10 : (6 == f17 ? lev16_11 : (5 == f17 ? lev16_12 : (4 == f17 ? lev16_13 : (3 == f17 ? lev16_14 : (2 == f17 ? lev16_15 : (1 == f17 ? lev16_16 : lev0_17))))))))))))))))); assign d0 = lev17_0; assign d1 = lev17_1; assign d2 = lev17_2; assign d3 = lev17_3; assign d4 = lev17_4; assign d5 = lev17_5; assign d6 = lev17_6; assign d7 = lev17_7; assign d8 = lev17_8; assign d9 = lev17_9; assign d10 = lev17_10; assign d11 = lev17_11; assign d12 = lev17_12; assign d13 = lev17_13; assign d14 = lev17_14; assign d15 = lev17_15; assign d16 = lev17_16; assign d17 = lev17_17; endmodule