// File: Ziang95[P]Tomasulo_simulator/reserv_station.cpp
// Function: resStation::reserv_automat()
void resStation::reserv_automat()
{
    next_vdd = 0;
    while (true)
    {
        at_rising_edge(next_vdd);
        if (busy)
        {
            if (fCDB.get_source() == dest)
            {
                msg_log("WriteBack to ROB = " + to_string(dest), 2);
                ROBEntry *R = CPU_ROB->get_entry(dest);
                fCDB.get_val(&R->value);
                R->wrtnBack = true;
                R->output.wBack = sys_clk.get_prog_cyc();
                at_falling_edge(next_vdd);
                R->finished = true;
                at_rising_edge(next_vdd);
                busy = false;
                at_falling_edge(next_vdd);
                continue;
            }
            else if (!Rj || !Rk)
            {
                if (fCDB.get_source() == Qj)
                {
                    fCDB.get_val(&Vj);
                    Rj = true;
                }
                if (fCDB.get_source() == Qk)
                {
                    fCDB.get_val(&Vk);
                    Rk = true;
                }
            }
        }
        at_falling_edge(next_vdd);
        if (!Rj || !Rk)
        {
            msg_log("ROB = " + to_string(dest) + " waiting for operands" + (Rj?"":(" Qj = "+to_string(Qj))) + (Rk?"":(" Qk = "+to_string(Qk))), 3);
        }
        if (busy && to_start && Rj && Rk)
        {
            msg_log("Operands ready, sending to FU, dest ROB = " + to_string(dest), 2);
            to_start = false;
            if (type == FLTP)
                Vk.f = sub? -Vk.f : Vk.f;
            else
                Vk.i = sub? -Vk.i : Vk.i;
            prnt_Q->enQ(code, dest, &rest, &Vj, &Vk, lsqE, offset, &busy);
        }
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x230, %rsp            # imm = 0x230
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x1e8(%rbp)
movl $0x0, 0x40(%rax)
movq -0x1e8(%rbp), %rdi
addq $0x40, %rdi
callq 0x12130
movq -0x1e8(%rbp), %rax
testb $0x1, (%rax)
je 0x21344
leaq 0xe388(%rip), %rdi      # 0x2f510
callq 0x5030
movq -0x1e8(%rbp), %rcx
cmpl 0x4(%rcx), %eax
jne 0x212b0
movq -0x1e8(%rbp), %rax
movl 0x4(%rax), %esi
leaq -0x48(%rbp), %rdi
movq %rdi, -0x1f0(%rbp)
callq 0x8410
movq -0x1f0(%rbp), %rdx
leaq 0x18ab(%rip), %rsi      # 0x22a70
leaq -0x28(%rbp), %rdi
callq 0x83c0
jmp 0x211d0
leaq -0x28(%rbp), %rdi
movl $0x2, %esi
callq 0x12060
jmp 0x211e0
leaq -0x28(%rbp), %rdi
callq 0x4240
leaq -0x48(%rbp), %rdi
callq 0x4240
movq -0x1e8(%rbp), %rax
leaq 0xe260(%rip), %rcx      # 0x2f460
movq (%rcx), %rdi
movl 0x4(%rax), %esi
callq 0xe4d0
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rsi
addq $0x48, %rsi
leaq 0xe2f2(%rip), %rdi      # 0x2f510
callq 0x5050
movq -0x60(%rbp), %rax
movb $0x1, 0x1(%rax)
leaq 0xeb66(%rip), %rdi      # 0x2fd98
callq 0x116c0
movq -0x1e8(%rbp), %rdi
movl %eax, %ecx
movq -0x60(%rbp), %rax
movl %ecx, 0x5c(%rax)
addq $0x40, %rdi
callq 0x121a0
movq -0x1e8(%rbp), %rdi
movq -0x60(%rbp), %rax
movb $0x1, (%rax)
addq $0x40, %rdi
callq 0x12130
movq -0x1e8(%rbp), %rdi
movb $0x0, (%rdi)
addq $0x40, %rdi
callq 0x121a0
jmp 0x21161
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x212a2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
leaq -0x28(%rbp), %rdi
callq 0x4240
leaq -0x48(%rbp), %rdi
callq 0x4240
jmp 0x218f5
movq -0x1e8(%rbp), %rax
testb $0x1, 0x2c(%rax)
je 0x212ca
movq -0x1e8(%rbp), %rax
testb $0x1, 0x2d(%rax)
jne 0x21340
leaq 0xe23f(%rip), %rdi      # 0x2f510
callq 0x5030
movq -0x1e8(%rbp), %rcx
cmpl 0x8(%rcx), %eax
jne 0x21304
movq -0x1e8(%rbp), %rsi
addq $0x14, %rsi
leaq 0xe21c(%rip), %rdi      # 0x2f510
callq 0x5050
movq -0x1e8(%rbp), %rax
movb $0x1, 0x2c(%rax)
leaq 0xe205(%rip), %rdi      # 0x2f510
callq 0x5030
movq -0x1e8(%rbp), %rcx
cmpl 0xc(%rcx), %eax
jne 0x2133e
movq -0x1e8(%rbp), %rsi
addq $0x18, %rsi
leaq 0xe1e2(%rip), %rdi      # 0x2f510
callq 0x5050
movq -0x1e8(%rbp), %rax
movb $0x1, 0x2d(%rax)
jmp 0x21340
jmp 0x21342
jmp 0x21344
movq -0x1e8(%rbp), %rdi
addq $0x40, %rdi
callq 0x121a0
movq -0x1e8(%rbp), %rax
testb $0x1, 0x2c(%rax)
je 0x21372
movq -0x1e8(%rbp), %rax
testb $0x1, 0x2d(%rax)
jne 0x21721
movq -0x1e8(%rbp), %rax
movl 0x4(%rax), %esi
leaq -0x100(%rbp), %rdi
movq %rdi, -0x1f8(%rbp)
callq 0x8410
movq -0x1f8(%rbp), %rdx
leaq 0x13ea(%rip), %rsi      # 0x22787
leaq -0xe0(%rbp), %rdi
callq 0x83c0
jmp 0x213ab
leaq 0x16d2(%rip), %rdx      # 0x22a84
leaq -0xc0(%rbp), %rdi
leaq -0xe0(%rbp), %rsi
callq 0x8810
jmp 0x213c7
movq -0x1e8(%rbp), %rax
movb 0x2c(%rax), %al
movb $0x0, -0x122(%rbp)
movb $0x0, -0x149(%rbp)
testb $0x1, %al
je 0x2141b
leaq -0x121(%rbp), %rdi
movq %rdi, -0x200(%rbp)
callq 0x4600
movq -0x200(%rbp), %rdx
movb $0x1, -0x122(%rbp)
leaq 0x1597(%rip), %rsi      # 0x229a2
leaq -0x120(%rbp), %rdi
callq 0x44c0
jmp 0x21419
jmp 0x21458
movq -0x1e8(%rbp), %rax
movl 0x8(%rax), %esi
leaq -0x148(%rbp), %rdi
callq 0x8410
jmp 0x21433
movb $0x1, -0x149(%rbp)
leaq 0x1659(%rip), %rsi      # 0x22a9a
leaq -0x120(%rbp), %rdi
leaq -0x148(%rbp), %rdx
callq 0x83c0
jmp 0x21456
jmp 0x21458
leaq -0xa0(%rbp), %rdi
leaq -0xc0(%rbp), %rsi
leaq -0x120(%rbp), %rdx
callq 0x8740
jmp 0x21474
movq -0x1e8(%rbp), %rax
movb 0x2d(%rax), %al
movb $0x0, -0x172(%rbp)
movb $0x0, -0x199(%rbp)
testb $0x1, %al
je 0x214c8
leaq -0x171(%rbp), %rdi
movq %rdi, -0x208(%rbp)
callq 0x4600
movq -0x208(%rbp), %rdx
movb $0x1, -0x172(%rbp)
leaq 0x14ea(%rip), %rsi      # 0x229a2
leaq -0x170(%rbp), %rdi
callq 0x44c0
jmp 0x214c6
jmp 0x21505
movq -0x1e8(%rbp), %rax
movl 0xc(%rax), %esi
leaq -0x198(%rbp), %rdi
callq 0x8410
jmp 0x214e0
movb $0x1, -0x199(%rbp)
leaq 0x15b3(%rip), %rsi      # 0x22aa1
leaq -0x170(%rbp), %rdi
leaq -0x198(%rbp), %rdx
callq 0x83c0
jmp 0x21503
jmp 0x21505
leaq -0x80(%rbp), %rdi
leaq -0xa0(%rbp), %rsi
leaq -0x170(%rbp), %rdx
callq 0x8740
jmp 0x2151e
leaq -0x80(%rbp), %rdi
movl $0x3, %esi
callq 0x12060
jmp 0x2152e
leaq -0x80(%rbp), %rdi
callq 0x4240
leaq -0x170(%rbp), %rdi
callq 0x4240
testb $0x1, -0x199(%rbp)
jne 0x2154e
jmp 0x2155a
leaq -0x198(%rbp), %rdi
callq 0x4240
testb $0x1, -0x172(%rbp)
jne 0x21565
jmp 0x21571
leaq -0x171(%rbp), %rdi
callq 0x43d0
leaq -0xa0(%rbp), %rdi
callq 0x4240
leaq -0x120(%rbp), %rdi
callq 0x4240
testb $0x1, -0x149(%rbp)
jne 0x21594
jmp 0x215a0
leaq -0x148(%rbp), %rdi
callq 0x4240
testb $0x1, -0x122(%rbp)
jne 0x215ab
jmp 0x215b7
leaq -0x121(%rbp), %rdi
callq 0x43d0
leaq -0xc0(%rbp), %rdi
callq 0x4240
leaq -0xe0(%rbp), %rdi
callq 0x4240
leaq -0x100(%rbp), %rdi
callq 0x4240
jmp 0x21721
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x21710
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x21704
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x216e1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x216c8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x216bc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x21699
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x21680
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x21674
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
leaq -0x80(%rbp), %rdi
callq 0x4240
leaq -0x170(%rbp), %rdi
callq 0x4240
testb $0x1, -0x199(%rbp)
jne 0x2168b
jmp 0x21697
leaq -0x198(%rbp), %rdi
callq 0x4240
jmp 0x21699
testb $0x1, -0x172(%rbp)
jne 0x216a4
jmp 0x216b0
leaq -0x171(%rbp), %rdi
callq 0x43d0
leaq -0xa0(%rbp), %rdi
callq 0x4240
leaq -0x120(%rbp), %rdi
callq 0x4240
testb $0x1, -0x149(%rbp)
jne 0x216d3
jmp 0x216df
leaq -0x148(%rbp), %rdi
callq 0x4240
jmp 0x216e1
testb $0x1, -0x122(%rbp)
jne 0x216ec
jmp 0x216f8
leaq -0x121(%rbp), %rdi
callq 0x43d0
leaq -0xc0(%rbp), %rdi
callq 0x4240
leaq -0xe0(%rbp), %rdi
callq 0x4240
leaq -0x100(%rbp), %rdi
callq 0x4240
jmp 0x218f5
movq -0x1e8(%rbp), %rax
testb $0x1, (%rax)
je 0x218f0
movq -0x1e8(%rbp), %rax
testb $0x1, 0x1(%rax)
je 0x218f0
movq -0x1e8(%rbp), %rax
testb $0x1, 0x2c(%rax)
je 0x218f0
movq -0x1e8(%rbp), %rax
testb $0x1, 0x2d(%rax)
je 0x218f0
movq -0x1e8(%rbp), %rax
movl 0x4(%rax), %esi
leaq -0x1e0(%rbp), %rdi
movq %rdi, -0x210(%rbp)
callq 0x8410
movq -0x210(%rbp), %rdx
leaq 0x129b(%rip), %rsi      # 0x22a2a
leaq -0x1c0(%rbp), %rdi
callq 0x83c0
jmp 0x2179d
leaq -0x1c0(%rbp), %rdi
movl $0x2, %esi
callq 0x12060
jmp 0x217b0
leaq -0x1c0(%rbp), %rdi
callq 0x4240
leaq -0x1e0(%rbp), %rdi
callq 0x4240
movq -0x1e8(%rbp), %rax
movb $0x0, 0x1(%rax)
cmpl $0x1, 0x34(%rax)
jne 0x2186e
movq -0x1e8(%rbp), %rax
testb $0x1, 0x2e(%rax)
je 0x2180d
movq -0x1e8(%rbp), %rax
movss 0x18(%rax), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movss %xmm0, -0x214(%rbp)
jmp 0x21821
movq -0x1e8(%rbp), %rax
movss 0x18(%rax), %xmm0
movss %xmm0, -0x214(%rbp)
movq -0x1e8(%rbp), %rax
movss -0x214(%rbp), %xmm0
movss %xmm0, 0x18(%rax)
jmp 0x218af
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x2185d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
leaq -0x1c0(%rbp), %rdi
callq 0x4240
leaq -0x1e0(%rbp), %rdi
callq 0x4240
jmp 0x218f5
movq -0x1e8(%rbp), %rax
testb $0x1, 0x2e(%rax)
je 0x2188f
movq -0x1e8(%rbp), %rcx
xorl %eax, %eax
subl 0x18(%rcx), %eax
movl %eax, -0x218(%rbp)
jmp 0x2189f
movq -0x1e8(%rbp), %rax
movl 0x18(%rax), %eax
movl %eax, -0x218(%rbp)
movq -0x1e8(%rbp), %rax
movl -0x218(%rbp), %ecx
movl %ecx, 0x18(%rax)
movq -0x1e8(%rbp), %rax
movq 0x48(%rax), %rdi
movl 0x30(%rax), %esi
movl 0x4(%rax), %edx
movq %rax, %rcx
addq $0x10, %rcx
movq %rax, %r8
addq $0x14, %r8
movq %rax, %r9
addq $0x18, %r9
movq 0x20(%rax), %r11
movl 0x28(%rax), %r10d
movq %r11, (%rsp)
movl %r10d, 0x8(%rsp)
movq %rax, 0x10(%rsp)
callq 0x53f0
jmp 0x21161
movq -0x50(%rbp), %rdi
callq 0x45f0
nop