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

void Usage(void){
	printf("./command basename count\n");

}


/*
lookup[CO_01] = (vo)(X[0].s0, X[1].s0, X[2].s0, X[3].s0, X[4].s0, X[5].s0, X[6].s0, X[7].s0,
            X[8].s0, X[9].s0, X[10].s0, X[11].s0, X[12].s0, X[13].s0, X[14].s0, X[15].s0);
lookup[CO_01+1] = (vo)(X[0].s1, X[1].s1, X[2].s1, X[3].s1, X[4].s1, X[5].s1, X[6].s1, X[7].s1,
            X[8].s1, X[9].s1, X[10].s1, X[11].s1, X[12].s1, X[13].s1, X[14].s1, X[15].s1);

#define CO_01 (x.s0 + ystep)
//#define CO_01 (x.s0 + ystep)
*/


int main(int argc, char **argv){
	uint32_t num1 = 0;
	uint32_t num2 = 0;
	uint32_t x, y, z;
	char *base;
	uint32_t baselen = 0;
	uint32_t count = 0;
	int print = 0;

	char *idx[16] = {"CO_01", "CO_02", "CO_03", "CO_04", "CO_05", "CO_06", "CO_07", "CO_08", "CO_09", "CO_10", "CO_11",
					"CO_12", "CO_13", "CO_14", "CO_15", "CO_16"};
	char *comp[16] = {"s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "sa", "sb", "sc", "sd", "se", "sf"};

if(print){
	if(argc != 3){
		Usage();
		exit(1);
	}
	baselen = strlen(argv[1]);
	base = (char*)malloc(baselen+1);
	(void)sprintf(base, "%s", argv[1]);
	count = atoi(argv[2]);
}

//	char *filename = "test.txt";
//	FILE* fp;

//	if( (fp = fopen(filename, "w")) ){
		//fprintf(fp, "idx[512] = {\n"); // bufsize);



//for(y=0; y<; y++){
	y=0;
	x=0;
//for(z=0; z<2; z++){

//16write

printf("//16 WRITES\n");

	for(x=0; x<16; x++){
		printf("#define 16WRITE_64%s \\\n", comp[x]);
		printf("\tline0 = (uint16)(X[0].%s, X[1].%s, X[2].%s, X[3].%s, X[4].%s, X[5].%s, X[6].%s, X[7].%s, X[8].%s, X[9].%s, X[10].%s, X[11].%s, X[12].%s, X[13].%s, X[14].%s, X[15].%s); \\\n", \
			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("\tline1 = (uint16)(X[16].%s, X[17].%s, X[18].%s, X[19].%s, X[20].%s, X[21].%s, X[22].%s, X[23].%s, X[24].%s, X[25].%s, X[26].%s, X[27].%s, X[28].%s, X[29].%s, X[30].%s, X[31].%s);\n", \
			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;
		//x+=2;
		//x++;
		//y++;

	}


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

        //y+=2;
        //x+=2;
        //x++;
        //y++;

    }

    for(x=0; x<16; x++){
        printf("#define 16WRITE_16%s \\\n", comp[x]);
        printf("\tline0 = (uint4)(X[0].%s, X[1].%s, X[2].%s, X[3].%s); \\\n", \
			comp[x], comp[x], comp[x], comp[x]);
		printf("\tline1 = (uint4)(X[4].%s, X[5].%s, X[6].%s, X[7].%s); \\\n", \
			comp[x], comp[x], comp[x], comp[x]);
		printf("\tline2 = (uint4)(X[8].%s, X[9].%s, X[10].%s, X[11].%s); \\\n", \
			comp[x], comp[x], comp[x], comp[x]);
		printf("\tline3 = (uint4)(X[12].%s, X[13].%s, X[14].%s, X[15].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline4 = (uint4)(X[16].%s, X[17].%s, X[18].%s, X[19].%s); \\\n", \
			comp[x], comp[x], comp[x], comp[x]);
		printf("\tline5 = (uint4)(X[20].%s, X[21].%s, X[22].%s, X[23].%s); \\\n", \
			comp[x], comp[x], comp[x], comp[x]);
		printf("\tline6 = (uint4)(X[24].%s, X[25].%s, X[26].%s, X[27].%s); \\\n", \
			comp[x], comp[x], comp[x], comp[x]);
		printf("\tline7 = (uint4)(X[28].%s, X[29].%s, X[30].%s, X[31].%s);\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("#endif\n\n");

        //y+=2;
        //x+=2;
        //x++;
        //y++;

    }





//8 write
printf("//8 WRITES\n");

    for(x=0; x<8; x++){
        printf("#define 8WRITE_64%s \\\n", comp[x]);
        printf("\tline0 = (uint16)(X[0].%s, X[1].%s, X[2].%s, X[3].%s, X[4].%s, X[5].%s, X[6].%s, X[7].%s, X[8].%s, X[9].%s, X[10].%s, X[11].%s, X[12].%s, X[13].%s, X[14].%s, X[15].%s); \\\n", \
            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("\tline1 = (uint16)(X[16].%s, X[17].%s, X[18].%s, X[19].%s, X[20].%s, X[21].%s, X[22].%s, X[23].%s, X[24].%s, X[25].%s, X[26].%s, X[27].%s, X[28].%s, X[29].%s, X[30].%s, X[31].%s);\n", \
            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;
        //x+=2;
        //x++;
        //y++;

    }

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

    }

    for(x=0; x<8; x++){
        printf("#define 8WRITE_16%s \\\n", comp[x]);
        printf("\tline0 = (uint4)(X[0].%s, X[1].%s, X[2].%s, X[3].%s); \\\n", \
			comp[x], comp[x], comp[x], comp[x]);
		printf("\tline1 = (uint4)(X[4].%s, X[5].%s, X[6].%s, X[7].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline2 = (uint4)(X[8].%s, X[9].%s, X[10].%s, X[11].%s); \\\n", \
			comp[x], comp[x], comp[x], comp[x]);
		printf("\tline3 = (uint4)(X[12].%s, X[13].%s, X[14].%s, X[15].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline4 = (uint4)(X[16].%s, X[17].%s, X[18].%s, X[19].%s); \\\n", \
			comp[x], comp[x], comp[x], comp[x]);
		printf("\tline5 = (uint4)(X[20].%s, X[21].%s, X[22].%s, X[23].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline6 = (uint4)(X[24].%s, X[25].%s, X[26].%s, X[27].%s); \\\n", \
			comp[x], comp[x], comp[x], comp[x]);
		printf("\tline7 = (uint4)(X[28].%s, X[29].%s, X[30].%s, X[31].%s);\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("#endif\n\n");

    }


//4 write
printf("//4 WRITES\n");

    for(x=0; x<4; x++){
        printf("#define 4WRITE_64%s \\\n", comp[x]);
        printf("\tline0 = (uint16)(X[0].%s, X[1].%s, X[2].%s, X[3].%s, X[4].%s, X[5].%s, X[6].%s, X[7].%s, X[8].%s, X[9].%s, X[10].%s, X[11].%s, X[12].%s, X[13].%s, X[14].%s, X[15].%s); \\\n", \
            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("\tline1 = (uint16)(X[16].%s, X[17].%s, X[18].%s, X[19].%s, X[20].%s, X[21].%s, X[22].%s, X[23].%s, X[24].%s, X[25].%s, X[26].%s, X[27].%s, X[28].%s, X[29].%s, X[30].%s, X[31].%s);\n", \
            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;
        //x+=2;
        //x++;
        //y++;

    }


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

    }



    for(x=0; x<4; x++){
        printf("#define 4WRITE_16%s \\\n", comp[x]);
        printf("\tline0 = (uint4)(X[0].%s, X[1].%s, X[2].%s, X[3].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline1 = (uint4)(X[4].%s, X[5].%s, X[6].%s, X[7].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline2 = (uint4)(X[8].%s, X[9].%s, X[10].%s, X[11].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline3 = (uint4)(X[12].%s, X[13].%s, X[14].%s, X[15].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline4 = (uint4)(X[16].%s, X[17].%s, X[18].%s, X[19].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline5 = (uint4)(X[20].%s, X[21].%s, X[22].%s, X[23].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline6 = (uint4)(X[24].%s, X[25].%s, X[26].%s, X[27].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline7 = (uint4)(X[28].%s, X[29].%s, X[30].%s, X[31].%s);\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("#endif\n\n");

    }
//2 write
printf("//2 WRITES\n");
    for(x=0; x<2; x++){
        printf("#define 2WRITE_64%s \\\n", comp[x]);
        printf("\tline0 = (uint16)(X[0].%s, X[1].%s, X[2].%s, X[3].%s, X[4].%s, X[5].%s, X[6].%s, X[7].%s, X[8].%s, X[9].%s, X[10].%s, X[11].%s, X[12].%s, X[13].%s, X[14].%s, X[15].%s); \\\n", \
            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("\tline1 = (uint16)(X[16].%s, X[17].%s, X[18].%s, X[19].%s, X[20].%s, X[21].%s, X[22].%s, X[23].%s, X[24].%s, X[25].%s, X[26].%s, X[27].%s, X[28].%s, X[29].%s, X[30].%s, X[31].%s);\n", \
            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;
        //x+=2;
        //x++;
        //y++;

    }

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

    }

    for(x=0; x<2; x++){
        printf("#define 2WRITE_16%s \\\n", comp[x]);
        printf("\tline0 = (uint4)(X[0].%s, X[1].%s, X[2].%s, X[3].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline1 = (uint4)(X[4].%s, X[5].%s, X[6].%s, X[7].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline2 = (uint4)(X[8].%s, X[9].%s, X[10].%s, X[11].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline3 = (uint4)(X[12].%s, X[13].%s, X[14].%s, X[15].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline4 = (uint4)(X[16].%s, X[17].%s, X[18].%s, X[19].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline5 = (uint4)(X[20].%s, X[21].%s, X[22].%s, X[23].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline6 = (uint4)(X[24].%s, X[25].%s, X[26].%s, X[27].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline7 = (uint4)(X[28].%s, X[29].%s, X[30].%s, X[31].%s);\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("#endif\n\n");

    }

//1 write
printf("//1 WRITES\n");
        printf("#define 1WRITE_64%s \\\n", comp[x]);
        printf("\tline0 = (uint16)(X[0].%s, X[1].%s, X[2].%s, X[3].%s, X[4].%s, X[5].%s, X[6].%s, X[7].%s, X[8].%s, X[9].%s, X[10].%s, X[11].%s, X[12].%s, X[13].%s, X[14].%s, X[15].%s); \\\n", \
            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("\tline1 = (uint16)(X[16].%s, X[17].%s, X[18].%s, X[19].%s, X[20].%s, X[21].%s, X[22].%s, X[23].%s, X[24].%s, X[25].%s, X[26].%s, X[27].%s, X[28].%s, X[29].%s, X[30].%s, X[31].%s);\n", \
            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");


        printf("#define 1WRITE_32%s \\\n", comp[x]);
        printf("\tline0 = (uint8)(X[0].%s, X[1].%s, X[2].%s, X[3].%s, X[4].%s, X[5].%s, X[6].%s, X[7].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x]);
        printf("\tline1 = (uint8)(X[8].%s, X[9].%s, X[10].%s, X[11].%s, X[12].%s, X[13].%s, X[14].%s, X[15].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x]);
        printf("\tline2 = (uint8)(X[16].%s, X[17].%s, X[18].%s, X[19].%s, X[20].%s, X[21].%s, X[22].%s, X[23].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x]);
        printf("\tline3 = (uint8)(X[24].%s, X[25].%s, X[26].%s, X[27].%s, X[28].%s, X[29].%s, X[30].%s, X[31].%s);\n", \
            comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x], comp[x]);
        printf("#endif\n\n");

        printf("#define 1WRITE_16%s \\\n", comp[x]);
        printf("\tline0 = (uint4)(X[0].%s, X[1].%s, X[2].%s, X[3].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline1 = (uint4)(X[4].%s, X[5].%s, X[6].%s, X[7].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline2 = (uint4)(X[8].%s, X[9].%s, X[10].%s, X[11].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline3 = (uint4)(X[12].%s, X[13].%s, X[14].%s, X[15].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline4 = (uint4)(X[16].%s, X[17].%s, X[18].%s, X[19].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline5 = (uint4)(X[20].%s, X[21].%s, X[22].%s, X[23].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline6 = (uint4)(X[24].%s, X[25].%s, X[26].%s, X[27].%s); \\\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("\tline7 = (uint4)(X[28].%s, X[29].%s, X[30].%s, X[31].%s);\n", \
            comp[x], comp[x], comp[x], comp[x]);
        printf("#endif\n\n");



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

		printf("#endif\n\n");
	}

//3 write
	for(x=0; x<3; x++){
		printf("\tlookup[%s] = (vo)(X[0].%s, X[1].%s, X[2].%s); \\\n", \
			idx[x], comp[x], comp[x], comp[x]);
        printf("\tlookup[%s+1] = (vo)(X[3].%s, X[4].%s, X[5].%s); \\\n", \
            idx[x], comp[x], comp[x], comp[x]);
        printf("\tlookup[%s+2] = (vo)(X[6].%s, X[7].%s, X[8].%s); \\\n", \
            idx[x], comp[x], comp[x], comp[x]);
        printf("\tlookup[%s+3] = (vo)(X[9].%s, X[10].%s, X[11].%s); \\\n", \
            idx[x], comp[x], comp[x], comp[x]);
        printf("\tlookup[%s+4] = (vo)(X[12].%s, X[13].%s, X[14].%s); \\\n", \
            idx[x], comp[x], comp[x], comp[x]);
        printf("\tlookup[%s+5] = (vo)(X[15].%s, X[16].%s, X[17].%s); \\\n", \
            idx[x], comp[x], comp[x], comp[x]);
        printf("\tlookup[%s+6] = (vo)(X[18].%s, X[19].%s, X[20].%s); \\\n", \
            idx[x], comp[x], comp[x], comp[x]);
        printf("\tlookup[%s+7] = (vo)(X[21].%s, X[22].%s, X[23].%s); \\\n", \
            idx[x], comp[x], comp[x], comp[x]);
        printf("\tlookup[%s+8] = (vo)(X[24].%s, X[25].%s, X[26].%s); \\\n", \
            idx[x], comp[x], comp[x], comp[x]);
        printf("\tlookup[%s+10] = (vo)(X[27].%s, X[28].%s, X[29].%s); \\\n", \
            idx[x], comp[x], comp[x], comp[x]);
        printf("\tlookup[%s+11] = (vo)(X[30].%s, X[31].%s); \\\n", \
            idx[x], comp[x], comp[x]);

	}



//2 write
	for(x=0; x<2; x++){
		printf("\tlookup[%s] = (vo)(X[0].%s, X[1].%s); \\\n", \
		idx[x], comp[x], comp[x]);
        printf("\tlookup[%s+1] = (vo)(X[2].%s, X[3].%s); \\\n", \
        idx[x], comp[x], comp[x]);
        printf("\tlookup[%s+2] = (vo)(X[4].%s, X[5].%s); \\\n", \
        idx[x], comp[x], comp[x]);
        printf("\tlookup[%s+3] = (vo)(X[6].%s, X[7].%s); \\\n", \
        idx[x], comp[x], comp[x]);
        printf("\tlookup[%s+4] = (vo)(X[8].%s, X[9].%s); \\\n", \
        idx[x], comp[x], comp[x]);
        printf("\tlookup[%s+5] = (vo)(X[10].%s, X[11].%s); \\\n", \
        idx[x], comp[x], comp[x]);
        printf("\tlookup[%s+6] = (vo)(X[12].%s, X[13].%s); \\\n", \
        idx[x], comp[x], comp[x]);
        printf("\tlookup[%s+7] = (vo)(X[14].%s, X[15].%s); \\\n", \
        idx[x], comp[x], comp[x]);
        printf("\tlookup[%s+8] = (vo)(X[16].%s, X[17].%s); \\\n", \
        idx[x], comp[x], comp[x]);
        printf("\tlookup[%s+9] = (vo)(X[18].%s, X[19].%s); \\\n", \
        idx[x], comp[x], comp[x]);
        printf("\tlookup[%s+10] = (vo)(X[20].%s, X[21].%s); \\\n", \
        idx[x], comp[x], comp[x]);
        printf("\tlookup[%s+11] = (vo)(X[22].%s, X[23].%s); \\\n", \
        idx[x], comp[x], comp[x]);
        printf("\tlookup[%s+12] = (vo)(X[24].%s, X[25].%s); \\\n", \
        idx[x], comp[x], comp[x]);
        printf("\tlookup[%s+13] = (vo)(X[26].%s, X[27].%s); \\\n", \
        idx[x], comp[x], comp[x]);
        printf("\tlookup[%s+14] = (vo)(X[28].%s, X[29].%s); \\\n", \
        idx[x], comp[x], comp[x]);
        printf("\tlookup[%s+15] = (vo)(X[30].%s, X[31].%s); \\\n", \
        idx[x], comp[x], comp[x]);
	}

*/
//}
		//x+=2;
//}
//printf("lookup[CO_01] = (vo)(X[0].s0, X[1].s0, X[2].s0, X[3].s0, X[4].s0, X[5].s0, X[6].s0, X[7].s0,\n\t\t
  //          X[8].s0, X[9].s0, X[10].s0, X[11].s0, X[12].s0, X[13].s0, X[14].s0, X[15].s0)%;\n");
//printf("lookup[CO_01+1] = (vo)(X[0].s1, X[1].s1, X[2].s1, X[3].s1, X[4].s1, X[5].s1, X[6].s1, X[7].s1,\n\t\t
  //          X[8].s1, X[9].s1, X[10].s1, X[11].s1, X[12].s1, X[13].s1, X[14].s1, X[15].s1)%;\n");

//}



if(print){
	    for(y=0; y<count; ++y){
			if(count<10)
				printf("\tuint %s%u = 0;\n", base, y);
				//fprintf(fp, "\t%s%u = 0;\n", base, y);
			else
				printf("\tuint %s0%u = 0;\n", base, y);
				//fprintf(fp, "\t%s0%u = 0;\n", base, y);
			//if(num1%32 == 0 && y+z != 0){
			//	fprintf(fp, "\n\t\t");
			//}

		}
}

/*
	for(y=0; y<4; y++){
		printf("XA[%u] X[%u].x\n", y, y*2);
		printf("XB[%u] X[%u].y\n", y, y*2);
		printf("XC[%u] X[%u].z\n", y, y*2);
		printf("XD[%u] X[%u].w\n", y, y*2);
		printf("XE[%u] X[%u].x\n", y, y*2+1);
		printf("XF[%u] X[%u].y\n", y, y*2+1);
		printf("XG[%u] X[%u].z\n", y, y*2+1);
		printf("XH[%u] X[%u].w\n", y, y*2+1);
		printf("\n");

	}
*/

//	}else{
//            printf("Error opening file!\n");
//    }
//        fclose(fp);
	if(print)
		free(base);

	return 0;
}