Skip to content

Instantly share code, notes, and snippets.

@Shikugawa
Last active July 16, 2021 02:59
Show Gist options
  • Save Shikugawa/8c20468656559044790c0ed41e8b842c to your computer and use it in GitHub Desktop.
Save Shikugawa/8c20468656559044790c0ed41e8b842c to your computer and use it in GitHub Desktop.
import math
def get_direct_mapped_address(line_size, entry_size, address_str):
# オフセットのサイズを求める
offset_size = int(math.log2(line_size))
# インデックスのサイズを求める
index_size = int(math.log2(entry_size))
print("offset:", offset_size, "bit")
print("index: ", index_size, "bit")
offset_byte = address_str[len(address_str)-offset_size:]
index_byte = address_str[len(address_str)-offset_size-index_size:len(address_str)-offset_size]
tag_byte = address_str[:len(address_str)-offset_size-index_size]
print("offset byte: ", offset_byte, hex(int(offset_byte, 2)))
print("index byte: ", index_byte, hex(int(index_byte, 2)))
print("tag_byte: ", tag_byte, hex(int(tag_byte, 2)))
return (offset_byte, index_byte, tag_byte)
def get_nway_setassociative_address(way, line_size, entry_size, address_str):
# オフセットのサイズを求める
offset_size = int(math.log2(line_size))
# インデックスのサイズを求める
index_size = int(math.log2(entry_size)-int(math.log2(way))) # n wayなので最初の log2(n) ビットが不要
print("offset:", offset_size, "bit")
print("index: ", index_size, "bit")
offset_byte = address_str[len(address_str)-offset_size:]
index_byte = address_str[len(address_str)-offset_size-index_size:len(address_str)-offset_size]
tag_byte = address_str[:len(address_str)-offset_size-index_size]
print("offset byte: ", offset_byte, hex(int(offset_byte, 2)))
print("index byte: ", index_byte, hex(int(index_byte, 2)))
print("tag_byte: ", tag_byte, hex(int(tag_byte, 2)))
return (offset_byte, index_byte, tag_byte)
def get_fully_associative_address(line_size, entry_size, address_str):
# オフセットのサイズを求める
offset_size = int(math.log2(line_size))
print("offset:", offset_size, "bit")
print("index: ", "0 bit")
offset_byte = address_str[len(address_str)-offset_size:]
tag_byte = address_str[:len(address_str)-offset_size]
print("offset byte: ", offset_byte, hex(int(offset_byte, 2)))
print("index byte: ", "N/A", "N/A")
print("tag_byte: ", tag_byte, hex(int(tag_byte, 2)))
return (offset_byte, 0, tag_byte)
if __name__ == "__main__":
line_size = 16 # bytes
entry_size = 128
address = bin(0x7a14)
way = 2
address_str = str(address)[2:]
print(address_str)
print("\ndirect mapped")
get_direct_mapped_address(line_size, entry_size, address_str)
print("\n{}-way setassociative".format(way))
get_nway_setassociative_address(way, line_size, entry_size, address_str)
print("\nfully associative")
get_fully_associative_address(line_size, entry_size, address_str)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment