// File: /workspace/github_c_makefile_star2_O0/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
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x8(%rbp)
leaq 0x4a18(%rip), %rdi      # 0x1509b
movb $0x0, %al
callq 0x1090
movl $0x400, %edi            # imm = 0x400
movl $0x1, %esi
callq 0x10c0
movq %rax, -0x18(%rbp)
movl $0x400, %edi            # imm = 0x400
movl $0x1, %esi
callq 0x10c0
movq %rax, -0x20(%rbp)
movl $0x400, %edi            # imm = 0x400
movl $0x1, %esi
callq 0x10c0
movq %rax, -0x28(%rbp)
movl $0x400, %edi            # imm = 0x400
movl $0x1, %esi
callq 0x10c0
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rdi
movq -0x8(%rbp), %rdx
leaq 0x49d7(%rip), %rsi      # 0x150bc
movb $0x0, %al
callq 0x1160
movq -0x28(%rbp), %rdi
leaq 0x49cd(%rip), %rsi      # 0x150c4
callq 0x1120
movq %rax, -0x10(%rbp)
cmpq $0x0, %rax
jne 0x10730
leaq 0x49ba(%rip), %rdi      # 0x150c7
movb $0x0, %al
callq 0x1090
movq -0x18(%rbp), %rdi
callq 0x1030
movq -0x20(%rbp), %rdi
callq 0x1030
movl $0x1, %edi
callq 0x1170
movb $0x0, %al
callq 0xd630
movb $0x0, %al
callq 0x102f0
movq -0x10(%rbp), %rdi
callq 0x10f0
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
testb $0x1, %al
jne 0x10758
jmp 0x1084d
movq -0x18(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x10e60
movq -0x18(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x18(%rbp), %rdi
callq 0x1070
movq %rax, %rcx
movq -0x38(%rbp), %rax
subq $0x1, %rcx
movsbl (%rax,%rcx), %eax
cmpl $0xa, %eax
je 0x107af
movq -0x18(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x18(%rbp), %rdi
callq 0x1070
movq %rax, %rcx
movq -0x40(%rbp), %rax
subq $0x1, %rcx
movsbl (%rax,%rcx), %eax
cmpl $0xd, %eax
jne 0x107cf
movq -0x18(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x18(%rbp), %rdi
callq 0x1070
movq %rax, %rcx
movq -0x48(%rbp), %rax
subq $0x1, %rcx
movb $0x0, (%rax,%rcx)
jmp 0x107d1
movq -0x18(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x18(%rbp), %rdi
callq 0x1070
movq %rax, %rcx
movq -0x58(%rbp), %rax
subq $0x1, %rcx
movsbl (%rax,%rcx), %ecx
movb $0x1, %al
cmpl $0xa, %ecx
movb %al, -0x49(%rbp)
je 0x10824
movq -0x18(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x18(%rbp), %rdi
callq 0x1070
movq %rax, %rcx
movq -0x60(%rbp), %rax
subq $0x1, %rcx
movsbl (%rax,%rcx), %eax
cmpl $0xd, %eax
sete %al
movb %al, -0x49(%rbp)
movb -0x49(%rbp), %al
testb $0x1, %al
jne 0x10765
movq -0x18(%rbp), %rdi
callq 0x2df0
movq -0x18(%rbp), %rdi
leaq 0x49d1(%rip), %rsi      # 0x15214
callq 0x1050
jmp 0x1073e
movq -0x10(%rbp), %rdi
callq 0x1060
movb $0x0, %al
callq 0x10440
movb $0x0, %al
callq 0x6570
movb $0x0, %al
callq 0x81e0
movb $0x0, %al
callq 0x7f90
movb $0x0, %al
callq 0x9810
movb $0x0, %al
callq 0xb760
movb $0x0, %al
callq 0xd7a0
movb $0x0, %al
callq 0xd270
movb $0x0, %al
callq 0xd460
movq -0x28(%rbp), %rdi
leaq 0x7888(%rip), %rax      # 0x18128
movq (%rax), %rdx
addq $0x1, %rdx
leaq 0x482b(%rip), %rsi      # 0x150d9
movb $0x0, %al
callq 0x1160
movq -0x28(%rbp), %rdi
leaq 0x445e(%rip), %rsi      # 0x14d1e
callq 0x1120
movq %rax, -0x10(%rbp)
cmpq $0x0, %rax
jne 0x108f9
leaq 0x47f1(%rip), %rdi      # 0x150c7
movb $0x0, %al
callq 0x1090
movq -0x18(%rbp), %rdi
callq 0x1030
movq -0x20(%rbp), %rdi
callq 0x1030
movl $0x1, %edi
callq 0x1170
movq -0x10(%rbp), %rdi
callq 0xa080
movq -0x10(%rbp), %rdi
callq 0x1060
leaq 0x7816(%rip), %rax      # 0x18128
movq (%rax), %rdi
callq 0x99f0
movb $0x0, %al
callq 0x9ba0
cmpl $0x0, 0x7c90(%rip)      # 0x185b8
je 0x109e0
movq -0x30(%rbp), %rdi
movq -0x8(%rbp), %rdx
leaq 0x477f(%rip), %rsi      # 0x150bc
movb $0x0, %al
callq 0x1160
movq -0x28(%rbp), %rdi
leaq 0x77d9(%rip), %rax      # 0x18128
movq (%rax), %rdx
addq $0x1, %rdx
leaq 0x475f(%rip), %rsi      # 0x150bc
movb $0x0, %al
callq 0x1160
movq -0x30(%rbp), %rsi
movq -0x28(%rbp), %rdx
leaq 0x2b60(%rip), %rdi      # 0x134d3
movb $0x0, %al
callq 0x1090
movq -0x30(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x1130
movq -0x30(%rbp), %rdi
movq -0x8(%rbp), %rdx
leaq 0x4748(%rip), %rsi      # 0x150de
movb $0x0, %al
callq 0x1160
movq -0x28(%rbp), %rdi
leaq 0x7780(%rip), %rax      # 0x18128
movq (%rax), %rdx
addq $0x1, %rdx
leaq 0x4728(%rip), %rsi      # 0x150de
movb $0x0, %al
callq 0x1160
movq -0x30(%rbp), %rsi
movq -0x28(%rbp), %rdx
leaq 0x2b07(%rip), %rdi      # 0x134d3
movb $0x0, %al
callq 0x1090
movq -0x30(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x1130
movb $0x0, %al
callq 0x24f0
movb $0x0, %al
callq 0x9d00
movq -0x18(%rbp), %rdi
callq 0x1030
movq -0x20(%rbp), %rdi
callq 0x1030
movq -0x28(%rbp), %rdi
callq 0x1030
movq -0x30(%rbp), %rdi
callq 0x1030
xorl %eax, %eax
addq $0x60, %rsp
popq %rbp
retq
nopw (%rax,%rax)