private IDictionary <Type, List <MemoryUnit> > BuildMemoryUnits(JToken token) { JArray memories = (JArray)token; var memoryDict = new Dictionary <Type, List <MemoryUnit> >(); List <MappedMemoryUnit> memUnits = new List <MappedMemoryUnit>(); for (int i = 0; i < memories.Count; i++) { MemoryUnit mem = BuildMemoryUnit(memories[i]); try { MappedMemoryUnit mappedMem = MapMemoryToAddresses(memories[i], mem); memUnits.Add(mappedMem); } catch (MappingException) { //nop } if (!memoryDict.ContainsKey(mem.GetType())) { memoryDict.Add(mem.GetType(), new List <MemoryUnit>()); } memoryDict[mem.GetType()].Add(mem); } MemoryMapper mapper = new MemoryMapper(memUnits); memoryDict.Add(mapper.GetType(), new List <MemoryUnit>()); memoryDict[mapper.GetType()].Add(mapper); return(memoryDict); }
private MappedMemoryUnit MapMemoryToAddresses(JToken token, MemoryUnit mem) { uint? startAddr = ParseNumber(token["startAddr"]); uint? endAddr = ParseNumber(token["endAddr"]); uint? size = ParseNumber(token["size"]); string bitmask = (string)token["bitmask"]; string name = (string)token["name"]; MappedMemoryUnit mappedMem = null; if (startAddr != null) { if (endAddr != null) { mappedMem = new MappedMemoryUnit(mem, (uint)startAddr, (uint)endAddr, name); } else if (size != null) { mappedMem = new MappedMemoryUnit(mem, (uint)startAddr, (uint)(startAddr + size - 1), name); } else { mappedMem = new MappedMemoryUnit(mem, (uint)startAddr, name); } } else if (bitmask != null) { mappedMem = new MappedMemoryUnit(mem, bitmask, name); } else { throw new MappingException("MappedMemoryUnit requires either startAddr or bitmask"); } return(mappedMem); }
public uint this[uint address] { get { MappedMemoryUnit unit = FindContainingUnit(address); return(unit[ResolveAddress(address, unit)]); } set { MappedMemoryUnit m = FindContainingUnit(address); m[ResolveAddress(address, m)] = value; } }
public MemoryMapper(uint size) { uint[] data = new uint[size]; DataMemory dataMem = new DataMemory(data); MappedMemoryUnit mappedMem = new MappedMemoryUnit(dataMem, 0); MemUnits = new List <MappedMemoryUnit> { mappedMem }; }
private uint ResolveAddress(uint addr, MappedMemoryUnit memUnit) { return(addr - memUnit.StartAddr); }