// File: /workspace/github_c_makefile_star2_O3/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 0x430f(%rip), %rdi      # 0x1012b
callq 0x1070
movl $0x400, %edi            # imm = 0x400
movl $0x1, %esi
callq 0x10f0
movq %rax, %rbx
movl $0x400, %edi            # imm = 0x400
movl $0x1, %esi
callq 0x10f0
movq %rax, %r14
movl $0x400, %edi            # imm = 0x400
movl $0x1, %esi
callq 0x10f0
movq %rax, %r15
leaq 0x4223(%rip), %rsi      # 0x10081
movq %r14, %rdi
movq %rbp, %rdx
xorl %eax, %eax
callq 0x11a0
leaq 0x4217(%rip), %rsi      # 0x10089
movq %r14, %rdi
callq 0x1160
testq %rax, %rax
je 0xc063
movq %rax, %r13
xorl %eax, %eax
callq 0x9b2c
xorl %eax, %eax
callq 0xbbc0
movq %r13, %rdi
callq 0x1120
testl %eax, %eax
jne 0xbeeb
movq %rbx, %rdi
movq %r13, %rsi
callq 0xc389
movq %rbx, %rdi
callq 0x1090
movzbl -0x1(%rbx,%rax), %ecx
cmpl $0xd, %ecx
je 0xbec2
cmpl $0xa, %ecx
jne 0xbec7
movb $0x0, -0x1(%rbx,%rax)
movq %rbx, %rdi
callq 0x1090
movzbl -0x1(%rbx,%rax), %eax
cmpl $0xa, %eax
je 0xbeab
cmpl $0xd, %eax
je 0xbeab
movq %rbx, %rdi
callq 0x248a
movb $0x0, (%rbx)
jmp 0xbe94
movq %r13, %rdi
callq 0x1080
xorl %eax, %eax
callq 0xbc91
xorl %eax, %eax
callq 0x4aa7
xorl %eax, %eax
callq 0x5c0c
xorl %eax, %eax
callq 0x5a5b
xorl %eax, %eax
callq 0x6b8d
xorl %eax, %eax
callq 0x846b
xorl %eax, %eax
callq 0x9c0c
xorl %eax, %eax
callq 0x97ce
xorl %eax, %eax
callq 0x99a7
leaq 0x820f(%rip), %r12      # 0x14148
movq (%r12), %rdx
incq %rdx
leaq 0x4145(%rip), %rsi      # 0x1008c
movq %r14, %rdi
xorl %eax, %eax
callq 0x11a0
leaq 0x3dd0(%rip), %rsi      # 0xfd28
movq %r14, %rdi
callq 0x1160
testq %rax, %rax
je 0xc063
movq %rax, %r13
movq %rax, %rdi
callq 0x7125
movq %r13, %rdi
callq 0x1080
movq (%r12), %rdi
callq 0x6c80
xorl %eax, %eax
callq 0x6dce
cmpl $0x0, 0x8645(%rip)      # 0x145d8
je 0xc02c
leaq 0x40e1(%rip), %r13      # 0x10081
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 0x245a(%rip), %r13      # 0xe425
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 0x40a1(%rip), %rbp      # 0x10091
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 0x1f3f
xorl %eax, %eax
callq 0x6e5c
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 0x40e1(%rip), %rdi      # 0x1014b
callq 0x1070
movq %rbx, %rdi
callq 0x1030
movl $0x1, %edi
callq 0x11b0