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);
 }