// File: /workspace/github_c_makefile_star2_O2/aquaxis[P]synverll/src/synverll.c
// Function: process_function
int process_function(char *name)
{
    FILE *fp;
    char *line, *token;
	char *filename, *oldname;

	printf("[LLVM-IR Function Parser Start]\n");

	line = calloc(STR_MAX,1);
	token = calloc(STR_MAX,1);
	filename = calloc(STR_MAX,1);
	oldname = calloc(STR_MAX,1);

		sprintf(filename, "__%s.ll", name);

//		printf(" -> Open file: %s\n", filename);
		if((fp = fopen(filename,"rb")) == NULL){
			printf("can't open file.\n");
			free(line);
			free(token);
			exit(1);
		}
		/*
		 * LLVM-IRはラインごとにparseしていく
		 */
		clean_signal_tree();
		clean_struct_tree();
		while(!feof(fp)){
			get_line(line, fp);
			do{
				if((line[strlen(line)-1] == '\n') || (line[strlen(line)-1] == '\r')){
					line[strlen(line)-1] = '\0';
				}
			}while((line[strlen(line)-1] == '\n') || (line[strlen(line)-1] == '\r'));
			parser_ir_source(line);
			strcpy(line, "\0");	// LLVM-IRの場合、1ラインで切り上げるので削除対象とする
		}
		fclose(fp);

		// グローバル構造体の解析
		parser_struct_tree();			// structタイプの解析

		create_stage_parser_tree();		// ステージング

		parser_memory_tree();			// メモリの解析
		deploy_array_type();			// メモリタイプの展開する
		create_array_size();			// メモリサイズの取得(アドレス生成)

		create_verilog_proc_tree();		// 実行プロセスのVerilog HDL化
		create_verilog_signal();		// 信号のVerilog HDL化
		create_verilog_state();			// ステートマシン生成
		create_verilog_label();

//		print_array_type();				// メモリ一覧の表示
//		print_call_tree(call_tree_top);				// CALL命令の表示
/*
		// デバッグ用
		sprintf(filename, "%s.log", &module_name[1]);
//		printf(" -> Open file: %s\n", filename);
		if((fp = fopen(filename,"w")) == NULL){
			printf("can't open file.\n");
			free(line);
			free(token);
			exit(1);
		}
		print_signal_tree(fp);
		print_parser_tree_ir(fp);
		print_proc_tree(fp);
		fclose(fp);
*/
		sprintf(filename, "%s.v", &module_name[1]);
//		printf(" -> Open file: %s\n", filename);
		if((fp = fopen(filename,"w")) == NULL){
			printf("can't open file.\n");
			free(line);
			free(token);
			exit(1);
		}
		output_proc_tree(fp);			// Verilog HDLの出力
		fclose(fp);

		// モジュールの登録
		register_module_tree(module_name);
		new_module_tree();

		if(debug_mode){
			sprintf(oldname, "__%s.ll", name);
			sprintf(filename, "__%s.ll", &module_name[1]);
			printf("%s -> %s\n", oldname, filename);
			rename(oldname, filename);

			sprintf(oldname, "__%s.c", name);
			sprintf(filename, "__%s.c", &module_name[1]);
			printf("%s -> %s\n", oldname, filename);
			rename(oldname, filename);
		}

		clean_parser_tree_ir();
		clean_proc_tree();

		free(line);
		free(token);
		free(filename);
		free(oldname);

	return 0;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rdi, %rbp
leaq 0x387a(%rip), %rdi      # 0xf10b
callq 0x1070
pushq $0x1
popq %r15
movl $0x400, %edi            # imm = 0x400
movq %r15, %rsi
callq 0x10f0
movq %rax, %rbx
movl $0x400, %edi            # imm = 0x400
movq %r15, %rsi
callq 0x10f0
movq %rax, %r14
movl $0x400, %edi            # imm = 0x400
movq %r15, %rsi
callq 0x10f0
movq %rax, %r15
leaq 0x3790(%rip), %rsi      # 0xf061
movq %r14, %rdi
movq %rbp, %rdx
xorl %eax, %eax
callq 0x11a0
leaq 0x3784(%rip), %rsi      # 0xf069
movq %r14, %rdi
callq 0x1160
testq %rax, %rax
je 0xbad6
movq %rax, %r13
xorl %eax, %eax
callq 0x96dc
xorl %eax, %eax
callq 0xb644
movq %r13, %rdi
callq 0x1120
testl %eax, %eax
jne 0xb95e
movq %rbx, %rdi
movq %r13, %rsi
callq 0xbdde
movq %rbx, %rdi
callq 0x1090
movzbl -0x1(%rbx,%rax), %ecx
cmpl $0xd, %ecx
je 0xb935
cmpl $0xa, %ecx
jne 0xb93a
movb $0x0, -0x1(%rbx,%rax)
movq %rbx, %rdi
callq 0x1090
movzbl -0x1(%rbx,%rax), %eax
cmpl $0xa, %eax
je 0xb91e
cmpl $0xd, %eax
je 0xb91e
movq %rbx, %rdi
callq 0x2388
movb $0x0, (%rbx)
jmp 0xb907
movq %r13, %rdi
callq 0x1080
xorl %eax, %eax
callq 0xb701
xorl %eax, %eax
callq 0x499c
xorl %eax, %eax
callq 0x59a0
xorl %eax, %eax
callq 0x57de
xorl %eax, %eax
callq 0x6896
xorl %eax, %eax
callq 0x7fe5
xorl %eax, %eax
callq 0x97a8
xorl %eax, %eax
callq 0x938d
xorl %eax, %eax
callq 0x955e
leaq 0x779c(%rip), %r12      # 0x13148
movq (%r12), %rdx
incq %rdx
leaq 0x36b2(%rip), %rsi      # 0xf06c
movq %r14, %rdi
xorl %eax, %eax
callq 0x11a0
leaq 0x333d(%rip), %rsi      # 0xed08
movq %r14, %rdi
callq 0x1160
testq %rax, %rax
je 0xbad6
movq %rax, %r13
movq %rax, %rdi
callq 0x6ddb
movq %r13, %rdi
callq 0x1080
movq (%r12), %rdi
callq 0x697c
xorl %eax, %eax
callq 0x6ad3
cmpl $0x0, 0x7bd2(%rip)      # 0x135d8
je 0xba9f
leaq 0x364e(%rip), %r13      # 0xf061
movq %r15, %rdi
movq %r13, %rsi
movq %rbp, %rdx
xorl %eax, %eax
callq 0x11a0
movq (%r12), %rdx
incq %rdx
movq %r14, %rdi
movq %r13, %rsi
xorl %eax, %eax
callq 0x11a0
leaq 0x19e7(%rip), %r13      # 0xd425
movq %r13, %rdi
movq %r15, %rsi
movq %r14, %rdx
xorl %eax, %eax
callq 0x10b0
movq %r15, %rdi
movq %r14, %rsi
callq 0x1170
movq %rbp, %rdx
leaq 0x360e(%rip), %rbp      # 0xf071
movq %r15, %rdi
movq %rbp, %rsi
xorl %eax, %eax
callq 0x11a0
movq (%r12), %rdx
incq %rdx
movq %r14, %rdi
movq %rbp, %rsi
xorl %eax, %eax
callq 0x11a0
movq %r13, %rdi
movq %r15, %rsi
movq %r14, %rdx
xorl %eax, %eax
callq 0x10b0
movq %r15, %rdi
movq %r14, %rsi
callq 0x1170
xorl %eax, %eax
callq 0x1e53
xorl %eax, %eax
callq 0x6b61
movq %rbx, %rdi
callq 0x1030
movq %r14, %rdi
callq 0x1030
movq %r15, %rdi
callq 0x1030
xorl %eax, %eax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
leaq 0x364e(%rip), %rdi      # 0xf12b
callq 0x1070
movq %rbx, %rdi
callq 0x1030
pushq $0x1
popq %rdi
callq 0x11b0