// File: /workspace/github_c_makefile_star2_O1/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 0x421a(%rip), %rdi      # 0x1013a
callq 0x1070
movl $0x400, %edi            # imm = 0x400
movl $0x1, %esi
callq 0x1100
movq %rax, %rbx
movl $0x400, %edi            # imm = 0x400
movl $0x1, %esi
callq 0x1100
movq %rax, %r14
movl $0x400, %edi            # imm = 0x400
movl $0x1, %esi
callq 0x1100
movq %rax, %r15
leaq 0x412b(%rip), %rsi      # 0x1008d
movq %r14, %rdi
movq %rbp, %rdx
xorl %eax, %eax
callq 0x11b0
leaq 0x411f(%rip), %rsi      # 0x10095
movq %r14, %rdi
callq 0x1170
testq %rax, %rax
je 0xc167
movq %rax, %r13
xorl %eax, %eax
callq 0x9c0c
xorl %eax, %eax
callq 0xbcbc
movq %r13, %rdi
callq 0x1130
testl %eax, %eax
jne 0xbfef
movq %rbx, %rdi
movq %r13, %rsi
callq 0xc4a5
movq %rbx, %rdi
callq 0x1090
movzbl -0x1(%rbx,%rax), %ecx
cmpl $0xd, %ecx
je 0xbfc6
cmpl $0xa, %ecx
jne 0xbfcb
movb $0x0, -0x1(%rbx,%rax)
movq %rbx, %rdi
callq 0x1090
movzbl -0x1(%rbx,%rax), %eax
cmpl $0xa, %eax
je 0xbfaf
cmpl $0xd, %eax
je 0xbfaf
movq %rbx, %rdi
callq 0x2568
movb $0x0, (%rbx)
jmp 0xbf98
movq %r13, %rdi
callq 0x1080
xorl %eax, %eax
callq 0xbd95
xorl %eax, %eax
callq 0x4b76
xorl %eax, %eax
callq 0x5d14
xorl %eax, %eax
callq 0x5b58
xorl %eax, %eax
callq 0x6ca2
xorl %eax, %eax
callq 0x858e
xorl %eax, %eax
callq 0x9cf4
xorl %eax, %eax
callq 0x98a8
xorl %eax, %eax
callq 0x9a85
leaq 0x811b(%rip), %r12      # 0x14158
movq (%r12), %rdx
incq %rdx
leaq 0x404d(%rip), %rsi      # 0x10098
movq %r14, %rdi
xorl %eax, %eax
callq 0x11b0
leaq 0x3cd8(%rip), %rsi      # 0xfd34
movq %r14, %rdi
callq 0x1170
testq %rax, %rax
je 0xc167
movq %rax, %r13
movq %rax, %rdi
callq 0x724d
movq %r13, %rdi
callq 0x1080
movq (%r12), %rdi
callq 0x6d95
xorl %eax, %eax
callq 0x6eeb
cmpl $0x0, 0x8551(%rip)      # 0x145e8
je 0xc130
leaq 0x3fe9(%rip), %r13      # 0x1008d
movq %r15, %rdi
movq %r13, %rsi
movq %rbp, %rdx
xorl %eax, %eax
callq 0x11b0
movq (%r12), %rdx
incq %rdx
movq %r14, %rdi
movq %r13, %rsi
xorl %eax, %eax
callq 0x11b0
leaq 0x2364(%rip), %r13      # 0xe433
movq %r13, %rdi
movq %r15, %rsi
movq %r14, %rdx
xorl %eax, %eax
callq 0x10b0
movq %r15, %rdi
movq %r14, %rsi
callq 0x1180
movq %rbp, %rdx
leaq 0x3fa9(%rip), %rbp      # 0x1009d
movq %r15, %rdi
movq %rbp, %rsi
xorl %eax, %eax
callq 0x11b0
movq (%r12), %rdx
incq %rdx
movq %r14, %rdi
movq %rbp, %rsi
xorl %eax, %eax
callq 0x11b0
movq %r13, %rdi
movq %r15, %rsi
movq %r14, %rdx
xorl %eax, %eax
callq 0x10b0
movq %r15, %rdi
movq %r14, %rsi
callq 0x1180
xorl %eax, %eax
callq 0x1f9e
xorl %eax, %eax
callq 0x6f84
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 0x3fec(%rip), %rdi      # 0x1015a
callq 0x1070
movq %rbx, %rdi
callq 0x1030
movl $0x1, %edi
callq 0x11c0