#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>



int main(int argc, char **argv){
	char *comp[16] = {"s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "sa", "sb", "sc", "sd", "se", "sf"};


	uint32_t y = 0;
	uint32_t x = 0;
	uint32_t z = 0;
	uint32_t w = 0;
	uint32_t v = 0;

/*
	//printf("//\n", comp[x]);
    for(x=0; x<16; x++){
        //printf("#define 16WRITE_64%s \\\n", comp[x]);
        printf("\tX[%u] = (uint16)(Y[0].%s, Y[1].%s, Y[2].%s, Y[3].%s, Y[4].%s, Y[5].%s, Y[6].%s, Y[7].%s, Y[8].%s, Y[9].%s, Y[10].%s, Y[11].%s, Y[12].%s, Y[13].%s, Y[14].%s,, X[15].%s);\n", \
            y, comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], \
            comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x]);
         printf("\tX[%u] = (uint16)(Y[16].%s, Y[17].%s, Y[18].%s, Y[19].%s, Y[20].%s, Y[21].%s, Y[22].%s, Y[23].%s, Y[24].%s, Y[25].%s, Y[26].%s, Y[27].%s, Y[28].%s, Y[29].%s, Y[30].%s, Y[31].%s);\n", \
            y+1, comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], \
            comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x]);
        //printf("#endif\n\n");
		y+=2;
	}
	y = 0;
    for(x=0; x<8; x++){
        //printf("#define 8WRITE_32%s \\\n", comp[x]);
        printf("\tX[%u] = (uint8)(Y[0].%s, Y[1].%s, Y[2].%s, Y[3].%s, Y[4].%s, Y[5].%s, Y[6].%s, Y[7].%s);\n", \
            y, comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x]);
        printf("\tX[%u] = (uint8)(Y[8].%s, Y[9].%s, Y[10].%s, Y[11].%s, Y[12].%s, Y[13].%s, Y[14].%s, Y[15].%s);\n", \
            y+1, comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x]);
        printf("\tX[%u] = (uint8)(Y[16].%s, Y[17].%s, Y[18].%s, Y[19].%s, Y[20].%s, Y[21].%s, Y[22].%s, Y[23].%s);\n", \
            y+2, comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x]);
        printf("\tX[%u] = (uint8)(Y[24].%s, Y[25].%s, Y[26].%s, Y[27].%s, Y[28].%s, Y[29].%s, Y[30].%s, Y[31].%s);\n", \
            y+3, comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x]);
        //printf("#endif\n\n");
		y+=4;
    }
	y = 0;
    for(x=0; x<4; x++){
        //printf("#define 4WRITE_16%s \\\n", comp[x]);
        printf("\tX[%u] = (uint4)(Y[0].%s, Y[1].%s, Y[2].%s, Y[3].%s);\n", \
            y, comp[x], comp[x], comp[x], comp[x]);
        printf("\tX[%u] = (uint4)(Y[4].%s, Y[5].%s, Y[6].%s, Y[7].%s);\n", \
            y+1, comp[x], comp[x], comp[x], comp[x]);
        printf("\tX[%u] = (uint4)(Y[8].%s, Y[9].%s, Y[10].%s, Y[11].%s);\n", \
            y+2, comp[x], comp[x], comp[x], comp[x]);
        printf("\tX[%u] = (uint4)(Y[12].%s, Y[13].%s, Y[14].%s, Y[15].%s);\n", \
            y+3, comp[x], comp[x], comp[x], comp[x]);
        printf("\tX[%u] = (uint4)(Y[16].%s, Y[17].%s, Y[18].%s, Y[19].%s);\n", \
            y+4, comp[x], comp[x], comp[x], comp[x]);
        printf("\tX[%u] = (uint4)(Y[20].%s, Y[21].%s, Y[22].%s, Y[23].%s);\n", \
            y+5, comp[x], comp[x], comp[x], comp[x]);
        printf("\tX[%u] = (uint4)(Y[24].%s, Y[25].%s, Y[26].%s, Y[27].%s);\n", \
            y+6, comp[x], comp[x], comp[x], comp[x]);
        printf("\tX[%u] = (uint4)(Y[28].%s, Y[29].%s, Y[30].%s, Y[31].%s);\n", \
            y+7, comp[x], comp[x], comp[x], comp[x]);
        //printf("#endif\n\n");
		y+=8;
    }
	y = 0;
    for(x=0; x<2; x++){
        printf("\tX[%u] = (uint2)(Y[0].%s, Y[1].%s);\n", \
			y, comp[x], comp[x]);
		printf("\tX[%u] = (uint2)(Y[2].%s, Y[3].%s);\n", \
            y+1, comp[x], comp[x]);
        printf("\tX[%u] = (uint2)(Y[4].%s, Y[5].%s);\n", \
            y+2, comp[x], comp[x]);
        printf("\tX[%u] = (uint2)(Y[6].%s, Y[7].%s);\n", \
            y+3, comp[x], comp[x]);
        printf("\tX[%u] = (uint2)(Y[8].%s, Y[9].%s);\n", \
            y+4, comp[x], comp[x]);
        printf("\tX[%u] = (uint2)(Y[10].%s, Y[11].%s);\n", \
            y+5, comp[x], comp[x]);
        printf("\tX[%u] = (uint2)(Y[12].%s, Y[13].%s);\n", \
            y+6, comp[x], comp[x]);
        printf("\tX[%u] = (uint2)(Y[14].%s, Y[15].%s);\n", \
            y+7, comp[x], comp[x]);
        printf("\tX[%u] = (uint2)(Y[16].%s, Y[17].%s);\n", \
            y+8, comp[x], comp[x]);
        printf("\tX[%u] = (uint2)(Y[18].%s, Y[19].%s);\n", \
            y+9, comp[x], comp[x]);
        printf("\tX[%u] = (uint2)(Y[20].%s, Y[21].%s);\n", \
            y+10, comp[x], comp[x]);
        printf("\tX[%u] = (uint2)(Y[22].%s, Y[23].%s);\n", \
            y+11, comp[x], comp[x]);
        printf("\tX[%u] = (uint2)(Y[24].%s, Y[25].%s);\n", \
            y+12, comp[x], comp[x]);
        printf("\tX[%u] = (uint2)(Y[26].%s, Y[27].%s);\n", \
            y+13, comp[x], comp[x]);
        printf("\tX[%u] = (uint2)(Y[28].%s, Y[29].%s);\n", \
            y+14, comp[x], comp[x]);
        printf("\tX[%u] = (uint2)(Y[30].%s, Y[31].%s);\n", \
            y+15, comp[x], comp[x]);
		y+=16;
    }
*/

///UNTRANSFORM
/*
	X[0] = (uint16)(Y[0].s0, Y[2].s0, Y[4].s0, Y[0].s3, Y[0].s4, Y[0].s5, Y[0].s6, Y[0].s7, Y[0].s8, Y[0].s9, Y[0].sa, Y[0].sb, Y[0].sc, Y[0].sd, Y[0].se, Y[0].sf
	X[1] = (uint16)(Y[0].s1, Y[2].s1, Y[4].s1, 
	X[2] = (uint16)(Y[0].s2, Y[2].s2, Y[4].s2, 
	X[3] = (uint16)(Y[0].s3, Y[2].s3, Y[4].s3, 
	X[4] = (uint16)(Y[0].s4, Y[2].s4, Y[4].s4, 
	X[5] = (uint16)(Y[0].s5, Y[2].s5, Y[4].s5, 
	X[6] = (uint16)(Y[0].s6, Y[2].s6, Y[4].s6, 
	X[7] = (uint16)(Y[0].s7, Y[2].s7, Y[4].s7, 
	X[8] = (uint16)(Y[0].s8, Y[2].s8, Y[4].s8, 
	X[9] = (uint16)(Y[0].s9, Y[2].s9, Y[4].s9, 
	X[10] = (uint16)(Y[0].sa, Y[2].sa, Y[4].sa, 
	X[11] = (uint16)(Y[0].sb, Y[2].sb, Y[4].sb, 
	X[12] = (uint16)(Y[0].sc, Y[2].sc, Y[4].sc, 
	X[13] = (uint16)(Y[0].sd, Y[2].sd, Y[4].sd, 
	X[14] = (uint16)(Y[0].se, Y[2].se, Y[4].se, 
	X[15] = (uint16)(Y[0].sf, Y[2].sf, Y[4].sf, 
	X[16] = (uint16)(Y[1].s0, Y[3].s0, Y[5].s0, 
*/


//for(v=2; v<32; v*=2){
//2, 4, 8, 16

	uint8_t vstep = 0;
/*
	w = 0;
	z = 0;

//for(y=0; y<32; y+=v){

	for(y=0; y<16; y++){
		printf("\tX[%u] = (uint16)(", y);
		for(x=0; x<14; x+=2)
			printf("Y[%u].%s, ", x, comp[w]);
		printf("Y[%u].%s);\n", x, comp[w]);

		w++;

	}

	for(y=16; y<32; y++){
		printf("\tX[%u] = (uint16)(", y);
		for(x=1; x<14; x+=2)
			printf("Y[%u].%s, ", x, comp[z]);
		printf("Y[%u].%s);\n", x, comp[z]);

		z++;

	}

*/

uint32_t am = 32;
uint32_t astep = 0;
/*
for(v=2; v<32; v*=2){
	y=0;

	//for(w=0; w<v; w++){
	//for(vstep=0; vstep<32; vstep+=v){
		y=0;
		for(astep=0; astep<am/v; astep++){
			//y=0;
			//for(y=0; y<32; y++){
			//	for(vstep=0; vstep<am; vstep+=v){
					w=0;
				for(w=0; w<v; w++){
//			for(y=0; y<am/v; y++){
					printf("\tX[%u] = (uint16)(", y);
					for(x=0; x<(v-1); x++){
						printf("Y[%u].%s, ", x, comp[x]);
						//w++;
					}
					printf("Y[%u].%s);\n", x, comp[x+1]);
					//y++;
//
				}
				y++;
			}
		//}

	//}
	//y++;

}
*/


for(v=2; v<32; v*=2){
w = 0;
z = 0;


	for(y=0; y<am; y++){


		if((y%v == 0) && (y != 0)){
			//w ^= 1;
			//w += am/v-1;
			w++;
			//w++;
			z = 0;
			//w = 0;
		}//else
		//	w = 1;

			//z++;
			printf("\tX[%u] = (uint16)(", y);
			for(x=0; x<(am-(am/v)); x+=am/v){
			//for(x=w; x<(am-am/v); x+=am/v){
				printf("Y[%u].%s, ", x+w, comp[z]);
				//z++;
			}
			printf("Y[%u].%s);\n", x+w, comp[z]);
			z++;
	}
}











/*
		printf("\tX[%u] = (uint16)(", y);
		//for(z=0; z<16; z++){
			if(y%2 == 0){
				//printf("\tX[%u] = (uint16)(", y);
				for(x=0; x<14; x+=2){
					printf("Y[%u].%s, ", x, comp[w]);
					//z++;
				}
				//printf("Y[x].%s);\n", x, comp[z]);
			}else{
				//printf("\tX[%u] = (uint16)(", y);
				for(x=1; x<14; x+=2){
					printf("Y[%u].%s, ", x, comp[w]);
				}
				//printf("Y[x].%s);\n", x, comp[z]);
			}
		//}

		if(y%2 == 0){
			printf("Y[%u].%s);\n", z, comp[w]);
			
		}else{
			printf("Y[%u].%s);\n", z+1, comp[w]);
			w++;
		}

		

	}
*/


/*
        //printf("#define 16WRITE_64%s \\\n", comp[x]);
        printf("\tX[%u] = (uint16)(Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s,, X[%u].%s);\n", \
            y, x, comp[x], comp[x+1], comp[x+2], comp[x+3], comp[x+4], comp[x+5], comp[x+6], comp[x+7], \
            comp[x+8], comp[x+9], comp[x+10], comp[x+11], comp[x+12], comp[x+13], comp[x+14], comp[x+15]);
         printf("\tX[%u] = (uint16)(Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s, Y[%u].%s);\n", \
            y, x+1, comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], \
            comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x]);
        //printf("#endif\n\n");
        y+=2;
    }
    y = 0;
    for(x=0; x<8; x++){
        //printf("#define 8WRITE_32%s \\\n", comp[x]);
        printf("\tX[%u] = (uint8)(Y[0].%s, Y[1].%s, Y[2].%s, Y[3].%s, Y[4].%s, Y[5].%s, Y[6].%s, Y[7].%s);\n", \
            y, comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x]);
        printf("\tX[%u] = (uint8)(Y[8].%s, Y[9].%s, Y[10].%s, Y[11].%s, Y[12].%s, Y[13].%s, Y[14].%s, Y[15].%s);\n", \
            y+1, comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x]);
        printf("\tX[%u] = (uint8)(Y[16].%s, Y[17].%s, Y[18].%s, Y[19].%s, Y[20].%s, Y[21].%s, Y[22].%s, Y[23].%s);\n", \
            y+2, comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x]);
        printf("\tX[%u] = (uint8)(Y[24].%s, Y[25].%s, Y[26].%s, Y[27].%s, Y[28].%s, Y[29].%s, Y[30].%s, Y[31].%s);\n", \
            y+3, comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x]);
        //printf("#endif\n\n");
        y+=4;
    }
    y = 0;


*/


	return 0;
}