// File: CMU-SAFARI[P]MQSim/src/ssd/Address_Mapping_Unit_Page_Level.cpp
// Function: SSD_Components::Address_Mapping_Unit_Page_Level::Convert_ppa_to_address(unsigned long, NVM::FlashMemory::Physical_Page_Address&)
inline void Address_Mapping_Unit_Page_Level::Convert_ppa_to_address(const PPA_type ppn, NVM::FlashMemory::Physical_Page_Address& address)
	{
		address.ChannelID = (flash_channel_ID_type)(ppn / page_no_per_channel);
		address.ChipID = (flash_chip_ID_type)((ppn % page_no_per_channel) / page_no_per_chip);
		address.DieID = (flash_die_ID_type)(((ppn % page_no_per_channel) % page_no_per_chip) / page_no_per_die);
		address.PlaneID = (flash_plane_ID_type)((((ppn % page_no_per_channel) % page_no_per_chip) % page_no_per_die) / page_no_per_plane);
		address.BlockID = (flash_block_ID_type)(((((ppn % page_no_per_channel) % page_no_per_chip) % page_no_per_die) % page_no_per_plane) / pages_no_per_block);
		address.PageID = (flash_page_ID_type)((((((ppn % page_no_per_channel) % page_no_per_chip) % page_no_per_die) % page_no_per_plane) % pages_no_per_block) % pages_no_per_block);

	}

// Assembly:
movq %rdi, -0x8(%rsp)
movq %rsi, -0x10(%rsp)
movq %rdx, -0x18(%rsp)
movq -0x8(%rsp), %rcx
movq -0x10(%rsp), %rax
movl 0x88(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movl %eax, %edx
movq -0x18(%rsp), %rax
movl %edx, (%rax)
movq -0x10(%rsp), %rax
movl 0x88(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movq %rdx, %rax
movl 0x8c(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movl %eax, %edx
movq -0x18(%rsp), %rax
movl %edx, 0x4(%rax)
movq -0x10(%rsp), %rax
movl 0x88(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movq %rdx, %rax
movl 0x8c(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movq %rdx, %rax
movl 0x90(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movl %eax, %edx
movq -0x18(%rsp), %rax
movl %edx, 0x8(%rax)
movq -0x10(%rsp), %rax
movl 0x88(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movq %rdx, %rax
movl 0x8c(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movq %rdx, %rax
movl 0x90(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movq %rdx, %rax
movl 0x94(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movl %eax, %edx
movq -0x18(%rsp), %rax
movl %edx, 0xc(%rax)
movq -0x10(%rsp), %rax
movl 0x88(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movq %rdx, %rax
movl 0x8c(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movq %rdx, %rax
movl 0x90(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movq %rdx, %rax
movl 0x94(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movq %rdx, %rax
movl 0x78(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movl %eax, %edx
movq -0x18(%rsp), %rax
movl %edx, 0x10(%rax)
movq -0x10(%rsp), %rax
movl 0x88(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movq %rdx, %rax
movl 0x8c(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movq %rdx, %rax
movl 0x90(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movq %rdx, %rax
movl 0x94(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movq %rdx, %rax
movl 0x78(%rcx), %edx
movl %edx, %esi
xorl %edx, %edx
divq %rsi
movq %rdx, %rax
movl 0x78(%rcx), %ecx
xorl %edx, %edx
divq %rcx
movl %edx, %ecx
movq -0x18(%rsp), %rax
movl %ecx, 0x14(%rax)
retq
nopw %cs:(%rax,%rax)
nopl (%rax,%rax)