Cache implemented in software to demonstrate understanding of basic cache design principles (e.g. associativity, block replacement policies). The cache accepts arbitrary variable indicating set index bits, block bits, and associativity and creates a data structure representing the cache before performing arbitrary memory operations on the cache, finally returning the total number of hits, misses and evictions.

Full description available here.