package com.jopdesign.wcet.jop;
import com.jopdesign.common.config.Config;
import com.jopdesign.common.processormodel.JOPConfig;
import com.jopdesign.common.processormodel.JOPConfig.CacheImplementation;
import com.jopdesign.timing.MethodCacheTiming;
import com.jopdesign.wcet.WCETTool;
public class BlockCache extends MethodCacheImplementation {
private boolean isLRU;
private int blockCount;
private int blockSize;
public BlockCache(WCETTool p, MethodCacheTiming timing, boolean isLRU, int cacheSizeWords, int blockCount) {
super(p,timing,cacheSizeWords);
this.isLRU = isLRU;
this.blockCount = blockCount;
if(cacheSizeWords % blockCount != 0) {
throw new AssertionError("Bad Cache Size / Block Count: "+cacheSizeWords+" / "+blockCount);
}
this.blockSize = cacheSizeWords / blockCount;
}
public int getBlockSize() {
return blockSize;
}
public static MethodCache fromConfig(WCETTool p, MethodCacheTiming timing, boolean isLRU) {
Config c = p.getConfig();
return new BlockCache(p,timing,isLRU,
c.getOption(JOPConfig.CACHE_SIZE_WORDS).intValue(),
c.getOption(JOPConfig.CACHE_BLOCKS).intValue());
}
@Override
public boolean allFit(long blocks) {
return blocks <= this.blockCount;
}
@Override
public boolean isLRU() {
return this.isLRU;
}
@Override
public boolean fitsInCache(int sizeInWords) {
return sizeInWords <= this.blockSize;
}
@Override
public int requiredNumberOfBlocks(int sizeInWords) {
if(! fitsInCache(sizeInWords)) throw new AssertionError("Method to large: "+sizeInWords);
return 1;
}
@Override
public CacheImplementation getName() {
if(this.isLRU) return CacheImplementation.LRU_CACHE;
else return CacheImplementation.FIFO_CACHE;
}
@Override
public int getNumBlocks() {
return this.blockCount;
}
}